stream-chat-react 12.12.0 → 12.13.1
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.
- package/dist/components/ChannelList/ChannelList.d.ts +2 -2
- package/dist/components/ChannelPreview/ChannelPreview.d.ts +4 -4
- package/dist/components/ChannelPreview/utils.d.ts +2 -2
- package/dist/components/Chat/hooks/useChat.js +1 -1
- package/dist/components/Message/QuotedMessage.d.ts +3 -1
- package/dist/components/Message/QuotedMessage.js +14 -11
- package/dist/components/Message/types.d.ts +2 -2
- package/dist/components/MessageInput/MessageInputFlat.js +2 -1
- package/dist/components/MessageInput/QuotedMessagePreview.d.ts +3 -1
- package/dist/components/MessageInput/QuotedMessagePreview.js +4 -3
- package/dist/components/MessageList/utils.js +3 -0
- package/dist/context/MessageContext.d.ts +2 -2
- package/dist/css/v2/emoji-mart.css +1 -1
- package/dist/css/v2/index.css +1 -3
- package/dist/css/v2/index.layout.css +1 -3
- package/dist/experimental/index.browser.cjs.map +2 -2
- package/dist/experimental/index.node.cjs.map +2 -2
- package/dist/index.browser.cjs +449 -428
- package/dist/index.browser.cjs.map +4 -4
- package/dist/index.node.cjs +337 -316
- package/dist/index.node.cjs.map +4 -4
- package/dist/scss/v2/Channel/Channel-layout.scss +2 -1
- package/dist/scss/v2/Message/Message-layout.scss +1 -1
- package/dist/scss/v2/Message/Message-theme.scss +5 -5
- package/dist/scss/v2/vendor/react-image-gallery.scss +3 -1
- package/package.json +8 -8
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { ReactNode } from 'react';
|
|
2
2
|
import { ChannelListMessengerProps } from './ChannelListMessenger';
|
|
3
3
|
import { CustomQueryChannelsFn } from './hooks/usePaginatedChannels';
|
|
4
4
|
import { ChannelPreviewUIComponentProps } from '../ChannelPreview/ChannelPreview';
|
|
@@ -35,7 +35,7 @@ export type ChannelListProps<StreamChatGenerics extends DefaultStreamChatGeneric
|
|
|
35
35
|
/** An object containing channel query filters */
|
|
36
36
|
filters?: ChannelFilters<StreamChatGenerics>;
|
|
37
37
|
/** Custom function that generates the message preview in ChannelPreview component */
|
|
38
|
-
getLatestMessagePreview?: (channel: Channel<StreamChatGenerics>, t: TranslationContextValue['t'], userLanguage: TranslationContextValue['userLanguage'], isMessageAIGenerated?: ChatContextValue['isMessageAIGenerated']) =>
|
|
38
|
+
getLatestMessagePreview?: (channel: Channel<StreamChatGenerics>, t: TranslationContextValue['t'], userLanguage: TranslationContextValue['userLanguage'], isMessageAIGenerated?: ChatContextValue['isMessageAIGenerated']) => ReactNode;
|
|
39
39
|
/** Custom UI component to display the container for the queried channels, defaults to and accepts same props as: [ChannelListMessenger](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/ChannelListMessenger.tsx) */
|
|
40
40
|
List?: React.ComponentType<ChannelListMessengerProps<StreamChatGenerics>>;
|
|
41
41
|
/** Custom UI component to display the loading error indicator, defaults to component that renders null */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { ReactNode } from 'react';
|
|
2
2
|
import { ChatContextValue } from '../../context/ChatContext';
|
|
3
3
|
import { MessageDeliveryStatus } from './hooks/useMessageDeliveryStatus';
|
|
4
4
|
import type { Channel } from 'stream-chat';
|
|
@@ -17,9 +17,9 @@ export type ChannelPreviewUIComponentProps<StreamChatGenerics extends DefaultStr
|
|
|
17
17
|
/** The last message received in a channel */
|
|
18
18
|
lastMessage?: StreamMessage<StreamChatGenerics>;
|
|
19
19
|
/** @deprecated Use latestMessagePreview prop instead. */
|
|
20
|
-
latestMessage?:
|
|
20
|
+
latestMessage?: ReactNode;
|
|
21
21
|
/** Latest message preview to display, will be a string or JSX element supporting markdown. */
|
|
22
|
-
latestMessagePreview?:
|
|
22
|
+
latestMessagePreview?: ReactNode;
|
|
23
23
|
/** Status describing whether own message has been delivered or read by another. If the last message is not an own message, then the status is undefined. */
|
|
24
24
|
messageDeliveryStatus?: MessageDeliveryStatus;
|
|
25
25
|
/** Number of unread Messages */
|
|
@@ -39,7 +39,7 @@ export type ChannelPreviewProps<StreamChatGenerics extends DefaultStreamChatGene
|
|
|
39
39
|
/** Custom class for the channel preview root */
|
|
40
40
|
className?: string;
|
|
41
41
|
/** Custom function that generates the message preview in ChannelPreview component */
|
|
42
|
-
getLatestMessagePreview?: (channel: Channel<StreamChatGenerics>, t: TranslationContextValue['t'], userLanguage: TranslationContextValue['userLanguage']) =>
|
|
42
|
+
getLatestMessagePreview?: (channel: Channel<StreamChatGenerics>, t: TranslationContextValue['t'], userLanguage: TranslationContextValue['userLanguage']) => ReactNode;
|
|
43
43
|
key?: string;
|
|
44
44
|
/** Custom ChannelPreview click handler function */
|
|
45
45
|
onSelect?: (event: React.MouseEvent) => void;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { ReactNode } from 'react';
|
|
2
2
|
import type { Channel, UserResponse } from 'stream-chat';
|
|
3
3
|
import type { TranslationContextValue } from '../../context/TranslationContext';
|
|
4
4
|
import type { DefaultStreamChatGenerics } from '../../types/types';
|
|
5
5
|
import { ChatContextValue } from '../../context';
|
|
6
6
|
export declare const renderPreviewText: (text: string) => React.JSX.Element;
|
|
7
|
-
export declare const getLatestMessagePreview: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>(channel: Channel<StreamChatGenerics>, t: TranslationContextValue['t'], userLanguage?: TranslationContextValue['userLanguage'], isMessageAIGenerated?: ChatContextValue<StreamChatGenerics>['isMessageAIGenerated']) =>
|
|
7
|
+
export declare const getLatestMessagePreview: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>(channel: Channel<StreamChatGenerics>, t: TranslationContextValue['t'], userLanguage?: TranslationContextValue['userLanguage'], isMessageAIGenerated?: ChatContextValue<StreamChatGenerics>['isMessageAIGenerated']) => ReactNode;
|
|
8
8
|
export type GroupChannelDisplayInfo = {
|
|
9
9
|
image?: string;
|
|
10
10
|
name?: string;
|
|
@@ -28,7 +28,7 @@ export const useChat = ({ client, defaultLanguage = 'en', i18nInstance, initialN
|
|
|
28
28
|
if (!userAgent.includes('stream-chat-react')) {
|
|
29
29
|
// result looks like: 'stream-chat-react-2.3.2-stream-chat-javascript-client-browser-2.2.2'
|
|
30
30
|
// the upper-case text between double underscores is replaced with the actual semantic version of the library
|
|
31
|
-
client.setUserAgent(`stream-chat-react-12.
|
|
31
|
+
client.setUserAgent(`stream-chat-react-12.13.1-${userAgent}`);
|
|
32
32
|
}
|
|
33
33
|
client.threads.registerSubscriptions();
|
|
34
34
|
client.polls.registerSubscriptions();
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import type { MessageContextValue } from '../../context/MessageContext';
|
|
3
|
+
export type QuotedMessageProps<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> = Pick<MessageContextValue<StreamChatGenerics>, 'renderText'>;
|
|
2
4
|
import type { DefaultStreamChatGenerics } from '../../types/types';
|
|
3
|
-
export declare const QuotedMessage: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>() => React.JSX.Element | null;
|
|
5
|
+
export declare const QuotedMessage: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>({ renderText: propsRenderText, }: QuotedMessageProps) => React.JSX.Element | null;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { useMemo } from 'react';
|
|
2
2
|
import clsx from 'clsx';
|
|
3
3
|
import { Attachment as DefaultAttachment } from '../Attachment';
|
|
4
4
|
import { Avatar as DefaultAvatar } from '../Avatar';
|
|
@@ -8,25 +8,28 @@ import { useComponentContext } from '../../context/ComponentContext';
|
|
|
8
8
|
import { useMessageContext } from '../../context/MessageContext';
|
|
9
9
|
import { useTranslationContext } from '../../context/TranslationContext';
|
|
10
10
|
import { useChannelActionContext } from '../../context/ChannelActionContext';
|
|
11
|
-
|
|
11
|
+
import { renderText as defaultRenderText } from './renderText';
|
|
12
|
+
export const QuotedMessage = ({ renderText: propsRenderText, }) => {
|
|
12
13
|
const { Attachment = DefaultAttachment, Avatar: ContextAvatar } = useComponentContext('QuotedMessage');
|
|
13
14
|
const { client } = useChatContext();
|
|
14
|
-
const { isMyMessage, message } = useMessageContext('QuotedMessage');
|
|
15
|
+
const { isMyMessage, message, renderText: contextRenderText, } = useMessageContext('QuotedMessage');
|
|
15
16
|
const { t, userLanguage } = useTranslationContext('QuotedMessage');
|
|
16
17
|
const { jumpToMessage } = useChannelActionContext('QuotedMessage');
|
|
18
|
+
const renderText = propsRenderText ?? contextRenderText ?? defaultRenderText;
|
|
17
19
|
const Avatar = ContextAvatar || DefaultAvatar;
|
|
18
20
|
const { quoted_message } = message;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const poll = quoted_message.poll_id && client.polls.fromState(quoted_message.poll_id);
|
|
22
|
-
const quotedMessageDeleted = quoted_message.deleted_at || quoted_message.type === 'deleted';
|
|
21
|
+
const poll = quoted_message?.poll_id && client.polls.fromState(quoted_message.poll_id);
|
|
22
|
+
const quotedMessageDeleted = quoted_message?.deleted_at || quoted_message?.type === 'deleted';
|
|
23
23
|
const quotedMessageText = quotedMessageDeleted
|
|
24
24
|
? t('This message was deleted...')
|
|
25
|
-
: quoted_message
|
|
26
|
-
quoted_message
|
|
27
|
-
const quotedMessageAttachment = quoted_message
|
|
25
|
+
: quoted_message?.i18n?.[`${userLanguage}_text`] ||
|
|
26
|
+
quoted_message?.text;
|
|
27
|
+
const quotedMessageAttachment = quoted_message?.attachments?.length && !quotedMessageDeleted
|
|
28
28
|
? quoted_message.attachments[0]
|
|
29
29
|
: null;
|
|
30
|
+
const renderedText = useMemo(() => renderText(quotedMessageText, quoted_message?.mentioned_users), [quotedMessageText, quoted_message?.mentioned_users, renderText]);
|
|
31
|
+
if (!quoted_message)
|
|
32
|
+
return null;
|
|
30
33
|
if (!quoted_message.poll && !quotedMessageText && !quotedMessageAttachment)
|
|
31
34
|
return null;
|
|
32
35
|
return (React.createElement(React.Fragment, null,
|
|
@@ -38,6 +41,6 @@ export const QuotedMessage = () => {
|
|
|
38
41
|
quoted_message.user && (React.createElement(Avatar, { className: 'str-chat__avatar--quoted-message-sender', image: quoted_message.user.image, name: quoted_message.user.name || quoted_message.user.id, user: quoted_message.user })),
|
|
39
42
|
React.createElement("div", { className: 'str-chat__quoted-message-bubble', "data-testid": 'quoted-message-contents' }, poll ? (React.createElement(Poll, { isQuoted: true, poll: poll })) : (React.createElement(React.Fragment, null,
|
|
40
43
|
quotedMessageAttachment && (React.createElement(Attachment, { attachments: [quotedMessageAttachment], isQuoted: true })),
|
|
41
|
-
React.createElement("div", { className: 'str-chat__quoted-message-bubble__text', "data-testid": 'quoted-message-text' },
|
|
44
|
+
React.createElement("div", { className: 'str-chat__quoted-message-bubble__text', "data-testid": 'quoted-message-text' }, renderedText))))),
|
|
42
45
|
message.attachments?.length ? (React.createElement(Attachment, { attachments: message.attachments })) : null));
|
|
43
46
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
1
|
import type { TFunction } from 'i18next';
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
3
|
import type { ReactionSort, UserResponse } from 'stream-chat';
|
|
4
4
|
import type { PinPermissions, UserEventHandler } from './hooks';
|
|
5
5
|
import type { MessageActionsArray } from './utils';
|
|
@@ -85,7 +85,7 @@ export type MessageProps<StreamChatGenerics extends DefaultStreamChatGenerics =
|
|
|
85
85
|
/** A list of users that have read this Message if the message is the last one and was posted by my user */
|
|
86
86
|
readBy?: UserResponse<StreamChatGenerics>[];
|
|
87
87
|
/** Custom function to render message text content, defaults to the renderText function: [utils](https://github.com/GetStream/stream-chat-react/blob/master/src/utils.ts) */
|
|
88
|
-
renderText?: (text?: string, mentioned_users?: UserResponse<StreamChatGenerics>[], options?: RenderTextOptions) =>
|
|
88
|
+
renderText?: (text?: string, mentioned_users?: UserResponse<StreamChatGenerics>[], options?: RenderTextOptions) => ReactNode;
|
|
89
89
|
/** Custom retry send message handler to override default in [ChannelActionContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_action_context/) */
|
|
90
90
|
retrySendMessage?: ChannelActionContextValue<StreamChatGenerics>['retrySendMessage'];
|
|
91
91
|
/** Comparator function to sort the list of reacted users
|
|
@@ -68,7 +68,8 @@ export const MessageInputFlat = () => {
|
|
|
68
68
|
const displayQuotedMessage = !message && quotedMessage && quotedMessage.parent_id === parent?.id;
|
|
69
69
|
const recordingEnabled = !!(recordingController.recorder && navigator.mediaDevices); // account for requirement on iOS as per this bug report: https://bugs.webkit.org/show_bug.cgi?id=252303
|
|
70
70
|
const isRecording = !!recordingController.recordingState;
|
|
71
|
-
|
|
71
|
+
/**
|
|
72
|
+
* This bit here is needed to make sure that we can get rid of the default behaviour
|
|
72
73
|
* if need be. Essentially this allows us to pass StopAIGenerationButton={null} and
|
|
73
74
|
* completely circumvent the default logic if it's not what we want. We need it as a
|
|
74
75
|
* prop because there is no other trivial way to override the SendMessage button otherwise.
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { StreamMessage } from '../../context/ChannelStateContext';
|
|
3
|
+
import type { MessageContextValue } from '../../context';
|
|
3
4
|
import type { DefaultStreamChatGenerics } from '../../types/types';
|
|
4
5
|
export declare const QuotedMessagePreviewHeader: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>() => React.JSX.Element;
|
|
5
6
|
export type QuotedMessagePreviewProps<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> = {
|
|
6
7
|
quotedMessage: StreamMessage<StreamChatGenerics>;
|
|
8
|
+
renderText?: MessageContextValue<StreamChatGenerics>['renderText'];
|
|
7
9
|
};
|
|
8
|
-
export declare const QuotedMessagePreview: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>({ quotedMessage, }: QuotedMessagePreviewProps<StreamChatGenerics>) => React.JSX.Element | null;
|
|
10
|
+
export declare const QuotedMessagePreview: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>({ quotedMessage, renderText, }: QuotedMessagePreviewProps<StreamChatGenerics>) => React.JSX.Element | null;
|
|
@@ -7,6 +7,7 @@ import { useChatContext } from '../../context/ChatContext';
|
|
|
7
7
|
import { useChannelActionContext } from '../../context/ChannelActionContext';
|
|
8
8
|
import { useComponentContext } from '../../context/ComponentContext';
|
|
9
9
|
import { useTranslationContext } from '../../context/TranslationContext';
|
|
10
|
+
import { renderText as defaultRenderText } from '../Message';
|
|
10
11
|
export const QuotedMessagePreviewHeader = () => {
|
|
11
12
|
const { setQuotedMessage } = useChannelActionContext('QuotedMessagePreview');
|
|
12
13
|
const { t } = useTranslationContext('QuotedMessagePreview');
|
|
@@ -15,12 +16,13 @@ export const QuotedMessagePreviewHeader = () => {
|
|
|
15
16
|
React.createElement("button", { "aria-label": t('aria/Cancel Reply'), className: 'str-chat__quoted-message-remove', onClick: () => setQuotedMessage(undefined) },
|
|
16
17
|
React.createElement(CloseIcon, null))));
|
|
17
18
|
};
|
|
18
|
-
export const QuotedMessagePreview = ({ quotedMessage, }) => {
|
|
19
|
+
export const QuotedMessagePreview = ({ quotedMessage, renderText = defaultRenderText, }) => {
|
|
19
20
|
const { client } = useChatContext();
|
|
20
21
|
const { Attachment = DefaultAttachment, Avatar = DefaultAvatar } = useComponentContext('QuotedMessagePreview');
|
|
21
22
|
const { userLanguage } = useTranslationContext('QuotedMessagePreview');
|
|
22
23
|
const quotedMessageText = quotedMessage.i18n?.[`${userLanguage}_text`] ||
|
|
23
24
|
quotedMessage.text;
|
|
25
|
+
const renderedText = useMemo(() => renderText(quotedMessageText, quotedMessage.mentioned_users), [quotedMessage.mentioned_users, quotedMessageText, renderText]);
|
|
24
26
|
const quotedMessageAttachment = useMemo(() => {
|
|
25
27
|
const [attachment] = quotedMessage.attachments ?? [];
|
|
26
28
|
return attachment ? [attachment] : [];
|
|
@@ -32,6 +34,5 @@ export const QuotedMessagePreview = ({ quotedMessage, }) => {
|
|
|
32
34
|
quotedMessage.user && (React.createElement(Avatar, { className: 'str-chat__avatar--quoted-message-sender', image: quotedMessage.user.image, name: quotedMessage.user.name || quotedMessage.user.id, user: quotedMessage.user })),
|
|
33
35
|
React.createElement("div", { className: 'str-chat__quoted-message-bubble' }, poll ? (React.createElement(Poll, { isQuoted: true, poll: poll })) : (React.createElement(React.Fragment, null,
|
|
34
36
|
!!quotedMessageAttachment.length && (React.createElement(Attachment, { attachments: quotedMessageAttachment, isQuoted: true })),
|
|
35
|
-
React.createElement("div", { className: 'str-chat__quoted-message-text', "data-testid": 'quoted-message-text' },
|
|
36
|
-
React.createElement("p", null, quotedMessageText)))))));
|
|
37
|
+
React.createElement("div", { className: 'str-chat__quoted-message-text', "data-testid": 'quoted-message-text' }, renderedText))))));
|
|
37
38
|
};
|
|
@@ -257,6 +257,9 @@ export function isDateSeparatorMessage(message) {
|
|
|
257
257
|
isDate(message.date));
|
|
258
258
|
}
|
|
259
259
|
export const getIsFirstUnreadMessage = ({ firstUnreadMessageId, isFirstMessage, lastReadDate, lastReadMessageId, message, previousMessage, unreadMessageCount = 0, }) => {
|
|
260
|
+
// prevent showing unread indicator in threads
|
|
261
|
+
if (message.parent_id)
|
|
262
|
+
return false;
|
|
260
263
|
const createdAtTimestamp = message.created_at && new Date(message.created_at).getTime();
|
|
261
264
|
const lastReadTimestamp = lastReadDate?.getTime();
|
|
262
265
|
const messageIsUnread = !!createdAtTimestamp && !!lastReadTimestamp && createdAtTimestamp > lastReadTimestamp;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { PropsWithChildren } from 'react';
|
|
1
|
+
import React, { PropsWithChildren, ReactNode } from 'react';
|
|
2
2
|
import type { Mute, ReactionResponse, ReactionSort, UserResponse } from 'stream-chat';
|
|
3
3
|
import type { ChannelActionContextValue } from './ChannelActionContext';
|
|
4
4
|
import type { StreamMessage } from './ChannelStateContext';
|
|
@@ -103,7 +103,7 @@ export type MessageContextValue<StreamChatGenerics extends DefaultStreamChatGene
|
|
|
103
103
|
/** A list of users that have read this Message */
|
|
104
104
|
readBy?: UserResponse<StreamChatGenerics>[];
|
|
105
105
|
/** Custom function to render message text content, defaults to the renderText function: [utils](https://github.com/GetStream/stream-chat-react/blob/master/src/utils.tsx) */
|
|
106
|
-
renderText?: (text?: string, mentioned_users?: UserResponse<StreamChatGenerics>[], options?: RenderTextOptions) =>
|
|
106
|
+
renderText?: (text?: string, mentioned_users?: UserResponse<StreamChatGenerics>[], options?: RenderTextOptions) => ReactNode;
|
|
107
107
|
/** Comparator function to sort the list of reacted users
|
|
108
108
|
* @deprecated use `reactionDetailsSort` instead
|
|
109
109
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.emoji-mart,.emoji-mart *{box-sizing:border-box;line-height:1.15}.emoji-mart{font-family:-apple-system,BlinkMacSystemFont,"Helvetica Neue",sans-serif;font-size:16px;display:inline-block;color:#222427;border:1px solid #d9d9d9;border-radius:5px;background:#fff}.emoji-mart .emoji-mart-emoji{padding:6px}.emoji-mart-bar{border:0 solid #d9d9d9}.emoji-mart-bar:first-child{border-bottom-width:1px;border-top-left-radius:5px;border-top-right-radius:5px}.emoji-mart-bar:last-child{border-top-width:1px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.emoji-mart-anchors{display:flex;flex-direction:row;justify-content:space-between;padding:0 6px;line-height:0}.emoji-mart-anchor{position:relative;display:block;flex:1 1 auto;color:#858585;text-align:center;padding:12px 4px;overflow:hidden;transition:color .1s ease-out;margin:0;box-shadow:none;background:none;border:none}.emoji-mart-anchor:focus{outline:0}.emoji-mart-anchor:hover,.emoji-mart-anchor:focus,.emoji-mart-anchor-selected{color:#464646}.emoji-mart-anchor-selected .emoji-mart-anchor-bar{bottom:0}.emoji-mart-anchor-bar{position:absolute;bottom:-3px;left:0;width:100%;height:3px;background-color:#464646}.emoji-mart-anchors i{display:inline-block;width:100%;max-width:22px}.emoji-mart-anchors svg,.emoji-mart-anchors img{fill:currentColor;height:18px;width:18px}.emoji-mart-scroll{overflow-y:scroll;overflow-x:hidden;height:270px;padding:0 6px 6px;will-change:transform}.emoji-mart-search{margin-top:6px;padding:0 6px;position:relative}.emoji-mart-search input{font-size:16px;display:block;width:100%;padding:5px 25px 6px 10px;border-radius:5px;border:1px solid #d9d9d9;outline:0}.emoji-mart-search input,.emoji-mart-search input::-webkit-search-decoration,.emoji-mart-search input::-webkit-search-cancel-button,.emoji-mart-search input::-webkit-search-results-button,.emoji-mart-search input::-webkit-search-results-decoration{-webkit-appearance:none}.emoji-mart-search-icon{position:absolute;top:7px;right:11px;z-index:2;padding:2px 5px 1px;border:none;background:none}.emoji-mart-category .emoji-mart-emoji span{z-index:1;position:relative;text-align:center;cursor:default}.emoji-mart-category .emoji-mart-emoji:hover::before{z-index:0;content:"";position:absolute;top:0;left:0;width:100%;height:100%;background-color:#f4f4f4;border-radius:100%}.emoji-mart-category-label{z-index:2;position:relative;position:-webkit-sticky;position:sticky;top:0}.emoji-mart-category-label span{display:block;width:100%;font-weight:500;padding:5px 6px;background-color:#fff;background-color:
|
|
1
|
+
.emoji-mart,.emoji-mart *{box-sizing:border-box;line-height:1.15}.emoji-mart{font-family:-apple-system,BlinkMacSystemFont,"Helvetica Neue",sans-serif;font-size:16px;display:inline-block;color:#222427;border:1px solid #d9d9d9;border-radius:5px;background:#fff}.emoji-mart .emoji-mart-emoji{padding:6px}.emoji-mart-bar{border:0 solid #d9d9d9}.emoji-mart-bar:first-child{border-bottom-width:1px;border-top-left-radius:5px;border-top-right-radius:5px}.emoji-mart-bar:last-child{border-top-width:1px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.emoji-mart-anchors{display:flex;flex-direction:row;justify-content:space-between;padding:0 6px;line-height:0}.emoji-mart-anchor{position:relative;display:block;flex:1 1 auto;color:#858585;text-align:center;padding:12px 4px;overflow:hidden;transition:color .1s ease-out;margin:0;box-shadow:none;background:none;border:none}.emoji-mart-anchor:focus{outline:0}.emoji-mart-anchor:hover,.emoji-mart-anchor:focus,.emoji-mart-anchor-selected{color:#464646}.emoji-mart-anchor-selected .emoji-mart-anchor-bar{bottom:0}.emoji-mart-anchor-bar{position:absolute;bottom:-3px;left:0;width:100%;height:3px;background-color:#464646}.emoji-mart-anchors i{display:inline-block;width:100%;max-width:22px}.emoji-mart-anchors svg,.emoji-mart-anchors img{fill:currentColor;height:18px;width:18px}.emoji-mart-scroll{overflow-y:scroll;overflow-x:hidden;height:270px;padding:0 6px 6px;will-change:transform}.emoji-mart-search{margin-top:6px;padding:0 6px;position:relative}.emoji-mart-search input{font-size:16px;display:block;width:100%;padding:5px 25px 6px 10px;border-radius:5px;border:1px solid #d9d9d9;outline:0}.emoji-mart-search input,.emoji-mart-search input::-webkit-search-decoration,.emoji-mart-search input::-webkit-search-cancel-button,.emoji-mart-search input::-webkit-search-results-button,.emoji-mart-search input::-webkit-search-results-decoration{-webkit-appearance:none}.emoji-mart-search-icon{position:absolute;top:7px;right:11px;z-index:2;padding:2px 5px 1px;border:none;background:none}.emoji-mart-category .emoji-mart-emoji span{z-index:1;position:relative;text-align:center;cursor:default}.emoji-mart-category .emoji-mart-emoji:hover::before{z-index:0;content:"";position:absolute;top:0;left:0;width:100%;height:100%;background-color:#f4f4f4;border-radius:100%}.emoji-mart-category-label{z-index:2;position:relative;position:-webkit-sticky;position:sticky;top:0}.emoji-mart-category-label span{display:block;width:100%;font-weight:500;padding:5px 6px;background-color:#fff;background-color:hsla(0,0%,100%,.95)}.emoji-mart-category-list{margin:0;padding:0}.emoji-mart-category-list li{list-style:none;margin:0;padding:0;display:inline-block}.emoji-mart-emoji{position:relative;display:inline-block;font-size:0;margin:0;padding:0;border:none;background:none;box-shadow:none}.emoji-mart-emoji-native{font-family:"Segoe UI Emoji","Segoe UI Symbol","Segoe UI","Apple Color Emoji","Twemoji Mozilla","Noto Color Emoji","Android Emoji"}.emoji-mart-no-results{font-size:14px;text-align:center;padding-top:70px;color:#858585}.emoji-mart-no-results-img{display:block;margin-left:auto;margin-right:auto;width:50%}.emoji-mart-no-results .emoji-mart-category-label{display:none}.emoji-mart-no-results .emoji-mart-no-results-label{margin-top:.2em}.emoji-mart-no-results .emoji-mart-emoji:hover::before{content:none}.emoji-mart-preview{position:relative;height:70px}.emoji-mart-preview-emoji,.emoji-mart-preview-data,.emoji-mart-preview-skins{position:absolute;top:50%;transform:translateY(-50%)}.emoji-mart-preview-emoji{left:12px}.emoji-mart-preview-data{left:68px;right:12px;word-break:break-all}.emoji-mart-preview-skins{right:30px;text-align:right}.emoji-mart-preview-skins.custom{right:10px;text-align:right}.emoji-mart-preview-name{font-size:14px}.emoji-mart-preview-shortname{font-size:12px;color:#888}.emoji-mart-preview-shortname+.emoji-mart-preview-shortname,.emoji-mart-preview-shortname+.emoji-mart-preview-emoticon,.emoji-mart-preview-emoticon+.emoji-mart-preview-emoticon{margin-left:.5em}.emoji-mart-preview-emoticon{font-size:11px;color:#bbb}.emoji-mart-title span{display:inline-block;vertical-align:middle}.emoji-mart-title .emoji-mart-emoji{padding:0}.emoji-mart-title-label{color:#999a9c;font-size:26px;font-weight:300}.emoji-mart-skin-swatches{font-size:0;padding:2px 0;border:1px solid #d9d9d9;border-radius:12px;background-color:#fff}.emoji-mart-skin-swatches.custom{font-size:0;border:none;background-color:#fff}.emoji-mart-skin-swatches.opened .emoji-mart-skin-swatch{width:16px;padding:0 2px}.emoji-mart-skin-swatches.opened .emoji-mart-skin-swatch.selected::after{opacity:.75}.emoji-mart-skin-swatch{display:inline-block;width:0;vertical-align:middle;transition-property:width,padding;transition-duration:.125s;transition-timing-function:ease-out}.emoji-mart-skin-swatch:nth-child(1){transition-delay:0s}.emoji-mart-skin-swatch:nth-child(2){transition-delay:.03s}.emoji-mart-skin-swatch:nth-child(3){transition-delay:.06s}.emoji-mart-skin-swatch:nth-child(4){transition-delay:.09s}.emoji-mart-skin-swatch:nth-child(5){transition-delay:.12s}.emoji-mart-skin-swatch:nth-child(6){transition-delay:.15s}.emoji-mart-skin-swatch.selected{position:relative;width:16px;padding:0 2px}.emoji-mart-skin-swatch.selected::after{content:"";position:absolute;top:50%;left:50%;width:4px;height:4px;margin:-2px 0 0 -2px;background-color:#fff;border-radius:100%;pointer-events:none;opacity:0;transition:opacity .2s ease-out}.emoji-mart-skin-swatch.custom{display:inline-block;width:0;height:38px;overflow:hidden;vertical-align:middle;transition-property:width,height;transition-duration:.125s;transition-timing-function:ease-out;cursor:default}.emoji-mart-skin-swatch.custom.selected{position:relative;width:36px;height:38px;padding:0 2px 0 0}.emoji-mart-skin-swatch.custom.selected::after{content:"";width:0;height:0}.emoji-mart-skin-swatches.custom .emoji-mart-skin-swatch.custom:hover{background-color:#f4f4f4;border-radius:10%}.emoji-mart-skin-swatches.custom.opened .emoji-mart-skin-swatch.custom{width:36px;height:38px;padding:0 2px 0 0}.emoji-mart-skin-swatches.custom.opened .emoji-mart-skin-swatch.custom.selected::after{opacity:.75}.emoji-mart-skin-text.opened{display:inline-block;vertical-align:middle;text-align:left;color:#888;font-size:11px;padding:5px 2px;width:95px;height:40px;border-radius:10%;background-color:#fff}.emoji-mart-skin{display:inline-block;width:100%;padding-top:100%;max-width:12px;border-radius:100%}.emoji-mart-skin-tone-1{background-color:#ffc93a}.emoji-mart-skin-tone-2{background-color:#fadcbc}.emoji-mart-skin-tone-3{background-color:#e0bb95}.emoji-mart-skin-tone-4{background-color:#bf8f68}.emoji-mart-skin-tone-5{background-color:#9b643d}.emoji-mart-skin-tone-6{background-color:#594539}.emoji-mart-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.emoji-mart-dark{color:#fff;border-color:#555453;background-color:#222}.emoji-mart-dark .emoji-mart-bar{border-color:#555453}.emoji-mart-dark .emoji-mart-search input{color:#fff;border-color:#555453;background-color:#2f2f2f}.emoji-mart-dark .emoji-mart-search-icon svg{fill:#fff}.emoji-mart-dark .emoji-mart-category .emoji-mart-emoji:hover::before{background-color:#444}.emoji-mart-dark .emoji-mart-category-label span{background-color:#222;color:#fff}.emoji-mart-dark .emoji-mart-skin-swatches{border-color:#555453;background-color:#222}.emoji-mart-dark .emoji-mart-anchor:hover,.emoji-mart-dark .emoji-mart-anchor:focus,.emoji-mart-dark .emoji-mart-anchor-selected{color:#bfbfbf}
|