@droppii-org/chat-sdk 0.6.36 → 0.6.38

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 (37) hide show
  1. package/dist/components/conversation-detail/ConversationDetailInput.d.ts.map +1 -1
  2. package/dist/components/conversation-detail/ConversationDetailInput.js +6 -0
  3. package/dist/components/conversation-detail/TypingIndicatorBar.d.ts +10 -0
  4. package/dist/components/conversation-detail/TypingIndicatorBar.d.ts.map +1 -0
  5. package/dist/components/conversation-detail/TypingIndicatorBar.js +24 -0
  6. package/dist/components/message/item/AtTextMessage.d.ts.map +1 -1
  7. package/dist/components/message/item/AtTextMessage.js +3 -2
  8. package/dist/components/message/item/CollapsibleText.d.ts +8 -0
  9. package/dist/components/message/item/CollapsibleText.d.ts.map +1 -0
  10. package/dist/components/message/item/CollapsibleText.js +85 -0
  11. package/dist/components/message/item/TextMessage.d.ts.map +1 -1
  12. package/dist/components/message/item/TextMessage.js +4 -3
  13. package/dist/components/message/item/UrlTextMessage.d.ts.map +1 -1
  14. package/dist/components/message/item/UrlTextMessage.js +4 -3
  15. package/dist/components/message/item/textStyle.d.ts +1 -0
  16. package/dist/components/message/item/textStyle.d.ts.map +1 -1
  17. package/dist/components/message/item/textStyle.js +2 -0
  18. package/dist/context/ChatContext.d.ts.map +1 -1
  19. package/dist/context/ChatContext.js +1 -1
  20. package/dist/hooks/global/useGlobalEvent.d.ts.map +1 -1
  21. package/dist/hooks/global/useGlobalEvent.js +10 -1
  22. package/dist/hooks/message/useReportTypingState.d.ts +10 -0
  23. package/dist/hooks/message/useReportTypingState.d.ts.map +1 -0
  24. package/dist/hooks/message/useReportTypingState.js +73 -0
  25. package/dist/hooks/message/useTypingStatus.d.ts +11 -0
  26. package/dist/hooks/message/useTypingStatus.d.ts.map +1 -0
  27. package/dist/hooks/message/useTypingStatus.js +120 -0
  28. package/dist/hooks/user/useAuth.d.ts.map +1 -1
  29. package/dist/hooks/user/useAuth.js +2 -0
  30. package/dist/locales/vi/conversation-inbox.json +5 -0
  31. package/dist/screens/conversation-detail/index.d.ts.map +1 -1
  32. package/dist/screens/conversation-detail/index.js +2 -1
  33. package/dist/store/typing.d.ts +13 -0
  34. package/dist/store/typing.d.ts.map +1 -0
  35. package/dist/store/typing.js +63 -0
  36. package/dist/styles/global.css +1 -1
  37. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationDetailInput.d.ts","sourceRoot":"","sources":["../../../src/components/conversation-detail/ConversationDetailInput.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAmB/D,MAAM,WAAW,4BAA4B;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,QAAA,MAAM,uBAAuB,GAAI,4EAM9B,4BAA4B,4CA8rB9B,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
1
+ {"version":3,"file":"ConversationDetailInput.d.ts","sourceRoot":"","sources":["../../../src/components/conversation-detail/ConversationDetailInput.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAmB/D,MAAM,WAAW,4BAA4B;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,QAAA,MAAM,uBAAuB,GAAI,4EAM9B,4BAA4B,4CAosB9B,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
@@ -7,6 +7,7 @@ import clsx from "clsx";
7
7
  import { Button, message as toastMessage } from "antd";
8
8
  import { Icon } from "../../components/icon";
9
9
  import { useSendMessage } from "../../hooks/message/useSendMessage";
10
+ import { useReportTypingState } from "../../hooks/message/useReportTypingState";
10
11
  import { useJoinPublicGroup } from "../../hooks/group/useJoinPublicGroup";
11
12
  import useAuthStore from "../../store/auth";
12
13
  import useConversationStore from "../../store/conversation";
@@ -75,6 +76,7 @@ const ConversationDetailInput = ({ placeholder, onSendMessage, onInputChange, mo
75
76
  scrollEvent: "CONVERSATION_CHAT_SCROLL_TO_BOTTOM_IF_AT_BOTTOM",
76
77
  }), []);
77
78
  const { sendMergeMessage } = useSendMessage(sendMessageOptions);
79
+ const { reportActivity: reportTyping, stopTyping } = useReportTypingState(conversationId);
78
80
  const userID = useAuthStore((state) => state.userID);
79
81
  const setDraft = useMessageDraftStore((state) => state.setDraft);
80
82
  const clearDraft = useMessageDraftStore((state) => state.clearDraft);
@@ -284,6 +286,7 @@ const ConversationDetailInput = ({ placeholder, onSendMessage, onInputChange, mo
284
286
  if (conversationId && userID) {
285
287
  setDraft(userID, conversationId, nextValue);
286
288
  }
289
+ reportTyping(nextValue);
287
290
  onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(nextValue);
288
291
  };
289
292
  // Covers caret-only movement (click, arrow keys) with no value change,
@@ -294,6 +297,7 @@ const ConversationDetailInput = ({ placeholder, onSendMessage, onInputChange, mo
294
297
  setCaretIndex((_a = event.currentTarget.selectionStart) !== null && _a !== void 0 ? _a : 0);
295
298
  };
296
299
  const resetComposer = () => {
300
+ stopTyping();
297
301
  setValue("");
298
302
  setListUploadFiles([]);
299
303
  setPendingVideoUids([]);
@@ -349,6 +353,7 @@ const ConversationDetailInput = ({ placeholder, onSendMessage, onInputChange, mo
349
353
  };
350
354
  const handleBlur = () => {
351
355
  setIsFocused(false);
356
+ stopTyping();
352
357
  };
353
358
  const handleToggleMoreOption = () => {
354
359
  var _a;
@@ -388,6 +393,7 @@ const ConversationDetailInput = ({ placeholder, onSendMessage, onInputChange, mo
388
393
  if (conversationId && userID) {
389
394
  setDraft(userID, conversationId, nextValue);
390
395
  }
396
+ reportTyping(nextValue);
391
397
  onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(nextValue);
392
398
  const nextCaret = mentionTrigger.triggerStart + insertedText.length + 1;
393
399
  // Update caretIndex synchronously (not deferred to the RAF below) so
@@ -0,0 +1,10 @@
1
+ export interface TypingIndicatorBarProps {
2
+ conversationId?: string;
3
+ }
4
+ /**
5
+ * Overlays the bottom edge of the message list rather than taking layout
6
+ * space, so showing/hiding it never shifts the viewer's scroll position.
7
+ */
8
+ declare const TypingIndicatorBar: ({ conversationId }: TypingIndicatorBarProps) => import("react/jsx-runtime").JSX.Element | null;
9
+ export default TypingIndicatorBar;
10
+ //# sourceMappingURL=TypingIndicatorBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypingIndicatorBar.d.ts","sourceRoot":"","sources":["../../../src/components/conversation-detail/TypingIndicatorBar.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,uBAAuB;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAqBD;;;GAGG;AACH,QAAA,MAAM,kBAAkB,GAAI,oBAAoB,uBAAuB,mDAkCtE,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,24 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { Fragment } from "react";
4
+ import { useTranslation } from "react-i18next";
5
+ import { useTypingState } from "../../hooks/message/useTypingStatus";
6
+ const TYPING_DOT_DELAYS_MS = [0, 150, 300];
7
+ // Sampled from the design: name + text share one gray, dots are lighter.
8
+ const TEXT_COLOR = "text-[#747B7E]";
9
+ const TypingDots = () => (_jsx("span", { "aria-hidden": "true", className: "ml-1 inline-flex items-end gap-[2px] pb-[4px]", children: TYPING_DOT_DELAYS_MS.map((delay) => (_jsx("span", { className: "h-[3px] w-[3px] animate-bounce rounded-full bg-[#8D8E90]", style: { animationDelay: `${delay}ms` } }, delay))) }));
10
+ /**
11
+ * Overlays the bottom edge of the message list rather than taking layout
12
+ * space, so showing/hiding it never shifts the viewer's scroll position.
13
+ */
14
+ const TypingIndicatorBar = ({ conversationId }) => {
15
+ const { t } = useTranslation("conversation-inbox");
16
+ const { names, count } = useTypingState(conversationId);
17
+ if (count === 0)
18
+ return null;
19
+ // Names are rendered as JSX (not interpolated markup) so user-supplied
20
+ // nicknames can never be parsed as formatting tags.
21
+ const content = count > names.length ? (t("typing.many_label")) : (_jsxs(_Fragment, { children: [names.map((name, index) => (_jsxs(Fragment, { children: [index > 0 && ` ${t("typing.and")} `, _jsx("strong", { className: "font-semibold", children: name })] }, `${index}-${name}`))), " ", t("typing.suffix")] }));
22
+ return (_jsxs("div", { "data-testid": "conversation-typing-indicator", "data-cp-name": "TypingIndicatorBar", "aria-live": "polite", className: `pointer-events-none absolute inset-x-0 bottom-0 z-10 truncate bg-white/90 px-4 py-1 text-[13px] leading-[1.6] ${TEXT_COLOR}`, children: [content, _jsx(TypingDots, {})] }));
23
+ };
24
+ export default TypingIndicatorBar;
@@ -1 +1 @@
1
- {"version":3,"file":"AtTextMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/AtTextMessage.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAO3D,OAAO,KAAK,EAEV,aAAa,EAEd,MAAM,cAAc,CAAC;AAGtB,UAAU,sBAAsB;IAC9B,OAAO,EAAE,WAAW,CAAC;CACtB;AAOD,eAAO,MAAM,eAAe,GAC1B,MAAM,MAAM,EACZ,eAAe,MAAM,EAAE,KACtB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAsC5C,CAAC;AAKF,eAAO,MAAM,cAAc,GACzB,MAAM,MAAM,EACZ,SAAS,aAAa,EAAE,KACvB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAsB5C,CAAC;AAeF,QAAA,MAAM,iBAAiB,GAAI,OAAO,sBAAsB,mDA4GvD,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"AtTextMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/AtTextMessage.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAQ3D,OAAO,KAAK,EAEV,aAAa,EAEd,MAAM,cAAc,CAAC;AAGtB,UAAU,sBAAsB;IAC9B,OAAO,EAAE,WAAW,CAAC;CACtB;AAOD,eAAO,MAAM,eAAe,GAC1B,MAAM,MAAM,EACZ,eAAe,MAAM,EAAE,KACtB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAsC5C,CAAC;AAKF,eAAO,MAAM,cAAc,GACzB,MAAM,MAAM,EACZ,SAAS,aAAa,EAAE,KACvB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAsB5C,CAAC;AAeF,QAAA,MAAM,iBAAiB,GAAI,OAAO,sBAAsB,mDAgHvD,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -4,6 +4,7 @@ import { Fragment } from "react";
4
4
  import clsx from "clsx";
5
5
  import { htmlHasFormatting, sanitizeHtml, wrapLinksInHtml } from "../../../utils/common";
6
6
  import LinkText from "./LinkText";
7
+ import CollapsibleText from "./CollapsibleText";
7
8
  import { MESSAGE_TEXT_CLASS } from "./textStyle";
8
9
  import { useTranslation } from "react-i18next";
9
10
  import { AT_ALL_TAG } from "../../../hooks/message/useSendMessage";
@@ -112,7 +113,7 @@ const AtTextMessageItem = (props) => {
112
113
  const richHtmlContent = ((_d = (_c = extendMessageInfo === null || extendMessageInfo === void 0 ? void 0 : extendMessageInfo.messageInfo) === null || _c === void 0 ? void 0 : _c.data) === null || _d === void 0 ? void 0 : _d.content) || "";
113
114
  if (richHtmlContent && htmlHasFormatting(richHtmlContent)) {
114
115
  const sanitizedContent = sanitizeHtml(wrapLinksInHtml(richHtmlContent));
115
- return (_jsxs("div", { className: clsx("flex flex-col gap-2", hasUrlMetadata ? "max-w-[292px]" : ""), children: [_jsx("div", { className: clsx("min-w-0 whitespace-pre-wrap [overflow-wrap:anywhere]", MESSAGE_TEXT_CLASS), dangerouslySetInnerHTML: { __html: sanitizedContent } }), hasUrlMetadata && urlMetadata && (_jsx(LinkCard, { metadata: urlMetadata, url: metadataUrl }))] }));
116
+ return (_jsxs("div", { className: clsx("flex flex-col gap-2", hasUrlMetadata ? "max-w-[292px]" : ""), children: [_jsx(CollapsibleText, { children: _jsx("div", { className: clsx("min-w-0 whitespace-pre-wrap [overflow-wrap:anywhere]", MESSAGE_TEXT_CLASS), dangerouslySetInnerHTML: { __html: sanitizedContent } }) }), hasUrlMetadata && urlMetadata && (_jsx(LinkCard, { metadata: urlMetadata, url: metadataUrl }))] }));
116
117
  }
117
118
  const isAtAll = (_e = atTextElem.atUserList) === null || _e === void 0 ? void 0 : _e.some((userID) => userID === AT_ALL_TAG);
118
119
  const memberMentionLabels = (_g = (_f = atTextElem.atUsersInfo) === null || _f === void 0 ? void 0 : _f.map((info) => `@${info.groupNickname}`)) !== null && _g !== void 0 ? _g : [];
@@ -132,6 +133,6 @@ const AtTextMessageItem = (props) => {
132
133
  ];
133
134
  segments = splitByMentions(atTextElem.text, mentionLabels);
134
135
  }
135
- return (_jsxs("div", { className: clsx("flex flex-col gap-2", hasUrlMetadata ? "max-w-[292px]" : ""), children: [_jsx("p", { className: clsx("min-w-0 whitespace-pre-wrap [overflow-wrap:anywhere]", MESSAGE_TEXT_CLASS), children: segments.map((segment, index) => (_jsx(Fragment, { children: segment.isMention ? (_jsx("span", { className: "font-medium text-[var(--dc-color-primary)]", children: segment.text })) : (_jsx(LinkText, { text: segment.text })) }, index))) }), hasUrlMetadata && urlMetadata && (_jsx(LinkCard, { metadata: urlMetadata, url: metadataUrl }))] }));
136
+ return (_jsxs("div", { className: clsx("flex flex-col gap-2", hasUrlMetadata ? "max-w-[292px]" : ""), children: [_jsx(CollapsibleText, { children: _jsx("p", { className: clsx("min-w-0 whitespace-pre-wrap [overflow-wrap:anywhere]", MESSAGE_TEXT_CLASS), children: segments.map((segment, index) => (_jsx(Fragment, { children: segment.isMention ? (_jsx("span", { className: "font-medium text-[var(--dc-color-primary)]", children: segment.text })) : (_jsx(LinkText, { text: segment.text })) }, index))) }) }), hasUrlMetadata && urlMetadata && (_jsx(LinkCard, { metadata: urlMetadata, url: metadataUrl }))] }));
136
137
  };
137
138
  export default AtTextMessageItem;
@@ -0,0 +1,8 @@
1
+ import { type ReactNode } from "react";
2
+ export declare const COLLAPSED_MAX_LINES = 5;
3
+ interface CollapsibleTextProps {
4
+ children: ReactNode;
5
+ }
6
+ declare const CollapsibleText: ({ children }: CollapsibleTextProps) => import("react/jsx-runtime").JSX.Element;
7
+ export default CollapsibleText;
8
+ //# sourceMappingURL=CollapsibleText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollapsibleText.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/CollapsibleText.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,SAAS,EAIf,MAAM,OAAO,CAAC;AAMf,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAiCrC,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,SAAS,CAAC;CACrB;AAID,QAAA,MAAM,eAAe,GAAI,cAAc,oBAAoB,4CAwE1D,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -0,0 +1,85 @@
1
+ "use client";
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useLayoutEffect, useRef, useState, } from "react";
4
+ import clsx from "clsx";
5
+ import { useTranslation } from "react-i18next";
6
+ import useAuthStore from "../../../store/auth";
7
+ import { MESSAGE_LINE_HEIGHT_PX, MESSAGE_TEXT_CLASS } from "./textStyle";
8
+ export const COLLAPSED_MAX_LINES = 5;
9
+ const COLLAPSED_MAX_HEIGHT_PX = COLLAPSED_MAX_LINES * MESSAGE_LINE_HEIGHT_PX;
10
+ // Fades the end of the last visible line under "… Xem thêm" without touching layout,
11
+ // so it works on translucent bubbles and never feeds back into the overflow check.
12
+ const LAST_LINE_FADE = {
13
+ image: "linear-gradient(#000, #000), linear-gradient(to right, #000 calc(100% - 7em), transparent calc(100% - 5.5em))",
14
+ size: `100% calc(100% - ${MESSAGE_LINE_HEIGHT_PX}px), 100% ${MESSAGE_LINE_HEIGHT_PX}px`,
15
+ position: "top, bottom",
16
+ repeat: "no-repeat",
17
+ };
18
+ // Inline `clip` wins over the class; browsers without it drop it and keep `overflow-hidden`.
19
+ const COLLAPSED_STYLE = {
20
+ maxHeight: COLLAPSED_MAX_HEIGHT_PX,
21
+ overflow: "clip",
22
+ maskImage: LAST_LINE_FADE.image,
23
+ maskSize: LAST_LINE_FADE.size,
24
+ maskPosition: LAST_LINE_FADE.position,
25
+ maskRepeat: LAST_LINE_FADE.repeat,
26
+ WebkitMaskImage: LAST_LINE_FADE.image,
27
+ WebkitMaskSize: LAST_LINE_FADE.size,
28
+ WebkitMaskPosition: LAST_LINE_FADE.position,
29
+ WebkitMaskRepeat: LAST_LINE_FADE.repeat,
30
+ };
31
+ const findScrollParent = (node) => {
32
+ for (let el = node.parentElement; el; el = el.parentElement) {
33
+ if (/(auto|scroll)/.test(getComputedStyle(el).overflowY))
34
+ return el;
35
+ }
36
+ return null;
37
+ };
38
+ // Presentation-only clamp: expansion lives in local state, so it is per message
39
+ // and per surface (timeline vs Pin Management) and resets whenever the view unmounts.
40
+ const CollapsibleText = ({ children }) => {
41
+ const { t } = useTranslation();
42
+ const isCrm = useAuthStore((state) => state.isCrm);
43
+ const contentRef = useRef(null);
44
+ const topBeforeExpandRef = useRef(null);
45
+ const [expanded, setExpanded] = useState(false);
46
+ const [overflowing, setOverflowing] = useState(false);
47
+ const collapsed = !expanded && overflowing;
48
+ useLayoutEffect(() => {
49
+ const content = contentRef.current;
50
+ if (isCrm || expanded || !content)
51
+ return;
52
+ // Half-line slack: subpixel line boxes can push an exact 5-line block past 128px.
53
+ const measure = () => setOverflowing(content.getBoundingClientRect().height >
54
+ COLLAPSED_MAX_HEIGHT_PX + MESSAGE_LINE_HEIGHT_PX / 2);
55
+ measure();
56
+ if (typeof ResizeObserver === "undefined")
57
+ return;
58
+ const observer = new ResizeObserver(measure);
59
+ observer.observe(content);
60
+ return () => observer.disconnect();
61
+ }, [isCrm, expanded]);
62
+ // The timeline is bottom-anchored (flex-col-reverse), so growth would push the
63
+ // revealed text upward; restore the message top to keep the expansion in place.
64
+ useLayoutEffect(() => {
65
+ const content = contentRef.current;
66
+ const topBefore = topBeforeExpandRef.current;
67
+ if (!expanded || !content || topBefore === null)
68
+ return;
69
+ topBeforeExpandRef.current = null;
70
+ const scroller = findScrollParent(content);
71
+ if (scroller) {
72
+ scroller.scrollTop += content.getBoundingClientRect().top - topBefore;
73
+ }
74
+ }, [expanded]);
75
+ if (isCrm)
76
+ return _jsx(_Fragment, { children: children });
77
+ return (_jsxs("div", { className: clsx("relative", collapsed ? "min-w-[6.5em]" : "min-w-0"), children: [_jsx("div", { className: clsx(collapsed && "overflow-hidden"), style: collapsed ? COLLAPSED_STYLE : undefined, children: _jsx("div", { ref: contentRef, children: children }) }), collapsed && (_jsxs("button", { type: "button", "data-testid": "collapsible-text-see-more", onClick: (event) => {
78
+ var _a, _b;
79
+ event.stopPropagation();
80
+ topBeforeExpandRef.current =
81
+ (_b = (_a = contentRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().top) !== null && _b !== void 0 ? _b : null;
82
+ setExpanded(true);
83
+ }, className: clsx("pointer-events-auto absolute bottom-0 right-0 whitespace-nowrap rounded focus-visible:outline focus-visible:outline-2 focus-visible:outline-[var(--dc-color-link)]", MESSAGE_TEXT_CLASS), children: [_jsx("span", { "aria-hidden": true, children: "\u2026 " }), _jsx("span", { className: "text-[var(--dc-color-link)]", children: t("see_more") })] }))] }));
84
+ };
85
+ export default CollapsibleText;
@@ -1 +1 @@
1
- {"version":3,"file":"TextMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/TextMessage.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAO3D,UAAU,oBAAoB;IAC5B,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,QAAA,MAAM,eAAe,GAAI,OAAO,oBAAoB,mDAgDnD,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"TextMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/TextMessage.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAQ3D,UAAU,oBAAoB;IAC5B,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,QAAA,MAAM,eAAe,GAAI,OAAO,oBAAoB,mDAwDnD,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -4,6 +4,7 @@ import clsx from "clsx";
4
4
  import { htmlHasFormatting, sanitizeHtml, stripHtml } from "../../../utils/common";
5
5
  import { extractLinkUrls } from "../../../utils/link";
6
6
  import LinkText from "./LinkText";
7
+ import CollapsibleText from "./CollapsibleText";
7
8
  import { MESSAGE_TEXT_CLASS } from "./textStyle";
8
9
  const TextMessageItem = (props) => {
9
10
  var _a, _b, _c, _d;
@@ -19,7 +20,7 @@ const TextMessageItem = (props) => {
19
20
  const richHtmlContent = ((_b = (_a = extendMessageInfo === null || extendMessageInfo === void 0 ? void 0 : extendMessageInfo.messageInfo) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.content) || "";
20
21
  if (richHtmlContent && htmlHasFormatting(richHtmlContent)) {
21
22
  const sanitizedContent = sanitizeHtml(richHtmlContent);
22
- return (_jsx("div", { className: clsx("min-w-0 flex-1 whitespace-pre-line [overflow-wrap:anywhere]", MESSAGE_TEXT_CLASS), dangerouslySetInnerHTML: { __html: sanitizedContent } }));
23
+ return (_jsx(CollapsibleText, { children: _jsx("div", { className: clsx("min-w-0 flex-1 whitespace-pre-line [overflow-wrap:anywhere]", MESSAGE_TEXT_CLASS), dangerouslySetInnerHTML: { __html: sanitizedContent } }) }));
23
24
  }
24
25
  const text = ((_c = message === null || message === void 0 ? void 0 : message.textElem) === null || _c === void 0 ? void 0 : _c.content) ||
25
26
  ((_d = message === null || message === void 0 ? void 0 : message.quoteElem) === null || _d === void 0 ? void 0 : _d.text) ||
@@ -28,8 +29,8 @@ const TextMessageItem = (props) => {
28
29
  if (!text)
29
30
  return null;
30
31
  if (extractLinkUrls(text).length > 0) {
31
- return _jsx(LinkText, { text: text });
32
+ return (_jsx(CollapsibleText, { children: _jsx(LinkText, { text: text }) }));
32
33
  }
33
- return (_jsx("p", { className: clsx("min-w-0 whitespace-pre-wrap [overflow-wrap:anywhere]", MESSAGE_TEXT_CLASS), children: text }));
34
+ return (_jsx(CollapsibleText, { children: _jsx("p", { className: clsx("min-w-0 whitespace-pre-wrap [overflow-wrap:anywhere]", MESSAGE_TEXT_CLASS), children: text }) }));
34
35
  };
35
36
  export default TextMessageItem;
@@ -1 +1 @@
1
- {"version":3,"file":"UrlTextMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/UrlTextMessage.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAa3D,UAAU,uBAAuB;IAC/B,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,QAAA,MAAM,kBAAkB,GAAI,OAAO,uBAAuB,4CAuEzD,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"UrlTextMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/UrlTextMessage.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAc3D,UAAU,uBAAuB;IAC/B,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,QAAA,MAAM,kBAAkB,GAAI,OAAO,uBAAuB,4CAiFzD,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -4,6 +4,7 @@ import { wrapLinksInHtml, sanitizeHtml, htmlHasFormatting, stripHtml, } from "..
4
4
  import clsx from "clsx";
5
5
  import LinkText from "./LinkText";
6
6
  import LinkCard from "./LinkCard";
7
+ import CollapsibleText from "./CollapsibleText";
7
8
  import { MESSAGE_TEXT_CLASS } from "./textStyle";
8
9
  const UrlTextMessageItem = (props) => {
9
10
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
@@ -23,14 +24,14 @@ const UrlTextMessageItem = (props) => {
23
24
  (urlMetadata.title || urlMetadata.description || urlMetadata.image));
24
25
  if (richHtmlContent && htmlHasFormatting(richHtmlContent)) {
25
26
  const sanitizedContent = sanitizeHtml(wrapLinksInHtml(richHtmlContent));
26
- return (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("div", { className: clsx("break-normal whitespace-pre-line flex-1", MESSAGE_TEXT_CLASS), style: { overflowWrap: "anywhere" }, dangerouslySetInnerHTML: { __html: sanitizedContent } }), hasUrlMetadata && urlMetadata && (_jsx(LinkCard, { metadata: urlMetadata, url: metadataUrl }))] }));
27
+ return (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(CollapsibleText, { children: _jsx("div", { className: clsx("break-normal whitespace-pre-line flex-1", MESSAGE_TEXT_CLASS), style: { overflowWrap: "anywhere" }, dangerouslySetInnerHTML: { __html: sanitizedContent } }) }), hasUrlMetadata && urlMetadata && (_jsx(LinkCard, { metadata: urlMetadata, url: metadataUrl }))] }));
27
28
  }
28
29
  const text = (_k = (_j = (_h = (_f = (_e = message === null || message === void 0 ? void 0 : message.textElem) === null || _e === void 0 ? void 0 : _e.content) !== null && _f !== void 0 ? _f : (_g = message === null || message === void 0 ? void 0 : message.urlTextElem) === null || _g === void 0 ? void 0 : _g.content) !== null && _h !== void 0 ? _h : message === null || message === void 0 ? void 0 : message.content) !== null && _j !== void 0 ? _j : stripHtml(richHtmlContent)) !== null && _k !== void 0 ? _k : "";
29
30
  if (hasUrlMetadata && urlMetadata) {
30
- return (_jsxs("div", { className: "flex max-w-[292px] flex-col gap-2", children: [text && _jsx(LinkText, { text: text }), _jsx(LinkCard, { metadata: urlMetadata, url: metadataUrl })] }));
31
+ return (_jsxs("div", { className: "flex max-w-[292px] flex-col gap-2", children: [text && (_jsx(CollapsibleText, { children: _jsx(LinkText, { text: text }) })), _jsx(LinkCard, { metadata: urlMetadata, url: metadataUrl })] }));
31
32
  }
32
33
  if (text) {
33
- return _jsx(LinkText, { text: text });
34
+ return (_jsx(CollapsibleText, { children: _jsx(LinkText, { text: text }) }));
34
35
  }
35
36
  return (_jsx("span", { className: clsx("break-normal whitespace-pre-line flex-1", MESSAGE_TEXT_CLASS), style: { overflowWrap: "anywhere" }, children: ((_m = (_l = message === null || message === void 0 ? void 0 : message.urlTextElem) === null || _l === void 0 ? void 0 : _l.urls) === null || _m === void 0 ? void 0 : _m[0]) || "" }));
36
37
  };
@@ -1,2 +1,3 @@
1
1
  export declare const MESSAGE_TEXT_CLASS = "text-[16px] leading-[160%] tracking-[0.16px] text-gray-900 [&_code]:font-[inherit] [&_pre]:font-[inherit] [&_kbd]:font-[inherit] [&_samp]:font-[inherit]";
2
+ export declare const MESSAGE_LINE_HEIGHT_PX = 25.6;
2
3
  //# sourceMappingURL=textStyle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"textStyle.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/textStyle.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,6JAC6H,CAAC"}
1
+ {"version":3,"file":"textStyle.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/textStyle.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,6JAC6H,CAAC;AAG7J,eAAO,MAAM,sBAAsB,OAAO,CAAC"}
@@ -1 +1,3 @@
1
1
  export const MESSAGE_TEXT_CLASS = "text-[16px] leading-[160%] tracking-[0.16px] text-gray-900 [&_code]:font-[inherit] [&_pre]:font-[inherit] [&_kbd]:font-[inherit] [&_samp]:font-[inherit]";
2
+ // 16px × leading-[160%] — one visual line of MESSAGE_TEXT_CLASS.
3
+ export const MESSAGE_LINE_HEIGHT_PX = 25.6;
@@ -1 +1 @@
1
- {"version":3,"file":"ChatContext.d.ts","sourceRoot":"","sources":["../../src/context/ChatContext.tsx"],"names":[],"mappings":"AAEA,OAAO,sBAAsB,CAAC;AAG9B,OAAO,EACL,eAAe,EACf,iBAAiB,EAGlB,MAAM,cAAc,CAAC;AAUtB,eAAO,MAAM,WAAW,0CAStB,CAAC;AAEH,eAAO,MAAM,cAAc,uBAAgC,CAAC;AAc5D,eAAO,MAAM,YAAY,GAAI,sIAS1B,iBAAiB,4CAsJnB,CAAC"}
1
+ {"version":3,"file":"ChatContext.d.ts","sourceRoot":"","sources":["../../src/context/ChatContext.tsx"],"names":[],"mappings":"AAEA,OAAO,sBAAsB,CAAC;AAG9B,OAAO,EACL,eAAe,EACf,iBAAiB,EAGlB,MAAM,cAAc,CAAC;AAUtB,eAAO,MAAM,WAAW,0CAStB,CAAC;AAEH,eAAO,MAAM,cAAc,uBAAgC,CAAC;AAc5D,eAAO,MAAM,YAAY,GAAI,sIAS1B,iBAAiB,4CA2JnB,CAAC"}
@@ -141,5 +141,5 @@ export const ChatProvider = ({ children, config, renderCustomMessage, onNavigate
141
141
  useUrlState,
142
142
  allowPinMessageWithoutPermission,
143
143
  renderGroupAccessModal,
144
- }, children: _jsx(ConfigProvider, { getPopupContainer: () => { var _a; return (_a = rootRef.current) !== null && _a !== void 0 ? _a : document.body; }, children: _jsx(QueryClientProvider, { client: queryClient, children: _jsx("div", { ref: rootRef, style: themeStyle, className: "contents", children: _jsx(MainLayout, { children: children }) }) }) }) }));
144
+ }, children: _jsx(ConfigProvider, { getPopupContainer: () => { var _a; return (_a = rootRef.current) !== null && _a !== void 0 ? _a : document.body; }, children: _jsx(QueryClientProvider, { client: queryClient, children: _jsx("div", { ref: rootRef, style: themeStyle, className: "contents", "data-dchat-root": "", children: _jsx(MainLayout, { children: children }) }) }) }) }));
145
145
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useGlobalEvent.d.ts","sourceRoot":"","sources":["../../../src/hooks/global/useGlobalEvent.ts"],"names":[],"mappings":"AA0CA,eAAO,MAAM,cAAc,YA8iB1B,CAAC"}
1
+ {"version":3,"file":"useGlobalEvent.d.ts","sourceRoot":"","sources":["../../../src/hooks/global/useGlobalEvent.ts"],"names":[],"mappings":"AA+CA,eAAO,MAAM,cAAc,YA+jB1B,CAAC"}
@@ -6,6 +6,7 @@ import { BusinessNotificationType, ConnectStatus, CustomType, SyncStatus, } from
6
6
  import { pushNewMessage, updateOneMessage } from "../../hooks/message/useMessage";
7
7
  import { fetchPinnedMessages } from "../../hooks/message/usePinnedMessages";
8
8
  import { applyRevokedMessage } from "../../hooks/message/useRevokeMessage";
9
+ import { handleInputStatusChanged, removeTyperOnNewMessage, } from "../../hooks/message/useTypingStatus";
9
10
  import { useChatContext } from "../../context/ChatContext";
10
11
  import { useChatNavigate } from "../../hooks/conversation/useChatNavigate";
11
12
  import useConversationStore from "../../store/conversation";
@@ -152,7 +153,13 @@ export const useGlobalEvent = () => {
152
153
  };
153
154
  const newMessageHandler = ({ data }) => {
154
155
  var _a;
155
- (_a = data === null || data === void 0 ? void 0 : data.map) === null || _a === void 0 ? void 0 : _a.call(data, (message) => handleNewMessage(message));
156
+ (_a = data === null || data === void 0 ? void 0 : data.map) === null || _a === void 0 ? void 0 : _a.call(data, (message) => {
157
+ removeTyperOnNewMessage(message);
158
+ handleNewMessage(message);
159
+ });
160
+ };
161
+ const inputStatusChangedHandler = ({ data, }) => {
162
+ handleInputStatusChanged(data);
156
163
  };
157
164
  const userTokenHandler = () => {
158
165
  refetchChatToken(undefined, {
@@ -387,6 +394,7 @@ export const useGlobalEvent = () => {
387
394
  DChatSDK.on(CbEvents.OnRecvNewMessages, newMessageHandler);
388
395
  DChatSDK.on(CbEvents.OnNewRecvMessageRevoked, revokedMessageHandler);
389
396
  DChatSDK.on(CbEvents.OnRecvMessagePinned, messagePinnedHandler);
397
+ DChatSDK.on(CbEvents.OnConversationUserInputStatusChanged, inputStatusChangedHandler);
390
398
  // conversation
391
399
  DChatSDK.on(CbEvents.OnConversationChanged, conversationChangeHandler);
392
400
  DChatSDK.on(CbEvents.OnNewConversation, newConversationHandler);
@@ -421,6 +429,7 @@ export const useGlobalEvent = () => {
421
429
  DChatSDK.off(CbEvents.OnRecvNewMessages, newMessageHandler);
422
430
  DChatSDK.off(CbEvents.OnNewRecvMessageRevoked, revokedMessageHandler);
423
431
  DChatSDK.off(CbEvents.OnRecvMessagePinned, messagePinnedHandler);
432
+ DChatSDK.off(CbEvents.OnConversationUserInputStatusChanged, inputStatusChangedHandler);
424
433
  // conversation
425
434
  DChatSDK.off(CbEvents.OnConversationChanged, conversationChangeHandler);
426
435
  DChatSDK.off(CbEvents.OnNewConversation, newConversationHandler);
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Reports the viewer's own composer activity for `conversationId` so other
3
+ * participants see a typing indicator. `reportActivity` on every edit,
4
+ * `stopTyping` when the composer is cleared, blurred or the message is sent.
5
+ */
6
+ export declare const useReportTypingState: (conversationId: string) => {
7
+ reportActivity: (composerValue: string) => void;
8
+ stopTyping: () => void;
9
+ };
10
+ //# sourceMappingURL=useReportTypingState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useReportTypingState.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useReportTypingState.ts"],"names":[],"mappings":"AAiBA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,gBAAgB,MAAM;oCAoCvC,MAAM;;CA6BzB,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { useCallback, useEffect, useRef } from "react";
2
+ import { DChatSDK } from "../../constants/sdk";
3
+ // Keep-alive rate while typing; receivers drop a typer after 3s of silence.
4
+ const TYPING_REPORT_INTERVAL_MS = 2000;
5
+ // Business rule: no activity for 3s means the participant stopped typing.
6
+ const TYPING_IDLE_TIMEOUT_MS = 3000;
7
+ // Core forwards one "typing" per window and drops a "stop" once it lapses;
8
+ // assuming 2s is safe with the old 10s core too, it only adds a deduped resend.
9
+ const CORE_SEND_WINDOW_MS = 2000;
10
+ const changeInputState = (conversationId, focus) => {
11
+ var _a;
12
+ return ((_a = DChatSDK === null || DChatSDK === void 0 ? void 0 : DChatSDK.changeInputStates({ conversationID: conversationId, focus })) !== null && _a !== void 0 ? _a : Promise.resolve()).catch((error) => console.error("changeInputStates", error));
13
+ };
14
+ /**
15
+ * Reports the viewer's own composer activity for `conversationId` so other
16
+ * participants see a typing indicator. `reportActivity` on every edit,
17
+ * `stopTyping` when the composer is cleared, blurred or the message is sent.
18
+ */
19
+ export const useReportTypingState = (conversationId) => {
20
+ const isTypingRef = useRef(false);
21
+ // When core last actually forwarded "typing" (not deduped by it).
22
+ const coreSentAtRef = useRef(0);
23
+ const lastReportAtRef = useRef(0);
24
+ const idleTimerRef = useRef();
25
+ const conversationIdRef = useRef(conversationId);
26
+ const sendTyping = useCallback((targetId) => {
27
+ const now = Date.now();
28
+ if (now - coreSentAtRef.current >= CORE_SEND_WINDOW_MS) {
29
+ coreSentAtRef.current = now;
30
+ }
31
+ lastReportAtRef.current = now;
32
+ void changeInputState(targetId, true);
33
+ }, []);
34
+ const stopTyping = useCallback(() => {
35
+ clearTimeout(idleTimerRef.current);
36
+ if (!isTypingRef.current)
37
+ return;
38
+ isTypingRef.current = false;
39
+ lastReportAtRef.current = 0;
40
+ const targetId = conversationIdRef.current;
41
+ if (!targetId)
42
+ return;
43
+ const windowLapsed = Date.now() - coreSentAtRef.current >= CORE_SEND_WINDOW_MS;
44
+ coreSentAtRef.current = 0;
45
+ // Re-open core's window first so the stop is actually sent.
46
+ const reopen = windowLapsed
47
+ ? changeInputState(targetId, true)
48
+ : Promise.resolve();
49
+ void reopen.then(() => changeInputState(targetId, false));
50
+ }, []);
51
+ const reportActivity = useCallback((composerValue) => {
52
+ const targetId = conversationIdRef.current;
53
+ if (!targetId)
54
+ return;
55
+ if (!composerValue.trim()) {
56
+ stopTyping();
57
+ return;
58
+ }
59
+ if (!isTypingRef.current ||
60
+ Date.now() - lastReportAtRef.current >= TYPING_REPORT_INTERVAL_MS) {
61
+ isTypingRef.current = true;
62
+ sendTyping(targetId);
63
+ }
64
+ clearTimeout(idleTimerRef.current);
65
+ idleTimerRef.current = setTimeout(stopTyping, TYPING_IDLE_TIMEOUT_MS);
66
+ }, [sendTyping, stopTyping]);
67
+ // Switching threads or unmounting ends typing in the thread being left.
68
+ useEffect(() => {
69
+ conversationIdRef.current = conversationId;
70
+ return stopTyping;
71
+ }, [conversationId, stopTyping]);
72
+ return { reportActivity, stopTyping };
73
+ };
@@ -0,0 +1,11 @@
1
+ import { ConversationInputStatus, MessageItem } from "@droppii-org/wasm-client-sdk";
2
+ export declare const handleInputStatusChanged: (payload: ConversationInputStatus | string) => void;
3
+ /** A typer's own message landing ends their typing state right away. */
4
+ export declare const removeTyperOnNewMessage: (message: MessageItem) => void;
5
+ export interface TypingState {
6
+ /** Resolved names of the first typers, only filled when count <= 2. */
7
+ names: string[];
8
+ count: number;
9
+ }
10
+ export declare const useTypingState: (conversationId?: string) => TypingState;
11
+ //# sourceMappingURL=useTypingStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTypingStatus.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useTypingStatus.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,uBAAuB,EACvB,WAAW,EAEZ,MAAM,8BAA8B,CAAC;AAuEtC,eAAO,MAAM,wBAAwB,GACnC,SAAS,uBAAuB,GAAG,MAAM,SA0B1C,CAAC;AAUF,wEAAwE;AACxE,eAAO,MAAM,uBAAuB,GAAI,SAAS,WAAW,SAK3D,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,cAAc,GAAI,iBAAiB,MAAM,KAAG,WAkBxD,CAAC"}
@@ -0,0 +1,120 @@
1
+ import { useTranslation } from "react-i18next";
2
+ import { useShallow } from "zustand/react/shallow";
3
+ import { SessionType, } from "@droppii-org/wasm-client-sdk";
4
+ import { DChatSDK } from "../../constants/sdk";
5
+ import useAuthStore from "../../store/auth";
6
+ import useConversationStore from "../../store/conversation";
7
+ import useTypingStore from "../../store/typing";
8
+ import { getGroupIdFromConversationId } from "../../utils/conversation";
9
+ // Two names fit the "<A> và <B>" rule; from three on the text drops names.
10
+ const MAX_NAMED_TYPERS = 2;
11
+ const pendingNameLookups = new Map();
12
+ // Typers whose latest event was "start"; a stop during a name lookup wins.
13
+ const activeTypers = new Set();
14
+ // Names are per conversation: group nicknames and 1:1 aliases differ by thread.
15
+ const nameKey = (conversationId, userId) => `${conversationId}:${userId}`;
16
+ const pickNickname = (list) => { var _a, _b; return ((_b = (_a = list === null || list === void 0 ? void 0 : list[0]) === null || _a === void 0 ? void 0 : _a.nickname) === null || _b === void 0 ? void 0 : _b.trim()) || ""; };
17
+ const lookupTyperName = async (key, conversationId, userId) => {
18
+ var _a;
19
+ const conversation = useConversationStore
20
+ .getState()
21
+ .conversationList.find((item) => item.conversationID === conversationId);
22
+ const peerName = (_a = conversation === null || conversation === void 0 ? void 0 : conversation.showName) === null || _a === void 0 ? void 0 : _a.trim();
23
+ const { setName } = useTypingStore.getState();
24
+ if (conversation && !conversation.groupID && peerName) {
25
+ setName(key, peerName);
26
+ return;
27
+ }
28
+ try {
29
+ const groupId = (conversation === null || conversation === void 0 ? void 0 : conversation.groupID) || getGroupIdFromConversationId(conversationId);
30
+ let nickname = "";
31
+ if (groupId) {
32
+ const { data } = await DChatSDK.getSpecifiedGroupMembersInfo({
33
+ groupID: groupId,
34
+ userIDList: [userId],
35
+ });
36
+ nickname = pickNickname(data);
37
+ }
38
+ if (!nickname) {
39
+ const { data } = await DChatSDK.getUsersInfo([userId]);
40
+ nickname = pickNickname(data);
41
+ }
42
+ if (nickname)
43
+ setName(key, nickname);
44
+ }
45
+ catch (error) {
46
+ console.error("resolveTyperName", error);
47
+ }
48
+ };
49
+ /** Settles once the name is cached or the lookup gave up (never rejects). */
50
+ const resolveTyperName = (conversationId, userId) => {
51
+ const key = nameKey(conversationId, userId);
52
+ if (useTypingStore.getState().names[key])
53
+ return Promise.resolve();
54
+ let pending = pendingNameLookups.get(key);
55
+ if (!pending) {
56
+ pending = lookupTyperName(key, conversationId, userId).finally(() => pendingNameLookups.delete(key));
57
+ pendingNameLookups.set(key, pending);
58
+ }
59
+ return pending;
60
+ };
61
+ export const handleInputStatusChanged = (payload) => {
62
+ var _a;
63
+ let data;
64
+ try {
65
+ data = typeof payload === "string" ? JSON.parse(payload) : payload;
66
+ }
67
+ catch (error) {
68
+ console.error("handleInputStatusChanged", error);
69
+ return;
70
+ }
71
+ if (!(data === null || data === void 0 ? void 0 : data.conversationID) || !data.userID)
72
+ return;
73
+ if (data.userID === useAuthStore.getState().userID)
74
+ return;
75
+ const { conversationID, userID } = data;
76
+ const key = nameKey(conversationID, userID);
77
+ if ((_a = data.platformIDs) === null || _a === void 0 ? void 0 : _a.length) {
78
+ activeTypers.add(key);
79
+ // Shown only once named, so a placeholder name never flashes first.
80
+ void resolveTyperName(conversationID, userID).then(() => {
81
+ if (activeTypers.has(key)) {
82
+ useTypingStore.getState().addTyper(conversationID, userID);
83
+ }
84
+ });
85
+ }
86
+ else {
87
+ activeTypers.delete(key);
88
+ useTypingStore.getState().removeTyper(conversationID, userID);
89
+ }
90
+ };
91
+ // Mirrors OpenIM's conversationID scheme: si_<sorted user ids> / sg_<groupID>.
92
+ const getConversationIdFromMessage = (message) => {
93
+ if (message.sessionType === SessionType.Single) {
94
+ return `si_${[message.sendID, message.recvID].sort().join("_")}`;
95
+ }
96
+ return message.groupID ? `sg_${message.groupID}` : "";
97
+ };
98
+ /** A typer's own message landing ends their typing state right away. */
99
+ export const removeTyperOnNewMessage = (message) => {
100
+ const conversationId = getConversationIdFromMessage(message);
101
+ if (!conversationId || !message.sendID)
102
+ return;
103
+ activeTypers.delete(nameKey(conversationId, message.sendID));
104
+ useTypingStore.getState().removeTyper(conversationId, message.sendID);
105
+ };
106
+ export const useTypingState = (conversationId) => {
107
+ const { t } = useTranslation("conversation-inbox");
108
+ const count = useTypingStore((state) => { var _a, _b; return conversationId ? ((_b = (_a = state.typers[conversationId]) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) : 0; });
109
+ // Only the named typers' entries, so unrelated name lookups don't re-render.
110
+ const resolvedNames = useTypingStore(useShallow((state) => {
111
+ const typers = conversationId ? state.typers[conversationId] : undefined;
112
+ if (!typers || typers.length > MAX_NAMED_TYPERS)
113
+ return [];
114
+ return typers.map((userId) => state.names[nameKey(conversationId, userId)]);
115
+ }));
116
+ return {
117
+ names: resolvedNames.map((name) => name || t("thread_card.fallback_name")),
118
+ count,
119
+ };
120
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../../src/hooks/user/useAuth.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY;;CA4BxB,CAAC"}
1
+ {"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../../src/hooks/user/useAuth.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,YAAY;;CA6BxB,CAAC"}
@@ -3,6 +3,7 @@ import { DChatSDK } from "../../constants/sdk";
3
3
  import useAuthStore from "../../store/auth";
4
4
  import useConversationStore from "../../store/conversation";
5
5
  import useMessageDraftStore from "../../store/messageDraft";
6
+ import useTypingStore from "../../store/typing";
6
7
  export const useDChatAuth = () => {
7
8
  const initAuthStore = useAuthStore((state) => state.initAuthStore);
8
9
  const resetConversationStore = useConversationStore((state) => state.resetConversationStore);
@@ -12,6 +13,7 @@ export const useDChatAuth = () => {
12
13
  const applicationType = useAuthStore.getState().applicationType;
13
14
  resetConversationStore();
14
15
  clearAllDrafts();
16
+ useTypingStore.getState().clearTypers();
15
17
  initAuthStore({
16
18
  chatToken: "",
17
19
  accessToken: "",
@@ -144,5 +144,10 @@
144
144
  "public_group_fallback": "Nhóm công khai",
145
145
  "group_join": "Tham gia",
146
146
  "group_access": "Truy cập"
147
+ },
148
+ "typing": {
149
+ "many_label": "Nhiều người đang nhập",
150
+ "and": "và",
151
+ "suffix": "đang nhập"
147
152
  }
148
153
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/screens/conversation-detail/index.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAWrF,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,6CAA6C,CAAC;AAGrD,MAAM,WAAW,4BACf,SAAQ,4BAA4B,EAClC,4BAA4B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,kGAAkG;IAClG,sBAAsB,CAAC,EAAE,MAAM,IAAI,CAAC;CACrC;AAED,QAAA,MAAM,uBAAuB,GAAI,8IAc9B,4BAA4B,mDAqO9B,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/screens/conversation-detail/index.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAWrF,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,6CAA6C,CAAC;AAGrD,MAAM,WAAW,4BACf,SAAQ,4BAA4B,EAClC,4BAA4B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,kGAAkG;IAClG,sBAAsB,CAAC,EAAE,MAAM,IAAI,CAAC;CACrC;AAED,QAAA,MAAM,uBAAuB,GAAI,8IAc9B,4BAA4B,mDAsO9B,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
@@ -24,6 +24,7 @@ import ThreadProfilePanel from "../../components/conversation-detail/ThreadProfi
24
24
  import MediaResourcePanel from "../../components/media-resources/MediaResourcePanel";
25
25
  import { MediaResourceTabKey } from "../../components/media-resources/constants";
26
26
  import { ConversationMessageList, ConversationDetailHeader, ConversationDetailInput, PinnedMessageBar, } from "../../components/conversation-detail";
27
+ import TypingIndicatorBar from "../../components/conversation-detail/TypingIndicatorBar";
27
28
  import { BotButtonMessage, BotInactiveNotice, BotMenuSheet, BotStartButton, BotSuggest, CsSessionConfirmModal, } from "../../components/conversation-detail/bot";
28
29
  import { useBotFlow } from "../../hooks/conversation/useBotFlow";
29
30
  import { BOT_TYPE } from "../../constants/botFlow";
@@ -113,6 +114,6 @@ const DChatConversationDetail = (_a) => {
113
114
  !botFlow.flowIsEnd &&
114
115
  botFlow.shouldShowButtons &&
115
116
  botFlow.currentButtonsBlock ? (_jsx(BotButtonMessage, { buttons: botFlow.currentButtonsBlock.data.buttons, disabled: botFlow.isProcessing, onSelect: botFlow.selectButton, onRestart: botFlow.restart })) : null;
116
- return (_jsxs("div", { "data-testid": "conversation-detail-root", className: clsx("relative flex h-full w-full flex-col overflow-hidden bg-white", className), children: [_jsx(ConversationDetailHeader, { conversation: conversation, onBack: handleBack, onProfileClick: openProfile }), _jsx(PinnedMessageBar, {}), _jsx("div", { className: "flex min-h-0 flex-1 flex-col", children: children !== null && children !== void 0 ? children : (_jsx(ConversationMessageList, { bottomSlot: botButtonsSlot, onCopyMessageLink: onCopyMessageLink, onSearchMessageRevoked: onSearchMessageRevoked })) }), footer, isBotThread && (_jsxs(_Fragment, { children: [_jsx(BotMenuSheet, { open: isMenuOpen, items: botFlow.menuItems, disabled: botFlow.isProcessing, onClose: closeMenu, onSelect: botFlow.selectMenuOption }), _jsx(CsSessionConfirmModal, { open: botFlow.isCsConfirmOpen, loading: botFlow.isProcessing, onCancel: botFlow.cancelMenuOption, onConfirm: botFlow.confirmEndCsSession })] })), _jsx(ThreadProfilePanel, { open: isProfileOpen, conversation: conversation, onClose: closeProfile, onSelectResource: setResourceTab }), _jsx(MediaResourcePanel, { open: resourceTab !== null, initialTab: resourceTab !== null && resourceTab !== void 0 ? resourceTab : MediaResourceTabKey.Image, onClose: () => setResourceTab(null) })] }));
117
+ return (_jsxs("div", { "data-testid": "conversation-detail-root", className: clsx("relative flex h-full w-full flex-col overflow-hidden bg-white", className), children: [_jsx(ConversationDetailHeader, { conversation: conversation, onBack: handleBack, onProfileClick: openProfile }), _jsx(PinnedMessageBar, {}), _jsxs("div", { className: "relative flex min-h-0 flex-1 flex-col", children: [children !== null && children !== void 0 ? children : (_jsx(ConversationMessageList, { bottomSlot: botButtonsSlot, onCopyMessageLink: onCopyMessageLink, onSearchMessageRevoked: onSearchMessageRevoked })), _jsx(TypingIndicatorBar, { conversationId: conversation.conversationID })] }), footer, isBotThread && (_jsxs(_Fragment, { children: [_jsx(BotMenuSheet, { open: isMenuOpen, items: botFlow.menuItems, disabled: botFlow.isProcessing, onClose: closeMenu, onSelect: botFlow.selectMenuOption }), _jsx(CsSessionConfirmModal, { open: botFlow.isCsConfirmOpen, loading: botFlow.isProcessing, onCancel: botFlow.cancelMenuOption, onConfirm: botFlow.confirmEndCsSession })] })), _jsx(ThreadProfilePanel, { open: isProfileOpen, conversation: conversation, onClose: closeProfile, onSelectResource: setResourceTab }), _jsx(MediaResourcePanel, { open: resourceTab !== null, initialTab: resourceTab !== null && resourceTab !== void 0 ? resourceTab : MediaResourceTabKey.Image, onClose: () => setResourceTab(null) })] }));
117
118
  };
118
119
  export default DChatConversationDetail;
@@ -0,0 +1,13 @@
1
+ interface TypingStore {
2
+ /** conversationID -> userIDs currently typing, in the order they started. */
3
+ typers: Record<string, string[]>;
4
+ /** "<conversationID>:<userID>" -> display name, resolved once and reused. */
5
+ names: Record<string, string>;
6
+ addTyper: (conversationId: string, userId: string) => void;
7
+ removeTyper: (conversationId: string, userId: string) => void;
8
+ setName: (key: string, name: string) => void;
9
+ clearTypers: () => void;
10
+ }
11
+ declare const useTypingStore: import("zustand").UseBoundStore<import("zustand").StoreApi<TypingStore>>;
12
+ export default useTypingStore;
13
+ //# sourceMappingURL=typing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typing.d.ts","sourceRoot":"","sources":["../../src/store/typing.ts"],"names":[],"mappings":"AAeA,UAAU,WAAW;IACnB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjC,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,QAAQ,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,WAAW,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,QAAA,MAAM,cAAc,0EA4CjB,CAAC;AAEJ,eAAe,cAAc,CAAC"}
@@ -0,0 +1,63 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import { create } from "zustand";
13
+ // Safety net for a typer whose "stop" never arrives (tab closed, network lost);
14
+ // core's own expiry can lag up to ~25s, so this only catches what it misses.
15
+ const TYPER_EXPIRY_MS = 30000;
16
+ const expiryTimers = new Map();
17
+ const timerKey = (conversationId, userId) => `${conversationId}:${userId}`;
18
+ const clearExpiry = (key) => {
19
+ clearTimeout(expiryTimers.get(key));
20
+ expiryTimers.delete(key);
21
+ };
22
+ const useTypingStore = create((set, get) => ({
23
+ typers: {},
24
+ names: {},
25
+ addTyper: (conversationId, userId) => {
26
+ // Every typing event restarts the expiry, even for a known typer.
27
+ const key = timerKey(conversationId, userId);
28
+ clearExpiry(key);
29
+ expiryTimers.set(key, setTimeout(() => get().removeTyper(conversationId, userId), TYPER_EXPIRY_MS));
30
+ set((state) => {
31
+ var _a;
32
+ const current = (_a = state.typers[conversationId]) !== null && _a !== void 0 ? _a : [];
33
+ if (current.includes(userId))
34
+ return state;
35
+ return {
36
+ typers: Object.assign(Object.assign({}, state.typers), { [conversationId]: [...current, userId] }),
37
+ };
38
+ });
39
+ },
40
+ removeTyper: (conversationId, userId) => {
41
+ clearExpiry(timerKey(conversationId, userId));
42
+ set((state) => {
43
+ const current = state.typers[conversationId];
44
+ if (!(current === null || current === void 0 ? void 0 : current.includes(userId)))
45
+ return state;
46
+ const _a = state.typers, _b = conversationId, _ = _a[_b], rest = __rest(_a, [typeof _b === "symbol" ? _b : _b + ""]);
47
+ const remaining = current.filter((id) => id !== userId);
48
+ return {
49
+ typers: remaining.length
50
+ ? Object.assign(Object.assign({}, rest), { [conversationId]: remaining }) : rest,
51
+ };
52
+ });
53
+ },
54
+ setName: (key, name) => set((state) => state.names[key] === name
55
+ ? state
56
+ : { names: Object.assign(Object.assign({}, state.names), { [key]: name }) }),
57
+ clearTypers: () => {
58
+ expiryTimers.forEach(clearTimeout);
59
+ expiryTimers.clear();
60
+ set({ typers: {} });
61
+ },
62
+ }));
63
+ export default useTypingStore;
@@ -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(40,138,230,.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(40,138,230,.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 #a8adaf}: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:#747b7e}input::placeholder,textarea::placeholder{opacity:1;color:#747b7e}[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}.\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.\!visible{visibility:visible!important}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{top:0;bottom:0}.-bottom-1{bottom:-.25rem}.-bottom-2{bottom:-.5rem}.-bottom-px{bottom:-1px}.-right-1{right:-.25rem}.-right-px{right:-1px}.-top-1{top:-.25rem}.-top-2\.5{top:-.625rem}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.bottom-full{bottom:100%}.left-0{left:0}.left-1{left:.25rem}.left-1\/2{left:50%}.left-2{left:.5rem}.left-3{left:.75rem}.right-0{right:0}.right-1{right:.25rem}.right-2{right:.5rem}.top-0{top:0}.top-1\/2{top:50%}.top-2{top:.5rem}.top-3{top:.75rem}.isolate{isolation:isolate}.\!z-\[9999\]{z-index:9999!important}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[1\]{z-index:1}.\!m-0{margin:0!important}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.\!mr-4{margin-right:1rem!important}.-mr-1\.5{margin-right:-.375rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.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}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-square{aspect-ratio:1/1}.aspect-video{aspect-ratio:16/9}.\!h-10{height:2.5rem!important}.\!h-full{height:100%!important}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-\[100px\]{height:100px}.h-\[120px\]{height:120px}.h-\[144px\]{height:144px}.h-\[17px\]{height:17px}.h-\[19px\]{height:19px}.h-\[22px\]{height:22px}.h-\[36px\]{height:36px}.h-\[3px\]{height:3px}.h-\[400px\]{height:400px}.h-\[42px\]{height:42px}.h-\[51px\]{height:51px}.h-\[59px\]{height:59px}.h-\[600px\]{height:600px}.h-\[76px\]{height:76px}.h-\[87px\]{height:87px}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-48{max-height:12rem}.max-h-64{max-height:16rem}.max-h-72{max-height:18rem}.max-h-80{max-height:20rem}.max-h-\[140px\]{max-height:140px}.max-h-\[220px\]{max-height:220px}.max-h-\[70vh\]{max-height:70vh}.max-h-\[80vh\]{max-height:80vh}.min-h-0{min-height:0}.min-h-10{min-height:2.5rem}.min-h-40{min-height:10rem}.min-h-6{min-height:1.5rem}.min-h-\[200px\]{min-height:200px}.min-h-\[25\.6px\]{min-height:25.6px}.min-h-\[32px\]{min-height:32px}.min-h-\[64px\]{min-height:64px}.\!w-full{width:100%!important}.\!w-max{width:-moz-max-content!important;width:max-content!important}.w-1{width:.25rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-20{width:5rem}.w-24{width:6rem}.w-4{width:1rem}.w-40{width:10rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-96{width:24rem}.w-\[100px\]{width:100px}.w-\[101px\]{width:101px}.w-\[120px\]{width:120px}.w-\[170px\]{width:170px}.w-\[260px\]{width:260px}.w-\[26px\]{width:26px}.w-\[292px\]{width:292px}.w-\[30px\]{width:30px}.w-\[320px\]{width:320px}.w-\[330px\]{width:330px}.w-\[36px\]{width:36px}.w-\[3px\]{width:3px}.w-\[400px\]{width:400px}.w-\[42px\]{width:42px}.w-\[51px\]{width:51px}.w-\[600px\]{width:600px}.w-\[76px\]{width:76px}.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-5{min-width:1.25rem}.min-w-6{min-width:1.5rem}.min-w-8{min-width:2rem}.min-w-\[100px\]{min-width:100px}.min-w-\[26px\]{min-width:26px}.max-w-\[120px\]{max-width:120px}.max-w-\[200px\]{max-width:200px}.max-w-\[280px\]{max-width:280px}.max-w-\[292px\]{max-width:292px}.max-w-full{max-width:100%}.max-w-none{max-width:none}.flex-1{flex:1 1 0%}.flex-\[1_0_0\]{flex:1 0 0}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow,.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%}.transform{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))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-pan-y{--tw-pan-y:pan-y;touch-action:var(--tw-pan-x) var(--tw-pan-y) var(--tw-pinch-zoom)}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.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}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid-cols-\[repeat\(1\2c 100px\)\]{grid-template-columns:repeat(1,100px)}.grid-cols-\[repeat\(2\2c 100px\)\]{grid-template-columns:repeat(2,100px)}.grid-cols-\[repeat\(3\2c 100px\)\]{grid-template-columns:repeat(3,100px)}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.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-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-\[7px\]{gap:7px}.gap-px{gap:1px}.gap-y-5{row-gap:1.25rem}.self-end{align-self:flex-end}.self-center{align-self:center}.self-stretch{align-self:stretch}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{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}.break-all{word-break:break-all}.\!rounded-lg{border-radius:.5rem!important}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[12px\]{border-radius:12px}.rounded-\[20px\]{border-radius:20px}.rounded-\[32px\]{border-radius:32px}.rounded-\[4px\]{border-radius:4px}.rounded-\[8px\]{border-radius:8px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-bl-none{border-bottom-left-radius:0}.rounded-br-none{border-bottom-right-radius:0}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.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!important}.border-none{border-style:none}.\!border-\[var\(--dc-color-primary\)\]{border-color:var(--dc-color-primary)!important}.\!border-danger-400{--tw-border-opacity:1!important;border-color:rgb(240 68 56/var(--tw-border-opacity,1))!important}.\!border-gray-25{--tw-border-opacity:1!important;border-color:rgb(239 239 239/var(--tw-border-opacity,1))!important}.border-\[var\(--dc-color-primary\)\]{border-color:var(--dc-color-primary)}.border-\[var\(--dc-color-primary-focus\)\]{border-color:var(--dc-color-primary-focus)}.border-\[var\(--dc-color-primary-hover\)\]{border-color:var(--dc-color-primary-hover)}.border-blue-500{--tw-border-opacity:1;border-color:rgb(40 138 230/var(--tw-border-opacity,1))}.border-gray-100{--tw-border-opacity:1;border-color:rgb(194 197 199/var(--tw-border-opacity,1))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(168 173 175/var(--tw-border-opacity,1))}.border-gray-200\/20{border-color:hsla(197,4%,67%,.2)}.border-gray-25{--tw-border-opacity:1;border-color:rgb(239 239 239/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(142 148 150/var(--tw-border-opacity,1))}.border-gray-50{--tw-border-opacity:1;border-color:rgb(221 222 223/var(--tw-border-opacity,1))}.border-gray-900\/10{border-color:rgba(57,62,64,.1)}.border-indigo-500{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity,1))}.border-orange-300{--tw-border-opacity:1;border-color:rgb(253 186 116/var(--tw-border-opacity,1))}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.border-t-transparent{border-top-color:transparent}.\!bg-\[var\(--dc-color-primary\)\]{background-color:var(--dc-color-primary)!important}.\!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(161 208 255/var(--tw-bg-opacity,1))!important}.\!bg-blue-500{--tw-bg-opacity:1!important;background-color:rgb(40 138 230/var(--tw-bg-opacity,1))!important}.\!bg-danger-400{--tw-bg-opacity:1!important;background-color:rgb(240 68 56/var(--tw-bg-opacity,1))!important}.\!bg-gray-100{--tw-bg-opacity:1!important;background-color:rgb(194 197 199/var(--tw-bg-opacity,1))!important}.\!bg-gray-25{--tw-bg-opacity:1!important;background-color:rgb(239 239 239/var(--tw-bg-opacity,1))!important}.\!bg-gray-500{--tw-bg-opacity:1!important;background-color:rgb(104 111 114/var(--tw-bg-opacity,1))!important}.\!bg-green-100{--tw-bg-opacity:1!important;background-color:rgb(246 255 237/var(--tw-bg-opacity,1))!important}.\!bg-green-500{--tw-bg-opacity:1!important;background-color:rgb(38 191 135/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(249 240 255/var(--tw-bg-opacity,1))!important}.\!bg-purple-500{--tw-bg-opacity:1!important;background-color:rgb(146 84 222/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-transparent{background-color:transparent!important}.bg-\[\#f5f5f5\]{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity,1))}.bg-\[\#f5f5f5\]\/20{background-color:hsla(0,0%,96%,.2)}.bg-\[var\(--dc-color-bot-badge\)\]{background-color:var(--dc-color-bot-badge)}.bg-\[var\(--dc-color-mall-badge\)\]{background-color:var(--dc-color-mall-badge)}.bg-\[var\(--dc-color-primary\)\]{background-color:var(--dc-color-primary)}.bg-\[var\(--dc-color-primary-hover\)\]{background-color:var(--dc-color-primary-hover)}.bg-\[var\(--dc-color-primary-light\)\]{background-color:var(--dc-color-primary-light)}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.bg-black\/10{background-color:rgba(0,0,0,.1)}.bg-black\/30{background-color:rgba(0,0,0,.3)}.bg-black\/5{background-color:rgba(0,0,0,.05)}.bg-black\/50{background-color:rgba(0,0,0,.5)}.bg-black\/60{background-color:rgba(0,0,0,.6)}.bg-black\/70{background-color:rgba(0,0,0,.7)}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(161 208 255/var(--tw-bg-opacity,1))}.bg-blue-25{--tw-bg-opacity:1;background-color:rgb(234 245 255/var(--tw-bg-opacity,1))}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(198 226 255/var(--tw-bg-opacity,1))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(40 138 230/var(--tw-bg-opacity,1))}.bg-chat-bubble-mine\/10{background-color:rgba(0,81,255,.1)}.bg-chat-bubble-neutral\/10{background-color:rgba(131,137,157,.1)}.bg-chat-bubble-neutral\/\[0\.05\]{background-color:rgba(131,137,157,.05)}.bg-chat-internal\/10{background-color:rgba(255,149,0,.1)}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(194 197 199/var(--tw-bg-opacity,1))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(168 173 175/var(--tw-bg-opacity,1))}.bg-gray-200\/10{background-color:hsla(197,4%,67%,.1)}.bg-gray-25{--tw-bg-opacity:1;background-color:rgb(239 239 239/var(--tw-bg-opacity,1))}.bg-gray-400{--tw-bg-opacity:1;background-color:rgb(116 123 126/var(--tw-bg-opacity,1))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(104 111 114/var(--tw-bg-opacity,1))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(57 62 64/var(--tw-bg-opacity,1))}.bg-gray-cool-200{--tw-bg-opacity:1;background-color:rgb(169 178 208/var(--tw-bg-opacity,1))}.bg-gray-cool-25{--tw-bg-opacity:1;background-color:rgb(241 243 248/var(--tw-bg-opacity,1))}.bg-neutral-100{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity,1))}.bg-neutral-200{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity,1))}.bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity,1))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/70{background-color:hsla(0,0%,100%,.7)}.bg-gradient-danger-light{background-image:linear-gradient(93deg,#ff7d74,#f04438)}.object-contain{-o-object-fit:contain;object-fit:contain}.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}.p-6{padding:1.5rem}.\!px-0{padding-left:0!important;padding-right:0!important}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.px-\[3px\]{padding-left:3px;padding-right:3px}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-\[42px\]{padding-top:42px;padding-bottom:42px}.py-\[4px\]{padding-top:4px;padding-bottom:4px}.pb-0\.5{padding-bottom:.125rem}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-60{padding-bottom:15rem}.pl-0{padding-left:0}.pl-1{padding-left:.25rem}.pl-12{padding-left:3rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pr-1{padding-right:.25rem}.pr-12{padding-right:3rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-5{padding-right:1.25rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.\!align-\[-4px\]{vertical-align:-4px!important}.\!text-\[14px\]{font-size:14px!important}.\!text-\[16px\]{font-size:16px!important}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[16px\]{font-size:16px}.text-\[18px\]{font-size:18px}.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-medium{font-weight:500!important}.font-\[510\]{font-weight:510}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.\!leading-\[1\.6\]{line-height:1.6!important}.leading-3{line-height:.75rem}.leading-4{line-height:1rem}.leading-\[1\.4\]{line-height:1.4}.leading-\[1\.6\]{line-height:1.6}.leading-\[160\%\]{line-height:160%}.leading-none{line-height:1}.\!tracking-\[0\.14px\]{letter-spacing:.14px!important}.tracking-\[-0\.14px\]{letter-spacing:-.14px}.tracking-\[0\.12px\]{letter-spacing:.12px}.tracking-\[0\.14px\]{letter-spacing:.14px}.tracking-\[0\.16px\]{letter-spacing:.16px}.tracking-\[0\.1px\]{letter-spacing:.1px}.tracking-wide{letter-spacing:.025em}.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(40 138 230/var(--tw-text-opacity,1))!important}.\!text-gray-500{--tw-text-opacity:1!important;color:rgb(104 111 114/var(--tw-text-opacity,1))!important}.\!text-gray-900{--tw-text-opacity:1!important;color:rgb(57 62 64/var(--tw-text-opacity,1))!important}.\!text-green-500{--tw-text-opacity:1!important;color:rgb(38 191 135/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(146 84 222/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-white{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity,1))!important}.text-\[var\(--dc-color-header-icon\)\]{color:var(--dc-color-header-icon)}.text-\[var\(--dc-color-link\)\]{color:var(--dc-color-link)}.text-\[var\(--dc-color-nav-icon\)\]{color:var(--dc-color-nav-icon)}.text-\[var\(--dc-color-primary\)\]{color:var(--dc-color-primary)}.text-\[var\(--dc-color-primary-hover\)\]{color:var(--dc-color-primary-hover)}.text-\[var\(--dc-color-primary-light\)\]{color:var(--dc-color-primary-light)}.text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity,1))}.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(40 138 230/var(--tw-text-opacity,1))}.text-blue-600{--tw-text-opacity:1;color:rgb(27 122 204/var(--tw-text-opacity,1))}.text-chat-bubble-mine{--tw-text-opacity:1;color:rgb(0 81 255/var(--tw-text-opacity,1))}.text-chat-bubble-neutral{--tw-text-opacity:1;color:rgb(131 137 157/var(--tw-text-opacity,1))}.text-chat-internal{--tw-text-opacity:1;color:rgb(255 149 0/var(--tw-text-opacity,1))}.text-danger-400{--tw-text-opacity:1;color:rgb(240 68 56/var(--tw-text-opacity,1))}.text-gray-300{--tw-text-opacity:1;color:rgb(142 148 150/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(116 123 126/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(104 111 114/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(92 99 102/var(--tw-text-opacity,1))}.text-gray-700{--tw-text-opacity:1;color:rgb(80 87 89/var(--tw-text-opacity,1))}.text-gray-800{--tw-text-opacity:1;color:rgb(68 74 77/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(57 62 64/var(--tw-text-opacity,1))}.text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity,1))}.text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/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}.underline-offset-2{text-underline-offset:2px}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.\!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-\[0px_0px_2px_var\(--dc-color-primary-focus\)\]{--tw-shadow:0px 0px 2px var(--dc-color-primary-focus);--tw-shadow-colored:0px 0px 2px var(--tw-shadow-color)}.shadow-\[0px_0px_2px_var\(--dc-color-primary-focus\)\],.shadow-badge-inset{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-badge-inset{--tw-shadow:inset 2px 6px 8px 0 rgba(0,0,0,.12);--tw-shadow-colored:inset 2px 6px 8px 0 var(--tw-shadow-color)}.shadow-inset-gray-divider{--tw-shadow:inset 0px -1px 0px 0px rgba(61,63,64,.1);--tw-shadow-colored:inset 0px -1px 0px 0px var(--tw-shadow-color)}.shadow-inset-gray-divider,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.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-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)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.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{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.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-none{transition-property:none}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150,.transition-transform{transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[font-feature-settings\:\'liga\'_off\2c \'clig\'_off\]{font-feature-settings:"liga" off,"clig" off}.\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}button.ant-btn-color-primary:not(.ant-btn-dangerous):not(:disabled){color:#fff;background-color:var(--dc-color-primary,#1b3fe4)}button.ant-btn-color-primary:not(.ant-btn-dangerous):not(:disabled):hover{background-color:var(--dc-color-primary-hover,#0f33d6)}.ant-switch.ant-switch-checked:not(.ant-switch-disabled){background:var(--dc-color-primary,#1b3fe4)}.ant-switch.ant-switch-checked:not(.ant-switch-disabled):hover{background:var(--dc-color-primary-hover,#0f33d6)}.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%}}.conversation-message-input-scrollbar{-moz-appearance:none!important;-webkit-appearance:none!important;appearance:none!important;background:transparent!important;border:0!important;box-shadow:none!important;outline:none!important;scrollbar-width:thin;scrollbar-color:rgba(40,43,54,.3) transparent}.conversation-message-input-scrollbar:active,.conversation-message-input-scrollbar:focus,.conversation-message-input-scrollbar:focus-visible{background:transparent!important;border:0!important;border-color:transparent!important;box-shadow:none!important;outline:none!important;--tw-ring-color:transparent!important;--tw-ring-offset-shadow:0 0 #0000!important;--tw-ring-shadow:0 0 #0000!important}.placeholder\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(116 123 126/var(--tw-text-opacity,1))}.placeholder\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(116 123 126/var(--tw-text-opacity,1))}.last\:border-b-0:last-child{border-bottom-width:0}.focus-within\:border-chat-focus:focus-within{--tw-border-opacity:1;border-color:rgb(50 120 247/var(--tw-border-opacity,1))}.focus-within\:shadow-chat-focus-ring: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\:\!border-\[var\(--dc-color-primary-hover\)\]:hover{border-color:var(--dc-color-primary-hover)!important}.hover\:\!border-danger-300:hover{--tw-border-opacity:1!important;border-color:rgb(250 95 84/var(--tw-border-opacity,1))!important}.hover\:\!bg-\[var\(--dc-color-primary-hover\)\]:hover{background-color:var(--dc-color-primary-hover)!important}.hover\:\!bg-danger-300:hover{--tw-bg-opacity:1!important;background-color:rgb(250 95 84/var(--tw-bg-opacity,1))!important}.hover\:bg-\[\#f5f5f5\]:hover{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity,1))}.hover\:bg-\[var\(--dc-color-primary-light\)\]:hover{background-color:var(--dc-color-primary-light)}.hover\:bg-black\/70:hover{background-color:rgba(0,0,0,.7)}.hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(161 208 255/var(--tw-bg-opacity,1))}.hover\:bg-gray-10:hover{--tw-bg-opacity:1;background-color:rgb(247 247 250/var(--tw-bg-opacity,1))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(194 197 199/var(--tw-bg-opacity,1))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(168 173 175/var(--tw-bg-opacity,1))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(221 222 223/var(--tw-bg-opacity,1))}.hover\:text-\[var\(--dc-color-primary-hover\)\]:hover{color:var(--dc-color-primary-hover)}.hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(17 107 179/var(--tw-text-opacity,1))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(92 99 102/var(--tw-text-opacity,1))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(80 87 89/var(--tw-text-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.focus\:border-0:focus{border-width:0}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-chat-ring:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(22 119 255/var(--tw-ring-opacity,1))}.active\:bg-chat-bubble-neutral\/\[0\.08\]:active{background-color:rgba(131,137,157,.08)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-gray-200:disabled{--tw-border-opacity:1;border-color:rgb(168 173 175/var(--tw-border-opacity,1))}.disabled\:bg-gray-100:disabled{--tw-bg-opacity:1;background-color:rgb(194 197 199/var(--tw-bg-opacity,1))}.disabled\:bg-gray-200:disabled{--tw-bg-opacity:1;background-color:rgb(168 173 175/var(--tw-bg-opacity,1))}.disabled\:text-gray-300:disabled{--tw-text-opacity:1;color:rgb(142 148 150/var(--tw-text-opacity,1))}.disabled\:text-gray-400:disabled{--tw-text-opacity:1;color:rgb(116 123 126/var(--tw-text-opacity,1))}.disabled\:opacity-60:disabled{opacity:.6}@media (min-width:640px){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:px-4{padding-left:1rem;padding-right:1rem}}.\[\&\>svg\]\:h-6>svg{height:1.5rem}.\[\&\>svg\]\:h-8>svg{height:2rem}.\[\&\>svg\]\:h-full>svg{height:100%}.\[\&\>svg\]\:w-6>svg{width:1.5rem}.\[\&\>svg\]\:w-8>svg{width:2rem}.\[\&\>svg\]\:w-auto>svg{width:auto}.\[\&_\.ant-dropdown-menu-item\]\:rounded-none .ant-dropdown-menu-item{border-radius:0}.\[\&_\.ant-dropdown-menu-item\]\:\!px-4 .ant-dropdown-menu-item{padding-left:1rem!important;padding-right:1rem!important}.\[\&_\.ant-dropdown-menu-item\]\:\!py-1\.5 .ant-dropdown-menu-item{padding-top:.375rem!important;padding-bottom:.375rem!important}.\[\&_\.ant-dropdown-menu\]\:min-w-\[200px\] .ant-dropdown-menu{min-width:200px}.\[\&_\.ant-dropdown-menu\]\:rounded-2xl .ant-dropdown-menu{border-radius:1rem}.\[\&_\.ant-dropdown-menu\]\:p-0 .ant-dropdown-menu{padding:0}.\[\&_\.ant-dropdown-menu\]\:py-2 .ant-dropdown-menu{padding-top:.5rem;padding-bottom:.5rem}.\[\&_\.ant-dropdown-menu\]\:shadow-message-toolbox .ant-dropdown-menu{--tw-shadow:0px 0px 24px 0px rgba(14,28,52,.1);--tw-shadow-colored:0px 0px 24px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\[\&_\.ant-tabs-content-holder\]\:flex .ant-tabs-content-holder{display:flex}.\[\&_\.ant-tabs-content-holder\]\:hidden .ant-tabs-content-holder{display:none}.\[\&_\.ant-tabs-content-holder\]\:flex-1 .ant-tabs-content-holder{flex:1 1 0%}.\[\&_\.ant-tabs-content-holder\]\:overflow-hidden .ant-tabs-content-holder{overflow:hidden}.\[\&_\.ant-tabs-content\]\:h-full .ant-tabs-content{height:100%}.\[\&_\.ant-tabs-extra-content\]\:flex .ant-tabs-extra-content{display:flex}.\[\&_\.ant-tabs-extra-content\]\:items-center .ant-tabs-extra-content{align-items:center}.\[\&_\.ant-tabs-extra-content\]\:overflow-hidden .ant-tabs-extra-content{overflow:hidden}.\[\&_\.ant-tabs-extra-content\]\:text-ellipsis .ant-tabs-extra-content{text-overflow:ellipsis}.\[\&_\.ant-tabs-ink-bar\]\:hidden .ant-tabs-ink-bar{display:none}.\[\&_\.ant-tabs-ink-bar\]\:h-\[3px\] .ant-tabs-ink-bar{height:3px}.\[\&_\.ant-tabs-ink-bar\]\:rounded .ant-tabs-ink-bar{border-radius:.25rem}.\[\&_\.ant-tabs-ink-bar\]\:\!\[background\:var\(--dc-color-primary\)\] .ant-tabs-ink-bar{background:var(--dc-color-primary)!important}.\[\&_\.ant-tabs-nav-list\]\:h-full .ant-tabs-nav-list,.\[\&_\.ant-tabs-nav-wrap\]\:h-full .ant-tabs-nav-wrap{height:100%}.\[\&_\.ant-tabs-nav-wrap\]\:justify-end .ant-tabs-nav-wrap{justify-content:flex-end}.\[\&_\.ant-tabs-nav\]\:mb-0 .ant-tabs-nav{margin-bottom:0}.\[\&_\.ant-tabs-nav\]\:h-\[42px\] .ant-tabs-nav{height:42px}.\[\&_\.ant-tabs-nav\]\:bg-white .ant-tabs-nav{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.\[\&_\.ant-tabs-nav\]\:px-4 .ant-tabs-nav{padding-left:1rem;padding-right:1rem}.\[\&_\.ant-tabs-nav\]\:pt-0 .ant-tabs-nav{padding-top:0}.\[\&_\.ant-tabs-nav\]\:before\:border-b .ant-tabs-nav:before{content:var(--tw-content);border-bottom-width:1px}.\[\&_\.ant-tabs-nav\]\:before\:border-b-0 .ant-tabs-nav:before{content:var(--tw-content);border-bottom-width:0}.\[\&_\.ant-tabs-nav\]\:before\:border-gray-25 .ant-tabs-nav:before{content:var(--tw-content);--tw-border-opacity:1;border-color:rgb(239 239 239/var(--tw-border-opacity,1))}.\[\&_\.ant-tabs-tab\+\.ant-tabs-tab\]\:ml-0 .ant-tabs-tab+.ant-tabs-tab{margin-left:0}.\[\&_\.ant-tabs-tab-active\]\:border-indigo-200 .ant-tabs-tab-active{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity,1))}.\[\&_\.ant-tabs-tab-active\]\:border-orange-200 .ant-tabs-tab-active{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity,1))}.\[\&_\.ant-tabs-tab-active\]\:bg-indigo-50 .ant-tabs-tab-active{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity,1))}.\[\&_\.ant-tabs-tab-active\]\:bg-orange-50 .ant-tabs-tab-active{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity,1))}.\[\&_\.ant-tabs-tab-active_\.ant-tabs-tab-btn\]\:\!\[color\:var\(--dc-color-primary\)\] .ant-tabs-tab-active .ant-tabs-tab-btn{color:var(--dc-color-primary)!important}.\[\&_\.ant-tabs-tab-btn\]\:text-\[14px\] .ant-tabs-tab-btn{font-size:14px}.\[\&_\.ant-tabs-tab-btn\]\:font-bold .ant-tabs-tab-btn{font-weight:700}.\[\&_\.ant-tabs-tab-btn\]\:leading-5 .ant-tabs-tab-btn{line-height:1.25rem}.\[\&_\.ant-tabs-tab-btn\]\:leading-\[1\.6\] .ant-tabs-tab-btn{line-height:1.6}.\[\&_\.ant-tabs-tab-btn\]\:tracking-\[0\.14px\] .ant-tabs-tab-btn{letter-spacing:.14px}.\[\&_\.ant-tabs-tab-btn\]\:\!text-gray-400 .ant-tabs-tab-btn{--tw-text-opacity:1!important;color:rgb(116 123 126/var(--tw-text-opacity,1))!important}.\[\&_\.ant-tabs-tab\]\:mb-0 .ant-tabs-tab{margin-bottom:0}.\[\&_\.ant-tabs-tab\]\:h-full .ant-tabs-tab{height:100%}.\[\&_\.ant-tabs-tab\]\:rounded-t-\[16px\] .ant-tabs-tab{border-top-left-radius:16px;border-top-right-radius:16px}.\[\&_\.ant-tabs-tab\]\:border .ant-tabs-tab{border-width:1px}.\[\&_\.ant-tabs-tab\]\:border-b-0 .ant-tabs-tab{border-bottom-width:0}.\[\&_\.ant-tabs-tab\]\:border-transparent .ant-tabs-tab{border-color:transparent}.\[\&_\.ant-tabs-tab\]\:px-3 .ant-tabs-tab{padding-left:.75rem;padding-right:.75rem}.\[\&_\.ant-tabs-tab\]\:py-1\.5 .ant-tabs-tab{padding-top:.375rem;padding-bottom:.375rem}.\[\&_\.ant-tabs-tab\]\:pb-0 .ant-tabs-tab{padding-bottom:0}.\[\&_\.ant-tabs-tab\]\:pt-0\.5 .ant-tabs-tab{padding-top:.125rem}.\[\&_\.ant-tabs-tab\]\:leading-5 .ant-tabs-tab{line-height:1.25rem}.\[\&_\.ant-tabs-tabpane-active\]\:flex .ant-tabs-tabpane-active{display:flex}.\[\&_\.ant-tabs-tabpane-active\]\:h-full .ant-tabs-tabpane-active{height:100%}.\[\&_\.ant-tabs-tabpane-active\]\:flex-col .ant-tabs-tabpane-active{flex-direction:column}.\[\&_code\]\:font-\[inherit\] code,.\[\&_kbd\]\:font-\[inherit\] kbd,.\[\&_pre\]\:font-\[inherit\] pre,.\[\&_samp\]\:font-\[inherit\] samp{font-family:inherit}
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(40,138,230,.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(40,138,230,.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 #a8adaf}: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:#747b7e}input::placeholder,textarea::placeholder{opacity:1;color:#747b7e}[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}.\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\!visible{visibility:visible!important}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.-bottom-1{bottom:-.25rem}.-bottom-2{bottom:-.5rem}.-bottom-px{bottom:-1px}.-right-1{right:-.25rem}.-right-px{right:-1px}.-top-1{top:-.25rem}.-top-2\.5{top:-.625rem}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.bottom-full{bottom:100%}.left-0{left:0}.left-1{left:.25rem}.left-1\/2{left:50%}.left-2{left:.5rem}.left-3{left:.75rem}.right-0{right:0}.right-1{right:.25rem}.right-2{right:.5rem}.top-0{top:0}.top-1\/2{top:50%}.top-2{top:.5rem}.top-3{top:.75rem}.isolate{isolation:isolate}.\!z-\[9999\]{z-index:9999!important}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[1\]{z-index:1}.\!m-0{margin:0!important}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.\!mr-4{margin-right:1rem!important}.-mr-1\.5{margin-right:-.375rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.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}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-square{aspect-ratio:1/1}.aspect-video{aspect-ratio:16/9}.\!h-10{height:2.5rem!important}.\!h-full{height:100%!important}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-\[100px\]{height:100px}.h-\[120px\]{height:120px}.h-\[144px\]{height:144px}.h-\[17px\]{height:17px}.h-\[19px\]{height:19px}.h-\[22px\]{height:22px}.h-\[36px\]{height:36px}.h-\[3px\]{height:3px}.h-\[400px\]{height:400px}.h-\[42px\]{height:42px}.h-\[51px\]{height:51px}.h-\[59px\]{height:59px}.h-\[600px\]{height:600px}.h-\[76px\]{height:76px}.h-\[87px\]{height:87px}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-48{max-height:12rem}.max-h-64{max-height:16rem}.max-h-72{max-height:18rem}.max-h-80{max-height:20rem}.max-h-\[140px\]{max-height:140px}.max-h-\[220px\]{max-height:220px}.max-h-\[70vh\]{max-height:70vh}.max-h-\[80vh\]{max-height:80vh}.min-h-0{min-height:0}.min-h-10{min-height:2.5rem}.min-h-40{min-height:10rem}.min-h-6{min-height:1.5rem}.min-h-\[200px\]{min-height:200px}.min-h-\[25\.6px\]{min-height:25.6px}.min-h-\[32px\]{min-height:32px}.min-h-\[64px\]{min-height:64px}.\!w-full{width:100%!important}.\!w-max{width:-moz-max-content!important;width:max-content!important}.w-1{width:.25rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-20{width:5rem}.w-24{width:6rem}.w-4{width:1rem}.w-40{width:10rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-96{width:24rem}.w-\[100px\]{width:100px}.w-\[101px\]{width:101px}.w-\[120px\]{width:120px}.w-\[170px\]{width:170px}.w-\[260px\]{width:260px}.w-\[26px\]{width:26px}.w-\[292px\]{width:292px}.w-\[30px\]{width:30px}.w-\[320px\]{width:320px}.w-\[330px\]{width:330px}.w-\[36px\]{width:36px}.w-\[3px\]{width:3px}.w-\[400px\]{width:400px}.w-\[42px\]{width:42px}.w-\[51px\]{width:51px}.w-\[600px\]{width:600px}.w-\[76px\]{width:76px}.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-5{min-width:1.25rem}.min-w-6{min-width:1.5rem}.min-w-8{min-width:2rem}.min-w-\[100px\]{min-width:100px}.min-w-\[26px\]{min-width:26px}.min-w-\[6\.5em\]{min-width:6.5em}.max-w-\[120px\]{max-width:120px}.max-w-\[200px\]{max-width:200px}.max-w-\[280px\]{max-width:280px}.max-w-\[292px\]{max-width:292px}.max-w-full{max-width:100%}.max-w-none{max-width:none}.flex-1{flex:1 1 0%}.flex-\[1_0_0\]{flex:1 0 0}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow,.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%}.transform{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))}@keyframes bounce{0%,to{transform:translateY(-25%);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;animation-timing-function:cubic-bezier(0,0,.2,1)}}.animate-bounce{animation:bounce 1s infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-pan-y{--tw-pan-y:pan-y;touch-action:var(--tw-pan-x) var(--tw-pan-y) var(--tw-pinch-zoom)}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.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}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid-cols-\[repeat\(1\2c 100px\)\]{grid-template-columns:repeat(1,100px)}.grid-cols-\[repeat\(2\2c 100px\)\]{grid-template-columns:repeat(2,100px)}.grid-cols-\[repeat\(3\2c 100px\)\]{grid-template-columns:repeat(3,100px)}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.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-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-\[2px\]{gap:2px}.gap-\[7px\]{gap:7px}.gap-px{gap:1px}.gap-y-5{row-gap:1.25rem}.self-end{align-self:flex-end}.self-center{align-self:center}.self-stretch{align-self:stretch}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{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}.break-all{word-break:break-all}.\!rounded-lg{border-radius:.5rem!important}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[12px\]{border-radius:12px}.rounded-\[20px\]{border-radius:20px}.rounded-\[32px\]{border-radius:32px}.rounded-\[4px\]{border-radius:4px}.rounded-\[8px\]{border-radius:8px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-bl-none{border-bottom-left-radius:0}.rounded-br-none{border-bottom-right-radius:0}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.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!important}.border-none{border-style:none}.\!border-\[var\(--dc-color-primary\)\]{border-color:var(--dc-color-primary)!important}.\!border-danger-400{--tw-border-opacity:1!important;border-color:rgb(240 68 56/var(--tw-border-opacity,1))!important}.\!border-gray-25{--tw-border-opacity:1!important;border-color:rgb(239 239 239/var(--tw-border-opacity,1))!important}.border-\[var\(--dc-color-primary\)\]{border-color:var(--dc-color-primary)}.border-\[var\(--dc-color-primary-focus\)\]{border-color:var(--dc-color-primary-focus)}.border-\[var\(--dc-color-primary-hover\)\]{border-color:var(--dc-color-primary-hover)}.border-blue-500{--tw-border-opacity:1;border-color:rgb(40 138 230/var(--tw-border-opacity,1))}.border-gray-100{--tw-border-opacity:1;border-color:rgb(194 197 199/var(--tw-border-opacity,1))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(168 173 175/var(--tw-border-opacity,1))}.border-gray-200\/20{border-color:hsla(197,4%,67%,.2)}.border-gray-25{--tw-border-opacity:1;border-color:rgb(239 239 239/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(142 148 150/var(--tw-border-opacity,1))}.border-gray-50{--tw-border-opacity:1;border-color:rgb(221 222 223/var(--tw-border-opacity,1))}.border-gray-900\/10{border-color:rgba(57,62,64,.1)}.border-indigo-500{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity,1))}.border-orange-300{--tw-border-opacity:1;border-color:rgb(253 186 116/var(--tw-border-opacity,1))}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.border-t-transparent{border-top-color:transparent}.\!bg-\[var\(--dc-color-primary\)\]{background-color:var(--dc-color-primary)!important}.\!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(161 208 255/var(--tw-bg-opacity,1))!important}.\!bg-blue-500{--tw-bg-opacity:1!important;background-color:rgb(40 138 230/var(--tw-bg-opacity,1))!important}.\!bg-danger-400{--tw-bg-opacity:1!important;background-color:rgb(240 68 56/var(--tw-bg-opacity,1))!important}.\!bg-gray-100{--tw-bg-opacity:1!important;background-color:rgb(194 197 199/var(--tw-bg-opacity,1))!important}.\!bg-gray-25{--tw-bg-opacity:1!important;background-color:rgb(239 239 239/var(--tw-bg-opacity,1))!important}.\!bg-gray-500{--tw-bg-opacity:1!important;background-color:rgb(104 111 114/var(--tw-bg-opacity,1))!important}.\!bg-green-100{--tw-bg-opacity:1!important;background-color:rgb(246 255 237/var(--tw-bg-opacity,1))!important}.\!bg-green-500{--tw-bg-opacity:1!important;background-color:rgb(38 191 135/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(249 240 255/var(--tw-bg-opacity,1))!important}.\!bg-purple-500{--tw-bg-opacity:1!important;background-color:rgb(146 84 222/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-transparent{background-color:transparent!important}.bg-\[\#8D8E90\]{--tw-bg-opacity:1;background-color:rgb(141 142 144/var(--tw-bg-opacity,1))}.bg-\[\#f5f5f5\]{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity,1))}.bg-\[\#f5f5f5\]\/20{background-color:hsla(0,0%,96%,.2)}.bg-\[var\(--dc-color-bot-badge\)\]{background-color:var(--dc-color-bot-badge)}.bg-\[var\(--dc-color-mall-badge\)\]{background-color:var(--dc-color-mall-badge)}.bg-\[var\(--dc-color-primary\)\]{background-color:var(--dc-color-primary)}.bg-\[var\(--dc-color-primary-hover\)\]{background-color:var(--dc-color-primary-hover)}.bg-\[var\(--dc-color-primary-light\)\]{background-color:var(--dc-color-primary-light)}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.bg-black\/10{background-color:rgba(0,0,0,.1)}.bg-black\/30{background-color:rgba(0,0,0,.3)}.bg-black\/5{background-color:rgba(0,0,0,.05)}.bg-black\/50{background-color:rgba(0,0,0,.5)}.bg-black\/60{background-color:rgba(0,0,0,.6)}.bg-black\/70{background-color:rgba(0,0,0,.7)}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(161 208 255/var(--tw-bg-opacity,1))}.bg-blue-25{--tw-bg-opacity:1;background-color:rgb(234 245 255/var(--tw-bg-opacity,1))}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(198 226 255/var(--tw-bg-opacity,1))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(40 138 230/var(--tw-bg-opacity,1))}.bg-chat-bubble-mine\/10{background-color:rgba(0,81,255,.1)}.bg-chat-bubble-neutral\/10{background-color:rgba(131,137,157,.1)}.bg-chat-bubble-neutral\/\[0\.05\]{background-color:rgba(131,137,157,.05)}.bg-chat-internal\/10{background-color:rgba(255,149,0,.1)}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(194 197 199/var(--tw-bg-opacity,1))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(168 173 175/var(--tw-bg-opacity,1))}.bg-gray-200\/10{background-color:hsla(197,4%,67%,.1)}.bg-gray-25{--tw-bg-opacity:1;background-color:rgb(239 239 239/var(--tw-bg-opacity,1))}.bg-gray-400{--tw-bg-opacity:1;background-color:rgb(116 123 126/var(--tw-bg-opacity,1))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(104 111 114/var(--tw-bg-opacity,1))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(57 62 64/var(--tw-bg-opacity,1))}.bg-gray-cool-200{--tw-bg-opacity:1;background-color:rgb(169 178 208/var(--tw-bg-opacity,1))}.bg-gray-cool-25{--tw-bg-opacity:1;background-color:rgb(241 243 248/var(--tw-bg-opacity,1))}.bg-neutral-100{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity,1))}.bg-neutral-200{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity,1))}.bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity,1))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/70{background-color:hsla(0,0%,100%,.7)}.bg-white\/90{background-color:hsla(0,0%,100%,.9)}.bg-gradient-danger-light{background-image:linear-gradient(93deg,#ff7d74,#f04438)}.object-contain{-o-object-fit:contain;object-fit:contain}.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}.p-6{padding:1.5rem}.\!px-0{padding-left:0!important;padding-right:0!important}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.px-\[3px\]{padding-left:3px;padding-right:3px}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-\[42px\]{padding-top:42px;padding-bottom:42px}.py-\[4px\]{padding-top:4px;padding-bottom:4px}.pb-0\.5{padding-bottom:.125rem}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-60{padding-bottom:15rem}.pb-\[4px\]{padding-bottom:4px}.pl-0{padding-left:0}.pl-1{padding-left:.25rem}.pl-12{padding-left:3rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pr-1{padding-right:.25rem}.pr-12{padding-right:3rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-5{padding-right:1.25rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.\!align-\[-4px\]{vertical-align:-4px!important}.\!text-\[14px\]{font-size:14px!important}.\!text-\[16px\]{font-size:16px!important}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[16px\]{font-size:16px}.text-\[18px\]{font-size:18px}.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-medium{font-weight:500!important}.font-\[510\]{font-weight:510}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.\!leading-\[1\.6\]{line-height:1.6!important}.leading-3{line-height:.75rem}.leading-4{line-height:1rem}.leading-\[1\.4\]{line-height:1.4}.leading-\[1\.6\]{line-height:1.6}.leading-\[160\%\]{line-height:160%}.leading-none{line-height:1}.\!tracking-\[0\.14px\]{letter-spacing:.14px!important}.tracking-\[-0\.14px\]{letter-spacing:-.14px}.tracking-\[0\.12px\]{letter-spacing:.12px}.tracking-\[0\.14px\]{letter-spacing:.14px}.tracking-\[0\.16px\]{letter-spacing:.16px}.tracking-\[0\.1px\]{letter-spacing:.1px}.tracking-wide{letter-spacing:.025em}.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(40 138 230/var(--tw-text-opacity,1))!important}.\!text-gray-500{--tw-text-opacity:1!important;color:rgb(104 111 114/var(--tw-text-opacity,1))!important}.\!text-gray-900{--tw-text-opacity:1!important;color:rgb(57 62 64/var(--tw-text-opacity,1))!important}.\!text-green-500{--tw-text-opacity:1!important;color:rgb(38 191 135/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(146 84 222/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-white{--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity,1))!important}.text-\[\#747B7E\]{--tw-text-opacity:1;color:rgb(116 123 126/var(--tw-text-opacity,1))}.text-\[var\(--dc-color-header-icon\)\]{color:var(--dc-color-header-icon)}.text-\[var\(--dc-color-link\)\]{color:var(--dc-color-link)}.text-\[var\(--dc-color-nav-icon\)\]{color:var(--dc-color-nav-icon)}.text-\[var\(--dc-color-primary\)\]{color:var(--dc-color-primary)}.text-\[var\(--dc-color-primary-hover\)\]{color:var(--dc-color-primary-hover)}.text-\[var\(--dc-color-primary-light\)\]{color:var(--dc-color-primary-light)}.text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity,1))}.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(40 138 230/var(--tw-text-opacity,1))}.text-blue-600{--tw-text-opacity:1;color:rgb(27 122 204/var(--tw-text-opacity,1))}.text-chat-bubble-mine{--tw-text-opacity:1;color:rgb(0 81 255/var(--tw-text-opacity,1))}.text-chat-bubble-neutral{--tw-text-opacity:1;color:rgb(131 137 157/var(--tw-text-opacity,1))}.text-chat-internal{--tw-text-opacity:1;color:rgb(255 149 0/var(--tw-text-opacity,1))}.text-danger-400{--tw-text-opacity:1;color:rgb(240 68 56/var(--tw-text-opacity,1))}.text-gray-300{--tw-text-opacity:1;color:rgb(142 148 150/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(116 123 126/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(104 111 114/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(92 99 102/var(--tw-text-opacity,1))}.text-gray-700{--tw-text-opacity:1;color:rgb(80 87 89/var(--tw-text-opacity,1))}.text-gray-800{--tw-text-opacity:1;color:rgb(68 74 77/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(57 62 64/var(--tw-text-opacity,1))}.text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity,1))}.text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/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}.underline-offset-2{text-underline-offset:2px}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.\!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-\[0px_0px_2px_var\(--dc-color-primary-focus\)\]{--tw-shadow:0px 0px 2px var(--dc-color-primary-focus);--tw-shadow-colored:0px 0px 2px var(--tw-shadow-color)}.shadow-\[0px_0px_2px_var\(--dc-color-primary-focus\)\],.shadow-badge-inset{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-badge-inset{--tw-shadow:inset 2px 6px 8px 0 rgba(0,0,0,.12);--tw-shadow-colored:inset 2px 6px 8px 0 var(--tw-shadow-color)}.shadow-inset-gray-divider{--tw-shadow:inset 0px -1px 0px 0px rgba(61,63,64,.1);--tw-shadow-colored:inset 0px -1px 0px 0px var(--tw-shadow-color)}.shadow-inset-gray-divider,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.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-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)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.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{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.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-none{transition-property:none}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150,.transition-transform{transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[font-feature-settings\:\'liga\'_off\2c \'clig\'_off\]{font-feature-settings:"liga" off,"clig" off}.\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}[data-dchat-root] button.ant-btn-color-primary:not(.ant-btn-dangerous):not(:disabled){color:#fff;background-color:var(--dc-color-primary,#1b3fe4)}[data-dchat-root] button.ant-btn-color-primary:not(.ant-btn-dangerous):not(:disabled):hover{background-color:var(--dc-color-primary-hover,#0f33d6)}[data-dchat-root] .ant-switch.ant-switch-checked:not(.ant-switch-disabled){background:var(--dc-color-primary,#1b3fe4)}[data-dchat-root] .ant-switch.ant-switch-checked:not(.ant-switch-disabled):hover{background:var(--dc-color-primary-hover,#0f33d6)}[data-dchat-root] .ant-tabs-tab{margin:0!important;min-width:80px!important;justify-content:center!important;align-items:center!important}[data-dchat-root] .ant-tabs-content,[data-dchat-root] .ant-tabs-content-holder,[data-dchat-root] .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%}}.conversation-message-input-scrollbar{-moz-appearance:none!important;-webkit-appearance:none!important;appearance:none!important;background:transparent!important;border:0!important;box-shadow:none!important;outline:none!important;scrollbar-width:thin;scrollbar-color:rgba(40,43,54,.3) transparent}.conversation-message-input-scrollbar:active,.conversation-message-input-scrollbar:focus,.conversation-message-input-scrollbar:focus-visible{background:transparent!important;border:0!important;border-color:transparent!important;box-shadow:none!important;outline:none!important;--tw-ring-color:transparent!important;--tw-ring-offset-shadow:0 0 #0000!important;--tw-ring-shadow:0 0 #0000!important}.placeholder\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(116 123 126/var(--tw-text-opacity,1))}.placeholder\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgb(116 123 126/var(--tw-text-opacity,1))}.last\:border-b-0:last-child{border-bottom-width:0}.focus-within\:border-chat-focus:focus-within{--tw-border-opacity:1;border-color:rgb(50 120 247/var(--tw-border-opacity,1))}.focus-within\:shadow-chat-focus-ring: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\:\!border-\[var\(--dc-color-primary-hover\)\]:hover{border-color:var(--dc-color-primary-hover)!important}.hover\:\!border-danger-300:hover{--tw-border-opacity:1!important;border-color:rgb(250 95 84/var(--tw-border-opacity,1))!important}.hover\:\!bg-\[var\(--dc-color-primary-hover\)\]:hover{background-color:var(--dc-color-primary-hover)!important}.hover\:\!bg-danger-300:hover{--tw-bg-opacity:1!important;background-color:rgb(250 95 84/var(--tw-bg-opacity,1))!important}.hover\:bg-\[\#f5f5f5\]:hover{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity,1))}.hover\:bg-\[var\(--dc-color-primary-light\)\]:hover{background-color:var(--dc-color-primary-light)}.hover\:bg-black\/70:hover{background-color:rgba(0,0,0,.7)}.hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(161 208 255/var(--tw-bg-opacity,1))}.hover\:bg-gray-10:hover{--tw-bg-opacity:1;background-color:rgb(247 247 250/var(--tw-bg-opacity,1))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(194 197 199/var(--tw-bg-opacity,1))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(168 173 175/var(--tw-bg-opacity,1))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(221 222 223/var(--tw-bg-opacity,1))}.hover\:text-\[var\(--dc-color-primary-hover\)\]:hover{color:var(--dc-color-primary-hover)}.hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(17 107 179/var(--tw-text-opacity,1))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(92 99 102/var(--tw-text-opacity,1))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(80 87 89/var(--tw-text-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.focus\:border-0:focus{border-width:0}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:outline:focus-visible{outline-style:solid}.focus-visible\:outline-2:focus-visible{outline-width:2px}.focus-visible\:outline-\[var\(--dc-color-link\)\]:focus-visible{outline-color:var(--dc-color-link)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-chat-ring:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(22 119 255/var(--tw-ring-opacity,1))}.active\:bg-chat-bubble-neutral\/\[0\.08\]:active{background-color:rgba(131,137,157,.08)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-gray-200:disabled{--tw-border-opacity:1;border-color:rgb(168 173 175/var(--tw-border-opacity,1))}.disabled\:bg-gray-100:disabled{--tw-bg-opacity:1;background-color:rgb(194 197 199/var(--tw-bg-opacity,1))}.disabled\:bg-gray-200:disabled{--tw-bg-opacity:1;background-color:rgb(168 173 175/var(--tw-bg-opacity,1))}.disabled\:text-gray-300:disabled{--tw-text-opacity:1;color:rgb(142 148 150/var(--tw-text-opacity,1))}.disabled\:text-gray-400:disabled{--tw-text-opacity:1;color:rgb(116 123 126/var(--tw-text-opacity,1))}.disabled\:opacity-60:disabled{opacity:.6}@media (min-width:640px){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:px-4{padding-left:1rem;padding-right:1rem}}.\[\&\>svg\]\:h-6>svg{height:1.5rem}.\[\&\>svg\]\:h-8>svg{height:2rem}.\[\&\>svg\]\:h-full>svg{height:100%}.\[\&\>svg\]\:w-6>svg{width:1.5rem}.\[\&\>svg\]\:w-8>svg{width:2rem}.\[\&\>svg\]\:w-auto>svg{width:auto}.\[\&_\.ant-dropdown-menu-item\]\:rounded-none .ant-dropdown-menu-item{border-radius:0}.\[\&_\.ant-dropdown-menu-item\]\:\!px-4 .ant-dropdown-menu-item{padding-left:1rem!important;padding-right:1rem!important}.\[\&_\.ant-dropdown-menu-item\]\:\!py-1\.5 .ant-dropdown-menu-item{padding-top:.375rem!important;padding-bottom:.375rem!important}.\[\&_\.ant-dropdown-menu\]\:min-w-\[200px\] .ant-dropdown-menu{min-width:200px}.\[\&_\.ant-dropdown-menu\]\:rounded-2xl .ant-dropdown-menu{border-radius:1rem}.\[\&_\.ant-dropdown-menu\]\:p-0 .ant-dropdown-menu{padding:0}.\[\&_\.ant-dropdown-menu\]\:py-2 .ant-dropdown-menu{padding-top:.5rem;padding-bottom:.5rem}.\[\&_\.ant-dropdown-menu\]\:shadow-message-toolbox .ant-dropdown-menu{--tw-shadow:0px 0px 24px 0px rgba(14,28,52,.1);--tw-shadow-colored:0px 0px 24px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\[\&_\.ant-tabs-content-holder\]\:flex .ant-tabs-content-holder{display:flex}.\[\&_\.ant-tabs-content-holder\]\:hidden .ant-tabs-content-holder{display:none}.\[\&_\.ant-tabs-content-holder\]\:flex-1 .ant-tabs-content-holder{flex:1 1 0%}.\[\&_\.ant-tabs-content-holder\]\:overflow-hidden .ant-tabs-content-holder{overflow:hidden}.\[\&_\.ant-tabs-content\]\:h-full .ant-tabs-content{height:100%}.\[\&_\.ant-tabs-extra-content\]\:flex .ant-tabs-extra-content{display:flex}.\[\&_\.ant-tabs-extra-content\]\:items-center .ant-tabs-extra-content{align-items:center}.\[\&_\.ant-tabs-extra-content\]\:overflow-hidden .ant-tabs-extra-content{overflow:hidden}.\[\&_\.ant-tabs-extra-content\]\:text-ellipsis .ant-tabs-extra-content{text-overflow:ellipsis}.\[\&_\.ant-tabs-ink-bar\]\:hidden .ant-tabs-ink-bar{display:none}.\[\&_\.ant-tabs-ink-bar\]\:h-\[3px\] .ant-tabs-ink-bar{height:3px}.\[\&_\.ant-tabs-ink-bar\]\:rounded .ant-tabs-ink-bar{border-radius:.25rem}.\[\&_\.ant-tabs-ink-bar\]\:\!\[background\:var\(--dc-color-primary\)\] .ant-tabs-ink-bar{background:var(--dc-color-primary)!important}.\[\&_\.ant-tabs-nav-list\]\:h-full .ant-tabs-nav-list,.\[\&_\.ant-tabs-nav-wrap\]\:h-full .ant-tabs-nav-wrap{height:100%}.\[\&_\.ant-tabs-nav-wrap\]\:justify-end .ant-tabs-nav-wrap{justify-content:flex-end}.\[\&_\.ant-tabs-nav\]\:mb-0 .ant-tabs-nav{margin-bottom:0}.\[\&_\.ant-tabs-nav\]\:h-\[42px\] .ant-tabs-nav{height:42px}.\[\&_\.ant-tabs-nav\]\:bg-white .ant-tabs-nav{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.\[\&_\.ant-tabs-nav\]\:px-4 .ant-tabs-nav{padding-left:1rem;padding-right:1rem}.\[\&_\.ant-tabs-nav\]\:pt-0 .ant-tabs-nav{padding-top:0}.\[\&_\.ant-tabs-nav\]\:before\:border-b .ant-tabs-nav:before{content:var(--tw-content);border-bottom-width:1px}.\[\&_\.ant-tabs-nav\]\:before\:border-b-0 .ant-tabs-nav:before{content:var(--tw-content);border-bottom-width:0}.\[\&_\.ant-tabs-nav\]\:before\:border-gray-25 .ant-tabs-nav:before{content:var(--tw-content);--tw-border-opacity:1;border-color:rgb(239 239 239/var(--tw-border-opacity,1))}.\[\&_\.ant-tabs-tab\+\.ant-tabs-tab\]\:ml-0 .ant-tabs-tab+.ant-tabs-tab{margin-left:0}.\[\&_\.ant-tabs-tab-active\]\:border-indigo-200 .ant-tabs-tab-active{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity,1))}.\[\&_\.ant-tabs-tab-active\]\:border-orange-200 .ant-tabs-tab-active{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity,1))}.\[\&_\.ant-tabs-tab-active\]\:bg-indigo-50 .ant-tabs-tab-active{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity,1))}.\[\&_\.ant-tabs-tab-active\]\:bg-orange-50 .ant-tabs-tab-active{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity,1))}.\[\&_\.ant-tabs-tab-active_\.ant-tabs-tab-btn\]\:\!\[color\:var\(--dc-color-primary\)\] .ant-tabs-tab-active .ant-tabs-tab-btn{color:var(--dc-color-primary)!important}.\[\&_\.ant-tabs-tab-btn\]\:text-\[14px\] .ant-tabs-tab-btn{font-size:14px}.\[\&_\.ant-tabs-tab-btn\]\:font-bold .ant-tabs-tab-btn{font-weight:700}.\[\&_\.ant-tabs-tab-btn\]\:leading-5 .ant-tabs-tab-btn{line-height:1.25rem}.\[\&_\.ant-tabs-tab-btn\]\:leading-\[1\.6\] .ant-tabs-tab-btn{line-height:1.6}.\[\&_\.ant-tabs-tab-btn\]\:tracking-\[0\.14px\] .ant-tabs-tab-btn{letter-spacing:.14px}.\[\&_\.ant-tabs-tab-btn\]\:\!text-gray-400 .ant-tabs-tab-btn{--tw-text-opacity:1!important;color:rgb(116 123 126/var(--tw-text-opacity,1))!important}.\[\&_\.ant-tabs-tab\]\:mb-0 .ant-tabs-tab{margin-bottom:0}.\[\&_\.ant-tabs-tab\]\:h-full .ant-tabs-tab{height:100%}.\[\&_\.ant-tabs-tab\]\:rounded-t-\[16px\] .ant-tabs-tab{border-top-left-radius:16px;border-top-right-radius:16px}.\[\&_\.ant-tabs-tab\]\:border .ant-tabs-tab{border-width:1px}.\[\&_\.ant-tabs-tab\]\:border-b-0 .ant-tabs-tab{border-bottom-width:0}.\[\&_\.ant-tabs-tab\]\:border-transparent .ant-tabs-tab{border-color:transparent}.\[\&_\.ant-tabs-tab\]\:px-3 .ant-tabs-tab{padding-left:.75rem;padding-right:.75rem}.\[\&_\.ant-tabs-tab\]\:py-1\.5 .ant-tabs-tab{padding-top:.375rem;padding-bottom:.375rem}.\[\&_\.ant-tabs-tab\]\:pb-0 .ant-tabs-tab{padding-bottom:0}.\[\&_\.ant-tabs-tab\]\:pt-0\.5 .ant-tabs-tab{padding-top:.125rem}.\[\&_\.ant-tabs-tab\]\:leading-5 .ant-tabs-tab{line-height:1.25rem}.\[\&_\.ant-tabs-tabpane-active\]\:flex .ant-tabs-tabpane-active{display:flex}.\[\&_\.ant-tabs-tabpane-active\]\:h-full .ant-tabs-tabpane-active{height:100%}.\[\&_\.ant-tabs-tabpane-active\]\:flex-col .ant-tabs-tabpane-active{flex-direction:column}.\[\&_code\]\:font-\[inherit\] code,.\[\&_kbd\]\:font-\[inherit\] kbd,.\[\&_pre\]\:font-\[inherit\] pre,.\[\&_samp\]\:font-\[inherit\] samp{font-family:inherit}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@droppii-org/chat-sdk",
3
- "version": "0.6.36",
3
+ "version": "0.6.38",
4
4
  "description": "Droppii React Chat SDK",
5
5
  "repository": {
6
6
  "type": "git",