@droppii-org/chat-sdk 0.1.2 → 0.1.4

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 (141) hide show
  1. package/dist/assets/svg/cannedResponse.d.ts +7 -0
  2. package/dist/assets/svg/cannedResponse.d.ts.map +1 -0
  3. package/dist/assets/svg/cannedResponse.js +3 -0
  4. package/dist/assets/svg/cannedResponse.tsx +48 -0
  5. package/dist/assets/svg/index.d.ts +1 -0
  6. package/dist/assets/svg/index.d.ts.map +1 -1
  7. package/dist/assets/svg/index.js +1 -0
  8. package/dist/assets/svg/index.ts +1 -0
  9. package/dist/components/cannedResponse/CannedResponseBody.d.ts +8 -0
  10. package/dist/components/cannedResponse/CannedResponseBody.d.ts.map +1 -0
  11. package/dist/components/cannedResponse/CannedResponseBody.js +58 -0
  12. package/dist/components/cannedResponse/CannedResponseFooter.d.ts +6 -0
  13. package/dist/components/cannedResponse/CannedResponseFooter.d.ts.map +1 -0
  14. package/dist/components/cannedResponse/CannedResponseFooter.js +8 -0
  15. package/dist/components/cannedResponse/CannedResponseHeader.d.ts +8 -0
  16. package/dist/components/cannedResponse/CannedResponseHeader.d.ts.map +1 -0
  17. package/dist/components/cannedResponse/CannedResponseHeader.js +11 -0
  18. package/dist/components/cannedResponse/index.d.ts +8 -0
  19. package/dist/components/cannedResponse/index.d.ts.map +1 -0
  20. package/dist/components/cannedResponse/index.js +34 -0
  21. package/dist/components/cannedResponse/team/TeamItem.d.ts +11 -0
  22. package/dist/components/cannedResponse/team/TeamItem.d.ts.map +1 -0
  23. package/dist/components/cannedResponse/team/TeamItem.js +31 -0
  24. package/dist/components/conversation/ConversationBySessionItem.d.ts.map +1 -1
  25. package/dist/components/conversation/ConversationBySessionItem.js +6 -2
  26. package/dist/components/mediaCollection/LinkCollection.js +1 -1
  27. package/dist/components/message/MediaPreviewIcon.d.ts +7 -0
  28. package/dist/components/message/MediaPreviewIcon.d.ts.map +1 -0
  29. package/dist/components/message/MediaPreviewIcon.js +24 -0
  30. package/dist/components/message/MessageHeader.js +1 -1
  31. package/dist/components/message/MessageList.d.ts +1 -0
  32. package/dist/components/message/MessageList.d.ts.map +1 -1
  33. package/dist/components/message/MessageList.js +49 -6
  34. package/dist/components/message/footer/ActionBar.d.ts.map +1 -1
  35. package/dist/components/message/footer/ActionBar.js +15 -86
  36. package/dist/components/message/footer/CannedResponsePlugin.d.ts +7 -0
  37. package/dist/components/message/footer/CannedResponsePlugin.d.ts.map +1 -0
  38. package/dist/components/message/footer/CannedResponsePlugin.js +31 -0
  39. package/dist/components/message/footer/EmojiPicker.d.ts.map +1 -1
  40. package/dist/components/message/footer/EmojiPicker.js +9 -5
  41. package/dist/components/message/footer/EnterHandler.d.ts.map +1 -1
  42. package/dist/components/message/footer/EnterHandler.js +16 -5
  43. package/dist/components/message/footer/FilePreview.d.ts +5 -0
  44. package/dist/components/message/footer/FilePreview.d.ts.map +1 -1
  45. package/dist/components/message/footer/FilePreview.js +15 -12
  46. package/dist/components/message/footer/MediaActions.d.ts +10 -0
  47. package/dist/components/message/footer/MediaActions.d.ts.map +1 -0
  48. package/dist/components/message/footer/MediaActions.js +98 -0
  49. package/dist/components/message/footer/QuotedMessage.d.ts +2 -0
  50. package/dist/components/message/footer/QuotedMessage.d.ts.map +1 -0
  51. package/dist/components/message/footer/QuotedMessage.js +24 -0
  52. package/dist/components/message/footer/editorConfig.d.ts +24 -0
  53. package/dist/components/message/footer/editorConfig.d.ts.map +1 -0
  54. package/dist/components/message/footer/editorConfig.js +33 -0
  55. package/dist/components/message/footer/index.d.ts +2 -1
  56. package/dist/components/message/footer/index.d.ts.map +1 -1
  57. package/dist/components/message/footer/index.js +33 -28
  58. package/dist/components/message/item/QuoteMessage.d.ts +9 -0
  59. package/dist/components/message/item/QuoteMessage.d.ts.map +1 -0
  60. package/dist/components/message/item/QuoteMessage.js +41 -0
  61. package/dist/components/message/item/RevokeMessage.d.ts +5 -0
  62. package/dist/components/message/item/RevokeMessage.d.ts.map +1 -0
  63. package/dist/components/message/item/RevokeMessage.js +8 -0
  64. package/dist/components/message/item/TextMessage.js +1 -1
  65. package/dist/components/message/item/UrlTextMessage.d.ts.map +1 -1
  66. package/dist/components/message/item/UrlTextMessage.js +3 -3
  67. package/dist/components/message/item/index.d.ts +6 -1
  68. package/dist/components/message/item/index.d.ts.map +1 -1
  69. package/dist/components/message/item/index.js +79 -25
  70. package/dist/components/richTextEditor/RichTextEditor.d.ts +12 -0
  71. package/dist/components/richTextEditor/RichTextEditor.d.ts.map +1 -0
  72. package/dist/components/richTextEditor/RichTextEditor.js +62 -0
  73. package/dist/components/searchConversation/SearchDrawer.js +1 -1
  74. package/dist/components/searchConversation/item/SearchItemAsMessage.d.ts +3 -1
  75. package/dist/components/searchConversation/item/SearchItemAsMessage.d.ts.map +1 -1
  76. package/dist/components/searchConversation/item/SearchItemAsMessage.js +5 -2
  77. package/dist/components/thread/AssignConfirmModal.d.ts +12 -0
  78. package/dist/components/thread/AssignConfirmModal.d.ts.map +1 -0
  79. package/dist/components/thread/AssignConfirmModal.js +11 -0
  80. package/dist/components/thread/ManualAssignPopover.d.ts +14 -0
  81. package/dist/components/thread/ManualAssignPopover.d.ts.map +1 -0
  82. package/dist/components/thread/ManualAssignPopover.js +83 -0
  83. package/dist/components/thread/SessionSection.d.ts.map +1 -1
  84. package/dist/components/thread/SessionSection.js +11 -6
  85. package/dist/components/thread/UserSection.js +1 -1
  86. package/dist/hooks/cannedResponse/useFetchCannedCategories.d.ts +3 -0
  87. package/dist/hooks/cannedResponse/useFetchCannedCategories.d.ts.map +1 -0
  88. package/dist/hooks/cannedResponse/useFetchCannedCategories.js +13 -0
  89. package/dist/hooks/cannedResponse/useFetchCannedResponse.d.ts +219 -0
  90. package/dist/hooks/cannedResponse/useFetchCannedResponse.d.ts.map +1 -0
  91. package/dist/hooks/cannedResponse/useFetchCannedResponse.js +55 -0
  92. package/dist/hooks/message/useMessage.d.ts.map +1 -1
  93. package/dist/hooks/message/useMessage.js +18 -1
  94. package/dist/hooks/message/useRevokeMessage.d.ts +5 -0
  95. package/dist/hooks/message/useRevokeMessage.d.ts.map +1 -0
  96. package/dist/hooks/message/useRevokeMessage.js +16 -0
  97. package/dist/hooks/message/useSendMessage.d.ts +1 -0
  98. package/dist/hooks/message/useSendMessage.d.ts.map +1 -1
  99. package/dist/hooks/message/useSendMessage.js +40 -9
  100. package/dist/hooks/session/useAssignSession.d.ts +8 -0
  101. package/dist/hooks/session/useAssignSession.d.ts.map +1 -0
  102. package/dist/hooks/session/useAssignSession.js +15 -0
  103. package/dist/hooks/session/useCreateNote.d.ts.map +1 -1
  104. package/dist/hooks/session/useCreateNote.js +2 -1
  105. package/dist/hooks/session/useGetTeamSupporters.d.ts +8 -0
  106. package/dist/hooks/session/useGetTeamSupporters.d.ts.map +1 -0
  107. package/dist/hooks/session/useGetTeamSupporters.js +20 -0
  108. package/dist/hooks/team/useFetchMyTeam.d.ts +3 -0
  109. package/dist/hooks/team/useFetchMyTeam.d.ts.map +1 -0
  110. package/dist/hooks/team/useFetchMyTeam.js +12 -0
  111. package/dist/index.d.ts +1 -0
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js +1 -0
  114. package/dist/locales/vi/common.json +54 -53
  115. package/dist/screens/deskMessage/index.d.ts +4 -1
  116. package/dist/screens/deskMessage/index.d.ts.map +1 -1
  117. package/dist/screens/deskMessage/index.js +2 -2
  118. package/dist/services/query.d.ts +5 -0
  119. package/dist/services/query.d.ts.map +1 -1
  120. package/dist/services/query.js +5 -0
  121. package/dist/services/routes.d.ts +5 -0
  122. package/dist/services/routes.d.ts.map +1 -1
  123. package/dist/services/routes.js +5 -0
  124. package/dist/store/conversation.d.ts.map +1 -1
  125. package/dist/store/conversation.js +7 -1
  126. package/dist/styles/global.css +1 -1
  127. package/dist/tsconfig.tsbuildinfo +1 -0
  128. package/dist/types/chat.d.ts +7 -1
  129. package/dist/types/chat.d.ts.map +1 -1
  130. package/dist/types/chat.js +5 -0
  131. package/dist/types/dto.d.ts +53 -1
  132. package/dist/types/dto.d.ts.map +1 -1
  133. package/dist/utils/common.d.ts +3 -2
  134. package/dist/utils/common.d.ts.map +1 -1
  135. package/dist/utils/common.js +43 -19
  136. package/dist/utils/fileValidation.d.ts.map +1 -1
  137. package/dist/utils/fileValidation.js +2 -8
  138. package/dist/utils/queryHelpers.d.ts +3 -0
  139. package/dist/utils/queryHelpers.d.ts.map +1 -0
  140. package/dist/utils/queryHelpers.js +11 -0
  141. package/package.json +1 -1
@@ -3,7 +3,8 @@ import { DChatSDK } from "../../constants/sdk";
3
3
  import { v4 as uuidv4 } from "uuid";
4
4
  import { useChatContext } from "../../context/ChatContext";
5
5
  import { useCallback } from "react";
6
- import { pushNewMessage, removeOneMessage, updateOneMessage } from "./useMessage";
6
+ import { useTranslation } from "react-i18next";
7
+ import { pushNewMessage, removeOneMessage, updateOneMessage, } from "./useMessage";
7
8
  import { emit } from "../../utils/events";
8
9
  import useConversationStore from "../../store/conversation";
9
10
  import useAuthStore from "../../store/auth";
@@ -14,7 +15,8 @@ const MEDIA_CONTENT_TYPES = new Set([
14
15
  MessageType.VideoMessage,
15
16
  MessageType.FileMessage,
16
17
  ]);
17
- export const isMediaResendable = (message) => !MEDIA_CONTENT_TYPES.has(message.contentType) || messageFileStore.has(message.clientMsgID);
18
+ export const isMediaResendable = (message) => !MEDIA_CONTENT_TYPES.has(message.contentType) ||
19
+ messageFileStore.has(message.clientMsgID);
18
20
  export const createTextMessage = async (text) => {
19
21
  let textMessage = await DChatSDK.createTextMessage(text, new Date().getTime().toString())
20
22
  .then(({ data }) => {
@@ -81,13 +83,30 @@ export const createUrlTextMessage = async (text, urls) => {
81
83
  });
82
84
  return textMessage;
83
85
  };
86
+ export const createQuoteMessage = async (text, quotedMessage) => {
87
+ let textMessage = await DChatSDK.createQuoteMessage({
88
+ text,
89
+ message: JSON.stringify(quotedMessage),
90
+ })
91
+ .then(({ data }) => {
92
+ return data;
93
+ })
94
+ .catch(({ errCode, errMsg }) => {
95
+ console.error("createQuoteMessage", errCode, errMsg);
96
+ return null;
97
+ });
98
+ return textMessage;
99
+ };
84
100
  export const useSendMessage = () => {
85
101
  const { user } = useChatContext();
102
+ const { t } = useTranslation("common");
86
103
  const conversationData = useConversationStore((state) => state.conversationData);
104
+ const quotedMessage = useConversationStore((state) => state.quotedMessage);
105
+ const setQuotedMessage = useConversationStore((state) => state.setQuotedMessage);
87
106
  const { userID: recvID, groupID } = conversationData || {};
88
107
  const dispatchMessage = useCallback(async (message) => {
89
108
  var _a;
90
- const desc = generateContentBasedOnMessageType(message.contentType, ((_a = message === null || message === void 0 ? void 0 : message.textElem) === null || _a === void 0 ? void 0 : _a.content) || "") || "Bạn có tin nhắn mới";
109
+ const desc = generateContentBasedOnMessageType(message.contentType, ((_a = message === null || message === void 0 ? void 0 : message.textElem) === null || _a === void 0 ? void 0 : _a.content) || "") || t("new_message");
91
110
  const { data: successMessage } = await DChatSDK.sendMessage({
92
111
  recvID: recvID || "",
93
112
  groupID: groupID || "",
@@ -124,7 +143,8 @@ export const useSendMessage = () => {
124
143
  if (!storedFiles) {
125
144
  let newTextPayload = null;
126
145
  const textContent = ((_a = failedMessage.textElem) === null || _a === void 0 ? void 0 : _a.content) || failedMessage.content || "";
127
- if (failedMessage.contentType === MessageType.UrlTextMessage && failedMessage.urlTextElem) {
146
+ if (failedMessage.contentType === MessageType.UrlTextMessage &&
147
+ failedMessage.urlTextElem) {
128
148
  newTextPayload = await createUrlTextMessage(textContent, failedMessage.urlTextElem.urls);
129
149
  }
130
150
  else {
@@ -204,7 +224,11 @@ export const useSendMessage = () => {
204
224
  const urls = extractLinks(plainText);
205
225
  const isUrlMessage = urls.length > 0;
206
226
  let message = null;
207
- if (isUrlMessage) {
227
+ if (!!(quotedMessage === null || quotedMessage === void 0 ? void 0 : quotedMessage.clientMsgID)) {
228
+ message = await createQuoteMessage(plainText, quotedMessage);
229
+ setQuotedMessage(null);
230
+ }
231
+ else if (isUrlMessage) {
208
232
  message = await createUrlTextMessage(plainText, urls);
209
233
  }
210
234
  else {
@@ -218,7 +242,7 @@ export const useSendMessage = () => {
218
242
  });
219
243
  let messageItem = Object.assign(Object.assign({}, message), { ex: JSON.stringify(extendMessageInfo) || "{}" });
220
244
  sendMessage(messageItem);
221
- }, [recvID, groupID, user, sendMessage]);
245
+ }, [recvID, groupID, user, sendMessage, quotedMessage, setQuotedMessage]);
222
246
  const sendMergeMessage = useCallback(async ({ richText, plainText, files, currentSession, }) => {
223
247
  if (!recvID && !groupID)
224
248
  return;
@@ -313,20 +337,27 @@ export const useSendMessage = () => {
313
337
  }
314
338
  }
315
339
  if (!!plainText && plainText.trim() !== "") {
316
- const textMessage = await createTextMessage(plainText);
340
+ let textMessage = null;
341
+ if (quotedMessage) {
342
+ textMessage = await createQuoteMessage(plainText, quotedMessage);
343
+ setQuotedMessage(null);
344
+ }
345
+ else {
346
+ textMessage = await createTextMessage(plainText);
347
+ }
317
348
  if (!textMessage)
318
349
  return;
319
350
  messageList.push(textMessage);
320
351
  }
321
352
  for (const message of messageList) {
322
353
  const extendMessageInfo = generateExtendMessageInfo({
323
- richText,
354
+ richText: (message === null || message === void 0 ? void 0 : message.contentType) === MessageType.TextMessage ? richText : "",
324
355
  currentSession,
325
356
  });
326
357
  const mMessage = Object.assign(Object.assign({}, message), { ex: JSON.stringify(extendMessageInfo) || "{}" });
327
358
  await sendMessage(mMessage);
328
359
  }
329
- }, [recvID, groupID, sendMessage]);
360
+ }, [recvID, groupID, sendMessage, quotedMessage, setQuotedMessage]);
330
361
  return {
331
362
  sendTextMessage,
332
363
  sendMergeMessage,
@@ -0,0 +1,8 @@
1
+ import { BaseResponse } from "../../types/dto";
2
+ interface AssignSessionParams {
3
+ sessionId: string;
4
+ supporterId: string;
5
+ }
6
+ export declare const useAssignSession: () => import("@tanstack/react-query").UseMutationResult<BaseResponse<boolean>, Error, AssignSessionParams, unknown>;
7
+ export {};
8
+ //# sourceMappingURL=useAssignSession.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAssignSession.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useAssignSession.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,gBAAgB,qHAazB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { useMutation } from "@tanstack/react-query";
2
+ import { QUERY_KEYS } from "../../services/query";
3
+ import { apiInstance } from "../../services/api";
4
+ import { ENDPOINTS } from "../../services/routes";
5
+ import useAuthStore from "../../store/auth";
6
+ export const useAssignSession = () => useMutation({
7
+ mutationKey: [QUERY_KEYS.ASSIGN_SESSION],
8
+ mutationFn: async ({ sessionId, supporterId }) => {
9
+ const res = await apiInstance.post(ENDPOINTS.chatService.assignSession(sessionId), {
10
+ applicationType: useAuthStore.getState().applicationType,
11
+ supporterId,
12
+ });
13
+ return res === null || res === void 0 ? void 0 : res.data;
14
+ },
15
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"useCreateNote.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useCreateNote.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,eAAO,MAAM,aAAa;oBAQJ,MAAM;aACb,MAAM;cACL,MAAM;WAgBlB,CAAC"}
1
+ {"version":3,"file":"useCreateNote.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useCreateNote.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,eAAO,MAAM,aAAa;oBAQJ,MAAM;aACb,MAAM;cACL,MAAM;WAgBlB,CAAC"}
@@ -2,6 +2,7 @@ import { useMutation } from "@tanstack/react-query";
2
2
  import { QUERY_KEYS } from "../../services/query";
3
3
  import { apiInstance } from "../../services/api";
4
4
  import { ENDPOINTS } from "../../services/routes";
5
+ import { DChatApplicationType } from "../../types/chat";
5
6
  export const useCreateNote = () => useMutation({
6
7
  mutationKey: [QUERY_KEYS.CREATE_NOTE],
7
8
  mutationFn: async ({ conversationId, content, targetId, }) => {
@@ -11,7 +12,7 @@ export const useCreateNote = () => useMutation({
11
12
  targetId,
12
13
  targetType: "USER",
13
14
  }, {
14
- params: { applicationType: "OBEFE" },
15
+ params: { applicationType: DChatApplicationType.OBEFE },
15
16
  });
16
17
  return res === null || res === void 0 ? void 0 : res.data;
17
18
  },
@@ -0,0 +1,8 @@
1
+ import { ISupporterResponse } from "../../types/dto";
2
+ interface UseGetTeamSupportersParams {
3
+ teamId: string;
4
+ search?: string;
5
+ }
6
+ export declare const useGetTeamSupporters: ({ teamId, search, }: UseGetTeamSupportersParams) => import("@tanstack/react-query").UseQueryResult<ISupporterResponse[], Error>;
7
+ export {};
8
+ //# sourceMappingURL=useGetTeamSupporters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGetTeamSupporters.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useGetTeamSupporters.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGnE,UAAU,0BAA0B;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,oBAAoB,GAAI,qBAGlC,0BAA0B,gFAiBzB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { useQuery, keepPreviousData } from "@tanstack/react-query";
2
+ import { QUERY_KEYS } from "../../services/query";
3
+ import { apiInstance } from "../../services/api";
4
+ import { ENDPOINTS } from "../../services/routes";
5
+ import useAuthStore from "../../store/auth";
6
+ export const useGetTeamSupporters = ({ teamId, search, }) => useQuery({
7
+ queryKey: [QUERY_KEYS.GET_TEAM_SUPPORTERS, teamId, search],
8
+ queryFn: async () => {
9
+ var _a;
10
+ const res = await apiInstance.get(ENDPOINTS.chatService.getTeamSupporters(teamId), {
11
+ params: {
12
+ applicationType: useAuthStore.getState().applicationType,
13
+ search: search || null,
14
+ },
15
+ });
16
+ return (_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.data;
17
+ },
18
+ enabled: !!teamId,
19
+ placeholderData: keepPreviousData,
20
+ });
@@ -0,0 +1,3 @@
1
+ import { IMyTeamResponse } from "../../types/dto";
2
+ export declare const useFetchMyTeams: () => import("@tanstack/react-query").UseQueryResult<IMyTeamResponse[], Error>;
3
+ //# sourceMappingURL=useFetchMyTeam.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFetchMyTeam.d.ts","sourceRoot":"","sources":["../../../src/hooks/team/useFetchMyTeam.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEhE,eAAO,MAAM,eAAe,gFASxB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { useQuery } from "@tanstack/react-query";
2
+ import { QUERY_KEYS } from "../../services/query";
3
+ import { apiInstance } from "../../services/api";
4
+ import { ENDPOINTS } from "../../services/routes";
5
+ export const useFetchMyTeams = () => useQuery({
6
+ queryKey: [QUERY_KEYS.GET_MY_TEAMS],
7
+ queryFn: async () => {
8
+ var _a;
9
+ const res = await apiInstance.get(ENDPOINTS.chatService.getMyTeams);
10
+ return ((_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.data) || [];
11
+ },
12
+ });
package/dist/index.d.ts CHANGED
@@ -12,6 +12,7 @@ export { default as qs } from "query-string";
12
12
  export * from "antd/es/table";
13
13
  export { ChatProvider, useChatContext } from "./context/ChatContext";
14
14
  export { DChatDeskMessage, DChatBubble, Icon };
15
+ export { default as RichTextEditor } from "./components/richTextEditor/RichTextEditor";
15
16
  export { useDChatAuth } from "./hooks/user/useAuth";
16
17
  export { useUpdateFcmToken } from "./hooks/user/useUpdateFcmToken";
17
18
  export { useUserStore, DChatApplicationType, useAuthStore };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AAExB,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;AACrD,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,MAAM,cAAc,CAAC;AAC7C,cAAc,eAAe,CAAC;AAG9B,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGrE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAG/C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,CAAC;AAI5D,OAAO,EACL,QAAQ,IAAI,aAAa,EACzB,QAAQ,IAAI,aAAa,EACzB,WAAW,IAAI,gBAAgB,GAChC,CAAC;AAEF,YAAY,EAAE,uBAAuB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AAExB,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;AACrD,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,MAAM,cAAc,CAAC;AAC7C,cAAc,eAAe,CAAC;AAG9B,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGrE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAGvF,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,CAAC;AAI5D,OAAO,EACL,QAAQ,IAAI,aAAa,EACzB,QAAQ,IAAI,aAAa,EACzB,WAAW,IAAI,gBAAgB,GAChC,CAAC;AAEF,YAAY,EAAE,uBAAuB,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -14,6 +14,7 @@ export * from "antd/es/table";
14
14
  export { ChatProvider, useChatContext } from "./context/ChatContext";
15
15
  //Components
16
16
  export { DChatDeskMessage, DChatBubble, Icon };
17
+ export { default as RichTextEditor } from "./components/richTextEditor/RichTextEditor";
17
18
  //Hooks
18
19
  export { useDChatAuth } from "./hooks/user/useAuth";
19
20
  export { useUpdateFcmToken } from "./hooks/user/useUpdateFcmToken";
@@ -42,58 +42,59 @@
42
42
  "create_note_failed": "Thêm ghi chú thất bại",
43
43
  "update_note_failed": "Cập nhật ghi chú thất bại",
44
44
  "copied_to_clipboard": "Đã sao chép",
45
- "save_success": "Lưu thành công!",
46
- "save_failed": "Lưu thất bại!",
47
- "cs_team_management": "Quản lý nhóm",
48
- "default_message": "Tin nhắn mặc định",
49
- "default_start_message_description": " Hiển thị tin nhắn này khi người dùng bắt đầu một phiên chat với nhân viên CS",
50
- "default_close_message_description": " Hiển thị tin nhắn này khi kết thúc phiên chat với nhân viên CS.",
51
- "cancel_changes": "Huỷ thay đổi",
52
- "cancel_changes_confirmation": "Rời trang và huỷ thay đổi",
53
- "continue_editing": "Tiếp tục chỉnh sửa",
54
- "unsaved_changes_warning": " Các dữ liệu đang chỉnh sửa sẽ bị mất khi bạn rời trang. Bạn chắc chắn muốn huỷ thay đổi?",
55
- "group_deleted": "Xóa nhóm thành công!",
56
- "group_deleted_failed": "Xóa nhóm thất bại!",
57
- "create_group": "Tạo nhóm",
58
- "group_name": "Tên nhóm",
59
- "group_code": "Mã nhóm",
60
- "group_members": "Thành viên",
61
- "group_description": "Mô tả",
62
- "group_actions": "Thao tác",
63
- "edit": "Chỉnh sửa",
64
- "delete": "Xoá",
65
- "group_search": "Tìm theo tên nhóm",
66
- "group_delete": "Xoá CS Team",
67
- "group_delete_confirmation": "Các dữ liệu về team {{name}} sẽ mất hoàn toàn sau khi xoá. Bạn có chắc chắn muốn xoá?",
68
- "group_create_success": "Tạo nhóm thành công!",
69
- "group_create": "Tạo nhóm CS mới",
70
- "create": "Tạo",
71
- "add_member": "Thêm thành viên",
72
- "search_and_select_member": "Tìm kiếm và chọn thành viên",
73
- "save": "Lưu",
74
- "create_new_group": "Tạo nhóm CS mới",
75
- "open_session": "Mở phiên",
76
- "close_session": "Đóng phiên",
77
45
  "message_send_failed": "Gửi tin nhắn thất bại, bạn vui lòng <bold>nhấn để gửi lại</bold>",
78
46
  "message_send_failed_no_retry": "Gửi tin nhắn thất bại",
79
- "general_info": "Thông tin chung",
80
- "member_name": "Tên thành viên",
81
- "activity_status": "Trạng thái hoạt động",
82
- "online": "Trực tuyến",
83
- "offline": "Ngoại tuyến",
84
- "add_member_button": "Thêm thành viên",
85
- "member_username": "Tên thành viên",
86
- "change_status": "Thay đổi trạng thái",
87
- "change_status_online_to_offline": "<bold>Bạn đang trạng thái Trực tuyến</bold>, khi chuyển sang Ngoại tuyến hệ thống sẽ không tự động gửi yêu cầu hỗ trợ mới cho bạn.\nBạn có chắc chắn muốn thay đổi trạng thái?",
88
- "change_status_offline_to_online": "<bold>Bạn đang ở trạng thái Ngoại tuyến</bold>, khi chuyển sang Trực tuyến hệ thống sẽ tự động thêm bạn vào phiên hỗ trợ.\nBạn có chắc chắn muốn thay đổi trạng thái?",
89
- "confirm": "Xác nhận",
90
- "update_status_success": "Cập nhật trạng thái thành công",
91
- "update_status_failed": "Cập nhật trạng thái thất bại",
92
- "missing_field": "Thiếu {{field}}",
93
- "validation": {
94
- "default_message": "Nhập nội dung tin nhắn mặc định",
95
- "group_name": "Thiếu tên nhóm",
96
- "group_name_length": "Số tự tối đa của tên nhóm là 200",
97
- "group_description_length": "Số tự đối đa 200."
98
- }
99
- }
47
+ "context_menu_reply": "Trả lời",
48
+ "context_menu_revoke": "Thu hồi",
49
+ "revoke_message_confirm_title": "Thu hồi tin nhắn?",
50
+ "revoke_message_confirm_message": "Bạn có chắc chắn muốn thu hồi tin nhắn này?",
51
+ "revoke": "Thu hồi",
52
+ "revoked": "Đã thu hồi tin nhắn",
53
+ "manual_assign_search_placeholder": "Tìm kiếm",
54
+ "manual_assign_no_results": "Không kết quả phù hợp",
55
+ "manual_assign_confirm_question": "Phân công lại cho <bold>{{name}}</bold>?",
56
+ "manual_assign_button_reassign": "Phân công lại",
57
+ "manual_assign_success": "Phân công thành công",
58
+ "manual_assign_failed": "Phân công thất bại",
59
+ "manual_assign_current": "Đang xử ",
60
+ "video_limit_exceeded": "Chỉ được phép tải lên 1 video duy nhất",
61
+ "select_status": "Chọn trạng thái",
62
+ "invalid_file_format": "{{fileName}} không đúng định dạng JPG, JPEG, PNG hoặc VIDEO",
63
+ "file_size_exceeded": "{{fileName}} kích thước tập tin vượt quá {{maxSize}}MB",
64
+ "file_processing_error": "Đã xảy ra lỗi khi xử tệp",
65
+ "invalid_document_format": "{{fileName}} không đúng định dạng (chỉ hỗ trợ PDF, DOC, DOCX)",
66
+ "view_message": "Xem tin nhắn",
67
+ "search_message_title": "Tìm kiếm tin nhắn",
68
+ "msg_type_image": "[Hình ảnh]",
69
+ "msg_type_voice": "[Tin nhắn thoại]",
70
+ "msg_type_file": "[File đính kèm]",
71
+ "msg_type_link": "[Liên kết]",
72
+ "msg_type_unsupported": "Tin nhắn không khả dụng",
73
+ "session_started": "Phiên chat đã bắt đầu",
74
+ "session_ended": "Phiên chat đã kết thúc",
75
+ "new_message": "Bạn có tin nhắn mới",
76
+ "close_session_success": "Đóng phiên chat thành công",
77
+ "close_session_failed": "Đóng phiên chat thất bại",
78
+ "session_active": "Đang hoạt động",
79
+ "session_add_tag_placeholder": "Thêm thẻ...",
80
+ "session_issue_detail_placeholder": "Vấn đề cụ thể...",
81
+ "session_note_placeholder": "Ghi chú...",
82
+ "session_close_button": "Đóng",
83
+ "member_count": "{{count}} thành viên",
84
+ "choose_emoji": "Chọn biểu tượng cảm xúc",
85
+ "emoji_smileys": "Mặt cười",
86
+ "emoji_nature": "Động vật",
87
+ "emoji_food": "Đồ ăn",
88
+ "emoji_activities": "Hoạt động",
89
+ "session_label": "Phiên {{order}}",
90
+ "sessions_heading": "PHIÊN HỖ TRỢ",
91
+ "reply_to": "Đang trả lời {{name}}",
92
+ "your_self": "chính mình",
93
+ "replied_to": "{{from}} đã trả lời {{to}}",
94
+ "canned_responses": "Câu trả lời nhanh",
95
+ "team": "Team",
96
+ "personal": "Cá nhân",
97
+ "no_canned_response": "Không tìm thấy kết quả phù hợp",
98
+ "add_canned_response": "Thêm câu trả lời nhanh",
99
+ "canned_response_quick_search_placeholder": "Câu trả lời nhanh phù hợp với"
100
+ }
@@ -1,3 +1,6 @@
1
- declare const DChatDeskMessage: () => import("react/jsx-runtime").JSX.Element;
1
+ interface DChatDeskMessageProps {
2
+ openCreateCannedModal?: () => void;
3
+ }
4
+ declare const DChatDeskMessage: ({ openCreateCannedModal }: DChatDeskMessageProps) => import("react/jsx-runtime").JSX.Element;
2
5
  export default DChatDeskMessage;
3
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/screens/deskMessage/index.tsx"],"names":[],"mappings":"AAWA,QAAA,MAAM,gBAAgB,+CA8BrB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/screens/deskMessage/index.tsx"],"names":[],"mappings":"AAWA,UAAU,qBAAqB;IAC7B,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;CACpC;AAED,QAAA,MAAM,gBAAgB,GAAI,2BAA2B,qBAAqB,4CA+BzE,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -8,10 +8,10 @@ import { ConnectStatus, SyncStatus } from "../../types/chat";
8
8
  import useConversationStore from "../../store/conversation";
9
9
  import DeskAssignedSession from "../../components/session/DeskAssignedSession";
10
10
  import ThreadInfo from "../../components/thread/ThreadInfo";
11
- const DChatDeskMessage = () => {
11
+ const DChatDeskMessage = ({ openCreateCannedModal }) => {
12
12
  const selectedConversationId = useConversationStore((state) => state.selectedConversationId);
13
13
  const searchClientMsgID = useConversationStore((state) => state.searchClientMsgID);
14
14
  const { connectStatus, syncStatus } = useChatContext();
15
- return (_jsx(_Fragment, { children: connectStatus === ConnectStatus.Connected ? (_jsx(Spin, { spinning: syncStatus === SyncStatus.Loading, children: _jsxs("div", { className: "flex flex-1 flex-row h-screen bg-gray-50", children: [_jsx(DeskAssignedSession, {}), _jsx(DeskConversationList, {}), _jsx(MessageList, { conversationId: selectedConversationId, searchClientMsgID: searchClientMsgID }), _jsx(ThreadInfo, {})] }) })) : (_jsx("div", { className: "flex flex-1 flex-row h-screen bg-gray-50", children: connectStatus === ConnectStatus.Connecting && _jsx(Spin, { fullscreen: true }) })) }));
15
+ return (_jsx(_Fragment, { children: connectStatus === ConnectStatus.Connected ? (_jsx(Spin, { spinning: syncStatus === SyncStatus.Loading, children: _jsxs("div", { className: "flex flex-1 flex-row h-screen bg-gray-50", children: [_jsx(DeskAssignedSession, {}), _jsx(DeskConversationList, {}), _jsx(MessageList, { conversationId: selectedConversationId, searchClientMsgID: searchClientMsgID, openCreateCannedModal: openCreateCannedModal }), _jsx(ThreadInfo, {})] }) })) : (_jsx("div", { className: "flex flex-1 flex-row h-screen bg-gray-50", children: connectStatus === ConnectStatus.Connecting && _jsx(Spin, { fullscreen: true }) })) }));
16
16
  };
17
17
  export default DChatDeskMessage;
@@ -12,5 +12,10 @@ export declare const QUERY_KEYS: {
12
12
  UPDATE_SESSION_INFO: string;
13
13
  CLOSE_SESSION: string;
14
14
  GET_LABEL_SESSION: string;
15
+ GET_TEAM_SUPPORTERS: string;
16
+ ASSIGN_SESSION: string;
17
+ GET_MY_TEAMS: string;
18
+ GET_CANNED_CATEGORIES: string;
19
+ GET_CANNED_RESPONSES: string;
15
20
  };
16
21
  //# sourceMappingURL=query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/services/query.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;CActB,CAAC"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/services/query.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;CAmBtB,CAAC"}
@@ -12,4 +12,9 @@ export const QUERY_KEYS = {
12
12
  UPDATE_SESSION_INFO: "UPDATE_SESSION_INFO",
13
13
  CLOSE_SESSION: "CLOSE_SESSION",
14
14
  GET_LABEL_SESSION: "GET_LABEL_SESSION",
15
+ GET_TEAM_SUPPORTERS: "GET_TEAM_SUPPORTERS",
16
+ ASSIGN_SESSION: "ASSIGN_SESSION",
17
+ GET_MY_TEAMS: "GET_MY_TEAMS_PACKAGE",
18
+ GET_CANNED_CATEGORIES: "GET_CANNED_CATEGORIES_PACKAGE",
19
+ GET_CANNED_RESPONSES: "GET_CANNED_RESPONSES_PACKAGE",
15
20
  };
@@ -13,6 +13,11 @@ export declare const ENDPOINTS: {
13
13
  updateSessionInfo: (sessionId: string) => string;
14
14
  closeSession: (sessionId: string) => string;
15
15
  getLabelSession: string;
16
+ getTeamSupporters: (teamId: string) => string;
17
+ assignSession: (sessionId: string) => string;
18
+ getMyTeams: string;
19
+ getCannedCategories: string;
20
+ getCannedResponses: string;
16
21
  };
17
22
  identityService: {
18
23
  getToken: string;
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/services/routes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;;;;mCAMS,MAAM;;0CAGC,MAAM,UAAU,MAAM;6BAEnC,MAAM;;oDAEiB,MAAM;uCAEnB,MAAM;kCAEX,MAAM;;;;;;;;;CAUnC,CAAC"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/services/routes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;;;;mCAMS,MAAM;;0CAGC,MAAM,UAAU,MAAM;6BAEnC,MAAM;;oDAEiB,MAAM;uCAEnB,MAAM;kCAEX,MAAM;;oCAGJ,MAAM;mCAEP,MAAM;;;;;;;;;;;CAYpC,CAAC"}
@@ -13,6 +13,11 @@ export const ENDPOINTS = {
13
13
  updateSessionInfo: (sessionId) => `chat-service/v1/crm/sessions/${sessionId}`,
14
14
  closeSession: (sessionId) => `chat-service/v1/crm/sessions/${sessionId}/close`,
15
15
  getLabelSession: "chat-service/v1/labels",
16
+ getTeamSupporters: (teamId) => `chat-service/v1/crm/teams/${teamId}/supporters`,
17
+ assignSession: (sessionId) => `chat-service/v1/crm/sessions/${sessionId}/assign`,
18
+ getMyTeams: "/chat-service/v1/crm/teams/user/me",
19
+ getCannedCategories: "/chat-service/v1/crm/canned-responses/categories",
20
+ getCannedResponses: "chat-service/v1/crm/canned-responses/search",
16
21
  },
17
22
  identityService: {
18
23
  getToken: "/identity-service/v1/identity/get-token",
@@ -1 +1 @@
1
- {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/store/conversation.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAO3C,QAAA,MAAM,oBAAoB,gFAwJvB,CAAC;AAEJ,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/store/conversation.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAO3C,QAAA,MAAM,oBAAoB,gFA8JvB,CAAC;AAEJ,eAAe,oBAAoB,CAAC"}
@@ -15,7 +15,7 @@ const useConversationStore = create((set, get) => ({
15
15
  searchClientMsgID: dataSearchClientMsgID,
16
16
  }),
17
17
  selectedConversationId: "",
18
- setSelectedConversationId: (threadId) => set({ selectedConversationId: threadId }),
18
+ setSelectedConversationId: (threadId) => set({ selectedConversationId: threadId, quotedMessage: null }),
19
19
  selectedSourceId: "",
20
20
  // conversation
21
21
  conversationList: [],
@@ -120,6 +120,7 @@ const useConversationStore = create((set, get) => ({
120
120
  unreadCount: 0,
121
121
  currentGroupInfo: undefined,
122
122
  currentMemberInGroup: undefined,
123
+ quotedMessage: null,
123
124
  });
124
125
  },
125
126
  //search
@@ -127,5 +128,10 @@ const useConversationStore = create((set, get) => ({
127
128
  setSearchClientMsgID: (clientMsgID) => {
128
129
  set({ searchClientMsgID: clientMsgID });
129
130
  },
131
+ //quoted message
132
+ quotedMessage: null,
133
+ setQuotedMessage: (message) => {
134
+ set({ quotedMessage: message });
135
+ },
130
136
  }));
131
137
  export default useConversationStore;
@@ -1 +1 @@
1
- *,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.bottom-0{bottom:0}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.left-7{left:1.75rem}.right-0{right:0}.right-\[-8px\]{right:-8px}.top-0{top:0}.top-1\/2{top:50%}.top-2{top:.5rem}.top-\[-8px\]{top:-8px}.\!z-\[9999\]{z-index:9999!important}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.mx-1{margin-left:.25rem;margin-right:.25rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-\[-4px\]{margin-bottom:-4px}.ml-2{margin-left:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-\[2px\]{margin-top:2px}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.\!h-full{height:100%!important}.h-2{height:.5rem}.h-5{height:1.25rem}.h-8{height:2rem}.h-\[32px\]{height:32px}.h-\[36px\]{height:36px}.h-\[48px\]{height:48px}.h-\[600px\]{height:600px}.h-full{height:100%}.h-screen{height:100vh}.max-h-48{max-height:12rem}.max-h-\[140px\]{max-height:140px}.min-h-10{min-height:2.5rem}.min-h-6{min-height:1.5rem}.min-h-\[64px\]{min-height:64px}.w-1{width:.25rem}.w-16{width:4rem}.w-2{width:.5rem}.w-5{width:1.25rem}.w-8{width:2rem}.w-80{width:20rem}.w-\[320px\]{width:320px}.w-\[32px\]{width:32px}.w-\[330px\]{width:330px}.w-\[36px\]{width:36px}.w-\[400px\]{width:400px}.w-\[48px\]{width:48px}.w-full{width:100%}.min-w-0{min-width:0}.min-w-10{min-width:2.5rem}.min-w-6{min-width:1.5rem}.min-w-\[100px\]{min-width:100px}.max-w-\[200px\]{max-width:200px}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.flex-\[0\.8\]{flex:0.8}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-px{gap:1px}.self-center{align-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-none{border-style:none}.border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity,1))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-indigo-500{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity,1))}.border-l-blue-500{--tw-border-opacity:1;border-left-color:rgb(59 130 246/var(--tw-border-opacity,1))}.\!bg-amber-100{--tw-bg-opacity:1!important;background-color:rgb(254 243 199/var(--tw-bg-opacity,1))!important}.\!bg-amber-500{--tw-bg-opacity:1!important;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))!important}.\!bg-blue-100{--tw-bg-opacity:1!important;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))!important}.\!bg-blue-500{--tw-bg-opacity:1!important;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))!important}.\!bg-gray-100{--tw-bg-opacity:1!important;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))!important}.\!bg-gray-500{--tw-bg-opacity:1!important;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))!important}.\!bg-green-100{--tw-bg-opacity:1!important;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))!important}.\!bg-green-500{--tw-bg-opacity:1!important;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))!important}.\!bg-orange-100{--tw-bg-opacity:1!important;background-color:rgb(255 237 213/var(--tw-bg-opacity,1))!important}.\!bg-orange-500{--tw-bg-opacity:1!important;background-color:rgb(249 115 22/var(--tw-bg-opacity,1))!important}.\!bg-purple-100{--tw-bg-opacity:1!important;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))!important}.\!bg-purple-500{--tw-bg-opacity:1!important;background-color:rgb(168 85 247/var(--tw-bg-opacity,1))!important}.\!bg-red-100{--tw-bg-opacity:1!important;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))!important}.\!bg-red-500{--tw-bg-opacity:1!important;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))!important}.bg-black\/30{background-color:rgba(0,0,0,.3)}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.bg-neutral-100{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity,1))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-0{padding-top:0;padding-bottom:0}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.pb-2{padding-bottom:.5rem}.pb-4{padding-bottom:1rem}.pb-60{padding-bottom:15rem}.pl-4{padding-left:1rem}.pr-2{padding-right:.5rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.text-center{text-align:center}.text-right{text-align:right}.\!align-\[-4px\]{vertical-align:-4px!important}.\!text-sm{font-size:.875rem!important;line-height:1.25rem!important}.text-2xl{font-size:1.5rem;line-height:2rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tracking-wider{letter-spacing:.05em}.\!text-amber-500{--tw-text-opacity:1!important;color:rgb(245 158 11/var(--tw-text-opacity,1))!important}.\!text-blue-500{--tw-text-opacity:1!important;color:rgb(59 130 246/var(--tw-text-opacity,1))!important}.\!text-gray-500{--tw-text-opacity:1!important;color:rgb(107 114 128/var(--tw-text-opacity,1))!important}.\!text-green-500{--tw-text-opacity:1!important;color:rgb(34 197 94/var(--tw-text-opacity,1))!important}.\!text-orange-400{--tw-text-opacity:1!important;color:rgb(251 146 60/var(--tw-text-opacity,1))!important}.\!text-orange-500{--tw-text-opacity:1!important;color:rgb(249 115 22/var(--tw-text-opacity,1))!important}.\!text-purple-500{--tw-text-opacity:1!important;color:rgb(168 85 247/var(--tw-text-opacity,1))!important}.\!text-red-500{--tw-text-opacity:1!important;color:rgb(239 68 68/var(--tw-text-opacity,1))!important}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.\!shadow-none{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.blur{--tw-blur:blur(8px)}.blur,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ant-tabs-tab{margin:0!important;min-width:80px!important;justify-content:center!important;align-items:center!important}.ant-tabs-content,.ant-tabs-content-holder,.ant-tabs-tabpane{height:100%}.zoom-in-out-element{animation:zoom-in-zoom-out 1.5s ease none}@keyframes zoom-in-zoom-out{0%{scale:100%}25%{scale:125%}50%{scale:100%}75%{scale:125%}to{scale:100%}}.hover\:rounded-sm:hover{border-radius:.125rem}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}@media (min-width:640px){.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:text-base{font-size:1rem;line-height:1.5rem}}
1
+ *,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.bottom-0{bottom:0}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.left-3{left:.75rem}.left-7{left:1.75rem}.right-0{right:0}.right-\[-8px\]{right:-8px}.top-0{top:0}.top-1\/2{top:50%}.top-2{top:.5rem}.top-\[-8px\]{top:-8px}.\!z-\[9999\]{z-index:9999!important}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.mx-1{margin-left:.25rem;margin-right:.25rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-\[-4px\]{margin-bottom:-4px}.ml-2{margin-left:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-\[2px\]{margin-top:2px}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.\!h-full{height:100%!important}.h-10{height:2.5rem}.h-2{height:.5rem}.h-5{height:1.25rem}.h-8{height:2rem}.h-\[32px\]{height:32px}.h-\[36px\]{height:36px}.h-\[400px\]{height:400px}.h-\[48px\]{height:48px}.h-\[600px\]{height:600px}.h-full{height:100%}.h-screen{height:100vh}.max-h-48{max-height:12rem}.max-h-72{max-height:18rem}.max-h-\[140px\]{max-height:140px}.min-h-10{min-height:2.5rem}.min-h-6{min-height:1.5rem}.min-h-\[64px\]{min-height:64px}.w-1{width:.25rem}.w-10{width:2.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-5{width:1.25rem}.w-64{width:16rem}.w-8{width:2rem}.w-96{width:24rem}.w-\[170px\]{width:170px}.w-\[320px\]{width:320px}.w-\[32px\]{width:32px}.w-\[330px\]{width:330px}.w-\[36px\]{width:36px}.w-\[400px\]{width:400px}.w-\[48px\]{width:48px}.w-\[600px\]{width:600px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.min-w-0{min-width:0}.min-w-10{min-width:2.5rem}.min-w-6{min-width:1.5rem}.min-w-\[100px\]{min-width:100px}.max-w-\[200px\]{max-width:200px}.max-w-\[75\%\]{max-width:75%}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-items-center{justify-items:center}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-px{gap:1px}.self-center{align-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-normal{overflow-wrap:normal;word-break:normal}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-r-2{border-right-width:2px}.border-t{border-top-width:1px}.border-none{border-style:none}.border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity,1))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-indigo-500{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity,1))}.border-l-blue-500{--tw-border-opacity:1;border-left-color:rgb(59 130 246/var(--tw-border-opacity,1))}.\!bg-amber-100{--tw-bg-opacity:1!important;background-color:rgb(254 243 199/var(--tw-bg-opacity,1))!important}.\!bg-amber-500{--tw-bg-opacity:1!important;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))!important}.\!bg-blue-100{--tw-bg-opacity:1!important;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))!important}.\!bg-blue-500{--tw-bg-opacity:1!important;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))!important}.\!bg-gray-100{--tw-bg-opacity:1!important;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))!important}.\!bg-gray-500{--tw-bg-opacity:1!important;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))!important}.\!bg-green-100{--tw-bg-opacity:1!important;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))!important}.\!bg-green-500{--tw-bg-opacity:1!important;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))!important}.\!bg-orange-100{--tw-bg-opacity:1!important;background-color:rgb(255 237 213/var(--tw-bg-opacity,1))!important}.\!bg-orange-500{--tw-bg-opacity:1!important;background-color:rgb(249 115 22/var(--tw-bg-opacity,1))!important}.\!bg-purple-100{--tw-bg-opacity:1!important;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))!important}.\!bg-purple-500{--tw-bg-opacity:1!important;background-color:rgb(168 85 247/var(--tw-bg-opacity,1))!important}.\!bg-red-100{--tw-bg-opacity:1!important;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))!important}.\!bg-red-500{--tw-bg-opacity:1!important;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))!important}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.bg-black\/30{background-color:rgba(0,0,0,.3)}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.bg-neutral-100{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity,1))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.object-cover{-o-object-fit:cover;object-fit:cover}.\!p-0{padding:0!important}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-0{padding-top:0;padding-bottom:0}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-2{padding-bottom:.5rem}.pb-4{padding-bottom:1rem}.pb-60{padding-bottom:15rem}.pl-4{padding-left:1rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.text-center{text-align:center}.text-right{text-align:right}.\!align-\[-4px\]{vertical-align:-4px!important}.\!text-sm{font-size:.875rem!important;line-height:1.25rem!important}.text-2xl{font-size:1.5rem;line-height:2rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tracking-wider{letter-spacing:.05em}.\!text-amber-500{--tw-text-opacity:1!important;color:rgb(245 158 11/var(--tw-text-opacity,1))!important}.\!text-blue-500{--tw-text-opacity:1!important;color:rgb(59 130 246/var(--tw-text-opacity,1))!important}.\!text-gray-500{--tw-text-opacity:1!important;color:rgb(107 114 128/var(--tw-text-opacity,1))!important}.\!text-green-500{--tw-text-opacity:1!important;color:rgb(34 197 94/var(--tw-text-opacity,1))!important}.\!text-orange-400{--tw-text-opacity:1!important;color:rgb(251 146 60/var(--tw-text-opacity,1))!important}.\!text-orange-500{--tw-text-opacity:1!important;color:rgb(249 115 22/var(--tw-text-opacity,1))!important}.\!text-purple-500{--tw-text-opacity:1!important;color:rgb(168 85 247/var(--tw-text-opacity,1))!important}.\!text-red-500{--tw-text-opacity:1!important;color:rgb(239 68 68/var(--tw-text-opacity,1))!important}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-purple-500{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.opacity-50{opacity:.5}.\!shadow-none{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.blur{--tw-blur:blur(8px)}.blur,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.ant-tabs-tab{margin:0!important;min-width:80px!important;justify-content:center!important;align-items:center!important}.ant-tabs-content,.ant-tabs-content-holder,.ant-tabs-tabpane{height:100%}.zoom-in-out-element{animation:zoom-in-zoom-out 1.5s ease none}@keyframes zoom-in-zoom-out{0%{scale:100%}25%{scale:125%}50%{scale:100%}75%{scale:125%}to{scale:100%}}.focus-within\:border-\[\#3278f7\]:focus-within{--tw-border-opacity:1;border-color:rgb(50 120 247/var(--tw-border-opacity,1))}.focus-within\:shadow-\[0_0_0_2px_rgba\(50\2c 120\2c 247\2c 0\.12\)\]:focus-within{--tw-shadow:0 0 0 2px rgba(50,120,247,.12);--tw-shadow-colored:0 0 0 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:rounded-sm:hover{border-radius:.125rem}.hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.hover\:opacity-80:hover{opacity:.8}@media (min-width:640px){.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:text-base{font-size:1rem;line-height:1.5rem}}