summaryrefslogtreecommitdiffstats
path: root/webapp
diff options
context:
space:
mode:
authorbonespiked <dngreene@gmail.com>2017-03-24 09:09:51 -0400
committerJason Blais <jason@spinpunch.com>2017-03-24 09:09:51 -0400
commit28ad645153b206ba84ddc4935280eaed94bb0138 (patch)
treea5ddcc228b5cfdbd479078873a1bfede9f11cb1f /webapp
parentd0af931e6e57b78432d5527b6e7b0be36c538144 (diff)
downloadchat-28ad645153b206ba84ddc4935280eaed94bb0138.tar.gz
chat-28ad645153b206ba84ddc4935280eaed94bb0138.tar.bz2
chat-28ad645153b206ba84ddc4935280eaed94bb0138.zip
Ticket 4665 - Emoji Picker (#5157)
* #4665 Added EmojiPicker Work primarily by @broernr-de and @harrison on pre-release.mattermost.com * Final fixes to handle custom emojis from internal review and single merge error * ESLint fixes * CSS changes and other code to support emoji picker in reply window * Fix for file upload and emoji picker icon positions on post and comment. RHS emoji picker appearing see-through at this time. * Fix for two ESLint issues. * covered most of feedback: RHS emoji picker looks correct color-wise RHS emoji picker dynamically positions against height of thread size (post + reply messages) escape closes emoji window search box focused on open ESLint fixes against other files oversized emoji preview fixes * Adding in 'outside click' eventing to dismiss the emoji window * Changing some formatting to fix mismatch between my local eslant rules and jenkins. * adding alternative import method due to downstream testing errors * yet another attempt to retain functionality and pass tests - skipping import of browser store * fix for feedback items 5 and 7: * move search to float on top with stylistic changes * whitespace in the header (+1 squashed commit) Squashed commits: [6a26d32] changes that address items 1, 2, 6, 8, and 9 of latest feedback * Fix for attachment preview location on mobile * Fix for latest rounds of feedback * fixing eslint issue * making emojipicker sprite based, fixing alignments * Fix for emoji quality, fixing some behavior (hover background and cursor settings) undoing config changes * Preview feature for emojis * Adjustments to config file, and changing layout/design of attachment and emoji icon. * manual revert from master branch for config.json * reverting paperclip and fixing alignments. Additionally fixing inadvertent display of picker on mobile. * CSS changes to try to fix the hover behavior - currently working for emoji picker (when enabled), but hover for attachment isn't working * Made suggested changes by jwilander except for jQuery removal * Adding hover for both icons * removal of some usages of jQuery * Fix for two layout issues on IE11/Edge * UI improvements for emoji picker * Fix for many minor display issues * fix for additional appearance items * fix to two minor UI items * A little extra padding for IE11 * fix for IE11 scroll issue, and removing align attribute on img tag which was throwing js error * fixes some display issues on firefox * fix for uneven sides of emojis * fix for eslint issues that I didn't introduce * fix for missing bottom edge of RHS emojipicker. also fixing text overlapping icons on text area (including RHS) * Update "emoji selector" to "emoji picker" * changes for code review - removal of ..getDOMNode - use sprite imagery for emoji preview - remove lastBlurAt from state as it wasn't used * fixes for: - fake custom emoji preview in picker - RHS scrollbar on preview * fix for minor alignment of preview emoji
Diffstat (limited to 'webapp')
-rw-r--r--webapp/actions/post_actions.jsx7
-rw-r--r--webapp/components/autosize_textarea.jsx3
-rw-r--r--webapp/components/create_comment.jsx99
-rw-r--r--webapp/components/create_post.jsx98
-rw-r--r--webapp/components/emoji_picker/components/emoji_picker_category.jsx42
-rw-r--r--webapp/components/emoji_picker/components/emoji_picker_item.jsx70
-rw-r--r--webapp/components/emoji_picker/components/emoji_picker_preview.jsx66
-rw-r--r--webapp/components/emoji_picker/emoji_picker.jsx417
-rw-r--r--webapp/components/emoji_picker/emoji_picker_container.jsx46
-rw-r--r--webapp/components/file_upload.jsx43
-rw-r--r--webapp/components/rhs_root_post.jsx5
-rw-r--r--webapp/components/textbox.jsx5
-rw-r--r--webapp/components/user_settings/user_settings_advanced.jsx7
-rwxr-xr-xwebapp/i18n/en.json13
-rw-r--r--webapp/images/emoji/emojilarge.pngbin0 -> 4245270 bytes
-rw-r--r--webapp/images/emoji/img_trans.gifbin0 -> 43 bytes
-rw-r--r--webapp/package.json1
-rw-r--r--webapp/sass/components/_emojisprite.scss3519
-rw-r--r--webapp/sass/components/_emoticons.scss208
-rw-r--r--webapp/sass/components/_module.scss1
-rw-r--r--webapp/sass/layout/_post-right.scss5
-rw-r--r--webapp/sass/layout/_post.scss97
-rw-r--r--webapp/sass/responsive/_mobile.scss16
-rw-r--r--webapp/sass/responsive/_tablet.scss35
-rw-r--r--webapp/stores/emoji_store.jsx49
-rw-r--r--webapp/utils/constants.jsx8
-rw-r--r--webapp/utils/emoji.jsx2
-rw-r--r--webapp/utils/utils.jsx18
28 files changed, 4827 insertions, 53 deletions
diff --git a/webapp/actions/post_actions.jsx b/webapp/actions/post_actions.jsx
index 0c837621f..494cbc454 100644
--- a/webapp/actions/post_actions.jsx
+++ b/webapp/actions/post_actions.jsx
@@ -417,6 +417,13 @@ export function removePostFromStore(post) {
PostStore.emitChange();
}
+export function emitEmojiPosted(emoji) {
+ AppDispatcher.handleServerAction({
+ type: ActionTypes.EMOJI_POSTED,
+ alias: emoji
+ });
+}
+
export function deletePost(channelId, post, success, error) {
Client.deletePost(
channelId,
diff --git a/webapp/components/autosize_textarea.jsx b/webapp/components/autosize_textarea.jsx
index a55a27aef..e14835737 100644
--- a/webapp/components/autosize_textarea.jsx
+++ b/webapp/components/autosize_textarea.jsx
@@ -62,6 +62,7 @@ export default class AutosizeTextarea extends React.Component {
const {
value,
placeholder,
+ id,
...otherProps
} = props;
@@ -77,12 +78,14 @@ export default class AutosizeTextarea extends React.Component {
<div>
<textarea
ref='textarea'
+ id={id + '-textarea'}
{...heightProps}
{...props}
/>
<div style={{height: 0, overflow: 'hidden'}}>
<textarea
ref='reference'
+ id={id + '-reference'}
style={{height: 'auto', width: '100%'}}
disabled={true}
value={value}
diff --git a/webapp/components/create_comment.jsx b/webapp/components/create_comment.jsx
index 96280bbc1..899609ed0 100644
--- a/webapp/components/create_comment.jsx
+++ b/webapp/components/create_comment.jsx
@@ -15,6 +15,7 @@ import Textbox from './textbox.jsx';
import MsgTyping from './msg_typing.jsx';
import FileUpload from './file_upload.jsx';
import FilePreview from './file_preview.jsx';
+import EmojiPicker from './emoji_picker/emoji_picker.jsx';
import * as Utils from 'utils/utils.jsx';
import * as UserAgent from 'utils/user_agent.jsx';
import * as GlobalActions from 'actions/global_actions.jsx';
@@ -28,8 +29,7 @@ import {browserHistory} from 'react-router/es6';
const ActionTypes = Constants.ActionTypes;
const KeyCodes = Constants.KeyCodes;
-import {REACTION_PATTERN} from './create_post.jsx';
-
+import {REACTION_PATTERN, EMOJI_PATTERN} from './create_post.jsx';
import React from 'react';
export default class CreateComment extends React.Component {
@@ -56,6 +56,10 @@ export default class CreateComment extends React.Component {
this.showPostDeletedModal = this.showPostDeletedModal.bind(this);
this.hidePostDeletedModal = this.hidePostDeletedModal.bind(this);
this.handlePostError = this.handlePostError.bind(this);
+ this.handleEmojiPickerClick = this.handleEmojiPickerClick.bind(this);
+ this.handleEmojiClick = this.handleEmojiClick.bind(this);
+ this.onKeyPress = this.onKeyPress.bind(this);
+ this.closeEmoji = this.closeEmoji.bind(this);
PostStore.clearCommentDraftUploads();
MessageHistoryStore.resetHistoryIndex('comment');
@@ -69,24 +73,85 @@ export default class CreateComment extends React.Component {
submitting: false,
ctrlSend: PreferenceStore.getBool(Constants.Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter'),
showPostDeletedModal: false,
- enableAddButton
+ enableAddButton,
+ showEmojiPicker: false,
+ emojiOffset: 0,
+ emojiPickerEnabled: Utils.isFeatureEnabled(Constants.PRE_RELEASE_FEATURES.EMOJI_PICKER_PREVIEW)
};
this.lastBlurAt = 0;
}
+ closeEmoji(clickEvent) {
+ /*
+ if the user clicked something outside the component, except the RHS emojipicker icon
+ and the picker is open, then close it
+ */
+ if (clickEvent && clickEvent.srcElement &&
+ clickEvent.srcElement.className !== '' &&
+ clickEvent.srcElement.className.indexOf('emoji-rhs') === -1 &&
+ this.state.showEmojiPicker) {
+ this.setState({showEmojiPicker: !this.state.showEmojiPicker});
+ }
+ }
+
+ handleEmojiPickerClick() {
+ const threadHeight = document.getElementById('thread--root') ? document.getElementById('thread--root').offsetHeight : 0;
+ const messagesHeight = document.querySelector('div.post-right-comments-container') ? document.querySelector('div.post-right-comments-container').offsetHeight : 0;
+
+ const totalHeight = threadHeight + messagesHeight;
+ let pickerOffset = 0;
+ if (totalHeight > 361) {
+ pickerOffset = -361;
+ } else {
+ pickerOffset = -1 * totalHeight;
+ }
+ this.setState({showEmojiPicker: !this.state.showEmojiPicker, emojiOffset: pickerOffset});
+ }
+
+ handleEmojiClick(emoji) {
+ const emojiAlias = emoji.name || emoji.aliases[0];
+
+ if (!emojiAlias) {
+ //Oops.. There went something wrong
+ return;
+ }
+
+ if (this.state.message === '') {
+ this.setState({message: ':' + emojiAlias + ': ', showEmojiPicker: false});
+ } else {
+ //check whether there is already a blank at the end of the current message
+ const newMessage = (/\s+$/.test(this.state.message)) ?
+ this.state.message + ':' + emojiAlias + ': ' : this.state.message + ' :' + emojiAlias + ': ';
+
+ this.setState({message: newMessage, showEmojiPicker: false});
+ }
+
+ this.focusTextbox();
+ }
+
componentDidMount() {
PreferenceStore.addChangeListener(this.onPreferenceChange);
+ document.addEventListener('keydown', this.onKeyPress);
+
this.focusTextbox();
}
componentWillUnmount() {
PreferenceStore.removeChangeListener(this.onPreferenceChange);
+ document.removeEventListener('keydown', this.onKeyPress);
+ }
+
+ onKeyPress(e) {
+ if (e.which === Constants.KeyCodes.ESCAPE && this.state.showEmojiPicker === true) {
+ this.setState({showEmojiPicker: !this.state.showEmojiPicker});
+ }
}
onPreferenceChange() {
this.setState({
- ctrlSend: PreferenceStore.getBool(Constants.Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter')
+ ctrlSend: PreferenceStore.getBool(Constants.Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter'),
+ emojiPickerEnabled: Utils.isFeatureEnabled(Constants.PRE_RELEASE_FEATURES.EMOJI_PICKER_PREVIEW)
});
}
@@ -205,6 +270,14 @@ export default class CreateComment extends React.Component {
GlobalActions.emitUserCommentedEvent(post);
+ const emojiResult = post.message.match(EMOJI_PATTERN);
+ if (emojiResult) {
+ // parse message and emit emoji event
+ emojiResult.forEach((emoji) => {
+ PostActions.emitEmojiPosted(emoji);
+ });
+ }
+
PostActions.queuePost(post, false, null,
(err) => {
if (err.id === 'api.post.create_post.root_id.app_error') {
@@ -502,6 +575,18 @@ export default class CreateComment extends React.Component {
addButtonClass += ' disabled';
}
+ let emojiPicker = null;
+ if (this.state.showEmojiPicker) {
+ emojiPicker = (
+ <EmojiPicker
+ onEmojiClick={this.handleEmojiClick}
+ topOrBottom='bottom'
+ emojiOffset={this.state.emojiOffset}
+ outsideClick={this.closeEmoji}
+ />
+ );
+ }
+
return (
<form onSubmit={this.handleSubmit}>
<div className='post-create'>
@@ -518,6 +603,7 @@ export default class CreateComment extends React.Component {
value={this.state.message}
onBlur={this.handleBlur}
createMessage={Utils.localizeMessage('create_comment.addComment', 'Add a comment...')}
+ emojiEnabled={this.state.emojiPickerEnabled}
initialText=''
channelId={this.props.channelId}
id='reply_textbox'
@@ -532,7 +618,12 @@ export default class CreateComment extends React.Component {
onUploadError={this.handleUploadError}
postType='comment'
channelId={this.props.channelId}
+ onEmojiClick={this.handleEmojiPickerClick}
+ emojiEnabled={this.state.emojiPickerEnabled}
+ navBarName='rhs'
/>
+
+ {emojiPicker}
</div>
</div>
<MsgTyping
diff --git a/webapp/components/create_post.jsx b/webapp/components/create_post.jsx
index faa880acc..93a299b89 100644
--- a/webapp/components/create_post.jsx
+++ b/webapp/components/create_post.jsx
@@ -8,6 +8,7 @@ import FileUpload from './file_upload.jsx';
import FilePreview from './file_preview.jsx';
import PostDeletedModal from './post_deleted_modal.jsx';
import TutorialTip from './tutorial/tutorial_tip.jsx';
+import EmojiPicker from './emoji_picker/emoji_picker.jsx';
import AppDispatcher from 'dispatcher/app_dispatcher.jsx';
import * as GlobalActions from 'actions/global_actions.jsx';
@@ -36,6 +37,7 @@ const KeyCodes = Constants.KeyCodes;
import React from 'react';
export const REACTION_PATTERN = /^(\+|-):([^:\s]+):\s*$/;
+export const EMOJI_PATTERN = /:[A-Za-z-_0-9]*:/g;
export default class CreatePost extends React.Component {
constructor(props) {
@@ -61,7 +63,10 @@ export default class CreatePost extends React.Component {
this.showPostDeletedModal = this.showPostDeletedModal.bind(this);
this.hidePostDeletedModal = this.hidePostDeletedModal.bind(this);
this.showShortcuts = this.showShortcuts.bind(this);
+ this.handleEmojiClick = this.handleEmojiClick.bind(this);
+ this.handleEmojiPickerClick = this.handleEmojiPickerClick.bind(this);
this.handlePostError = this.handlePostError.bind(this);
+ this.closeEmoji = this.closeEmoji.bind(this);
PostStore.clearDraftUploads();
@@ -77,7 +82,9 @@ export default class CreatePost extends React.Component {
fullWidthTextBox: PreferenceStore.get(Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.CHANNEL_DISPLAY_MODE, Preferences.CHANNEL_DISPLAY_MODE_DEFAULT) === Preferences.CHANNEL_DISPLAY_MODE_FULL_SCREEN,
showTutorialTip: false,
showPostDeletedModal: false,
- enableSendButton: false
+ enableSendButton: false,
+ showEmojiPicker: false,
+ emojiPickerEnabled: Utils.isFeatureEnabled(Constants.PRE_RELEASE_FEATURES.EMOJI_PICKER_PREVIEW)
};
this.lastBlurAt = 0;
@@ -87,6 +94,18 @@ export default class CreatePost extends React.Component {
this.setState({postError});
}
+ closeEmoji(clickEvent) {
+ /*
+ if the user clicked something outside the component, except the main emojipicker icon
+ and the picker is open, then close it
+ */
+ if (clickEvent && clickEvent.srcElement &&
+ clickEvent.srcElement.className.indexOf('emoji-main') === -1 &&
+ this.state.showEmojiPicker) {
+ this.setState({showEmojiPicker: !this.state.showEmojiPicker});
+ }
+ }
+
handleSubmit(e) {
e.preventDefault();
@@ -185,6 +204,14 @@ export default class CreatePost extends React.Component {
GlobalActions.emitUserPostedEvent(post);
+ // parse message and emit emoji event
+ const emojiResult = post.message.match(EMOJI_PATTERN);
+ if (emojiResult) {
+ emojiResult.forEach((emoji) => {
+ PostActions.emitEmojiPosted(emoji);
+ });
+ }
+
PostActions.queuePost(post, false, null,
(err) => {
if (err.id === 'api.post.create_post.root_id.app_error') {
@@ -379,6 +406,10 @@ export default class CreatePost extends React.Component {
}
showShortcuts(e) {
+ if (e.which === Constants.KeyCodes.ESCAPE && this.state.showEmojiPicker === true) {
+ this.setState({showEmojiPicker: !this.state.showEmojiPicker});
+ }
+
if ((e.ctrlKey || e.metaKey) && e.keyCode === Constants.KeyCodes.FORWARD_SLASH) {
e.preventDefault();
const args = {};
@@ -411,7 +442,8 @@ export default class CreatePost extends React.Component {
this.setState({
showTutorialTip: tutorialStep === TutorialSteps.POST_POPOVER,
ctrlSend: PreferenceStore.getBool(Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter'),
- fullWidthTextBox: PreferenceStore.get(Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.CHANNEL_DISPLAY_MODE, Preferences.CHANNEL_DISPLAY_MODE_DEFAULT) === Preferences.CHANNEL_DISPLAY_MODE_FULL_SCREEN
+ fullWidthTextBox: PreferenceStore.get(Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.CHANNEL_DISPLAY_MODE, Preferences.CHANNEL_DISPLAY_MODE_DEFAULT) === Preferences.CHANNEL_DISPLAY_MODE_FULL_SCREEN,
+ emojiPickerEnabled: Utils.isFeatureEnabled(Constants.PRE_RELEASE_FEATURES.EMOJI_PICKER_PREVIEW)
});
}
@@ -484,6 +516,31 @@ export default class CreatePost extends React.Component {
});
}
+ handleEmojiClick(emoji) {
+ const emojiAlias = emoji.name || emoji.aliases[0];
+
+ if (!emojiAlias) {
+ //Oops.. There went something wrong
+ return;
+ }
+
+ if (this.state.message === '') {
+ this.setState({message: ':' + emojiAlias + ': ', showEmojiPicker: false});
+ } else {
+ //check whether there is already a blank at the end of the current message
+ const newMessage = (/\s+$/.test(this.state.message)) ?
+ this.state.message + ':' + emojiAlias + ': ' : this.state.message + ' :' + emojiAlias + ': ';
+
+ this.setState({message: newMessage, showEmojiPicker: false});
+ }
+
+ this.focusTextbox();
+ }
+
+ handleEmojiPickerClick() {
+ this.setState({showEmojiPicker: !this.state.showEmojiPicker});
+ }
+
createTutorialTip() {
const screens = [];
@@ -556,6 +613,17 @@ export default class CreatePost extends React.Component {
if (!this.state.enableSendButton) {
sendButtonClass += ' disabled';
}
+ let emojiPicker = null;
+ if (this.state.showEmojiPicker) {
+ emojiPicker = (
+ <EmojiPicker
+ onEmojiClick={this.handleEmojiClick}
+ topOrBottom='top'
+ outsideClick={this.closeEmoji}
+
+ />
+ );
+ }
return (
<form
@@ -575,22 +643,28 @@ export default class CreatePost extends React.Component {
handlePostError={this.handlePostError}
value={this.state.message}
onBlur={this.handleBlur}
+ emojiEnabled={this.state.emojiPickerEnabled}
createMessage={Utils.localizeMessage('create_post.write', 'Write a message...')}
channelId={this.state.channelId}
id='post_textbox'
ref='textbox'
/>
+ <FileUpload
+ ref='fileUpload'
+ getFileCount={this.getFileCount}
+ onFileUploadChange={this.handleFileUploadChange}
+ onUploadStart={this.handleUploadStart}
+ onFileUpload={this.handleFileUploadComplete}
+ onUploadError={this.handleUploadError}
+ postType='post'
+ channelId=''
+ onEmojiClick={this.handleEmojiPickerClick}
+ emojiEnabled={this.state.emojiPickerEnabled}
+ navBarName='main'
+ />
+
+ {emojiPicker}
</div>
- <FileUpload
- ref='fileUpload'
- getFileCount={this.getFileCount}
- onFileUploadChange={this.handleFileUploadChange}
- onUploadStart={this.handleUploadStart}
- onFileUpload={this.handleFileUploadComplete}
- onUploadError={this.handleUploadError}
- postType='post'
- channelId=''
- />
<a
className={sendButtonClass}
onClick={this.handleSubmit}
diff --git a/webapp/components/emoji_picker/components/emoji_picker_category.jsx b/webapp/components/emoji_picker/components/emoji_picker_category.jsx
new file mode 100644
index 000000000..1d5b12095
--- /dev/null
+++ b/webapp/components/emoji_picker/components/emoji_picker_category.jsx
@@ -0,0 +1,42 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import React from 'react';
+
+export default class EmojiPickerCategory extends React.Component {
+ static propTypes = {
+ category: React.PropTypes.string.isRequired,
+ icon: React.PropTypes.node.isRequired,
+ onCategoryClick: React.PropTypes.func.isRequired,
+ selected: React.PropTypes.bool.isRequired
+ }
+
+ constructor(props) {
+ super(props);
+
+ this.handleClick = this.handleClick.bind(this);
+ }
+
+ handleClick(e) {
+ e.preventDefault();
+
+ this.props.onCategoryClick(this.props.category);
+ }
+
+ render() {
+ let className = 'emoji-picker__category';
+ if (this.props.selected) {
+ className += ' emoji-picker__category--selected';
+ }
+
+ return (
+ <a
+ className={className}
+ href='#'
+ onClick={this.handleClick}
+ >
+ {this.props.icon}
+ </a>
+ );
+ }
+} \ No newline at end of file
diff --git a/webapp/components/emoji_picker/components/emoji_picker_item.jsx b/webapp/components/emoji_picker/components/emoji_picker_item.jsx
new file mode 100644
index 000000000..3f38343fa
--- /dev/null
+++ b/webapp/components/emoji_picker/components/emoji_picker_item.jsx
@@ -0,0 +1,70 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import React from 'react';
+
+import EmojiStore from 'stores/emoji_store.jsx';
+
+export default class EmojiPickerItem extends React.Component {
+ static propTypes = {
+ emoji: React.PropTypes.object.isRequired,
+ onItemOver: React.PropTypes.func.isRequired,
+ onItemOut: React.PropTypes.func.isRequired,
+ onItemClick: React.PropTypes.func.isRequired,
+ onItemUnmount: React.PropTypes.func.isRequired,
+ category: React.PropTypes.string.isRequired
+ }
+
+ constructor(props) {
+ super(props);
+
+ this.handleMouseOver = this.handleMouseOver.bind(this);
+ this.handleMouseOut = this.handleMouseOut.bind(this);
+ this.handleClick = this.handleClick.bind(this);
+ }
+
+ componentWillUnmount() {
+ this.props.onItemUnmount(this.props.emoji);
+ }
+
+ handleMouseOver() {
+ this.props.onItemOver(this.props.emoji);
+ }
+
+ handleMouseOut() {
+ this.props.onItemOut(this.props.emoji);
+ }
+
+ handleClick() {
+ this.props.onItemClick(this.props.emoji);
+ }
+
+ render() {
+ let item = null;
+
+ if (this.props.category === 'recent' || this.props.category === 'custom') {
+ item =
+ (<span>
+ <img
+ className='emoji-picker__item emoticon'
+ onMouseOver={this.handleMouseOver}
+ onMouseOut={this.handleMouseOut}
+ onClick={this.handleClick}
+ src={EmojiStore.getEmojiImageUrl(this.props.emoji)}
+ />
+ </span>);
+ } else {
+ item =
+ (<div >
+ <img
+ src='/static/emoji/img_trans.gif'
+ className={' emojisprite emoji-' + this.props.emoji.filename + ' '}
+ onMouseOver={this.handleMouseOver}
+ onMouseOut={this.handleMouseOut}
+ onClick={this.handleClick}
+ />
+ </div>);
+ }
+ return item;
+ }
+}
diff --git a/webapp/components/emoji_picker/components/emoji_picker_preview.jsx b/webapp/components/emoji_picker/components/emoji_picker_preview.jsx
new file mode 100644
index 000000000..ac3f07025
--- /dev/null
+++ b/webapp/components/emoji_picker/components/emoji_picker_preview.jsx
@@ -0,0 +1,66 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import React from 'react';
+
+import EmojiStore from 'stores/emoji_store.jsx';
+
+import {FormattedMessage} from 'react-intl';
+
+export default class EmojiPickerPreview extends React.Component {
+ static propTypes = {
+ emoji: React.PropTypes.object
+ }
+
+ render() {
+ const emoji = this.props.emoji;
+
+ if (emoji) {
+ let name;
+ let aliases;
+ let previewImage;
+
+ if (emoji.aliases) {
+ // This is a system emoji which only has a list of aliases
+ name = emoji.aliases[0];
+ aliases = emoji.aliases;
+ previewImage = (<span className='sprite-preview'><img
+ src='/static/emoji/img_trans.gif'
+ className={' emojisprite-preview emoji-' + emoji.filename + ' '}
+ align='absmiddle'
+ /></span>);
+ } else {
+ // This is a custom emoji that matches the model on the server
+ name = emoji.name;
+ aliases = [emoji.name];
+ previewImage = (<img
+ className='emoji-picker__preview-image'
+ src={EmojiStore.getEmojiImageUrl(emoji)}
+ />);
+ }
+
+ return (
+ <div className='emoji-picker__preview'>
+ <div className='emoji-picker__preview-image-box'>
+ {previewImage}
+ </div>
+ <div className='emoji-picker__preview-image-box'>
+ <span className='emoji-picker__preview-name'>{name}</span>
+ <span
+ className='emoji-picker__preview-aliases'
+ >{ ':' + aliases[0] + ':'}</span>
+ </div>
+ </div>
+ );
+ }
+
+ return (
+ <div className='emoji-picker__preview emoji-picker__preview-placeholder'>
+ <FormattedMessage
+ id='emoji_picker.emojiPicker'
+ defaultMessage='Emoji Picker'
+ />
+ </div>
+ );
+ }
+}
diff --git a/webapp/components/emoji_picker/emoji_picker.jsx b/webapp/components/emoji_picker/emoji_picker.jsx
new file mode 100644
index 000000000..e12974054
--- /dev/null
+++ b/webapp/components/emoji_picker/emoji_picker.jsx
@@ -0,0 +1,417 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import React from 'react';
+
+import $ from 'jquery';
+import * as Emoji from 'utils/emoji.jsx';
+import EmojiStore from 'stores/emoji_store.jsx';
+import PureRenderMixin from 'react-addons-pure-render-mixin';
+import ReactDOM from 'react-dom';
+import * as Utils from 'utils/utils.jsx';
+import ReactOutsideEvent from 'react-outside-event';
+import {FormattedMessage} from 'react-intl';
+
+import EmojiPickerCategory from './components/emoji_picker_category.jsx';
+import EmojiPickerItem from './components/emoji_picker_item.jsx';
+import EmojiPickerPreview from './components/emoji_picker_preview.jsx';
+
+// This should include all the categories available in Emoji.CategoryNames
+const CATEGORIES = [
+ 'recent',
+ 'people',
+ 'nature',
+ 'food',
+ 'activity',
+ 'travel',
+ 'objects',
+ 'symbols',
+ 'flags',
+ 'custom'
+];
+
+class EmojiPicker extends React.Component {
+ static propTypes = {
+ customEmojis: React.PropTypes.object,
+ onEmojiClick: React.PropTypes.func.isRequired,
+ topOrBottom: React.PropTypes.string.isRequired,
+ emojiOffset: React.PropTypes.number,
+ outsideClick: React.PropTypes.func
+ }
+
+ constructor(props) {
+ super(props);
+
+ // All props are primitives or treated as immutable
+ this.shouldComponentUpdate = PureRenderMixin.shouldComponentUpdate.bind(this);
+
+ this.handleCategoryClick = this.handleCategoryClick.bind(this);
+ this.handleFilterChange = this.handleFilterChange.bind(this);
+ this.handleItemOver = this.handleItemOver.bind(this);
+ this.handleItemOut = this.handleItemOut.bind(this);
+ this.handleItemClick = this.handleItemClick.bind(this);
+ this.handleScroll = this.handleScroll.bind(this);
+ this.handleItemUnmount = this.handleItemUnmount.bind(this);
+ this.renderCategory = this.renderCategory.bind(this);
+ this.onOutsideEvent = this.onOutsideEvent.bind(this);
+
+ this.state = {
+ category: 'recent',
+ filter: '',
+ selected: null
+ };
+ }
+
+ componentDidMount() {
+ this.searchInput.focus();
+ }
+
+ onOutsideEvent = (event) => {
+ // Handle the event.
+ this.props.outsideClick(event);
+ }
+
+ handleCategoryClick(category) {
+ const items = this.refs.items;
+
+ if (category === CATEGORIES[0]) {
+ // First category includes the search box so just scroll to the top
+ items.scrollTop = 0;
+ } else {
+ const cat = this.refs[category];
+ items.scrollTop = cat.offsetTop;
+ }
+ }
+
+ handleFilterChange(e) {
+ this.setState({filter: e.target.value});
+ }
+
+ handleItemOver(emoji) {
+ clearTimeout(this.timeouthandler);
+ this.setState({selected: emoji});
+ }
+
+ handleItemOut() {
+ this.timeouthandler = setTimeout(() => this.setState({selected: null}), 500);
+ }
+
+ handleItemUnmount(emoji) {
+ //Prevent emoji preview from showing emoji which is not present anymore (due to filter)
+ if (this.state.selected === emoji) {
+ this.setState({selected: null});
+ }
+ }
+
+ handleItemClick(emoji) {
+ this.props.onEmojiClick(emoji);
+ }
+
+ handleScroll() {
+ const items = $(ReactDOM.findDOMNode(this.refs.items));
+
+ const contentTop = items.scrollTop();
+ const contentTopPadding = parseInt(items.css('padding-top'), 10);
+ const scrollPct = (contentTop / (items[0].scrollHeight - items[0].clientHeight)) * 100.0;
+
+ if (scrollPct > 99.0) {
+ this.setState({category: 'custom'});
+ return;
+ }
+
+ for (const category of CATEGORIES) {
+ const header = $(ReactDOM.findDOMNode(this.refs[category]));
+ const headerBottomMargin = parseInt(header.css('margin-bottom'), 10) + parseInt(header.css('padding-bottom'), 10);
+ const headerBottom = header[0].offsetTop + header.height() + headerBottomMargin;
+
+ // If category is the first one visible, highlight it in the bar at the top
+ if (headerBottom - contentTopPadding >= contentTop) {
+ if (this.state.category !== category) {
+ this.setState({category: String(category)});
+ }
+
+ break;
+ }
+ }
+ }
+ renderCategory(category, filter) {
+ const items = [];
+ let indices = [];
+ let recentEmojis = [];
+
+ if (category === 'recent') {
+ recentEmojis = EmojiStore.getRecentEmojis();
+ indices = [...Array(recentEmojis.length).keys()];
+
+ // reverse indices so most recently added is first
+ indices.reverse();
+ } else {
+ indices = Emoji.EmojiIndicesByCategory.get(category) || [];
+ }
+
+ for (const index of indices) {
+ let emoji = {};
+ if (category === 'recent') {
+ emoji = recentEmojis[index];
+ } else {
+ emoji = Emoji.Emojis[index];
+ }
+ if (filter) {
+ let matches = false;
+
+ for (const alias of emoji.aliases || [...emoji.name]) {
+ if (alias.indexOf(filter) !== -1) {
+ matches = true;
+ break;
+ }
+ }
+
+ if (!matches) {
+ continue;
+ }
+ }
+
+ items.push(
+ <EmojiPickerItem
+ key={'system_' + (category === 'recent' ? 'recent_' : '') + (emoji.name || emoji.aliases[0])}
+ emoji={emoji}
+ category={category}
+ onItemOver={this.handleItemOver}
+ onItemOut={this.handleItemOut}
+ onItemClick={this.handleItemClick}
+ onItemUnmount={this.handleItemUnmount}
+ />
+ );
+ }
+
+ if (category === 'custom') {
+ const customEmojis = EmojiStore.getCustomEmojiMap().values();
+
+ for (const emoji of customEmojis) {
+ if (filter && emoji.name.indexOf(filter) === -1) {
+ continue;
+ }
+
+ items.push(
+ <EmojiPickerItem
+ key={'custom_' + emoji.name}
+ emoji={emoji}
+ category={category}
+ onItemOver={this.handleItemOver}
+ onItemOut={this.handleItemOut}
+ onItemClick={this.handleItemClick}
+ onItemUnmount={this.handleItemUnmount}
+
+ />
+ );
+ }
+ }
+
+ // Only render the header if there's any visible items
+ let header = null;
+ if (items.length > 0) {
+ header = (
+ <div
+ className='emoji-picker__category-header'
+ >
+ <FormattedMessage id={'emoji_picker.' + category}/>
+ </div>
+ );
+ }
+
+ return (
+ <div
+ key={'category_' + category}
+ id={'emojipickercat-' + category}
+ ref={category}
+ >
+ {header}
+ <div className='emoji-picker-items__container'>
+ {items}
+ </div>
+ </div>
+ );
+ }
+
+ renderPreview(selected) {
+ if (selected) {
+ let name;
+ let aliases;
+ let previewImage;
+ if (selected.name) {
+ // This is a custom emoji that matches the model on the server
+ name = selected.name;
+ aliases = [selected.name];
+ previewImage = (<img
+ className='emoji-picker__preview-image'
+ align='absmiddle'
+ src={EmojiStore.getEmojiImageUrl(selected)}
+ />);
+ } else {
+ // This is a system emoji which only has a list of aliases
+ name = selected.aliases[0];
+ aliases = selected.aliases;
+ previewImage = (<span ><img
+ src='/static/emoji/img_trans.gif'
+ className={' emojisprite-preview emoji-' + selected.filename + ' '}
+ align='absmiddle'
+ /></span>);
+ }
+
+ return (
+ <div className='emoji-picker__preview'>
+ {previewImage}
+ <span className='emoji-picker__preview-name'>{name}</span>
+ <span className='emoji-picker__preview-aliases'>{aliases.map((alias) => ':' + alias + ':').join(' ')}</span>
+ </div>
+ );
+ }
+
+ return (
+ <span className='emoji-picker__preview-placeholder'>
+ <FormattedMessage
+ id='emoji_picker.emojiPicker'
+ defaultMessage='Emoji Picker'
+ />
+ </span>
+ );
+ }
+
+ render() {
+ const items = [];
+
+ for (const category of CATEGORIES) {
+ if (category === 'custom') {
+ items.push(this.renderCategory('custom', this.state.filter, this.props.customEmojis));
+ } else {
+ items.push(this.renderCategory(category, this.state.filter));
+ }
+ }
+ const cssclass = this.props.topOrBottom === 'top' ? 'emoji-picker' : 'emoji-picker-bottom';
+ const pickerStyle = this.props.emojiOffset ? {top: this.props.emojiOffset} : {};
+ return (
+ <div
+ style={pickerStyle}
+ className={cssclass}
+ >
+ <div className='emoji-picker__categories'>
+ <EmojiPickerCategory
+ category='recent'
+ icon={<i
+ className='fa fa-clock-o'
+ title={Utils.localizeMessage('emoji_picker.recent', 'Recently Used')}
+ />}
+ onCategoryClick={this.handleCategoryClick}
+ selected={this.state.category === 'recent'}
+ />
+ <EmojiPickerCategory
+ category='people'
+ icon={<i
+ className='fa fa-smile-o'
+ title={Utils.localizeMessage('emoji_picker.people', 'People')}
+ />}
+ onCategoryClick={this.handleCategoryClick}
+ selected={this.state.category === 'people'}
+ />
+ <EmojiPickerCategory
+ category='nature'
+ icon={<i
+ className='fa fa-leaf'
+ title={Utils.localizeMessage('emoji_picker.nature', 'Nature')}
+ />}
+ onCategoryClick={this.handleCategoryClick}
+ selected={this.state.category === 'nature'}
+ />
+ <EmojiPickerCategory
+ category='food'
+ icon={<i
+ className='fa fa-cutlery'
+ title={Utils.localizeMessage('emoji_picker.food', 'Food')}
+ />}
+ onCategoryClick={this.handleCategoryClick}
+ selected={this.state.category === 'food'}
+ />
+ <EmojiPickerCategory
+ category='activity'
+ icon={<i
+ className='fa fa-futbol-o'
+ title={Utils.localizeMessage('emoji_picker.activity', 'Activity')}
+ />}
+ onCategoryClick={this.handleCategoryClick}
+ selected={this.state.category === 'activity'}
+ />
+ <EmojiPickerCategory
+ category='travel'
+ icon={<i
+ className='fa fa-plane'
+ title={Utils.localizeMessage('emoji_picker.travel', 'Travel')}
+ />}
+ onCategoryClick={this.handleCategoryClick}
+ selected={this.state.category === 'travel'}
+ />
+ <EmojiPickerCategory
+ category='objects'
+ icon={<i
+ className='fa fa-lightbulb-o'
+ title={Utils.localizeMessage('emoji_picker.objects', 'Objects')}
+ />}
+ onCategoryClick={this.handleCategoryClick}
+ selected={this.state.category === 'objects'}
+ />
+ <EmojiPickerCategory
+ category='symbols'
+ icon={<i
+ className='fa fa-heart-o'
+ title={Utils.localizeMessage('emoji_picker.symbols', 'Symbols')}
+ />}
+ onCategoryClick={this.handleCategoryClick}
+ selected={this.state.category === 'symbols'}
+ />
+ <EmojiPickerCategory
+ category='flags'
+ icon={<i
+ className='fa fa-flag-o'
+ title={Utils.localizeMessage('emoji_picker.flags', 'Flags')}
+ />}
+ onCategoryClick={this.handleCategoryClick}
+ selected={this.state.category === 'flags'}
+ />
+ <EmojiPickerCategory
+ category='custom'
+ icon={<i
+ className='fa fa-at'
+ title={Utils.localizeMessage('emoji_picker.custom', 'Custom')}
+ />}
+ onCategoryClick={this.handleCategoryClick}
+ selected={this.state.category === 'custom'}
+ />
+ </div>
+ <div className='emoji-picker__search-container'>
+ <span className='fa fa-search emoji-picker__search-icon'/>
+ <input
+ ref={(input) => {
+ this.searchInput = input;
+ }}
+ className='emoji-picker__search'
+ type='text'
+ onChange={this.handleFilterChange}
+ placeholder={Utils.localizeMessage('emoji_picker.search', 'search')}
+ />
+ </div>
+ <div
+ ref='items'
+ id='emojipickeritems'
+ className='emoji-picker__items'
+ onScroll={this.handleScroll}
+ >
+ {items}
+ </div>
+ <EmojiPickerPreview emoji={this.state.selected}/>
+ </div>
+ );
+ }
+}
+
+// disabling eslint check for outslide click handler
+// eslint-disable-next-line new-cap
+export default ReactOutsideEvent(EmojiPicker, ['click']);
diff --git a/webapp/components/emoji_picker/emoji_picker_container.jsx b/webapp/components/emoji_picker/emoji_picker_container.jsx
new file mode 100644
index 000000000..7cdc0e4b9
--- /dev/null
+++ b/webapp/components/emoji_picker/emoji_picker_container.jsx
@@ -0,0 +1,46 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import React from 'react';
+
+import EmojiStore from 'stores/emoji_store.jsx';
+
+import EmojiPicker from './emoji_picker.jsx';
+
+export default class EmojiPickerContainer extends React.Component {
+ static propTypes = {
+ onEmojiClick: React.PropTypes.func.isRequred
+ }
+
+ constructor(props) {
+ super(props);
+ this.handleEmojiChange = this.handleEmojiChange.bind(this);
+
+ this.state = {
+ customEmojis: EmojiStore.getCustomEmojiMap().values() ? EmojiStore.getCustomEmojiMap().values() : []
+ };
+ }
+
+ componentDidMount() {
+ EmojiStore.addChangeListener(this.handleEmojiChange);
+ }
+
+ componentWillUnount() {
+ EmojiStore.removeChangeListener(this.handleEmojiChange);
+ }
+
+ handleEmojiChange() {
+ this.setState({
+ customEmojis: EmojiStore.getCustomEmojiMap().values()
+ });
+ }
+
+ render() {
+ return (
+ <EmojiPicker
+ customEmojis={EmojiStore.getCustomEmojiMap().values()}
+ onEmojiClick={this.props.onEmojiClick}
+ />
+ );
+ }
+}
diff --git a/webapp/components/file_upload.jsx b/webapp/components/file_upload.jsx
index e1535c0bb..297095e0a 100644
--- a/webapp/components/file_upload.jsx
+++ b/webapp/components/file_upload.jsx
@@ -49,6 +49,7 @@ class FileUpload extends React.Component {
this.pasteUpload = this.pasteUpload.bind(this);
this.keyUpload = this.keyUpload.bind(this);
this.handleMaxUploadReached = this.handleMaxUploadReached.bind(this);
+ this.emojiClick = this.emojiClick.bind(this);
this.state = {
requests: {}
@@ -210,7 +211,9 @@ class FileUpload extends React.Component {
// jquery-dragster doesn't provide a function to unregister itself so do it manually
target.off('dragenter dragleave dragover drop dragster:enter dragster:leave dragster:over dragster:drop');
}
-
+ emojiClick() {
+ this.props.onEmojiClick();
+ }
pasteUpload(e) {
var inputDiv = ReactDOM.findDOMNode(this.refs.input);
const {formatMessage} = this.props.intl;
@@ -347,24 +350,33 @@ class FileUpload extends React.Component {
const channelId = this.props.channelId || ChannelStore.getCurrentId();
const uploadsRemaining = Constants.MAX_UPLOAD_FILES - this.props.getFileCount(channelId);
+ const emojiSpan = (<span
+ className={'fa fa-smile-o icon--emoji-picker emoji-' + this.props.navBarName}
+ onClick={this.emojiClick}
+ />);
+ const filestyle = {visibility: 'hidden'};
return (
<span
ref='input'
className={'btn btn-file' + (uploadsRemaining <= 0 ? ' btn-file__disabled' : '')}
>
- <span
- className='icon'
- dangerouslySetInnerHTML={{__html: Constants.ATTACHMENT_ICON_SVG}}
- />
- <input
- ref='fileInput'
- type='file'
- onChange={this.handleChange}
- onClick={uploadsRemaining > 0 ? this.props.onClick : this.handleMaxUploadReached}
- multiple={multiple}
- accept={accept}
- />
+ <div className='icon--attachment'>
+ <span
+ dangerouslySetInnerHTML={{__html: Constants.ATTACHMENT_ICON_SVG}}
+ onClick={() => this.refs.fileInput.click()}
+ />
+ <input
+ ref='fileInput'
+ type='file'
+ style={filestyle}
+ onChange={this.handleChange}
+ onClick={uploadsRemaining > 0 ? this.props.onClick : this.handleMaxUploadReached}
+ multiple={multiple}
+ accept={accept}
+ />
+ </div>
+ {this.props.emojiEnabled ? emojiSpan : ''}
</span>
);
}
@@ -380,7 +392,10 @@ FileUpload.propTypes = {
onFileUploadChange: React.PropTypes.func,
onTextDrop: React.PropTypes.func,
channelId: React.PropTypes.string,
- postType: React.PropTypes.string
+ postType: React.PropTypes.string,
+ onEmojiClick: React.PropTypes.func,
+ navBarName: React.PropTypes.string,
+ emojiEnabled: React.PropTypes.bool
};
export default injectIntl(FileUpload, {withRef: true});
diff --git a/webapp/components/rhs_root_post.jsx b/webapp/components/rhs_root_post.jsx
index 83d930bca..231033fb1 100644
--- a/webapp/components/rhs_root_post.jsx
+++ b/webapp/components/rhs_root_post.jsx
@@ -517,7 +517,10 @@ export default class RhsRootPost extends React.Component {
};
return (
- <div className={'post post--root post--thread ' + userCss + ' ' + systemMessageClass + ' ' + compactClass}>
+ <div
+ id='thread--root'
+ className={'post post--root post--thread ' + userCss + ' ' + systemMessageClass + ' ' + compactClass}
+ >
<div className='post-right-channel__name'>{channelName}</div>
<div className='post__content'>
{profilePicContainer}
diff --git a/webapp/components/textbox.jsx b/webapp/components/textbox.jsx
index f1f6d2a0a..7f3dc1891 100644
--- a/webapp/components/textbox.jsx
+++ b/webapp/components/textbox.jsx
@@ -32,7 +32,8 @@ export default class Textbox extends React.Component {
onBlur: React.PropTypes.func,
supportsCommands: React.PropTypes.bool.isRequired,
handlePostError: React.PropTypes.func,
- suggestionListStyle: React.PropTypes.string
+ suggestionListStyle: React.PropTypes.string,
+ emojiEnabled: React.PropTypes.bool
};
static defaultProps = {
@@ -249,7 +250,7 @@ export default class Textbox extends React.Component {
<SuggestionBox
id={this.props.id}
ref='message'
- className={`form-control custom-textarea ${this.state.connection}`}
+ className={`form-control custom-textarea${this.props.emojiEnabled ? '-emoji' : ''} ${this.state.connection}`}
type='textarea'
spellCheck='true'
placeholder={this.props.createMessage}
diff --git a/webapp/components/user_settings/user_settings_advanced.jsx b/webapp/components/user_settings/user_settings_advanced.jsx
index 970856acc..cf05ab402 100644
--- a/webapp/components/user_settings/user_settings_advanced.jsx
+++ b/webapp/components/user_settings/user_settings_advanced.jsx
@@ -351,6 +351,13 @@ export default class AdvancedSettingsDisplay extends React.Component {
defaultMessage='Enable the ability to make and receive one-on-one WebRTC calls'
/>
);
+ case 'EMOJI_PICKER_PREVIEW':
+ return (
+ <FormattedMessage
+ id='user.settings.advance.emojipicker'
+ defaultMessage='Enable the emoji picker'
+ />
+ );
default:
return null;
}
diff --git a/webapp/i18n/en.json b/webapp/i18n/en.json
index 07cccd65c..05abf6ae2 100755
--- a/webapp/i18n/en.json
+++ b/webapp/i18n/en.json
@@ -1287,6 +1287,18 @@
"emoji_list.name": "Name",
"emoji_list.search": "Search Custom Emoji",
"emoji_list.somebody": "Somebody on another team",
+ "emoji_picker.activity": "Activity",
+ "emoji_picker.custom": "Custom",
+ "emoji_picker.emojiPicker": "Emoji Picker",
+ "emoji_picker.flags": "Flags",
+ "emoji_picker.food": "Food",
+ "emoji_picker.nature": "Nature",
+ "emoji_picker.objects": "Objects",
+ "emoji_picker.people": "People",
+ "emoji_picker.recent": "Recently Used",
+ "emoji_picker.search": "Search",
+ "emoji_picker.symbols": "Symbols",
+ "emoji_picker.travel": "Travel",
"error.not_found.link_message": "Back to Mattermost",
"error.not_found.message": "The page you were trying to reach does not exist",
"error.not_found.title": "Page not found",
@@ -1989,6 +2001,7 @@
"user.settings.advance.slashCmd_autocmp": "Enable external application to offer slash command autocomplete",
"user.settings.advance.title": "Advanced Settings",
"user.settings.advance.webrtc_preview": "Enable the ability to make and receive one-on-one WebRTC calls",
+ "user.settings.advance.emojipicker": "Enable emoji picker in message input box",
"user.settings.custom_theme.awayIndicator": "Away Indicator",
"user.settings.custom_theme.buttonBg": "Button BG",
"user.settings.custom_theme.buttonColor": "Button Text",
diff --git a/webapp/images/emoji/emojilarge.png b/webapp/images/emoji/emojilarge.png
new file mode 100644
index 000000000..fd230ab6d
--- /dev/null
+++ b/webapp/images/emoji/emojilarge.png
Binary files differ
diff --git a/webapp/images/emoji/img_trans.gif b/webapp/images/emoji/img_trans.gif
new file mode 100644
index 000000000..35d42e808
--- /dev/null
+++ b/webapp/images/emoji/img_trans.gif
Binary files differ
diff --git a/webapp/package.json b/webapp/package.json
index 9f53c848f..0d79b1430 100644
--- a/webapp/package.json
+++ b/webapp/package.json
@@ -75,6 +75,7 @@
"react-dom": "15.4.2",
"sass-loader": "6.0.3",
"style-loader": "0.13.2",
+ "react-outside-event": "1.2.4",
"url-loader": "0.5.8",
"webpack": "2.2.1",
"webpack-node-externals": "1.5.4"
diff --git a/webapp/sass/components/_emojisprite.scss b/webapp/sass/components/_emojisprite.scss
new file mode 100644
index 000000000..5a2bd0e58
--- /dev/null
+++ b/webapp/sass/components/_emojisprite.scss
@@ -0,0 +1,3519 @@
+@charset "UTF-8";
+
+.emojisprite-preview {
+ @include transform(scale(.55));
+ background-image: url(../images/emoji/emojilarge.png);
+ background-repeat: no-repeat;
+ cursor: pointer;
+ height: 64px;
+ max-width: none;
+ transform-origin: 0 0;
+ width: 64px;
+ padding: 0 10px 0 0;
+
+
+}
+
+
+
+
+.emojisprite {
+ @include transform(scale(.35));
+ background-image: url(../images/emoji/emojilarge.png);
+ background-repeat: no-repeat;
+ border-radius: 18px;
+ cursor: pointer;
+ height: 64px;
+ max-width: none;
+ transform-origin: 0 0;
+ width: 64px;
+
+}
+
+.emoji-0023-20e3 {
+ background-position: -2px -2px;
+}
+
+.emoji-0030-20e3 {
+ background-position: -70px -2px;
+}
+
+.emoji-0031-20e3 {
+ background-position: -138px -2px;
+}
+
+.emoji-0032-20e3 {
+ background-position: -206px -2px;
+}
+
+.emoji-0033-20e3 {
+ background-position: -274px -2px;
+}
+
+.emoji-0034-20e3 {
+ background-position: -342px -2px;
+}
+
+.emoji-0035-20e3 {
+ background-position: -410px -2px;
+}
+
+.emoji-0036-20e3 {
+ background-position: -478px -2px;
+}
+
+.emoji-0037-20e3 {
+ background-position: -546px -2px;
+}
+
+.emoji-0038-20e3 {
+ background-position: -614px -2px;
+}
+
+.emoji-0039-20e3 {
+ background-position: -682px -2px;
+}
+
+.emoji-00a9 {
+ background-position: -750px -2px;
+}
+
+.emoji-00ae {
+ background-position: -818px -2px;
+}
+
+.emoji-1f004 {
+ background-position: -886px -2px;
+}
+
+.emoji-1f0cf {
+ background-position: -954px -2px;
+}
+
+.emoji-1f170 {
+ background-position: -1022px -2px;
+}
+
+.emoji-1f171 {
+ background-position: -1090px -2px;
+}
+
+.emoji-1f17e {
+ background-position: -1158px -2px;
+}
+
+.emoji-1f17f {
+ background-position: -1226px -2px;
+}
+
+.emoji-1f18e {
+ background-position: -1294px -2px;
+}
+
+.emoji-1f191 {
+ background-position: -1362px -2px;
+}
+
+.emoji-1f192 {
+ background-position: -1430px -2px;
+}
+
+.emoji-1f193 {
+ background-position: -1498px -2px;
+}
+
+.emoji-1f194 {
+ background-position: -1566px -2px;
+}
+
+.emoji-1f195 {
+ background-position: -1634px -2px;
+}
+
+.emoji-1f196 {
+ background-position: -1702px -2px;
+}
+
+.emoji-1f197 {
+ background-position: -1770px -2px;
+}
+
+.emoji-1f198 {
+ background-position: -1838px -2px;
+}
+
+.emoji-1f199 {
+ background-position: -1906px -2px;
+}
+
+.emoji-1f19a {
+ background-position: -2px -70px;
+}
+
+.emoji-1f1e8-1f1e6 {
+ background-position: -70px -70px;
+}
+
+.emoji-1f1e8-1f1f3 {
+ background-position: -138px -70px;
+}
+
+.emoji-1f1e9-1f1ea {
+ background-position: -206px -70px;
+}
+
+.emoji-1f1ea-1f1f8 {
+ background-position: -274px -70px;
+}
+
+.emoji-1f1eb-1f1f7 {
+ background-position: -342px -70px;
+}
+
+.emoji-1f1ec-1f1e7 {
+ background-position: -410px -70px;
+}
+
+.emoji-1f1ee-1f1f9 {
+ background-position: -478px -70px;
+}
+
+.emoji-1f1ef-1f1f5 {
+ background-position: -546px -70px;
+}
+
+.emoji-1f1f0-1f1f7 {
+ background-position: -614px -70px;
+}
+
+.emoji-1f1f5-1f1f0 {
+ background-position: -682px -70px;
+}
+
+.emoji-1f1f7-1f1fa {
+ background-position: -750px -70px;
+}
+
+.emoji-1f1fa-1f1f8 {
+ background-position: -818px -70px;
+}
+
+.emoji-1f1ff-1f1e6 {
+ background-position: -886px -70px;
+}
+
+.emoji-1f201 {
+ background-position: -954px -70px;
+}
+
+.emoji-1f202 {
+ background-position: -1022px -70px;
+}
+
+.emoji-1f21a {
+ background-position: -1090px -70px;
+}
+
+.emoji-1f22f {
+ background-position: -1158px -70px;
+}
+
+.emoji-1f232 {
+ background-position: -1226px -70px;
+}
+
+.emoji-1f233 {
+ background-position: -1294px -70px;
+}
+
+.emoji-1f234 {
+ background-position: -1362px -70px;
+}
+
+.emoji-1f235 {
+ background-position: -1430px -70px;
+}
+
+.emoji-1f236 {
+ background-position: -1498px -70px;
+}
+
+.emoji-1f237 {
+ background-position: -1566px -70px;
+}
+
+.emoji-1f238 {
+ background-position: -1634px -70px;
+}
+
+.emoji-1f239 {
+ background-position: -1702px -70px;
+}
+
+.emoji-1f23a {
+ background-position: -1770px -70px;
+}
+
+.emoji-1f250 {
+ background-position: -1838px -70px;
+}
+
+.emoji-1f251 {
+ background-position: -1906px -70px;
+}
+
+.emoji-1f300 {
+ background-position: -2px -138px;
+}
+
+.emoji-1f301 {
+ background-position: -70px -138px;
+}
+
+.emoji-1f302 {
+ background-position: -138px -138px;
+}
+
+.emoji-1f303 {
+ background-position: -206px -138px;
+}
+
+.emoji-1f304 {
+ background-position: -274px -138px;
+}
+
+.emoji-1f305 {
+ background-position: -342px -138px;
+}
+
+.emoji-1f306 {
+ background-position: -410px -138px;
+}
+
+.emoji-1f307 {
+ background-position: -478px -138px;
+}
+
+.emoji-1f308 {
+ background-position: -546px -138px;
+}
+
+.emoji-1f309 {
+ background-position: -614px -138px;
+}
+
+.emoji-1f30a {
+ background-position: -682px -138px;
+}
+
+.emoji-1f30b {
+ background-position: -750px -138px;
+}
+
+.emoji-1f30c {
+ background-position: -818px -138px;
+}
+
+.emoji-1f30d {
+ background-position: -886px -138px;
+}
+
+.emoji-1f30e {
+ background-position: -954px -138px;
+}
+
+.emoji-1f30f {
+ background-position: -1022px -138px;
+}
+
+.emoji-1f310 {
+ background-position: -1090px -138px;
+}
+
+.emoji-1f311 {
+ background-position: -1158px -138px;
+}
+
+.emoji-1f312 {
+ background-position: -1226px -138px;
+}
+
+.emoji-1f313 {
+ background-position: -1294px -138px;
+}
+
+.emoji-1f314 {
+ background-position: -1362px -138px;
+}
+
+.emoji-1f315 {
+ background-position: -1430px -138px;
+}
+
+.emoji-1f316 {
+ background-position: -1498px -138px;
+}
+
+.emoji-1f317 {
+ background-position: -1566px -138px;
+}
+
+.emoji-1f318 {
+ background-position: -1634px -138px;
+}
+
+.emoji-1f319 {
+ background-position: -1702px -138px;
+}
+
+.emoji-1f31a {
+ background-position: -1770px -138px;
+}
+
+.emoji-1f31b {
+ background-position: -1838px -138px;
+}
+
+.emoji-1f31c {
+ background-position: -1906px -138px;
+}
+
+.emoji-1f31d {
+ background-position: -2px -206px;
+}
+
+.emoji-1f31e {
+ background-position: -70px -206px;
+}
+
+.emoji-1f31f {
+ background-position: -138px -206px;
+}
+
+.emoji-1f320 {
+ background-position: -206px -206px;
+}
+
+.emoji-1f330 {
+ background-position: -274px -206px;
+}
+
+.emoji-1f331 {
+ background-position: -342px -206px;
+}
+
+.emoji-1f332 {
+ background-position: -410px -206px;
+}
+
+.emoji-1f333 {
+ background-position: -478px -206px;
+}
+
+.emoji-1f334 {
+ background-position: -546px -206px;
+}
+
+.emoji-1f335 {
+ background-position: -614px -206px;
+}
+
+.emoji-1f337 {
+ background-position: -682px -206px;
+}
+
+.emoji-1f338 {
+ background-position: -750px -206px;
+}
+
+.emoji-1f339 {
+ background-position: -818px -206px;
+}
+
+.emoji-1f33a {
+ background-position: -886px -206px;
+}
+
+.emoji-1f33b {
+ background-position: -954px -206px;
+}
+
+.emoji-1f33c {
+ background-position: -1022px -206px;
+}
+
+.emoji-1f33d {
+ background-position: -1090px -206px;
+}
+
+.emoji-1f33e {
+ background-position: -1158px -206px;
+}
+
+.emoji-1f33f {
+ background-position: -1226px -206px;
+}
+
+.emoji-1f340 {
+ background-position: -1294px -206px;
+}
+
+.emoji-1f341 {
+ background-position: -1362px -206px;
+}
+
+.emoji-1f342 {
+ background-position: -1430px -206px;
+}
+
+.emoji-1f343 {
+ background-position: -1498px -206px;
+}
+
+.emoji-1f344 {
+ background-position: -1566px -206px;
+}
+
+.emoji-1f345 {
+ background-position: -1634px -206px;
+}
+
+.emoji-1f346 {
+ background-position: -1702px -206px;
+}
+
+.emoji-1f347 {
+ background-position: -1770px -206px;
+}
+
+.emoji-1f348 {
+ background-position: -1838px -206px;
+}
+
+.emoji-1f349 {
+ background-position: -1906px -206px;
+}
+
+.emoji-1f34a {
+ background-position: -2px -274px;
+}
+
+.emoji-1f34b {
+ background-position: -70px -274px;
+}
+
+.emoji-1f34c {
+ background-position: -138px -274px;
+}
+
+.emoji-1f34d {
+ background-position: -206px -274px;
+}
+
+.emoji-1f34e {
+ background-position: -274px -274px;
+}
+
+.emoji-1f34f {
+ background-position: -342px -274px;
+}
+
+.emoji-1f350 {
+ background-position: -410px -274px;
+}
+
+.emoji-1f351 {
+ background-position: -478px -274px;
+}
+
+.emoji-1f352 {
+ background-position: -546px -274px;
+}
+
+.emoji-1f353 {
+ background-position: -614px -274px;
+}
+
+.emoji-1f354 {
+ background-position: -682px -274px;
+}
+
+.emoji-1f355 {
+ background-position: -750px -274px;
+}
+
+.emoji-1f356 {
+ background-position: -818px -274px;
+}
+
+.emoji-1f357 {
+ background-position: -886px -274px;
+}
+
+.emoji-1f358 {
+ background-position: -954px -274px;
+}
+
+.emoji-1f359 {
+ background-position: -1022px -274px;
+}
+
+.emoji-1f35a {
+ background-position: -1090px -274px;
+}
+
+.emoji-1f35b {
+ background-position: -1158px -274px;
+}
+
+.emoji-1f35c {
+ background-position: -1226px -274px;
+}
+
+.emoji-1f35d {
+ background-position: -1294px -274px;
+}
+
+.emoji-1f35e {
+ background-position: -1362px -274px;
+}
+
+.emoji-1f35f {
+ background-position: -1430px -274px;
+}
+
+.emoji-1f360 {
+ background-position: -1498px -274px;
+}
+
+.emoji-1f361 {
+ background-position: -1566px -274px;
+}
+
+.emoji-1f362 {
+ background-position: -1634px -274px;
+}
+
+.emoji-1f363 {
+ background-position: -1702px -274px;
+}
+
+.emoji-1f364 {
+ background-position: -1770px -274px;
+}
+
+.emoji-1f365 {
+ background-position: -1838px -274px;
+}
+
+.emoji-1f366 {
+ background-position: -1906px -274px;
+}
+
+.emoji-1f367 {
+ background-position: -2px -342px;
+}
+
+.emoji-1f368 {
+ background-position: -70px -342px;
+}
+
+.emoji-1f369 {
+ background-position: -138px -342px;
+}
+
+.emoji-1f36a {
+ background-position: -206px -342px;
+}
+
+.emoji-1f36b {
+ background-position: -274px -342px;
+}
+
+.emoji-1f36c {
+ background-position: -342px -342px;
+}
+
+.emoji-1f36d {
+ background-position: -410px -342px;
+}
+
+.emoji-1f36e {
+ background-position: -478px -342px;
+}
+
+.emoji-1f36f {
+ background-position: -546px -342px;
+}
+
+.emoji-1f370 {
+ background-position: -614px -342px;
+}
+
+.emoji-1f371 {
+ background-position: -682px -342px;
+}
+
+.emoji-1f372 {
+ background-position: -750px -342px;
+}
+
+.emoji-1f373 {
+ background-position: -818px -342px;
+}
+
+.emoji-1f374 {
+ background-position: -886px -342px;
+}
+
+.emoji-1f375 {
+ background-position: -954px -342px;
+}
+
+.emoji-1f376 {
+ background-position: -1022px -342px;
+}
+
+.emoji-1f377 {
+ background-position: -1090px -342px;
+}
+
+.emoji-1f378 {
+ background-position: -1158px -342px;
+}
+
+.emoji-1f379 {
+ background-position: -1226px -342px;
+}
+
+.emoji-1f37a {
+ background-position: -1294px -342px;
+}
+
+.emoji-1f37b {
+ background-position: -1362px -342px;
+}
+
+.emoji-1f37c {
+ background-position: -1430px -342px;
+}
+
+.emoji-1f380 {
+ background-position: -1498px -342px;
+}
+
+.emoji-1f381 {
+ background-position: -1566px -342px;
+}
+
+.emoji-1f382 {
+ background-position: -1634px -342px;
+}
+
+.emoji-1f383 {
+ background-position: -1702px -342px;
+}
+
+.emoji-1f384 {
+ background-position: -1770px -342px;
+}
+
+.emoji-1f385 {
+ background-position: -1838px -342px;
+}
+
+.emoji-1f386 {
+ background-position: -1906px -342px;
+}
+
+.emoji-1f387 {
+ background-position: -2px -410px;
+}
+
+.emoji-1f388 {
+ background-position: -70px -410px;
+}
+
+.emoji-1f389 {
+ background-position: -138px -410px;
+}
+
+.emoji-1f38a {
+ background-position: -206px -410px;
+}
+
+.emoji-1f38b {
+ background-position: -274px -410px;
+}
+
+.emoji-1f38c {
+ background-position: -342px -410px;
+}
+
+.emoji-1f38d {
+ background-position: -410px -410px;
+}
+
+.emoji-1f38e {
+ background-position: -478px -410px;
+}
+
+.emoji-1f38f {
+ background-position: -546px -410px;
+}
+
+.emoji-1f390 {
+ background-position: -614px -410px;
+}
+
+.emoji-1f391 {
+ background-position: -682px -410px;
+}
+
+.emoji-1f392 {
+ background-position: -750px -410px;
+}
+
+.emoji-1f393 {
+ background-position: -818px -410px;
+}
+
+.emoji-1f3a0 {
+ background-position: -886px -410px;
+}
+
+.emoji-1f3a1 {
+ background-position: -954px -410px;
+}
+
+.emoji-1f3a2 {
+ background-position: -1022px -410px;
+}
+
+.emoji-1f3a3 {
+ background-position: -1090px -410px;
+}
+
+.emoji-1f3a4 {
+ background-position: -1158px -410px;
+}
+
+.emoji-1f3a5 {
+ background-position: -1226px -410px;
+}
+
+.emoji-1f3a6 {
+ background-position: -1294px -410px;
+}
+
+.emoji-1f3a7 {
+ background-position: -1362px -410px;
+}
+
+.emoji-1f3a8 {
+ background-position: -1430px -410px;
+}
+
+.emoji-1f3a9 {
+ background-position: -1498px -410px;
+}
+
+.emoji-1f3aa {
+ background-position: -1566px -410px;
+}
+
+.emoji-1f3ab {
+ background-position: -1634px -410px;
+}
+
+.emoji-1f3ac {
+ background-position: -1702px -410px;
+}
+
+.emoji-1f3ad {
+ background-position: -1770px -410px;
+}
+
+.emoji-1f3ae {
+ background-position: -1838px -410px;
+}
+
+.emoji-1f3af {
+ background-position: -1906px -410px;
+}
+
+.emoji-1f3b0 {
+ background-position: -2px -478px;
+}
+
+.emoji-1f3b1 {
+ background-position: -70px -478px;
+}
+
+.emoji-1f3b2 {
+ background-position: -138px -478px;
+}
+
+.emoji-1f3b3 {
+ background-position: -206px -478px;
+}
+
+.emoji-1f3b4 {
+ background-position: -274px -478px;
+}
+
+.emoji-1f3b5 {
+ background-position: -342px -478px;
+}
+
+.emoji-1f3b6 {
+ background-position: -410px -478px;
+}
+
+.emoji-1f3b7 {
+ background-position: -478px -478px;
+}
+
+.emoji-1f3b8 {
+ background-position: -546px -478px;
+}
+
+.emoji-1f3b9 {
+ background-position: -614px -478px;
+}
+
+.emoji-1f3ba {
+ background-position: -682px -478px;
+}
+
+.emoji-1f3bb {
+ background-position: -750px -478px;
+}
+
+.emoji-1f3bc {
+ background-position: -818px -478px;
+}
+
+.emoji-1f3bd {
+ background-position: -886px -478px;
+}
+
+.emoji-1f3be {
+ background-position: -954px -478px;
+}
+
+.emoji-1f3bf {
+ background-position: -1022px -478px;
+}
+
+.emoji-1f3c0 {
+ background-position: -1090px -478px;
+}
+
+.emoji-1f3c1 {
+ background-position: -1158px -478px;
+}
+
+.emoji-1f3c2 {
+ background-position: -1226px -478px;
+}
+
+.emoji-1f3c3 {
+ background-position: -1294px -478px;
+}
+
+.emoji-1f3c4 {
+ background-position: -1362px -478px;
+}
+
+.emoji-1f3c6 {
+ background-position: -1430px -478px;
+}
+
+.emoji-1f3c7 {
+ background-position: -1498px -478px;
+}
+
+.emoji-1f3c8 {
+ background-position: -1566px -478px;
+}
+
+.emoji-1f3c9 {
+ background-position: -1634px -478px;
+}
+
+.emoji-1f3ca {
+ background-position: -1702px -478px;
+}
+
+.emoji-1f3e0 {
+ background-position: -1770px -478px;
+}
+
+.emoji-1f3e1 {
+ background-position: -1838px -478px;
+}
+
+.emoji-1f3e2 {
+ background-position: -1906px -478px;
+}
+
+.emoji-1f3e3 {
+ background-position: -2px -546px;
+}
+
+.emoji-1f3e4 {
+ background-position: -70px -546px;
+}
+
+.emoji-1f3e5 {
+ background-position: -138px -546px;
+}
+
+.emoji-1f3e6 {
+ background-position: -206px -546px;
+}
+
+.emoji-1f3e7 {
+ background-position: -274px -546px;
+}
+
+.emoji-1f3e8 {
+ background-position: -342px -546px;
+}
+
+.emoji-1f3e9 {
+ background-position: -410px -546px;
+}
+
+.emoji-1f3ea {
+ background-position: -478px -546px;
+}
+
+.emoji-1f3eb {
+ background-position: -546px -546px;
+}
+
+.emoji-1f3ec {
+ background-position: -614px -546px;
+}
+
+.emoji-1f3ed {
+ background-position: -682px -546px;
+}
+
+.emoji-1f3ee {
+ background-position: -750px -546px;
+}
+
+.emoji-1f3ef {
+ background-position: -818px -546px;
+}
+
+.emoji-1f3f0 {
+ background-position: -886px -546px;
+}
+
+.emoji-1f400 {
+ background-position: -954px -546px;
+}
+
+.emoji-1f401 {
+ background-position: -1022px -546px;
+}
+
+.emoji-1f402 {
+ background-position: -1090px -546px;
+}
+
+.emoji-1f403 {
+ background-position: -1158px -546px;
+}
+
+.emoji-1f404 {
+ background-position: -1226px -546px;
+}
+
+.emoji-1f405 {
+ background-position: -1294px -546px;
+}
+
+.emoji-1f406 {
+ background-position: -1362px -546px;
+}
+
+.emoji-1f407 {
+ background-position: -1430px -546px;
+}
+
+.emoji-1f408 {
+ background-position: -1498px -546px;
+}
+
+.emoji-1f409 {
+ background-position: -1566px -546px;
+}
+
+.emoji-1f40a {
+ background-position: -1634px -546px;
+}
+
+.emoji-1f40b {
+ background-position: -1702px -546px;
+}
+
+.emoji-1f40c {
+ background-position: -1770px -546px;
+}
+
+.emoji-1f40d {
+ background-position: -1838px -546px;
+}
+
+.emoji-1f40e {
+ background-position: -1906px -546px;
+}
+
+.emoji-1f40f {
+ background-position: -2px -614px;
+}
+
+.emoji-1f410 {
+ background-position: -70px -614px;
+}
+
+.emoji-1f411 {
+ background-position: -138px -614px;
+}
+
+.emoji-1f412 {
+ background-position: -206px -614px;
+}
+
+.emoji-1f413 {
+ background-position: -274px -614px;
+}
+
+.emoji-1f414 {
+ background-position: -342px -614px;
+}
+
+.emoji-1f415 {
+ background-position: -410px -614px;
+}
+
+.emoji-1f416 {
+ background-position: -478px -614px;
+}
+
+.emoji-1f417 {
+ background-position: -546px -614px;
+}
+
+.emoji-1f418 {
+ background-position: -614px -614px;
+}
+
+.emoji-1f419 {
+ background-position: -682px -614px;
+}
+
+.emoji-1f41a {
+ background-position: -750px -614px;
+}
+
+.emoji-1f41b {
+ background-position: -818px -614px;
+}
+
+.emoji-1f41c {
+ background-position: -886px -614px;
+}
+
+.emoji-1f41d {
+ background-position: -954px -614px;
+}
+
+.emoji-1f41e {
+ background-position: -1022px -614px;
+}
+
+.emoji-1f41f {
+ background-position: -1090px -614px;
+}
+
+.emoji-1f420 {
+ background-position: -1158px -614px;
+}
+
+.emoji-1f421 {
+ background-position: -1226px -614px;
+}
+
+.emoji-1f422 {
+ background-position: -1294px -614px;
+}
+
+.emoji-1f423 {
+ background-position: -1362px -614px;
+}
+
+.emoji-1f424 {
+ background-position: -1430px -614px;
+}
+
+.emoji-1f425 {
+ background-position: -1498px -614px;
+}
+
+.emoji-1f426 {
+ background-position: -1566px -614px;
+}
+
+.emoji-1f427 {
+ background-position: -1634px -614px;
+}
+
+.emoji-1f428 {
+ background-position: -1702px -614px;
+}
+
+.emoji-1f429 {
+ background-position: -1770px -614px;
+}
+
+.emoji-1f42a {
+ background-position: -1838px -614px;
+}
+
+.emoji-1f42b {
+ background-position: -1906px -614px;
+}
+
+.emoji-1f42c {
+ background-position: -2px -682px;
+}
+
+.emoji-1f42d {
+ background-position: -70px -682px;
+}
+
+.emoji-1f42e {
+ background-position: -138px -682px;
+}
+
+.emoji-1f42f {
+ background-position: -206px -682px;
+}
+
+.emoji-1f430 {
+ background-position: -274px -682px;
+}
+
+.emoji-1f431 {
+ background-position: -342px -682px;
+}
+
+.emoji-1f432 {
+ background-position: -410px -682px;
+}
+
+.emoji-1f433 {
+ background-position: -478px -682px;
+}
+
+.emoji-1f434 {
+ background-position: -546px -682px;
+}
+
+.emoji-1f435 {
+ background-position: -614px -682px;
+}
+
+.emoji-1f436 {
+ background-position: -682px -682px;
+}
+
+.emoji-1f437 {
+ background-position: -750px -682px;
+}
+
+.emoji-1f438 {
+ background-position: -818px -682px;
+}
+
+.emoji-1f439 {
+ background-position: -886px -682px;
+}
+
+.emoji-1f43a {
+ background-position: -954px -682px;
+}
+
+.emoji-1f43b {
+ background-position: -1022px -682px;
+}
+
+.emoji-1f43c {
+ background-position: -1090px -682px;
+}
+
+.emoji-1f43d {
+ background-position: -1158px -682px;
+}
+
+.emoji-1f43e {
+ background-position: -1226px -682px;
+}
+
+.emoji-1f440 {
+ background-position: -1294px -682px;
+}
+
+.emoji-1f442 {
+ background-position: -1362px -682px;
+}
+
+.emoji-1f443 {
+ background-position: -1430px -682px;
+}
+
+.emoji-1f444 {
+ background-position: -1498px -682px;
+}
+
+.emoji-1f445 {
+ background-position: -1566px -682px;
+}
+
+.emoji-1f446 {
+ background-position: -1634px -682px;
+}
+
+.emoji-1f447 {
+ background-position: -1702px -682px;
+}
+
+.emoji-1f448 {
+ background-position: -1770px -682px;
+}
+
+.emoji-1f449 {
+ background-position: -1838px -682px;
+}
+
+.emoji-1f44a {
+ background-position: -1906px -682px;
+}
+
+.emoji-1f44b {
+ background-position: -2px -750px;
+}
+
+.emoji-1f44c {
+ background-position: -70px -750px;
+}
+
+.emoji-1f44d {
+ background-position: -138px -750px;
+}
+
+.emoji-1f44e {
+ background-position: -206px -750px;
+}
+
+.emoji-1f44f {
+ background-position: -274px -750px;
+}
+
+.emoji-1f450 {
+ background-position: -342px -750px;
+}
+
+.emoji-1f451 {
+ background-position: -410px -750px;
+}
+
+.emoji-1f452 {
+ background-position: -478px -750px;
+}
+
+.emoji-1f453 {
+ background-position: -546px -750px;
+}
+
+.emoji-1f454 {
+ background-position: -614px -750px;
+}
+
+.emoji-1f455 {
+ background-position: -682px -750px;
+}
+
+.emoji-1f456 {
+ background-position: -750px -750px;
+}
+
+.emoji-1f457 {
+ background-position: -818px -750px;
+}
+
+.emoji-1f458 {
+ background-position: -886px -750px;
+}
+
+.emoji-1f459 {
+ background-position: -954px -750px;
+}
+
+.emoji-1f45a {
+ background-position: -1022px -750px;
+}
+
+.emoji-1f45b {
+ background-position: -1090px -750px;
+}
+
+.emoji-1f45c {
+ background-position: -1158px -750px;
+}
+
+.emoji-1f45d {
+ background-position: -1226px -750px;
+}
+
+.emoji-1f45e {
+ background-position: -1294px -750px;
+}
+
+.emoji-1f45f {
+ background-position: -1362px -750px;
+}
+
+.emoji-1f460 {
+ background-position: -1430px -750px;
+}
+
+.emoji-1f461 {
+ background-position: -1498px -750px;
+}
+
+.emoji-1f462 {
+ background-position: -1566px -750px;
+}
+
+.emoji-1f463 {
+ background-position: -1634px -750px;
+}
+
+.emoji-1f464 {
+ background-position: -1702px -750px;
+}
+
+.emoji-1f465 {
+ background-position: -1770px -750px;
+}
+
+.emoji-1f466 {
+ background-position: -1838px -750px;
+}
+
+.emoji-1f467 {
+ background-position: -1906px -750px;
+}
+
+.emoji-1f468 {
+ background-position: -2px -818px;
+}
+
+.emoji-1f469 {
+ background-position: -70px -818px;
+}
+
+.emoji-1f46a {
+ background-position: -138px -818px;
+}
+
+.emoji-1f46b {
+ background-position: -206px -818px;
+}
+
+.emoji-1f46c {
+ background-position: -274px -818px;
+}
+
+.emoji-1f46d {
+ background-position: -342px -818px;
+}
+
+.emoji-1f46e {
+ background-position: -410px -818px;
+}
+
+.emoji-1f46f {
+ background-position: -478px -818px;
+}
+
+.emoji-1f470 {
+ background-position: -546px -818px;
+}
+
+.emoji-1f471 {
+ background-position: -614px -818px;
+}
+
+.emoji-1f472 {
+ background-position: -682px -818px;
+}
+
+.emoji-1f473 {
+ background-position: -750px -818px;
+}
+
+.emoji-1f474 {
+ background-position: -818px -818px;
+}
+
+.emoji-1f475 {
+ background-position: -886px -818px;
+}
+
+.emoji-1f476 {
+ background-position: -954px -818px;
+}
+
+.emoji-1f477 {
+ background-position: -1022px -818px;
+}
+
+.emoji-1f478 {
+ background-position: -1090px -818px;
+}
+
+.emoji-1f479 {
+ background-position: -1158px -818px;
+}
+
+.emoji-1f47a {
+ background-position: -1226px -818px;
+}
+
+.emoji-1f47b {
+ background-position: -1294px -818px;
+}
+
+.emoji-1f47c {
+ background-position: -1362px -818px;
+}
+
+.emoji-1f47d {
+ background-position: -1430px -818px;
+}
+
+.emoji-1f47e {
+ background-position: -1498px -818px;
+}
+
+.emoji-1f47f {
+ background-position: -1566px -818px;
+}
+
+.emoji-1f480 {
+ background-position: -1634px -818px;
+}
+
+.emoji-1f481 {
+ background-position: -1702px -818px;
+}
+
+.emoji-1f482 {
+ background-position: -1770px -818px;
+}
+
+.emoji-1f483 {
+ background-position: -1838px -818px;
+}
+
+.emoji-1f484 {
+ background-position: -1906px -818px;
+}
+
+.emoji-1f485 {
+ background-position: -2px -886px;
+}
+
+.emoji-1f486 {
+ background-position: -70px -886px;
+}
+
+.emoji-1f487 {
+ background-position: -138px -886px;
+}
+
+.emoji-1f488 {
+ background-position: -206px -886px;
+}
+
+.emoji-1f489 {
+ background-position: -274px -886px;
+}
+
+.emoji-1f48a {
+ background-position: -342px -886px;
+}
+
+.emoji-1f48b {
+ background-position: -410px -886px;
+}
+
+.emoji-1f48c {
+ background-position: -478px -886px;
+}
+
+.emoji-1f48d {
+ background-position: -546px -886px;
+}
+
+.emoji-1f48e {
+ background-position: -614px -886px;
+}
+
+.emoji-1f48f {
+ background-position: -682px -886px;
+}
+
+.emoji-1f490 {
+ background-position: -750px -886px;
+}
+
+.emoji-1f491 {
+ background-position: -818px -886px;
+}
+
+.emoji-1f492 {
+ background-position: -886px -886px;
+}
+
+.emoji-1f493 {
+ background-position: -954px -886px;
+}
+
+.emoji-1f494 {
+ background-position: -1022px -886px;
+}
+
+.emoji-1f495 {
+ background-position: -1090px -886px;
+}
+
+.emoji-1f496 {
+ background-position: -1158px -886px;
+}
+
+.emoji-1f497 {
+ background-position: -1226px -886px;
+}
+
+.emoji-1f498 {
+ background-position: -1294px -886px;
+}
+
+.emoji-1f499 {
+ background-position: -1362px -886px;
+}
+
+.emoji-1f49a {
+ background-position: -1430px -886px;
+}
+
+.emoji-1f49b {
+ background-position: -1498px -886px;
+}
+
+.emoji-1f49c {
+ background-position: -1566px -886px;
+}
+
+.emoji-1f49d {
+ background-position: -1634px -886px;
+}
+
+.emoji-1f49e {
+ background-position: -1702px -886px;
+}
+
+.emoji-1f49f {
+ background-position: -1770px -886px;
+}
+
+.emoji-1f4a0 {
+ background-position: -1838px -886px;
+}
+
+.emoji-1f4a1 {
+ background-position: -1906px -886px;
+}
+
+.emoji-1f4a2 {
+ background-position: -2px -954px;
+}
+
+.emoji-1f4a3 {
+ background-position: -70px -954px;
+}
+
+.emoji-1f4a4 {
+ background-position: -138px -954px;
+}
+
+.emoji-1f4a5 {
+ background-position: -206px -954px;
+}
+
+.emoji-1f4a6 {
+ background-position: -274px -954px;
+}
+
+.emoji-1f4a7 {
+ background-position: -342px -954px;
+}
+
+.emoji-1f4a8 {
+ background-position: -410px -954px;
+}
+
+.emoji-1f4a9 {
+ background-position: -478px -954px;
+}
+
+.emoji-1f4aa {
+ background-position: -546px -954px;
+}
+
+.emoji-1f4ab {
+ background-position: -614px -954px;
+}
+
+.emoji-1f4ac {
+ background-position: -682px -954px;
+}
+
+.emoji-1f4ad {
+ background-position: -750px -954px;
+}
+
+.emoji-1f4ae {
+ background-position: -818px -954px;
+}
+
+.emoji-1f4af {
+ background-position: -886px -954px;
+}
+
+.emoji-1f4b0 {
+ background-position: -954px -954px;
+}
+
+.emoji-1f4b1 {
+ background-position: -1022px -954px;
+}
+
+.emoji-1f4b2 {
+ background-position: -1090px -954px;
+}
+
+.emoji-1f4b3 {
+ background-position: -1158px -954px;
+}
+
+.emoji-1f4b4 {
+ background-position: -1226px -954px;
+}
+
+.emoji-1f4b5 {
+ background-position: -1294px -954px;
+}
+
+.emoji-1f4b6 {
+ background-position: -1362px -954px;
+}
+
+.emoji-1f4b7 {
+ background-position: -1430px -954px;
+}
+
+.emoji-1f4b8 {
+ background-position: -1498px -954px;
+}
+
+.emoji-1f4b9 {
+ background-position: -1566px -954px;
+}
+
+.emoji-1f4ba {
+ background-position: -1634px -954px;
+}
+
+.emoji-1f4bb {
+ background-position: -1702px -954px;
+}
+
+.emoji-1f4bc {
+ background-position: -1770px -954px;
+}
+
+.emoji-1f4bd {
+ background-position: -1838px -954px;
+}
+
+.emoji-1f4be {
+ background-position: -1906px -954px;
+}
+
+.emoji-1f4bf {
+ background-position: -2px -1022px;
+}
+
+.emoji-1f4c0 {
+ background-position: -70px -1022px;
+}
+
+.emoji-1f4c1 {
+ background-position: -138px -1022px;
+}
+
+.emoji-1f4c2 {
+ background-position: -206px -1022px;
+}
+
+.emoji-1f4c3 {
+ background-position: -274px -1022px;
+}
+
+.emoji-1f4c4 {
+ background-position: -342px -1022px;
+}
+
+.emoji-1f4c5 {
+ background-position: -410px -1022px;
+}
+
+.emoji-1f4c6 {
+ background-position: -478px -1022px;
+}
+
+.emoji-1f4c7 {
+ background-position: -546px -1022px;
+}
+
+.emoji-1f4c8 {
+ background-position: -614px -1022px;
+}
+
+.emoji-1f4c9 {
+ background-position: -682px -1022px;
+}
+
+.emoji-1f4ca {
+ background-position: -750px -1022px;
+}
+
+.emoji-1f4cb {
+ background-position: -818px -1022px;
+}
+
+.emoji-1f4cc {
+ background-position: -886px -1022px;
+}
+
+.emoji-1f4cd {
+ background-position: -954px -1022px;
+}
+
+.emoji-1f4ce {
+ background-position: -1022px -1022px;
+}
+
+.emoji-1f4cf {
+ background-position: -1090px -1022px;
+}
+
+.emoji-1f4d0 {
+ background-position: -1158px -1022px;
+}
+
+.emoji-1f4d1 {
+ background-position: -1226px -1022px;
+}
+
+.emoji-1f4d2 {
+ background-position: -1294px -1022px;
+}
+
+.emoji-1f4d3 {
+ background-position: -1362px -1022px;
+}
+
+.emoji-1f4d4 {
+ background-position: -1430px -1022px;
+}
+
+.emoji-1f4d5 {
+ background-position: -1498px -1022px;
+}
+
+.emoji-1f4d6 {
+ background-position: -1566px -1022px;
+}
+
+.emoji-1f4d7 {
+ background-position: -1634px -1022px;
+}
+
+.emoji-1f4d8 {
+ background-position: -1702px -1022px;
+}
+
+.emoji-1f4d9 {
+ background-position: -1770px -1022px;
+}
+
+.emoji-1f4da {
+ background-position: -1838px -1022px;
+}
+
+.emoji-1f4db {
+ background-position: -1906px -1022px;
+}
+
+.emoji-1f4dc {
+ background-position: -2px -1090px;
+}
+
+.emoji-1f4dd {
+ background-position: -70px -1090px;
+}
+
+.emoji-1f4de {
+ background-position: -138px -1090px;
+}
+
+.emoji-1f4df {
+ background-position: -206px -1090px;
+}
+
+.emoji-1f4e0 {
+ background-position: -274px -1090px;
+}
+
+.emoji-1f4e1 {
+ background-position: -342px -1090px;
+}
+
+.emoji-1f4e2 {
+ background-position: -410px -1090px;
+}
+
+.emoji-1f4e3 {
+ background-position: -478px -1090px;
+}
+
+.emoji-1f4e4 {
+ background-position: -546px -1090px;
+}
+
+.emoji-1f4e5 {
+ background-position: -614px -1090px;
+}
+
+.emoji-1f4e6 {
+ background-position: -682px -1090px;
+}
+
+.emoji-1f4e7 {
+ background-position: -750px -1090px;
+}
+
+.emoji-1f4e8 {
+ background-position: -818px -1090px;
+}
+
+.emoji-1f4e9 {
+ background-position: -886px -1090px;
+}
+
+.emoji-1f4ea {
+ background-position: -954px -1090px;
+}
+
+.emoji-1f4eb {
+ background-position: -1022px -1090px;
+}
+
+.emoji-1f4ec {
+ background-position: -1090px -1090px;
+}
+
+.emoji-1f4ed {
+ background-position: -1158px -1090px;
+}
+
+.emoji-1f4ee {
+ background-position: -1226px -1090px;
+}
+
+.emoji-1f4ef {
+ background-position: -1294px -1090px;
+}
+
+.emoji-1f4f0 {
+ background-position: -1362px -1090px;
+}
+
+.emoji-1f4f1 {
+ background-position: -1430px -1090px;
+}
+
+.emoji-1f4f2 {
+ background-position: -1498px -1090px;
+}
+
+.emoji-1f4f3 {
+ background-position: -1566px -1090px;
+}
+
+.emoji-1f4f4 {
+ background-position: -1634px -1090px;
+}
+
+.emoji-1f4f5 {
+ background-position: -1702px -1090px;
+}
+
+.emoji-1f4f6 {
+ background-position: -1770px -1090px;
+}
+
+.emoji-1f4f7 {
+ background-position: -1838px -1090px;
+}
+
+.emoji-1f4f9 {
+ background-position: -1906px -1090px;
+}
+
+.emoji-1f4fa {
+ background-position: -2px -1158px;
+}
+
+.emoji-1f4fb {
+ background-position: -70px -1158px;
+}
+
+.emoji-1f4fc {
+ background-position: -138px -1158px;
+}
+
+.emoji-1f500 {
+ background-position: -206px -1158px;
+}
+
+.emoji-1f501 {
+ background-position: -274px -1158px;
+}
+
+.emoji-1f502 {
+ background-position: -342px -1158px;
+}
+
+.emoji-1f503 {
+ background-position: -410px -1158px;
+}
+
+.emoji-1f504 {
+ background-position: -478px -1158px;
+}
+
+.emoji-1f505 {
+ background-position: -546px -1158px;
+}
+
+.emoji-1f506 {
+ background-position: -614px -1158px;
+}
+
+.emoji-1f507 {
+ background-position: -682px -1158px;
+}
+
+.emoji-1f508 {
+ background-position: -750px -1158px;
+}
+
+.emoji-1f509 {
+ background-position: -818px -1158px;
+}
+
+.emoji-1f50a {
+ background-position: -886px -1158px;
+}
+
+.emoji-1f50b {
+ background-position: -954px -1158px;
+}
+
+.emoji-1f50c {
+ background-position: -1022px -1158px;
+}
+
+.emoji-1f50d {
+ background-position: -1090px -1158px;
+}
+
+.emoji-1f50e {
+ background-position: -1158px -1158px;
+}
+
+.emoji-1f50f {
+ background-position: -1226px -1158px;
+}
+
+.emoji-1f510 {
+ background-position: -1294px -1158px;
+}
+
+.emoji-1f511 {
+ background-position: -1362px -1158px;
+}
+
+.emoji-1f512 {
+ background-position: -1430px -1158px;
+}
+
+.emoji-1f513 {
+ background-position: -1498px -1158px;
+}
+
+.emoji-1f514 {
+ background-position: -1566px -1158px;
+}
+
+.emoji-1f515 {
+ background-position: -1634px -1158px;
+}
+
+.emoji-1f516 {
+ background-position: -1702px -1158px;
+}
+
+.emoji-1f517 {
+ background-position: -1770px -1158px;
+}
+
+.emoji-1f518 {
+ background-position: -1838px -1158px;
+}
+
+.emoji-1f519 {
+ background-position: -1906px -1158px;
+}
+
+.emoji-1f51a {
+ background-position: -2px -1226px;
+}
+
+.emoji-1f51b {
+ background-position: -70px -1226px;
+}
+
+.emoji-1f51c {
+ background-position: -138px -1226px;
+}
+
+.emoji-1f51d {
+ background-position: -206px -1226px;
+}
+
+.emoji-1f51e {
+ background-position: -274px -1226px;
+}
+
+.emoji-1f51f {
+ background-position: -342px -1226px;
+}
+
+.emoji-1f520 {
+ background-position: -410px -1226px;
+}
+
+.emoji-1f521 {
+ background-position: -478px -1226px;
+}
+
+.emoji-1f522 {
+ background-position: -546px -1226px;
+}
+
+.emoji-1f523 {
+ background-position: -614px -1226px;
+}
+
+.emoji-1f524 {
+ background-position: -682px -1226px;
+}
+
+.emoji-1f525 {
+ background-position: -750px -1226px;
+}
+
+.emoji-1f526 {
+ background-position: -818px -1226px;
+}
+
+.emoji-1f527 {
+ background-position: -886px -1226px;
+}
+
+.emoji-1f528 {
+ background-position: -954px -1226px;
+}
+
+.emoji-1f529 {
+ background-position: -1022px -1226px;
+}
+
+.emoji-1f52a {
+ background-position: -1090px -1226px;
+}
+
+.emoji-1f52b {
+ background-position: -1158px -1226px;
+}
+
+.emoji-1f52c {
+ background-position: -1226px -1226px;
+}
+
+.emoji-1f52d {
+ background-position: -1294px -1226px;
+}
+
+.emoji-1f52e {
+ background-position: -1362px -1226px;
+}
+
+.emoji-1f52f {
+ background-position: -1430px -1226px;
+}
+
+.emoji-1f530 {
+ background-position: -1498px -1226px;
+}
+
+.emoji-1f531 {
+ background-position: -1566px -1226px;
+}
+
+.emoji-1f532 {
+ background-position: -1634px -1226px;
+}
+
+.emoji-1f533 {
+ background-position: -1702px -1226px;
+}
+
+.emoji-1f534 {
+ background-position: -1770px -1226px;
+}
+
+.emoji-1f535 {
+ background-position: -1838px -1226px;
+}
+
+.emoji-1f536 {
+ background-position: -1906px -1226px;
+}
+
+.emoji-1f537 {
+ background-position: -2px -1294px;
+}
+
+.emoji-1f538 {
+ background-position: -70px -1294px;
+}
+
+.emoji-1f539 {
+ background-position: -138px -1294px;
+}
+
+.emoji-1f53a {
+ background-position: -206px -1294px;
+}
+
+.emoji-1f53b {
+ background-position: -274px -1294px;
+}
+
+.emoji-1f53c {
+ background-position: -342px -1294px;
+}
+
+.emoji-1f53d {
+ background-position: -410px -1294px;
+}
+
+.emoji-1f550 {
+ background-position: -478px -1294px;
+}
+
+.emoji-1f551 {
+ background-position: -546px -1294px;
+}
+
+.emoji-1f552 {
+ background-position: -614px -1294px;
+}
+
+.emoji-1f553 {
+ background-position: -682px -1294px;
+}
+
+.emoji-1f554 {
+ background-position: -750px -1294px;
+}
+
+.emoji-1f555 {
+ background-position: -818px -1294px;
+}
+
+.emoji-1f556 {
+ background-position: -886px -1294px;
+}
+
+.emoji-1f557 {
+ background-position: -954px -1294px;
+}
+
+.emoji-1f558 {
+ background-position: -1022px -1294px;
+}
+
+.emoji-1f559 {
+ background-position: -1090px -1294px;
+}
+
+.emoji-1f55a {
+ background-position: -1158px -1294px;
+}
+
+.emoji-1f55b {
+ background-position: -1226px -1294px;
+}
+
+.emoji-1f55c {
+ background-position: -1294px -1294px;
+}
+
+.emoji-1f55d {
+ background-position: -1362px -1294px;
+}
+
+.emoji-1f55e {
+ background-position: -1430px -1294px;
+}
+
+.emoji-1f55f {
+ background-position: -1498px -1294px;
+}
+
+.emoji-1f560 {
+ background-position: -1566px -1294px;
+}
+
+.emoji-1f561 {
+ background-position: -1634px -1294px;
+}
+
+.emoji-1f562 {
+ background-position: -1702px -1294px;
+}
+
+.emoji-1f563 {
+ background-position: -1770px -1294px;
+}
+
+.emoji-1f564 {
+ background-position: -1838px -1294px;
+}
+
+.emoji-1f565 {
+ background-position: -1906px -1294px;
+}
+
+.emoji-1f566 {
+ background-position: -2px -1362px;
+}
+
+.emoji-1f567 {
+ background-position: -70px -1362px;
+}
+
+.emoji-1f5fb {
+ background-position: -138px -1362px;
+}
+
+.emoji-1f5fc {
+ background-position: -206px -1362px;
+}
+
+.emoji-1f5fd {
+ background-position: -274px -1362px;
+}
+
+.emoji-1f5fe {
+ background-position: -342px -1362px;
+}
+
+.emoji-1f5ff {
+ background-position: -410px -1362px;
+}
+
+.emoji-1f600 {
+ background-position: -478px -1362px;
+}
+
+.emoji-1f601 {
+ background-position: -546px -1362px;
+}
+
+.emoji-1f602 {
+ background-position: -614px -1362px;
+}
+
+.emoji-1f603 {
+ background-position: -682px -1362px;
+}
+
+.emoji-1f604 {
+ background-position: -750px -1362px;
+}
+
+.emoji-1f605 {
+ background-position: -818px -1362px;
+}
+
+.emoji-1f606 {
+ background-position: -886px -1362px;
+}
+
+.emoji-1f607 {
+ background-position: -954px -1362px;
+}
+
+.emoji-1f608 {
+ background-position: -1022px -1362px;
+}
+
+.emoji-1f609 {
+ background-position: -1090px -1362px;
+}
+
+.emoji-1f60a {
+ background-position: -1158px -1362px;
+}
+
+.emoji-1f60b {
+ background-position: -1226px -1362px;
+}
+
+.emoji-1f60c {
+ background-position: -1294px -1362px;
+}
+
+.emoji-1f60d {
+ background-position: -1362px -1362px;
+}
+
+.emoji-1f60e {
+ background-position: -1430px -1362px;
+}
+
+.emoji-1f60f {
+ background-position: -1498px -1362px;
+}
+
+.emoji-1f610 {
+ background-position: -1566px -1362px;
+}
+
+.emoji-1f611 {
+ background-position: -1634px -1362px;
+}
+
+.emoji-1f612 {
+ background-position: -1702px -1362px;
+}
+
+.emoji-1f613 {
+ background-position: -1770px -1362px;
+}
+
+.emoji-1f614 {
+ background-position: -1838px -1362px;
+}
+
+.emoji-1f615 {
+ background-position: -1906px -1362px;
+}
+
+.emoji-1f616 {
+ background-position: -2px -1430px;
+}
+
+.emoji-1f617 {
+ background-position: -70px -1430px;
+}
+
+.emoji-1f618 {
+ background-position: -138px -1430px;
+}
+
+.emoji-1f619 {
+ background-position: -206px -1430px;
+}
+
+.emoji-1f61a {
+ background-position: -274px -1430px;
+}
+
+.emoji-1f61b {
+ background-position: -342px -1430px;
+}
+
+.emoji-1f61c {
+ background-position: -410px -1430px;
+}
+
+.emoji-1f61d {
+ background-position: -478px -1430px;
+}
+
+.emoji-1f61e {
+ background-position: -546px -1430px;
+}
+
+.emoji-1f61f {
+ background-position: -614px -1430px;
+}
+
+.emoji-1f620 {
+ background-position: -682px -1430px;
+}
+
+.emoji-1f621 {
+ background-position: -750px -1430px;
+}
+
+.emoji-1f622 {
+ background-position: -818px -1430px;
+}
+
+.emoji-1f623 {
+ background-position: -886px -1430px;
+}
+
+.emoji-1f624 {
+ background-position: -954px -1430px;
+}
+
+.emoji-1f625 {
+ background-position: -1022px -1430px;
+}
+
+.emoji-1f626 {
+ background-position: -1090px -1430px;
+}
+
+.emoji-1f627 {
+ background-position: -1158px -1430px;
+}
+
+.emoji-1f628 {
+ background-position: -1226px -1430px;
+}
+
+.emoji-1f629 {
+ background-position: -1294px -1430px;
+}
+
+.emoji-1f62a {
+ background-position: -1362px -1430px;
+}
+
+.emoji-1f62b {
+ background-position: -1430px -1430px;
+}
+
+.emoji-1f62c {
+ background-position: -1498px -1430px;
+}
+
+.emoji-1f62d {
+ background-position: -1566px -1430px;
+}
+
+.emoji-1f62e {
+ background-position: -1634px -1430px;
+}
+
+.emoji-1f62f {
+ background-position: -1702px -1430px;
+}
+
+.emoji-1f630 {
+ background-position: -1770px -1430px;
+}
+
+.emoji-1f631 {
+ background-position: -1838px -1430px;
+}
+
+.emoji-1f632 {
+ background-position: -1906px -1430px;
+}
+
+.emoji-1f633 {
+ background-position: -2px -1498px;
+}
+
+.emoji-1f634 {
+ background-position: -70px -1498px;
+}
+
+.emoji-1f635 {
+ background-position: -138px -1498px;
+}
+
+.emoji-1f636 {
+ background-position: -206px -1498px;
+}
+
+.emoji-1f637 {
+ background-position: -274px -1498px;
+}
+
+.emoji-1f638 {
+ background-position: -342px -1498px;
+}
+
+.emoji-1f639 {
+ background-position: -410px -1498px;
+}
+
+.emoji-1f63a {
+ background-position: -478px -1498px;
+}
+
+.emoji-1f63b {
+ background-position: -546px -1498px;
+}
+
+.emoji-1f63c {
+ background-position: -614px -1498px;
+}
+
+.emoji-1f63d {
+ background-position: -682px -1498px;
+}
+
+.emoji-1f63e {
+ background-position: -750px -1498px;
+}
+
+.emoji-1f63f {
+ background-position: -818px -1498px;
+}
+
+.emoji-1f640 {
+ background-position: -886px -1498px;
+}
+
+.emoji-1f641 {
+ background-position: -954px -1498px;
+}
+
+.emoji-1f642 {
+ background-position: -1022px -1498px;
+}
+
+.emoji-1f643 {
+ background-position: -1090px -1498px;
+}
+
+.emoji-1f645 {
+ background-position: -1158px -1498px;
+}
+
+.emoji-1f646 {
+ background-position: -1226px -1498px;
+}
+
+.emoji-1f647 {
+ background-position: -1294px -1498px;
+}
+
+.emoji-1f648 {
+ background-position: -1362px -1498px;
+}
+
+.emoji-1f649 {
+ background-position: -1430px -1498px;
+}
+
+.emoji-1f64a {
+ background-position: -1498px -1498px;
+}
+
+.emoji-1f64b {
+ background-position: -1566px -1498px;
+}
+
+.emoji-1f64c {
+ background-position: -1634px -1498px;
+}
+
+.emoji-1f64d {
+ background-position: -1702px -1498px;
+}
+
+.emoji-1f64e {
+ background-position: -1770px -1498px;
+}
+
+.emoji-1f64f {
+ background-position: -1838px -1498px;
+}
+
+.emoji-1f680 {
+ background-position: -1906px -1498px;
+}
+
+.emoji-1f681 {
+ background-position: -2px -1566px;
+}
+
+.emoji-1f682 {
+ background-position: -70px -1566px;
+}
+
+.emoji-1f683 {
+ background-position: -138px -1566px;
+}
+
+.emoji-1f684 {
+ background-position: -206px -1566px;
+}
+
+.emoji-1f685 {
+ background-position: -274px -1566px;
+}
+
+.emoji-1f686 {
+ background-position: -342px -1566px;
+}
+
+.emoji-1f687 {
+ background-position: -410px -1566px;
+}
+
+.emoji-1f688 {
+ background-position: -478px -1566px;
+}
+
+.emoji-1f689 {
+ background-position: -546px -1566px;
+}
+
+.emoji-1f68a {
+ background-position: -614px -1566px;
+}
+
+.emoji-1f68b {
+ background-position: -682px -1566px;
+}
+
+.emoji-1f68c {
+ background-position: -750px -1566px;
+}
+
+.emoji-1f68d {
+ background-position: -818px -1566px;
+}
+
+.emoji-1f68e {
+ background-position: -886px -1566px;
+}
+
+.emoji-1f68f {
+ background-position: -954px -1566px;
+}
+
+.emoji-1f690 {
+ background-position: -1022px -1566px;
+}
+
+.emoji-1f691 {
+ background-position: -1090px -1566px;
+}
+
+.emoji-1f692 {
+ background-position: -1158px -1566px;
+}
+
+.emoji-1f693 {
+ background-position: -1226px -1566px;
+}
+
+.emoji-1f694 {
+ background-position: -1294px -1566px;
+}
+
+.emoji-1f695 {
+ background-position: -1362px -1566px;
+}
+
+.emoji-1f696 {
+ background-position: -1430px -1566px;
+}
+
+.emoji-1f697 {
+ background-position: -1498px -1566px;
+}
+
+.emoji-1f698 {
+ background-position: -1566px -1566px;
+}
+
+.emoji-1f699 {
+ background-position: -1634px -1566px;
+}
+
+.emoji-1f69a {
+ background-position: -1702px -1566px;
+}
+
+.emoji-1f69b {
+ background-position: -1770px -1566px;
+}
+
+.emoji-1f69c {
+ background-position: -1838px -1566px;
+}
+
+.emoji-1f69d {
+ background-position: -1906px -1566px;
+}
+
+.emoji-1f69e {
+ background-position: -2px -1634px;
+}
+
+.emoji-1f69f {
+ background-position: -70px -1634px;
+}
+
+.emoji-1f6a0 {
+ background-position: -138px -1634px;
+}
+
+.emoji-1f6a1 {
+ background-position: -206px -1634px;
+}
+
+.emoji-1f6a2 {
+ background-position: -274px -1634px;
+}
+
+.emoji-1f6a3 {
+ background-position: -342px -1634px;
+}
+
+.emoji-1f6a4 {
+ background-position: -410px -1634px;
+}
+
+.emoji-1f6a5 {
+ background-position: -478px -1634px;
+}
+
+.emoji-1f6a6 {
+ background-position: -546px -1634px;
+}
+
+.emoji-1f6a7 {
+ background-position: -614px -1634px;
+}
+
+.emoji-1f6a8 {
+ background-position: -682px -1634px;
+}
+
+.emoji-1f6a9 {
+ background-position: -750px -1634px;
+}
+
+.emoji-1f6aa {
+ background-position: -818px -1634px;
+}
+
+.emoji-1f6ab {
+ background-position: -886px -1634px;
+}
+
+.emoji-1f6ac {
+ background-position: -954px -1634px;
+}
+
+.emoji-1f6ad {
+ background-position: -1022px -1634px;
+}
+
+.emoji-1f6ae {
+ background-position: -1090px -1634px;
+}
+
+.emoji-1f6af {
+ background-position: -1158px -1634px;
+}
+
+.emoji-1f6b0 {
+ background-position: -1226px -1634px;
+}
+
+.emoji-1f6b1 {
+ background-position: -1294px -1634px;
+}
+
+.emoji-1f6b2 {
+ background-position: -1362px -1634px;
+}
+
+.emoji-1f6b3 {
+ background-position: -1430px -1634px;
+}
+
+.emoji-1f6b4 {
+ background-position: -1498px -1634px;
+}
+
+.emoji-1f6b5 {
+ background-position: -1566px -1634px;
+}
+
+.emoji-1f6b6 {
+ background-position: -1634px -1634px;
+}
+
+.emoji-1f6b7 {
+ background-position: -1702px -1634px;
+}
+
+.emoji-1f6b8 {
+ background-position: -1770px -1634px;
+}
+
+.emoji-1f6b9 {
+ background-position: -1838px -1634px;
+}
+
+.emoji-1f6ba {
+ background-position: -1906px -1634px;
+}
+
+.emoji-1f6bb {
+ background-position: -2px -1702px;
+}
+
+.emoji-1f6bc {
+ background-position: -70px -1702px;
+}
+
+.emoji-1f6bd {
+ background-position: -138px -1702px;
+}
+
+.emoji-1f6be {
+ background-position: -206px -1702px;
+}
+
+.emoji-1f6bf {
+ background-position: -274px -1702px;
+}
+
+.emoji-1f6c0 {
+ background-position: -342px -1702px;
+}
+
+.emoji-1f6c1 {
+ background-position: -410px -1702px;
+}
+
+.emoji-1f6c2 {
+ background-position: -478px -1702px;
+}
+
+.emoji-1f6c3 {
+ background-position: -546px -1702px;
+}
+
+.emoji-1f6c4 {
+ background-position: -614px -1702px;
+}
+
+.emoji-1f6c5 {
+ background-position: -682px -1702px;
+}
+
+.emoji-203c {
+ background-position: -750px -1702px;
+}
+
+.emoji-2049 {
+ background-position: -818px -1702px;
+}
+
+.emoji-2122 {
+ background-position: -886px -1702px;
+}
+
+.emoji-2139 {
+ background-position: -954px -1702px;
+}
+
+.emoji-2194 {
+ background-position: -1022px -1702px;
+}
+
+.emoji-2195 {
+ background-position: -1090px -1702px;
+}
+
+.emoji-2196 {
+ background-position: -1158px -1702px;
+}
+
+.emoji-2197 {
+ background-position: -1226px -1702px;
+}
+
+.emoji-2198 {
+ background-position: -1294px -1702px;
+}
+
+.emoji-2199 {
+ background-position: -1362px -1702px;
+}
+
+.emoji-21a9 {
+ background-position: -1430px -1702px;
+}
+
+.emoji-21aa {
+ background-position: -1498px -1702px;
+}
+
+.emoji-231a {
+ background-position: -1566px -1702px;
+}
+
+.emoji-231b {
+ background-position: -1634px -1702px;
+}
+
+.emoji-23e9 {
+ background-position: -1702px -1702px;
+}
+
+.emoji-23ea {
+ background-position: -1770px -1702px;
+}
+
+.emoji-23eb {
+ background-position: -1838px -1702px;
+}
+
+.emoji-23ec {
+ background-position: -1906px -1702px;
+}
+
+.emoji-23f0 {
+ background-position: -2px -1770px;
+}
+
+.emoji-23f3 {
+ background-position: -70px -1770px;
+}
+
+.emoji-24c2 {
+ background-position: -138px -1770px;
+}
+
+.emoji-25aa {
+ background-position: -206px -1770px;
+}
+
+.emoji-25ab {
+ background-position: -274px -1770px;
+}
+
+.emoji-25b6 {
+ background-position: -342px -1770px;
+}
+
+.emoji-25c0 {
+ background-position: -410px -1770px;
+}
+
+.emoji-25fb {
+ background-position: -478px -1770px;
+}
+
+.emoji-25fc {
+ background-position: -546px -1770px;
+}
+
+.emoji-25fd {
+ background-position: -614px -1770px;
+}
+
+.emoji-25fe {
+ background-position: -682px -1770px;
+}
+
+.emoji-2600 {
+ background-position: -750px -1770px;
+}
+
+.emoji-2601 {
+ background-position: -818px -1770px;
+}
+
+.emoji-260e {
+ background-position: -886px -1770px;
+}
+
+.emoji-2611 {
+ background-position: -954px -1770px;
+}
+
+.emoji-2614 {
+ background-position: -1022px -1770px;
+}
+
+.emoji-2615 {
+ background-position: -1090px -1770px;
+}
+
+.emoji-261d {
+ background-position: -1158px -1770px;
+}
+
+.emoji-263a {
+ background-position: -1226px -1770px;
+}
+
+.emoji-2648 {
+ background-position: -1294px -1770px;
+}
+
+.emoji-2649 {
+ background-position: -1362px -1770px;
+}
+
+.emoji-264a {
+ background-position: -1430px -1770px;
+}
+
+.emoji-264b {
+ background-position: -1498px -1770px;
+}
+
+.emoji-264c {
+ background-position: -1566px -1770px;
+}
+
+.emoji-264d {
+ background-position: -1634px -1770px;
+}
+
+.emoji-264e {
+ background-position: -1702px -1770px;
+}
+
+.emoji-264f {
+ background-position: -1770px -1770px;
+}
+
+.emoji-2650 {
+ background-position: -1838px -1770px;
+}
+
+.emoji-2651 {
+ background-position: -1906px -1770px;
+}
+
+.emoji-2652 {
+ background-position: -2px -1838px;
+}
+
+.emoji-2653 {
+ background-position: -70px -1838px;
+}
+
+.emoji-2660 {
+ background-position: -138px -1838px;
+}
+
+.emoji-2663 {
+ background-position: -206px -1838px;
+}
+
+.emoji-2665 {
+ background-position: -274px -1838px;
+}
+
+.emoji-2666 {
+ background-position: -342px -1838px;
+}
+
+.emoji-2668 {
+ background-position: -410px -1838px;
+}
+
+.emoji-267b {
+ background-position: -478px -1838px;
+}
+
+.emoji-267f {
+ background-position: -546px -1838px;
+}
+
+.emoji-2693 {
+ background-position: -614px -1838px;
+}
+
+.emoji-26a0 {
+ background-position: -682px -1838px;
+}
+
+.emoji-26a1 {
+ background-position: -750px -1838px;
+}
+
+.emoji-26aa {
+ background-position: -818px -1838px;
+}
+
+.emoji-26ab {
+ background-position: -886px -1838px;
+}
+
+.emoji-26bd {
+ background-position: -954px -1838px;
+}
+
+.emoji-26be {
+ background-position: -1022px -1838px;
+}
+
+.emoji-26c4 {
+ background-position: -1090px -1838px;
+}
+
+.emoji-26c5 {
+ background-position: -1158px -1838px;
+}
+
+.emoji-26ce {
+ background-position: -1226px -1838px;
+}
+
+.emoji-26d4 {
+ background-position: -1294px -1838px;
+}
+
+.emoji-26ea {
+ background-position: -1362px -1838px;
+}
+
+.emoji-26f2 {
+ background-position: -1430px -1838px;
+}
+
+.emoji-26f3 {
+ background-position: -1498px -1838px;
+}
+
+.emoji-26f5 {
+ background-position: -1566px -1838px;
+}
+
+.emoji-26fa {
+ background-position: -1634px -1838px;
+}
+
+.emoji-26fd {
+ background-position: -1702px -1838px;
+}
+
+.emoji-2702 {
+ background-position: -1770px -1838px;
+}
+
+.emoji-2705 {
+ background-position: -1838px -1838px;
+}
+
+.emoji-2708 {
+ background-position: -1906px -1838px;
+}
+
+.emoji-2709 {
+ background-position: -2px -1906px;
+}
+
+.emoji-270a {
+ background-position: -70px -1906px;
+}
+
+.emoji-270b {
+ background-position: -138px -1906px;
+}
+
+.emoji-270c {
+ background-position: -206px -1906px;
+}
+
+.emoji-270f {
+ background-position: -274px -1906px;
+}
+
+.emoji-2712 {
+ background-position: -342px -1906px;
+}
+
+.emoji-2714 {
+ background-position: -410px -1906px;
+}
+
+.emoji-2716 {
+ background-position: -478px -1906px;
+}
+
+.emoji-2728 {
+ background-position: -546px -1906px;
+}
+
+.emoji-2733 {
+ background-position: -614px -1906px;
+}
+
+.emoji-2734 {
+ background-position: -682px -1906px;
+}
+
+.emoji-2744 {
+ background-position: -750px -1906px;
+}
+
+.emoji-2747 {
+ background-position: -818px -1906px;
+}
+
+.emoji-274c {
+ background-position: -886px -1906px;
+}
+
+.emoji-274e {
+ background-position: -954px -1906px;
+}
+
+.emoji-2753 {
+ background-position: -1022px -1906px;
+}
+
+.emoji-2754 {
+ background-position: -1090px -1906px;
+}
+
+.emoji-2755 {
+ background-position: -1158px -1906px;
+}
+
+.emoji-2757 {
+ background-position: -1226px -1906px;
+}
+
+.emoji-2764 {
+ background-position: -1294px -1906px;
+}
+
+.emoji-2795 {
+ background-position: -1362px -1906px;
+}
+
+.emoji-2796 {
+ background-position: -1430px -1906px;
+}
+
+.emoji-2797 {
+ background-position: -1498px -1906px;
+}
+
+.emoji-27a1 {
+ background-position: -1566px -1906px;
+}
+
+.emoji-27b0 {
+ background-position: -1634px -1906px;
+}
+
+.emoji-27bf {
+ background-position: -1702px -1906px;
+}
+
+.emoji-2934 {
+ background-position: -1770px -1906px;
+}
+
+.emoji-2935 {
+ background-position: -1838px -1906px;
+}
+
+.emoji-2b05 {
+ background-position: -1906px -1906px;
+}
+
+.emoji-2b06 {
+ background-position: -1974px -2px;
+}
+
+.emoji-2b07 {
+ background-position: -1974px -70px;
+}
+
+.emoji-2b1b {
+ background-position: -1974px -138px;
+}
+
+.emoji-2b1c {
+ background-position: -1974px -206px;
+}
+
+.emoji-2b50 {
+ background-position: -1974px -274px;
+}
+
+.emoji-2b55 {
+ background-position: -1974px -342px;
+}
+
+.emoji-3030 {
+ background-position: -1974px -410px;
+}
+
+.emoji-303d {
+ background-position: -1974px -478px;
+}
+
+.emoji-3297 {
+ background-position: -1974px -546px;
+}
+
+.emoji-3299 {
+ background-position: -1974px -614px;
+}
+
+.emoji-bowtie {
+ background-position: -1974px -682px;
+}
+
+.emoji-feelsgood {
+ background-position: -1974px -750px;
+}
+
+.emoji-finnadie {
+ background-position: -1974px -818px;
+}
+
+.emoji-fu {
+ background-position: -1974px -886px;
+}
+
+.emoji-goberserk {
+ background-position: -1974px -954px;
+}
+
+.emoji-godmode {
+ background-position: -1974px -1022px;
+}
+
+.emoji-hurtrealbad {
+ background-position: -1974px -1090px;
+}
+
+.emoji-img_trans {
+ width: 1px;
+ height: 1px;
+ background-position: -2042px -2px;
+}
+
+.emoji-mattermost {
+ background-position: -1974px -1158px;
+}
+
+.emoji-metal {
+ background-position: -1974px -1226px;
+}
+
+.emoji-neckbeard {
+ background-position: -1974px -1294px;
+}
+
+.emoji-octocat {
+ background-position: -1974px -1362px;
+}
+
+.emoji-rage1 {
+ background-position: -1974px -1430px;
+}
+
+.emoji-rage2 {
+ background-position: -1974px -1498px;
+}
+
+.emoji-rage3 {
+ background-position: -1974px -1566px;
+}
+
+.emoji-rage4 {
+ background-position: -1974px -1634px;
+}
+
+.emoji-shipit {
+ width: 75px;
+ height: 75px;
+ background-position: -1974px -1702px;
+}
+
+.emoji-suspect {
+ background-position: -1974px -1781px;
+}
+
+.emoji-taco {
+ background-position: -1974px -1849px;
+}
+
+.emoji-trollface {
+ background-position: -1974px -1917px;
+}
diff --git a/webapp/sass/components/_emoticons.scss b/webapp/sass/components/_emoticons.scss
index 43d2e8ece..7cf7034d2 100644
--- a/webapp/sass/components/_emoticons.scss
+++ b/webapp/sass/components/_emoticons.scss
@@ -1,15 +1,15 @@
-@charset 'UTF-8';
+@charset "UTF-8";
.emoticon {
background-position: 50% 50%;
background-repeat: no-repeat;
background-size: contain;
display: inline-block;
- height: 20px;
+ height: 21px;
min-height: 1em;
min-width: 1em;
vertical-align: middle;
- width: 20px;
+ width: 21px;
}
.emoticon-suggestion {
@@ -36,3 +36,205 @@
text-align: center;
vertical-align: middle;
}
+
+.emoji-picker__popover {
+ padding: 0px;
+
+ .popover-content {
+ padding: 0px;
+ }
+}
+
+
+
+.emoji-picker-bottom {
+ display: flex;
+ flex-direction: column;
+ @include user-select(none);
+ position: absolute;
+ z-index: 40;
+ right: 0%;
+ width: 278px;
+ border: 1px solid;
+ min-height: 298px;
+ border-radius: 3px;
+
+ .emoji-picker__search-container {
+ position: relative;
+
+ .emoji-picker__search-icon {
+ padding-left: 6px;
+ padding-top: 6px;
+ position: absolute;
+ font-size: 13px;
+ }
+
+
+ }
+}
+
+.emoji-picker__search {
+ border-width: 1px 0px 1px 0px;
+ border-style: solid;
+ padding: 2px 0 2px 25px;
+ width: 100%;
+ height: 25px;
+ font-size: 12px;
+
+ &:focus{
+ outline: none;
+ }
+}
+
+.emoji-picker {
+ display: flex;
+ flex-direction: column;
+ @include user-select(none);
+ position: absolute;
+ top: -361px;
+ right: 0px;
+ width: 278px;
+ border: 1px solid;
+ border-radius: 3px;
+
+ .emoji-picker__search-container {
+ position: relative;
+
+ .emoji-picker__search-icon {
+ padding-left: 6px;
+ padding-top: 6px;
+ position: absolute;
+ font-size: 13px;
+ }
+
+
+ }
+}
+
+.emoji-picker__categories {
+ flex-grow: 0;
+ flex-shrink: 0;
+
+ .emoji-picker__category {
+ color: #333333;
+ display: inline-block;
+ font-size: 16px;
+ margin: 3px 6px;
+ text-align: center;
+ width: 15px;
+
+ &--selected,
+ &:hover {
+ color: #666666;
+ }
+ }
+}
+
+.emoji-picker__items {
+ max-height: 262px;
+ overflow-x: hidden;
+ overflow-y: auto;
+ padding: 0px 8px 8px 8px;
+ position: relative;
+
+
+
+ .emoji-picker__category-header {
+ font-size: 12px;
+ font-weight: bold;
+ margin-bottom: 6px;
+ margin-top: 3px;
+ padding-top: 3px;
+ // padding-bottom: 10px;
+ }
+
+ .emoji-picker__preview_sprite {
+ isplay: inline-block;
+ height: 45px;
+ margin: 3px;
+ vertical-align: top;
+
+ padding: 3px;
+ }
+
+ .emoji-picker-items__container {
+ > div {
+ display: inline-block;
+ height: 21px;
+ margin: 3px;
+ vertical-align: top;
+ width: 21px;
+ padding: 3px;
+ }
+ > span {
+ display: inline-block;
+ height: 21px;
+ margin: 3px;
+ vertical-align: top;
+ width: 21px;
+ padding: 0px;
+ border: 0px;
+ }
+ }
+
+ .emoji-picker__item {
+ border-radius: 6px;
+ cursor: pointer;
+ font-size: 18px;
+ margin: 3px;
+ }
+}
+.emojisprite-wrapper {
+ cursor: pointer;
+}
+
+.emoji-picker__preview {
+ border-top: 1px solid;
+ display: table-cell;
+ vertical-align: middle;
+ flex-grow: 0;
+ flex-shrink: 0;
+ height:45px;
+ width: 278px;
+ padding: 3px 10px;
+
+ &.emoji-picker__preview-placeholder {
+ padding: 12px;
+ }
+
+ .emoji-picker__preview-image-box {
+ display: table-cell;
+ vertical-align: middle;
+ height: 36px;
+ width: 42px;
+
+ .sprite-preview {
+ height: 36px;
+ width: 36px;
+ vertical-align: middle;
+ padding: 0px;
+ border: 0px;
+ display: inline-block;
+ }
+ }
+
+ .emoji-picker__preview-image {
+ max-height: 36px;
+ max-width: 42px;
+ padding: 0 10px 0 0;
+
+ }
+
+ .emoji-picker__preview-name {
+
+ font-size: 13px;
+ font-weight: bold;
+ }
+
+ .emoji-picker__preview-aliases {
+ display: block;
+ font-size: 12px;
+
+ font-weight: bold;
+ }
+}
diff --git a/webapp/sass/components/_module.scss b/webapp/sass/components/_module.scss
index c1114bbcb..2cf310a48 100644
--- a/webapp/sass/components/_module.scss
+++ b/webapp/sass/components/_module.scss
@@ -3,6 +3,7 @@
@import 'buttons';
@import 'dropdown';
@import 'emoticons';
+@import 'emojisprite';
@import 'error-bar';
@import 'files';
@import 'inputs';
diff --git a/webapp/sass/layout/_post-right.scss b/webapp/sass/layout/_post-right.scss
index 9a0f658a2..d4c1daa6e 100644
--- a/webapp/sass/layout/_post-right.scss
+++ b/webapp/sass/layout/_post-right.scss
@@ -62,10 +62,6 @@
.post-create__container {
width: 100%;
- .textarea-wrapper {
- min-height: 100px;
- }
-
.btn {
margin-bottom: 10px;
@@ -154,6 +150,7 @@
overflow: auto;
position: relative;
padding-top: 10px;
+ min-height: 429px;
.file-preview__container {
margin-top: 5px;
diff --git a/webapp/sass/layout/_post.scss b/webapp/sass/layout/_post.scss
index 1e1dd4b08..892eea860 100644
--- a/webapp/sass/layout/_post.scss
+++ b/webapp/sass/layout/_post.scss
@@ -23,7 +23,7 @@
}
.textarea-wrapper {
- min-height: 36px;
+ min-height: 37px;
position: relative;
.textbox-preview-area {
@@ -371,7 +371,15 @@
padding: .5em 15px 0;
width: 100%;
}
+ #reply_textbox.custom-textarea-emoji{
+ bottom: 0;
+ max-height: 162px !important;
+ padding-right: 60px;
+ padding-top: 6px;
+ resize: none;
+
+ }
.center {
max-width: 1028px;
}
@@ -386,6 +394,25 @@
-ms-overflow-style: auto;
overflow: auto;
padding-right: 43px;
+ resize: none;
+ }
+
+ #post_textbox-reference.custom-textarea-emoji {
+ padding-right: 43px;
+ resize: none;
+ }
+
+
+ #reply_textbox.custom-textarea-emoji {
+ padding-right: 60px;
+ resize: none;
+
+ }
+
+ #post_textbox.custom-textarea-emoji {
+ padding-right: 60px;
+ resize: none;
+
}
}
}
@@ -425,8 +452,28 @@
max-height: 162px !important;
padding-right: 35px;
padding-top: 8px;
+ resize: none;
+
+ }
+
+ #post_textbox-reference.custom-textarea-emoji {
+ bottom: 0;
+ max-height: 162px !important;
+ padding-right: 35px;
+ padding-top: 8px;
+ resize: none;
+
}
+
+ #post_textbox.custom-textarea-emoji {
+ bottom: 0;
+ max-height: 162px !important;
+ padding-right: 60px;
+ padding-top: 8px;
+ resize: none;
+
+ }
.textarea-div {
line-height: 1.5;
max-height: 163px !important;
@@ -436,13 +483,12 @@
}
.btn-file {
- @include opacity(.5);
@include single-transition(all, .15s);
font-size: 16px;
- padding: 7px 9px 6px;
+ padding: 8px 9px 4px;
position: absolute;
right: 0;
- top: 1px;
+ top: 0;
z-index: 5;
svg {
@@ -452,7 +498,6 @@
&:hover,
&:active {
- @include opacity(.9);
box-shadow: none;
}
@@ -464,6 +509,48 @@
@include opacity(.1);
}
}
+
+ .icon--attachment {
+ @include opacity(.5);
+ display: inline-block;
+ position: relative;
+ vertical-align: top;
+
+ input {
+ cursor: pointer;
+ direction: ltr;
+ filter: alpha(opacity=0);
+ font-size: 23px;
+ height: 100%;
+ margin: 0;
+ opacity: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ width: 100%;
+ }
+
+ &:hover {
+ @include opacity(.9);
+ }
+ }
+ }
+
+
+ .icon--emoji-picker {
+ @include opacity(.5);
+ @include single-transition(all, .15s);
+ cursor: pointer;
+ font-size: 19px;
+ margin-left: 7px;
+ position: relative;
+ vertical-align: top;
+
+ &:hover,
+ &:active {
+ @include opacity(.9);
+ box-shadow: none;
+ }
}
textarea {
diff --git a/webapp/sass/responsive/_mobile.scss b/webapp/sass/responsive/_mobile.scss
index 4fbec082a..e6cf0ed7d 100644
--- a/webapp/sass/responsive/_mobile.scss
+++ b/webapp/sass/responsive/_mobile.scss
@@ -31,6 +31,15 @@
}
}
+ .post-create__container{
+ .post-create-body {
+ .icon__postcontent_picker {
+ display:none;
+ top: -7px;
+ }
+ }
+ }
+
.suggestion-list__content {
max-height: 145px;
}
@@ -1098,6 +1107,13 @@
padding: .5em 1em;
}
+ .emoji-rhs {
+ position: relative;
+ display: none;
+ top: 1px;
+ right: -1px;
+ }
+
.msg-typing:empty {
display: none;
}
diff --git a/webapp/sass/responsive/_tablet.scss b/webapp/sass/responsive/_tablet.scss
index 3bafc38d4..6924786b9 100644
--- a/webapp/sass/responsive/_tablet.scss
+++ b/webapp/sass/responsive/_tablet.scss
@@ -19,14 +19,23 @@
width: 300px;
}
}
-
+ .post-right__scroll{
+ .post-create__container{
+ .post-create-body {
+ .icon__emoji_picker {
+ display:none;
+ top: -7px;
+ }
+ }
+ }
+ }
.post-create__container {
form {
padding: .5em 0 0;
}
.post-create-footer {
- padding: 0 45px;
+ padding: 0 45px 0 8px;
.post-error {
position: relative;
@@ -46,6 +55,7 @@
display: table-cell;
padding-left: 45px;
+
.sidebar--right & {
padding-left: 0;
}
@@ -54,15 +64,30 @@
.app__content & {
.btn-file {
bottom: -2px;
- left: 0;
+ left: 10px;
line-height: 36px;
padding: 0;
top: auto;
- width: 45px;
+ width: 25px;
}
}
- .send-button {
+ .app__content & {
+ .icon {
+ position: relative;
+ top: 3px;
+
+ }
+ }
+
+ .icon__emoji_picker {
+ position: relative;
+ display: none;
+ top: 1px;
+ right: -1px;
+ }
+
+ .send-button {
display: table-cell;
}
}
diff --git a/webapp/stores/emoji_store.jsx b/webapp/stores/emoji_store.jsx
index 212583ea8..444a27c72 100644
--- a/webapp/stores/emoji_store.jsx
+++ b/webapp/stores/emoji_store.jsx
@@ -5,12 +5,13 @@ import Client from '../client/web_client.jsx';
import AppDispatcher from '../dispatcher/app_dispatcher.jsx';
import Constants from 'utils/constants.jsx';
import EventEmitter from 'events';
-
import * as Emoji from 'utils/emoji.jsx';
const ActionTypes = Constants.ActionTypes;
const CHANGE_EVENT = 'changed';
+const RECENT_EMOJI_KEY = 'recentEmojis';
+const MAXIMUM_RECENT_EMOJI = 27;
// Wrap the contents of the store so that we don't need to construct an ES6 map where most of the content
// (the system emojis) will never change. It provides the get/has functions of a map and an iterator so
@@ -139,6 +140,48 @@ class EmojiStore extends EventEmitter {
return this.map.get(name);
}
+ addRecentEmoji(rawAlias) {
+ const recentEmojis = this.getRecentEmojis();
+
+ const alias = rawAlias.split(':').join('');
+
+ let emoji = this.getCustomEmojiMap().get(alias);
+
+ if (!emoji) {
+ const emojiIndex = Emoji.EmojiIndicesByAlias.get(alias);
+ emoji = Emoji.Emojis[emojiIndex];
+ }
+
+ if (!emoji) {
+ // something is wrong, so we return
+ return;
+ }
+
+ // odd workaround to the lack of array.findLastIndex - reverse looping & splice
+ for (let i = recentEmojis.length - 1; i >= 0; i--) {
+ if ((emoji.name && recentEmojis[i].name === emoji.name) ||
+ (emoji.filename && recentEmojis[i].filename === emoji.filename)) {
+ recentEmojis.splice(i, 1);
+ break;
+ }
+ }
+ recentEmojis.push(emoji);
+
+ // cut off the _top_ if it's over length (since new are added to end)
+ if (recentEmojis.length > MAXIMUM_RECENT_EMOJI) {
+ recentEmojis.splice(0, recentEmojis.length - MAXIMUM_RECENT_EMOJI);
+ }
+ localStorage.setItem(RECENT_EMOJI_KEY, JSON.stringify(recentEmojis));
+ }
+
+ getRecentEmojis() {
+ const result = JSON.parse(localStorage.getItem(RECENT_EMOJI_KEY));
+ if (!result) {
+ return [];
+ }
+ return result;
+ }
+
hasUnicode(codepoint) {
return Emoji.EmojiIndicesByUnicode.has(codepoint);
}
@@ -174,6 +217,10 @@ class EmojiStore extends EventEmitter {
this.removeCustomEmoji(action.id);
this.emitChange();
break;
+ case ActionTypes.EMOJI_POSTED:
+ this.addRecentEmoji(action.alias);
+ this.emitChange();
+ break;
}
}
}
diff --git a/webapp/utils/constants.jsx b/webapp/utils/constants.jsx
index d8fc169a3..0abd69a62 100644
--- a/webapp/utils/constants.jsx
+++ b/webapp/utils/constants.jsx
@@ -176,7 +176,9 @@ export const ActionTypes = keyMirror({
SUGGESTION_SELECT_NEXT: null,
SUGGESTION_SELECT_PREVIOUS: null,
- BROWSER_CHANGE_FOCUS: null
+ BROWSER_CHANGE_FOCUS: null,
+
+ EMOJI_POSTED: null
});
export const WebrtcActionTypes = keyMirror({
@@ -856,6 +858,10 @@ export const Constants = {
WEBRTC_PREVIEW: {
label: 'webrtc_preview',
description: 'Enable WebRTC one on one calls'
+ },
+ EMOJI_PICKER_PREVIEW: {
+ label: 'emojipicker',
+ description: 'Enable emoji picker'
}
},
OVERLAY_TIME_DELAY_SMALL: 100,
diff --git a/webapp/utils/emoji.jsx b/webapp/utils/emoji.jsx
index e129baae8..d9e9ee897 100644
--- a/webapp/utils/emoji.jsx
+++ b/webapp/utils/emoji.jsx
@@ -5,7 +5,7 @@
/* eslint-disable */
-export const Emojis = [{"aliases":["smile"],"filename":"1f604"},{"aliases":["smiley"],"filename":"1f603"},{"aliases":["grinning"],"filename":"1f600"},{"aliases":["blush"],"filename":"1f60a"},{"aliases":["relaxed"],"filename":"263a"},{"aliases":["wink"],"filename":"1f609"},{"aliases":["heart_eyes"],"filename":"1f60d"},{"aliases":["kissing_heart"],"filename":"1f618"},{"aliases":["kissing_closed_eyes"],"filename":"1f61a"},{"aliases":["kissing"],"filename":"1f617"},{"aliases":["kissing_smiling_eyes"],"filename":"1f619"},{"aliases":["stuck_out_tongue_winking_eye"],"filename":"1f61c"},{"aliases":["stuck_out_tongue_closed_eyes"],"filename":"1f61d"},{"aliases":["stuck_out_tongue"],"filename":"1f61b"},{"aliases":["flushed"],"filename":"1f633"},{"aliases":["grin"],"filename":"1f601"},{"aliases":["pensive"],"filename":"1f614"},{"aliases":["relieved"],"filename":"1f60c"},{"aliases":["unamused"],"filename":"1f612"},{"aliases":["disappointed"],"filename":"1f61e"},{"aliases":["persevere"],"filename":"1f623"},{"aliases":["cry"],"filename":"1f622"},{"aliases":["joy"],"filename":"1f602"},{"aliases":["sob"],"filename":"1f62d"},{"aliases":["sleepy"],"filename":"1f62a"},{"aliases":["disappointed_relieved"],"filename":"1f625"},{"aliases":["cold_sweat"],"filename":"1f630"},{"aliases":["sweat_smile"],"filename":"1f605"},{"aliases":["sweat"],"filename":"1f613"},{"aliases":["weary"],"filename":"1f629"},{"aliases":["tired_face"],"filename":"1f62b"},{"aliases":["fearful"],"filename":"1f628"},{"aliases":["scream"],"filename":"1f631"},{"aliases":["angry"],"filename":"1f620"},{"aliases":["rage","pout"],"filename":"1f621"},{"aliases":["triumph"],"filename":"1f624"},{"aliases":["confounded"],"filename":"1f616"},{"aliases":["laughing","satisfied"],"filename":"1f606"},{"aliases":["yum"],"filename":"1f60b"},{"aliases":["mask"],"filename":"1f637"},{"aliases":["sunglasses"],"filename":"1f60e"},{"aliases":["sleeping"],"filename":"1f634"},{"aliases":["dizzy_face"],"filename":"1f635"},{"aliases":["astonished"],"filename":"1f632"},{"aliases":["worried"],"filename":"1f61f"},{"aliases":["frowning"],"filename":"1f626"},{"aliases":["anguished"],"filename":"1f627"},{"aliases":["smiling_imp"],"filename":"1f608"},{"aliases":["imp"],"filename":"1f47f"},{"aliases":["open_mouth"],"filename":"1f62e"},{"aliases":["grimacing"],"filename":"1f62c"},{"aliases":["neutral_face"],"filename":"1f610"},{"aliases":["confused"],"filename":"1f615"},{"aliases":["hushed"],"filename":"1f62f"},{"aliases":["no_mouth"],"filename":"1f636"},{"aliases":["innocent"],"filename":"1f607"},{"aliases":["smirk"],"filename":"1f60f"},{"aliases":["expressionless"],"filename":"1f611"},{"aliases":["man_with_gua_pi_mao"],"filename":"1f472"},{"aliases":["man_with_turban"],"filename":"1f473"},{"aliases":["cop"],"filename":"1f46e"},{"aliases":["construction_worker"],"filename":"1f477"},{"aliases":["guardsman"],"filename":"1f482"},{"aliases":["baby"],"filename":"1f476"},{"aliases":["boy"],"filename":"1f466"},{"aliases":["girl"],"filename":"1f467"},{"aliases":["man"],"filename":"1f468"},{"aliases":["woman"],"filename":"1f469"},{"aliases":["older_man"],"filename":"1f474"},{"aliases":["older_woman"],"filename":"1f475"},{"aliases":["person_with_blond_hair"],"filename":"1f471"},{"aliases":["angel"],"filename":"1f47c"},{"aliases":["princess"],"filename":"1f478"},{"aliases":["smiley_cat"],"filename":"1f63a"},{"aliases":["smile_cat"],"filename":"1f638"},{"aliases":["heart_eyes_cat"],"filename":"1f63b"},{"aliases":["kissing_cat"],"filename":"1f63d"},{"aliases":["smirk_cat"],"filename":"1f63c"},{"aliases":["scream_cat"],"filename":"1f640"},{"aliases":["crying_cat_face"],"filename":"1f63f"},{"aliases":["joy_cat"],"filename":"1f639"},{"aliases":["pouting_cat"],"filename":"1f63e"},{"aliases":["japanese_ogre"],"filename":"1f479"},{"aliases":["japanese_goblin"],"filename":"1f47a"},{"aliases":["see_no_evil"],"filename":"1f648"},{"aliases":["hear_no_evil"],"filename":"1f649"},{"aliases":["speak_no_evil"],"filename":"1f64a"},{"aliases":["skull"],"filename":"1f480"},{"aliases":["alien"],"filename":"1f47d"},{"aliases":["hankey","poop","shit"],"filename":"1f4a9"},{"aliases":["fire"],"filename":"1f525"},{"aliases":["sparkles"],"filename":"2728"},{"aliases":["star2"],"filename":"1f31f"},{"aliases":["dizzy"],"filename":"1f4ab"},{"aliases":["boom","collision"],"filename":"1f4a5"},{"aliases":["anger"],"filename":"1f4a2"},{"aliases":["sweat_drops"],"filename":"1f4a6"},{"aliases":["droplet"],"filename":"1f4a7"},{"aliases":["zzz"],"filename":"1f4a4"},{"aliases":["dash"],"filename":"1f4a8"},{"aliases":["ear"],"filename":"1f442"},{"aliases":["eyes"],"filename":"1f440"},{"aliases":["nose"],"filename":"1f443"},{"aliases":["tongue"],"filename":"1f445"},{"aliases":["lips"],"filename":"1f444"},{"aliases":["+1","thumbsup"],"filename":"1f44d"},{"aliases":["-1","thumbsdown"],"filename":"1f44e"},{"aliases":["ok_hand"],"filename":"1f44c"},{"aliases":["facepunch","punch"],"filename":"1f44a"},{"aliases":["fist"],"filename":"270a"},{"aliases":["v"],"filename":"270c"},{"aliases":["wave"],"filename":"1f44b"},{"aliases":["hand","raised_hand"],"filename":"270b"},{"aliases":["open_hands"],"filename":"1f450"},{"aliases":["point_up_2"],"filename":"1f446"},{"aliases":["point_down"],"filename":"1f447"},{"aliases":["point_right"],"filename":"1f449"},{"aliases":["point_left"],"filename":"1f448"},{"aliases":["raised_hands"],"filename":"1f64c"},{"aliases":["pray"],"filename":"1f64f"},{"aliases":["point_up"],"filename":"261d"},{"aliases":["clap"],"filename":"1f44f"},{"aliases":["muscle"],"filename":"1f4aa"},{"aliases":["walking"],"filename":"1f6b6"},{"aliases":["runner","running"],"filename":"1f3c3"},{"aliases":["dancer"],"filename":"1f483"},{"aliases":["couple"],"filename":"1f46b"},{"aliases":["family"],"filename":"1f46a"},{"aliases":["two_men_holding_hands"],"filename":"1f46c"},{"aliases":["two_women_holding_hands"],"filename":"1f46d"},{"aliases":["couplekiss"],"filename":"1f48f"},{"aliases":["couple_with_heart"],"filename":"1f491"},{"aliases":["dancers"],"filename":"1f46f"},{"aliases":["ok_woman"],"filename":"1f646"},{"aliases":["no_good","ng_woman"],"filename":"1f645"},{"aliases":["information_desk_person"],"filename":"1f481"},{"aliases":["raising_hand"],"filename":"1f64b"},{"aliases":["massage"],"filename":"1f486"},{"aliases":["haircut"],"filename":"1f487"},{"aliases":["nail_care"],"filename":"1f485"},{"aliases":["bride_with_veil"],"filename":"1f470"},{"aliases":["person_with_pouting_face"],"filename":"1f64e"},{"aliases":["person_frowning"],"filename":"1f64d"},{"aliases":["bow"],"filename":"1f647"},{"aliases":["tophat"],"filename":"1f3a9"},{"aliases":["crown"],"filename":"1f451"},{"aliases":["womans_hat"],"filename":"1f452"},{"aliases":["athletic_shoe"],"filename":"1f45f"},{"aliases":["mans_shoe","shoe"],"filename":"1f45e"},{"aliases":["sandal"],"filename":"1f461"},{"aliases":["high_heel"],"filename":"1f460"},{"aliases":["boot"],"filename":"1f462"},{"aliases":["shirt","tshirt"],"filename":"1f455"},{"aliases":["necktie"],"filename":"1f454"},{"aliases":["womans_clothes"],"filename":"1f45a"},{"aliases":["dress"],"filename":"1f457"},{"aliases":["running_shirt_with_sash"],"filename":"1f3bd"},{"aliases":["jeans"],"filename":"1f456"},{"aliases":["kimono"],"filename":"1f458"},{"aliases":["bikini"],"filename":"1f459"},{"aliases":["briefcase"],"filename":"1f4bc"},{"aliases":["handbag"],"filename":"1f45c"},{"aliases":["pouch"],"filename":"1f45d"},{"aliases":["purse"],"filename":"1f45b"},{"aliases":["eyeglasses"],"filename":"1f453"},{"aliases":["ribbon"],"filename":"1f380"},{"aliases":["closed_umbrella"],"filename":"1f302"},{"aliases":["lipstick"],"filename":"1f484"},{"aliases":["yellow_heart"],"filename":"1f49b"},{"aliases":["blue_heart"],"filename":"1f499"},{"aliases":["purple_heart"],"filename":"1f49c"},{"aliases":["green_heart"],"filename":"1f49a"},{"aliases":["heart"],"filename":"2764"},{"aliases":["broken_heart"],"filename":"1f494"},{"aliases":["heartpulse"],"filename":"1f497"},{"aliases":["heartbeat"],"filename":"1f493"},{"aliases":["two_hearts"],"filename":"1f495"},{"aliases":["sparkling_heart"],"filename":"1f496"},{"aliases":["revolving_hearts"],"filename":"1f49e"},{"aliases":["cupid"],"filename":"1f498"},{"aliases":["love_letter"],"filename":"1f48c"},{"aliases":["kiss"],"filename":"1f48b"},{"aliases":["ring"],"filename":"1f48d"},{"aliases":["gem"],"filename":"1f48e"},{"aliases":["bust_in_silhouette"],"filename":"1f464"},{"aliases":["busts_in_silhouette"],"filename":"1f465"},{"aliases":["speech_balloon"],"filename":"1f4ac"},{"aliases":["footprints"],"filename":"1f463"},{"aliases":["thought_balloon"],"filename":"1f4ad"},{"aliases":["dog"],"filename":"1f436"},{"aliases":["wolf"],"filename":"1f43a"},{"aliases":["cat"],"filename":"1f431"},{"aliases":["mouse"],"filename":"1f42d"},{"aliases":["hamster"],"filename":"1f439"},{"aliases":["rabbit"],"filename":"1f430"},{"aliases":["frog"],"filename":"1f438"},{"aliases":["tiger"],"filename":"1f42f"},{"aliases":["koala"],"filename":"1f428"},{"aliases":["bear"],"filename":"1f43b"},{"aliases":["pig"],"filename":"1f437"},{"aliases":["pig_nose"],"filename":"1f43d"},{"aliases":["cow"],"filename":"1f42e"},{"aliases":["boar"],"filename":"1f417"},{"aliases":["monkey_face"],"filename":"1f435"},{"aliases":["monkey"],"filename":"1f412"},{"aliases":["horse"],"filename":"1f434"},{"aliases":["sheep"],"filename":"1f411"},{"aliases":["elephant"],"filename":"1f418"},{"aliases":["panda_face"],"filename":"1f43c"},{"aliases":["penguin"],"filename":"1f427"},{"aliases":["bird"],"filename":"1f426"},{"aliases":["baby_chick"],"filename":"1f424"},{"aliases":["hatched_chick"],"filename":"1f425"},{"aliases":["hatching_chick"],"filename":"1f423"},{"aliases":["chicken"],"filename":"1f414"},{"aliases":["snake"],"filename":"1f40d"},{"aliases":["turtle"],"filename":"1f422"},{"aliases":["bug"],"filename":"1f41b"},{"aliases":["bee","honeybee"],"filename":"1f41d"},{"aliases":["ant"],"filename":"1f41c"},{"aliases":["beetle"],"filename":"1f41e"},{"aliases":["snail"],"filename":"1f40c"},{"aliases":["octopus"],"filename":"1f419"},{"aliases":["shell"],"filename":"1f41a"},{"aliases":["tropical_fish"],"filename":"1f420"},{"aliases":["fish"],"filename":"1f41f"},{"aliases":["dolphin","flipper"],"filename":"1f42c"},{"aliases":["whale"],"filename":"1f433"},{"aliases":["whale2"],"filename":"1f40b"},{"aliases":["cow2"],"filename":"1f404"},{"aliases":["ram"],"filename":"1f40f"},{"aliases":["rat"],"filename":"1f400"},{"aliases":["water_buffalo"],"filename":"1f403"},{"aliases":["tiger2"],"filename":"1f405"},{"aliases":["rabbit2"],"filename":"1f407"},{"aliases":["dragon"],"filename":"1f409"},{"aliases":["racehorse"],"filename":"1f40e"},{"aliases":["goat"],"filename":"1f410"},{"aliases":["rooster"],"filename":"1f413"},{"aliases":["dog2"],"filename":"1f415"},{"aliases":["pig2"],"filename":"1f416"},{"aliases":["mouse2"],"filename":"1f401"},{"aliases":["ox"],"filename":"1f402"},{"aliases":["dragon_face"],"filename":"1f432"},{"aliases":["blowfish"],"filename":"1f421"},{"aliases":["crocodile"],"filename":"1f40a"},{"aliases":["camel"],"filename":"1f42b"},{"aliases":["dromedary_camel"],"filename":"1f42a"},{"aliases":["leopard"],"filename":"1f406"},{"aliases":["cat2"],"filename":"1f408"},{"aliases":["poodle"],"filename":"1f429"},{"aliases":["feet","paw_prints"],"filename":"1f43e"},{"aliases":["bouquet"],"filename":"1f490"},{"aliases":["cherry_blossom"],"filename":"1f338"},{"aliases":["tulip"],"filename":"1f337"},{"aliases":["four_leaf_clover"],"filename":"1f340"},{"aliases":["rose"],"filename":"1f339"},{"aliases":["sunflower"],"filename":"1f33b"},{"aliases":["hibiscus"],"filename":"1f33a"},{"aliases":["maple_leaf"],"filename":"1f341"},{"aliases":["leaves"],"filename":"1f343"},{"aliases":["fallen_leaf"],"filename":"1f342"},{"aliases":["herb"],"filename":"1f33f"},{"aliases":["ear_of_rice"],"filename":"1f33e"},{"aliases":["mushroom"],"filename":"1f344"},{"aliases":["cactus"],"filename":"1f335"},{"aliases":["palm_tree"],"filename":"1f334"},{"aliases":["evergreen_tree"],"filename":"1f332"},{"aliases":["deciduous_tree"],"filename":"1f333"},{"aliases":["chestnut"],"filename":"1f330"},{"aliases":["seedling"],"filename":"1f331"},{"aliases":["blossom"],"filename":"1f33c"},{"aliases":["globe_with_meridians"],"filename":"1f310"},{"aliases":["sun_with_face"],"filename":"1f31e"},{"aliases":["full_moon_with_face"],"filename":"1f31d"},{"aliases":["new_moon_with_face"],"filename":"1f31a"},{"aliases":["new_moon"],"filename":"1f311"},{"aliases":["waxing_crescent_moon"],"filename":"1f312"},{"aliases":["first_quarter_moon"],"filename":"1f313"},{"aliases":["moon","waxing_gibbous_moon"],"filename":"1f314"},{"aliases":["full_moon"],"filename":"1f315"},{"aliases":["waning_gibbous_moon"],"filename":"1f316"},{"aliases":["last_quarter_moon"],"filename":"1f317"},{"aliases":["waning_crescent_moon"],"filename":"1f318"},{"aliases":["last_quarter_moon_with_face"],"filename":"1f31c"},{"aliases":["first_quarter_moon_with_face"],"filename":"1f31b"},{"aliases":["crescent_moon"],"filename":"1f319"},{"aliases":["earth_africa"],"filename":"1f30d"},{"aliases":["earth_americas"],"filename":"1f30e"},{"aliases":["earth_asia"],"filename":"1f30f"},{"aliases":["volcano"],"filename":"1f30b"},{"aliases":["milky_way"],"filename":"1f30c"},{"aliases":["stars"],"filename":"1f320"},{"aliases":["star"],"filename":"2b50"},{"aliases":["sunny"],"filename":"2600"},{"aliases":["partly_sunny"],"filename":"26c5"},{"aliases":["cloud"],"filename":"2601"},{"aliases":["zap"],"filename":"26a1"},{"aliases":["umbrella"],"filename":"2614"},{"aliases":["snowflake"],"filename":"2744"},{"aliases":["snowman"],"filename":"26c4"},{"aliases":["cyclone"],"filename":"1f300"},{"aliases":["foggy"],"filename":"1f301"},{"aliases":["rainbow"],"filename":"1f308"},{"aliases":["ocean"],"filename":"1f30a"},{"aliases":["bamboo"],"filename":"1f38d"},{"aliases":["gift_heart"],"filename":"1f49d"},{"aliases":["dolls"],"filename":"1f38e"},{"aliases":["school_satchel"],"filename":"1f392"},{"aliases":["mortar_board"],"filename":"1f393"},{"aliases":["flags"],"filename":"1f38f"},{"aliases":["fireworks"],"filename":"1f386"},{"aliases":["sparkler"],"filename":"1f387"},{"aliases":["wind_chime"],"filename":"1f390"},{"aliases":["rice_scene"],"filename":"1f391"},{"aliases":["jack_o_lantern"],"filename":"1f383"},{"aliases":["ghost"],"filename":"1f47b"},{"aliases":["santa"],"filename":"1f385"},{"aliases":["christmas_tree"],"filename":"1f384"},{"aliases":["gift"],"filename":"1f381"},{"aliases":["tanabata_tree"],"filename":"1f38b"},{"aliases":["tada"],"filename":"1f389"},{"aliases":["confetti_ball"],"filename":"1f38a"},{"aliases":["balloon"],"filename":"1f388"},{"aliases":["crossed_flags"],"filename":"1f38c"},{"aliases":["crystal_ball"],"filename":"1f52e"},{"aliases":["movie_camera"],"filename":"1f3a5"},{"aliases":["camera"],"filename":"1f4f7"},{"aliases":["video_camera"],"filename":"1f4f9"},{"aliases":["vhs"],"filename":"1f4fc"},{"aliases":["cd"],"filename":"1f4bf"},{"aliases":["dvd"],"filename":"1f4c0"},{"aliases":["minidisc"],"filename":"1f4bd"},{"aliases":["floppy_disk"],"filename":"1f4be"},{"aliases":["computer"],"filename":"1f4bb"},{"aliases":["iphone"],"filename":"1f4f1"},{"aliases":["phone","telephone"],"filename":"260e"},{"aliases":["telephone_receiver"],"filename":"1f4de"},{"aliases":["pager"],"filename":"1f4df"},{"aliases":["fax"],"filename":"1f4e0"},{"aliases":["satellite"],"filename":"1f4e1"},{"aliases":["tv"],"filename":"1f4fa"},{"aliases":["radio"],"filename":"1f4fb"},{"aliases":["loud_sound"],"filename":"1f50a"},{"aliases":["sound"],"filename":"1f509"},{"aliases":["speaker"],"filename":"1f508"},{"aliases":["mute"],"filename":"1f507"},{"aliases":["bell"],"filename":"1f514"},{"aliases":["no_bell"],"filename":"1f515"},{"aliases":["loudspeaker"],"filename":"1f4e2"},{"aliases":["mega"],"filename":"1f4e3"},{"aliases":["hourglass_flowing_sand"],"filename":"23f3"},{"aliases":["hourglass"],"filename":"231b"},{"aliases":["alarm_clock"],"filename":"23f0"},{"aliases":["watch"],"filename":"231a"},{"aliases":["unlock"],"filename":"1f513"},{"aliases":["lock"],"filename":"1f512"},{"aliases":["lock_with_ink_pen"],"filename":"1f50f"},{"aliases":["closed_lock_with_key"],"filename":"1f510"},{"aliases":["key"],"filename":"1f511"},{"aliases":["mag_right"],"filename":"1f50e"},{"aliases":["bulb"],"filename":"1f4a1"},{"aliases":["flashlight"],"filename":"1f526"},{"aliases":["high_brightness"],"filename":"1f506"},{"aliases":["low_brightness"],"filename":"1f505"},{"aliases":["electric_plug"],"filename":"1f50c"},{"aliases":["battery"],"filename":"1f50b"},{"aliases":["mag"],"filename":"1f50d"},{"aliases":["bathtub"],"filename":"1f6c1"},{"aliases":["bath"],"filename":"1f6c0"},{"aliases":["shower"],"filename":"1f6bf"},{"aliases":["toilet"],"filename":"1f6bd"},{"aliases":["wrench"],"filename":"1f527"},{"aliases":["nut_and_bolt"],"filename":"1f529"},{"aliases":["hammer"],"filename":"1f528"},{"aliases":["door"],"filename":"1f6aa"},{"aliases":["smoking"],"filename":"1f6ac"},{"aliases":["bomb"],"filename":"1f4a3"},{"aliases":["gun"],"filename":"1f52b"},{"aliases":["hocho","knife"],"filename":"1f52a"},{"aliases":["pill"],"filename":"1f48a"},{"aliases":["syringe"],"filename":"1f489"},{"aliases":["moneybag"],"filename":"1f4b0"},{"aliases":["yen"],"filename":"1f4b4"},{"aliases":["dollar"],"filename":"1f4b5"},{"aliases":["pound"],"filename":"1f4b7"},{"aliases":["euro"],"filename":"1f4b6"},{"aliases":["credit_card"],"filename":"1f4b3"},{"aliases":["money_with_wings"],"filename":"1f4b8"},{"aliases":["calling"],"filename":"1f4f2"},{"aliases":["e-mail"],"filename":"1f4e7"},{"aliases":["inbox_tray"],"filename":"1f4e5"},{"aliases":["outbox_tray"],"filename":"1f4e4"},{"aliases":["email","envelope"],"filename":"2709"},{"aliases":["envelope_with_arrow"],"filename":"1f4e9"},{"aliases":["incoming_envelope"],"filename":"1f4e8"},{"aliases":["postal_horn"],"filename":"1f4ef"},{"aliases":["mailbox"],"filename":"1f4eb"},{"aliases":["mailbox_closed"],"filename":"1f4ea"},{"aliases":["mailbox_with_mail"],"filename":"1f4ec"},{"aliases":["mailbox_with_no_mail"],"filename":"1f4ed"},{"aliases":["postbox"],"filename":"1f4ee"},{"aliases":["package"],"filename":"1f4e6"},{"aliases":["memo","pencil"],"filename":"1f4dd"},{"aliases":["page_facing_up"],"filename":"1f4c4"},{"aliases":["page_with_curl"],"filename":"1f4c3"},{"aliases":["bookmark_tabs"],"filename":"1f4d1"},{"aliases":["bar_chart"],"filename":"1f4ca"},{"aliases":["chart_with_upwards_trend"],"filename":"1f4c8"},{"aliases":["chart_with_downwards_trend"],"filename":"1f4c9"},{"aliases":["scroll"],"filename":"1f4dc"},{"aliases":["clipboard"],"filename":"1f4cb"},{"aliases":["date"],"filename":"1f4c5"},{"aliases":["calendar"],"filename":"1f4c6"},{"aliases":["card_index"],"filename":"1f4c7"},{"aliases":["file_folder"],"filename":"1f4c1"},{"aliases":["open_file_folder"],"filename":"1f4c2"},{"aliases":["scissors"],"filename":"2702"},{"aliases":["pushpin"],"filename":"1f4cc"},{"aliases":["paperclip"],"filename":"1f4ce"},{"aliases":["black_nib"],"filename":"2712"},{"aliases":["pencil2"],"filename":"270f"},{"aliases":["straight_ruler"],"filename":"1f4cf"},{"aliases":["triangular_ruler"],"filename":"1f4d0"},{"aliases":["closed_book"],"filename":"1f4d5"},{"aliases":["green_book"],"filename":"1f4d7"},{"aliases":["blue_book"],"filename":"1f4d8"},{"aliases":["orange_book"],"filename":"1f4d9"},{"aliases":["notebook"],"filename":"1f4d3"},{"aliases":["notebook_with_decorative_cover"],"filename":"1f4d4"},{"aliases":["ledger"],"filename":"1f4d2"},{"aliases":["books"],"filename":"1f4da"},{"aliases":["book","open_book"],"filename":"1f4d6"},{"aliases":["bookmark"],"filename":"1f516"},{"aliases":["name_badge"],"filename":"1f4db"},{"aliases":["microscope"],"filename":"1f52c"},{"aliases":["telescope"],"filename":"1f52d"},{"aliases":["newspaper"],"filename":"1f4f0"},{"aliases":["art"],"filename":"1f3a8"},{"aliases":["clapper"],"filename":"1f3ac"},{"aliases":["microphone"],"filename":"1f3a4"},{"aliases":["headphones"],"filename":"1f3a7"},{"aliases":["musical_score"],"filename":"1f3bc"},{"aliases":["musical_note"],"filename":"1f3b5"},{"aliases":["notes"],"filename":"1f3b6"},{"aliases":["musical_keyboard"],"filename":"1f3b9"},{"aliases":["violin"],"filename":"1f3bb"},{"aliases":["trumpet"],"filename":"1f3ba"},{"aliases":["saxophone"],"filename":"1f3b7"},{"aliases":["guitar"],"filename":"1f3b8"},{"aliases":["space_invader"],"filename":"1f47e"},{"aliases":["video_game"],"filename":"1f3ae"},{"aliases":["black_joker"],"filename":"1f0cf"},{"aliases":["flower_playing_cards"],"filename":"1f3b4"},{"aliases":["mahjong"],"filename":"1f004"},{"aliases":["game_die"],"filename":"1f3b2"},{"aliases":["dart"],"filename":"1f3af"},{"aliases":["football"],"filename":"1f3c8"},{"aliases":["basketball"],"filename":"1f3c0"},{"aliases":["soccer"],"filename":"26bd"},{"aliases":["baseball"],"filename":"26be"},{"aliases":["tennis"],"filename":"1f3be"},{"aliases":["8ball"],"filename":"1f3b1"},{"aliases":["rugby_football"],"filename":"1f3c9"},{"aliases":["bowling"],"filename":"1f3b3"},{"aliases":["golf"],"filename":"26f3"},{"aliases":["mountain_bicyclist"],"filename":"1f6b5"},{"aliases":["bicyclist"],"filename":"1f6b4"},{"aliases":["checkered_flag"],"filename":"1f3c1"},{"aliases":["horse_racing"],"filename":"1f3c7"},{"aliases":["trophy"],"filename":"1f3c6"},{"aliases":["ski"],"filename":"1f3bf"},{"aliases":["snowboarder"],"filename":"1f3c2"},{"aliases":["swimmer"],"filename":"1f3ca"},{"aliases":["surfer"],"filename":"1f3c4"},{"aliases":["fishing_pole_and_fish"],"filename":"1f3a3"},{"aliases":["coffee"],"filename":"2615"},{"aliases":["tea"],"filename":"1f375"},{"aliases":["sake"],"filename":"1f376"},{"aliases":["baby_bottle"],"filename":"1f37c"},{"aliases":["beer"],"filename":"1f37a"},{"aliases":["beers"],"filename":"1f37b"},{"aliases":["cocktail"],"filename":"1f378"},{"aliases":["tropical_drink"],"filename":"1f379"},{"aliases":["wine_glass"],"filename":"1f377"},{"aliases":["fork_and_knife"],"filename":"1f374"},{"aliases":["pizza"],"filename":"1f355"},{"aliases":["hamburger"],"filename":"1f354"},{"aliases":["fries"],"filename":"1f35f"},{"aliases":["poultry_leg"],"filename":"1f357"},{"aliases":["meat_on_bone"],"filename":"1f356"},{"aliases":["spaghetti"],"filename":"1f35d"},{"aliases":["curry"],"filename":"1f35b"},{"aliases":["fried_shrimp"],"filename":"1f364"},{"aliases":["bento"],"filename":"1f371"},{"aliases":["sushi"],"filename":"1f363"},{"aliases":["fish_cake"],"filename":"1f365"},{"aliases":["rice_ball"],"filename":"1f359"},{"aliases":["rice_cracker"],"filename":"1f358"},{"aliases":["rice"],"filename":"1f35a"},{"aliases":["ramen"],"filename":"1f35c"},{"aliases":["stew"],"filename":"1f372"},{"aliases":["oden"],"filename":"1f362"},{"aliases":["dango"],"filename":"1f361"},{"aliases":["egg"],"filename":"1f373"},{"aliases":["bread"],"filename":"1f35e"},{"aliases":["doughnut"],"filename":"1f369"},{"aliases":["custard"],"filename":"1f36e"},{"aliases":["icecream"],"filename":"1f366"},{"aliases":["ice_cream"],"filename":"1f368"},{"aliases":["shaved_ice"],"filename":"1f367"},{"aliases":["birthday"],"filename":"1f382"},{"aliases":["cake"],"filename":"1f370"},{"aliases":["cookie"],"filename":"1f36a"},{"aliases":["chocolate_bar"],"filename":"1f36b"},{"aliases":["candy"],"filename":"1f36c"},{"aliases":["lollipop"],"filename":"1f36d"},{"aliases":["honey_pot"],"filename":"1f36f"},{"aliases":["apple"],"filename":"1f34e"},{"aliases":["green_apple"],"filename":"1f34f"},{"aliases":["tangerine","orange","mandarin"],"filename":"1f34a"},{"aliases":["lemon"],"filename":"1f34b"},{"aliases":["cherries"],"filename":"1f352"},{"aliases":["grapes"],"filename":"1f347"},{"aliases":["watermelon"],"filename":"1f349"},{"aliases":["strawberry"],"filename":"1f353"},{"aliases":["peach"],"filename":"1f351"},{"aliases":["melon"],"filename":"1f348"},{"aliases":["banana"],"filename":"1f34c"},{"aliases":["pear"],"filename":"1f350"},{"aliases":["pineapple"],"filename":"1f34d"},{"aliases":["sweet_potato"],"filename":"1f360"},{"aliases":["eggplant"],"filename":"1f346"},{"aliases":["tomato"],"filename":"1f345"},{"aliases":["corn"],"filename":"1f33d"},{"aliases":["house"],"filename":"1f3e0"},{"aliases":["house_with_garden"],"filename":"1f3e1"},{"aliases":["school"],"filename":"1f3eb"},{"aliases":["office"],"filename":"1f3e2"},{"aliases":["post_office"],"filename":"1f3e3"},{"aliases":["hospital"],"filename":"1f3e5"},{"aliases":["bank"],"filename":"1f3e6"},{"aliases":["convenience_store"],"filename":"1f3ea"},{"aliases":["love_hotel"],"filename":"1f3e9"},{"aliases":["hotel"],"filename":"1f3e8"},{"aliases":["wedding"],"filename":"1f492"},{"aliases":["church"],"filename":"26ea"},{"aliases":["department_store"],"filename":"1f3ec"},{"aliases":["european_post_office"],"filename":"1f3e4"},{"aliases":["city_sunrise"],"filename":"1f307"},{"aliases":["city_sunset"],"filename":"1f306"},{"aliases":["japanese_castle"],"filename":"1f3ef"},{"aliases":["european_castle"],"filename":"1f3f0"},{"aliases":["tent"],"filename":"26fa"},{"aliases":["factory"],"filename":"1f3ed"},{"aliases":["tokyo_tower"],"filename":"1f5fc"},{"aliases":["japan"],"filename":"1f5fe"},{"aliases":["mount_fuji"],"filename":"1f5fb"},{"aliases":["sunrise_over_mountains"],"filename":"1f304"},{"aliases":["sunrise"],"filename":"1f305"},{"aliases":["night_with_stars"],"filename":"1f303"},{"aliases":["statue_of_liberty"],"filename":"1f5fd"},{"aliases":["bridge_at_night"],"filename":"1f309"},{"aliases":["carousel_horse"],"filename":"1f3a0"},{"aliases":["ferris_wheel"],"filename":"1f3a1"},{"aliases":["fountain"],"filename":"26f2"},{"aliases":["roller_coaster"],"filename":"1f3a2"},{"aliases":["ship"],"filename":"1f6a2"},{"aliases":["boat","sailboat"],"filename":"26f5"},{"aliases":["speedboat"],"filename":"1f6a4"},{"aliases":["rowboat"],"filename":"1f6a3"},{"aliases":["anchor"],"filename":"2693"},{"aliases":["rocket"],"filename":"1f680"},{"aliases":["airplane"],"filename":"2708"},{"aliases":["seat"],"filename":"1f4ba"},{"aliases":["helicopter"],"filename":"1f681"},{"aliases":["steam_locomotive"],"filename":"1f682"},{"aliases":["tram"],"filename":"1f68a"},{"aliases":["station"],"filename":"1f689"},{"aliases":["mountain_railway"],"filename":"1f69e"},{"aliases":["train2"],"filename":"1f686"},{"aliases":["bullettrain_side"],"filename":"1f684"},{"aliases":["bullettrain_front"],"filename":"1f685"},{"aliases":["light_rail"],"filename":"1f688"},{"aliases":["metro"],"filename":"1f687"},{"aliases":["monorail"],"filename":"1f69d"},{"aliases":["train"],"filename":"1f68b"},{"aliases":["railway_car"],"filename":"1f683"},{"aliases":["trolleybus"],"filename":"1f68e"},{"aliases":["bus"],"filename":"1f68c"},{"aliases":["oncoming_bus"],"filename":"1f68d"},{"aliases":["blue_car"],"filename":"1f699"},{"aliases":["oncoming_automobile"],"filename":"1f698"},{"aliases":["car","red_car"],"filename":"1f697"},{"aliases":["taxi"],"filename":"1f695"},{"aliases":["oncoming_taxi"],"filename":"1f696"},{"aliases":["articulated_lorry"],"filename":"1f69b"},{"aliases":["truck"],"filename":"1f69a"},{"aliases":["rotating_light"],"filename":"1f6a8"},{"aliases":["police_car"],"filename":"1f693"},{"aliases":["oncoming_police_car"],"filename":"1f694"},{"aliases":["fire_engine"],"filename":"1f692"},{"aliases":["ambulance"],"filename":"1f691"},{"aliases":["minibus"],"filename":"1f690"},{"aliases":["bike"],"filename":"1f6b2"},{"aliases":["aerial_tramway"],"filename":"1f6a1"},{"aliases":["suspension_railway"],"filename":"1f69f"},{"aliases":["mountain_cableway"],"filename":"1f6a0"},{"aliases":["tractor"],"filename":"1f69c"},{"aliases":["barber"],"filename":"1f488"},{"aliases":["busstop"],"filename":"1f68f"},{"aliases":["ticket"],"filename":"1f3ab"},{"aliases":["vertical_traffic_light"],"filename":"1f6a6"},{"aliases":["traffic_light"],"filename":"1f6a5"},{"aliases":["warning"],"filename":"26a0"},{"aliases":["construction"],"filename":"1f6a7"},{"aliases":["beginner"],"filename":"1f530"},{"aliases":["fuelpump"],"filename":"26fd"},{"aliases":["izakaya_lantern","lantern"],"filename":"1f3ee"},{"aliases":["slot_machine"],"filename":"1f3b0"},{"aliases":["hotsprings"],"filename":"2668"},{"aliases":["moyai"],"filename":"1f5ff"},{"aliases":["circus_tent"],"filename":"1f3aa"},{"aliases":["performing_arts"],"filename":"1f3ad"},{"aliases":["round_pushpin"],"filename":"1f4cd"},{"aliases":["triangular_flag_on_post"],"filename":"1f6a9"},{"aliases":["jp"],"filename":"1f1ef-1f1f5"},{"aliases":["kr"],"filename":"1f1f0-1f1f7"},{"aliases":["de"],"filename":"1f1e9-1f1ea"},{"aliases":["cn"],"filename":"1f1e8-1f1f3"},{"aliases":["us"],"filename":"1f1fa-1f1f8"},{"aliases":["fr"],"filename":"1f1eb-1f1f7"},{"aliases":["es"],"filename":"1f1ea-1f1f8"},{"aliases":["it"],"filename":"1f1ee-1f1f9"},{"aliases":["ru"],"filename":"1f1f7-1f1fa"},{"aliases":["gb","uk"],"filename":"1f1ec-1f1e7"},{"aliases":["one"],"filename":"0031-20e3"},{"aliases":["two"],"filename":"0032-20e3"},{"aliases":["three"],"filename":"0033-20e3"},{"aliases":["four"],"filename":"0034-20e3"},{"aliases":["five"],"filename":"0035-20e3"},{"aliases":["six"],"filename":"0036-20e3"},{"aliases":["seven"],"filename":"0037-20e3"},{"aliases":["eight"],"filename":"0038-20e3"},{"aliases":["nine"],"filename":"0039-20e3"},{"aliases":["zero"],"filename":"0030-20e3"},{"aliases":["keycap_ten"],"filename":"1f51f"},{"aliases":["1234"],"filename":"1f522"},{"aliases":["hash"],"filename":"0023-20e3"},{"aliases":["symbols"],"filename":"1f523"},{"aliases":["arrow_up"],"filename":"2b06"},{"aliases":["arrow_down"],"filename":"2b07"},{"aliases":["arrow_left"],"filename":"2b05"},{"aliases":["arrow_right"],"filename":"27a1"},{"aliases":["capital_abcd"],"filename":"1f520"},{"aliases":["abcd"],"filename":"1f521"},{"aliases":["abc"],"filename":"1f524"},{"aliases":["arrow_upper_right"],"filename":"2197"},{"aliases":["arrow_upper_left"],"filename":"2196"},{"aliases":["arrow_lower_right"],"filename":"2198"},{"aliases":["arrow_lower_left"],"filename":"2199"},{"aliases":["left_right_arrow"],"filename":"2194"},{"aliases":["arrow_up_down"],"filename":"2195"},{"aliases":["arrows_counterclockwise"],"filename":"1f504"},{"aliases":["arrow_backward"],"filename":"25c0"},{"aliases":["arrow_forward"],"filename":"25b6"},{"aliases":["arrow_up_small"],"filename":"1f53c"},{"aliases":["arrow_down_small"],"filename":"1f53d"},{"aliases":["leftwards_arrow_with_hook"],"filename":"21a9"},{"aliases":["arrow_right_hook"],"filename":"21aa"},{"aliases":["information_source"],"filename":"2139"},{"aliases":["rewind"],"filename":"23ea"},{"aliases":["fast_forward"],"filename":"23e9"},{"aliases":["arrow_double_up"],"filename":"23eb"},{"aliases":["arrow_double_down"],"filename":"23ec"},{"aliases":["arrow_heading_down"],"filename":"2935"},{"aliases":["arrow_heading_up"],"filename":"2934"},{"aliases":["ok"],"filename":"1f197"},{"aliases":["twisted_rightwards_arrows"],"filename":"1f500"},{"aliases":["repeat"],"filename":"1f501"},{"aliases":["repeat_one"],"filename":"1f502"},{"aliases":["new"],"filename":"1f195"},{"aliases":["up"],"filename":"1f199"},{"aliases":["cool"],"filename":"1f192"},{"aliases":["free"],"filename":"1f193"},{"aliases":["ng"],"filename":"1f196"},{"aliases":["signal_strength"],"filename":"1f4f6"},{"aliases":["cinema"],"filename":"1f3a6"},{"aliases":["koko"],"filename":"1f201"},{"aliases":["u6307"],"filename":"1f22f"},{"aliases":["u7a7a"],"filename":"1f233"},{"aliases":["u6e80"],"filename":"1f235"},{"aliases":["u5408"],"filename":"1f234"},{"aliases":["u7981"],"filename":"1f232"},{"aliases":["ideograph_advantage"],"filename":"1f250"},{"aliases":["u5272"],"filename":"1f239"},{"aliases":["u55b6"],"filename":"1f23a"},{"aliases":["u6709"],"filename":"1f236"},{"aliases":["u7121"],"filename":"1f21a"},{"aliases":["restroom"],"filename":"1f6bb"},{"aliases":["mens"],"filename":"1f6b9"},{"aliases":["womens"],"filename":"1f6ba"},{"aliases":["baby_symbol"],"filename":"1f6bc"},{"aliases":["wc"],"filename":"1f6be"},{"aliases":["potable_water"],"filename":"1f6b0"},{"aliases":["put_litter_in_its_place"],"filename":"1f6ae"},{"aliases":["parking"],"filename":"1f17f"},{"aliases":["wheelchair"],"filename":"267f"},{"aliases":["no_smoking"],"filename":"1f6ad"},{"aliases":["u6708"],"filename":"1f237"},{"aliases":["u7533"],"filename":"1f238"},{"aliases":["sa"],"filename":"1f202"},{"aliases":["m"],"filename":"24c2"},{"aliases":["passport_control"],"filename":"1f6c2"},{"aliases":["baggage_claim"],"filename":"1f6c4"},{"aliases":["left_luggage"],"filename":"1f6c5"},{"aliases":["customs"],"filename":"1f6c3"},{"aliases":["accept"],"filename":"1f251"},{"aliases":["secret"],"filename":"3299"},{"aliases":["congratulations"],"filename":"3297"},{"aliases":["cl"],"filename":"1f191"},{"aliases":["sos"],"filename":"1f198"},{"aliases":["id"],"filename":"1f194"},{"aliases":["no_entry_sign"],"filename":"1f6ab"},{"aliases":["underage"],"filename":"1f51e"},{"aliases":["no_mobile_phones"],"filename":"1f4f5"},{"aliases":["do_not_litter"],"filename":"1f6af"},{"aliases":["non-potable_water"],"filename":"1f6b1"},{"aliases":["no_bicycles"],"filename":"1f6b3"},{"aliases":["no_pedestrians"],"filename":"1f6b7"},{"aliases":["children_crossing"],"filename":"1f6b8"},{"aliases":["no_entry"],"filename":"26d4"},{"aliases":["eight_spoked_asterisk"],"filename":"2733"},{"aliases":["sparkle"],"filename":"2747"},{"aliases":["negative_squared_cross_mark"],"filename":"274e"},{"aliases":["white_check_mark"],"filename":"2705"},{"aliases":["eight_pointed_black_star"],"filename":"2734"},{"aliases":["heart_decoration"],"filename":"1f49f"},{"aliases":["vs"],"filename":"1f19a"},{"aliases":["vibration_mode"],"filename":"1f4f3"},{"aliases":["mobile_phone_off"],"filename":"1f4f4"},{"aliases":["a"],"filename":"1f170"},{"aliases":["b"],"filename":"1f171"},{"aliases":["ab"],"filename":"1f18e"},{"aliases":["o2"],"filename":"1f17e"},{"aliases":["diamond_shape_with_a_dot_inside"],"filename":"1f4a0"},{"aliases":["loop"],"filename":"27bf"},{"aliases":["recycle"],"filename":"267b"},{"aliases":["aries"],"filename":"2648"},{"aliases":["taurus"],"filename":"2649"},{"aliases":["gemini"],"filename":"264a"},{"aliases":["cancer"],"filename":"264b"},{"aliases":["leo"],"filename":"264c"},{"aliases":["virgo"],"filename":"264d"},{"aliases":["libra"],"filename":"264e"},{"aliases":["scorpius"],"filename":"264f"},{"aliases":["sagittarius"],"filename":"2650"},{"aliases":["capricorn"],"filename":"2651"},{"aliases":["aquarius"],"filename":"2652"},{"aliases":["pisces"],"filename":"2653"},{"aliases":["ophiuchus"],"filename":"26ce"},{"aliases":["six_pointed_star"],"filename":"1f52f"},{"aliases":["atm"],"filename":"1f3e7"},{"aliases":["chart"],"filename":"1f4b9"},{"aliases":["heavy_dollar_sign"],"filename":"1f4b2"},{"aliases":["currency_exchange"],"filename":"1f4b1"},{"aliases":["copyright"],"filename":"00a9"},{"aliases":["registered"],"filename":"00ae"},{"aliases":["tm"],"filename":"2122"},{"aliases":["x"],"filename":"274c"},{"aliases":["bangbang"],"filename":"203c"},{"aliases":["interrobang"],"filename":"2049"},{"aliases":["exclamation","heavy_exclamation_mark"],"filename":"2757"},{"aliases":["question"],"filename":"2753"},{"aliases":["grey_exclamation"],"filename":"2755"},{"aliases":["grey_question"],"filename":"2754"},{"aliases":["o"],"filename":"2b55"},{"aliases":["top"],"filename":"1f51d"},{"aliases":["end"],"filename":"1f51a"},{"aliases":["back"],"filename":"1f519"},{"aliases":["on"],"filename":"1f51b"},{"aliases":["soon"],"filename":"1f51c"},{"aliases":["arrows_clockwise"],"filename":"1f503"},{"aliases":["clock12"],"filename":"1f55b"},{"aliases":["clock1230"],"filename":"1f567"},{"aliases":["clock1"],"filename":"1f550"},{"aliases":["clock130"],"filename":"1f55c"},{"aliases":["clock2"],"filename":"1f551"},{"aliases":["clock230"],"filename":"1f55d"},{"aliases":["clock3"],"filename":"1f552"},{"aliases":["clock330"],"filename":"1f55e"},{"aliases":["clock4"],"filename":"1f553"},{"aliases":["clock430"],"filename":"1f55f"},{"aliases":["clock5"],"filename":"1f554"},{"aliases":["clock530"],"filename":"1f560"},{"aliases":["clock6"],"filename":"1f555"},{"aliases":["clock7"],"filename":"1f556"},{"aliases":["clock8"],"filename":"1f557"},{"aliases":["clock9"],"filename":"1f558"},{"aliases":["clock10"],"filename":"1f559"},{"aliases":["clock11"],"filename":"1f55a"},{"aliases":["clock630"],"filename":"1f561"},{"aliases":["clock730"],"filename":"1f562"},{"aliases":["clock830"],"filename":"1f563"},{"aliases":["clock930"],"filename":"1f564"},{"aliases":["clock1030"],"filename":"1f565"},{"aliases":["clock1130"],"filename":"1f566"},{"aliases":["heavy_multiplication_x"],"filename":"2716"},{"aliases":["heavy_plus_sign"],"filename":"2795"},{"aliases":["heavy_minus_sign"],"filename":"2796"},{"aliases":["heavy_division_sign"],"filename":"2797"},{"aliases":["spades"],"filename":"2660"},{"aliases":["hearts"],"filename":"2665"},{"aliases":["clubs"],"filename":"2663"},{"aliases":["diamonds"],"filename":"2666"},{"aliases":["white_flower"],"filename":"1f4ae"},{"aliases":["100"],"filename":"1f4af"},{"aliases":["heavy_check_mark"],"filename":"2714"},{"aliases":["ballot_box_with_check"],"filename":"2611"},{"aliases":["radio_button"],"filename":"1f518"},{"aliases":["link"],"filename":"1f517"},{"aliases":["curly_loop"],"filename":"27b0"},{"aliases":["wavy_dash"],"filename":"3030"},{"aliases":["part_alternation_mark"],"filename":"303d"},{"aliases":["trident"],"filename":"1f531"},{"aliases":["black_medium_square"],"filename":"25fc"},{"aliases":["white_medium_square"],"filename":"25fb"},{"aliases":["black_medium_small_square"],"filename":"25fe"},{"aliases":["white_medium_small_square"],"filename":"25fd"},{"aliases":["black_small_square"],"filename":"25aa"},{"aliases":["white_small_square"],"filename":"25ab"},{"aliases":["small_red_triangle"],"filename":"1f53a"},{"aliases":["black_square_button"],"filename":"1f532"},{"aliases":["white_square_button"],"filename":"1f533"},{"aliases":["black_circle"],"filename":"26ab"},{"aliases":["white_circle"],"filename":"26aa"},{"aliases":["red_circle"],"filename":"1f534"},{"aliases":["large_blue_circle"],"filename":"1f535"},{"aliases":["small_red_triangle_down"],"filename":"1f53b"},{"aliases":["white_large_square"],"filename":"2b1c"},{"aliases":["black_large_square"],"filename":"2b1b"},{"aliases":["large_orange_diamond"],"filename":"1f536"},{"aliases":["large_blue_diamond"],"filename":"1f537"},{"aliases":["small_orange_diamond"],"filename":"1f538"},{"aliases":["small_blue_diamond"],"filename":"1f539"},{"aliases":["ca"],"filename":"1f1e8-1f1e6"},{"aliases":["pk"],"filename":"1f1f5-1f1f0"},{"aliases":["za"],"filename":"1f1ff-1f1e6"},{"aliases":["slightly_smiling_face"],"filename":"1f642"},{"aliases":["slightly_frowning_face"],"filename":"1f641"},{"aliases":["upside_down_face"],"filename":"1f643"},{"aliases":["mattermost"],"filename":""},{"aliases":["bowtie"],"filename":""},{"aliases":["feelsgood"],"filename":""},{"aliases":["finnadie"],"filename":""},{"aliases":["fu"],"filename":""},{"aliases":["goberserk"],"filename":""},{"aliases":["godmode"],"filename":""},{"aliases":["hurtrealbad"],"filename":""},{"aliases":["metal"],"filename":""},{"aliases":["neckbeard"],"filename":""},{"aliases":["octocat"],"filename":""},{"aliases":["rage1"],"filename":""},{"aliases":["rage2"],"filename":""},{"aliases":["rage3"],"filename":""},{"aliases":["rage4"],"filename":""},{"aliases":["shipit","squirrel"],"filename":""},{"aliases":["suspect"],"filename":""},{"aliases":["taco"],"filename":""},{"aliases":["trollface"],"filename":""}];
+export const Emojis = [{"aliases":["smile"],"filename":"1f604"},{"aliases":["smiley"],"filename":"1f603"},{"aliases":["grinning"],"filename":"1f600"},{"aliases":["blush"],"filename":"1f60a"},{"aliases":["relaxed"],"filename":"263a"},{"aliases":["wink"],"filename":"1f609"},{"aliases":["heart_eyes"],"filename":"1f60d"},{"aliases":["kissing_heart"],"filename":"1f618"},{"aliases":["kissing_closed_eyes"],"filename":"1f61a"},{"aliases":["kissing"],"filename":"1f617"},{"aliases":["kissing_smiling_eyes"],"filename":"1f619"},{"aliases":["stuck_out_tongue_winking_eye"],"filename":"1f61c"},{"aliases":["stuck_out_tongue_closed_eyes"],"filename":"1f61d"},{"aliases":["stuck_out_tongue"],"filename":"1f61b"},{"aliases":["flushed"],"filename":"1f633"},{"aliases":["grin"],"filename":"1f601"},{"aliases":["pensive"],"filename":"1f614"},{"aliases":["relieved"],"filename":"1f60c"},{"aliases":["unamused"],"filename":"1f612"},{"aliases":["disappointed"],"filename":"1f61e"},{"aliases":["persevere"],"filename":"1f623"},{"aliases":["cry"],"filename":"1f622"},{"aliases":["joy"],"filename":"1f602"},{"aliases":["sob"],"filename":"1f62d"},{"aliases":["sleepy"],"filename":"1f62a"},{"aliases":["disappointed_relieved"],"filename":"1f625"},{"aliases":["cold_sweat"],"filename":"1f630"},{"aliases":["sweat_smile"],"filename":"1f605"},{"aliases":["sweat"],"filename":"1f613"},{"aliases":["weary"],"filename":"1f629"},{"aliases":["tired_face"],"filename":"1f62b"},{"aliases":["fearful"],"filename":"1f628"},{"aliases":["scream"],"filename":"1f631"},{"aliases":["angry"],"filename":"1f620"},{"aliases":["rage","pout"],"filename":"1f621"},{"aliases":["triumph"],"filename":"1f624"},{"aliases":["confounded"],"filename":"1f616"},{"aliases":["laughing","satisfied"],"filename":"1f606"},{"aliases":["yum"],"filename":"1f60b"},{"aliases":["mask"],"filename":"1f637"},{"aliases":["sunglasses"],"filename":"1f60e"},{"aliases":["sleeping"],"filename":"1f634"},{"aliases":["dizzy_face"],"filename":"1f635"},{"aliases":["astonished"],"filename":"1f632"},{"aliases":["worried"],"filename":"1f61f"},{"aliases":["frowning"],"filename":"1f626"},{"aliases":["anguished"],"filename":"1f627"},{"aliases":["smiling_imp"],"filename":"1f608"},{"aliases":["imp"],"filename":"1f47f"},{"aliases":["open_mouth"],"filename":"1f62e"},{"aliases":["grimacing"],"filename":"1f62c"},{"aliases":["neutral_face"],"filename":"1f610"},{"aliases":["confused"],"filename":"1f615"},{"aliases":["hushed"],"filename":"1f62f"},{"aliases":["no_mouth"],"filename":"1f636"},{"aliases":["innocent"],"filename":"1f607"},{"aliases":["smirk"],"filename":"1f60f"},{"aliases":["expressionless"],"filename":"1f611"},{"aliases":["man_with_gua_pi_mao"],"filename":"1f472"},{"aliases":["man_with_turban"],"filename":"1f473"},{"aliases":["cop"],"filename":"1f46e"},{"aliases":["construction_worker"],"filename":"1f477"},{"aliases":["guardsman"],"filename":"1f482"},{"aliases":["baby"],"filename":"1f476"},{"aliases":["boy"],"filename":"1f466"},{"aliases":["girl"],"filename":"1f467"},{"aliases":["man"],"filename":"1f468"},{"aliases":["woman"],"filename":"1f469"},{"aliases":["older_man"],"filename":"1f474"},{"aliases":["older_woman"],"filename":"1f475"},{"aliases":["person_with_blond_hair"],"filename":"1f471"},{"aliases":["angel"],"filename":"1f47c"},{"aliases":["princess"],"filename":"1f478"},{"aliases":["smiley_cat"],"filename":"1f63a"},{"aliases":["smile_cat"],"filename":"1f638"},{"aliases":["heart_eyes_cat"],"filename":"1f63b"},{"aliases":["kissing_cat"],"filename":"1f63d"},{"aliases":["smirk_cat"],"filename":"1f63c"},{"aliases":["scream_cat"],"filename":"1f640"},{"aliases":["crying_cat_face"],"filename":"1f63f"},{"aliases":["joy_cat"],"filename":"1f639"},{"aliases":["pouting_cat"],"filename":"1f63e"},{"aliases":["japanese_ogre"],"filename":"1f479"},{"aliases":["japanese_goblin"],"filename":"1f47a"},{"aliases":["see_no_evil"],"filename":"1f648"},{"aliases":["hear_no_evil"],"filename":"1f649"},{"aliases":["speak_no_evil"],"filename":"1f64a"},{"aliases":["skull"],"filename":"1f480"},{"aliases":["alien"],"filename":"1f47d"},{"aliases":["hankey","poop","shit"],"filename":"1f4a9"},{"aliases":["fire"],"filename":"1f525"},{"aliases":["sparkles"],"filename":"2728"},{"aliases":["star2"],"filename":"1f31f"},{"aliases":["dizzy"],"filename":"1f4ab"},{"aliases":["boom","collision"],"filename":"1f4a5"},{"aliases":["anger"],"filename":"1f4a2"},{"aliases":["sweat_drops"],"filename":"1f4a6"},{"aliases":["droplet"],"filename":"1f4a7"},{"aliases":["zzz"],"filename":"1f4a4"},{"aliases":["dash"],"filename":"1f4a8"},{"aliases":["ear"],"filename":"1f442"},{"aliases":["eyes"],"filename":"1f440"},{"aliases":["nose"],"filename":"1f443"},{"aliases":["tongue"],"filename":"1f445"},{"aliases":["lips"],"filename":"1f444"},{"aliases":["+1","thumbsup"],"filename":"1f44d"},{"aliases":["-1","thumbsdown"],"filename":"1f44e"},{"aliases":["ok_hand"],"filename":"1f44c"},{"aliases":["facepunch","punch"],"filename":"1f44a"},{"aliases":["fist"],"filename":"270a"},{"aliases":["v"],"filename":"270c"},{"aliases":["wave"],"filename":"1f44b"},{"aliases":["hand","raised_hand"],"filename":"270b"},{"aliases":["open_hands"],"filename":"1f450"},{"aliases":["point_up_2"],"filename":"1f446"},{"aliases":["point_down"],"filename":"1f447"},{"aliases":["point_right"],"filename":"1f449"},{"aliases":["point_left"],"filename":"1f448"},{"aliases":["raised_hands"],"filename":"1f64c"},{"aliases":["pray"],"filename":"1f64f"},{"aliases":["point_up"],"filename":"261d"},{"aliases":["clap"],"filename":"1f44f"},{"aliases":["muscle"],"filename":"1f4aa"},{"aliases":["walking"],"filename":"1f6b6"},{"aliases":["runner","running"],"filename":"1f3c3"},{"aliases":["dancer"],"filename":"1f483"},{"aliases":["couple"],"filename":"1f46b"},{"aliases":["family"],"filename":"1f46a"},{"aliases":["two_men_holding_hands"],"filename":"1f46c"},{"aliases":["two_women_holding_hands"],"filename":"1f46d"},{"aliases":["couplekiss"],"filename":"1f48f"},{"aliases":["couple_with_heart"],"filename":"1f491"},{"aliases":["dancers"],"filename":"1f46f"},{"aliases":["ok_woman"],"filename":"1f646"},{"aliases":["no_good","ng_woman"],"filename":"1f645"},{"aliases":["information_desk_person"],"filename":"1f481"},{"aliases":["raising_hand"],"filename":"1f64b"},{"aliases":["massage"],"filename":"1f486"},{"aliases":["haircut"],"filename":"1f487"},{"aliases":["nail_care"],"filename":"1f485"},{"aliases":["bride_with_veil"],"filename":"1f470"},{"aliases":["person_with_pouting_face"],"filename":"1f64e"},{"aliases":["person_frowning"],"filename":"1f64d"},{"aliases":["bow"],"filename":"1f647"},{"aliases":["tophat"],"filename":"1f3a9"},{"aliases":["crown"],"filename":"1f451"},{"aliases":["womans_hat"],"filename":"1f452"},{"aliases":["athletic_shoe"],"filename":"1f45f"},{"aliases":["mans_shoe","shoe"],"filename":"1f45e"},{"aliases":["sandal"],"filename":"1f461"},{"aliases":["high_heel"],"filename":"1f460"},{"aliases":["boot"],"filename":"1f462"},{"aliases":["shirt","tshirt"],"filename":"1f455"},{"aliases":["necktie"],"filename":"1f454"},{"aliases":["womans_clothes"],"filename":"1f45a"},{"aliases":["dress"],"filename":"1f457"},{"aliases":["running_shirt_with_sash"],"filename":"1f3bd"},{"aliases":["jeans"],"filename":"1f456"},{"aliases":["kimono"],"filename":"1f458"},{"aliases":["bikini"],"filename":"1f459"},{"aliases":["briefcase"],"filename":"1f4bc"},{"aliases":["handbag"],"filename":"1f45c"},{"aliases":["pouch"],"filename":"1f45d"},{"aliases":["purse"],"filename":"1f45b"},{"aliases":["eyeglasses"],"filename":"1f453"},{"aliases":["ribbon"],"filename":"1f380"},{"aliases":["closed_umbrella"],"filename":"1f302"},{"aliases":["lipstick"],"filename":"1f484"},{"aliases":["yellow_heart"],"filename":"1f49b"},{"aliases":["blue_heart"],"filename":"1f499"},{"aliases":["purple_heart"],"filename":"1f49c"},{"aliases":["green_heart"],"filename":"1f49a"},{"aliases":["heart"],"filename":"2764"},{"aliases":["broken_heart"],"filename":"1f494"},{"aliases":["heartpulse"],"filename":"1f497"},{"aliases":["heartbeat"],"filename":"1f493"},{"aliases":["two_hearts"],"filename":"1f495"},{"aliases":["sparkling_heart"],"filename":"1f496"},{"aliases":["revolving_hearts"],"filename":"1f49e"},{"aliases":["cupid"],"filename":"1f498"},{"aliases":["love_letter"],"filename":"1f48c"},{"aliases":["kiss"],"filename":"1f48b"},{"aliases":["ring"],"filename":"1f48d"},{"aliases":["gem"],"filename":"1f48e"},{"aliases":["bust_in_silhouette"],"filename":"1f464"},{"aliases":["busts_in_silhouette"],"filename":"1f465"},{"aliases":["speech_balloon"],"filename":"1f4ac"},{"aliases":["footprints"],"filename":"1f463"},{"aliases":["thought_balloon"],"filename":"1f4ad"},{"aliases":["dog"],"filename":"1f436"},{"aliases":["wolf"],"filename":"1f43a"},{"aliases":["cat"],"filename":"1f431"},{"aliases":["mouse"],"filename":"1f42d"},{"aliases":["hamster"],"filename":"1f439"},{"aliases":["rabbit"],"filename":"1f430"},{"aliases":["frog"],"filename":"1f438"},{"aliases":["tiger"],"filename":"1f42f"},{"aliases":["koala"],"filename":"1f428"},{"aliases":["bear"],"filename":"1f43b"},{"aliases":["pig"],"filename":"1f437"},{"aliases":["pig_nose"],"filename":"1f43d"},{"aliases":["cow"],"filename":"1f42e"},{"aliases":["boar"],"filename":"1f417"},{"aliases":["monkey_face"],"filename":"1f435"},{"aliases":["monkey"],"filename":"1f412"},{"aliases":["horse"],"filename":"1f434"},{"aliases":["sheep"],"filename":"1f411"},{"aliases":["elephant"],"filename":"1f418"},{"aliases":["panda_face"],"filename":"1f43c"},{"aliases":["penguin"],"filename":"1f427"},{"aliases":["bird"],"filename":"1f426"},{"aliases":["baby_chick"],"filename":"1f424"},{"aliases":["hatched_chick"],"filename":"1f425"},{"aliases":["hatching_chick"],"filename":"1f423"},{"aliases":["chicken"],"filename":"1f414"},{"aliases":["snake"],"filename":"1f40d"},{"aliases":["turtle"],"filename":"1f422"},{"aliases":["bug"],"filename":"1f41b"},{"aliases":["bee","honeybee"],"filename":"1f41d"},{"aliases":["ant"],"filename":"1f41c"},{"aliases":["beetle"],"filename":"1f41e"},{"aliases":["snail"],"filename":"1f40c"},{"aliases":["octopus"],"filename":"1f419"},{"aliases":["shell"],"filename":"1f41a"},{"aliases":["tropical_fish"],"filename":"1f420"},{"aliases":["fish"],"filename":"1f41f"},{"aliases":["dolphin","flipper"],"filename":"1f42c"},{"aliases":["whale"],"filename":"1f433"},{"aliases":["whale2"],"filename":"1f40b"},{"aliases":["cow2"],"filename":"1f404"},{"aliases":["ram"],"filename":"1f40f"},{"aliases":["rat"],"filename":"1f400"},{"aliases":["water_buffalo"],"filename":"1f403"},{"aliases":["tiger2"],"filename":"1f405"},{"aliases":["rabbit2"],"filename":"1f407"},{"aliases":["dragon"],"filename":"1f409"},{"aliases":["racehorse"],"filename":"1f40e"},{"aliases":["goat"],"filename":"1f410"},{"aliases":["rooster"],"filename":"1f413"},{"aliases":["dog2"],"filename":"1f415"},{"aliases":["pig2"],"filename":"1f416"},{"aliases":["mouse2"],"filename":"1f401"},{"aliases":["ox"],"filename":"1f402"},{"aliases":["dragon_face"],"filename":"1f432"},{"aliases":["blowfish"],"filename":"1f421"},{"aliases":["crocodile"],"filename":"1f40a"},{"aliases":["camel"],"filename":"1f42b"},{"aliases":["dromedary_camel"],"filename":"1f42a"},{"aliases":["leopard"],"filename":"1f406"},{"aliases":["cat2"],"filename":"1f408"},{"aliases":["poodle"],"filename":"1f429"},{"aliases":["feet","paw_prints"],"filename":"1f43e"},{"aliases":["bouquet"],"filename":"1f490"},{"aliases":["cherry_blossom"],"filename":"1f338"},{"aliases":["tulip"],"filename":"1f337"},{"aliases":["four_leaf_clover"],"filename":"1f340"},{"aliases":["rose"],"filename":"1f339"},{"aliases":["sunflower"],"filename":"1f33b"},{"aliases":["hibiscus"],"filename":"1f33a"},{"aliases":["maple_leaf"],"filename":"1f341"},{"aliases":["leaves"],"filename":"1f343"},{"aliases":["fallen_leaf"],"filename":"1f342"},{"aliases":["herb"],"filename":"1f33f"},{"aliases":["ear_of_rice"],"filename":"1f33e"},{"aliases":["mushroom"],"filename":"1f344"},{"aliases":["cactus"],"filename":"1f335"},{"aliases":["palm_tree"],"filename":"1f334"},{"aliases":["evergreen_tree"],"filename":"1f332"},{"aliases":["deciduous_tree"],"filename":"1f333"},{"aliases":["chestnut"],"filename":"1f330"},{"aliases":["seedling"],"filename":"1f331"},{"aliases":["blossom"],"filename":"1f33c"},{"aliases":["globe_with_meridians"],"filename":"1f310"},{"aliases":["sun_with_face"],"filename":"1f31e"},{"aliases":["full_moon_with_face"],"filename":"1f31d"},{"aliases":["new_moon_with_face"],"filename":"1f31a"},{"aliases":["new_moon"],"filename":"1f311"},{"aliases":["waxing_crescent_moon"],"filename":"1f312"},{"aliases":["first_quarter_moon"],"filename":"1f313"},{"aliases":["moon","waxing_gibbous_moon"],"filename":"1f314"},{"aliases":["full_moon"],"filename":"1f315"},{"aliases":["waning_gibbous_moon"],"filename":"1f316"},{"aliases":["last_quarter_moon"],"filename":"1f317"},{"aliases":["waning_crescent_moon"],"filename":"1f318"},{"aliases":["last_quarter_moon_with_face"],"filename":"1f31c"},{"aliases":["first_quarter_moon_with_face"],"filename":"1f31b"},{"aliases":["crescent_moon"],"filename":"1f319"},{"aliases":["earth_africa"],"filename":"1f30d"},{"aliases":["earth_americas"],"filename":"1f30e"},{"aliases":["earth_asia"],"filename":"1f30f"},{"aliases":["volcano"],"filename":"1f30b"},{"aliases":["milky_way"],"filename":"1f30c"},{"aliases":["stars"],"filename":"1f320"},{"aliases":["star"],"filename":"2b50"},{"aliases":["sunny"],"filename":"2600"},{"aliases":["partly_sunny"],"filename":"26c5"},{"aliases":["cloud"],"filename":"2601"},{"aliases":["zap"],"filename":"26a1"},{"aliases":["umbrella"],"filename":"2614"},{"aliases":["snowflake"],"filename":"2744"},{"aliases":["snowman"],"filename":"26c4"},{"aliases":["cyclone"],"filename":"1f300"},{"aliases":["foggy"],"filename":"1f301"},{"aliases":["rainbow"],"filename":"1f308"},{"aliases":["ocean"],"filename":"1f30a"},{"aliases":["bamboo"],"filename":"1f38d"},{"aliases":["gift_heart"],"filename":"1f49d"},{"aliases":["dolls"],"filename":"1f38e"},{"aliases":["school_satchel"],"filename":"1f392"},{"aliases":["mortar_board"],"filename":"1f393"},{"aliases":["flags"],"filename":"1f38f"},{"aliases":["fireworks"],"filename":"1f386"},{"aliases":["sparkler"],"filename":"1f387"},{"aliases":["wind_chime"],"filename":"1f390"},{"aliases":["rice_scene"],"filename":"1f391"},{"aliases":["jack_o_lantern"],"filename":"1f383"},{"aliases":["ghost"],"filename":"1f47b"},{"aliases":["santa"],"filename":"1f385"},{"aliases":["christmas_tree"],"filename":"1f384"},{"aliases":["gift"],"filename":"1f381"},{"aliases":["tanabata_tree"],"filename":"1f38b"},{"aliases":["tada"],"filename":"1f389"},{"aliases":["confetti_ball"],"filename":"1f38a"},{"aliases":["balloon"],"filename":"1f388"},{"aliases":["crossed_flags"],"filename":"1f38c"},{"aliases":["crystal_ball"],"filename":"1f52e"},{"aliases":["movie_camera"],"filename":"1f3a5"},{"aliases":["camera"],"filename":"1f4f7"},{"aliases":["video_camera"],"filename":"1f4f9"},{"aliases":["vhs"],"filename":"1f4fc"},{"aliases":["cd"],"filename":"1f4bf"},{"aliases":["dvd"],"filename":"1f4c0"},{"aliases":["minidisc"],"filename":"1f4bd"},{"aliases":["floppy_disk"],"filename":"1f4be"},{"aliases":["computer"],"filename":"1f4bb"},{"aliases":["iphone"],"filename":"1f4f1"},{"aliases":["phone","telephone"],"filename":"260e"},{"aliases":["telephone_receiver"],"filename":"1f4de"},{"aliases":["pager"],"filename":"1f4df"},{"aliases":["fax"],"filename":"1f4e0"},{"aliases":["satellite"],"filename":"1f4e1"},{"aliases":["tv"],"filename":"1f4fa"},{"aliases":["radio"],"filename":"1f4fb"},{"aliases":["loud_sound"],"filename":"1f50a"},{"aliases":["sound"],"filename":"1f509"},{"aliases":["speaker"],"filename":"1f508"},{"aliases":["mute"],"filename":"1f507"},{"aliases":["bell"],"filename":"1f514"},{"aliases":["no_bell"],"filename":"1f515"},{"aliases":["loudspeaker"],"filename":"1f4e2"},{"aliases":["mega"],"filename":"1f4e3"},{"aliases":["hourglass_flowing_sand"],"filename":"23f3"},{"aliases":["hourglass"],"filename":"231b"},{"aliases":["alarm_clock"],"filename":"23f0"},{"aliases":["watch"],"filename":"231a"},{"aliases":["unlock"],"filename":"1f513"},{"aliases":["lock"],"filename":"1f512"},{"aliases":["lock_with_ink_pen"],"filename":"1f50f"},{"aliases":["closed_lock_with_key"],"filename":"1f510"},{"aliases":["key"],"filename":"1f511"},{"aliases":["mag_right"],"filename":"1f50e"},{"aliases":["bulb"],"filename":"1f4a1"},{"aliases":["flashlight"],"filename":"1f526"},{"aliases":["high_brightness"],"filename":"1f506"},{"aliases":["low_brightness"],"filename":"1f505"},{"aliases":["electric_plug"],"filename":"1f50c"},{"aliases":["battery"],"filename":"1f50b"},{"aliases":["mag"],"filename":"1f50d"},{"aliases":["bathtub"],"filename":"1f6c1"},{"aliases":["bath"],"filename":"1f6c0"},{"aliases":["shower"],"filename":"1f6bf"},{"aliases":["toilet"],"filename":"1f6bd"},{"aliases":["wrench"],"filename":"1f527"},{"aliases":["nut_and_bolt"],"filename":"1f529"},{"aliases":["hammer"],"filename":"1f528"},{"aliases":["door"],"filename":"1f6aa"},{"aliases":["smoking"],"filename":"1f6ac"},{"aliases":["bomb"],"filename":"1f4a3"},{"aliases":["gun"],"filename":"1f52b"},{"aliases":["hocho","knife"],"filename":"1f52a"},{"aliases":["pill"],"filename":"1f48a"},{"aliases":["syringe"],"filename":"1f489"},{"aliases":["moneybag"],"filename":"1f4b0"},{"aliases":["yen"],"filename":"1f4b4"},{"aliases":["dollar"],"filename":"1f4b5"},{"aliases":["pound"],"filename":"1f4b7"},{"aliases":["euro"],"filename":"1f4b6"},{"aliases":["credit_card"],"filename":"1f4b3"},{"aliases":["money_with_wings"],"filename":"1f4b8"},{"aliases":["calling"],"filename":"1f4f2"},{"aliases":["e-mail"],"filename":"1f4e7"},{"aliases":["inbox_tray"],"filename":"1f4e5"},{"aliases":["outbox_tray"],"filename":"1f4e4"},{"aliases":["email","envelope"],"filename":"2709"},{"aliases":["envelope_with_arrow"],"filename":"1f4e9"},{"aliases":["incoming_envelope"],"filename":"1f4e8"},{"aliases":["postal_horn"],"filename":"1f4ef"},{"aliases":["mailbox"],"filename":"1f4eb"},{"aliases":["mailbox_closed"],"filename":"1f4ea"},{"aliases":["mailbox_with_mail"],"filename":"1f4ec"},{"aliases":["mailbox_with_no_mail"],"filename":"1f4ed"},{"aliases":["postbox"],"filename":"1f4ee"},{"aliases":["package"],"filename":"1f4e6"},{"aliases":["memo","pencil"],"filename":"1f4dd"},{"aliases":["page_facing_up"],"filename":"1f4c4"},{"aliases":["page_with_curl"],"filename":"1f4c3"},{"aliases":["bookmark_tabs"],"filename":"1f4d1"},{"aliases":["bar_chart"],"filename":"1f4ca"},{"aliases":["chart_with_upwards_trend"],"filename":"1f4c8"},{"aliases":["chart_with_downwards_trend"],"filename":"1f4c9"},{"aliases":["scroll"],"filename":"1f4dc"},{"aliases":["clipboard"],"filename":"1f4cb"},{"aliases":["date"],"filename":"1f4c5"},{"aliases":["calendar"],"filename":"1f4c6"},{"aliases":["card_index"],"filename":"1f4c7"},{"aliases":["file_folder"],"filename":"1f4c1"},{"aliases":["open_file_folder"],"filename":"1f4c2"},{"aliases":["scissors"],"filename":"2702"},{"aliases":["pushpin"],"filename":"1f4cc"},{"aliases":["paperclip"],"filename":"1f4ce"},{"aliases":["black_nib"],"filename":"2712"},{"aliases":["pencil2"],"filename":"270f"},{"aliases":["straight_ruler"],"filename":"1f4cf"},{"aliases":["triangular_ruler"],"filename":"1f4d0"},{"aliases":["closed_book"],"filename":"1f4d5"},{"aliases":["green_book"],"filename":"1f4d7"},{"aliases":["blue_book"],"filename":"1f4d8"},{"aliases":["orange_book"],"filename":"1f4d9"},{"aliases":["notebook"],"filename":"1f4d3"},{"aliases":["notebook_with_decorative_cover"],"filename":"1f4d4"},{"aliases":["ledger"],"filename":"1f4d2"},{"aliases":["books"],"filename":"1f4da"},{"aliases":["book","open_book"],"filename":"1f4d6"},{"aliases":["bookmark"],"filename":"1f516"},{"aliases":["name_badge"],"filename":"1f4db"},{"aliases":["microscope"],"filename":"1f52c"},{"aliases":["telescope"],"filename":"1f52d"},{"aliases":["newspaper"],"filename":"1f4f0"},{"aliases":["art"],"filename":"1f3a8"},{"aliases":["clapper"],"filename":"1f3ac"},{"aliases":["microphone"],"filename":"1f3a4"},{"aliases":["headphones"],"filename":"1f3a7"},{"aliases":["musical_score"],"filename":"1f3bc"},{"aliases":["musical_note"],"filename":"1f3b5"},{"aliases":["notes"],"filename":"1f3b6"},{"aliases":["musical_keyboard"],"filename":"1f3b9"},{"aliases":["violin"],"filename":"1f3bb"},{"aliases":["trumpet"],"filename":"1f3ba"},{"aliases":["saxophone"],"filename":"1f3b7"},{"aliases":["guitar"],"filename":"1f3b8"},{"aliases":["space_invader"],"filename":"1f47e"},{"aliases":["video_game"],"filename":"1f3ae"},{"aliases":["black_joker"],"filename":"1f0cf"},{"aliases":["flower_playing_cards"],"filename":"1f3b4"},{"aliases":["mahjong"],"filename":"1f004"},{"aliases":["game_die"],"filename":"1f3b2"},{"aliases":["dart"],"filename":"1f3af"},{"aliases":["football"],"filename":"1f3c8"},{"aliases":["basketball"],"filename":"1f3c0"},{"aliases":["soccer"],"filename":"26bd"},{"aliases":["baseball"],"filename":"26be"},{"aliases":["tennis"],"filename":"1f3be"},{"aliases":["8ball"],"filename":"1f3b1"},{"aliases":["rugby_football"],"filename":"1f3c9"},{"aliases":["bowling"],"filename":"1f3b3"},{"aliases":["golf"],"filename":"26f3"},{"aliases":["mountain_bicyclist"],"filename":"1f6b5"},{"aliases":["bicyclist"],"filename":"1f6b4"},{"aliases":["checkered_flag"],"filename":"1f3c1"},{"aliases":["horse_racing"],"filename":"1f3c7"},{"aliases":["trophy"],"filename":"1f3c6"},{"aliases":["ski"],"filename":"1f3bf"},{"aliases":["snowboarder"],"filename":"1f3c2"},{"aliases":["swimmer"],"filename":"1f3ca"},{"aliases":["surfer"],"filename":"1f3c4"},{"aliases":["fishing_pole_and_fish"],"filename":"1f3a3"},{"aliases":["coffee"],"filename":"2615"},{"aliases":["tea"],"filename":"1f375"},{"aliases":["sake"],"filename":"1f376"},{"aliases":["baby_bottle"],"filename":"1f37c"},{"aliases":["beer"],"filename":"1f37a"},{"aliases":["beers"],"filename":"1f37b"},{"aliases":["cocktail"],"filename":"1f378"},{"aliases":["tropical_drink"],"filename":"1f379"},{"aliases":["wine_glass"],"filename":"1f377"},{"aliases":["fork_and_knife"],"filename":"1f374"},{"aliases":["pizza"],"filename":"1f355"},{"aliases":["hamburger"],"filename":"1f354"},{"aliases":["fries"],"filename":"1f35f"},{"aliases":["poultry_leg"],"filename":"1f357"},{"aliases":["meat_on_bone"],"filename":"1f356"},{"aliases":["spaghetti"],"filename":"1f35d"},{"aliases":["curry"],"filename":"1f35b"},{"aliases":["fried_shrimp"],"filename":"1f364"},{"aliases":["bento"],"filename":"1f371"},{"aliases":["sushi"],"filename":"1f363"},{"aliases":["fish_cake"],"filename":"1f365"},{"aliases":["rice_ball"],"filename":"1f359"},{"aliases":["rice_cracker"],"filename":"1f358"},{"aliases":["rice"],"filename":"1f35a"},{"aliases":["ramen"],"filename":"1f35c"},{"aliases":["stew"],"filename":"1f372"},{"aliases":["oden"],"filename":"1f362"},{"aliases":["dango"],"filename":"1f361"},{"aliases":["egg"],"filename":"1f373"},{"aliases":["bread"],"filename":"1f35e"},{"aliases":["doughnut"],"filename":"1f369"},{"aliases":["custard"],"filename":"1f36e"},{"aliases":["icecream"],"filename":"1f366"},{"aliases":["ice_cream"],"filename":"1f368"},{"aliases":["shaved_ice"],"filename":"1f367"},{"aliases":["birthday"],"filename":"1f382"},{"aliases":["cake"],"filename":"1f370"},{"aliases":["cookie"],"filename":"1f36a"},{"aliases":["chocolate_bar"],"filename":"1f36b"},{"aliases":["candy"],"filename":"1f36c"},{"aliases":["lollipop"],"filename":"1f36d"},{"aliases":["honey_pot"],"filename":"1f36f"},{"aliases":["apple"],"filename":"1f34e"},{"aliases":["green_apple"],"filename":"1f34f"},{"aliases":["tangerine","orange","mandarin"],"filename":"1f34a"},{"aliases":["lemon"],"filename":"1f34b"},{"aliases":["cherries"],"filename":"1f352"},{"aliases":["grapes"],"filename":"1f347"},{"aliases":["watermelon"],"filename":"1f349"},{"aliases":["strawberry"],"filename":"1f353"},{"aliases":["peach"],"filename":"1f351"},{"aliases":["melon"],"filename":"1f348"},{"aliases":["banana"],"filename":"1f34c"},{"aliases":["pear"],"filename":"1f350"},{"aliases":["pineapple"],"filename":"1f34d"},{"aliases":["sweet_potato"],"filename":"1f360"},{"aliases":["eggplant"],"filename":"1f346"},{"aliases":["tomato"],"filename":"1f345"},{"aliases":["corn"],"filename":"1f33d"},{"aliases":["house"],"filename":"1f3e0"},{"aliases":["house_with_garden"],"filename":"1f3e1"},{"aliases":["school"],"filename":"1f3eb"},{"aliases":["office"],"filename":"1f3e2"},{"aliases":["post_office"],"filename":"1f3e3"},{"aliases":["hospital"],"filename":"1f3e5"},{"aliases":["bank"],"filename":"1f3e6"},{"aliases":["convenience_store"],"filename":"1f3ea"},{"aliases":["love_hotel"],"filename":"1f3e9"},{"aliases":["hotel"],"filename":"1f3e8"},{"aliases":["wedding"],"filename":"1f492"},{"aliases":["church"],"filename":"26ea"},{"aliases":["department_store"],"filename":"1f3ec"},{"aliases":["european_post_office"],"filename":"1f3e4"},{"aliases":["city_sunrise"],"filename":"1f307"},{"aliases":["city_sunset"],"filename":"1f306"},{"aliases":["japanese_castle"],"filename":"1f3ef"},{"aliases":["european_castle"],"filename":"1f3f0"},{"aliases":["tent"],"filename":"26fa"},{"aliases":["factory"],"filename":"1f3ed"},{"aliases":["tokyo_tower"],"filename":"1f5fc"},{"aliases":["japan"],"filename":"1f5fe"},{"aliases":["mount_fuji"],"filename":"1f5fb"},{"aliases":["sunrise_over_mountains"],"filename":"1f304"},{"aliases":["sunrise"],"filename":"1f305"},{"aliases":["night_with_stars"],"filename":"1f303"},{"aliases":["statue_of_liberty"],"filename":"1f5fd"},{"aliases":["bridge_at_night"],"filename":"1f309"},{"aliases":["carousel_horse"],"filename":"1f3a0"},{"aliases":["ferris_wheel"],"filename":"1f3a1"},{"aliases":["fountain"],"filename":"26f2"},{"aliases":["roller_coaster"],"filename":"1f3a2"},{"aliases":["ship"],"filename":"1f6a2"},{"aliases":["boat","sailboat"],"filename":"26f5"},{"aliases":["speedboat"],"filename":"1f6a4"},{"aliases":["rowboat"],"filename":"1f6a3"},{"aliases":["anchor"],"filename":"2693"},{"aliases":["rocket"],"filename":"1f680"},{"aliases":["airplane"],"filename":"2708"},{"aliases":["seat"],"filename":"1f4ba"},{"aliases":["helicopter"],"filename":"1f681"},{"aliases":["steam_locomotive"],"filename":"1f682"},{"aliases":["tram"],"filename":"1f68a"},{"aliases":["station"],"filename":"1f689"},{"aliases":["mountain_railway"],"filename":"1f69e"},{"aliases":["train2"],"filename":"1f686"},{"aliases":["bullettrain_side"],"filename":"1f684"},{"aliases":["bullettrain_front"],"filename":"1f685"},{"aliases":["light_rail"],"filename":"1f688"},{"aliases":["metro"],"filename":"1f687"},{"aliases":["monorail"],"filename":"1f69d"},{"aliases":["train"],"filename":"1f68b"},{"aliases":["railway_car"],"filename":"1f683"},{"aliases":["trolleybus"],"filename":"1f68e"},{"aliases":["bus"],"filename":"1f68c"},{"aliases":["oncoming_bus"],"filename":"1f68d"},{"aliases":["blue_car"],"filename":"1f699"},{"aliases":["oncoming_automobile"],"filename":"1f698"},{"aliases":["car","red_car"],"filename":"1f697"},{"aliases":["taxi"],"filename":"1f695"},{"aliases":["oncoming_taxi"],"filename":"1f696"},{"aliases":["articulated_lorry"],"filename":"1f69b"},{"aliases":["truck"],"filename":"1f69a"},{"aliases":["rotating_light"],"filename":"1f6a8"},{"aliases":["police_car"],"filename":"1f693"},{"aliases":["oncoming_police_car"],"filename":"1f694"},{"aliases":["fire_engine"],"filename":"1f692"},{"aliases":["ambulance"],"filename":"1f691"},{"aliases":["minibus"],"filename":"1f690"},{"aliases":["bike"],"filename":"1f6b2"},{"aliases":["aerial_tramway"],"filename":"1f6a1"},{"aliases":["suspension_railway"],"filename":"1f69f"},{"aliases":["mountain_cableway"],"filename":"1f6a0"},{"aliases":["tractor"],"filename":"1f69c"},{"aliases":["barber"],"filename":"1f488"},{"aliases":["busstop"],"filename":"1f68f"},{"aliases":["ticket"],"filename":"1f3ab"},{"aliases":["vertical_traffic_light"],"filename":"1f6a6"},{"aliases":["traffic_light"],"filename":"1f6a5"},{"aliases":["warning"],"filename":"26a0"},{"aliases":["construction"],"filename":"1f6a7"},{"aliases":["beginner"],"filename":"1f530"},{"aliases":["fuelpump"],"filename":"26fd"},{"aliases":["izakaya_lantern","lantern"],"filename":"1f3ee"},{"aliases":["slot_machine"],"filename":"1f3b0"},{"aliases":["hotsprings"],"filename":"2668"},{"aliases":["moyai"],"filename":"1f5ff"},{"aliases":["circus_tent"],"filename":"1f3aa"},{"aliases":["performing_arts"],"filename":"1f3ad"},{"aliases":["round_pushpin"],"filename":"1f4cd"},{"aliases":["triangular_flag_on_post"],"filename":"1f6a9"},{"aliases":["jp"],"filename":"1f1ef-1f1f5"},{"aliases":["kr"],"filename":"1f1f0-1f1f7"},{"aliases":["de"],"filename":"1f1e9-1f1ea"},{"aliases":["cn"],"filename":"1f1e8-1f1f3"},{"aliases":["us"],"filename":"1f1fa-1f1f8"},{"aliases":["fr"],"filename":"1f1eb-1f1f7"},{"aliases":["es"],"filename":"1f1ea-1f1f8"},{"aliases":["it"],"filename":"1f1ee-1f1f9"},{"aliases":["ru"],"filename":"1f1f7-1f1fa"},{"aliases":["gb","uk"],"filename":"1f1ec-1f1e7"},{"aliases":["one"],"filename":"0031-20e3"},{"aliases":["two"],"filename":"0032-20e3"},{"aliases":["three"],"filename":"0033-20e3"},{"aliases":["four"],"filename":"0034-20e3"},{"aliases":["five"],"filename":"0035-20e3"},{"aliases":["six"],"filename":"0036-20e3"},{"aliases":["seven"],"filename":"0037-20e3"},{"aliases":["eight"],"filename":"0038-20e3"},{"aliases":["nine"],"filename":"0039-20e3"},{"aliases":["zero"],"filename":"0030-20e3"},{"aliases":["keycap_ten"],"filename":"1f51f"},{"aliases":["1234"],"filename":"1f522"},{"aliases":["hash"],"filename":"0023-20e3"},{"aliases":["symbols"],"filename":"1f523"},{"aliases":["arrow_up"],"filename":"2b06"},{"aliases":["arrow_down"],"filename":"2b07"},{"aliases":["arrow_left"],"filename":"2b05"},{"aliases":["arrow_right"],"filename":"27a1"},{"aliases":["capital_abcd"],"filename":"1f520"},{"aliases":["abcd"],"filename":"1f521"},{"aliases":["abc"],"filename":"1f524"},{"aliases":["arrow_upper_right"],"filename":"2197"},{"aliases":["arrow_upper_left"],"filename":"2196"},{"aliases":["arrow_lower_right"],"filename":"2198"},{"aliases":["arrow_lower_left"],"filename":"2199"},{"aliases":["left_right_arrow"],"filename":"2194"},{"aliases":["arrow_up_down"],"filename":"2195"},{"aliases":["arrows_counterclockwise"],"filename":"1f504"},{"aliases":["arrow_backward"],"filename":"25c0"},{"aliases":["arrow_forward"],"filename":"25b6"},{"aliases":["arrow_up_small"],"filename":"1f53c"},{"aliases":["arrow_down_small"],"filename":"1f53d"},{"aliases":["leftwards_arrow_with_hook"],"filename":"21a9"},{"aliases":["arrow_right_hook"],"filename":"21aa"},{"aliases":["information_source"],"filename":"2139"},{"aliases":["rewind"],"filename":"23ea"},{"aliases":["fast_forward"],"filename":"23e9"},{"aliases":["arrow_double_up"],"filename":"23eb"},{"aliases":["arrow_double_down"],"filename":"23ec"},{"aliases":["arrow_heading_down"],"filename":"2935"},{"aliases":["arrow_heading_up"],"filename":"2934"},{"aliases":["ok"],"filename":"1f197"},{"aliases":["twisted_rightwards_arrows"],"filename":"1f500"},{"aliases":["repeat"],"filename":"1f501"},{"aliases":["repeat_one"],"filename":"1f502"},{"aliases":["new"],"filename":"1f195"},{"aliases":["up"],"filename":"1f199"},{"aliases":["cool"],"filename":"1f192"},{"aliases":["free"],"filename":"1f193"},{"aliases":["ng"],"filename":"1f196"},{"aliases":["signal_strength"],"filename":"1f4f6"},{"aliases":["cinema"],"filename":"1f3a6"},{"aliases":["koko"],"filename":"1f201"},{"aliases":["u6307"],"filename":"1f22f"},{"aliases":["u7a7a"],"filename":"1f233"},{"aliases":["u6e80"],"filename":"1f235"},{"aliases":["u5408"],"filename":"1f234"},{"aliases":["u7981"],"filename":"1f232"},{"aliases":["ideograph_advantage"],"filename":"1f250"},{"aliases":["u5272"],"filename":"1f239"},{"aliases":["u55b6"],"filename":"1f23a"},{"aliases":["u6709"],"filename":"1f236"},{"aliases":["u7121"],"filename":"1f21a"},{"aliases":["restroom"],"filename":"1f6bb"},{"aliases":["mens"],"filename":"1f6b9"},{"aliases":["womens"],"filename":"1f6ba"},{"aliases":["baby_symbol"],"filename":"1f6bc"},{"aliases":["wc"],"filename":"1f6be"},{"aliases":["potable_water"],"filename":"1f6b0"},{"aliases":["put_litter_in_its_place"],"filename":"1f6ae"},{"aliases":["parking"],"filename":"1f17f"},{"aliases":["wheelchair"],"filename":"267f"},{"aliases":["no_smoking"],"filename":"1f6ad"},{"aliases":["u6708"],"filename":"1f237"},{"aliases":["u7533"],"filename":"1f238"},{"aliases":["sa"],"filename":"1f202"},{"aliases":["m"],"filename":"24c2"},{"aliases":["passport_control"],"filename":"1f6c2"},{"aliases":["baggage_claim"],"filename":"1f6c4"},{"aliases":["left_luggage"],"filename":"1f6c5"},{"aliases":["customs"],"filename":"1f6c3"},{"aliases":["accept"],"filename":"1f251"},{"aliases":["secret"],"filename":"3299"},{"aliases":["congratulations"],"filename":"3297"},{"aliases":["cl"],"filename":"1f191"},{"aliases":["sos"],"filename":"1f198"},{"aliases":["id"],"filename":"1f194"},{"aliases":["no_entry_sign"],"filename":"1f6ab"},{"aliases":["underage"],"filename":"1f51e"},{"aliases":["no_mobile_phones"],"filename":"1f4f5"},{"aliases":["do_not_litter"],"filename":"1f6af"},{"aliases":["non-potable_water"],"filename":"1f6b1"},{"aliases":["no_bicycles"],"filename":"1f6b3"},{"aliases":["no_pedestrians"],"filename":"1f6b7"},{"aliases":["children_crossing"],"filename":"1f6b8"},{"aliases":["no_entry"],"filename":"26d4"},{"aliases":["eight_spoked_asterisk"],"filename":"2733"},{"aliases":["sparkle"],"filename":"2747"},{"aliases":["negative_squared_cross_mark"],"filename":"274e"},{"aliases":["white_check_mark"],"filename":"2705"},{"aliases":["eight_pointed_black_star"],"filename":"2734"},{"aliases":["heart_decoration"],"filename":"1f49f"},{"aliases":["vs"],"filename":"1f19a"},{"aliases":["vibration_mode"],"filename":"1f4f3"},{"aliases":["mobile_phone_off"],"filename":"1f4f4"},{"aliases":["a"],"filename":"1f170"},{"aliases":["b"],"filename":"1f171"},{"aliases":["ab"],"filename":"1f18e"},{"aliases":["o2"],"filename":"1f17e"},{"aliases":["diamond_shape_with_a_dot_inside"],"filename":"1f4a0"},{"aliases":["loop"],"filename":"27bf"},{"aliases":["recycle"],"filename":"267b"},{"aliases":["aries"],"filename":"2648"},{"aliases":["taurus"],"filename":"2649"},{"aliases":["gemini"],"filename":"264a"},{"aliases":["cancer"],"filename":"264b"},{"aliases":["leo"],"filename":"264c"},{"aliases":["virgo"],"filename":"264d"},{"aliases":["libra"],"filename":"264e"},{"aliases":["scorpius"],"filename":"264f"},{"aliases":["sagittarius"],"filename":"2650"},{"aliases":["capricorn"],"filename":"2651"},{"aliases":["aquarius"],"filename":"2652"},{"aliases":["pisces"],"filename":"2653"},{"aliases":["ophiuchus"],"filename":"26ce"},{"aliases":["six_pointed_star"],"filename":"1f52f"},{"aliases":["atm"],"filename":"1f3e7"},{"aliases":["chart"],"filename":"1f4b9"},{"aliases":["heavy_dollar_sign"],"filename":"1f4b2"},{"aliases":["currency_exchange"],"filename":"1f4b1"},{"aliases":["copyright"],"filename":"00a9"},{"aliases":["registered"],"filename":"00ae"},{"aliases":["tm"],"filename":"2122"},{"aliases":["x"],"filename":"274c"},{"aliases":["bangbang"],"filename":"203c"},{"aliases":["interrobang"],"filename":"2049"},{"aliases":["exclamation","heavy_exclamation_mark"],"filename":"2757"},{"aliases":["question"],"filename":"2753"},{"aliases":["grey_exclamation"],"filename":"2755"},{"aliases":["grey_question"],"filename":"2754"},{"aliases":["o"],"filename":"2b55"},{"aliases":["top"],"filename":"1f51d"},{"aliases":["end"],"filename":"1f51a"},{"aliases":["back"],"filename":"1f519"},{"aliases":["on"],"filename":"1f51b"},{"aliases":["soon"],"filename":"1f51c"},{"aliases":["arrows_clockwise"],"filename":"1f503"},{"aliases":["clock12"],"filename":"1f55b"},{"aliases":["clock1230"],"filename":"1f567"},{"aliases":["clock1"],"filename":"1f550"},{"aliases":["clock130"],"filename":"1f55c"},{"aliases":["clock2"],"filename":"1f551"},{"aliases":["clock230"],"filename":"1f55d"},{"aliases":["clock3"],"filename":"1f552"},{"aliases":["clock330"],"filename":"1f55e"},{"aliases":["clock4"],"filename":"1f553"},{"aliases":["clock430"],"filename":"1f55f"},{"aliases":["clock5"],"filename":"1f554"},{"aliases":["clock530"],"filename":"1f560"},{"aliases":["clock6"],"filename":"1f555"},{"aliases":["clock7"],"filename":"1f556"},{"aliases":["clock8"],"filename":"1f557"},{"aliases":["clock9"],"filename":"1f558"},{"aliases":["clock10"],"filename":"1f559"},{"aliases":["clock11"],"filename":"1f55a"},{"aliases":["clock630"],"filename":"1f561"},{"aliases":["clock730"],"filename":"1f562"},{"aliases":["clock830"],"filename":"1f563"},{"aliases":["clock930"],"filename":"1f564"},{"aliases":["clock1030"],"filename":"1f565"},{"aliases":["clock1130"],"filename":"1f566"},{"aliases":["heavy_multiplication_x"],"filename":"2716"},{"aliases":["heavy_plus_sign"],"filename":"2795"},{"aliases":["heavy_minus_sign"],"filename":"2796"},{"aliases":["heavy_division_sign"],"filename":"2797"},{"aliases":["spades"],"filename":"2660"},{"aliases":["hearts"],"filename":"2665"},{"aliases":["clubs"],"filename":"2663"},{"aliases":["diamonds"],"filename":"2666"},{"aliases":["white_flower"],"filename":"1f4ae"},{"aliases":["100"],"filename":"1f4af"},{"aliases":["heavy_check_mark"],"filename":"2714"},{"aliases":["ballot_box_with_check"],"filename":"2611"},{"aliases":["radio_button"],"filename":"1f518"},{"aliases":["link"],"filename":"1f517"},{"aliases":["curly_loop"],"filename":"27b0"},{"aliases":["wavy_dash"],"filename":"3030"},{"aliases":["part_alternation_mark"],"filename":"303d"},{"aliases":["trident"],"filename":"1f531"},{"aliases":["black_medium_square"],"filename":"25fc"},{"aliases":["white_medium_square"],"filename":"25fb"},{"aliases":["black_medium_small_square"],"filename":"25fe"},{"aliases":["white_medium_small_square"],"filename":"25fd"},{"aliases":["black_small_square"],"filename":"25aa"},{"aliases":["white_small_square"],"filename":"25ab"},{"aliases":["small_red_triangle"],"filename":"1f53a"},{"aliases":["black_square_button"],"filename":"1f532"},{"aliases":["white_square_button"],"filename":"1f533"},{"aliases":["black_circle"],"filename":"26ab"},{"aliases":["white_circle"],"filename":"26aa"},{"aliases":["red_circle"],"filename":"1f534"},{"aliases":["large_blue_circle"],"filename":"1f535"},{"aliases":["small_red_triangle_down"],"filename":"1f53b"},{"aliases":["white_large_square"],"filename":"2b1c"},{"aliases":["black_large_square"],"filename":"2b1b"},{"aliases":["large_orange_diamond"],"filename":"1f536"},{"aliases":["large_blue_diamond"],"filename":"1f537"},{"aliases":["small_orange_diamond"],"filename":"1f538"},{"aliases":["small_blue_diamond"],"filename":"1f539"},{"aliases":["ca"],"filename":"1f1e8-1f1e6"},{"aliases":["pk"],"filename":"1f1f5-1f1f0"},{"aliases":["za"],"filename":"1f1ff-1f1e6"},{"aliases":["slightly_smiling_face"],"filename":"1f642"},{"aliases":["slightly_frowning_face"],"filename":"1f641"},{"aliases":["upside_down_face"],"filename":"1f643"},{"aliases":["mattermost"],"filename":"mattermost"},{"aliases":["bowtie"],"filename":"bowtie"},{"aliases":["feelsgood"],"filename":"feelsgood"},{"aliases":["finnadie"],"filename":"finnadie"},{"aliases":["fu"],"filename":"fu"},{"aliases":["goberserk"],"filename":"goberserk"},{"aliases":["godmode"],"filename":"godmode"},{"aliases":["hurtrealbad"],"filename":"hurtrealbad"},{"aliases":["metal"],"filename":"metal"},{"aliases":["neckbeard"],"filename":"neckbeard"},{"aliases":["octocat"],"filename":"octocat"},{"aliases":["rage1"],"filename":"rage1"},{"aliases":["rage2"],"filename":"rage2"},{"aliases":["rage3"],"filename":"rage3"},{"aliases":["rage4"],"filename":"rage4"},{"aliases":["shipit","squirrel"],"filename":"shipit"},{"aliases":["suspect"],"filename":"suspect"},{"aliases":["taco"],"filename":"taco"},{"aliases":["trollface"],"filename":"trollface"}];
export const EmojiIndicesByAlias = new Map([["+1",105],["-1",106],["100",816],["1234",647],["8ball",462],["a",741],["ab",743],["abc",656],["abcd",655],["accept",717],["aerial_tramway",605],["airplane",573],["alarm_clock",353],["alien",88],["ambulance",602],["anchor",571],["angel",71],["anger",95],["angry",33],["anguished",46],["ant",219],["apple",518],["aquarius",758],["aries",748],["arrow_backward",664],["arrow_double_down",674],["arrow_double_up",673],["arrow_down",651],["arrow_down_small",667],["arrow_forward",665],["arrow_heading_down",675],["arrow_heading_up",676],["arrow_left",652],["arrow_lower_left",660],["arrow_lower_right",659],["arrow_right",653],["arrow_right_hook",669],["arrow_up",650],["arrow_up_down",662],["arrow_up_small",666],["arrow_upper_left",658],["arrow_upper_right",657],["arrows_clockwise",782],["arrows_counterclockwise",663],["art",438],["articulated_lorry",596],["astonished",43],["athletic_shoe",147],["atm",762],["b",742],["baby",63],["baby_bottle",479],["baby_chick",211],["baby_symbol",702],["back",779],["baggage_claim",714],["balloon",323],["ballot_box_with_check",818],["bamboo",305],["banana",528],["bangbang",770],["bank",541],["bar_chart",407],["barber",609],["baseball",460],["basketball",458],["bath",369],["bathtub",368],["battery",366],["bear",198],["bee",218],["beer",480],["beers",481],["beetle",220],["beginner",616],["bell",347],["bento",494],["bicyclist",467],["bike",604],["bikini",159],["bird",210],["birthday",511],["black_circle",834],["black_joker",452],["black_large_square",840],["black_medium_small_square",827],["black_medium_square",825],["black_nib",420],["black_small_square",829],["black_square_button",832],["blossom",271],["blowfish",244],["blue_book",426],["blue_car",591],["blue_heart",169],["blush",3],["boar",202],["boat",568],["bomb",377],["book",432],["bookmark",433],["bookmark_tabs",406],["books",431],["boom",94],["boot",151],["bouquet",252],["bow",143],["bowling",464],["bowtie",852],["boy",64],["bread",505],["bride_with_veil",140],["bridge_at_night",562],["briefcase",160],["broken_heart",173],["bug",217],["bulb",361],["bullettrain_front",582],["bullettrain_side",581],["bus",589],["busstop",610],["bust_in_silhouette",184],["busts_in_silhouette",185],["ca",845],["cactus",265],["cake",512],["calendar",413],["calling",389],["camel",246],["camera",327],["cancer",751],["candy",515],["capital_abcd",654],["capricorn",757],["car",593],["card_index",414],["carousel_horse",563],["cat",191],["cat2",249],["cd",330],["chart",763],["chart_with_downwards_trend",409],["chart_with_upwards_trend",408],["checkered_flag",468],["cherries",522],["cherry_blossom",253],["chestnut",269],["chicken",214],["children_crossing",730],["chocolate_bar",514],["christmas_tree",318],["church",546],["cinema",687],["circus_tent",622],["city_sunrise",549],["city_sunset",550],["cl",720],["clap",121],["clapper",439],["clipboard",411],["clock1",785],["clock10",799],["clock1030",805],["clock11",800],["clock1130",806],["clock12",783],["clock1230",784],["clock130",786],["clock2",787],["clock230",788],["clock3",789],["clock330",790],["clock4",791],["clock430",792],["clock5",793],["clock530",794],["clock6",795],["clock630",801],["clock7",796],["clock730",802],["clock8",797],["clock830",803],["clock9",798],["clock930",804],["closed_book",424],["closed_lock_with_key",358],["closed_umbrella",166],["cloud",296],["clubs",813],["cn",629],["cocktail",482],["coffee",476],["cold_sweat",26],["collision",94],["computer",334],["confetti_ball",322],["confounded",36],["confused",52],["congratulations",719],["construction",615],["construction_worker",61],["convenience_store",542],["cookie",513],["cool",683],["cop",60],["copyright",766],["corn",534],["couple",126],["couple_with_heart",131],["couplekiss",130],["cow",201],["cow2",229],["credit_card",387],["crescent_moon",286],["crocodile",245],["crossed_flags",324],["crown",145],["cry",21],["crying_cat_face",79],["crystal_ball",325],["cupid",179],["curly_loop",821],["currency_exchange",765],["curry",492],["custard",507],["customs",716],["cyclone",301],["dancer",125],["dancers",132],["dango",503],["dart",456],["dash",99],["date",412],["de",628],["deciduous_tree",268],["department_store",547],["diamond_shape_with_a_dot_inside",745],["diamonds",814],["disappointed",19],["disappointed_relieved",25],["dizzy",93],["dizzy_face",42],["do_not_litter",726],["dog",189],["dog2",239],["dollar",384],["dolls",307],["dolphin",226],["door",375],["doughnut",506],["dragon",235],["dragon_face",243],["dress",155],["dromedary_camel",247],["droplet",97],["dvd",331],["e-mail",390],["ear",100],["ear_of_rice",263],["earth_africa",287],["earth_americas",288],["earth_asia",289],["egg",504],["eggplant",532],["eight",643],["eight_pointed_black_star",736],["eight_spoked_asterisk",732],["electric_plug",365],["elephant",207],["email",393],["end",778],["envelope",393],["envelope_with_arrow",394],["es",632],["euro",386],["european_castle",552],["european_post_office",548],["evergreen_tree",267],["exclamation",772],["expressionless",57],["eyeglasses",164],["eyes",101],["facepunch",108],["factory",554],["fallen_leaf",261],["family",127],["fast_forward",672],["fax",339],["fearful",31],["feelsgood",853],["feet",251],["ferris_wheel",564],["file_folder",415],["finnadie",854],["fire",90],["fire_engine",601],["fireworks",311],["first_quarter_moon",278],["first_quarter_moon_with_face",285],["fish",225],["fish_cake",496],["fishing_pole_and_fish",475],["fist",109],["five",640],["flags",310],["flashlight",362],["flipper",226],["floppy_disk",333],["flower_playing_cards",453],["flushed",14],["foggy",302],["football",457],["footprints",187],["fork_and_knife",485],["fountain",565],["four",639],["four_leaf_clover",255],["fr",631],["free",684],["fried_shrimp",493],["fries",488],["frog",195],["frowning",45],["fu",855],["fuelpump",617],["full_moon",280],["full_moon_with_face",274],["game_die",455],["gb",635],["gem",183],["gemini",750],["ghost",316],["gift",319],["gift_heart",306],["girl",65],["globe_with_meridians",272],["goat",237],["goberserk",856],["godmode",857],["golf",465],["grapes",523],["green_apple",519],["green_book",425],["green_heart",171],["grey_exclamation",774],["grey_question",775],["grimacing",50],["grin",15],["grinning",2],["guardsman",62],["guitar",449],["gun",378],["haircut",138],["hamburger",487],["hammer",374],["hamster",193],["hand",112],["handbag",161],["hankey",89],["hash",648],["hatched_chick",212],["hatching_chick",213],["headphones",441],["hear_no_evil",85],["heart",172],["heart_decoration",737],["heart_eyes",6],["heart_eyes_cat",75],["heartbeat",175],["heartpulse",174],["hearts",812],["heavy_check_mark",817],["heavy_division_sign",810],["heavy_dollar_sign",764],["heavy_exclamation_mark",772],["heavy_minus_sign",809],["heavy_multiplication_x",807],["heavy_plus_sign",808],["helicopter",575],["herb",262],["hibiscus",258],["high_brightness",363],["high_heel",150],["hocho",379],["honey_pot",517],["honeybee",218],["horse",205],["horse_racing",469],["hospital",540],["hotel",544],["hotsprings",620],["hourglass",352],["hourglass_flowing_sand",351],["house",535],["house_with_garden",536],["hurtrealbad",858],["hushed",53],["ice_cream",509],["icecream",508],["id",722],["ideograph_advantage",694],["imp",48],["inbox_tray",391],["incoming_envelope",395],["information_desk_person",135],["information_source",670],["innocent",55],["interrobang",771],["iphone",335],["it",633],["izakaya_lantern",618],["jack_o_lantern",315],["japan",556],["japanese_castle",551],["japanese_goblin",83],["japanese_ogre",82],["jeans",157],["joy",22],["joy_cat",80],["jp",626],["key",359],["keycap_ten",646],["kimono",158],["kiss",181],["kissing",9],["kissing_cat",76],["kissing_closed_eyes",8],["kissing_heart",7],["kissing_smiling_eyes",10],["knife",379],["koala",197],["koko",688],["kr",627],["lantern",618],["large_blue_circle",837],["large_blue_diamond",842],["large_orange_diamond",841],["last_quarter_moon",282],["last_quarter_moon_with_face",284],["laughing",37],["leaves",260],["ledger",430],["left_luggage",715],["left_right_arrow",661],["leftwards_arrow_with_hook",668],["lemon",521],["leo",752],["leopard",248],["libra",754],["light_rail",583],["link",820],["lips",104],["lipstick",167],["lock",356],["lock_with_ink_pen",357],["lollipop",516],["loop",746],["loud_sound",343],["loudspeaker",349],["love_hotel",543],["love_letter",180],["low_brightness",364],["m",712],["mag",367],["mag_right",360],["mahjong",454],["mailbox",397],["mailbox_closed",398],["mailbox_with_mail",399],["mailbox_with_no_mail",400],["man",66],["man_with_gua_pi_mao",58],["man_with_turban",59],["mandarin",520],["mans_shoe",148],["maple_leaf",259],["mask",39],["massage",137],["mattermost",851],["meat_on_bone",490],["mega",350],["melon",527],["memo",403],["mens",700],["metal",859],["metro",584],["microphone",440],["microscope",435],["milky_way",291],["minibus",603],["minidisc",332],["mobile_phone_off",740],["money_with_wings",388],["moneybag",382],["monkey",204],["monkey_face",203],["monorail",585],["moon",279],["mortar_board",309],["mount_fuji",557],["mountain_bicyclist",466],["mountain_cableway",607],["mountain_railway",579],["mouse",192],["mouse2",241],["movie_camera",326],["moyai",621],["muscle",122],["mushroom",264],["musical_keyboard",445],["musical_note",443],["musical_score",442],["mute",346],["nail_care",139],["name_badge",434],["neckbeard",860],["necktie",153],["negative_squared_cross_mark",734],["neutral_face",51],["new",681],["new_moon",276],["new_moon_with_face",275],["newspaper",437],["ng",685],["ng_woman",134],["night_with_stars",560],["nine",644],["no_bell",348],["no_bicycles",728],["no_entry",731],["no_entry_sign",723],["no_good",134],["no_mobile_phones",725],["no_mouth",54],["no_pedestrians",729],["no_smoking",708],["non-potable_water",727],["nose",102],["notebook",428],["notebook_with_decorative_cover",429],["notes",444],["nut_and_bolt",373],["o",776],["o2",744],["ocean",304],["octocat",861],["octopus",222],["oden",502],["office",538],["ok",677],["ok_hand",107],["ok_woman",133],["older_man",68],["older_woman",69],["on",780],["oncoming_automobile",592],["oncoming_bus",590],["oncoming_police_car",600],["oncoming_taxi",595],["one",636],["open_book",432],["open_file_folder",416],["open_hands",113],["open_mouth",49],["ophiuchus",760],["orange",520],["orange_book",427],["outbox_tray",392],["ox",242],["package",402],["page_facing_up",404],["page_with_curl",405],["pager",338],["palm_tree",266],["panda_face",208],["paperclip",419],["parking",706],["part_alternation_mark",823],["partly_sunny",295],["passport_control",713],["paw_prints",251],["peach",526],["pear",529],["pencil",403],["pencil2",421],["penguin",209],["pensive",16],["performing_arts",623],["persevere",20],["person_frowning",142],["person_with_blond_hair",70],["person_with_pouting_face",141],["phone",336],["pig",199],["pig2",240],["pig_nose",200],["pill",380],["pineapple",530],["pisces",759],["pizza",486],["pk",846],["point_down",115],["point_left",117],["point_right",116],["point_up",120],["point_up_2",114],["police_car",599],["poodle",250],["poop",89],["post_office",539],["postal_horn",396],["postbox",401],["potable_water",704],["pouch",162],["poultry_leg",489],["pound",385],["pout",34],["pouting_cat",81],["pray",119],["princess",72],["punch",108],["purple_heart",170],["purse",163],["pushpin",418],["put_litter_in_its_place",705],["question",773],["rabbit",194],["rabbit2",234],["racehorse",236],["radio",342],["radio_button",819],["rage",34],["rage1",862],["rage2",863],["rage3",864],["rage4",865],["railway_car",587],["rainbow",303],["raised_hand",112],["raised_hands",118],["raising_hand",136],["ram",230],["ramen",500],["rat",231],["recycle",747],["red_car",593],["red_circle",836],["registered",767],["relaxed",4],["relieved",17],["repeat",679],["repeat_one",680],["restroom",699],["revolving_hearts",178],["rewind",671],["ribbon",165],["rice",499],["rice_ball",497],["rice_cracker",498],["rice_scene",314],["ring",182],["rocket",572],["roller_coaster",566],["rooster",238],["rose",256],["rotating_light",598],["round_pushpin",624],["rowboat",570],["ru",634],["rugby_football",463],["runner",124],["running",124],["running_shirt_with_sash",156],["sa",711],["sagittarius",756],["sailboat",568],["sake",478],["sandal",149],["santa",317],["satellite",340],["satisfied",37],["saxophone",448],["school",537],["school_satchel",308],["scissors",417],["scorpius",755],["scream",32],["scream_cat",78],["scroll",410],["seat",574],["secret",718],["see_no_evil",84],["seedling",270],["seven",642],["shaved_ice",510],["sheep",206],["shell",223],["ship",567],["shipit",866],["shirt",152],["shit",89],["shoe",148],["shower",370],["signal_strength",686],["six",641],["six_pointed_star",761],["ski",471],["skull",87],["sleeping",41],["sleepy",24],["slightly_frowning_face",849],["slightly_smiling_face",848],["slot_machine",619],["small_blue_diamond",844],["small_orange_diamond",843],["small_red_triangle",831],["small_red_triangle_down",838],["smile",0],["smile_cat",74],["smiley",1],["smiley_cat",73],["smiling_imp",47],["smirk",56],["smirk_cat",77],["smoking",376],["snail",221],["snake",215],["snowboarder",472],["snowflake",299],["snowman",300],["sob",23],["soccer",459],["soon",781],["sos",721],["sound",344],["space_invader",450],["spades",811],["spaghetti",491],["sparkle",733],["sparkler",312],["sparkles",91],["sparkling_heart",177],["speak_no_evil",86],["speaker",345],["speech_balloon",186],["speedboat",569],["squirrel",866],["star",293],["star2",92],["stars",292],["station",578],["statue_of_liberty",561],["steam_locomotive",576],["stew",501],["straight_ruler",422],["strawberry",525],["stuck_out_tongue",13],["stuck_out_tongue_closed_eyes",12],["stuck_out_tongue_winking_eye",11],["sun_with_face",273],["sunflower",257],["sunglasses",40],["sunny",294],["sunrise",559],["sunrise_over_mountains",558],["surfer",474],["sushi",495],["suspect",867],["suspension_railway",606],["sweat",28],["sweat_drops",96],["sweat_smile",27],["sweet_potato",531],["swimmer",473],["symbols",649],["syringe",381],["taco",868],["tada",321],["tanabata_tree",320],["tangerine",520],["taurus",749],["taxi",594],["tea",477],["telephone",336],["telephone_receiver",337],["telescope",436],["tennis",461],["tent",553],["thought_balloon",188],["three",638],["thumbsdown",106],["thumbsup",105],["ticket",611],["tiger",196],["tiger2",233],["tired_face",30],["tm",768],["toilet",371],["tokyo_tower",555],["tomato",533],["tongue",103],["top",777],["tophat",144],["tractor",608],["traffic_light",613],["train",586],["train2",580],["tram",577],["triangular_flag_on_post",625],["triangular_ruler",423],["trident",824],["triumph",35],["trolleybus",588],["trollface",869],["trophy",470],["tropical_drink",483],["tropical_fish",224],["truck",597],["trumpet",447],["tshirt",152],["tulip",254],["turtle",216],["tv",341],["twisted_rightwards_arrows",678],["two",637],["two_hearts",176],["two_men_holding_hands",128],["two_women_holding_hands",129],["u5272",695],["u5408",692],["u55b6",696],["u6307",689],["u6708",709],["u6709",697],["u6e80",691],["u7121",698],["u7533",710],["u7981",693],["u7a7a",690],["uk",635],["umbrella",298],["unamused",18],["underage",724],["unlock",355],["up",682],["upside_down_face",850],["us",630],["v",110],["vertical_traffic_light",612],["vhs",329],["vibration_mode",739],["video_camera",328],["video_game",451],["violin",446],["virgo",753],["volcano",290],["vs",738],["walking",123],["waning_crescent_moon",283],["waning_gibbous_moon",281],["warning",614],["watch",354],["water_buffalo",232],["watermelon",524],["wave",111],["wavy_dash",822],["waxing_crescent_moon",277],["waxing_gibbous_moon",279],["wc",703],["weary",29],["wedding",545],["whale",227],["whale2",228],["wheelchair",707],["white_check_mark",735],["white_circle",835],["white_flower",815],["white_large_square",839],["white_medium_small_square",828],["white_medium_square",826],["white_small_square",830],["white_square_button",833],["wind_chime",313],["wine_glass",484],["wink",5],["wolf",190],["woman",67],["womans_clothes",154],["womans_hat",146],["womens",701],["worried",44],["wrench",372],["x",769],["yellow_heart",168],["yen",383],["yum",38],["za",847],["zap",297],["zero",645],["zzz",98]]);
diff --git a/webapp/utils/utils.jsx b/webapp/utils/utils.jsx
index 820f1a1c7..a64b06a3b 100644
--- a/webapp/utils/utils.jsx
+++ b/webapp/utils/utils.jsx
@@ -575,6 +575,8 @@ export function applyTheme(theme) {
changeCss('body.app__body', 'scrollbar-face-color:' + theme.centerChannelBg);
changeCss('body.app__body', 'scrollbar-track-color:' + theme.centerChannelBg);
changeCss('.app__body .post-list__new-messages-below', 'color:' + theme.centerChannelBg);
+ changeCss('.app__body .emoji-picker, .app__body .emoji-picker__search', 'background:' + theme.centerChannelBg);
+ changeCss('.app__body .emoji-picker-bottom, .app__body .emoji-picker__search', 'background:' + theme.centerChannelBg);
}
if (theme.centerChannelColor) {
@@ -651,6 +653,22 @@ export function applyTheme(theme) {
changeCss('.app__body .navbar .status .offline--icon', 'fill:' + theme.centerChannelColor);
changeCss('.app__body .post-reaction:not(.post-reaction--current-user)', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.25));
changeCss('.app__body .post-reaction:not(.post-reaction--current-user)', 'color:' + changeOpacity(theme.centerChannelColor, 0.7));
+ changeCss('.app__body .emoji-picker', 'color:' + theme.centerChannelColor);
+ changeCss('.app__body .emoji-picker-bottom', 'color:' + theme.centerChannelColor);
+ changeCss('.app__body .emoji-picker, .app__body .emoji-picker__search-container .emoji-picker__search', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2));
+ changeCss('.app__body .emoji-picker-bottom, .app__body .emoji-picker__search-container .emoji-picker__search', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2));
+ changeCss('.app__body .emoji-picker, .app__body .emoji-picker__items .emoji-picker__search-container .emoji-picker__search', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2));
+ changeCss('.app__body .emoji-picker-bottom, .app__body .emoji-picker__items .emoji-picker__search-container .emoji-picker__search', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2));
+ changeCss('.app__body .emoji-picker__items', 'background-color:' + changeOpacity(theme.centerChannelColor, 0.05));
+ changeCss('.app__body .emoji-picker__categories', 'border-bottom-color:' + changeOpacity(theme.centerChannelColor, 0.2));
+ changeCss('.emoji-picker__category .fa:hover', 'color:' + changeOpacity(theme.centerChannelColor, 0.8));
+
+ changeCss('.app__body .emoji-picker__preview', 'border-top-color:' + changeOpacity(theme.centerChannelColor, 0.2));
+ changeCss('.app__body .emoji-picker__category, .app__body .emoji-picker__category:focus, .app__body .emoji-picker__category:hover', 'color:' + changeOpacity(theme.centerChannelColor, 0.3));
+ changeCss('.app__body .emoji-picker__category--selected, .app__body .emoji-picker__category--selected:focus, .app__body .emoji-picker__category--selected:hover', 'color:' + theme.centerChannelColor);
+ changeCss('.app__body .emoji-picker__item:hover', 'background-color:' + changeOpacity(theme.centerChannelColor, 0.8));
+ changeCss('.app__body .emojisprite:hover', 'background-color:' + changeOpacity(theme.centerChannelColor, 0.8));
+ changeCss('.app__body .icon__postcontent_picker:hover', 'color:' + changeOpacity(theme.centerChannelColor, 0.8));
}
if (theme.newMessageSeparator) {