diff options
222 files changed, 11456 insertions, 4125 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 99f601a5..588348a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,18 +4,90 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] +### Fixed +- Button to remove uploaded media in post status form is now properly placed and sized. +- Fixed shoutbox not working in mobile layout + + +## [2.2.3] - 2021-01-18 ### Added -- New option to optimize timeline rendering to make the site more responsive (enabled by default) +- Added Report button to status ellipsis menu for easier reporting -## [Unreleased patch] ### Fixed -- Fixed chats list not updating its order when new messages come in -- Fixed chat messages sometimes getting lost when you receive a message at the same time -- Fixed clicking NSFW hider through status popover +- Follows/Followers tabs on user profiles now display the content properly. +- Handle punycode in screen names + +### Changed +- Don't filter own posts when they hit your wordfilter +- Language picker now uses native language names + +## [2.2.2] - 2020-12-22 ### Added +- Mouseover titles for emojis in reaction picker +- Support to input emoji into the search box in reaction picker +- Added some missing unicode emoji +- Added the upload limit to the Features panel in the About page +- Support for solid color wallpaper, instance doesn't have to define a wallpaper anymore + +### Fixed +- Fixed the occasional bug where screen would scroll 1px when typing into a reply form +- Fixed timeline errors locking timelines +- Fixed missing highlighted border in expanded conversations +- Fixed custom emoji not working in profile field names +- Fixed pinned statuses not appearing in user profiles +- Fixed some elements not being keyboard navigation friendly +- Fixed error handling when updating various profile images +- Fixed your latest chat messages disappearing when closing chat view and opening it again during the same session +- Fixed custom emoji not showing in poll options before voting +- Fixed link color not applied to instance name in topbar + +### Changed +- Errors when fetching are now shown with popup errors instead of "Error fetching updates" in panel headers +- Made reply/fav/repeat etc buttons easier to hit +- Adjusted timeline menu clickable area to match the visible button +- Moved external source link from status heading to the ellipsis menu +- Disabled horizontal textarea resize +- Wallpaper is now top-aligned, horizontally centered. + + +## [2.2.1] - 2020-11-11 +### Fixed +- Fixed regression in react popup alignment and overflowing + + +## [2.2.0] - 2020-11-06 +### Added +- New option to optimize timeline rendering to make the site more responsive (enabled by default) +- New instance option `logoLeft` to move logo to the left side in desktop nav bar - Import/export a muted users - Proper handling of deletes when using websocket streaming +- Added optimistic chat message sending, so you can start writing next message before the previous one has been sent +- Added a small red badge to the favicon when there's unread notifications +- Added the NSFW alert to link previews + +### Fixed +- Fixed clicking NSFW hider through status popover +- Fixed chat-view back button being hard to click +- Fixed fresh chat notifications being cleared immediately while leaving the chat view and not having time to actually see the messages +- Fixed multiple regressions in CSS styles +- Fixed multiple issues with input fields when using CJK font as default +- Fixed search field in navbar infringing into logo in some cases +- Fixed not being able to load the chat history in vertical screens when the message list doesn't take the full height of the scrollable container on the first fetch. + +### Changed +- Clicking immediately when timeline shifts is now blocked to prevent misclicks +- Icons changed from fontello (FontAwesome 4 + others) to FontAwesome 5 due to problems with fontello. +- Some icons changed for better accessibility (lock, globe) +- Logo is now clickable +- Changed default logo to SVG version + + +## [2.1.2] - 2020-09-17 +### Fixed +- Fixed chats list not updating its order when new messages come in +- Fixed chat messages sometimes getting lost when you receive a message at the same time + ## [2.1.1] - 2020-09-08 ### Changed @@ -142,8 +214,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Ability to change user's email - About page - Added remote user redirect -- Bookmarks + ### Changed - changed the way fading effects for user profile/long statuses works, now uses css-mask instead of gradient background hacks which weren't exactly compatible with semi-transparent themes + ### Fixed - improved hotkey behavior on autocomplete popup diff --git a/build/webpack.base.conf.js b/build/webpack.base.conf.js index ef40333c..d987eff1 100644 --- a/build/webpack.base.conf.js +++ b/build/webpack.base.conf.js @@ -3,7 +3,6 @@ var config = require('../config') var utils = require('./utils') var projectRoot = path.resolve(__dirname, '../') var ServiceWorkerWebpackPlugin = require('serviceworker-webpack-plugin') -var FontelloPlugin = require("fontello-webpack-plugin") var env = process.env.NODE_ENV // check env & config/index.js to decide weither to enable CSS Sourcemaps for the @@ -94,15 +93,6 @@ module.exports = { new ServiceWorkerWebpackPlugin({ entry: path.join(__dirname, '..', 'src/sw.js'), filename: 'sw-pleroma.js' - }), - new FontelloPlugin({ - config: require('../static/fontello.json'), - host: 'https://fontello.com', - name: 'fontello', - output: { - css: 'static/[name].' + now + '.css', // [hash] is not supported. Use the current timestamp instead for versioning. - font: 'static/font/[name].' + now + '.[ext]' - } }) ] } diff --git a/docs/CONFIGURATION.md b/docs/CONFIGURATION.md index 14b0428f..dfc5f9dc 100644 --- a/docs/CONFIGURATION.md +++ b/docs/CONFIGURATION.md @@ -1,13 +1,13 @@ # Pleroma-FE configuration and customization for instance administrators -* *For user configuration, see [Pleroma-FE user guide](USER_GUIDE.md)* +* *For user configuration, see [Pleroma-FE user guide](../user_guide)* * *For local development server configuration, see [Hacking, tweaking, contributing](HACKING.md)* ## Where configuration is stored PleromaFE gets its configuration from several sources, in order of preference (the one above overrides ones below it) -1. `/api/statusnet/config.json` - this is generated on Backend and contains multiple things including instance name, char limit etc. It also contains FE/Client-specific data, PleromaFE uses `pleromafe` field of it. For more info on changing config on BE, look [here](https://docs-develop.pleroma.social/config.html#frontend_configurations) +1. `/api/statusnet/config.json` - this is generated on Backend and contains multiple things including instance name, char limit etc. It also contains FE/Client-specific data, PleromaFE uses `pleromafe` field of it. For more info on changing config on BE, look [here](../backend/configuration/cheatsheet.md#frontend_configurations) 2. `/static/config.json` - this is a static FE-provided file, containing only FE specific configuration. This file is completely optional and could be removed but is useful as a fallback if some configuration JSON property isn't present in BE-provided config. It's also a reference point to check what default configuration are and what JSON properties even exist. In local dev mode it could be used to override BE configuration, more about that in HACKING.md. File is located [here](https://git.pleroma.social/pleroma/pleroma-fe/blob/develop/static/config.json). 3. Built-in defaults. Those are hard-coded defaults that are used when `/static/config.json` is not available and BE-provided configuration JSON is missing some JSON properties. ( [Code](https://git.pleroma.social/pleroma/pleroma-fe/blob/develop/src/modules/instance.js) ) diff --git a/docs/HACKING.md b/docs/HACKING.md index 783ff9e3..7f2964b4 100644 --- a/docs/HACKING.md +++ b/docs/HACKING.md @@ -25,7 +25,7 @@ This could be a bit trickier, you basically need steps 1-4 from *develop build* ### Replacing your instance's frontend with custom FE build -This is the most easiest way to use and test FE build: you just need to copy or symlink contents of `dist` folder into backend's [static directory](https://docs.pleroma.social/static_dir.html), by default it is located in `instance/static`, or in `/var/lib/pleroma/static` for OTP release installations, create it if it doesn't exist already. Be aware that running `yarn build` wipes the contents of `dist` folder. +This is the most easiest way to use and test FE build: you just need to copy or symlink contents of `dist` folder into backend's [static directory](../backend/configuration/static_dir.md), by default it is located in `instance/static`, or in `/var/lib/pleroma/static` for OTP release installations, create it if it doesn't exist already. Be aware that running `yarn build` wipes the contents of `dist` folder. ### Running production build locally or on a separate server @@ -67,9 +67,9 @@ server { ### API, Data, Operations -In 99% cases PleromaFE uses [MastoAPI](https://docs.joinmastodon.org/api/) with [Pleroma Extensions](https://docs-develop.pleroma.social/differences_in_mastoapi_responses.html) to fetch the data. The rest is either QvitterAPI leftovers or pleroma-exclusive APIs. QvitterAPI doesn't exactly have documentation and uses different JSON structure and sometimes different parameters and workflows, [this](https://twitter-api.readthedocs.io/en/latest/index.html) could be a good reference though. Some pleroma-exclusive API may still be using QvitterAPI JSON structure. +In 99% cases PleromaFE uses [MastoAPI](https://docs.joinmastodon.org/api/) with [Pleroma Extensions](../backend/API/differences_in_mastoapi_responses.md) to fetch the data. The rest is either QvitterAPI leftovers or pleroma-exclusive APIs. QvitterAPI doesn't exactly have documentation and uses different JSON structure and sometimes different parameters and workflows, [this](https://twitter-api.readthedocs.io/en/latest/index.html) could be a good reference though. Some pleroma-exclusive API may still be using QvitterAPI JSON structure. -PleromaFE supports both formats by transforming them into internal format which is basically QvitterAPI one with some additions and renaming. All data is passed trough [Entity Normalizer](/src/services/entity_normalizer/entity_normalizer.service.js) which can serve as a reference of API and what's actually used, it's also a host for all the hacks and data transformation. +PleromaFE supports both formats by transforming them into internal format which is basically QvitterAPI one with some additions and renaming. All data is passed trough [Entity Normalizer](https://git.pleroma.social/pleroma/pleroma-fe/-/blob/develop/src/services/entity_normalizer/entity_normalizer.service.js) which can serve as a reference of API and what's actually used, it's also a host for all the hacks and data transformation. For most part, PleromaFE tries to store all the info it can get in global vuex store - every user and post are passed trough updating mechanism where data is either added or merged with existing data, reactively updating the information throughout UI, so if in newest request user's post counter increased, it will be instantly updated in open user profile cards. This is also used to find users, posts and sometimes to build timelines and/or request parameters. diff --git a/docs/USER_GUIDE.md b/docs/USER_GUIDE.md deleted file mode 100644 index 241ad331..00000000 --- a/docs/USER_GUIDE.md +++ /dev/null @@ -1,207 +0,0 @@ -# Pleroma-FE user guide - -> Be prepared for breaking changes, unexpected behavior and this user guide becoming obsolete and wrong. - -> If there was no insanity -> -> it would be necessary to create it. -> -> --Catbag - -## Posting, reading, basic functions. - -After registering and logging in you're presented with your timeline in right column and new post form with timeline list and notifications in the left column. - -Posts will contain the text you are posting, but some content will be modified: - -1. Mentions: Mentions have the form of @user or @user<span></span>@instance.tld. These will become links to the user's profile. In addition, the mentioned user will always get a notification about the post they have been mentioned in, so only mention users that you want to receive this message. -2. URLs: URLs like `http://example.com` will be automatically be turned into a clickable links. -3. Hashtags: Hashtags like #cofe will also be turned into links. - -**Depending on your instance some of the options might not be available or have different defaults** - -Let's clear up some basic stuff. When you post something it's called a **post** or it could be called a **status** or even a **toot** or a **prööt** depending on whom you ask. Post has body/content but it also has some other stuff in it - from attachments, visibility scope, subject line. -* **Emoji** are small images embedded in text, there are two major types of emoji: [unicode emoji](https://en.wikipedia.org/wiki/Emoji) and custom emoji. While unicode emoji are universal and standardized, they can appear differently depending on where you are using them or may not appear at all on older systems. Custom emoji are more *fun* kind - instance administrator can define many images as *custom emoji* for their users. This works very simple - custom emoji is defined by its *shortcode* and an image, so that any shortcode enclosed in colons get replaced with image if such shortcode exist. -Let's say there's `:pleroma:` emoji defined on instance. That means -> First time using :pleroma: pleroma! - -will become -> First time using  pleroma! - -Note that you can only use emoji defined on your instance, you cannot "copy" someone else's emoji, and will have to ask your administrator to copy emoji from other instance to yours. -Lastly, there's two convenience options for emoji: an emoji picker (smiley face to the right of "submit" button) and autocomplete suggestions - when you start typing :shortcode: it will automatically try to suggest you emoj and complete the shortcode for you if you select one. **Note** that if emoji doesn't show up in suggestions nor in emoji picker it means there's no such emoji on your instance, if shortcode doesn't match any defined emoji it will appear as text. -* **Attachments** are fairly simple - you can attach any file to a post as long as the file is within maximum size limits. If you're uploading explicit material you can mark all of your attachments as sensitive (or add `#nsfw` tag) - it will hide the images and videos behind a warning so that it won't be displayed instantly. -* **Subject line** also known as **CW** (Content Warning) could be used as a header to the post and/or to warn others about contents of the post having something that might upset somebody or something among those lines. Several applications allow to hide post content leaving only subject line visible. Using a subject line will not mark your images as sensitive, you will have to do that explicitly (see above). -* **Visiblity scope** controls who will be able to see your posts. There are four scopes available: - -1. `Public`: This is the default, and some fediverse software like GNU Social only supports this. This means that your post is accessible by anyone and will be shown in the public timelines. -2. `Unlisted`: This is the same as public, but your post won't appear in the public timelines. The post will still be accessible by anyone who comes across it (for example, by looking at your profile) or by direct linking. They will also appear in public searches. -3. `Followers only`: This will show your post only to your followers. Only they will be able to interact with it. Be careful: When somebody follows you, they will be able to see all your previous `followers only` posts as well! If you want to restrict who can follow you, consider [locking your account down to only approved followers](#profle). -4. `Direct`: This will only send the message to the people explicitly mentioned in the post. - -A few things to consider about the security and usage of these scopes: - -- None of these options will change the fact that the messages are all saved in the database unencrypted. They will be visible to your server admin and to any other admin of a server who receives this post. Do not share information that you would consider secret or dangerous. Use encrypted messaging systems for these things. -- Follower-only posts can lead to fragmented conversations. If you post a follower-only post and somebody else replies to it with a follower-only post, only people following both of you will see the whole conversation thread. Everybody else will only see half of it. Keep this in mind and keep conversations public if possible. -- Changing scopes during a thread or adding people to a direct message will not retroactively make them see the whole conversation. If you add someone to a direct message conversation, they will not see the post that happened before they were mentioned. -* **Reply-to** if you are replying to someone, your post will also contain a note that your post is referring to the post you're replying to. Person you're replying to will receive a notification *even* if you remove them from mentioned people. You won't receive notifications when replying to your own posts, but it's useful to reply to your own posts to provide people some context if it's a follow-up to a previous post. There's a small "Reply to ..." label under post author's name which you can hover on to see what post it's referring to. - -Sometimes you may encounter posts that seem different than what they are supposed to. For example, you might see a direct message without any mentions in the text. This can happen because internally, the Fediverse has a different addressing mechanism similar to email, with `to` and `cc` fields. While these are not directly accessible in PleromaFE, other software in the Fediverse might generate those posts. Do not worry in these cases, these are normal and not a bug. - -#### Rich text - -By default new posts you make are plaintext, meaning you can't make text **bold** or add custom links or make lists or anything like that. However if your instance allows it you can use Markdown or BBCode or HTML to spice up your text, however there are certain limitations to what HTML tags and what features of Markdown you can use. - -this section will be expanded later - -### Other actions - -In addition to posting you can also *favorite* post also known as *liking* them and *repeat* posts (also known as *retweeting*, *boosting* and even *reprööting*). Favoriting a post increments a counter on it, notifies post author of your affection towards that post and also adds that post to your "favorited" posts list (in your own profile, "Favorites" tab). Reprööting a post does all that and also repeats this post to your followers and your profile page with a note "*user* repeated post". - -Your own posts can be deleted, but this will only reliably delete the post from your own instance. Other instances will receive a deletion notice, but there's no way to force them to actually delete a post. In addition, not all instances that contain the message might even receive the deletion notice, because they might be offline or not known to have the post because they received it through a repeat. Lastly, deletion notice might not reach certain frontends and clients - post will be visible for them until page refresh or cache clear, they probably won't be able to interact with it apart from replying to it (which will have reply-to mark missing). - -If you are a moderator, you can also delete posts by other people. If those people are on your instance, it will delete the post and send out the deletion notice to other servers. If they are not on your instance, it will just remove the post from your local instance. - -There's also an option to report a user via a post (if the feature is available on your instance) which could be used to notify your (and probably other instance's) admin that someone is being naughty. - -## Users - -When you see someone, you can click on their user picture to view their profile, and click on the userpic in that to see *full* profile. You can *follow* them, *mute* and *block* them. Following is self-explanatory, it adds them t your Home Timeline, lists you as a follower and gives you access to follower-only posts if they have any. Muting makes posts and notifications made by them very tiny, giving you an option to see the post if you're curious. However on clients other than PleromaFE their posts will be completely removed. *Blocking* a user removes them from your timeline and notifications and prevents them from following you (automatically unfollows them from you). - -Please note that some users can be "locked", meaning instead of following them you send a follow request they need to approve for you to become their follower. - -## Timelines - -Currently you have several timelines to browse trough: -* **Timeline** aka Home Timeline - this timeline contains all posts by people you follow and your own posts, as well as posts mentioning you directly. -* **Interactions** all interactions you've had with people on the network, basically same as notifications except grouped in convenient way - mentions separate from favorites with repeats separate from follows -* **Direct Messages** all posts with `direct` scope addressed to you or mentioning you. -* **Public Timelines** all posts made by users on instance you're on -* **The Whole Known Network** also known as **TWKN** or **Federated Timeline** - all posts on the network by everyone, almost. Due to nature of the network your instance may not know *all** the instances on the network, so only posts originating from known instances are shown there. - -## Your profile - -By clicking wrench icon above the post form you can access the profile edit or "user settings" screen. - -### Profle - -Here you can set up how you appear to other users among with some other settings: - -- Name: this is text that displays next to your avatar in posts. Please note that you **cannot** change your *@<span></span>handle* -- Bio: this will be displayed under your profile - you can put anything you want there you want for everyone to see. -- Restrict your account to approved followers only: this makes your account "locked", when people follow you - you have to approve or deny their follow requests, this gives more control over who sees your followers only posts. -- Default visibility scope: this chooses your default post scope for new posts -- Strip rich text from all posts: this strips rich text formatting (bold/italics/lists etc) from all incoming posts. Will only affect newly fetched posts. - -If you're admin or moderator on your instance you also get "Show [role] badge in my profile" - this controls whether to show "Admin" or "Moderator** label on your profile page. - -**For all options mentioned above you have to click "Submit" button for changes to take place** - -- Avatar: this changes picture next to your posts. Your avatar shouldn't exceed 2 MiB (2097152 bytes) or it could cause problems with certain instances. -- Banner: this changes background on your profile card. Same as avatar it shouldn't exceed 2 MiB limit. -- Profile Background: this changes background picture for UI. It isn't shown to anyone else **yet**, but some time later it will be shown when viewing your profile. - -### Security - -Here you can change your password, revoke access tokens, configure 2-factor authentication (if available). - -### Notifications - -This screen allows more fine-grained control over what notifications to show to you based on whom it comes from - -### Data Import/Export - -This allows you to export and import a list of people you follow, in case instance's database gets reverted or if you want to move to another server. Note that you **CANNOT export/import list of people who *follow you***, they'll just need to follow you back after you move. - -### Blocks and Mutes - -These screens give access to full list of people you block/mute, useful for *un*blocking/*un*muting people because blocking/muting them most likely removes them out of your sight completely. - -## Other stuff - -By default you can see **ALL** posts made by other users on your Home Timeline, this contrast behavior of Twitter and Mastodon, which shows you only non-reply posts and replies to people you follow. You can set it up to replicate the said behavior, however the option is currently broken. - -You can view other people's profiles and search for users (top-right corner, person with a plus icon). Tag search is possible but not implemented properly yet, right now you can click on tag link in a post to see posts tagged with that post. - -You can also view posts you've favorited on your own profile, but you cannot see favorites by other people. - -Due to nature of how Pleroma (backend) operates you might see old posts appear as if they are new, this is because instance just learned about that post (i.e. your instance is younger that some other ones) and someone interacted with old post. Posts are sorted by date of when they are received, not date they have been posted because it's very easy to spoof the date, so a post claiming it "was" made in year 2077 could hand at top of your TL forever. - -# Customization and configuration - -Clicking on the cog icon in the upper right will go to the settings screen. - -## General - -### Interface - -- Language: Here you can set the interface language. The default language is the one that you set in your browser settings. -- Hide instance-specific panel: This hides the panel in the lower left that usually contains general information about the server. - -### Timeline - -- Hide posts of muted users: If this is set, 'muting' a user will completely hide their posts instead of collapsing them. -- Collapse posts with subjects: This will collapse posts that contain a subject, hiding their content. Subjects are also sometimes called content warnings. -- Enable automatic streaming of new posts when scrolled to the top: With this enabled, new posts will automatically stream in when you are scrolled to the top. Otherwise, you will see a button on the timeline that will let you display the new posts. -- Pause streaming when tab is not focused: This pauses the automatic streaming that the previous option enables when the tab is out of focus. This is useful if you don't want to miss any new posts. -- Enable automatic loading when scrolled to the bottom: When this is disabled, a button will be shown on the bottom of the timeline that will let you load older posts. -- Enable reply-link preview on hover: Status posts in the timeline and notifications contain links to replies and to the post they are a reply to. If this setting is enabled, hovering over that link will display that linked post in a small hovering overlay. - -### Composing - -- Copy scope when replying: When this is activated, the scope of a reply will be the same as the scope of the post it is replying to. This is useful to prevent accidentally moving private discussions to public, or vice versa. -- Always show subject field: Whether or not to display the 'subject' input field in the post form. If you do not want to use subjects, you can deactivate this. -- Copy subject when replying: This controls if the subject of a post will be copied from the post it is replying to. -- Post status content type: Selects the default content type of your post. The options are: Plain text, HTML, BBCode and Markdown. -- Minimize scope selection options: Selecting this will reduce the visibility scopes to 'direct', your default post scope and post scope of post you're replying to. -- Automatically hide New Post button: Mobile interface only: hide floating "New post" button when scrolling - -### Attachments - -- Hide attachments in timeline: Do not display attachments in timelines. They will still display in expanded conversations. This is useful to save bandwidth and for browsing in public. -- Hide attachments in conversations: Also hide attachments in expanded conversations. -- Maximum amount of thumbnails per post: Exactly that :) -- Enable clickthrough NSFW attachment hiding: Hide attachments that are marked as NSFW/sensitive behind a click-through image.` -- Preload images: This will preload the hidden images so that they display faster when clicking through. -- Open NSFW attachments with just one click: Directly open NSFW attachments in a maximised state instead of revealing the image thumbnail. -- Play-on-hover GIFs: With this activated, GIFs images and avatars will only be animated on mouse hover. Otherwise, they will be always animated. This is very useful if your timeline looks too flashy from people's animated avatars and eases the CPU load. -- Loop videos: Whether to loop videos indefinitely. -- Loop only videos without sound: Some instances will use videos without sounds instead of GIFs. This will make only those videos autoplay. -- Play videos directly in the media viewer: Play videos right in the timeline instead of opening it in a modal -- Don't crop the attachment in thumbnails: if enabled, images in attachments will be fit entirely inside the container instead of being zoomed in and cropped. - -### Notifications - -- Enable web push notifications: this enables Web Push notifications, to allow receiving notifications even when the page isn't opened, doesn't affect regular notifications. - -## Theme - -You can change the look and feel of Pleroma Frontend here. You can choose from several instance-provided presets and you can load one from file and save current theme to file. Before you apply new theme you can see what it will look like approximately in preview section. - -Themes engine was made to be easy to use while giving an option for powerful in-depth customization - you can just tweak colors on "Common" tab and leave everything else as is. - -If there's a little check box next to a color picker it means that color is optional and unless checked will be automatically picked based on some other color or defaults. - -For some features you can also adjust transparency of it by changing its opacity, you just need to tick checkbox next to it, otherwise it will be using default opacity. - -Contrast information is also provided - you can see how readable text is based on contrast between text color and background, icons under color pickers represent contrast rating based on [WCAG](https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast) - thumbs up means AAA rating (good), half-filled circle means AA rating (acceptable) and warning icon means it doesn't pass the minimal contrast requirement and probably will be less readable, especially for vision-challenged people, you can hover over icon to see more detailed information. *Please note* that if background is not opaque (opacity != 1) contrast will be measured based on "worst case scenario", i.e. behind semi-transparent background lies some solid color that makes text harder to read, this however is still inaccurate because it doesn't account that background can be noisy/busy, making text even harder to read. - -Apart from colors you can also tweak shadow and lighting, which is used mostly to give buttons proper relief based on their state, give panes their shade, make things glow etc. It's quite powerful, and basically provides somewhat convenient interface for [CSS Shadows](https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow). - -Another thing you can tweak is theme's roundness - some people like sharp edges, some want things more rounded. This is also used if you want circled or square avatars. - -Lastly, you can redefine fonts used in UI without changing fonts in your browser or system, this however requires you to enter font's full name and having that font installed on your system. - -## Filtering - -- Types of notifications to show: This controls what kind of notifications will appear in notification column and which notifications to get in your system outside the web page -- Replies in timeline: You may know that other social networks like Twitter will often not display replies to other people in your timeline, even if you are following the poster. Pleroma usually will show these posts to you to encourage conversation. If you do not like this behavior, you can change it here. -- Hide post statistics: This hides the number of favorites, number of replies, etc. -- Hide user statistics: This hides the number of followers, friends, etc. -- Muted words: A list of words that will be muted (i.e. displayed in a collapsed state) on the timeline and in notifications. An easy way to tune down noise in your timeline. Posts can always be expanded when you actually want to see them. -- Hide filtered statuses: Selecting this will hide the filtered / muted posts completely instead of collapsing them. - - -## Version - -Just displays the backend and frontend version. Useful to mention in bug reports. diff --git a/docs/example_emoji.png b/docs/assets/example_emoji.png Binary files differindex 0a22a256..0a22a256 100644 --- a/docs/example_emoji.png +++ b/docs/assets/example_emoji.png diff --git a/docs/assets/example_markdown.png b/docs/assets/example_markdown.png Binary files differnew file mode 100644 index 00000000..3b9df753 --- /dev/null +++ b/docs/assets/example_markdown.png diff --git a/docs/index.md b/docs/index.md index 8764f9ab..d446fb29 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,4 +5,4 @@ Pleroma-FE is the default user-facing frontend for Pleroma. It's user interface ## How can I use it? -If your instance uses Pleroma-FE, you can acces it by going to your instance (e.g. <https://pleroma.soykaf.com>). You can read more about it's basic functionality in the [Pleroma-FE User Guide](./USER_GUIDE.md). We also have [a guide for administrators](./CONFIGURATION.md) and for [hackers/contributors](./HACKING.md). +If your instance uses Pleroma-FE, you can acces it by going to your instance (e.g. <https://pleroma.soykaf.com>). You can read more about it's basic functionality in the [Pleroma-FE User Guide](./user_guide/). We also have [a guide for administrators](./CONFIGURATION.md) and for [hackers/contributors](./HACKING.md). diff --git a/docs/user_guide/index.md b/docs/user_guide/index.md new file mode 100644 index 00000000..ce4f69c2 --- /dev/null +++ b/docs/user_guide/index.md @@ -0,0 +1,44 @@ +# General overview + +> Be prepared for breaking changes, unexpected behavior and this user guide becoming obsolete and wrong. + +> If there was no insanity +> +> it would be necessary to create it. +> +> --Catbag + +Pleroma-FE is the default user-facing frontend for Pleroma. If your instance uses Pleroma-FE, you can access it by going to your instance (e.g. <https://pleroma.soykaf.com>). After logging in you will have two columns in front of you. Here we're going to keep it to the default behaviour, but some instances swap the left and right columns. If you're on such an instance what we refer to as the left column will be on your right and vice versa. + +### Left column + +- first block: This section is dedicated to [posting](posting_reading_basic_functions.md) +- second block: Here you can switch between the different views for the right column. +- Optional third block: This is the Instance panel that can be activated, but is deactivated by default. It's fully customisable by instance admins and by default has links to the Pleroma-FE and Mastodon-FE. +- fourth block: This is the Notifications block, here you will get notified whenever somebody mentions you, follows you, repeats or favorites one of your statuses + +### Right column +This is where the interesting stuff happens! There are different views depending on what you choose in the second block of the left panel. + +- **Timelines** Depending on the [timeline](timelines.md) you will see different statuses, but each status has a standard structure: + - Profile pic, name and link to profile. An optional left-arrow if it's a reply to another status (hovering will reveal the reply-to status). Clicking on the profile pic will uncollapse the user's profile where you can find information about the account and can [follow, mute or block the account](users_follow_mute_block.md). + - An arrow icon on the right side allows you to open the status on the instance where it's originating from. + - A `+` button on the rightmost side allows you to Expand/Collapse an entire discussion thread. + - The text of the status, including mentions and attachments. If you click on a mention, it will automatically open the profile page of that person. + - Four buttons (left to right): Reply, Repeat, Favorite and Add Reaction. The three dots next to it are a dropdown menu for extra options including simple moderation, bookmarking, deleting posts, pinning your own posts to your profile and more. +- **Interactions** shows all interactions you've had with people on the network, basically same as notifications except grouped in convenient way. +- **Chats** is the chat feature. You can find your friends and start chatting with them. At the moment chat are only one-on-one, but once groups are introduced groupchats will also be possible. +- **About** is the about-page and lists the staff, the TOS, activated MRF's, and enabled features + +### Top right + +- The magnifier icon opens the search screen + - You can search for statuses, people and hashtags. + - You can import statuses from remote servers by pasting the url to the post in the search field. + - If you want to search for users that your instance doesn't know about yet, you can search for them using the full `name@instance.tld` handle. You can also use the full url from their remote profile. +- The gear icon gives you [settings](settings.md) +- If you have admin rights, you'll see an icon that opens the admin interface +- The last icon is to log out + +### Bottom right +On the bottom right you have the Shoutbox. Here you can communicate with people on the same instance in realtime. It is local-only, very basic and will most probably be removed once the Chats functionality allows group chats. diff --git a/docs/user_guide/posting_reading_basic_functions.md b/docs/user_guide/posting_reading_basic_functions.md new file mode 100644 index 00000000..a5ae5ac8 --- /dev/null +++ b/docs/user_guide/posting_reading_basic_functions.md @@ -0,0 +1,76 @@ +# Posting, reading, basic functions. + +!!! warning + Depending on your instance some of the options might not be available or have different defaults + +After registering and logging in you're presented with your timeline in right column and new post form with timeline list and notifications in the left column. + +Posts will contain the text you are posting, but some content will be modified: + +1. Mentions: Mentions have the form of @user or @user<span></span>@instance.tld. These will become links to the user's profile. In addition, the mentioned user will always get a notification about the post they have been mentioned in, so only mention users that you want to receive this message. +2. URLs: URLs like `http://example.com` will be automatically be turned into a clickable links. +3. Hashtags: Hashtags like #cofe will also be turned into links. +4. There is a default character limit of 5000 characters. + +Let's clear up some basic stuff. When you post something it's called a **post** or it could be called a **status** or even a **toot** or a **prööt** depending on whom you ask. Post has body/content but it also has some other stuff in it - from attachments, visibility scope, subject line... + +**Emoji** are small images embedded in text, there are two major types of emoji: [unicode emoji](https://en.wikipedia.org/wiki/Emoji) and custom emoji. While unicode emoji are universal and standardized, they can appear differently depending on where you are using them or may not appear at all on older systems. Custom emoji are a more *fun* kind - instance administrator can define many images as *custom emoji* for their users. This works very simple - custom emoji is defined by its *shortcode* and an image, so that any shortcode enclosed in colons get replaced with image if such shortcode exist. +Let's say there's a `:pleroma:` emoji defined on an instance. That means +> First time using :pleroma: pleroma! + +will become +> First time using  pleroma! + +Note that you can only use emoji defined on your instance, you cannot "copy" someone else's emoji, and will have to ask your administrator to copy emoji from other instance to yours. +Lastly, there's two convenience options for emoji: an emoji picker (smiley face to the right of "submit" button) and autocomplete suggestions - when you start typing :shortcode: it will automatically try to suggest you emoji and complete the shortcode for you if you select one. If emoji doesn't show up in suggestions nor in emoji picker it means there's no such emoji on your instance, if shortcode doesn't match any defined emoji it will appear as text. + +**Attachments** are fairly simple - you can attach any file to a post as long as the file is within maximum size limits. If you're uploading explicit material you can mark all of your attachments as sensitive (or add the `#nsfw` tag) - it will hide the images and videos behind a warning so that it won't be displayed instantly. + +**Subject line** also known as **CW** (Content Warning) could be used as a header to the post and/or to warn others about contents of the post having something that might upset somebody or something among those lines. Several applications allow to hide post content leaving only subject line visible. Using a subject line will not mark your images as sensitive, you will have to do that explicitly (see above). + +**Visiblity scope** controls who will be able to see your posts. There are four scopes available: + +1. `Public`: This is the default, and some fediverse software, like GNU Social, only supports this. This means that your post is accessible by anyone and will be shown in the public timelines. +2. `Unlisted`: This is the same as public, but your post won't appear in the public timelines. The post will still be accessible by anyone who comes across it (for example, by looking at your profile) or by direct linking. They will also appear in public searches. +3. `Followers only`: This will show your post only to your followers. Only they will be able to interact with it. Be careful: When somebody follows you, they will be able to see all your previous `followers only` posts as well! If you want to restrict who can follow you, consider [locking your account down to only approved followers](../settings#profile). +4. `Direct`: This will only send the message to the people explicitly mentioned in the post. + +A few things to consider about the security and usage of these scopes: + +- None of these options will change the fact that the messages are all saved in the database unencrypted. They will be visible to your server admin and to any other admin of a server who receives this post. Do not share information that you would consider secret or dangerous. Use encrypted messaging systems for these things. +- Follower-only posts can lead to fragmented conversations. If you post a follower-only post and somebody else replies to it with a follower-only post, only people following both of you will see the whole conversation thread. Everybody else will only see half of it. Keep this in mind and keep conversations public if possible. +- Changing scopes during a thread or adding people to a direct message will not retroactively make them see the whole conversation. If you add someone to a direct message conversation, they will not see the post that happened before they were mentioned. +* **Reply-to** if you are replying to someone, your post will also contain a note that your post is referring to the post you're replying to. Person you're replying to will receive a notification *even* if you remove them from mentioned people. You won't receive notifications when replying to your own posts, but it's useful to reply to your own posts to provide people some context if it's a follow-up to a previous post. There's a small "Reply to ..." label under post author's name which you can hover on to see what post it's referring to. + +Sometimes you may encounter posts that seem different than what they are supposed to. For example, you might see a direct message without any mentions in the text. This can happen because internally, the Fediverse has a different addressing mechanism similar to email, with `to` and `cc` fields. While these are not directly accessible in PleromaFE, other software in the Fediverse might generate those posts. Do not worry in these cases, these are normal and not a bug. + +## Rich text + +By default new posts you make are plaintext, meaning you can't make text **bold** or add custom links or make lists or anything like that. However if your instance allows it you can use Markdown or BBCode or HTML to spice up your text, however there are certain limitations to what HTML tags and what features of Markdown you can use. + +Here is a small example of some text in markdown. + +``` +This is an example of markdown text using **bold** and *cursive* text. +To get a newline we add two spaces at the end of the previous line. + +Let's also add a list + +* with +* some +* items +``` + +If you set the input-method to Markdown, and post this, it will look something like + + + +## Other actions + +In addition to posting you can also *favorite* posts also known as *liking* them and *repeat* posts (also known as *retweeting*, *boosting* and even *reprööting*). Favoriting a post increments a counter on it, notifies the post author of your affection towards that post and also adds that post to your "favorited" posts list (in your own profile, "Favorites" tab). Reprööting a post does all that and also repeats this post to your followers and your profile page with a note "*user* repeated post". + +Your own posts can be deleted, but this will only reliably delete the post from your own instance. Other instances will receive a deletion notice, but there's no way to force them to actually delete a post. In addition, not all instances that contain the message might even receive the deletion notice, because they might be offline or not known to have the post because they received it through a repeat. Lastly, deletion notice might not reach certain frontends and clients - post will be visible for them until page refresh or cache clear, they probably won't be able to interact with it apart from replying to it (which will have reply-to mark missing). + +If you are a moderator, you can also delete posts by other people. If those people are on your instance, it will delete the post and send out the deletion notice to other servers. If they are not on your instance, it will just remove the post from your local instance. + +There's also an option to report a user's post which can be used to notify your (and optionally the other instance's) admin that someone is being naughty. diff --git a/docs/user_guide/settings.md b/docs/user_guide/settings.md new file mode 100644 index 00000000..ef9306c5 --- /dev/null +++ b/docs/user_guide/settings.md @@ -0,0 +1,116 @@ +# Settings + +On the top-right you will see a gear icon. Click it to open the settings. + +## General + +### Interface + +- **Interface language** is where you can set the interface language. The default language is the one that you set in your browser settings. +- **Hide instance-specific panel** hides the panel in the lower left that usually contains general information about the server. This will only be visible if your admin has activated this panel and is deactivated by default. + +### Timeline + +- **Hide posts of muted users** If this is set, 'muting' a user will completely hide their posts instead of collapsing them. +- **Collapse posts with subjects** This will collapse posts that contain a subject, hiding their content. Subjects are also sometimes called content warnings. +- **Enable automatic streaming of new posts when scrolled to the top** With this enabled, new posts will automatically stream in when you are scrolled to the top. Otherwise, you will see a button on the timeline that will let you display the new posts. +- **Pause streaming when tab is not focused** This pauses the automatic streaming that the previous option enables when the tab is out of focus. This is useful if you don't want to miss any new posts. +- **Enable automatic loading when scrolled to the bottom** When this is disabled, a button will be shown on the bottom of the timeline that will let you load older posts. +- **Enable reply-link preview on hover** Status posts in the timeline and notifications contain links to replies and to the post they are a reply to. If this setting is enabled, hovering over that link will display that linked post in a small hovering overlay. + +### Composing + +- **Copy scope when replying** makes the scope of a reply be the same as the scope of the post it is replying to. This is useful to prevent accidentally moving private discussions to public, or vice versa. +- **Always show subject field** Whether or not to display the 'subject' input field in the post form. If you do not want to use subjects, you can deactivate this. +- **Copy subject when replying** controls if the subject of a post will be copied from the post it is replying to. +- **Post status content type** selects the default content type of your post. The options are: Plain text, HTML, BBCode and Markdown. +- **Minimize scope selection options** will reduce the visibility scopes to 'direct', your default post scope and post scope of post you're replying to. +- **Automatically hide New Post button** hides the floating "New post" button when scrolling on mobile view. +- **Pad emoji with spaces when adding from picker** Will add spaces around emoji you select it from the picker. + +### Attachments + +- **Hide attachments in timeline** Do not display attachments in timelines. They will still display in expanded conversations. This is useful to save bandwidth and for browsing in public. +- **Hide attachments in conversations** Also hide attachments in expanded conversations. +- **Maximum amount of thumbnails per post** Exactly that :) +- **Enable clickthrough NSFW attachment hiding** Hide attachments that are marked as NSFW/sensitive behind a click-through image.` + - **Preload images** This will preload the hidden images so that they display faster when clicking through. + - **Open NSFW attachments with just one click** Directly open NSFW attachments in a maximised state instead of revealing the image thumbnail. +- **Play-on-hover GIFs** With this activated, GIFs images and avatars will only be animated on mouse hover. Otherwise, they will be always animated. This is very useful if your timeline looks too flashy from people's animated avatars and eases the CPU load. +- **Loop videos** Whether to loop videos indefinitely. + - **Loop only videos without sound** Some instances will use videos without sounds instead of GIFs. This will make only those videos autoplay. +- **Play videos directly in the media viewer** Play videos right in the timeline instead of opening it in a modal +- **Don't crop the attachment in thumbnails** if enabled, images in attachments will be fit entirely inside the container instead of being zoomed in and cropped. + +### Notifications + +- **Enable web push notifications** this enables Web Push notifications, to allow receiving notifications even when the page isn't opened, doesn't affect regular notifications. + +### Fun + +- **Meme arrows** will make `> greentext` be shown in green (using the "green" from the theme that is used). + +## Profile + +Here you can set up how you appear to other users among with some other settings: + +- **Name** is text that displays next to your avatar in posts. Please note that you **cannot** change your *@handle* +- **Bio** will be displayed under your profile - you can put anything you want there you want for everyone to see. +- **Restrict your account to approved followers only** makes your account "locked", when people follow you - you have to approve or deny their follow requests, this gives more control over who sees your followers only posts. +- **Default visibility scope** is your default post scope for new posts +- **Strip rich text from all posts** strips rich text formatting (bold/italics/lists etc) from all incoming posts. This will only affect newly fetched posts. + +If you're admin or moderator on your instance you also get **Show [role] badge in my profile** - this controls whether to show "Admin" or "Moderator** label on your profile page. + +**For all options mentioned above you have to click "Submit" button for changes to take place** + +- **Avatar** this changes picture next to your posts. Your avatar shouldn't exceed 2 MiB (2097152 bytes) or it could cause problems with certain instances. +- **Banner** this changes background on your profile card. Same as avatar it shouldn't exceed 2 MiB limit. +- **Profile Background** this changes background picture for UI. It isn't shown to anyone else *yet*, but some time later it will be shown when viewing your profisle. + +## Security + +Here you can change your password, revoke access tokens, configure 2-factor authentication (if available). + +## Filtering + +- **Types of notifications to show** This controls what kind of notifications will appear in notification column and which notifications to get in your system outside the web page +- **Replies in timeline** You may know that other social networks like Twitter will often not display replies to other people in your timeline, even if you are following the poster. Pleroma usually will show these posts to you to encourage conversation. If you do not like this behavior, you can change it here. +- **Hide post statistics** This hides the number of favorites, number of replies, etc. +- **Hide user statistics** This hides the number of followers, friends, etc. +- **Muted words** allows a list of words that will be muted (i.e. displayed in a collapsed state) on the timeline and in notifications. An easy way to tune down noise in your timeline. By default posts can be expanded if you want to see them. +- **Hide filtered statuses** will hide the filtered / muted posts completely instead of collapsing them. + +## Theme + +Here you can change the look and feel of Pleroma-FE. You can choose from several instance-provided presets and you can load one from file and save current theme to file. Before you apply new theme you can see what it will look like approximately in preview section. + +The themes engine was made to be easy to use while giving an option for powerful in-depth customization - you can just tweak colors on "Common" tab and leave everything else as is. + +If there's a little check box next to a color picker it means that color is optional and unless checked will be automatically picked based on some other color or defaults. + +For some features you can also adjust transparency of it by changing its opacity, you just need to tick checkbox next to it, otherwise it will be using default opacity. + +Contrast information is also provided - you can see how readable text is based on contrast between text color and background, icons under color pickers represent contrast rating based on [WCAG](https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast) - thumbs up means AAA rating (good), half-filled circle means AA rating (acceptable) and warning icon means it doesn't pass the minimal contrast requirement and probably will be less readable, especially for vision-challenged people, you can hover over icon to see more detailed information. *Please note* that if background is not opaque (opacity != 1) contrast will be measured based on "worst case scenario", i.e. behind semi-transparent background lies some solid color that makes text harder to read, this however is still inaccurate because it doesn't account that background can be noisy/busy, making text even harder to read. + +Apart from colors you can also tweak shadow and lighting, which is used mostly to give buttons proper relief based on their state, give panes their shade, make things glow etc. It's quite powerful, and basically provides somewhat convenient interface for [CSS Shadows](https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow). + +Another thing you can tweak is theme's roundness - some people like sharp edges, some want things more rounded. This is also used if you want circled or square avatars. + +Lastly, you can redefine fonts used in UI without changing fonts in your browser or system, this however requires you to enter font's full name and having that font installed on your system. + +## Notifications + +This screen allows more fine-grained control over what notifications to show to you based on whom it comes from. + +## Data Import/Export + +This allows you to export and import a list of people you follow and block, in case instance's database gets reverted or if you want to move to another server. Note that you **CANNOT export/import list of people who *follow you***, they'll need to follow you back themselves. + +## Mutes and Blocks + +These screens give access to full list of people you block/mute, useful for *un*blocking/*un*muting people because blocking/muting them most likely removes them out of your sight completely. + +## Version + +Just displays the backend and frontend version. Useful to mention in bug reports. diff --git a/docs/user_guide/timelines.md b/docs/user_guide/timelines.md new file mode 100644 index 00000000..d0ad95a1 --- /dev/null +++ b/docs/user_guide/timelines.md @@ -0,0 +1,13 @@ +# Timelines + +You have several timelines to browse trough + +- **Timeline** aka Home Timeline - this timeline contains all posts by people you follow and your own posts, as well as posts mentioning you directly. +- **Bookmarks** all the posts you've bookmarked. You can bookmark a post by clicking the three dots on the bottom right of the post and choose Bookmark. +- **Direct Messages** all posts with `direct` scope addressed to you or mentioning you. +- **Public Timelines** all public posts made by users on the instance you're on +- **The Whole Known Network** also known as **TWKN** or **Federated Timeline** - all public posts known by your instance. Due to nature of the network your instance may not know *all* the posts on the network, so only posts known by your instance are shown there. + +Note that by default you will see all posts made by other users on your Home Timeline, this contrast behavior of Twitter and Mastodon, which shows you only non-reply posts and replies to people you follow. You can change said behavior in the [settings](settings.md#filtering). + +By default instances will try to send activities (e.g. posts, favorites, etc.) up to 7 days or until the target server received them. For this reason posts that are up to 7 days old and your server didn't know about yet can pop up on your timeline. This is the default behaviour and can be changed by your admin. diff --git a/docs/user_guide/users_follow_mute_block.md b/docs/user_guide/users_follow_mute_block.md new file mode 100644 index 00000000..530b98a4 --- /dev/null +++ b/docs/user_guide/users_follow_mute_block.md @@ -0,0 +1,11 @@ +# Users: follow, mute, block + +When you see someone, you can click on their user picture to view their profile, and click on the userpic in that to see *full* profile. You can **follow** them, **mute** and **block** them. + +**Following** is self-explanatory, it adds them to your Home Timeline, lists you as a follower and gives you access to follower-only posts if they have any. + +**Muting** collapses posts and notifications made by them, giving you an option to see the post if you're curious. Clients other than PleromaFE may completely remove their posts. + +**Blocking** a user removes them from your timeline and notifications and prevents them from following you (automatically unfollows them from you). + +Please note that some users can be "locked", meaning instead of following them you send a follow request they need to approve for you to become their follower. @@ -3,7 +3,6 @@ <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no"> - <title>Pleroma</title> <!--server-generated-meta--> <link rel="icon" type="image/png" href="/favicon.png"> </head> diff --git a/package.json b/package.json index 75d9ee56..e11396bf 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,10 @@ "dependencies": { "@babel/runtime": "^7.7.6", "@chenfengyuan/vue-qrcode": "^1.0.0", + "@fortawesome/fontawesome-svg-core": "^1.2.32", + "@fortawesome/free-regular-svg-icons": "^5.15.1", + "@fortawesome/free-solid-svg-icons": "^5.15.1", + "@fortawesome/vue-fontawesome": "^2.0.0", "body-scroll-lock": "^2.6.4", "chromatism": "^3.0.0", "cropperjs": "^1.4.3", @@ -27,6 +31,7 @@ "parse-link-header": "^1.0.1", "phoenix": "^1.3.0", "portal-vue": "^2.1.4", + "punycode.js": "^2.1.0", "v-click-outside": "^2.1.1", "vue": "^2.6.11", "vue-chat-scroll": "^1.2.1", @@ -51,7 +56,7 @@ "babel-plugin-lodash": "^3.3.4", "chai": "^3.5.0", "chalk": "^1.1.3", - "chromedriver": "^2.21.2", + "chromedriver": "^87.0.1", "connect-history-api-fallback": "^1.1.0", "cross-spawn": "^4.0.2", "css-loader": "^0.28.0", @@ -68,7 +73,6 @@ "eventsource-polyfill": "^0.9.6", "express": "^4.13.3", "file-loader": "^3.0.1", - "fontello-webpack-plugin": "https://github.com/w3geo/fontello-webpack-plugin.git#6149eac8f2672ab6da089e8802fbfcac98487186", "function-bind": "^1.0.2", "html-webpack-plugin": "^3.0.0", "http-proxy-middleware": "^0.17.2", @@ -1,7 +1,6 @@ import UserPanel from './components/user_panel/user_panel.vue' import NavPanel from './components/nav_panel/nav_panel.vue' import Notifications from './components/notifications/notifications.vue' -import SearchBar from './components/search_bar/search_bar.vue' import InstanceSpecificPanel from './components/instance_specific_panel/instance_specific_panel.vue' import FeaturesPanel from './components/features_panel/features_panel.vue' import WhoToFollowPanel from './components/who_to_follow_panel/who_to_follow_panel.vue' @@ -11,10 +10,12 @@ import MediaModal from './components/media_modal/media_modal.vue' import SideDrawer from './components/side_drawer/side_drawer.vue' import MobilePostStatusButton from './components/mobile_post_status_button/mobile_post_status_button.vue' import MobileNav from './components/mobile_nav/mobile_nav.vue' +import DesktopNav from './components/desktop_nav/desktop_nav.vue' import UserReportingModal from './components/user_reporting_modal/user_reporting_modal.vue' import PostStatusModal from './components/post_status_modal/post_status_modal.vue' import GlobalNoticeList from './components/global_notice_list/global_notice_list.vue' import { windowWidth, windowHeight } from './services/window_utils/window_utils' +import { mapGetters } from 'vuex' export default { name: 'app', @@ -22,7 +23,6 @@ export default { UserPanel, NavPanel, Notifications, - SearchBar, InstanceSpecificPanel, FeaturesPanel, WhoToFollowPanel, @@ -31,21 +31,14 @@ export default { SideDrawer, MobilePostStatusButton, MobileNav, + DesktopNav, SettingsModal, UserReportingModal, PostStatusModal, GlobalNoticeList }, data: () => ({ - mobileActivePanel: 'timeline', - searchBarHidden: true, - supportsMask: window.CSS && window.CSS.supports && ( - window.CSS.supports('mask-size', 'contain') || - window.CSS.supports('-webkit-mask-size', 'contain') || - window.CSS.supports('-moz-mask-size', 'contain') || - window.CSS.supports('-ms-mask-size', 'contain') || - window.CSS.supports('-o-mask-size', 'contain') - ) + mobileActivePanel: 'timeline' }), created () { // Load the locale from the storage @@ -58,44 +51,21 @@ export default { }, computed: { currentUser () { return this.$store.state.users.currentUser }, - background () { - return this.currentUser.background_image || this.$store.state.instance.background + userBackground () { return this.currentUser.background_image }, + instanceBackground () { + return this.mergedConfig.hideInstanceWallpaper + ? null + : this.$store.state.instance.background }, - enableMask () { return this.supportsMask && this.$store.state.instance.logoMask }, - logoStyle () { - return { - 'visibility': this.enableMask ? 'hidden' : 'visible' - } - }, - logoMaskStyle () { - return this.enableMask ? { - 'mask-image': `url(${this.$store.state.instance.logo})` - } : { - 'background-color': this.enableMask ? '' : 'transparent' - } - }, - logoBgStyle () { - return Object.assign({ - 'margin': `${this.$store.state.instance.logoMargin} 0`, - opacity: this.searchBarHidden ? 1 : 0 - }, this.enableMask ? {} : { - 'background-color': this.enableMask ? '' : 'transparent' - }) - }, - logo () { return this.$store.state.instance.logo }, + background () { return this.userBackground || this.instanceBackground }, bgStyle () { - return { - 'background-image': `url(${this.background})` - } - }, - bgAppStyle () { - return { - '--body-background-image': `url(${this.background})` + if (this.background) { + return { + '--body-background-image': `url(${this.background})` + } } }, - sitename () { return this.$store.state.instance.name }, chat () { return this.$store.state.chat.channel.state === 'joined' }, - hideSitename () { return this.$store.state.instance.hideSitename }, suggestionsEnabled () { return this.$store.state.instance.suggestionsEnabled }, showInstanceSpecificPanel () { return this.$store.state.instance.showInstanceSpecificPanel && @@ -109,22 +79,10 @@ export default { return { 'order': this.$store.state.instance.sidebarRight ? 99 : 0 } - } + }, + ...mapGetters(['mergedConfig']) }, methods: { - scrollToTop () { - window.scrollTo(0, 0) - }, - logout () { - this.$router.replace('/main/public') - this.$store.dispatch('logout') - }, - onSearchBarToggled (hidden) { - this.searchBarHidden = hidden - }, - openSettingsModal () { - this.$store.dispatch('openSettingsModal') - }, updateMobileState () { const mobileLayout = windowWidth() <= 800 const layoutHeight = windowHeight() diff --git a/src/App.scss b/src/App.scss index e1e1bdd0..8b91f3de 100644 --- a/src/App.scss +++ b/src/App.scss @@ -14,7 +14,9 @@ right: -20px; background-size: cover; background-repeat: no-repeat; - background-position: 0 50%; + background-color: var(--wallpaper); + background-image: var(--body-background-image); + background-position: 50% 50px; } i[class^='icon-'] { @@ -33,6 +35,7 @@ h4 { max-width: 980px; align-content: flex-start; } + .underlay { background-color: rgba(0,0,0,0.15); background-color: var(--underlay, rgba(0,0,0,0.15)); @@ -69,7 +72,7 @@ a { color: var(--link, $fallback--link); } -button { +.button-default { user-select: none; color: $fallback--text; color: var(--btnText, $fallback--text); @@ -85,7 +88,8 @@ button { font-family: sans-serif; font-family: var(--interfaceFont, sans-serif); - i[class*=icon-] { + i[class*=icon-], + .svg-inline--fa { color: $fallback--text; color: var(--btnText, $fallback--text); } @@ -106,6 +110,8 @@ button { color: var(--btnPressedText, $fallback--text); background-color: $fallback--fg; background-color: var(--btnPressed, $fallback--fg); + + svg, i { color: $fallback--text; color: var(--btnPressedText, $fallback--text); @@ -118,6 +124,8 @@ button { color: var(--btnDisabledText, $fallback--text); background-color: $fallback--fg; background-color: var(--btnDisabled, $fallback--fg); + + svg, i { color: $fallback--text; color: var(--btnDisabledText, $fallback--text); @@ -131,6 +139,8 @@ button { background-color: var(--btnToggled, $fallback--fg); box-shadow: 0px 0px 4px 0px rgba(255, 255, 255, 0.3), 0px 1px 0px 0px rgba(0, 0, 0, 0.2) inset, 0px -1px 0px 0px rgba(255, 255, 255, 0.2) inset; box-shadow: var(--buttonPressedShadow); + + svg, i { color: $fallback--text; color: var(--btnToggledText, $fallback--text); @@ -146,6 +156,37 @@ button { } } +.button-unstyled { + background: none; + border: none; + outline: none; + display: inline; + text-align: initial; + font-size: 100%; + font-family: inherit; + padding: 0; + line-height: unset; + cursor: pointer; + box-sizing: content-box; + color: inherit; + + &.-link { + color: $fallback--link; + color: var(--link, $fallback--link); + } + + &.-fullwidth { + width: 100%; + } + + &.-hover-highlight { + &:hover svg { + color: $fallback--lightText; + color: var(--lightText, $fallback--lightText); + } + } +} + input, textarea, .select, .input { &.unstyled { @@ -185,7 +226,7 @@ input, textarea, .select, .input { opacity: 0.5; } - .icon-down-open { + .select-down-icon { position: absolute; top: 0; bottom: 0; @@ -300,6 +341,10 @@ input, textarea, .select, .input { box-sizing: border-box; } } + + &.resize-height { + resize: vertical; + } } option { @@ -318,7 +363,7 @@ option { } } -i[class*=icon-] { +i[class*=icon-], .svg-inline--fa { color: $fallback--icon; color: var(--icon, $fallback--icon); } @@ -356,117 +401,10 @@ i[class*=icon-] { padding: 0 10px 0 10px; } -.item { - flex: 1; - line-height: 50px; - height: 50px; - overflow: hidden; - display: flex; - flex-wrap: wrap; - - .nav-icon { - margin-left: 0.4em; - } - - &.right { - justify-content: flex-end; - } -} - .auto-size { flex: 1 } -.nav-bar { - padding: 0; - width: 100%; - align-items: center; - position: fixed; - height: 50px; - box-sizing: border-box; - - button { - &, i[class*=icon-] { - color: $fallback--text; - color: var(--btnTopBarText, $fallback--text); - } - - &:active { - background-color: $fallback--fg; - background-color: var(--btnPressedTopBar, $fallback--fg); - color: $fallback--text; - color: var(--btnPressedTopBarText, $fallback--text); - } - - &:disabled { - color: $fallback--text; - color: var(--btnDisabledTopBarText, $fallback--text); - } - - &.toggled { - color: $fallback--text; - color: var(--btnToggledTopBarText, $fallback--text); - background-color: $fallback--fg; - background-color: var(--btnToggledTopBar, $fallback--fg) - } - } - - - .logo { - display: flex; - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - - align-items: stretch; - justify-content: center; - flex: 0 0 auto; - z-index: -1; - transition: opacity; - transition-timing-function: ease-out; - transition-duration: 100ms; - - .mask { - mask-repeat: no-repeat; - mask-position: center; - mask-size: contain; - background-color: $fallback--fg; - background-color: var(--topBarText, $fallback--fg); - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - } - - img { - height: 100%; - object-fit: contain; - display: block; - flex: 0; - } - } - - .inner-nav { - position: relative; - margin: auto; - box-sizing: border-box; - padding-left: 10px; - padding-right: 10px; - display: flex; - align-items: center; - flex-basis: 970px; - height: 50px; - - a, a i { - color: $fallback--link; - color: var(--topBarLink, $fallback--link); - } - } -} - main-router { flex: 1; } @@ -546,6 +484,7 @@ main-router { color: $fallback--faint; color: var(--panelFaint, $fallback--faint); } + .faint-link { color: $fallback--faint; color: var(--faintLink, $fallback--faint); @@ -557,11 +496,8 @@ main-router { overflow-x: hidden; } - button { - flex-shrink: 0; - } - - button, .alert { + .button-default, + .alert { // height: 100%; line-height: 21px; min-height: 0; @@ -572,8 +508,11 @@ main-router { align-self: stretch; } - button { - &, i[class*=icon-] { + .button-default { + flex-shrink: 0; + + &, + i[class*=icon-] { color: $fallback--text; color: var(--btnPanelText, $fallback--text); } @@ -596,7 +535,8 @@ main-router { } } - a { + a, + .-link { color: $fallback--link; color: var(--panelLink, $fallback--link) } @@ -611,15 +551,15 @@ main-router { border-radius: 0 0 $fallback--panelRadius $fallback--panelRadius; border-radius: 0 0 var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius); - .faint { color: $fallback--faint; color: var(--panelFaint, $fallback--faint); } - a { + a, + .-link { color: $fallback--link; - color: var(--panelLink, $fallback--link) + color: var(--panelLink, $fallback--link); } } @@ -707,19 +647,24 @@ nav { flex-grow: 0; } } + .badge { + box-sizing: border-box; display: inline-block; border-radius: 99px; - min-width: 22px; - max-width: 22px; - min-height: 22px; - max-height: 22px; - font-size: 15px; - line-height: 22px; - text-align: center; + max-width: 10em; + min-width: 1.7em; + height: 1.3em; + padding: 0.15em 0.15em; vertical-align: middle; + font-weight: normal; + font-style: normal; + font-size: 0.9em; + line-height: 1; + text-align: center; white-space: nowrap; - padding: 0; + overflow: hidden; + text-overflow: ellipsis; &.badge-notification { background-color: $fallback--cRed; @@ -776,16 +721,6 @@ nav { } } -@media all and (min-width: 800px) { - .logo { - opacity: 1 !important; - } -} - -.item.right { - text-align: right; -} - .visibility-notice { padding: .5em; border: 1px solid $fallback--faint; @@ -807,8 +742,16 @@ nav { } } -.button-icon { - font-size: 1.2em; +.fa-scale-110 { + &.svg-inline--fa { + font-size: 1.1em; + } +} + +.fa-old-padding { + &.svg-inline--fa { + padding: 0 0.3em; + } } @keyframes shakeError { @@ -898,7 +841,7 @@ nav { } } -.btn.btn-default { +.btn.button-default { min-height: 28px; } @@ -930,22 +873,6 @@ nav { background-color: var(--panel, $fallback--fg); } -.unread-chat-count { - font-size: 0.9em; - font-weight: bolder; - font-style: normal; - position: absolute; - right: 0.6rem; - padding: 0 0.3em; - min-width: 1.3rem; - min-height: 1.3rem; - max-height: 1.3rem; - line-height: 1.3rem; - max-width: 10em; - overflow: hidden; - text-overflow: ellipsis; -} - .chat-layout { // Needed for smoother chat navigation in the desktop Safari (otherwise the chat layout "jumps" as the chat opens). overflow: hidden; diff --git a/src/App.vue b/src/App.vue index 0276c6a6..1a166778 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,82 +1,14 @@ <template> <div id="app" - :style="bgAppStyle" + :style="bgStyle" > <div id="app_bg_wrapper" class="app-bg-wrapper" - :style="bgStyle" /> <MobileNav v-if="isMobileLayout" /> - <nav - v-else - id="nav" - class="nav-bar container" - @click="scrollToTop()" - > - <div class="inner-nav"> - <div - class="logo" - :style="logoBgStyle" - > - <div - class="mask" - :style="logoMaskStyle" - /> - <img - :src="logo" - :style="logoStyle" - > - </div> - <div class="item"> - <router-link - v-if="!hideSitename" - class="site-name" - :to="{ name: 'root' }" - active-class="home" - > - {{ sitename }} - </router-link> - </div> - <div class="item right"> - <search-bar - v-if="currentUser || !privateMode" - class="nav-icon mobile-hidden" - @toggled="onSearchBarToggled" - @click.stop.native - /> - <a - href="#" - class="mobile-hidden" - @click.stop="openSettingsModal" - > - <i - class="button-icon icon-cog nav-icon" - :title="$t('nav.preferences')" - /> - </a> - <a - v-if="currentUser && currentUser.role === 'admin'" - href="/pleroma/admin/#/login-pleroma" - class="mobile-hidden" - target="_blank" - ><i - class="button-icon icon-gauge nav-icon" - :title="$t('nav.administration')" - /></a> - <a - v-if="currentUser" - href="#" - class="mobile-hidden" - @click.prevent="logout" - ><i - class="button-icon icon-logout nav-icon" - :title="$t('login.logout')" - /></a> - </div> - </div> - </nav> + <DesktopNav v-else /> <div class="app-bg-wrapper app-container-wrapper" /> <div id="content" diff --git a/src/boot/after_store.js b/src/boot/after_store.js index 00ca74a2..b472fcf6 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -7,6 +7,7 @@ import { getOrCreateApp, getClientToken } from '../services/new_api/oauth.js' import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js' import { CURRENT_VERSION } from '../services/theme_data/theme_data.service.js' import { applyTheme } from '../services/style_setter/style_setter.js' +import FaviconService from '../services/favicon_service/favicon_service.js' let staticInitialResults = null @@ -130,6 +131,7 @@ const setSettings = async ({ apiConfig, staticConfig, store }) => { ? 0 : config.logoMargin }) + copyInstanceOption('logoLeft') store.commit('authFlow/setInitialStrategy', config.loginMethod) copyInstanceOption('redirectRootNoLogin') @@ -325,6 +327,8 @@ const afterStoreSetup = async ({ store, i18n }) => { const width = windowWidth() store.dispatch('setMobileLayout', width <= 800) + FaviconService.initFaviconService() + const overrides = window.___pleromafe_dev_overrides || {} const server = (typeof overrides.target !== 'undefined') ? overrides.target : window.location.origin store.dispatch('setInstanceOption', { name: 'server', value: server }) diff --git a/src/components/account_actions/account_actions.js b/src/components/account_actions/account_actions.js index 6d345bc7..e53c4f77 100644 --- a/src/components/account_actions/account_actions.js +++ b/src/components/account_actions/account_actions.js @@ -1,6 +1,14 @@ import { mapState } from 'vuex' import ProgressButton from '../progress_button/progress_button.vue' import Popover from '../popover/popover.vue' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faEllipsisV +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faEllipsisV +) const AccountActions = { props: [ @@ -27,7 +35,7 @@ const AccountActions = { this.$store.dispatch('unblockUser', this.user.id) }, reportUser () { - this.$store.dispatch('openUserReportingModal', this.user.id) + this.$store.dispatch('openUserReportingModal', { userId: this.user.id }) }, openChat () { this.$router.push({ diff --git a/src/components/account_actions/account_actions.vue b/src/components/account_actions/account_actions.vue index 987e94b7..ab5d1d29 100644 --- a/src/components/account_actions/account_actions.vue +++ b/src/components/account_actions/account_actions.vue @@ -1,9 +1,10 @@ <template> - <div class="account-actions"> + <div class="AccountActions"> <Popover trigger="click" placement="bottom" :bound-to="{ x: 'container' }" + remove-padding > <div slot="content" @@ -13,14 +14,14 @@ <template v-if="relationship.following"> <button v-if="relationship.showing_reblogs" - class="btn btn-default dropdown-item" + class="btn button-default dropdown-item" @click="hideRepeats" > {{ $t('user_card.hide_repeats') }} </button> <button v-if="!relationship.showing_reblogs" - class="btn btn-default dropdown-item" + class="btn button-default dropdown-item" @click="showRepeats" > {{ $t('user_card.show_repeats') }} @@ -32,27 +33,27 @@ </template> <button v-if="relationship.blocking" - class="btn btn-default btn-block dropdown-item" + class="btn button-default btn-block dropdown-item" @click="unblockUser" > {{ $t('user_card.unblock') }} </button> <button v-else - class="btn btn-default btn-block dropdown-item" + class="btn button-default btn-block dropdown-item" @click="blockUser" > {{ $t('user_card.block') }} </button> <button - class="btn btn-default btn-block dropdown-item" + class="btn button-default btn-block dropdown-item" @click="reportUser" > {{ $t('user_card.report') }} </button> <button v-if="pleromaChatMessagesAvailable" - class="btn btn-default btn-block dropdown-item" + class="btn button-default btn-block dropdown-item" @click="openChat" > {{ $t('user_card.message') }} @@ -61,9 +62,12 @@ </div> <div slot="trigger" - class="btn btn-default ellipsis-button" + class="ellipsis-button" > - <i class="icon-ellipsis trigger-button" /> + <FAIcon + class="icon" + icon="ellipsis-v" + /> </div> </Popover> </div> @@ -73,22 +77,22 @@ <style lang="scss"> @import '../../_variables.scss'; -.account-actions { - margin: 0 .8em; -} +.AccountActions { + button.dropdown-item { + margin-left: 0; + } -.account-actions button.dropdown-item { - margin-left: 0; -} + .ellipsis-button { + cursor: pointer; + width: 2.5em; + margin: -0.5em 0; + padding: 0.5em 0; + text-align: center; -.account-actions .trigger-button { - color: $fallback--lightText; - color: var(--lightText, $fallback--lightText); - opacity: .8; - cursor: pointer; - &:hover { - color: $fallback--text; - color: var(--text, $fallback--text); + &:not(:hover) .icon { + color: $fallback--lightText; + color: var(--lightText, $fallback--lightText); + } } } </style> diff --git a/src/components/async_component_error/async_component_error.vue b/src/components/async_component_error/async_component_error.vue index b68b98f9..b1b59638 100644 --- a/src/components/async_component_error/async_component_error.vue +++ b/src/components/async_component_error/async_component_error.vue @@ -8,7 +8,7 @@ {{ $t('general.error_retry') }} </p> <button - class="btn" + class="btn button-default" @click="retry" > {{ $t('general.retry') }} diff --git a/src/components/attachment/attachment.js b/src/components/attachment/attachment.js index cb31020d..5f5779a0 100644 --- a/src/components/attachment/attachment.js +++ b/src/components/attachment/attachment.js @@ -3,6 +3,24 @@ import VideoAttachment from '../video_attachment/video_attachment.vue' import nsfwImage from '../../assets/nsfw.png' import fileTypeService from '../../services/file_type/file_type.service.js' import { mapGetters } from 'vuex' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faFile, + faMusic, + faImage, + faVideo, + faPlayCircle, + faTimes +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faFile, + faMusic, + faImage, + faVideo, + faPlayCircle, + faTimes +) const Attachment = { props: [ @@ -39,10 +57,10 @@ const Attachment = { return this.attachment.description }, placeholderIconClass () { - if (this.type === 'image') return 'icon-picture' - if (this.type === 'video') return 'icon-video' - if (this.type === 'audio') return 'icon-music' - return 'icon-doc' + if (this.type === 'image') return 'image' + if (this.type === 'video') return 'video' + if (this.type === 'audio') return 'music' + return 'file' }, referrerpolicy () { return this.$store.state.instance.mediaProxyAvailable ? '' : 'no-referrer' diff --git a/src/components/attachment/attachment.vue b/src/components/attachment/attachment.vue index 19c713d5..2c1c1682 100644 --- a/src/components/attachment/attachment.vue +++ b/src/components/attachment/attachment.vue @@ -12,7 +12,7 @@ :alt="attachment.description" :title="attachment.description" > - <span :class="placeholderIconClass" /> + <FAIcon :icon="placeholderIconClass" /> <b>{{ nsfw ? "NSFW / " : "" }}</b>{{ placeholderName }} </a> </div> @@ -36,20 +36,19 @@ :src="nsfwImage" :class="{'small': isSmall}" > - <i + <FAIcon v-if="type === 'video'" - class="play-icon icon-play-circled" + class="play-icon" + icon="play-circle" /> </a> - <div + <button v-if="nsfw && hideNsfwLocal && !hidden" - class="hider" + class="button-unstyled hider" + @click.prevent="toggleHidden" > - <a - href="#" - @click.prevent="toggleHidden" - >Hide</a> - </div> + <FAIcon icon="times" /> + </button> <a v-if="type === 'image' && (!hidden || preloadImage)" @@ -83,9 +82,10 @@ @play="$emit('play')" @pause="$emit('pause')" /> - <i + <FAIcon v-if="!allowPlay" - class="play-icon icon-play-circled" + class="play-icon" + icon="play-circle" /> </a> @@ -142,6 +142,10 @@ white-space: nowrap; text-overflow: ellipsis; max-width: 100%; + + svg { + color: inherit; + } } .nsfw-placeholder { @@ -228,15 +232,23 @@ .hider { position: absolute; right: 0; - white-space: nowrap; margin: 10px; - padding: 5px; - background: rgba(230,230,230,0.6); - font-weight: bold; + padding: 0; z-index: 4; - line-height: 1; border-radius: $fallback--tooltipRadius; border-radius: var(--tooltipRadius, $fallback--tooltipRadius); + text-align: center; + width: 2em; + height: 2em; + font-size: 1.25em; + // TODO: theming? hard to theme with unknown background image color + background: rgba(230, 230, 230, 0.7); + .svg-inline--fa { + color: rgba(0, 0, 0, 0.6); + } + &:hover .svg-inline--fa { + color: rgba(0, 0, 0, 0.9); + } } video { diff --git a/src/components/block_card/block_card.vue b/src/components/block_card/block_card.vue index 5b00b738..2fe66d4c 100644 --- a/src/components/block_card/block_card.vue +++ b/src/components/block_card/block_card.vue @@ -3,7 +3,7 @@ <div class="block-card-content-container"> <button v-if="blocked" - class="btn btn-default" + class="btn button-default" :disabled="progress" @click="unblockUser" > @@ -16,7 +16,7 @@ </button> <button v-else - class="btn btn-default" + class="btn button-default" :disabled="progress" @click="blockUser" > diff --git a/src/components/chat/chat.js b/src/components/chat/chat.js index 34e723d0..e57fcb91 100644 --- a/src/components/chat/chat.js +++ b/src/components/chat/chat.js @@ -6,11 +6,24 @@ import PostStatusForm from '../post_status_form/post_status_form.vue' import ChatTitle from '../chat_title/chat_title.vue' import chatService from '../../services/chat_service/chat_service.js' import { promiseInterval } from '../../services/promise_interval/promise_interval.js' -import { getScrollPosition, getNewTopPosition, isBottomedOut, scrollableContainerHeight } from './chat_layout_utils.js' +import { getScrollPosition, getNewTopPosition, isBottomedOut, scrollableContainerHeight, isScrollable } from './chat_layout_utils.js' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faChevronDown, + faChevronLeft +} from '@fortawesome/free-solid-svg-icons' +import { buildFakeMessage } from '../../services/chat_utils/chat_utils.js' + +library.add( + faChevronDown, + faChevronLeft +) const BOTTOMED_OUT_OFFSET = 10 const JUMP_TO_BOTTOM_BUTTON_VISIBILITY_OFFSET = 150 const SAFE_RESIZE_TIME_OFFSET = 100 +const MARK_AS_READ_DELAY = 1500 +const MAX_RETRIES = 10 const Chat = { components: { @@ -24,7 +37,8 @@ const Chat = { hoveredMessageChainId: undefined, lastScrollPosition: {}, scrollableContainerHeight: '100%', - errorLoadingChat: false + errorLoadingChat: false, + messageRetriers: {} } }, created () { @@ -94,7 +108,7 @@ const Chat = { const bottomedOutBeforeUpdate = this.bottomedOut(BOTTOMED_OUT_OFFSET) this.$nextTick(() => { if (bottomedOutBeforeUpdate) { - this.scrollDown({ forceRead: !document.hidden }) + this.scrollDown() } }) }, @@ -200,7 +214,7 @@ const Chat = { this.$nextTick(() => { scrollable.scrollTo({ top: scrollable.scrollHeight, left: 0, behavior }) }) - if (forceRead || this.newMessageCount > 0) { + if (forceRead) { this.readChat() } }, @@ -208,7 +222,10 @@ const Chat = { if (!(this.currentChatMessageService && this.currentChatMessageService.maxId)) { return } if (document.hidden) { return } const lastReadId = this.currentChatMessageService.maxId - this.$store.dispatch('readChat', { id: this.currentChat.id, lastReadId }) + this.$store.dispatch('readChat', { + id: this.currentChat.id, + lastReadId + }) }, bottomedOut (offset) { return isBottomedOut(this.$refs.scrollable, offset) @@ -225,12 +242,18 @@ const Chat = { } else if (this.bottomedOut(JUMP_TO_BOTTOM_BUTTON_VISIBILITY_OFFSET)) { this.jumpToBottomButtonVisible = false if (this.newMessageCount > 0) { - this.readChat() + // Use a delay before marking as read to prevent situation where new messages + // arrive just as you're leaving the view and messages that you didn't actually + // get to see get marked as read. + window.setTimeout(() => { + // Don't mark as read if the element doesn't exist, user has left chat view + if (this.$el) this.readChat() + }, MARK_AS_READ_DELAY) } } else { this.jumpToBottomButtonVisible = true } - }, 100), + }, 200), handleScrollUp (positionBeforeLoading) { const positionAfterLoading = getScrollPosition(this.$refs.scrollable) this.$refs.scrollable.scrollTo({ @@ -264,6 +287,14 @@ const Chat = { if (isFirstFetch) { this.updateScrollableContainerHeight() } + + // In vertical screens, the first batch of fetched messages may not always take the + // full height of the scrollable container. + // If this is the case, we want to fetch the messages until the scrollable container + // is fully populated so that the user has the ability to scroll up and load the history. + if (!isScrollable(this.$refs.scrollable) && messages.length > 0) { + this.fetchChat({ maxId: this.currentChatMessageService.minId }) + } }) }) }) @@ -292,42 +323,74 @@ const Chat = { }) this.fetchChat({ isFirstFetch: true }) }, - sendMessage ({ status, media }) { + handleAttachmentPosting () { + this.$nextTick(() => { + this.handleResize() + // When the posting form size changes because of a media attachment, we need an extra resize + // to account for the potential delay in the DOM update. + setTimeout(() => { + this.updateScrollableContainerHeight() + }, SAFE_RESIZE_TIME_OFFSET) + this.scrollDown({ forceRead: true }) + }) + }, + sendMessage ({ status, media, idempotencyKey }) { const params = { id: this.currentChat.id, - content: status + content: status, + idempotencyKey } if (media[0]) { params.mediaId = media[0].id } - return this.backendInteractor.sendChatMessage(params) + const fakeMessage = buildFakeMessage({ + attachments: media, + chatId: this.currentChat.id, + content: status, + userId: this.currentUser.id, + idempotencyKey + }) + + this.$store.dispatch('addChatMessages', { + chatId: this.currentChat.id, + messages: [fakeMessage] + }).then(() => { + this.handleAttachmentPosting() + }) + + return this.doSendMessage({ params, fakeMessage, retriesLeft: MAX_RETRIES }) + }, + doSendMessage ({ params, fakeMessage, retriesLeft = MAX_RETRIES }) { + if (retriesLeft <= 0) return + + this.backendInteractor.sendChatMessage(params) .then(data => { this.$store.dispatch('addChatMessages', { chatId: this.currentChat.id, - messages: [data], - updateMaxId: false - }).then(() => { - this.$nextTick(() => { - this.handleResize() - // When the posting form size changes because of a media attachment, we need an extra resize - // to account for the potential delay in the DOM update. - setTimeout(() => { - this.updateScrollableContainerHeight() - }, SAFE_RESIZE_TIME_OFFSET) - this.scrollDown({ forceRead: true }) - }) + updateMaxId: false, + messages: [{ ...data, fakeId: fakeMessage.id }] }) return data }) .catch(error => { console.error('Error sending message', error) - return { - error: this.$t('chats.error_sending_message') + this.$store.dispatch('handleMessageError', { + chatId: this.currentChat.id, + fakeId: fakeMessage.id, + isRetry: retriesLeft !== MAX_RETRIES + }) + if ((error.statusCode >= 500 && error.statusCode < 600) || error.message === 'Failed to fetch') { + this.messageRetriers[fakeMessage.id] = setTimeout(() => { + this.doSendMessage({ params, fakeMessage, retriesLeft: retriesLeft - 1 }) + }, 1000 * (2 ** (MAX_RETRIES - retriesLeft))) } + return {} }) + + return Promise.resolve(fakeMessage) }, goBack () { this.$router.push({ name: 'chats', params: { username: this.currentUser.screen_name } }) diff --git a/src/components/chat/chat.scss b/src/components/chat/chat.scss index 012a1b1d..aef58495 100644 --- a/src/components/chat/chat.scss +++ b/src/components/chat/chat.scss @@ -25,7 +25,7 @@ min-height: 100%; margin: 0 0 0 0; border-radius: 10px 10px 0 0; - border-radius: var(--panelRadius, 10px) var(--panelRadius, 10px) 0 0 ; + border-radius: var(--panelRadius, 10px) var(--panelRadius, 10px) 0 0; &::after { border-radius: 0; @@ -58,12 +58,10 @@ .go-back-button { cursor: pointer; - margin-right: 1.4em; - - i { - display: flex; - align-items: center; - } + width: 28px; + text-align: center; + padding: 0.6em; + margin: -0.6em 0.6em -0.6em -0.6em; } .jump-to-bottom-button { @@ -78,7 +76,7 @@ display: flex; justify-content: center; align-items: center; - box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.3), 0px 2px 4px rgba(0, 0, 0, 0.3); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.3); z-index: 10; transition: 0.35s all; transition-timing-function: cubic-bezier(0, 1, 0.5, 1); @@ -140,11 +138,21 @@ } .chat-view-heading { + box-sizing: border-box; position: static; z-index: 9999; top: 0; margin-top: 0; border-radius: 0; + + /* This practically overlays the panel heading color over panel background + * color. This is needed because we allow transparent panel background and + * it doesn't work well in this "disjointed panel header" case + */ + background: + linear-gradient(to top, var(--panel), var(--panel)), + linear-gradient(to top, var(--bg), var(--bg)); + height: 50px; } .scrollable-message-list { diff --git a/src/components/chat/chat.vue b/src/components/chat/chat.vue index 2e4538c8..94a0097c 100644 --- a/src/components/chat/chat.vue +++ b/src/components/chat/chat.vue @@ -14,7 +14,10 @@ class="go-back-button" @click="goBack" > - <i class="button-icon icon-left-open" /> + <FAIcon + size="lg" + icon="chevron-left" + /> </a> <div class="title text-center"> <ChatTitle @@ -58,14 +61,15 @@ :class="{ 'visible': jumpToBottomButtonVisible }" @click="scrollDown({ behavior: 'smooth' })" > - <i class="icon-down-open"> + <span> + <FAIcon icon="chevron-down" /> <div v-if="newMessageCount" class="badge badge-notification unread-chat-count unread-message-count" > {{ newMessageCount }} </div> - </i> + </span> </div> <PostStatusForm :disable-subject="true" @@ -76,6 +80,7 @@ :disable-sensitivity-checkbox="true" :disable-submit="errorLoadingChat || !currentChat" :disable-preview="true" + :optimistic-posting="true" :post-handler="sendMessage" :submit-on-enter="!mobileLayout" :preserve-focus="!mobileLayout" diff --git a/src/components/chat/chat_layout_utils.js b/src/components/chat/chat_layout_utils.js index 609dc0c9..50a933ac 100644 --- a/src/components/chat/chat_layout_utils.js +++ b/src/components/chat/chat_layout_utils.js @@ -24,3 +24,10 @@ export const isBottomedOut = (el, offset = 0) => { export const scrollableContainerHeight = (inner, header, footer) => { return inner.offsetHeight - header.clientHeight - footer.clientHeight } + +// Returns whether or not the scrollbar is visible. +export const isScrollable = (el) => { + if (!el) return + + return el.scrollHeight > el.clientHeight +} diff --git a/src/components/chat_list/chat_list.vue b/src/components/chat_list/chat_list.vue index 17e2f795..e23eec13 100644 --- a/src/components/chat_list/chat_list.vue +++ b/src/components/chat_list/chat_list.vue @@ -10,7 +10,10 @@ <span class="title"> {{ $t("chats.chats") }} </span> - <button @click="newChat"> + <button + class="button-default" + @click="newChat" + > {{ $t("chats.new") }} </button> </div> diff --git a/src/components/chat_list_item/chat_list_item.vue b/src/components/chat_list_item/chat_list_item.vue index 1f8ecdf6..cd3f436e 100644 --- a/src/components/chat_list_item/chat_list_item.vue +++ b/src/components/chat_list_item/chat_list_item.vue @@ -21,6 +21,12 @@ /> </span> <span class="heading-right" /> + <div class="time-wrapper"> + <Timeago + :time="chat.updated_at" + :auto-update="60" + /> + </div> </div> <div class="chat-preview"> <StatusContent @@ -35,12 +41,6 @@ </div> </div> </div> - <div class="time-wrapper"> - <Timeago - :time="chat.updated_at" - :auto-update="60" - /> - </div> </div> </template> diff --git a/src/components/chat_message/chat_message.js b/src/components/chat_message/chat_message.js index be4a7c89..bb380f87 100644 --- a/src/components/chat_message/chat_message.js +++ b/src/components/chat_message/chat_message.js @@ -7,6 +7,16 @@ import LinkPreview from '../link-preview/link-preview.vue' import StatusContent from '../status_content/status_content.vue' import ChatMessageDate from '../chat_message_date/chat_message_date.vue' import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faTimes, + faEllipsisH +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faTimes, + faEllipsisH +) const ChatMessage = { name: 'ChatMessage', diff --git a/src/components/chat_message/chat_message.scss b/src/components/chat_message/chat_message.scss index 7d4ff60c..e4351d3b 100644 --- a/src/components/chat_message/chat_message.scss +++ b/src/components/chat_message/chat_message.scss @@ -24,16 +24,13 @@ } } - .icon-ellipsis { + .menu-icon { cursor: pointer; &:hover, .extra-button-popover.open & { color: $fallback--text; color: var(--text, $fallback--text); } - - border-radius: $fallback--chatMessageRadius; - border-radius: var(--chatMessageRadius, $fallback--chatMessageRadius); } .popover { @@ -101,6 +98,19 @@ } } + .pending { + .status-content.media-body, .created-at { + color: var(--faint); + } + } + + .error { + .status-content.media-body, .created-at { + color: $fallback--cRed; + color: var(--badgeNotification, $fallback--cRed); + } + } + .incoming { a { color: var(--chatMessageIncomingLink, $fallback--link); diff --git a/src/components/chat_message/chat_message.vue b/src/components/chat_message/chat_message.vue index e923d694..0777f880 100644 --- a/src/components/chat_message/chat_message.vue +++ b/src/components/chat_message/chat_message.vue @@ -32,7 +32,7 @@ > <div class="media status" - :class="{ 'without-attachment': !hasAttachment }" + :class="{ 'without-attachment': !hasAttachment, 'pending': chatViewItem.data.pending, 'error': chatViewItem.data.error }" style="position: relative" @mouseenter="hovered = true" @mouseleave="hovered = false" @@ -53,18 +53,19 @@ <div slot="content"> <div class="dropdown-menu"> <button - class="dropdown-item dropdown-item-icon" + class="button-default dropdown-item dropdown-item-icon" @click="deleteMessage" > - <i class="icon-cancel" /> {{ $t("chats.delete") }} + <FAIcon icon="times" /> {{ $t("chats.delete") }} </button> </div> </div> <button slot="trigger" + class="button-default menu-icon" :title="$t('chats.more')" > - <i class="icon-ellipsis" /> + <FAIcon icon="ellipsis-h" /> </button> </Popover> </div> diff --git a/src/components/chat_message_date/chat_message_date.vue b/src/components/chat_message_date/chat_message_date.vue index 79c346b6..98349b75 100644 --- a/src/components/chat_message_date/chat_message_date.vue +++ b/src/components/chat_message_date/chat_message_date.vue @@ -5,6 +5,8 @@ </template> <script> +import localeService from 'src/services/locale/locale.service.js' + export default { name: 'Timeago', props: ['date'], @@ -16,7 +18,7 @@ export default { if (this.date.getTime() === today.getTime()) { return this.$t('display_date.today') } else { - return this.date.toLocaleDateString('en', { day: 'numeric', month: 'long' }) + return this.date.toLocaleDateString(localeService.internalToBrowserLocale(this.$i18n.locale), { day: 'numeric', month: 'long' }) } } } diff --git a/src/components/chat_new/chat_new.js b/src/components/chat_new/chat_new.js index d023efc0..71585995 100644 --- a/src/components/chat_new/chat_new.js +++ b/src/components/chat_new/chat_new.js @@ -1,6 +1,16 @@ import { mapState, mapGetters } from 'vuex' import BasicUserCard from '../basic_user_card/basic_user_card.vue' import UserAvatar from '../user_avatar/user_avatar.vue' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faSearch, + faChevronLeft +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faSearch, + faChevronLeft +) const chatNew = { components: { diff --git a/src/components/chat_new/chat_new.scss b/src/components/chat_new/chat_new.scss index 11305444..5506143d 100644 --- a/src/components/chat_new/chat_new.scss +++ b/src/components/chat_new/chat_new.scss @@ -8,9 +8,7 @@ } } - .icon-search { - font-size: 1.5em; - float: right; + .search-icon { margin-right: 0.3em; } @@ -25,5 +23,9 @@ .go-back-button { cursor: pointer; + width: 28px; + text-align: center; + padding: 0.6em; + margin: -0.6em 0.6em -0.6em -0.6em; } } diff --git a/src/components/chat_new/chat_new.vue b/src/components/chat_new/chat_new.vue index 3333dbf9..f3894a3a 100644 --- a/src/components/chat_new/chat_new.vue +++ b/src/components/chat_new/chat_new.vue @@ -11,12 +11,18 @@ class="go-back-button" @click="goBack" > - <i class="button-icon icon-left-open" /> + <FAIcon + size="lg" + icon="chevron-left" + /> </a> </div> <div class="input-wrap"> <div class="input-search"> - <i class="button-icon icon-search" /> + <FAIcon + class="search-icon fa-scale-110 fa-old-padding" + icon="search" + /> </div> <input ref="search" diff --git a/src/components/chat_panel/chat_panel.js b/src/components/chat_panel/chat_panel.js index f2e3adf0..c3887098 100644 --- a/src/components/chat_panel/chat_panel.js +++ b/src/components/chat_panel/chat_panel.js @@ -1,4 +1,14 @@ import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faBullhorn, + faTimes +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faBullhorn, + faTimes +) const chatPanel = { props: [ 'floating' ], diff --git a/src/components/chat_panel/chat_panel.vue b/src/components/chat_panel/chat_panel.vue index 570435e7..7993c94d 100644 --- a/src/components/chat_panel/chat_panel.vue +++ b/src/components/chat_panel/chat_panel.vue @@ -11,9 +11,9 @@ > <div class="title"> <span>{{ $t('shoutbox.title') }}</span> - <i + <FAIcon v-if="floating" - class="icon-cancel" + icon="times" /> </div> </div> @@ -63,7 +63,10 @@ @click.stop.prevent="togglePanel" > <div class="title"> - <i class="icon-megaphone" /> + <FAIcon + class="icon" + icon="bullhorn" + /> {{ $t('shoutbox.title') }} </div> </div> @@ -87,7 +90,8 @@ .chat-panel { .chat-heading { cursor: pointer; - .icon-comment-empty { + + .icon { color: $fallback--text; color: var(--text, $fallback--text); } diff --git a/src/components/contrast_ratio/contrast_ratio.vue b/src/components/contrast_ratio/contrast_ratio.vue index 9dc871b6..374cb9ba 100644 --- a/src/components/contrast_ratio/contrast_ratio.vue +++ b/src/components/contrast_ratio/contrast_ratio.vue @@ -8,13 +8,13 @@ class="rating" > <span v-if="contrast.aaa"> - <i class="icon-thumbs-up-alt" /> + <FAIcon icon="thumbs-up" /> </span> <span v-if="!contrast.aaa && contrast.aa"> - <i class="icon-adjust" /> + <FAIcon icon="adjust" /> </span> <span v-if="!contrast.aaa && !contrast.aa"> - <i class="icon-attention" /> + <FAIcon icon="exclamation-triangle" /> </span> </span> <span @@ -23,19 +23,32 @@ :title="hint_18pt" > <span v-if="contrast.laaa"> - <i class="icon-thumbs-up-alt" /> + <FAIcon icon="thumbs-up" /> </span> <span v-if="!contrast.laaa && contrast.laa"> - <i class="icon-adjust" /> + <FAIcon icon="adjust" /> </span> <span v-if="!contrast.laaa && !contrast.laa"> - <i class="icon-attention" /> + <FAIcon icon="exclamation-triangle" /> </span> </span> </span> </template> <script> +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faAdjust, + faExclamationTriangle, + faThumbsUp +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faAdjust, + faExclamationTriangle, + faThumbsUp +) + export default { props: { large: { @@ -85,6 +98,7 @@ export default { .rating { display: inline-block; text-align: center; + margin-left: 0.5em; } } </style> diff --git a/src/components/conversation/conversation.vue b/src/components/conversation/conversation.vue index e0b9fcc5..353859b8 100644 --- a/src/components/conversation/conversation.vue +++ b/src/components/conversation/conversation.vue @@ -10,12 +10,13 @@ class="panel-heading conversation-heading" > <span class="title"> {{ $t('timeline.conversation') }} </span> - <span v-if="collapsable"> - <a - href="#" - @click.prevent="toggleExpanded" - >{{ $t('timeline.collapse') }}</a> - </span> + <button + v-if="collapsable" + class="button-unstyled -link" + @click.prevent="toggleExpanded" + > + {{ $t('timeline.collapse') }} + </button> </div> <status v-for="status in conversation" @@ -57,13 +58,6 @@ } &.-expanded { - .conversation-status { - border-color: $fallback--border; - border-color: var(--border, $fallback--border); - border-left-color: $fallback--cRed; - border-left-color: var(--cRed, $fallback--cRed); - } - .conversation-status:last-child { border-bottom: none; border-radius: 0 0 $fallback--panelRadius $fallback--panelRadius; diff --git a/src/components/desktop_nav/desktop_nav.js b/src/components/desktop_nav/desktop_nav.js new file mode 100644 index 00000000..e048f53d --- /dev/null +++ b/src/components/desktop_nav/desktop_nav.js @@ -0,0 +1,89 @@ +import SearchBar from 'components/search_bar/search_bar.vue' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faSignInAlt, + faSignOutAlt, + faHome, + faComments, + faBell, + faUserPlus, + faBullhorn, + faSearch, + faTachometerAlt, + faCog, + faInfoCircle +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faSignInAlt, + faSignOutAlt, + faHome, + faComments, + faBell, + faUserPlus, + faBullhorn, + faSearch, + faTachometerAlt, + faCog, + faInfoCircle +) + +export default { + components: { + SearchBar + }, + data: () => ({ + searchBarHidden: true, + supportsMask: window.CSS && window.CSS.supports && ( + window.CSS.supports('mask-size', 'contain') || + window.CSS.supports('-webkit-mask-size', 'contain') || + window.CSS.supports('-moz-mask-size', 'contain') || + window.CSS.supports('-ms-mask-size', 'contain') || + window.CSS.supports('-o-mask-size', 'contain') + ) + }), + computed: { + enableMask () { return this.supportsMask && this.$store.state.instance.logoMask }, + logoStyle () { + return { + 'visibility': this.enableMask ? 'hidden' : 'visible' + } + }, + logoMaskStyle () { + return this.enableMask ? { + 'mask-image': `url(${this.$store.state.instance.logo})` + } : { + 'background-color': this.enableMask ? '' : 'transparent' + } + }, + logoBgStyle () { + return Object.assign({ + 'margin': `${this.$store.state.instance.logoMargin} 0`, + opacity: this.searchBarHidden ? 1 : 0 + }, this.enableMask ? {} : { + 'background-color': this.enableMask ? '' : 'transparent' + }) + }, + logo () { return this.$store.state.instance.logo }, + sitename () { return this.$store.state.instance.name }, + hideSitename () { return this.$store.state.instance.hideSitename }, + logoLeft () { return this.$store.state.instance.logoLeft }, + currentUser () { return this.$store.state.users.currentUser }, + privateMode () { return this.$store.state.instance.private } + }, + methods: { + scrollToTop () { + window.scrollTo(0, 0) + }, + logout () { + this.$router.replace('/main/public') + this.$store.dispatch('logout') + }, + onSearchBarToggled (hidden) { + this.searchBarHidden = hidden + }, + openSettingsModal () { + this.$store.dispatch('openSettingsModal') + } + } +} diff --git a/src/components/desktop_nav/desktop_nav.scss b/src/components/desktop_nav/desktop_nav.scss new file mode 100644 index 00000000..2d468588 --- /dev/null +++ b/src/components/desktop_nav/desktop_nav.scss @@ -0,0 +1,117 @@ +@import '../../_variables.scss'; + +.DesktopNav { + height: 50px; + width: 100%; + position: fixed; + + a { + color: var(--topBarLink, $fallback--link); + } + + .inner-nav { + display: grid; + grid-template-rows: 50px; + grid-template-columns: 2fr auto 2fr; + grid-template-areas: "sitename logo actions"; + box-sizing: border-box; + padding: 0 1.2em; + margin: auto; + max-width: 980px; + } + + &.-logoLeft { + grid-template-columns: auto 2fr 2fr; + grid-template-areas: "logo sitename actions"; + } + + .button-default { + &, svg { + color: $fallback--text; + color: var(--btnTopBarText, $fallback--text); + } + + &:active { + background-color: $fallback--fg; + background-color: var(--btnPressedTopBar, $fallback--fg); + color: $fallback--text; + color: var(--btnPressedTopBarText, $fallback--text); + } + + &:disabled { + color: $fallback--text; + color: var(--btnDisabledTopBarText, $fallback--text); + } + + &.toggled { + color: $fallback--text; + color: var(--btnToggledTopBarText, $fallback--text); + background-color: $fallback--fg; + background-color: var(--btnToggledTopBar, $fallback--fg) + } + } + + .logo { + grid-area: logo; + position: relative; + transition: opacity; + transition-timing-function: ease-out; + transition-duration: 100ms; + + @media all and (min-width: 800px) { + opacity: 1 !important; + } + + .mask { + mask-repeat: no-repeat; + mask-position: center; + mask-size: contain; + background-color: $fallback--fg; + background-color: var(--topBarText, $fallback--fg); + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + } + + img { + display: inline-block; + height: 50px; + } + } + + .nav-icon { + margin-left: 0.2em; + width: 2em; + height: 100%; + text-align: center; + + .svg-inline--fa { + color: $fallback--link; + color: var(--topBarLink, $fallback--link); + } + } + + .sitename { + grid-area: sitename; + } + + .actions { + grid-area: actions; + } + + .item { + flex: 1; + line-height: 50px; + height: 50px; + overflow: hidden; + display: flex; + flex-wrap: wrap; + + &.right { + justify-content: flex-end; + text-align: right; + } + } +} diff --git a/src/components/desktop_nav/desktop_nav.vue b/src/components/desktop_nav/desktop_nav.vue new file mode 100644 index 00000000..762aa610 --- /dev/null +++ b/src/components/desktop_nav/desktop_nav.vue @@ -0,0 +1,81 @@ +<template> + <nav + id="nav" + class="DesktopNav" + :class="{ '-logoLeft': logoLeft }" + @click="scrollToTop()" + > + <div class="inner-nav"> + <div class="item sitename"> + <router-link + v-if="!hideSitename" + class="site-name" + :to="{ name: 'root' }" + active-class="home" + > + {{ sitename }} + </router-link> + </div> + <router-link + class="logo" + :to="{ name: 'root' }" + :style="logoBgStyle" + > + <div + class="mask" + :style="logoMaskStyle" + /> + <img + :src="logo" + :style="logoStyle" + > + </router-link> + <div class="item right actions"> + <search-bar + v-if="currentUser || !privateMode" + @toggled="onSearchBarToggled" + @click.stop.native + /> + <button + class="button-unstyled nav-icon" + @click.stop="openSettingsModal" + > + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding" + icon="cog" + :title="$t('nav.preferences')" + /> + </button> + <a + v-if="currentUser && currentUser.role === 'admin'" + href="/pleroma/admin/#/login-pleroma" + class="nav-icon" + target="_blank" + > + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding" + icon="tachometer-alt" + :title="$t('nav.administration')" + /> + </a> + <button + v-if="currentUser" + class="button-unstyled nav-icon" + @click.prevent="logout" + > + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding" + icon="sign-out-alt" + :title="$t('login.logout')" + /> + </button> + </div> + </div> + </nav> +</template> +<script src="./desktop_nav.js"></script> + +<style src="./desktop_nav.scss" lang="scss"></style> diff --git a/src/components/domain_mute_card/domain_mute_card.vue b/src/components/domain_mute_card/domain_mute_card.vue index 97aee243..3b5aec14 100644 --- a/src/components/domain_mute_card/domain_mute_card.vue +++ b/src/components/domain_mute_card/domain_mute_card.vue @@ -6,7 +6,7 @@ <ProgressButton v-if="muted" :click="unmuteDomain" - class="btn btn-default" + class="btn button-default" > {{ $t('domain_mute_card.unmute') }} <template slot="progress"> @@ -16,7 +16,7 @@ <ProgressButton v-else :click="muteDomain" - class="btn btn-default" + class="btn button-default" > {{ $t('domain_mute_card.mute') }} <template slot="progress"> diff --git a/src/components/emoji_input/emoji_input.js b/src/components/emoji_input/emoji_input.js index f0123447..2068a598 100644 --- a/src/components/emoji_input/emoji_input.js +++ b/src/components/emoji_input/emoji_input.js @@ -3,6 +3,15 @@ import EmojiPicker from '../emoji_picker/emoji_picker.vue' import { take } from 'lodash' import { findOffset } from '../../services/offset_finder/offset_finder.service.js' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faSmileBeam +} from '@fortawesome/free-regular-svg-icons' + +library.add( + faSmileBeam +) + /** * EmojiInput - augmented inputs for emoji and autocomplete support in inputs * without having to give up the comfort of <input/> and <textarea/> elements @@ -105,7 +114,8 @@ const EmojiInput = { showPicker: false, temporarilyHideSuggestions: false, keepOpen: false, - disableClickOutside: false + disableClickOutside: false, + suggestions: [] } }, components: { @@ -115,21 +125,6 @@ const EmojiInput = { padEmoji () { return this.$store.getters.mergedConfig.padEmoji }, - suggestions () { - const firstchar = this.textAtCaret.charAt(0) - if (this.textAtCaret === firstchar) { return [] } - const matchedSuggestions = this.suggest(this.textAtCaret) - if (matchedSuggestions.length <= 0) { - return [] - } - return take(matchedSuggestions, 5) - .map(({ imageUrl, ...rest }, index) => ({ - ...rest, - // eslint-disable-next-line camelcase - img: imageUrl || '', - highlighted: index === this.highlighted - })) - }, showSuggestions () { return this.focused && this.suggestions && @@ -179,6 +174,23 @@ const EmojiInput = { watch: { showSuggestions: function (newValue) { this.$emit('shown', newValue) + }, + textAtCaret: async function (newWord) { + const firstchar = newWord.charAt(0) + this.suggestions = [] + if (newWord === firstchar) return + const matchedSuggestions = await this.suggest(newWord) + // Async: cancel if textAtCaret has changed during wait + if (this.textAtCaret !== newWord) return + if (matchedSuggestions.length <= 0) return + this.suggestions = take(matchedSuggestions, 5) + .map(({ imageUrl, ...rest }) => ({ + ...rest, + img: imageUrl || '' + })) + }, + suggestions (newValue) { + this.$nextTick(this.resize) } }, methods: { diff --git a/src/components/emoji_input/emoji_input.vue b/src/components/emoji_input/emoji_input.vue index b9a74572..4becdc41 100644 --- a/src/components/emoji_input/emoji_input.vue +++ b/src/components/emoji_input/emoji_input.vue @@ -6,13 +6,13 @@ > <slot /> <template v-if="enableEmojiPicker"> - <div + <button v-if="!hideEmojiButton" - class="emoji-picker-icon" + class="button-unstyled emoji-picker-icon" @click.prevent="togglePicker" > - <i class="icon-smile" /> - </div> + <FAIcon :icon="['far', 'smile-beam']" /> + </button> <EmojiPicker v-if="enableEmojiPicker" ref="picker" @@ -37,7 +37,7 @@ v-for="(suggestion, index) in suggestions" :key="index" class="autocomplete-item" - :class="{ highlighted: suggestion.highlighted }" + :class="{ highlighted: index === highlighted }" @click.stop.prevent="onClick($event, suggestion)" > <span class="image"> diff --git a/src/components/emoji_input/suggestor.js b/src/components/emoji_input/suggestor.js index 8330345b..14a2b41e 100644 --- a/src/components/emoji_input/suggestor.js +++ b/src/components/emoji_input/suggestor.js @@ -1,4 +1,3 @@ -import { debounce } from 'lodash' /** * suggest - generates a suggestor function to be used by emoji-input * data: object providing source information for specific types of suggestions: @@ -11,19 +10,19 @@ import { debounce } from 'lodash' * doesn't support user linking you can just provide only emoji. */ -const debounceUserSearch = debounce((data, input) => { - data.updateUsersList(input) -}, 500) - -export default data => input => { - const firstChar = input[0] - if (firstChar === ':' && data.emoji) { - return suggestEmoji(data.emoji)(input) - } - if (firstChar === '@' && data.users) { - return suggestUsers(data)(input) +export default data => { + const emojiCurry = suggestEmoji(data.emoji) + const usersCurry = data.store && suggestUsers(data.store) + return input => { + const firstChar = input[0] + if (firstChar === ':' && data.emoji) { + return emojiCurry(input) + } + if (firstChar === '@' && usersCurry) { + return usersCurry(input) + } + return [] } - return [] } export const suggestEmoji = emojis => input => { @@ -57,50 +56,75 @@ export const suggestEmoji = emojis => input => { }) } -export const suggestUsers = data => input => { - const noPrefix = input.toLowerCase().substr(1) - const users = data.users - - const newUsers = users.filter( - user => - user.screen_name.toLowerCase().startsWith(noPrefix) || - user.name.toLowerCase().startsWith(noPrefix) - - /* taking only 20 results so that sorting is a bit cheaper, we display - * only 5 anyway. could be inaccurate, but we ideally we should query - * backend anyway - */ - ).slice(0, 20).sort((a, b) => { - let aScore = 0 - let bScore = 0 - - // Matches on screen name (i.e. user@instance) makes a priority - aScore += a.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0 - bScore += b.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0 - - // Matches on name takes second priority - aScore += a.name.toLowerCase().startsWith(noPrefix) ? 1 : 0 - bScore += b.name.toLowerCase().startsWith(noPrefix) ? 1 : 0 - - const diff = (bScore - aScore) * 10 - - // Then sort alphabetically - const nameAlphabetically = a.name > b.name ? 1 : -1 - const screenNameAlphabetically = a.screen_name > b.screen_name ? 1 : -1 - - return diff + nameAlphabetically + screenNameAlphabetically - /* eslint-disable camelcase */ - }).map(({ screen_name, name, profile_image_url_original }) => ({ - displayText: screen_name, - detailText: name, - imageUrl: profile_image_url_original, - replacement: '@' + screen_name + ' ' - })) - - // BE search users to get more comprehensive results - if (data.updateUsersList) { - debounceUserSearch(data, noPrefix) +export const suggestUsers = ({ dispatch, state }) => { + // Keep some persistent values in closure, most importantly for the + // custom debounce to work. Lodash debounce does not return a promise. + let suggestions = [] + let previousQuery = '' + let timeout = null + let cancelUserSearch = null + + const userSearch = (query) => dispatch('searchUsers', { query }) + const debounceUserSearch = (query) => { + cancelUserSearch && cancelUserSearch() + return new Promise((resolve, reject) => { + timeout = setTimeout(() => { + userSearch(query).then(resolve).catch(reject) + }, 300) + cancelUserSearch = () => { + clearTimeout(timeout) + resolve([]) + } + }) + } + + return async input => { + const noPrefix = input.toLowerCase().substr(1) + if (previousQuery === noPrefix) return suggestions + + suggestions = [] + previousQuery = noPrefix + // Fetch more and wait, don't fetch if there's the 2nd @ because + // the backend user search can't deal with it. + // Reference semantics make it so that we get the updated data after + // the await. + if (!noPrefix.includes('@')) { + await debounceUserSearch(noPrefix) + } + + const newSuggestions = state.users.users.filter( + user => + user.screen_name.toLowerCase().startsWith(noPrefix) || + user.name.toLowerCase().startsWith(noPrefix) + ).slice(0, 20).sort((a, b) => { + let aScore = 0 + let bScore = 0 + + // Matches on screen name (i.e. user@instance) makes a priority + aScore += a.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0 + bScore += b.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0 + + // Matches on name takes second priority + aScore += a.name.toLowerCase().startsWith(noPrefix) ? 1 : 0 + bScore += b.name.toLowerCase().startsWith(noPrefix) ? 1 : 0 + + const diff = (bScore - aScore) * 10 + + // Then sort alphabetically + const nameAlphabetically = a.name > b.name ? 1 : -1 + const screenNameAlphabetically = a.screen_name > b.screen_name ? 1 : -1 + + return diff + nameAlphabetically + screenNameAlphabetically + /* eslint-disable camelcase */ + }).map(({ screen_name, name, profile_image_url_original }) => ({ + displayText: screen_name, + detailText: name, + imageUrl: profile_image_url_original, + replacement: '@' + screen_name + ' ' + })) + /* eslint-enable camelcase */ + + suggestions = newSuggestions || [] + return suggestions } - return newUsers - /* eslint-enable camelcase */ } diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index 3ad80df3..2716d93f 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -1,4 +1,16 @@ import Checkbox from '../checkbox/checkbox.vue' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faBoxOpen, + faStickyNote, + faSmileBeam +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faBoxOpen, + faStickyNote, + faSmileBeam +) // At widest, approximately 20 emoji are visible in a row, // loading 3 rows, could be overkill for narrow picker @@ -177,13 +189,13 @@ const EmojiPicker = { { id: 'custom', text: this.$t('emoji.custom'), - icon: 'icon-smile', + icon: 'smile-beam', emojis: customEmojis }, { id: 'standard', text: this.$t('emoji.unicode'), - icon: 'icon-picture', + icon: 'box-open', emojis: filterByKeyword(standardEmojis, this.keyword) } ] diff --git a/src/components/emoji_picker/emoji_picker.scss b/src/components/emoji_picker/emoji_picker.scss index 8bd07e45..ec711758 100644 --- a/src/components/emoji_picker/emoji_picker.scss +++ b/src/components/emoji_picker/emoji_picker.scss @@ -82,7 +82,7 @@ &.active { border-bottom: 4px solid; - i { + svg { color: $fallback--lightText; color: var(--lightText, $fallback--lightText); } diff --git a/src/components/emoji_picker/emoji_picker.vue b/src/components/emoji_picker/emoji_picker.vue index 191b9fa1..3262a3d9 100644 --- a/src/components/emoji_picker/emoji_picker.vue +++ b/src/components/emoji_picker/emoji_picker.vue @@ -13,7 +13,10 @@ :title="group.text" @click.prevent="highlight(group.id)" > - <i :class="group.icon" /> + <FAIcon + :icon="group.icon" + fixed-width + /> </span> </span> <span @@ -26,7 +29,10 @@ :title="$t('emoji.stickers')" @click.prevent="toggleStickers" > - <i class="icon-star" /> + <FAIcon + icon="sticky-note" + fixed-width + /> </span> </span> </div> diff --git a/src/components/emoji_reactions/emoji_reactions.vue b/src/components/emoji_reactions/emoji_reactions.vue index 2f14b5b2..51d50359 100644 --- a/src/components/emoji_reactions/emoji_reactions.vue +++ b/src/components/emoji_reactions/emoji_reactions.vue @@ -6,7 +6,7 @@ :users="accountsForEmoji[reaction.name]" > <button - class="emoji-reaction btn btn-default" + class="emoji-reaction btn button-default" :class="{ 'picked-reaction': reactedWith(reaction.name), 'not-clickable': !loggedIn }" @click="emojiOnClick(reaction.name, $event)" @mouseenter="fetchEmojiReactionsByIfMissing()" diff --git a/src/components/export_import/export_import.vue b/src/components/export_import/export_import.vue index ae00487f..8ffe34f8 100644 --- a/src/components/export_import/export_import.vue +++ b/src/components/export_import/export_import.vue @@ -2,13 +2,13 @@ <div class="import-export-container"> <slot name="before" /> <button - class="btn" + class="btn button-default" @click="exportData" > {{ exportLabel }} </button> <button - class="btn" + class="btn button-default" @click="importData" > {{ importLabel }} diff --git a/src/components/exporter/exporter.js b/src/components/exporter/exporter.js index 8f507416..51912ac3 100644 --- a/src/components/exporter/exporter.js +++ b/src/components/exporter/exporter.js @@ -1,3 +1,10 @@ +import { library } from '@fortawesome/fontawesome-svg-core' +import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' + +library.add( + faCircleNotch +) + const Exporter = { props: { getContent: { diff --git a/src/components/exporter/exporter.vue b/src/components/exporter/exporter.vue index f5126dc1..d6a03088 100644 --- a/src/components/exporter/exporter.vue +++ b/src/components/exporter/exporter.vue @@ -1,12 +1,17 @@ <template> <div class="exporter"> <div v-if="processing"> - <i class="icon-spin4 animate-spin exporter-processing" /> + <FAIcon + icon="circle-notch" + size="lg" + spin + /> + <span>{{ processingMessage }}</span> </div> <button v-else - class="btn btn-default" + class="btn button-default" @click="process" > {{ exportButtonLabel }} @@ -19,7 +24,6 @@ <style lang="scss"> .exporter { &-processing { - font-size: 1.5em; margin: 0.25em; } } diff --git a/src/components/extra_buttons/extra_buttons.js b/src/components/extra_buttons/extra_buttons.js index 5e0c36bb..dd45b6b9 100644 --- a/src/components/extra_buttons/extra_buttons.js +++ b/src/components/extra_buttons/extra_buttons.js @@ -1,4 +1,28 @@ import Popover from '../popover/popover.vue' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faEllipsisH, + faBookmark, + faEyeSlash, + faThumbtack, + faShareAlt, + faExternalLinkAlt +} from '@fortawesome/free-solid-svg-icons' +import { + faBookmark as faBookmarkReg, + faFlag +} from '@fortawesome/free-regular-svg-icons' + +library.add( + faEllipsisH, + faBookmark, + faBookmarkReg, + faEyeSlash, + faThumbtack, + faShareAlt, + faExternalLinkAlt, + faFlag +) const ExtraButtons = { props: [ 'status' ], @@ -44,6 +68,9 @@ const ExtraButtons = { this.$store.dispatch('unbookmark', { id: this.status.id }) .then(() => this.$emit('onSuccess')) .catch(err => this.$emit('onError', err.error.error)) + }, + reportStatus () { + this.$store.dispatch('openUserReportingModal', { userId: this.status.user.id, statusIds: [this.status.id] }) } }, computed: { diff --git a/src/components/extra_buttons/extra_buttons.vue b/src/components/extra_buttons/extra_buttons.vue index 7a4e8642..e845d8fc 100644 --- a/src/components/extra_buttons/extra_buttons.vue +++ b/src/components/extra_buttons/extra_buttons.vue @@ -1,9 +1,11 @@ <template> <Popover + class="ExtraButtons" trigger="click" placement="top" - class="extra-button-popover" + :offset="{ y: 5 }" :bound-to="{ x: 'container' }" + remove-padding > <div slot="content" @@ -12,71 +14,122 @@ <div class="dropdown-menu"> <button v-if="canMute && !status.thread_muted" - class="dropdown-item dropdown-item-icon" + class="button-default dropdown-item dropdown-item-icon" @click.prevent="muteConversation" > - <i class="icon-eye-off" /><span>{{ $t("status.mute_conversation") }}</span> + <FAIcon + fixed-width + icon="eye-slash" + /><span>{{ $t("status.mute_conversation") }}</span> </button> <button v-if="canMute && status.thread_muted" - class="dropdown-item dropdown-item-icon" + class="button-default dropdown-item dropdown-item-icon" @click.prevent="unmuteConversation" > - <i class="icon-eye-off" /><span>{{ $t("status.unmute_conversation") }}</span> + <FAIcon + fixed-width + icon="eye-slash" + /><span>{{ $t("status.unmute_conversation") }}</span> </button> <button v-if="!status.pinned && canPin" - class="dropdown-item dropdown-item-icon" + class="button-default dropdown-item dropdown-item-icon" @click.prevent="pinStatus" @click="close" > - <i class="icon-pin" /><span>{{ $t("status.pin") }}</span> + <FAIcon + fixed-width + icon="thumbtack" + /><span>{{ $t("status.pin") }}</span> </button> <button v-if="status.pinned && canPin" - class="dropdown-item dropdown-item-icon" + class="button-default dropdown-item dropdown-item-icon" @click.prevent="unpinStatus" @click="close" > - <i class="icon-pin" /><span>{{ $t("status.unpin") }}</span> + <FAIcon + fixed-width + icon="thumbtack" + /><span>{{ $t("status.unpin") }}</span> </button> <button v-if="!status.bookmarked" - class="dropdown-item dropdown-item-icon" + class="button-default dropdown-item dropdown-item-icon" @click.prevent="bookmarkStatus" @click="close" > - <i class="icon-bookmark-empty" /><span>{{ $t("status.bookmark") }}</span> + <FAIcon + fixed-width + :icon="['far', 'bookmark']" + /><span>{{ $t("status.bookmark") }}</span> </button> <button v-if="status.bookmarked" - class="dropdown-item dropdown-item-icon" + class="button-default dropdown-item dropdown-item-icon" @click.prevent="unbookmarkStatus" @click="close" > - <i class="icon-bookmark" /><span>{{ $t("status.unbookmark") }}</span> + <FAIcon + fixed-width + icon="bookmark" + /><span>{{ $t("status.unbookmark") }}</span> </button> <button v-if="canDelete" - class="dropdown-item dropdown-item-icon" + class="button-default dropdown-item dropdown-item-icon" @click.prevent="deleteStatus" @click="close" > - <i class="icon-cancel" /><span>{{ $t("status.delete") }}</span> + <FAIcon + fixed-width + icon="times" + /><span>{{ $t("status.delete") }}</span> </button> <button - class="dropdown-item dropdown-item-icon" + class="button-default dropdown-item dropdown-item-icon" @click.prevent="copyLink" @click="close" > - <i class="icon-share" /><span>{{ $t("status.copy_link") }}</span> + <FAIcon + fixed-width + icon="share-alt" + /><span>{{ $t("status.copy_link") }}</span> + </button> + <a + v-if="!status.is_local" + class="button-default dropdown-item dropdown-item-icon" + title="Source" + :href="status.external_url" + target="_blank" + > + <FAIcon + fixed-width + icon="external-link-alt" + /><span>{{ $t("status.external_source") }}</span> + </a> + <button + class="button-default dropdown-item dropdown-item-icon" + @click.prevent="reportStatus" + @click="close" + > + <FAIcon + fixed-width + :icon="['far', 'flag']" + /><span>{{ $t("user_card.report") }}</span> </button> </div> </div> - <i + <span slot="trigger" - class="icon-ellipsis button-icon" - /> + class="popover-trigger" + > + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="ellipsis-h" + /> + </span> </Popover> </template> @@ -85,13 +138,16 @@ <style lang="scss"> @import '../../_variables.scss'; -.icon-ellipsis { - cursor: pointer; +.ExtraButtons { + .popover-trigger { + position: static; + padding: 10px; + margin: -10px; - &:hover, - .extra-button-popover.open & { - color: $fallback--text; - color: var(--text, $fallback--text); + &:hover .svg-inline--fa { + color: $fallback--text; + color: var(--text, $fallback--text); + } } } </style> diff --git a/src/components/favorite_button/favorite_button.js b/src/components/favorite_button/favorite_button.js index 5014d84f..5cd05f73 100644 --- a/src/components/favorite_button/favorite_button.js +++ b/src/components/favorite_button/favorite_button.js @@ -1,4 +1,14 @@ import { mapGetters } from 'vuex' +import { library } from '@fortawesome/fontawesome-svg-core' +import { faStar } from '@fortawesome/free-solid-svg-icons' +import { + faStar as faStarRegular +} from '@fortawesome/free-regular-svg-icons' + +library.add( + faStar, + faStarRegular +) const FavoriteButton = { props: ['status', 'loggedIn'], @@ -21,13 +31,6 @@ const FavoriteButton = { } }, computed: { - classes () { - return { - 'icon-star-empty': !this.status.favorited, - 'icon-star': this.status.favorited, - 'animate-spin': this.animated - } - }, ...mapGetters(['mergedConfig']) } } diff --git a/src/components/favorite_button/favorite_button.vue b/src/components/favorite_button/favorite_button.vue index fbc90f84..dce25e24 100644 --- a/src/components/favorite_button/favorite_button.vue +++ b/src/components/favorite_button/favorite_button.vue @@ -1,20 +1,31 @@ <template> - <div v-if="loggedIn"> - <i - :class="classes" - class="button-icon favorite-button fav-active" + <div class="FavoriteButton"> + <button + v-if="loggedIn" + class="button-unstyled interactive" + :class="status.favorited && '-favorited'" :title="$t('tool_tip.favorite')" @click.prevent="favorite()" - /> - <span v-if="!mergedConfig.hidePostStats && status.fave_num > 0">{{ status.fave_num }}</span> - </div> - <div v-else> - <i - :class="classes" - class="button-icon favorite-button" - :title="$t('tool_tip.favorite')" - /> - <span v-if="!mergedConfig.hidePostStats && status.fave_num > 0">{{ status.fave_num }}</span> + > + <FAIcon + class="fa-scale-110 fa-old-padding" + :icon="[status.favorited ? 'fas' : 'far', 'star']" + :spin="animated" + /> + </button> + <span v-else> + <FAIcon + class="fa-scale-110 fa-old-padding" + :title="$t('tool_tip.favorite')" + :icon="['far', 'star']" + /> + </span> + <span + v-if="!mergedConfig.hidePostStats && status.fave_num > 0" + class="action-counter" + > + {{ status.fave_num }} + </span> </div> </template> @@ -23,18 +34,29 @@ <style lang="scss"> @import '../../_variables.scss'; -.fav-active { - cursor: pointer; - animation-duration: 0.6s; +.FavoriteButton { + display: flex; - &:hover { - color: $fallback--cOrange; - color: var(--cOrange, $fallback--cOrange); + > :first-child { + padding: 10px; + margin: -10px -8px -10px -10px; } -} -.favorite-button.icon-star { - color: $fallback--cOrange; - color: var(--cOrange, $fallback--cOrange); + .action-counter { + pointer-events: none; + user-select: none; + } + + .interactive { + .svg-inline--fa { + animation-duration: 0.6s; + } + + &:hover .svg-inline--fa, + &.-favorited .svg-inline--fa { + color: $fallback--cOrange; + color: var(--cOrange, $fallback--cOrange); + } + } } </style> diff --git a/src/components/features_panel/features_panel.js b/src/components/features_panel/features_panel.js index 620a85ea..8b142d08 100644 --- a/src/components/features_panel/features_panel.js +++ b/src/components/features_panel/features_panel.js @@ -1,3 +1,5 @@ +import fileSizeFormatService from '../../services/file_size_format/file_size_format.js' + const FeaturesPanel = { computed: { chat: function () { return this.$store.state.instance.chatAvailable }, @@ -6,7 +8,8 @@ const FeaturesPanel = { whoToFollow: function () { return this.$store.state.instance.suggestionsEnabled }, mediaProxy: function () { return this.$store.state.instance.mediaProxyAvailable }, minimalScopesMode: function () { return this.$store.state.instance.minimalScopesMode }, - textlimit: function () { return this.$store.state.instance.textlimit } + textlimit: function () { return this.$store.state.instance.textlimit }, + uploadlimit: function () { return fileSizeFormatService.fileSizeFormat(this.$store.state.instance.uploadlimit) } } } diff --git a/src/components/features_panel/features_panel.vue b/src/components/features_panel/features_panel.vue index 608b11c8..9605d09d 100644 --- a/src/components/features_panel/features_panel.vue +++ b/src/components/features_panel/features_panel.vue @@ -25,6 +25,7 @@ </li> <li>{{ $t('features_panel.scope_options') }}</li> <li>{{ $t('features_panel.text_limit') }} = {{ textlimit }}</li> + <li>{{ $t('features_panel.upload_limit') }} = {{ uploadlimit.num }} {{ $t('upload.file_size_units.' + uploadlimit.unit) }}</li> </ul> </div> </div> diff --git a/src/components/follow_button/follow_button.vue b/src/components/follow_button/follow_button.vue index bfdc137b..7f85f1d7 100644 --- a/src/components/follow_button/follow_button.vue +++ b/src/components/follow_button/follow_button.vue @@ -1,6 +1,6 @@ <template> <button - class="btn btn-default follow-button" + class="btn button-default follow-button" :class="{ toggled: isPressed }" :disabled="inProgress" :title="title" diff --git a/src/components/follow_request_card/follow_request_card.vue b/src/components/follow_request_card/follow_request_card.vue index b217b8ed..1b12ba4b 100644 --- a/src/components/follow_request_card/follow_request_card.vue +++ b/src/components/follow_request_card/follow_request_card.vue @@ -2,13 +2,13 @@ <basic-user-card :user="user"> <div class="follow-request-card-content-container"> <button - class="btn btn-default" + class="btn button-default" @click="approveUser" > {{ $t('user_card.approve') }} </button> <button - class="btn btn-default" + class="btn button-default" @click="denyUser" > {{ $t('user_card.deny') }} diff --git a/src/components/font_control/font_control.js b/src/components/font_control/font_control.js index 8e2b0e45..6274780b 100644 --- a/src/components/font_control/font_control.js +++ b/src/components/font_control/font_control.js @@ -1,4 +1,12 @@ import { set } from 'vue' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faChevronDown +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faChevronDown +) export default { props: [ diff --git a/src/components/font_control/font_control.vue b/src/components/font_control/font_control.vue index 61f0384b..dd117ec0 100644 --- a/src/components/font_control/font_control.vue +++ b/src/components/font_control/font_control.vue @@ -41,7 +41,10 @@ {{ option === 'custom' ? $t('settings.style.fonts.custom') : option }} </option> </select> - <i class="icon-down-open" /> + <FAIcon + class="select-down-icon" + icon="chevron-down" + /> </label> <input v-if="isCustom" diff --git a/src/components/global_notice_list/global_notice_list.js b/src/components/global_notice_list/global_notice_list.js index 3af29c23..e93fba75 100644 --- a/src/components/global_notice_list/global_notice_list.js +++ b/src/components/global_notice_list/global_notice_list.js @@ -1,3 +1,11 @@ +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faTimes +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faTimes +) const GlobalNoticeList = { computed: { diff --git a/src/components/global_notice_list/global_notice_list.vue b/src/components/global_notice_list/global_notice_list.vue index 0e4285cc..049e23db 100644 --- a/src/components/global_notice_list/global_notice_list.vue +++ b/src/components/global_notice_list/global_notice_list.vue @@ -9,10 +9,15 @@ <div class="notice-message"> {{ $t(notice.messageKey, notice.messageArgs) }} </div> - <i - class="button-icon icon-cancel" + <button + class="button-unstyled close-notice" @click="closeNotice(notice)" - /> + > + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="times" + /> + </button> </div> </div> </template> @@ -53,7 +58,7 @@ .global-error { background-color: var(--alertPopupError, $fallback--cRed); color: var(--alertPopupErrorText, $fallback--text); - i { + .svg-inline--fa { color: var(--alertPopupErrorText, $fallback--text); } } @@ -61,7 +66,7 @@ .global-warning { background-color: var(--alertPopupWarning, $fallback--cOrange); color: var(--alertPopupWarningText, $fallback--text); - i { + .svg-inline--fa { color: var(--alertPopupWarningText, $fallback--text); } } @@ -69,9 +74,16 @@ .global-info { background-color: var(--alertPopupNeutral, $fallback--fg); color: var(--alertPopupNeutralText, $fallback--text); - i { + .svg-inline--fa { color: var(--alertPopupNeutralText, $fallback--text); } } + + .close-notice { + padding-right: 0.2em; + .svg-inline--fa:hover { + opacity: 0.6; + } + } } </style> diff --git a/src/components/image_cropper/image_cropper.js b/src/components/image_cropper/image_cropper.js index 01361e25..e8d5ec6d 100644 --- a/src/components/image_cropper/image_cropper.js +++ b/src/components/image_cropper/image_cropper.js @@ -1,5 +1,13 @@ import Cropper from 'cropperjs' import 'cropperjs/dist/cropper.css' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faCircleNotch +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faCircleNotch +) const ImageCropper = { props: { @@ -43,8 +51,7 @@ const ImageCropper = { cropper: undefined, dataUrl: undefined, filename: undefined, - submitting: false, - submitError: null + submitting: false } }, computed: { @@ -56,9 +63,6 @@ const ImageCropper = { }, cancelText () { return this.cancelButtonLabel || this.$t('image_cropper.cancel') - }, - submitErrorMsg () { - return this.submitError && this.submitError instanceof Error ? this.submitError.toString() : this.submitError } }, methods: { @@ -72,12 +76,8 @@ const ImageCropper = { }, submit (cropping = true) { this.submitting = true - this.avatarUploadError = null this.submitHandler(cropping && this.cropper, this.file) .then(() => this.destroy()) - .catch((err) => { - this.submitError = err - }) .finally(() => { this.submitting = false }) @@ -103,9 +103,6 @@ const ImageCropper = { reader.readAsDataURL(this.file) this.$emit('changed', this.file, reader) } - }, - clearError () { - this.submitError = null } }, mounted () { diff --git a/src/components/image_cropper/image_cropper.vue b/src/components/image_cropper/image_cropper.vue index 4e1b5927..8c48a387 100644 --- a/src/components/image_cropper/image_cropper.vue +++ b/src/components/image_cropper/image_cropper.vue @@ -11,39 +11,30 @@ </div> <div class="image-cropper-buttons-wrapper"> <button - class="btn" + class="button-default btn" type="button" :disabled="submitting" @click="submit()" v-text="saveText" /> <button - class="btn" + class="button-default btn" type="button" :disabled="submitting" @click="destroy" v-text="cancelText" /> <button - class="btn" + class="button-default btn" type="button" :disabled="submitting" @click="submit(false)" v-text="saveWithoutCroppingText" /> - <i + <FAIcon v-if="submitting" - class="icon-spin4 animate-spin" - /> - </div> - <div - v-if="submitError" - class="alert error" - > - {{ submitErrorMsg }} - <i - class="button-icon icon-cancel" - @click="clearError" + spin + icon="circle-notch" /> </div> </div> diff --git a/src/components/importer/importer.js b/src/components/importer/importer.js index c5f9e4d2..59f9beb1 100644 --- a/src/components/importer/importer.js +++ b/src/components/importer/importer.js @@ -1,3 +1,14 @@ +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faCircleNotch, + faTimes +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faCircleNotch, + faTimes +) + const Importer = { props: { submitHandler: { diff --git a/src/components/importer/importer.vue b/src/components/importer/importer.vue index ed923d59..210823f5 100644 --- a/src/components/importer/importer.vue +++ b/src/components/importer/importer.vue @@ -7,27 +7,29 @@ @change="change" > </form> - <i + <FAIcon v-if="submitting" - class="icon-spin4 animate-spin importer-uploading" + class="importer-uploading" + spin + icon="circle-notch" /> <button v-else - class="btn btn-default" + class="btn button-default" @click="submit" > {{ submitButtonLabel }} </button> <div v-if="success"> - <i - class="icon-cross" + <FAIcon + icon="times" @click="dismiss" /> <p>{{ successMessage }}</p> </div> <div v-else-if="error"> - <i - class="icon-cross" + <FAIcon + icon="times" @click="dismiss" /> <p>{{ errorMessage }}</p> diff --git a/src/components/interface_language_switcher/interface_language_switcher.vue b/src/components/interface_language_switcher/interface_language_switcher.vue index dd6800a3..dc3bd408 100644 --- a/src/components/interface_language_switcher/interface_language_switcher.vue +++ b/src/components/interface_language_switcher/interface_language_switcher.vue @@ -12,31 +12,39 @@ v-model="language" > <option - v-for="(langCode, i) in languageCodes" - :key="langCode" - :value="langCode" + v-for="lang in languages" + :key="lang.code" + :value="lang.code" > - {{ languageNames[i] }} + {{ lang.name }} </option> </select> - <i class="icon-down-open" /> + <FAIcon + class="select-down-icon" + icon="chevron-down" + /> </label> </div> </template> <script> import languagesObject from '../../i18n/messages' +import localeService from '../../services/locale/locale.service.js' import ISO6391 from 'iso-639-1' import _ from 'lodash' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faChevronDown +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faChevronDown +) export default { computed: { - languageCodes () { - return languagesObject.languages - }, - - languageNames () { - return _.map(this.languageCodes, this.getLanguageName) + languages () { + return _.map(languagesObject.languages, (code) => ({ code: code, name: this.getLanguageName(code) })).sort((a, b) => a.name.localeCompare(b.name)) }, language: { @@ -50,11 +58,13 @@ export default { methods: { getLanguageName (code) { const specialLanguageNames = { - 'ja': 'Japanese (日本語)', - 'ja_easy': 'Japanese (やさしいにほんご)', - 'zh': 'Chinese (简体中文)' + 'ja_easy': 'やさしいにほんご', + 'zh': '简体中文', + 'zh_Hant': '繁體中文' } - return specialLanguageNames[code] || ISO6391.getName(code) + const languageName = specialLanguageNames[code] || ISO6391.getNativeName(code) + const browserLocale = localeService.internalToBrowserLocale(code) + return languageName.charAt(0).toLocaleUpperCase(browserLocale) + languageName.slice(1) } } } diff --git a/src/components/link-preview/link-preview.js b/src/components/link-preview/link-preview.js index 444aafbe..add7c563 100644 --- a/src/components/link-preview/link-preview.js +++ b/src/components/link-preview/link-preview.js @@ -1,3 +1,5 @@ +import { mapGetters } from 'vuex' + const LinkPreview = { name: 'LinkPreview', props: [ @@ -15,11 +17,20 @@ const LinkPreview = { // Currently BE shoudn't give cards if tagged NSFW, this is a bit paranoid // as it makes sure to hide the image if somehow NSFW tagged preview can // exist. - return this.card.image && !this.nsfw && this.size !== 'hide' + return this.card.image && !this.censored && this.size !== 'hide' + }, + censored () { + return this.nsfw && this.hideNsfwConfig }, useDescription () { return this.card.description && /\S/.test(this.card.description) - } + }, + hideNsfwConfig () { + return this.mergedConfig.hideNsfw + }, + ...mapGetters([ + 'mergedConfig' + ]) }, created () { if (this.useImage) { diff --git a/src/components/link-preview/link-preview.vue b/src/components/link-preview/link-preview.vue index 69171977..d3ca39b8 100644 --- a/src/components/link-preview/link-preview.vue +++ b/src/components/link-preview/link-preview.vue @@ -9,12 +9,17 @@ <div v-if="useImage && imageLoaded" class="card-image" - :class="{ 'small-image': size === 'small' }" > <img :src="card.image"> </div> <div class="card-content"> - <span class="card-host faint">{{ card.provider_name }}</span> + <span class="card-host faint"> + <span + v-if="censored" + class="nsfw-alert alert warning" + >{{ $t('status.nsfw') }}</span> + {{ card.provider_name }} + </span> <h4 class="card-title">{{ card.title }}</h4> <p v-if="useDescription" @@ -50,10 +55,6 @@ } } - .small-image { - width: 80px; - } - .card-content { max-height: 100%; margin: 0.5em; @@ -76,6 +77,10 @@ max-height: calc(1.2em * 3 - 1px); } + .nsfw-alert { + margin: 2em 0; + } + color: $fallback--text; color: var(--text, $fallback--text); border-style: solid; diff --git a/src/components/login_form/login_form.js b/src/components/login_form/login_form.js index 0d8f1da6..638bd812 100644 --- a/src/components/login_form/login_form.js +++ b/src/components/login_form/login_form.js @@ -1,5 +1,13 @@ import { mapState, mapGetters, mapActions, mapMutations } from 'vuex' import oauthApi from '../../services/new_api/oauth.js' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faTimes +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faTimes +) const LoginForm = { data: () => ({ diff --git a/src/components/login_form/login_form.vue b/src/components/login_form/login_form.vue index b4fdcefb..bfabb946 100644 --- a/src/components/login_form/login_form.vue +++ b/src/components/login_form/login_form.vue @@ -61,7 +61,7 @@ <button :disabled="loggingIn" type="submit" - class="btn btn-default" + class="btn button-default" > {{ $t('login.login') }} </button> @@ -76,8 +76,9 @@ > <div class="alert error"> {{ error }} - <i - class="button-icon icon-cancel" + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="times" @click="clearError" /> </div> diff --git a/src/components/media_modal/media_modal.js b/src/components/media_modal/media_modal.js index 24764e80..e7384c93 100644 --- a/src/components/media_modal/media_modal.js +++ b/src/components/media_modal/media_modal.js @@ -3,6 +3,16 @@ import VideoAttachment from '../video_attachment/video_attachment.vue' import Modal from '../modal/modal.vue' import fileTypeService from '../../services/file_type/file_type.service.js' import GestureService from '../../services/gesture_service/gesture_service' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faChevronLeft, + faChevronRight +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faChevronLeft, + faChevronRight +) const MediaModal = { components: { diff --git a/src/components/media_modal/media_modal.vue b/src/components/media_modal/media_modal.vue index 46931667..ea7f7a7f 100644 --- a/src/components/media_modal/media_modal.vue +++ b/src/components/media_modal/media_modal.vue @@ -34,7 +34,10 @@ class="modal-view-button-arrow modal-view-button-arrow--prev" @click.stop.prevent="goPrev" > - <i class="icon-left-open arrow-icon" /> + <FAIcon + class="arrow-icon" + icon="chevron-left" + /> </button> <button v-if="canNavigate" @@ -42,7 +45,10 @@ class="modal-view-button-arrow modal-view-button-arrow--next" @click.stop.prevent="goNext" > - <i class="icon-right-open arrow-icon" /> + <FAIcon + class="arrow-icon" + icon="chevron-right" + /> </button> </Modal> </template> diff --git a/src/components/media_upload/media_upload.js b/src/components/media_upload/media_upload.js index 7b8a76cc..669d8190 100644 --- a/src/components/media_upload/media_upload.js +++ b/src/components/media_upload/media_upload.js @@ -2,6 +2,14 @@ import statusPosterService from '../../services/status_poster/status_poster.service.js' import fileSizeFormatService from '../../services/file_size_format/file_size_format.js' +import { library } from '@fortawesome/fontawesome-svg-core' +import { faUpload, faCircleNotch } from '@fortawesome/free-solid-svg-icons' + +library.add( + faUpload, + faCircleNotch +) + const mediaUpload = { data () { return { diff --git a/src/components/media_upload/media_upload.vue b/src/components/media_upload/media_upload.vue index c8865d77..e955aa72 100644 --- a/src/components/media_upload/media_upload.vue +++ b/src/components/media_upload/media_upload.vue @@ -1,30 +1,29 @@ <template> - <div + <label class="media-upload" :class="{ disabled: disabled }" + :title="$t('tool_tip.media_upload')" > - <label - class="label" - :title="$t('tool_tip.media_upload')" + <FAIcon + v-if="uploading" + class="progress-icon" + icon="circle-notch" + spin + /> + <FAIcon + v-if="!uploading" + class="new-icon" + icon="upload" + /> + <input + v-if="uploadReady" + :disabled="disabled" + type="file" + style="position: fixed; top: -100em" + multiple="true" + @change="change" > - <i - v-if="uploading" - class="progress-icon icon-spin4 animate-spin" - /> - <i - v-if="!uploading" - class="new-icon icon-upload" - /> - <input - v-if="uploadReady" - :disabled="disabled" - type="file" - style="position: fixed; top: -100em" - multiple="true" - @change="change" - > - </label> - </div> + </label> </template> <script src="./media_upload.js" ></script> @@ -33,22 +32,6 @@ @import '../../_variables.scss'; .media-upload { - .label { - display: inline-block; - } - - .new-icon { - cursor: pointer; - } - - .progress-icon { - display: inline-block; - line-height: 0; - &::before { - /* Overriding fontello to achieve the perfect speeeen */ - margin: 0; - line-height: 0; - } - } + cursor: pointer; } </style> diff --git a/src/components/mfa_form/recovery_form.js b/src/components/mfa_form/recovery_form.js index b25c65dd..01a62a50 100644 --- a/src/components/mfa_form/recovery_form.js +++ b/src/components/mfa_form/recovery_form.js @@ -1,5 +1,13 @@ import mfaApi from '../../services/new_api/mfa.js' import { mapState, mapGetters, mapActions, mapMutations } from 'vuex' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faTimes +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faTimes +) export default { data: () => ({ diff --git a/src/components/mfa_form/recovery_form.vue b/src/components/mfa_form/recovery_form.vue index 57294630..0bf68e27 100644 --- a/src/components/mfa_form/recovery_form.vue +++ b/src/components/mfa_form/recovery_form.vue @@ -23,23 +23,23 @@ <div class="form-group"> <div class="login-bottom"> <div> - <a - href="#" + <button + class="button-unstyled -link" @click.prevent="requireTOTP" > {{ $t('login.enter_two_factor_code') }} - </a> + </button> <br> - <a - href="#" + <button + class="button-unstyled -link" @click.prevent="abortMFA" > {{ $t('general.cancel') }} - </a> + </button> </div> <button type="submit" - class="btn btn-default" + class="btn button-default" > {{ $t('general.verify') }} </button> @@ -54,8 +54,9 @@ > <div class="alert error"> {{ error }} - <i - class="button-icon icon-cancel" + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="times" @click="clearError" /> </div> diff --git a/src/components/mfa_form/totp_form.js b/src/components/mfa_form/totp_form.js index b774f2d0..6ee823ed 100644 --- a/src/components/mfa_form/totp_form.js +++ b/src/components/mfa_form/totp_form.js @@ -1,5 +1,14 @@ import mfaApi from '../../services/new_api/mfa.js' import { mapState, mapGetters, mapActions, mapMutations } from 'vuex' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faTimes +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faTimes +) + export default { data: () => ({ code: null, diff --git a/src/components/mfa_form/totp_form.vue b/src/components/mfa_form/totp_form.vue index a344b395..79230148 100644 --- a/src/components/mfa_form/totp_form.vue +++ b/src/components/mfa_form/totp_form.vue @@ -25,23 +25,23 @@ <div class="form-group"> <div class="login-bottom"> <div> - <a - href="#" + <button + class="button-unstyled -link" @click.prevent="requireRecovery" > {{ $t('login.enter_recovery_code') }} - </a> + </button> <br> - <a - href="#" + <button + class="button-unstyled -link" @click.prevent="abortMFA" > {{ $t('general.cancel') }} - </a> + </button> </div> <button type="submit" - class="btn btn-default" + class="btn button-default" > {{ $t('general.verify') }} </button> @@ -56,8 +56,10 @@ > <div class="alert error"> {{ error }} - <i - class="button-icon icon-cancel" + <FAIcon + size="lg" + class="fa-scale-110 fa-old-padding" + icon="times" @click="clearError" /> </div> diff --git a/src/components/mobile_nav/mobile_nav.js b/src/components/mobile_nav/mobile_nav.js index b2b5d264..9e736cfb 100644 --- a/src/components/mobile_nav/mobile_nav.js +++ b/src/components/mobile_nav/mobile_nav.js @@ -3,6 +3,18 @@ import Notifications from '../notifications/notifications.vue' import { unseenNotificationsFromStore } from '../../services/notification_utils/notification_utils' import GestureService from '../../services/gesture_service/gesture_service' import { mapGetters } from 'vuex' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faTimes, + faBell, + faBars +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faTimes, + faBell, + faBars +) const MobileNav = { components: { diff --git a/src/components/mobile_nav/mobile_nav.vue b/src/components/mobile_nav/mobile_nav.vue index abd95f09..0f0ea457 100644 --- a/src/components/mobile_nav/mobile_nav.vue +++ b/src/components/mobile_nav/mobile_nav.vue @@ -1,49 +1,51 @@ <template> - <div> + <div + class="MobileNav" + > <nav id="nav" - class="nav-bar container" + class="mobile-nav" :class="{ 'mobile-hidden': isChat }" + @click="scrollToTop()" > - <div - class="mobile-inner-nav" - @click="scrollToTop()" - > - <div class="item"> - <a - href="#" - class="mobile-nav-button" - @click.stop.prevent="toggleMobileSidebar()" - > - <i class="button-icon icon-menu" /> - <div - v-if="unreadChatCount" - class="alert-dot" - /> - </a> - <router-link - v-if="!hideSitename" - class="site-name" - :to="{ name: 'root' }" - active-class="home" - > - {{ sitename }} - </router-link> - </div> - <div class="item right"> - <a - v-if="currentUser" - class="mobile-nav-button" - href="#" - @click.stop.prevent="openMobileNotifications()" - > - <i class="button-icon icon-bell-alt" /> - <div - v-if="unseenNotificationsCount" - class="alert-dot" - /> - </a> - </div> + <div class="item"> + <button + class="button-unstyled mobile-nav-button" + @click.stop.prevent="toggleMobileSidebar()" + > + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="bars" + /> + <div + v-if="unreadChatCount" + class="alert-dot" + /> + </button> + <router-link + v-if="!hideSitename" + class="site-name" + :to="{ name: 'root' }" + active-class="home" + > + {{ sitename }} + </router-link> + </div> + <div class="item right"> + <button + v-if="currentUser" + class="button-unstyled mobile-nav-button" + @click.stop.prevent="openMobileNotifications()" + > + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="bell" + /> + <div + v-if="unseenNotificationsCount" + class="alert-dot" + /> + </button> </div> </nav> <div @@ -59,7 +61,10 @@ class="mobile-nav-button" @click.stop.prevent="closeMobileNotifications()" > - <i class="button-icon icon-cancel" /> + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="times" + /> </a> </div> <div @@ -84,101 +89,124 @@ <style lang="scss"> @import '../../_variables.scss'; -.mobile-inner-nav { - width: 100%; - display: flex; - align-items: center; -} +.MobileNav { + .mobile-nav { + display: grid; + line-height: 50px; + height: 50px; + grid-template-rows: 50px; + grid-template-columns: 2fr auto; + width: 100%; + position: fixed; + box-sizing: border-box; + } -.mobile-nav-button { - display: flex; - justify-content: center; - width: 50px; - position: relative; - cursor: pointer; -} + .mobile-inner-nav { + width: 100%; + display: flex; + align-items: center; + } -.alert-dot { - border-radius: 100%; - height: 8px; - width: 8px; - position: absolute; - left: calc(50% - 4px); - top: calc(50% - 4px); - margin-left: 6px; - margin-top: -6px; - background-color: $fallback--cRed; - background-color: var(--badgeNotification, $fallback--cRed); -} + .mobile-nav-button { + display: inline-block; + text-align: center; + padding: 0 1em; + position: relative; + cursor: pointer; + } -.mobile-notifications-drawer { - width: 100%; - height: 100vh; - overflow-x: hidden; - position: fixed; - top: 0; - left: 0; - box-shadow: 1px 1px 4px rgba(0,0,0,.6); - box-shadow: var(--panelShadow); - transition-property: transform; - transition-duration: 0.25s; - transform: translateX(0); - z-index: 1001; - -webkit-overflow-scrolling: touch; - - &.closed { - transform: translateX(100%); + .site-name { + padding: 0 .3em; + display: inline-block; } -} -.mobile-notifications-header { - display: flex; - align-items: center; - justify-content: space-between; - z-index: 1; - width: 100%; - height: 50px; - line-height: 50px; - position: absolute; - color: var(--topBarText); - background-color: $fallback--fg; - background-color: var(--topBar, $fallback--fg); - box-shadow: 0px 0px 4px rgba(0,0,0,.6); - box-shadow: var(--topBarShadow); - - .title { - font-size: 1.3em; - margin-left: 0.6em; + .item { + /* moslty just to get rid of extra whitespaces */ + display: flex; } -} -.mobile-notifications { - margin-top: 50px; - width: 100vw; - height: calc(100vh - 50px); - overflow-x: hidden; - overflow-y: scroll; - - color: $fallback--text; - color: var(--text, $fallback--text); - background-color: $fallback--bg; - background-color: var(--bg, $fallback--bg); - - .notifications { - padding: 0; - border-radius: 0; - box-shadow: none; - .panel { - border-radius: 0; - margin: 0; - box-shadow: none; + .alert-dot { + border-radius: 100%; + height: 8px; + width: 8px; + position: absolute; + left: calc(50% - 4px); + top: calc(50% - 4px); + margin-left: 6px; + margin-top: -6px; + background-color: $fallback--cRed; + background-color: var(--badgeNotification, $fallback--cRed); + } + + .mobile-notifications-drawer { + width: 100%; + height: 100vh; + overflow-x: hidden; + position: fixed; + top: 0; + left: 0; + box-shadow: 1px 1px 4px rgba(0,0,0,.6); + box-shadow: var(--panelShadow); + transition-property: transform; + transition-duration: 0.25s; + transform: translateX(0); + z-index: 1001; + -webkit-overflow-scrolling: touch; + + &.closed { + transform: translateX(100%); } - .panel:after { - border-radius: 0; + } + + .mobile-notifications-header { + display: flex; + align-items: center; + justify-content: space-between; + z-index: 1; + width: 100%; + height: 50px; + line-height: 50px; + position: absolute; + color: var(--topBarText); + background-color: $fallback--fg; + background-color: var(--topBar, $fallback--fg); + box-shadow: 0px 0px 4px rgba(0,0,0,.6); + box-shadow: var(--topBarShadow); + + .title { + font-size: 1.3em; + margin-left: 0.6em; } - .panel .panel-heading { + } + + .mobile-notifications { + margin-top: 50px; + width: 100vw; + height: calc(100vh - 50px); + overflow-x: hidden; + overflow-y: scroll; + + color: $fallback--text; + color: var(--text, $fallback--text); + background-color: $fallback--bg; + background-color: var(--bg, $fallback--bg); + + .notifications { + padding: 0; border-radius: 0; box-shadow: none; + .panel { + border-radius: 0; + margin: 0; + box-shadow: none; + } + .panel:after { + border-radius: 0; + } + .panel .panel-heading { + border-radius: 0; + box-shadow: none; + } } } } diff --git a/src/components/mobile_post_status_button/mobile_post_status_button.js b/src/components/mobile_post_status_button/mobile_post_status_button.js index 6348277b..366ea89c 100644 --- a/src/components/mobile_post_status_button/mobile_post_status_button.js +++ b/src/components/mobile_post_status_button/mobile_post_status_button.js @@ -1,4 +1,12 @@ import { debounce } from 'lodash' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faPen +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faPen +) const HIDDEN_FOR_PAGES = new Set([ 'chats', diff --git a/src/components/mobile_post_status_button/mobile_post_status_button.vue b/src/components/mobile_post_status_button/mobile_post_status_button.vue index 9cf45de3..767f8244 100644 --- a/src/components/mobile_post_status_button/mobile_post_status_button.vue +++ b/src/components/mobile_post_status_button/mobile_post_status_button.vue @@ -1,11 +1,11 @@ <template> <div v-if="isLoggedIn"> <button - class="new-status-button" + class="button-default new-status-button" :class="{ 'hidden': isHidden }" @click="openPostForm" > - <i class="icon-edit" /> + <FAIcon icon="pen" /> </button> </div> </template> @@ -39,7 +39,7 @@ transform: translateY(150%); } - i { + svg { font-size: 1.5em; color: $fallback--text; color: var(--text, $fallback--text); diff --git a/src/components/moderation_tools/moderation_tools.vue b/src/components/moderation_tools/moderation_tools.vue index 60fa6ceb..5c7b82ec 100644 --- a/src/components/moderation_tools/moderation_tools.vue +++ b/src/components/moderation_tools/moderation_tools.vue @@ -12,13 +12,13 @@ <div class="dropdown-menu"> <span v-if="user.is_local"> <button - class="dropdown-item" + class="button-default dropdown-item" @click="toggleRight("admin")" > {{ $t(!!user.rights.admin ? 'user_card.admin_menu.revoke_admin' : 'user_card.admin_menu.grant_admin') }} </button> <button - class="dropdown-item" + class="button-default dropdown-item" @click="toggleRight("moderator")" > {{ $t(!!user.rights.moderator ? 'user_card.admin_menu.revoke_moderator' : 'user_card.admin_menu.grant_moderator') }} @@ -29,13 +29,13 @@ /> </span> <button - class="dropdown-item" + class="button-default dropdown-item" @click="toggleActivationStatus()" > {{ $t(!!user.deactivated ? 'user_card.admin_menu.activate_account' : 'user_card.admin_menu.deactivate_account') }} </button> <button - class="dropdown-item" + class="button-default dropdown-item" @click="deleteUserDialog(true)" > {{ $t('user_card.admin_menu.delete_account') }} @@ -47,7 +47,7 @@ /> <span v-if="hasTagPolicy"> <button - class="dropdown-item" + class="button-default dropdown-item" @click="toggleTag(tags.FORCE_NSFW)" > {{ $t('user_card.admin_menu.force_nsfw') }} @@ -57,7 +57,7 @@ /> </button> <button - class="dropdown-item" + class="button-default dropdown-item" @click="toggleTag(tags.STRIP_MEDIA)" > {{ $t('user_card.admin_menu.strip_media') }} @@ -67,7 +67,7 @@ /> </button> <button - class="dropdown-item" + class="button-default dropdown-item" @click="toggleTag(tags.FORCE_UNLISTED)" > {{ $t('user_card.admin_menu.force_unlisted') }} @@ -77,7 +77,7 @@ /> </button> <button - class="dropdown-item" + class="button-default dropdown-item" @click="toggleTag(tags.SANDBOX)" > {{ $t('user_card.admin_menu.sandbox') }} @@ -88,7 +88,7 @@ </button> <button v-if="user.is_local" - class="dropdown-item" + class="button-default dropdown-item" @click="toggleTag(tags.DISABLE_REMOTE_SUBSCRIPTION)" > {{ $t('user_card.admin_menu.disable_remote_subscription') }} @@ -99,7 +99,7 @@ </button> <button v-if="user.is_local" - class="dropdown-item" + class="button-default dropdown-item" @click="toggleTag(tags.DISABLE_ANY_SUBSCRIPTION)" > {{ $t('user_card.admin_menu.disable_any_subscription') }} @@ -110,7 +110,7 @@ </button> <button v-if="user.is_local" - class="dropdown-item" + class="button-default dropdown-item" @click="toggleTag(tags.QUARANTINE)" > {{ $t('user_card.admin_menu.quarantine') }} @@ -124,7 +124,7 @@ </div> <button slot="trigger" - class="btn btn-default btn-block" + class="btn button-default btn-block" :class="{ toggled }" > {{ $t('user_card.admin_menu.moderation') }} @@ -141,13 +141,13 @@ <p>{{ $t('user_card.admin_menu.delete_user_confirmation') }}</p> <template slot="footer"> <button - class="btn btn-default" + class="btn button-default" @click="deleteUserDialog(false)" > {{ $t('general.cancel') }} </button> <button - class="btn btn-default danger" + class="btn button-default danger" @click="deleteUser()" > {{ $t('user_card.admin_menu.delete_user') }} diff --git a/src/components/mute_card/mute_card.vue b/src/components/mute_card/mute_card.vue index 9611fb82..ca33c6c5 100644 --- a/src/components/mute_card/mute_card.vue +++ b/src/components/mute_card/mute_card.vue @@ -3,7 +3,7 @@ <div class="mute-card-content-container"> <button v-if="muted" - class="btn btn-default" + class="btn button-default" :disabled="progress" @click="unmuteUser" > @@ -16,7 +16,7 @@ </button> <button v-else - class="btn btn-default" + class="btn button-default" :disabled="progress" @click="muteUser" > diff --git a/src/components/nav_panel/nav_panel.js b/src/components/nav_panel/nav_panel.js index 623dfaec..81d49cc2 100644 --- a/src/components/nav_panel/nav_panel.js +++ b/src/components/nav_panel/nav_panel.js @@ -1,6 +1,29 @@ import { timelineNames } from '../timeline_menu/timeline_menu.js' import { mapState, mapGetters } from 'vuex' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faUsers, + faGlobe, + faBookmark, + faEnvelope, + faHome, + faComments, + faBell, + faInfoCircle +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faUsers, + faGlobe, + faBookmark, + faEnvelope, + faHome, + faComments, + faBell, + faInfoCircle +) + const NavPanel = { created () { if (this.currentUser && this.currentUser.locked) { diff --git a/src/components/nav_panel/nav_panel.vue b/src/components/nav_panel/nav_panel.vue index 4f944c95..0c83d0fe 100644 --- a/src/components/nav_panel/nav_panel.vue +++ b/src/components/nav_panel/nav_panel.vue @@ -1,5 +1,5 @@ <template> - <div class="nav-panel"> + <div class="NavPanel"> <div class="panel panel-default"> <ul> <li v-if="currentUser || !privateMode"> @@ -7,31 +7,47 @@ :to="{ name: timelinesRoute }" :class="onTimelineRoute && 'router-link-active'" > - <i class="button-icon icon-home-2" />{{ $t("nav.timelines") }} + <FAIcon + fixed-width + class="fa-scale-110" + icon="home" + />{{ $t("nav.timelines") }} </router-link> </li> <li v-if="currentUser"> <router-link :to="{ name: 'interactions', params: { username: currentUser.screen_name } }"> - <i class="button-icon icon-bell-alt" />{{ $t("nav.interactions") }} + <FAIcon + fixed-width + class="fa-scale-110" + icon="bell" + />{{ $t("nav.interactions") }} </router-link> </li> <li v-if="currentUser && pleromaChatMessagesAvailable"> <router-link :to="{ name: 'chats', params: { username: currentUser.screen_name } }"> <div v-if="unreadChatCount" - class="badge badge-notification unread-chat-count" + class="badge badge-notification" > {{ unreadChatCount }} </div> - <i class="button-icon icon-chat" />{{ $t("nav.chats") }} + <FAIcon + fixed-width + class="fa-scale-110" + icon="comments" + />{{ $t("nav.chats") }} </router-link> </li> <li v-if="currentUser && currentUser.locked"> <router-link :to="{ name: 'friend-requests' }"> - <i class="button-icon icon-user-plus" />{{ $t("nav.friend_requests") }} + <FAIcon + fixed-width + class="fa-scale-110" + icon="user-plus" + />{{ $t("nav.friend_requests") }} <span v-if="followRequestCount > 0" - class="badge follow-request-count" + class="badge badge-notification" > {{ followRequestCount }} </span> @@ -39,7 +55,11 @@ </li> <li> <router-link :to="{ name: 'about' }"> - <i class="button-icon icon-info-circled" />{{ $t("nav.about") }} + <FAIcon + fixed-width + class="fa-scale-110" + icon="info-circle" + />{{ $t("nav.about") }} </router-link> </li> </ul> @@ -52,84 +72,88 @@ <style lang="scss"> @import '../../_variables.scss'; -.nav-panel .panel { - overflow: hidden; - box-shadow: var(--panelShadow); -} -.nav-panel ul { - list-style: none; - margin: 0; - padding: 0; -} - -.follow-request-count { - margin: -6px 10px; - background-color: $fallback--bg; - background-color: var(--input, $fallback--faint); -} - -.nav-panel li { - border-bottom: 1px solid; - border-color: $fallback--border; - border-color: var(--border, $fallback--border); - padding: 0; - - &:first-child a { - border-top-right-radius: $fallback--panelRadius; - border-top-right-radius: var(--panelRadius, $fallback--panelRadius); - border-top-left-radius: $fallback--panelRadius; - border-top-left-radius: var(--panelRadius, $fallback--panelRadius); +.NavPanel { + .panel { + overflow: hidden; + box-shadow: var(--panelShadow); } - &:last-child a { - border-bottom-right-radius: $fallback--panelRadius; - border-bottom-right-radius: var(--panelRadius, $fallback--panelRadius); - border-bottom-left-radius: $fallback--panelRadius; - border-bottom-left-radius: var(--panelRadius, $fallback--panelRadius); + ul { + list-style: none; + margin: 0; + padding: 0; } -} -.nav-panel li:last-child { - border: none; -} + li { + position: relative; + border-bottom: 1px solid; + border-color: $fallback--border; + border-color: var(--border, $fallback--border); + padding: 0; -.nav-panel a { - display: block; - padding: 0.8em 0.85em; + &:first-child a { + border-top-right-radius: $fallback--panelRadius; + border-top-right-radius: var(--panelRadius, $fallback--panelRadius); + border-top-left-radius: $fallback--panelRadius; + border-top-left-radius: var(--panelRadius, $fallback--panelRadius); + } - &:hover { - background-color: $fallback--lightBg; - background-color: var(--selectedMenu, $fallback--lightBg); - color: $fallback--link; - color: var(--selectedMenuText, $fallback--link); - --faint: var(--selectedMenuFaintText, $fallback--faint); - --faintLink: var(--selectedMenuFaintLink, $fallback--faint); - --lightText: var(--selectedMenuLightText, $fallback--lightText); - --icon: var(--selectedMenuIcon, $fallback--icon); + &:last-child a { + border-bottom-right-radius: $fallback--panelRadius; + border-bottom-right-radius: var(--panelRadius, $fallback--panelRadius); + border-bottom-left-radius: $fallback--panelRadius; + border-bottom-left-radius: var(--panelRadius, $fallback--panelRadius); + } } - &.router-link-active { - font-weight: bolder; - background-color: $fallback--lightBg; - background-color: var(--selectedMenu, $fallback--lightBg); - color: $fallback--text; - color: var(--selectedMenuText, $fallback--text); - --faint: var(--selectedMenuFaintText, $fallback--faint); - --faintLink: var(--selectedMenuFaintLink, $fallback--faint); - --lightText: var(--selectedMenuLightText, $fallback--lightText); - --icon: var(--selectedMenuIcon, $fallback--icon); + li:last-child { + border: none; + } + + a { + display: block; + box-sizing: border-box; + align-items: stretch; + height: 3.5em; + line-height: 3.5em; + padding: 0 1em; &:hover { - text-decoration: underline; + background-color: $fallback--lightBg; + background-color: var(--selectedMenu, $fallback--lightBg); + color: $fallback--link; + color: var(--selectedMenuText, $fallback--link); + --faint: var(--selectedMenuFaintText, $fallback--faint); + --faintLink: var(--selectedMenuFaintLink, $fallback--faint); + --lightText: var(--selectedMenuLightText, $fallback--lightText); + --icon: var(--selectedMenuIcon, $fallback--icon); + } + + &.router-link-active { + font-weight: bolder; + background-color: $fallback--lightBg; + background-color: var(--selectedMenu, $fallback--lightBg); + color: $fallback--text; + color: var(--selectedMenuText, $fallback--text); + --faint: var(--selectedMenuFaintText, $fallback--faint); + --faintLink: var(--selectedMenuFaintLink, $fallback--faint); + --lightText: var(--selectedMenuLightText, $fallback--lightText); + --icon: var(--selectedMenuIcon, $fallback--icon); + + &:hover { + text-decoration: underline; + } } } -} -.nav-panel .button-icon { - margin-right: 0.5em; -} + .fa-scale-110 { + margin-right: 0.8em; + } -.nav-panel .button-icon:before { - width: 1.1em; + .badge { + position: absolute; + right: 0.6rem; + top: 1.25em; + } } </style> diff --git a/src/components/notification/notification.js b/src/components/notification/notification.js index bb906b50..4aa9affd 100644 --- a/src/components/notification/notification.js +++ b/src/components/notification/notification.js @@ -7,6 +7,28 @@ import Timeago from '../timeago/timeago.vue' import { isStatusNotification } from '../../services/notification_utils/notification_utils.js' import { highlightClass, highlightStyle } from '../../services/user_highlighter/user_highlighter.js' import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faCheck, + faTimes, + faStar, + faRetweet, + faUserPlus, + faEyeSlash, + faUser, + faSuitcaseRolling +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faCheck, + faTimes, + faStar, + faRetweet, + faUserPlus, + faUser, + faEyeSlash, + faSuitcaseRolling +) const Notification = { data () { diff --git a/src/components/notification/notification.scss b/src/components/notification/notification.scss index d0e63d81..f5905560 100644 --- a/src/components/notification/notification.scss +++ b/src/components/notification/notification.scss @@ -1,3 +1,5 @@ +@import '../../_variables.scss'; + // TODO Copypaste from Status, should unify it somehow .Notification { &.-muted { @@ -49,4 +51,34 @@ display: block; } } + + .type-icon { + margin: 0 0.1em; + } + + &.-type--repeat .type-icon { + color: $fallback--cGreen; + color: var(--cGreen, $fallback--cGreen); + } + + &.-type--follow .type-icon { + color: $fallback--cBlue; + color: var(--cBlue, $fallback--cBlue); + } + + &.-type--follow-request .type-icon { + color: $fallback--cBlue; + color: var(--cBlue, $fallback--cBlue); + } + + &.-type--like .type-icon { + color: orange; + color: $fallback--cOrange; + color: var(--cOrange, $fallback--cOrange); + } + + &.-type--move .type-icon { + color: $fallback--cBlue; + color: var(--cBlue, $fallback--cBlue); + } } diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue index 7fac3840..f56aa977 100644 --- a/src/components/notification/notification.vue +++ b/src/components/notification/notification.vue @@ -1,5 +1,5 @@ <template> - <status + <Status v-if="notification.type === 'mention'" :compact="true" :statusoid="notification.status" @@ -14,16 +14,20 @@ {{ notification.from_profile.screen_name }} </router-link> </small> - <a - href="#" - class="unmute" + <button + class="button-unstyled unmute" @click.prevent="toggleMute" - ><i class="button-icon icon-eye-off" /></a> + > + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="eye-slash" + /> + </button> </div> <div v-else - class="non-mention" - :class="[userClass, { highlighted: userStyle }]" + class="Notification non-mention" + :class="[userClass, { highlighted: userStyle }, '-type--' + notification.type]" :style="[ userStyle ]" > <a @@ -60,26 +64,39 @@ :title="'@'+notification.from_profile.screen_name" >{{ notification.from_profile.name }}</span> <span v-if="notification.type === 'like'"> - <i class="fa icon-star lit" /> + <FAIcon + class="type-icon" + icon="star" + /> <small>{{ $t('notifications.favorited_you') }}</small> </span> <span v-if="notification.type === 'repeat'"> - <i - class="fa icon-retweet lit" + <FAIcon + class="type-icon" + icon="retweet" :title="$t('tool_tip.repeat')" /> <small>{{ $t('notifications.repeated_you') }}</small> </span> <span v-if="notification.type === 'follow'"> - <i class="fa icon-user-plus lit" /> + <FAIcon + class="type-icon" + icon="user-plus" + /> <small>{{ $t('notifications.followed_you') }}</small> </span> <span v-if="notification.type === 'follow_request'"> - <i class="fa icon-user lit" /> + <FAIcon + class="type-icon" + icon="user" + /> <small>{{ $t('notifications.follow_request') }}</small> </span> <span v-if="notification.type === 'move'"> - <i class="fa icon-arrow-curved lit" /> + <FAIcon + class="type-icon" + icon="suitcase-rolling" + /> <small>{{ $t('notifications.migrated_to') }}</small> </span> <span v-if="notification.type === 'pleroma:emoji_reaction'"> @@ -116,11 +133,16 @@ /> </span> </div> - <a + <button v-if="needMute" - href="#" + class="button-unstyled" @click.prevent="toggleMute" - ><i class="button-icon icon-eye-off" /></a> + > + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="eye-slash" + /> + </button> </span> <div v-if="notification.type === 'follow' || notification.type === 'follow_request'" @@ -136,13 +158,15 @@ v-if="notification.type === 'follow_request'" style="white-space: nowrap;" > - <i - class="icon-ok button-icon follow-request-accept" + <FAIcon + icon="check" + class="fa-scale-110 fa-old-padding follow-request-accept" :title="$t('tool_tip.accept_follow_request')" @click="approveUser()" /> - <i - class="icon-cancel button-icon follow-request-reject" + <FAIcon + icon="times" + class="fa-scale-110 fa-old-padding follow-request-reject" :title="$t('tool_tip.reject_follow_request')" @click="denyUser()" /> diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js index d951e2a8..49258563 100644 --- a/src/components/notifications/notifications.js +++ b/src/components/notifications/notifications.js @@ -6,6 +6,13 @@ import { filteredNotificationsFromStore, unseenNotificationsFromStore } from '../../services/notification_utils/notification_utils.js' +import FaviconService from '../../services/favicon_service/favicon_service.js' +import { library } from '@fortawesome/fontawesome-svg-core' +import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' + +library.add( + faCircleNotch +) const DEFAULT_SEEN_TO_DISPLAY_COUNT = 30 @@ -69,8 +76,10 @@ const Notifications = { watch: { unseenCountTitle (count) { if (count > 0) { + FaviconService.drawFaviconBadge() this.$store.dispatch('setPageTitle', `(${count})`) } else { + FaviconService.clearFaviconBadge() this.$store.dispatch('setPageTitle', '') } } diff --git a/src/components/notifications/notifications.scss b/src/components/notifications/notifications.scss index c6b2a5b5..682ae127 100644 --- a/src/components/notifications/notifications.scss +++ b/src/components/notifications/notifications.scss @@ -158,37 +158,6 @@ margin-right: .2em; } - .icon-retweet.lit { - color: $fallback--cGreen; - color: var(--cGreen, $fallback--cGreen); - } - - .icon-user.lit { - color: $fallback--cBlue; - color: var(--cBlue, $fallback--cBlue); - } - - .icon-user-plus.lit { - color: $fallback--cBlue; - color: var(--cBlue, $fallback--cBlue); - } - - .icon-reply.lit { - color: $fallback--cBlue; - color: var(--cBlue, $fallback--cBlue); - } - - .icon-star.lit { - color: orange; - color: $fallback--cOrange; - color: var(--cOrange, $fallback--cOrange); - } - - .icon-arrow-curved.lit { - color: $fallback--cBlue; - color: var(--cBlue, $fallback--cBlue); - } - .status-content { margin: 0; max-height: 300px; diff --git a/src/components/notifications/notifications.vue b/src/components/notifications/notifications.vue index d477a41b..725d1ad4 100644 --- a/src/components/notifications/notifications.vue +++ b/src/components/notifications/notifications.vue @@ -15,16 +15,9 @@ class="badge badge-notification unseen-count" >{{ unseenCount }}</span> </div> - <div - v-if="error" - class="loadmore-error alert error" - @click.prevent - > - {{ $t('timeline.error_fetching') }} - </div> <button v-if="unseenCount" - class="read-button" + class="button-default read-button" @click.prevent="markAsSeen" > {{ $t('notifications.read') }} @@ -48,20 +41,24 @@ > {{ $t('notifications.no_more_notifications') }} </div> - <a + <button v-else-if="!loading" - href="#" + class="button-unstyled -link -fullwidth" @click.prevent="fetchOlderNotifications()" > <div class="new-status-notification text-center panel-footer"> {{ minimalMode ? $t('interactions.load_older') : $t('notifications.load_older') }} </div> - </a> + </button> <div v-else class="new-status-notification text-center panel-footer" > - <i class="icon-spin3 animate-spin" /> + <FAIcon + icon="circle-notch" + spin + size="lg" + /> </div> </div> </div> diff --git a/src/components/panel_loading/panel_loading.vue b/src/components/panel_loading/panel_loading.vue index 4efebb3c..d916d8a6 100644 --- a/src/components/panel_loading/panel_loading.vue +++ b/src/components/panel_loading/panel_loading.vue @@ -1,12 +1,27 @@ <template> <div class="panel-loading"> <span class="loading-text"> - <i class="icon-spin4 animate-spin" /> + <FAIcon + icon="circle-notch" + spin + size="3x" + /> {{ $t('general.loading') }} </span> </div> </template> +<script> +import { library } from '@fortawesome/fontawesome-svg-core' +import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' + +library.add( + faCircleNotch +) + +export default {} +</script> + <style lang="scss"> @import 'src/_variables.scss'; @@ -18,8 +33,7 @@ font-size: 2em; color: $fallback--text; color: var(--text, $fallback--text); - .loading-text i { - font-size: 3em; + .loading-text svg { line-height: 0; vertical-align: middle; color: $fallback--text; diff --git a/src/components/password_reset/password_reset.js b/src/components/password_reset/password_reset.js index 5d21d720..3d94f5e7 100644 --- a/src/components/password_reset/password_reset.js +++ b/src/components/password_reset/password_reset.js @@ -1,5 +1,13 @@ import { mapState } from 'vuex' import passwordResetApi from '../../services/new_api/password_reset.js' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faTimes +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faTimes +) const passwordReset = { data: () => ({ diff --git a/src/components/password_reset/password_reset.vue b/src/components/password_reset/password_reset.vue index 713c9dce..a931cb5a 100644 --- a/src/components/password_reset/password_reset.vue +++ b/src/components/password_reset/password_reset.vue @@ -51,7 +51,7 @@ <button :disabled="isPending" type="submit" - class="btn btn-default btn-block" + class="btn button-default btn-block" > {{ $t('general.submit') }} </button> @@ -63,10 +63,10 @@ > <span>{{ error }}</span> <a - class="button-icon dismiss" + class="fa-scale-110 fa-old-padding dismiss" @click.prevent="dismissError()" > - <i class="icon-cancel" /> + <FAIcon icon="times" /> </a> </p> </div> @@ -122,7 +122,7 @@ padding-right: 2rem; } - .icon-cancel { + .dismiss { cursor: pointer; } } diff --git a/src/components/poll/poll.vue b/src/components/poll/poll.vue index 5f54b416..42819c19 100644 --- a/src/components/poll/poll.vue +++ b/src/components/poll/poll.vue @@ -42,14 +42,15 @@ :value="index" > <label class="option-vote"> - <div>{{ option.title }}</div> + <!-- eslint-disable-next-line vue/no-v-html --> + <div v-html="option.title_html" /> </label> </div> </div> <div class="footer faint"> <button v-if="!showResults" - class="btn btn-default poll-vote-button" + class="btn button-default poll-vote-button" type="button" :disabled="isDisabled" @click="vote" diff --git a/src/components/poll/poll_form.js b/src/components/poll/poll_form.js index df93f038..1f8df3f9 100644 --- a/src/components/poll/poll_form.js +++ b/src/components/poll/poll_form.js @@ -1,5 +1,17 @@ import * as DateUtils from 'src/services/date_utils/date_utils.js' import { uniq } from 'lodash' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faTimes, + faChevronDown, + faPlus +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faTimes, + faChevronDown, + faPlus +) export default { name: 'PollForm', diff --git a/src/components/poll/poll_form.vue b/src/components/poll/poll_form.vue index d53f3837..09496105 100644 --- a/src/components/poll/poll_form.vue +++ b/src/components/poll/poll_form.vue @@ -12,6 +12,7 @@ <input :id="`poll-${index}`" v-model="options[index]" + size="1" class="poll-option-input" type="text" :placeholder="$t('polls.option')" @@ -20,24 +21,26 @@ @keydown.enter.stop.prevent="nextOption(index)" > </div> - <div + <button v-if="options.length > 2" - class="icon-container" + class="delete-option button-unstyled -hover-highlight" + @click="deleteOption(index)" > - <i - class="icon-cancel" - @click="deleteOption(index)" - /> - </div> + <FAIcon icon="times" /> + </button> </div> - <a + <button v-if="options.length < maxOptions" - class="add-option faint" + class="add-option faint button-unstyled -hover-highlight" @click="addOption" > - <i class="icon-plus" /> + <FAIcon + icon="plus" + size="sm" + /> + {{ $t("polls.add_option") }} - </a> + </button> <div class="poll-type-expiry"> <div class="poll-type" @@ -55,7 +58,10 @@ <option value="single">{{ $t('polls.single_choice') }}</option> <option value="multiple">{{ $t('polls.multiple_choices') }}</option> </select> - <i class="icon-down-open" /> + <FAIcon + class="select-down-icon" + icon="chevron-down" + /> </label> </div> <div @@ -83,7 +89,10 @@ {{ $t(`time.${unit}_short`, ['']) }} </option> </select> - <i class="icon-down-open" /> + <FAIcon + class="select-down-icon" + icon="chevron-down" + /> </label> </div> </div> @@ -103,7 +112,7 @@ .add-option { align-self: flex-start; padding-top: 0.25em; - cursor: pointer; + padding-left: 0.1em; } .poll-option { @@ -122,10 +131,10 @@ } } - .icon-container { + .delete-option { // Hack: Move the icon over the input box - width: 2em; - margin-left: -2em; + width: 1.5em; + margin-left: -1.5em; z-index: 1; } diff --git a/src/components/popover/popover.js b/src/components/popover/popover.js index 695f73b9..5e417fa0 100644 --- a/src/components/popover/popover.js +++ b/src/components/popover/popover.js @@ -21,7 +21,10 @@ const Popover = { // Replaces the classes you may want for the popover container. // Use 'popover-default' in addition to get the default popover // styles with your custom class. - popoverClass: String + popoverClass: String, + // If true, subtract padding when calculating position for the popover, + // use it when popover offset looks to be different on top vs bottom. + removePadding: Boolean }, data () { return { @@ -96,9 +99,15 @@ const Popover = { if (origin.y + content.offsetHeight > yBounds.max) usingTop = true if (origin.y - content.offsetHeight < yBounds.min) usingTop = false + let vPadding = 0 + if (this.removePadding && usingTop) { + const anchorStyle = getComputedStyle(anchorEl) + vPadding = parseFloat(anchorStyle.paddingTop) + parseFloat(anchorStyle.paddingBottom) + } + const yOffset = (this.offset && this.offset.y) || 0 const translateY = usingTop - ? -anchorEl.offsetHeight - yOffset - content.offsetHeight + ? -anchorEl.offsetHeight + vPadding - yOffset - content.offsetHeight : yOffset const xOffset = (this.offset && this.offset.x) || 0 diff --git a/src/components/popover/popover.vue b/src/components/popover/popover.vue index 5c99c509..2252c68f 100644 --- a/src/components/popover/popover.vue +++ b/src/components/popover/popover.vue @@ -3,12 +3,13 @@ @mouseenter="onMouseenter" @mouseleave="onMouseleave" > - <div + <button ref="trigger" + class="button-unstyled -fullwidth popover-trigger-button" @click="onClick" > <slot name="trigger" /> - </div> + </button> <div v-if="!hidden" ref="content" @@ -27,9 +28,13 @@ <script src="./popover.js" /> -<style lang=scss> +<style lang="scss"> @import '../../_variables.scss'; +.popover-trigger-button { + display: block; +} + .popover { z-index: 8; position: absolute; @@ -90,13 +95,14 @@ box-shadow: none; width: 100%; height: 100%; + box-sizing: border-box; --btnText: var(--popoverText, $fallback--text); &-icon { padding-left: 0.5rem; - i { + svg { margin-right: 0.25rem; color: var(--menuPopoverIcon, $fallback--icon) } @@ -111,7 +117,7 @@ --faintLink: var(--selectedMenuPopoverFaintLink, $fallback--faint); --lightText: var(--selectedMenuPopoverLightText, $fallback--lightText); --icon: var(--selectedMenuPopoverIcon, $fallback--icon); - i { + svg { color: var(--selectedMenuPopoverIcon, $fallback--icon); } } diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index ad149506..4148381c 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -12,6 +12,27 @@ import suggestor from '../emoji_input/suggestor.js' import { mapGetters, mapState } from 'vuex' import Checkbox from '../checkbox/checkbox.vue' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faChevronDown, + faSmileBeam, + faPollH, + faUpload, + faBan, + faTimes, + faCircleNotch +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faChevronDown, + faSmileBeam, + faPollH, + faUpload, + faBan, + faTimes, + faCircleNotch +) + const buildMentionsString = ({ user, attentions = [] }, currentUser) => { let allAttentions = [...attentions] @@ -54,7 +75,8 @@ const PostStatusForm = { 'autoFocus', 'fileLimit', 'submitOnEnter', - 'emojiPickerPlacement' + 'emojiPickerPlacement', + 'optimisticPosting' ], components: { MediaUpload, @@ -137,8 +159,7 @@ const PostStatusForm = { ...this.$store.state.instance.emoji, ...this.$store.state.instance.customEmoji ], - users: this.$store.state.users.users, - updateUsersList: (query) => this.$store.dispatch('searchUsers', { query }) + store: this.$store }) }, emojiSuggestor () { @@ -251,7 +272,7 @@ const PostStatusForm = { if (this.preview) this.previewStatus() }, async postStatus (event, newStatus, opts = {}) { - if (this.posting) { return } + if (this.posting && !this.optimisticPosting) { return } if (this.disableSubmit) { return } if (this.emojiInputShown) { return } if (this.submitOnEnter) { @@ -259,6 +280,8 @@ const PostStatusForm = { event.preventDefault() } + if (this.optimisticPosting && (this.emptyStatus || this.isOverLengthLimit)) { return } + if (this.emptyStatus) { this.error = this.$t('post_status.empty_status_error') return @@ -507,7 +530,7 @@ const PostStatusForm = { !(isFormBiggerThanScroller && this.$refs.textarea.selectionStart !== this.$refs.textarea.value.length) const totalDelta = shouldScrollToBottom ? bottomChangeDelta : 0 - const targetScroll = currentScroll + totalDelta + const targetScroll = Math.round(currentScroll + totalDelta) if (scrollerRef === window) { scrollerRef.scroll(0, targetScroll) diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index d67d9ae9..73f6a4f1 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -12,10 +12,11 @@ v-show="showDropIcon !== 'hide'" :style="{ animation: showDropIcon === 'show' ? 'fade-in 0.25s' : 'fade-out 0.5s' }" class="drop-indicator" - :class="[uploadFileLimitReached ? 'icon-block' : 'icon-upload']" @dragleave="fileDragStop" @drop.stop="fileDrop" - /> + > + <FAIcon :icon="uploadFileLimitReached ? 'ban' : 'upload'" /> + </div> <div class="form-group"> <i18n v-if="!$store.state.users.currentUser.locked && newStatus.visibility == 'private' && !disableLockWarning" @@ -23,12 +24,12 @@ tag="p" class="visibility-notice" > - <a - href="#" + <button + class="button-unstyled -link" @click="openProfileTab" > {{ $t('post_status.account_not_locked_warning_link') }} - </a> + </button> </i18n> <p v-if="!hideScopeNotice && newStatus.visibility === 'public'" @@ -36,10 +37,10 @@ > <span>{{ $t('post_status.scope_notice.public') }}</span> <a - class="button-icon dismiss" + class="fa-scale-110 fa-old-padding dismiss" @click.prevent="dismissScopeNotice()" > - <i class="icon-cancel" /> + <FAIcon icon="times" /> </a> </p> <p @@ -48,10 +49,10 @@ > <span>{{ $t('post_status.scope_notice.unlisted') }}</span> <a - class="button-icon dismiss" + class="fa-scale-110 fa-old-padding dismiss" @click.prevent="dismissScopeNotice()" > - <i class="icon-cancel" /> + <FAIcon icon="times" /> </a> </p> <p @@ -60,10 +61,10 @@ > <span>{{ $t('post_status.scope_notice.private') }}</span> <a - class="button-icon dismiss" + class="fa-scale-110 fa-old-padding dismiss" @click.prevent="dismissScopeNotice()" > - <i class="icon-cancel" /> + <FAIcon icon="times" /> </a> </p> <p @@ -82,12 +83,18 @@ @click.stop.prevent="togglePreview" > {{ $t('post_status.preview') }} - <i :class="showPreview ? 'icon-left-open' : 'icon-right-open'" /> + <FAIcon :icon="showPreview ? 'chevron-left' : 'chevron-right'" /> </a> - <i + <div v-show="previewLoading" - class="icon-spin3 animate-spin" - /> + class="preview-spinner" + > + <FAIcon + class="fa-old-padding" + spin + icon="circle-notch" + /> + </div> </div> <div v-if="showPreview" @@ -122,7 +129,8 @@ v-model="newStatus.spoilerText" type="text" :placeholder="$t('post_status.content_warning')" - :disabled="posting" + :disabled="posting && !optimisticPosting" + size="1" class="form-post-subject" > </EmojiInput> @@ -147,7 +155,7 @@ :placeholder="placeholder || $t('post_status.default')" rows="1" cols="1" - :disabled="posting" + :disabled="posting && !optimisticPosting" class="form-post-body" :class="{ 'scrollable-form': !!maxHeight }" @keydown.exact.enter="submitOnEnter && postStatus($event, newStatus)" @@ -198,7 +206,10 @@ {{ $t(`post_status.content_type["${postFormat}"]`) }} </option> </select> - <i class="icon-down-open" /> + <FAIcon + class="select-down-icon" + icon="chevron-down" + /> </label> </div> <div @@ -232,38 +243,34 @@ @upload-failed="uploadFailed" @all-uploaded="finishedUploadingFiles" /> - <div - class="emoji-icon" + <button + class="emoji-icon button-unstyled" + :title="$t('emoji.add_emoji')" + @click="showEmojiPicker" > - <i - :title="$t('emoji.add_emoji')" - class="icon-smile btn btn-default" - @click="showEmojiPicker" - /> - </div> - <div + <FAIcon icon="smile-beam" /> + </button> + <button v-if="pollsAvailable" - class="poll-icon" + class="poll-icon button-unstyled" :class="{ selected: pollFormVisible }" + :title="$t('polls.add_poll')" + @click="togglePollForm" > - <i - :title="$t('polls.add_poll')" - class="icon-chart-bar btn btn-default" - @click="togglePollForm" - /> - </div> + <FAIcon icon="poll-h" /> + </button> </div> <button v-if="posting" disabled - class="btn btn-default" + class="btn button-default" > {{ $t('post_status.posting') }} </button> <button v-else-if="isOverLengthLimit" disabled - class="btn btn-default" + class="btn button-default" > {{ $t('general.submit') }} </button> @@ -271,7 +278,7 @@ <button v-else :disabled="uploadingFiles || disableSubmit" - class="btn btn-default" + class="btn button-default" @touchstart.stop.prevent="postStatus($event, newStatus)" @click.stop.prevent="postStatus($event, newStatus)" > @@ -283,8 +290,9 @@ class="alert error" > Error: {{ error }} - <i - class="button-icon icon-cancel" + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="times" @click="clearError" /> </div> @@ -294,10 +302,12 @@ :key="file.url" class="media-upload-wrapper" > - <i - class="fa button-icon icon-cancel" + <button + class="button-unstyled hider" @click="removeMediaFile(file)" - /> + > + <FAIcon icon="times" /> + </button> <attachment :attachment="file" :set-media="() => $store.dispatch('setMedia', newStatus.files)" @@ -375,24 +385,19 @@ } .preview-heading { - padding-left: 0.5em; display: flex; - width: 100%; - - .icon-spin3 { - margin-left: auto; - } + padding-left: 0.5em; } .preview-toggle { - display: flex; + flex: 1; cursor: pointer; user-select: none; &:hover { text-decoration: underline; } - i { + svg, i { margin-left: 0.2em; font-size: 0.8em; transform: rotate(90deg); @@ -434,18 +439,20 @@ .media-upload-icon, .poll-icon, .emoji-icon { font-size: 26px; + line-height: 1.1; flex: 1; + padding: 0 0.1em; &.selected, &:hover { // needs to be specific to override icon default color - i, label { + svg, i, label { color: $fallback--lightText; color: var(--lightText, $fallback--lightText); } } &.disabled { - i { + svg, i { cursor: not-allowed; color: $fallback--icon; color: var(--btnDisabledText, $fallback--icon); @@ -474,7 +481,7 @@ text-align: right; } - .icon-chart-bar { + .poll-icon { cursor: pointer; } @@ -487,19 +494,6 @@ margin-bottom: .5em; width: 18em; - .icon-cancel { - display: inline-block; - position: static; - margin: 0; - padding-bottom: 0; - margin-left: $fallback--attachmentRadius; - margin-left: var(--attachmentRadius, $fallback--attachmentRadius); - background-color: $fallback--fg; - background-color: var(--btn, $fallback--fg); - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - } - img, video { object-fit: contain; max-height: 10em; @@ -522,23 +516,12 @@ flex-direction: column; } - .media-upload-wrapper .attachments { - padding: 0 0.5em; + .attachments .media-upload-wrapper { + position: relative; .attachment { margin: 0; padding: 0; - position: relative; - } - - i { - position: absolute; - margin: 10px; - padding: 5px; - background: rgba(230,230,230,0.6); - border-radius: $fallback--attachmentRadius; - border-radius: var(--attachmentRadius, $fallback--attachmentRadius); - font-weight: bold; } } @@ -612,11 +595,6 @@ cursor: not-allowed; } - .icon-cancel { - cursor: pointer; - z-index: 4; - } - @keyframes fade-in { from { opacity: 0; } to { opacity: 0.6; } diff --git a/src/components/react_button/react_button.js b/src/components/react_button/react_button.js index dd71e546..5e7b7580 100644 --- a/src/components/react_button/react_button.js +++ b/src/components/react_button/react_button.js @@ -1,4 +1,8 @@ import Popover from '../popover/popover.vue' +import { library } from '@fortawesome/fontawesome-svg-core' +import { faSmileBeam } from '@fortawesome/free-regular-svg-icons' + +library.add(faSmileBeam) const ReactButton = { props: ['status'], @@ -23,13 +27,21 @@ const ReactButton = { }, computed: { commonEmojis () { - return ['👍', '😠', '👀', '😂', '🔥'] + return [ + { displayText: 'thumbsup', replacement: '👍' }, + { displayText: 'angry', replacement: '😠' }, + { displayText: 'eyes', replacement: '👀' }, + { displayText: 'joy', replacement: '😂' }, + { displayText: 'fire', replacement: '🔥' } + ] }, emojis () { if (this.filterWord !== '') { const filterWordLowercase = this.filterWord.toLowerCase() let orderedEmojiList = [] for (const emoji of this.$store.state.instance.emoji) { + if (emoji.replacement === this.filterWord) return [emoji] + const indexOfFilterWord = emoji.displayText.toLowerCase().indexOf(filterWordLowercase) if (indexOfFilterWord > -1) { if (!Array.isArray(orderedEmojiList[indexOfFilterWord])) { diff --git a/src/components/react_button/react_button.vue b/src/components/react_button/react_button.vue index 0b34add1..ac940b98 100644 --- a/src/components/react_button/react_button.vue +++ b/src/components/react_button/react_button.vue @@ -3,7 +3,8 @@ trigger="click" placement="top" :offset="{ y: 5 }" - class="react-button-popover" + :bound-to="{ x: 'container' }" + remove-padding > <div slot="content" @@ -12,23 +13,26 @@ <div class="reaction-picker-filter"> <input v-model="filterWord" + size="1" :placeholder="$t('emoji.search_emoji')" > </div> <div class="reaction-picker"> <span v-for="emoji in commonEmojis" - :key="emoji" + :key="emoji.replacement" class="emoji-button" - @click="addReaction($event, emoji, close)" + :title="emoji.displayText" + @click="addReaction($event, emoji.replacement, close)" > - {{ emoji }} + {{ emoji.replacement }} </span> <div class="reaction-picker-divider" /> <span v-for="(emoji, key) in emojis" :key="key" class="emoji-button" + :title="emoji.displayText" @click="addReaction($event, emoji.replacement, close)" > {{ emoji.replacement }} @@ -36,11 +40,16 @@ <div class="reaction-bottom-fader" /> </div> </div> - <i + <span slot="trigger" - class="icon-smile button-icon add-reaction-button" + class="ReactButton" :title="$t('tool_tip.add_reaction')" - /> + > + <FAIcon + class="fa-scale-110 fa-old-padding" + :icon="['far', 'smile-beam']" + /> + </span> </Popover> </template> @@ -98,10 +107,11 @@ } } -.add-reaction-button { - cursor: pointer; +.ReactButton { + padding: 10px; + margin: -10px; - &:hover { + &:hover .svg-inline--fa { color: $fallback--text; color: var(--text, $fallback--text); } diff --git a/src/components/registration/registration.vue b/src/components/registration/registration.vue index a83ca1e5..100df0d6 100644 --- a/src/components/registration/registration.vue +++ b/src/components/registration/registration.vue @@ -211,7 +211,7 @@ <button :disabled="isPending" type="submit" - class="btn btn-default" + class="btn button-default" > {{ $t('general.submit') }} </button> diff --git a/src/components/remote_follow/remote_follow.vue b/src/components/remote_follow/remote_follow.vue index cb1c2a1b..be827400 100644 --- a/src/components/remote_follow/remote_follow.vue +++ b/src/components/remote_follow/remote_follow.vue @@ -16,7 +16,7 @@ > <button click="submit" - class="remote-button" + class="button-default remote-button" > {{ $t('user_card.remote_follow') }} </button> diff --git a/src/components/reply_button/reply_button.js b/src/components/reply_button/reply_button.js index 22957650..c7bd2a2b 100644 --- a/src/components/reply_button/reply_button.js +++ b/src/components/reply_button/reply_button.js @@ -1,3 +1,7 @@ +import { library } from '@fortawesome/fontawesome-svg-core' +import { faReply } from '@fortawesome/free-solid-svg-icons' + +library.add(faReply) const ReplyButton = { name: 'ReplyButton', diff --git a/src/components/reply_button/reply_button.vue b/src/components/reply_button/reply_button.vue index b2904b5c..c17041da 100644 --- a/src/components/reply_button/reply_button.vue +++ b/src/components/reply_button/reply_button.vue @@ -1,21 +1,58 @@ <template> - <div> - <i + <div class="ReplyButton"> + <button v-if="loggedIn" - class="button-icon button-reply icon-reply" - :title="$t('tool_tip.reply')" + class="button-unstyled interactive" :class="{'-active': replying}" - @click.prevent="$emit('toggle')" - /> - <i - v-else - class="button-icon button-reply -disabled icon-reply" :title="$t('tool_tip.reply')" - /> - <span v-if="status.replies_count > 0"> + @click.prevent="$emit('toggle')" + > + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="reply" + /> + </button> + <span v-else> + <FAIcon + icon="reply" + class="fa-scale-110 fa-old-padding" + :title="$t('tool_tip.reply')" + /> + </span> + <span + v-if="status.replies_count > 0" + class="action-counter" + > {{ status.replies_count }} </span> </div> </template> <script src="./reply_button.js"></script> + +<style lang="scss"> +@import '../../_variables.scss'; + +.ReplyButton { + display: flex; + + > :first-child { + padding: 10px; + margin: -10px -8px -10px -10px; + } + + .action-counter { + pointer-events: none; + user-select: none; + } + + .interactive { + &:hover .svg-inline--fa, + &.-active .svg-inline--fa { + color: $fallback--cBlue; + color: var(--cBlue, $fallback--cBlue); + } + } + +} +</style> diff --git a/src/components/retweet_button/retweet_button.js b/src/components/retweet_button/retweet_button.js index 5a41f22d..2103fd0b 100644 --- a/src/components/retweet_button/retweet_button.js +++ b/src/components/retweet_button/retweet_button.js @@ -1,3 +1,7 @@ +import { library } from '@fortawesome/fontawesome-svg-core' +import { faRetweet } from '@fortawesome/free-solid-svg-icons' + +library.add(faRetweet) const RetweetButton = { props: ['status', 'loggedIn', 'visibility'], @@ -20,13 +24,6 @@ const RetweetButton = { } }, computed: { - classes () { - return { - 'retweeted': this.status.repeated, - 'retweeted-empty': !this.status.repeated, - 'animate-spin': this.animated - } - }, mergedConfig () { return this.$store.getters.mergedConfig } diff --git a/src/components/retweet_button/retweet_button.vue b/src/components/retweet_button/retweet_button.vue index 074f7747..859ce499 100644 --- a/src/components/retweet_button/retweet_button.vue +++ b/src/components/retweet_button/retweet_button.vue @@ -1,29 +1,38 @@ <template> - <div v-if="loggedIn"> - <template v-if="visibility !== 'private' && visibility !== 'direct'"> - <i - :class="classes" - class="button-icon retweet-button icon-retweet rt-active" - :title="$t('tool_tip.repeat')" - @click.prevent="retweet()" + <div class="RetweetButton"> + <button + v-if="visibility !== 'private' && visibility !== 'direct' && loggedIn" + class="button-unstyled interactive" + :class="status.repeated && '-repeated'" + :title="$t('tool_tip.repeat')" + @click.prevent="retweet()" + > + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="retweet" + :spin="animated" /> - <span v-if="!mergedConfig.hidePostStats && status.repeat_num > 0">{{ status.repeat_num }}</span> - </template> - <template v-else> - <i - :class="classes" - class="button-icon icon-lock" + </button> + <span v-else-if="loggedIn"> + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="lock" :title="$t('timeline.no_retweet_hint')" /> - </template> - </div> - <div v-else-if="!loggedIn"> - <i - :class="classes" - class="button-icon icon-retweet" - :title="$t('tool_tip.repeat')" - /> - <span v-if="!mergedConfig.hidePostStats && status.repeat_num > 0">{{ status.repeat_num }}</span> + </span> + <span v-else> + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="retweet" + :title="$t('tool_tip.repeat')" + /> + </span> + <span + v-if="!mergedConfig.hidePostStats && status.repeat_num > 0" + class="no-event" + > + {{ status.repeat_num }} + </span> </div> </template> @@ -31,16 +40,30 @@ <style lang="scss"> @import '../../_variables.scss'; -.rt-active { - cursor: pointer; - animation-duration: 0.6s; - &:hover { - color: $fallback--cGreen; - color: var(--cGreen, $fallback--cGreen); + +.RetweetButton { + display: flex; + + > :first-child { + padding: 10px; + margin: -10px -8px -10px -10px; + } + + .action-counter { + pointer-events: none; + user-select: none; + } + + .interactive { + .svg-inline--fa { + animation-duration: 0.6s; + } + + &:hover .svg-inline--fa, + &.-repeated .svg-inline--fa { + color: $fallback--cGreen; + color: var(--cGreen, $fallback--cGreen); + } } -} -.icon-retweet.retweeted { - color: $fallback--cGreen; - color: var(--cGreen, $fallback--cGreen); } </style> diff --git a/src/components/scope_selector/scope_selector.js b/src/components/scope_selector/scope_selector.js index e9ccdefc..74bf7284 100644 --- a/src/components/scope_selector/scope_selector.js +++ b/src/components/scope_selector/scope_selector.js @@ -1,3 +1,18 @@ +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faEnvelope, + faLock, + faLockOpen, + faGlobe +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faEnvelope, + faGlobe, + faLock, + faLockOpen +) + const ScopeSelector = { props: [ 'showAll', diff --git a/src/components/scope_selector/scope_selector.vue b/src/components/scope_selector/scope_selector.vue index 291236f2..66ac612e 100644 --- a/src/components/scope_selector/scope_selector.vue +++ b/src/components/scope_selector/scope_selector.vue @@ -1,36 +1,56 @@ <template> <div v-if="!showNothing" - class="scope-selector" + class="ScopeSelector" > - <i + <button v-if="showDirect" - class="icon-mail-alt" + class="button-unstyled scope" :class="css.direct" :title="$t('post_status.scope.direct')" @click="changeVis('direct')" - /> - <i + > + <FAIcon + icon="envelope" + class="fa-scale-110 fa-old-padding" + /> + </button> + <button v-if="showPrivate" - class="icon-lock" + class="button-unstyled scope" :class="css.private" :title="$t('post_status.scope.private')" @click="changeVis('private')" - /> - <i + > + <FAIcon + icon="lock" + class="fa-scale-110 fa-old-padding" + /> + </button> + <button v-if="showUnlisted" - class="icon-lock-open-alt" + class="button-unstyled scope" :class="css.unlisted" :title="$t('post_status.scope.unlisted')" @click="changeVis('unlisted')" - /> - <i + > + <FAIcon + icon="lock-open" + class="fa-scale-110 fa-old-padding" + /> + </button> + <button v-if="showPublic" - class="icon-globe" + class="button-unstyled scope" :class="css.public" :title="$t('post_status.scope.public')" @click="changeVis('public')" - /> + > + <FAIcon + icon="globe" + class="fa-scale-110 fa-old-padding" + /> + </button> </div> </template> @@ -39,12 +59,16 @@ <style lang="scss"> @import '../../_variables.scss'; -.scope-selector { - i { - font-size: 1.2em; +.ScopeSelector { + + .scope { + display: inline-block; cursor: pointer; + min-width: 1.3em; + min-height: 1.3em; + text-align: center; - &.selected { + &.selected svg { color: $fallback--lightText; color: var(--lightText, $fallback--lightText); } diff --git a/src/components/search/search.js b/src/components/search/search.js index 8e903052..b62bc2c5 100644 --- a/src/components/search/search.js +++ b/src/components/search/search.js @@ -2,6 +2,16 @@ import FollowCard from '../follow_card/follow_card.vue' import Conversation from '../conversation/conversation.vue' import Status from '../status/status.vue' import map from 'lodash/map' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faCircleNotch, + faSearch +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faCircleNotch, + faSearch +) const Search = { components: { diff --git a/src/components/search/search.vue b/src/components/search/search.vue index 746bbaa2..a6503c9f 100644 --- a/src/components/search/search.vue +++ b/src/components/search/search.vue @@ -14,17 +14,21 @@ @keyup.enter="newQuery(searchTerm)" > <button - class="btn search-button" + class="btn button-default search-button" @click="newQuery(searchTerm)" > - <i class="icon-search" /> + <FAIcon icon="search" /> </button> </div> <div v-if="loading" class="text-center loading-icon" > - <i class="icon-spin3 animate-spin" /> + <FAIcon + icon="circle-notch" + spin + size="lg" + /> </div> <div v-else-if="loaded"> <div class="search-nav-heading"> diff --git a/src/components/search_bar/search_bar.js b/src/components/search_bar/search_bar.js index d7d85676..551649c7 100644 --- a/src/components/search_bar/search_bar.js +++ b/src/components/search_bar/search_bar.js @@ -1,9 +1,19 @@ +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faTimes, + faSearch +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faTimes, + faSearch +) + const SearchBar = { data: () => ({ searchTerm: undefined, hidden: true, - error: false, - loading: false + error: false }), watch: { '$route': function (route) { diff --git a/src/components/search_bar/search_bar.vue b/src/components/search_bar/search_bar.vue index 4d5a1aec..6cf9179e 100644 --- a/src/components/search_bar/search_bar.vue +++ b/src/components/search_bar/search_bar.vue @@ -1,40 +1,50 @@ <template> - <div> - <div class="search-bar-container"> - <i - v-if="loading" - class="icon-spin4 finder-icon animate-spin-slow" + <div + class="SearchBar" + :class="{ '-expanded': !hidden }" + > + <button + v-if="hidden" + class="button-unstyled nav-icon" + :title="$t('nav.search')" + @click.prevent.stop="toggleHidden" + > + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding" + icon="search" /> - <a - v-if="hidden" - href="#" - :title="$t('nav.search')" - ><i - class="button-icon icon-search" + </button> + <template v-else> + <input + id="search-bar-input" + ref="searchInput" + v-model="searchTerm" + class="search-bar-input" + :placeholder="$t('nav.search')" + type="text" + @keyup.enter="find(searchTerm)" + > + <button + class="button-default search-button" + @click="find(searchTerm)" + > + <FAIcon + fixed-width + icon="search" + /> + </button> + <button + class="button-unstyled cancel-search" @click.prevent.stop="toggleHidden" - /></a> - <template v-else> - <input - id="search-bar-input" - ref="searchInput" - v-model="searchTerm" - class="search-bar-input" - :placeholder="$t('nav.search')" - type="text" - @keyup.enter="find(searchTerm)" - > - <button - class="btn search-button" - @click="find(searchTerm)" - > - <i class="icon-search" /> - </button> - <i - class="button-icon icon-cancel" - @click.prevent.stop="toggleHidden" + > + <FAIcon + fixed-width + icon="times" + class="cancel-icon fa-scale-110 fa-old-padding" /> - </template> - </div> + </button> + </template> </div> </template> @@ -43,30 +53,32 @@ <style lang="scss"> @import '../../_variables.scss'; -.search-bar-container { - max-width: 100%; +.SearchBar { display: inline-flex; align-items: baseline; vertical-align: baseline; justify-content: flex-end; + &.-expanded { + width: 100%; + } + .search-bar-input, .search-button { height: 29px; } .search-bar-input { - // TODO: do this properly without a rough guesstimate of 2 icons + paddings - max-width: calc(100% - 30px - 30px - 20px); + flex: 1 0 auto; } - .search-button { - margin-left: .5em; - margin-right: .5em; + .cancel-search { + height: 50px; } - .icon-cancel { - cursor: pointer; + .cancel-icon { + color: $fallback--text; + color: var(--btnTopBarText, $fallback--text); } } diff --git a/src/components/settings_modal/settings_modal.vue b/src/components/settings_modal/settings_modal.vue index 6bc64ed0..552ca41f 100644 --- a/src/components/settings_modal/settings_modal.vue +++ b/src/components/settings_modal/settings_modal.vue @@ -30,13 +30,13 @@ </template> </transition> <button - class="btn" + class="btn button-default" @click="peekModal" > {{ $t('general.peek') }} </button> <button - class="btn" + class="btn button-default" @click="closeModal" > {{ $t('general.close') }} diff --git a/src/components/settings_modal/settings_modal_content.js b/src/components/settings_modal/settings_modal_content.js index ef1a5ffa..9dcf1b5a 100644 --- a/src/components/settings_modal/settings_modal_content.js +++ b/src/components/settings_modal/settings_modal_content.js @@ -10,6 +10,29 @@ import GeneralTab from './tabs/general_tab.vue' import VersionTab from './tabs/version_tab.vue' import ThemeTab from './tabs/theme_tab/theme_tab.vue' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faWrench, + faUser, + faFilter, + faPaintBrush, + faBell, + faDownload, + faEyeSlash, + faInfo +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faWrench, + faUser, + faFilter, + faPaintBrush, + faBell, + faDownload, + faEyeSlash, + faInfo +) + const SettingsModalContent = { components: { TabSwitcher, diff --git a/src/components/settings_modal/settings_modal_content.scss b/src/components/settings_modal/settings_modal_content.scss index a3fef1cf..f066234c 100644 --- a/src/components/settings_modal/settings_modal_content.scss +++ b/src/components/settings_modal/settings_modal_content.scss @@ -31,7 +31,7 @@ } .unavailable, - .unavailable i { + .unavailable svg { color: var(--cRed, $fallback--cRed); color: $fallback--cRed; } diff --git a/src/components/settings_modal/settings_modal_content.vue b/src/components/settings_modal/settings_modal_content.vue index bc30a0ff..c9ed2a38 100644 --- a/src/components/settings_modal/settings_modal_content.vue +++ b/src/components/settings_modal/settings_modal_content.vue @@ -37,7 +37,7 @@ </div> <div :label="$t('settings.theme')" - icon="brush" + icon="paint-brush" data-tab-name="theme" > <ThemeTab /> @@ -45,7 +45,7 @@ <div v-if="isLoggedIn" :label="$t('settings.notifications')" - icon="bell-ringing-o" + icon="bell" data-tab-name="notifications" > <NotificationsTab /> @@ -62,14 +62,14 @@ v-if="isLoggedIn" :label="$t('settings.mutes_and_blocks')" :fullHeight="true" - icon="eye-off" + icon="eye-slash" data-tab-name="mutesAndBlocks" > <MutesAndBlocksTab /> </div> <div :label="$t('settings.version.title')" - icon="info-circled" + icon="info" data-tab-name="version" > <VersionTab /> diff --git a/src/components/settings_modal/tabs/filtering_tab.js b/src/components/settings_modal/tabs/filtering_tab.js index 04273211..6e95f7af 100644 --- a/src/components/settings_modal/tabs/filtering_tab.js +++ b/src/components/settings_modal/tabs/filtering_tab.js @@ -2,6 +2,14 @@ import { filter, trim } from 'lodash' import BooleanSetting from '../helpers/boolean_setting.vue' import SharedComputedObject from '../helpers/shared_computed_object.js' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faChevronDown +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faChevronDown +) const FilteringTab = { data () { diff --git a/src/components/settings_modal/tabs/filtering_tab.vue b/src/components/settings_modal/tabs/filtering_tab.vue index 6c42718b..18dd4be9 100644 --- a/src/components/settings_modal/tabs/filtering_tab.vue +++ b/src/components/settings_modal/tabs/filtering_tab.vue @@ -53,7 +53,10 @@ <option value="following">{{ $t('settings.reply_visibility_following') }}</option> <option value="self">{{ $t('settings.reply_visibility_self') }}</option> </select> - <i class="icon-down-open" /> + <FAIcon + class="select-down-icon" + icon="chevron-down" + /> </label> </div> <div> @@ -72,6 +75,7 @@ <p>{{ $t('settings.filtering_explanation') }}</p> <textarea id="muteWords" + class="resize-height" v-model="muteWordsString" /> </div> diff --git a/src/components/settings_modal/tabs/general_tab.js b/src/components/settings_modal/tabs/general_tab.js index 679ef684..2db523be 100644 --- a/src/components/settings_modal/tabs/general_tab.js +++ b/src/components/settings_modal/tabs/general_tab.js @@ -2,6 +2,16 @@ import BooleanSetting from '../helpers/boolean_setting.vue' import InterfaceLanguageSwitcher from 'src/components/interface_language_switcher/interface_language_switcher.vue' import SharedComputedObject from '../helpers/shared_computed_object.js' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faChevronDown, + faGlobe +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faChevronDown, + faGlobe +) const GeneralTab = { data () { @@ -24,6 +34,10 @@ const GeneralTab = { return this.$store.state.instance.postFormats || [] }, instanceSpecificPanelPresent () { return this.$store.state.instance.showInstanceSpecificPanel }, + instanceWallpaperUsed () { + return this.$store.state.instance.background && + !this.$store.state.users.currentUser.background_image + }, ...SharedComputedObject() } } diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue index f794ad6b..92cd2069 100644 --- a/src/components/settings_modal/tabs/general_tab.vue +++ b/src/components/settings_modal/tabs/general_tab.vue @@ -11,6 +11,11 @@ {{ $t('settings.hide_isp') }} </BooleanSetting> </li> + <li v-if="instanceWallpaperUsed"> + <Checkbox v-model="hideInstanceWallpaper"> + {{ $t('settings.hide_wallpaper') }} + </Checkbox> + </li> </ul> </div> <div class="setting-item"> @@ -103,7 +108,10 @@ {{ subjectLineBehaviorDefaultValue == 'noop' ? $t('settings.instance_default_simple') : '' }} </option> </select> - <i class="icon-down-open" /> + <FAIcon + class="select-down-icon" + icon="chevron-down" + /> </label> </div> </li> @@ -127,7 +135,10 @@ {{ postContentTypeDefaultValue === postFormat ? $t('settings.instance_default_simple') : '' }} </option> </select> - <i class="icon-down-open" /> + <FAIcon + class="select-down-icon" + icon="chevron-down" + /> </label> </div> </li> @@ -222,7 +233,7 @@ v-if="!loopSilentAvailable" class="unavailable" > - <i class="icon-globe" />! {{ $t('settings.limited_availability') }} + <FAIcon icon="globe" />! {{ $t('settings.limited_availability') }} </div> </li> </ul> diff --git a/src/components/settings_modal/tabs/mutes_and_blocks_tab.vue b/src/components/settings_modal/tabs/mutes_and_blocks_tab.vue index 5a1cf2c0..63d36bf9 100644 --- a/src/components/settings_modal/tabs/mutes_and_blocks_tab.vue +++ b/src/components/settings_modal/tabs/mutes_and_blocks_tab.vue @@ -27,7 +27,7 @@ <div class="bulk-actions"> <ProgressButton v-if="selected.length > 0" - class="btn btn-default bulk-action-button" + class="btn button-default bulk-action-button" :click="() => blockUsers(selected)" > {{ $t('user_card.block') }} @@ -37,7 +37,7 @@ </ProgressButton> <ProgressButton v-if="selected.length > 0" - class="btn btn-default" + class="btn button-default" :click="() => unblockUsers(selected)" > {{ $t('user_card.unblock') }} @@ -85,7 +85,7 @@ <div class="bulk-actions"> <ProgressButton v-if="selected.length > 0" - class="btn btn-default" + class="btn button-default" :click="() => muteUsers(selected)" > {{ $t('user_card.mute') }} @@ -95,7 +95,7 @@ </ProgressButton> <ProgressButton v-if="selected.length > 0" - class="btn btn-default" + class="btn button-default" :click="() => unmuteUsers(selected)" > {{ $t('user_card.unmute') }} @@ -141,7 +141,7 @@ <div class="bulk-actions"> <ProgressButton v-if="selected.length > 0" - class="btn btn-default" + class="btn button-default" :click="() => unmuteDomains(selected)" > {{ $t('domain_mute_card.unmute') }} diff --git a/src/components/settings_modal/tabs/notifications_tab.vue b/src/components/settings_modal/tabs/notifications_tab.vue index 86eed3f5..8f8fe48e 100644 --- a/src/components/settings_modal/tabs/notifications_tab.vue +++ b/src/components/settings_modal/tabs/notifications_tab.vue @@ -21,7 +21,7 @@ <p>{{ $t('settings.notification_mutes') }}</p> <p>{{ $t('settings.notification_blocks') }}</p> <button - class="btn btn-default" + class="btn button-default" @click="updateNotificationSettings" > {{ $t('general.submit') }} diff --git a/src/components/settings_modal/tabs/profile_tab.js b/src/components/settings_modal/tabs/profile_tab.js index bd6bef6a..9709424c 100644 --- a/src/components/settings_modal/tabs/profile_tab.js +++ b/src/components/settings_modal/tabs/profile_tab.js @@ -8,6 +8,18 @@ import EmojiInput from 'src/components/emoji_input/emoji_input.vue' import suggestor from 'src/components/emoji_input/suggestor.js' import Autosuggest from 'src/components/autosuggest/autosuggest.vue' import Checkbox from 'src/components/checkbox/checkbox.vue' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faTimes, + faPlus, + faCircleNotch +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faTimes, + faPlus, + faCircleNotch +) const ProfileTab = { data () { @@ -33,9 +45,7 @@ const ProfileTab = { banner: null, bannerPreview: null, background: null, - backgroundPreview: null, - bannerUploadError: null, - backgroundUploadError: null + backgroundPreview: null } }, components: { @@ -56,8 +66,7 @@ const ProfileTab = { ...this.$store.state.instance.emoji, ...this.$store.state.instance.customEmoji ], - users: this.$store.state.users.users, - updateUsersList: (query) => this.$store.dispatch('searchUsers', { query }) + store: this.$store }) }, emojiSuggestor () { @@ -67,10 +76,7 @@ const ProfileTab = { ] }) }, userSuggestor () { - return suggestor({ - users: this.$store.state.users.users, - updateUsersList: (query) => this.$store.dispatch('searchUsers', { query }) - }) + return suggestor({ store: this.$store }) }, fieldsLimits () { return this.$store.state.instance.fieldsLimits @@ -154,18 +160,18 @@ const ProfileTab = { if (file.size > this.$store.state.instance[slot + 'limit']) { const filesize = fileSizeFormatService.fileSizeFormat(file.size) const allowedsize = fileSizeFormatService.fileSizeFormat(this.$store.state.instance[slot + 'limit']) - this[slot + 'UploadError'] = [ - this.$t('upload.error.base'), - this.$t( - 'upload.error.file_too_big', - { + this.$store.dispatch('pushGlobalNotice', { + messageKey: 'upload.error.message', + messageArgs: [ + this.$t('upload.error.file_too_big', { filesize: filesize.num, filesizeunit: filesize.unit, allowedsize: allowedsize.num, allowedsizeunit: allowedsize.unit - } - ) - ].join(' ') + }) + ], + level: 'error' + }) return } // eslint-disable-next-line no-undef @@ -205,8 +211,9 @@ const ProfileTab = { that.$store.commit('setCurrentUser', user) resolve() }) - .catch((err) => { - reject(new Error(that.$t('upload.error.base') + ' ' + err.message)) + .catch((error) => { + that.displayUploadError(error) + reject(error) }) } @@ -227,24 +234,27 @@ const ProfileTab = { this.$store.commit('setCurrentUser', user) this.bannerPreview = null }) - .catch((err) => { - this.bannerUploadError = this.$t('upload.error.base') + ' ' + err.message - }) - .then(() => { this.bannerUploading = false }) + .catch(this.displayUploadError) + .finally(() => { this.bannerUploading = false }) }, submitBackground (background) { if (!this.backgroundPreview && background !== '') { return } this.backgroundUploading = true - this.$store.state.api.backendInteractor.updateProfileImages({ background }).then((data) => { - if (!data.error) { + this.$store.state.api.backendInteractor.updateProfileImages({ background }) + .then((data) => { this.$store.commit('addNewUsers', [data]) this.$store.commit('setCurrentUser', data) this.backgroundPreview = null - } else { - this.backgroundUploadError = this.$t('upload.error.base') + data.error - } - this.backgroundUploading = false + }) + .catch(this.displayUploadError) + .finally(() => { this.backgroundUploading = false }) + }, + displayUploadError (error) { + this.$store.dispatch('pushGlobalNotice', { + messageKey: 'upload.error.message', + messageArgs: [error.message], + level: 'error' }) } } diff --git a/src/components/settings_modal/tabs/profile_tab.scss b/src/components/settings_modal/tabs/profile_tab.scss index e14cf054..111eaed3 100644 --- a/src/components/settings_modal/tabs/profile_tab.scss +++ b/src/components/settings_modal/tabs/profile_tab.scss @@ -111,18 +111,17 @@ .profile-fields { display: flex; - &>.emoji-input { + & > .emoji-input { flex: 1 1 auto; - margin: 0 .2em .5em; + margin: 0 0.2em 0.5em; min-width: 0; } - &>.icon-container { + .delete-field { width: 20px; - - &>.icon-cancel { - vertical-align: sub; - } + align-self: center; + margin: 0 0.2em 0.5em; + padding: 0 0.5em; } } } diff --git a/src/components/settings_modal/tabs/profile_tab.vue b/src/components/settings_modal/tabs/profile_tab.vue index cf88c4e4..175a0219 100644 --- a/src/components/settings_modal/tabs/profile_tab.vue +++ b/src/components/settings_modal/tabs/profile_tab.vue @@ -11,7 +11,7 @@ <input id="username" v-model="newName" - classname="name-changer" + class="name-changer" > </EmojiInput> <p>{{ $t('settings.bio') }}</p> @@ -22,7 +22,7 @@ > <textarea v-model="newBio" - classname="bio" + class="bio resize-height" /> </EmojiInput> <p> @@ -124,24 +124,24 @@ :placeholder="$t('settings.profile_fields.value')" > </EmojiInput> - <div - class="icon-container" + <button + class="delete-field button-unstyled -hover-highlight" + @click="deleteField(i)" > - <i + <FAIcon v-show="newFields.length > 1" - class="icon-cancel" - @click="deleteField(i)" + icon="times" /> - </div> + </button> </div> - <a + <button v-if="newFields.length < maxFields" - class="add-field faint" + class="add-field faint button-unstyled -hover-highlight" @click="addField" > - <i class="icon-plus" /> + <FAIcon icon="plus" /> {{ $t("settings.profile_fields.add_field") }} - </a> + </button> </div> <p> <Checkbox v-model="bot"> @@ -150,7 +150,7 @@ </p> <button :disabled="newName && newName.length === 0" - class="btn btn-default" + class="btn button-default" @click="updateProfile" > {{ $t('general.submit') }} @@ -166,10 +166,11 @@ :src="user.profile_image_url_original" class="current-avatar" > - <i + <FAIcon v-if="!isDefaultAvatar && pickAvatarBtnVisible" :title="$t('settings.reset_avatar')" - class="reset-button icon-cancel" + class="reset-button" + icon="times" type="button" @click="resetAvatar" /> @@ -178,7 +179,7 @@ <button v-show="pickAvatarBtnVisible" id="pick-avatar" - class="btn" + class="button-default btn" type="button" > {{ $t('settings.upload_a_photo') }} @@ -194,10 +195,11 @@ <h2>{{ $t('settings.profile_banner') }}</h2> <div class="banner-background-preview"> <img :src="user.cover_photo"> - <i + <FAIcon v-if="!isDefaultBanner" :title="$t('settings.reset_profile_banner')" - class="reset-button icon-cancel" + class="reset-button" + icon="times" type="button" @click="resetBanner" /> @@ -214,36 +216,29 @@ @change="uploadFile('banner', $event)" > </div> - <i + <FAIcon v-if="bannerUploading" - class=" icon-spin4 animate-spin uploading" + class="uploading" + spin + icon="circle-notch" /> <button v-else-if="bannerPreview" - class="btn btn-default" + class="btn button-default" @click="submitBanner(banner)" > {{ $t('general.submit') }} </button> - <div - v-if="bannerUploadError" - class="alert error" - > - Error: {{ bannerUploadError }} - <i - class="button-icon icon-cancel" - @click="clearUploadError('banner')" - /> - </div> </div> <div class="setting-item"> <h2>{{ $t('settings.profile_background') }}</h2> <div class="banner-background-preview"> <img :src="user.background_image"> - <i + <FAIcon v-if="!isDefaultBackground" :title="$t('settings.reset_profile_background')" - class="reset-button icon-cancel" + class="reset-button" + icon="times" type="button" @click="resetBackground" /> @@ -260,27 +255,19 @@ @change="uploadFile('background', $event)" > </div> - <i + <FAIcon v-if="backgroundUploading" - class=" icon-spin4 animate-spin uploading" + class="uploading" + spin + icon="circle-notch" /> <button v-else-if="backgroundPreview" - class="btn btn-default" + class="btn button-default" @click="submitBackground(background)" > {{ $t('general.submit') }} </button> - <div - v-if="backgroundUploadError" - class="alert error" - > - Error: {{ backgroundUploadError }} - <i - class="button-icon icon-cancel" - @click="clearUploadError('background')" - /> - </div> </div> </div> </template> diff --git a/src/components/settings_modal/tabs/security_tab/confirm.vue b/src/components/settings_modal/tabs/security_tab/confirm.vue index 69b3811b..38c2a610 100644 --- a/src/components/settings_modal/tabs/security_tab/confirm.vue +++ b/src/components/settings_modal/tabs/security_tab/confirm.vue @@ -2,14 +2,14 @@ <div> <slot /> <button - class="btn btn-default" + class="btn button-default" :disabled="disabled" @click="confirm" > {{ $t('general.confirm') }} </button> <button - class="btn btn-default" + class="btn button-default" :disabled="disabled" @click="cancel" > diff --git a/src/components/settings_modal/tabs/security_tab/mfa.vue b/src/components/settings_modal/tabs/security_tab/mfa.vue index 7aca3c8d..455d17b6 100644 --- a/src/components/settings_modal/tabs/security_tab/mfa.vue +++ b/src/components/settings_modal/tabs/security_tab/mfa.vue @@ -29,7 +29,7 @@ /> <button v-if="!confirmNewBackupCodes" - class="btn btn-default" + class="btn button-default" @click="getBackupCodes" > {{ $t('settings.mfa.generate_new_recovery_codes') }} @@ -61,7 +61,7 @@ <button v-if="canSetupOTP" - class="btn btn-default" + class="btn button-default" @click="cancelSetup" > {{ $t('general.cancel') }} @@ -69,7 +69,7 @@ <button v-if="canSetupOTP" - class="btn btn-default" + class="btn button-default" @click="setupOTP" > {{ $t('settings.mfa.setup_otp') }} @@ -108,13 +108,13 @@ > <div class="confirm-otp-actions"> <button - class="btn btn-default" + class="btn button-default" @click="doConfirmOTP" > {{ $t('settings.mfa.confirm_and_enable') }} </button> <button - class="btn btn-default" + class="btn button-default" @click="cancelSetup" > {{ $t('general.cancel') }} diff --git a/src/components/settings_modal/tabs/security_tab/mfa_totp.vue b/src/components/settings_modal/tabs/security_tab/mfa_totp.vue index c6f2cc7b..8e767bd0 100644 --- a/src/components/settings_modal/tabs/security_tab/mfa_totp.vue +++ b/src/components/settings_modal/tabs/security_tab/mfa_totp.vue @@ -4,7 +4,7 @@ <strong>{{ $t('settings.mfa.otp') }}</strong> <button v-if="!isActivated" - class="btn btn-default" + class="btn button-default" @click="doActivate" > {{ $t('general.enable') }} @@ -12,7 +12,7 @@ <button v-if="isActivated" - class="btn btn-default" + class="btn button-default" :disabled="deactivate" @click="doDeactivate" > diff --git a/src/components/settings_modal/tabs/security_tab/security_tab.js b/src/components/settings_modal/tabs/security_tab/security_tab.js index 811161a5..65d20fc0 100644 --- a/src/components/settings_modal/tabs/security_tab/security_tab.js +++ b/src/components/settings_modal/tabs/security_tab/security_tab.js @@ -1,6 +1,7 @@ import ProgressButton from 'src/components/progress_button/progress_button.vue' import Checkbox from 'src/components/checkbox/checkbox.vue' import Mfa from './mfa.vue' +import localeService from 'src/services/locale/locale.service.js' const SecurityTab = { data () { @@ -37,7 +38,7 @@ const SecurityTab = { return { id: oauthToken.id, appName: oauthToken.app_name, - validUntil: new Date(oauthToken.valid_until).toLocaleDateString() + validUntil: new Date(oauthToken.valid_until).toLocaleDateString(localeService.internalToBrowserLocale(this.$i18n.locale)) } }) } diff --git a/src/components/settings_modal/tabs/security_tab/security_tab.vue b/src/components/settings_modal/tabs/security_tab/security_tab.vue index 3d32d73d..56bea1f4 100644 --- a/src/components/settings_modal/tabs/security_tab/security_tab.vue +++ b/src/components/settings_modal/tabs/security_tab/security_tab.vue @@ -19,7 +19,7 @@ > </div> <button - class="btn btn-default" + class="btn button-default" @click="changeEmail" > {{ $t('general.submit') }} @@ -57,7 +57,7 @@ > </div> <button - class="btn btn-default" + class="btn button-default" @click="changePassword" > {{ $t('general.submit') }} @@ -92,7 +92,7 @@ <td>{{ oauthToken.validUntil }}</td> <td class="actions"> <button - class="btn btn-default" + class="btn button-default" @click="revokeToken(oauthToken.id)" > {{ $t('settings.revoke_token') }} @@ -116,7 +116,7 @@ type="password" > <button - class="btn btn-default" + class="btn button-default" @click="deleteAccount" > {{ $t('settings.delete_account') }} @@ -130,7 +130,7 @@ </p> <button v-if="!deletingAccount" - class="btn btn-default" + class="btn button-default" @click="confirmDelete" > {{ $t('general.submit') }} diff --git a/src/components/settings_modal/tabs/theme_tab/preview.vue b/src/components/settings_modal/tabs/theme_tab/preview.vue index 9d984659..7ac7b9d3 100644 --- a/src/components/settings_modal/tabs/theme_tab/preview.vue +++ b/src/components/settings_modal/tabs/theme_tab/preview.vue @@ -15,7 +15,7 @@ <span class="alert error"> {{ $t('settings.style.preview.error') }} </span> - <button class="btn"> + <button class="btn button-default"> {{ $t('settings.style.preview.button') }} </button> </div> @@ -39,21 +39,29 @@ </i18n> <div class="icons"> - <i + <FAIcon + fixed-width style="color: var(--cBlue)" - class="button-icon icon-reply" + class="fa-scale-110 fa-old-padding" + icon="reply" /> - <i + <FAIcon + fixed-width style="color: var(--cGreen)" - class="button-icon icon-retweet" + class="fa-scale-110 fa-old-padding" + icon="retweet" /> - <i + <FAIcon + fixed-width style="color: var(--cOrange)" - class="button-icon icon-star" + class="fa-scale-110 fa-old-padding" + icon="star" /> - <i + <FAIcon + fixed-width style="color: var(--cRed)" - class="button-icon icon-cancel" + class="fa-scale-110 fa-old-padding" + icon="times" /> </div> </div> @@ -94,7 +102,7 @@ > <label for="preview_checkbox">{{ $t('settings.style.preview.checkbox') }}</label> </span> - <button class="btn"> + <button class="btn button-default"> {{ $t('settings.style.preview.button') }} </button> </div> @@ -103,6 +111,25 @@ </div> </template> +<script> +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faTimes, + faStar, + faRetweet, + faReply +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faTimes, + faStar, + faRetweet, + faReply +) + +export default {} +</script> + <style lang="scss"> .preview-container { position: relative; diff --git a/src/components/settings_modal/tabs/theme_tab/theme_tab.js b/src/components/settings_modal/tabs/theme_tab/theme_tab.js index e3c5e80a..6cf75fe7 100644 --- a/src/components/settings_modal/tabs/theme_tab/theme_tab.js +++ b/src/components/settings_modal/tabs/theme_tab/theme_tab.js @@ -35,6 +35,14 @@ import ExportImport from 'src/components/export_import/export_import.vue' import Checkbox from 'src/components/checkbox/checkbox.vue' import Preview from './preview.vue' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faChevronDown +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faChevronDown +) // List of color values used in v1 const v1OnlyNames = [ diff --git a/src/components/settings_modal/tabs/theme_tab/theme_tab.scss b/src/components/settings_modal/tabs/theme_tab/theme_tab.scss index 926eceff..1b7d9f31 100644 --- a/src/components/settings_modal/tabs/theme_tab/theme_tab.scss +++ b/src/components/settings_modal/tabs/theme_tab/theme_tab.scss @@ -165,7 +165,8 @@ border-color: var(--border, $fallback--border); margin: 1em 0; padding: 1em; - background: var(--body-background-image); + background-color: var(--wallpaper); + background-image: var(--body-background-image); background-size: cover; background-position: 50% 50%; diff --git a/src/components/settings_modal/tabs/theme_tab/theme_tab.vue b/src/components/settings_modal/tabs/theme_tab/theme_tab.vue index 5328c350..b8add42f 100644 --- a/src/components/settings_modal/tabs/theme_tab/theme_tab.vue +++ b/src/components/settings_modal/tabs/theme_tab/theme_tab.vue @@ -12,13 +12,13 @@ <div class="buttons"> <template v-if="themeWarning.type === 'snapshot_source_mismatch'"> <button - class="btn" + class="btn button-default" @click="forceLoad" > {{ $t('settings.style.switcher.use_source') }} </button> <button - class="btn" + class="btn button-default" @click="forceSnapshot" > {{ $t('settings.style.switcher.use_snapshot') }} @@ -26,7 +26,7 @@ </template> <template v-else-if="themeWarning.noActionsPossible"> <button - class="btn" + class="btn button-default" @click="dismissWarning" > {{ $t('general.dismiss') }} @@ -34,13 +34,13 @@ </template> <template v-else> <button - class="btn" + class="btn button-default" @click="forceLoad" > {{ $t('settings.style.switcher.load_theme') }} </button> <button - class="btn" + class="btn button-default" @click="dismissWarning" > {{ $t('settings.style.switcher.keep_as_is') }} @@ -80,7 +80,10 @@ {{ style[0] || style.name }} </option> </select> - <i class="icon-down-open" /> + <FAIcon + class="select-down-icon" + icon="chevron-down" + /> </label> </div> </template> @@ -128,13 +131,13 @@ <p>{{ $t('settings.theme_help') }}</p> <div class="tab-header-buttons"> <button - class="btn" + class="btn button-default" @click="clearOpacity" > {{ $t('settings.style.switcher.clear_opacity') }} </button> <button - class="btn" + class="btn button-default" @click="clearV1" > {{ $t('settings.style.switcher.clear_all') }} @@ -235,13 +238,13 @@ <div class="tab-header"> <p>{{ $t('settings.theme_help') }}</p> <button - class="btn" + class="btn button-default" @click="clearOpacity" > {{ $t('settings.style.switcher.clear_opacity') }} </button> <button - class="btn" + class="btn button-default" @click="clearV1" > {{ $t('settings.style.switcher.clear_all') }} @@ -614,6 +617,15 @@ /> </div> <div class="color-item"> + <h4>{{ $t('settings.style.advanced_colors.wallpaper') }}</h4> + <ColorInput + v-model="wallpaperColorLocal" + name="wallpaper" + :label="$t('settings.style.advanced_colors.wallpaper')" + :fallback="previewTheme.colors.wallpaper" + /> + </div> + <div class="color-item"> <h4>{{ $t('settings.style.advanced_colors.poll') }}</h4> <ColorInput v-model="pollColorLocal" @@ -803,7 +815,7 @@ <div class="tab-header"> <p>{{ $t('settings.radii_help') }}</p> <button - class="btn" + class="btn button-default" @click="clearRoundness" > {{ $t('settings.style.switcher.clear_all') }} @@ -907,7 +919,10 @@ {{ $t('settings.style.shadows.components.' + shadow) }} </option> </select> - <i class="icon-down-open" /> + <FAIcon + class="select-down-icon" + icon="chevron-down" + /> </label> </div> <div class="override"> @@ -930,7 +945,7 @@ /> </div> <button - class="btn" + class="btn button-default" @click="clearShadows" > {{ $t('settings.style.switcher.clear_all') }} @@ -974,7 +989,7 @@ <div class="tab-header"> <p>{{ $t('settings.style.fonts.help') }}</p> <button - class="btn" + class="btn button-default" @click="clearFonts" > {{ $t('settings.style.switcher.clear_all') }} @@ -1011,14 +1026,14 @@ <div class="apply-container"> <button - class="btn submit" + class="btn button-default submit" :disabled="!themeValid" @click="setCustomTheme" > {{ $t('general.apply') }} </button> <button - class="btn" + class="btn button-default" @click="clearAll" > {{ $t('settings.style.switcher.reset') }} diff --git a/src/components/shadow_control/shadow_control.js b/src/components/shadow_control/shadow_control.js index f9e7b985..800c39d5 100644 --- a/src/components/shadow_control/shadow_control.js +++ b/src/components/shadow_control/shadow_control.js @@ -2,6 +2,20 @@ import ColorInput from '../color_input/color_input.vue' import OpacityInput from '../opacity_input/opacity_input.vue' import { getCssShadow } from '../../services/style_setter/style_setter.js' import { hex2rgb } from '../../services/color_convert/color_convert.js' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faTimes, + faChevronDown, + faChevronUp, + faPlus +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faChevronDown, + faChevronUp, + faTimes, + faPlus +) const toModel = (object = {}) => ({ x: 0, diff --git a/src/components/shadow_control/shadow_control.vue b/src/components/shadow_control/shadow_control.vue index 815a9e59..37d491f0 100644 --- a/src/components/shadow_control/shadow_control.vue +++ b/src/components/shadow_control/shadow_control.vue @@ -78,35 +78,50 @@ {{ $t('settings.style.shadows.shadow_id', { value: index }) }} </option> </select> - <i class="icon-down-open" /> + <FAIcon + icon="chevron-down" + class="select-down-icon" + /> </label> <button - class="btn btn-default" + class="btn button-default" :disabled="!ready || !present" @click="del" > - <i class="icon-cancel" /> + <FAIcon + fixed-width + icon="times" + /> </button> <button - class="btn btn-default" + class="btn button-default" :disabled="!moveUpValid" @click="moveUp" > - <i class="icon-up-open" /> + <FAIcon + fixed-width + icon="chevron-up" + /> </button> <button - class="btn btn-default" + class="btn button-default" :disabled="!moveDnValid" @click="moveDn" > - <i class="icon-down-open" /> + <FAIcon + fixed-width + icon="chevron-down" + /> </button> <button - class="btn btn-default" + class="btn button-default" :disabled="usingFallback" @click="add" > - <i class="icon-plus" /> + <FAIcon + fixed-width + icon="plus" + /> </button> </div> <div diff --git a/src/components/side_drawer/side_drawer.js b/src/components/side_drawer/side_drawer.js index 281052e5..fe736168 100644 --- a/src/components/side_drawer/side_drawer.js +++ b/src/components/side_drawer/side_drawer.js @@ -2,6 +2,34 @@ import { mapState, mapGetters } from 'vuex' import UserCard from '../user_card/user_card.vue' import { unseenNotificationsFromStore } from '../../services/notification_utils/notification_utils' import GestureService from '../../services/gesture_service/gesture_service' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faSignInAlt, + faSignOutAlt, + faHome, + faComments, + faBell, + faUserPlus, + faBullhorn, + faSearch, + faTachometerAlt, + faCog, + faInfoCircle +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faSignInAlt, + faSignOutAlt, + faHome, + faComments, + faBell, + faUserPlus, + faBullhorn, + faSearch, + faTachometerAlt, + faCog, + faInfoCircle +) const SideDrawer = { props: [ 'logout' ], diff --git a/src/components/side_drawer/side_drawer.vue b/src/components/side_drawer/side_drawer.vue index eda5a68c..223b1632 100644 --- a/src/components/side_drawer/side_drawer.vue +++ b/src/components/side_drawer/side_drawer.vue @@ -36,7 +36,11 @@ @click="toggleDrawer" > <router-link :to="{ name: 'login' }"> - <i class="button-icon icon-login" /> {{ $t("login.login") }} + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding" + icon="sign-in-alt" + /> {{ $t("login.login") }} </router-link> </li> <li @@ -44,7 +48,11 @@ @click="toggleDrawer" > <router-link :to="{ name: timelinesRoute }"> - <i class="button-icon icon-home-2" /> {{ $t("nav.timelines") }} + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding" + icon="home" + /> {{ $t("nav.timelines") }} </router-link> </li> <li @@ -55,10 +63,14 @@ :to="{ name: 'chats', params: { username: currentUser.screen_name } }" style="position: relative" > - <i class="button-icon icon-chat" /> {{ $t("nav.chats") }} + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding" + icon="comments" + /> {{ $t("nav.chats") }} <span v-if="unreadChatCount" - class="badge badge-notification unread-chat-count" + class="badge badge-notification" > {{ unreadChatCount }} </span> @@ -68,7 +80,11 @@ <ul v-if="currentUser"> <li @click="toggleDrawer"> <router-link :to="{ name: 'interactions', params: { username: currentUser.screen_name } }"> - <i class="button-icon icon-bell-alt" /> {{ $t("nav.interactions") }} + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding" + icon="bell" + /> {{ $t("nav.interactions") }} </router-link> </li> <li @@ -76,10 +92,14 @@ @click="toggleDrawer" > <router-link to="/friend-requests"> - <i class="button-icon icon-user-plus" /> {{ $t("nav.friend_requests") }} + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding" + icon="user-plus" + /> {{ $t("nav.friend_requests") }} <span v-if="followRequestCount > 0" - class="badge follow-request-count" + class="badge badge-notification" > {{ followRequestCount }} </span> @@ -89,8 +109,12 @@ v-if="chat" @click="toggleDrawer" > - <router-link :to="{ name: 'chat' }"> - <i class="button-icon icon-megaphone" /> {{ $t("shoutbox.title") }} + <router-link :to="{ name: 'chat-panel' }"> + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding" + icon="bullhorn" + /> {{ $t("shoutbox.title") }} </router-link> </li> </ul> @@ -100,7 +124,11 @@ @click="toggleDrawer" > <router-link :to="{ name: 'search' }"> - <i class="button-icon icon-search" /> {{ $t("nav.search") }} + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding" + icon="search" + /> {{ $t("nav.search") }} </router-link> </li> <li @@ -108,20 +136,32 @@ @click="toggleDrawer" > <router-link :to="{ name: 'who-to-follow' }"> - <i class="button-icon icon-user-plus" /> {{ $t("nav.who_to_follow") }} + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding" + icon="user-plus" + /> {{ $t("nav.who_to_follow") }} </router-link> </li> <li @click="toggleDrawer"> - <a - href="#" + <button + class="button-unstyled -link -fullwidth" @click="openSettingsModal" > - <i class="button-icon icon-cog" /> {{ $t("settings.settings") }} - </a> + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding" + icon="cog" + /> {{ $t("settings.settings") }} + </button> </li> <li @click="toggleDrawer"> <router-link :to="{ name: 'about'}"> - <i class="button-icon icon-info-circled" /> {{ $t("nav.about") }} + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding" + icon="info-circle" + /> {{ $t("nav.about") }} </router-link> </li> <li @@ -132,19 +172,27 @@ href="/pleroma/admin/#/login-pleroma" target="_blank" > - <i class="button-icon icon-gauge" /> {{ $t("nav.administration") }} + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding" + icon="tachometer-alt" + /> {{ $t("nav.administration") }} </a> </li> <li v-if="currentUser" @click="toggleDrawer" > - <a - href="#" + <button + class="button-unstyled -link -fullwidth" @click="doLogout" > - <i class="button-icon icon-logout" /> {{ $t("login.logout") }} - </a> + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding" + icon="sign-out-alt" + /> {{ $t("login.logout") }} + </button> </li> </ul> </div> @@ -224,8 +272,10 @@ --lightText: var(--popoverLightText, $fallback--lightText); --icon: var(--popoverIcon, $fallback--icon); - .button-icon:before { - width: 1.1em; + .badge { + position: absolute; + right: 0.7rem; + top: 1em; } } @@ -272,7 +322,6 @@ border-bottom: 1px solid; border-color: $fallback--border; border-color: var(--border, $fallback--border); - margin: 0.2em 0; } .side-drawer ul:last-child { @@ -282,9 +331,12 @@ .side-drawer li { padding: 0; - a { + a, button { + box-sizing: border-box; display: block; - padding: 0.5em 0.85em; + height: 3em; + line-height: 3em; + padding: 0 0.7em; &:hover { background-color: $fallback--lightBg; diff --git a/src/components/status/status.js b/src/components/status/status.js index e48b2eb8..2bf93a9e 100644 --- a/src/components/status/status.js +++ b/src/components/status/status.js @@ -17,6 +17,41 @@ import { highlightClass, highlightStyle } from '../../services/user_highlighter/ import { muteWordHits } from '../../services/status_parser/status_parser.js' import { unescape, uniqBy } from 'lodash' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faEnvelope, + faLock, + faLockOpen, + faGlobe, + faTimes, + faRetweet, + faReply, + faPlusSquare, + faSmileBeam, + faEllipsisH, + faStar, + faEyeSlash, + faEye, + faThumbtack +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faEnvelope, + faGlobe, + faLock, + faLockOpen, + faTimes, + faRetweet, + faReply, + faPlusSquare, + faStar, + faSmileBeam, + faEllipsisH, + faEyeSlash, + faEye, + faThumbtack +) + const Status = { name: 'Status', components: { @@ -122,6 +157,7 @@ const Status = { return muteWordHits(this.status, this.muteWords) }, muted () { + if (this.statusoid.user.id === this.currentUser.id) return false const { status } = this const { reblog } = status const relationship = this.$store.getters.relationship(status.user.id) @@ -227,13 +263,13 @@ const Status = { visibilityIcon (visibility) { switch (visibility) { case 'private': - return 'icon-lock' + return 'lock' case 'unlisted': - return 'icon-lock-open-alt' + return 'lock-open' case 'direct': - return 'icon-mail-alt' + return 'envelope' default: - return 'icon-globe' + return 'globe' } }, showError (error) { diff --git a/src/components/status/status.scss b/src/components/status/status.scss index 66a91c1e..58b55bc8 100644 --- a/src/components/status/status.scss +++ b/src/components/status/status.scss @@ -7,8 +7,9 @@ $status-margin: 0.75em; min-width: 0; &:hover { - --still-image-img: visible; - --still-image-canvas: hidden; + --_still-image-img-visibility: visible; + --_still-image-canvas-visibility: hidden; + --_still-image-label-visibility: hidden; } &.-focused { @@ -28,6 +29,8 @@ $status-margin: 0.75em; &.-conversation { border-left-width: 4px; border-left-style: solid; + border-left-color: $fallback--cRed; + border-left-color: var(--cRed, $fallback--cRed); } .gravestone { @@ -58,6 +61,15 @@ $status-margin: 0.75em; justify-content: flex-end; } + ._misclick-prevention & { + pointer-events: none; + + .attachments { + pointer-events: initial; + cursor: initial; + } + } + .left-side { margin-right: $status-margin; } @@ -127,6 +139,20 @@ $status-margin: 0.75em; .heading-right { display: flex; flex-shrink: 0; + + .button-unstyled { + padding: 5px; + margin: -5px; + + &:hover svg { + color: $fallback--lightText; + color: var(--lightText, $fallback--lightText); + } + } + + .svg-inline--fa { + margin-left: 0.25em; + } } .timeago { @@ -156,11 +182,6 @@ $status-margin: 0.75em; text-overflow: ellipsis; overflow-x: hidden; } - - .icon-reply { - // mirror the icon - transform: scaleX(-1); - } } & .reply-to-popover, @@ -200,7 +221,6 @@ $status-margin: 0.75em; } .reply-to { - display: flex; position: relative; } @@ -208,7 +228,6 @@ $status-margin: 0.75em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - margin-left: 0.2em; } .replies-separator { @@ -232,16 +251,10 @@ $status-margin: 0.75em; .repeat-info { padding: 0.4em $status-margin; - line-height: 22px; - - .right-side { - display: flex; - align-content: center; - flex-wrap: wrap; - } - i { - padding: 0 0.2em; + .repeat-icon { + color: $fallback--cGreen; + color: var(--cGreen, $fallback--cGreen); } } @@ -291,18 +304,6 @@ $status-margin: 0.75em; } } - .button-reply { - &:not(.-disabled) { - cursor: pointer; - } - - &:not(.-disabled):hover, - &.-active { - color: $fallback--cBlue; - color: var(--cBlue, $fallback--cBlue); - } - } - .muted { padding: 0.25em 0.6em; height: 1.2em; diff --git a/src/components/status/status.vue b/src/components/status/status.vue index ffae32fc..6ee8117f 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -10,17 +10,20 @@ class="alert error" > {{ error }} - <i - class="button-icon icon-cancel" + <span + class="fa-scale-110 fa-old-padding" @click="clearError" - /> + > + <FAIcon icon="times" /> + </span> </div> <template v-if="muted && !isPreview"> <div class="status-container muted"> <small class="status-username"> - <i + <FAIcon v-if="muted && retweet" - class="button-icon icon-retweet" + class="fa-scale-110 fa-old-padding repeat-icon" + icon="retweet" /> <router-link :to="userProfileLink"> {{ status.user.screen_name }} @@ -44,11 +47,15 @@ > {{ muteWordHits.join(', ') }} </small> - <a - href="#" - class="unmute" + <button + class="unmute button-unstyled" @click.prevent="toggleMute" - ><i class="button-icon icon-eye-off" /></a> + > + <FAIcon + icon="eye-slash" + class="fa-scale-110 fa-old-padding" + /> + </button> </div> </template> <template v-else> @@ -56,7 +63,10 @@ v-if="showPinned" class="pin" > - <i class="fa icon-pin faint" /> + <FAIcon + icon="thumbtack" + class="faint" + /> <span class="faint">{{ $t('status.pinned') }}</span> </div> <div @@ -86,8 +96,9 @@ :to="retweeterProfileLink" >{{ retweeter }}</router-link> </span> - <i - class="fa icon-retweet retweeted" + <FAIcon + icon="retweet" + class="repeat-icon" :title="$t('tool_tip.repeat')" /> {{ $t('timeline.repeated') }} @@ -167,38 +178,40 @@ :auto-update="60" /> </router-link> - <div + <span v-if="status.visibility" - class="button-icon visibility-icon" + class="visibility-icon" + :title="status.visibility | capitalize" > - <i - :class="visibilityIcon(status.visibility)" - :title="status.visibility | capitalize" + <FAIcon + fixed-width + class="fa-scale-110" + :icon="visibilityIcon(status.visibility)" /> - </div> - <a - v-if="!status.is_local && !isPreview" - :href="status.external_url" - target="_blank" - class="source_url" - title="Source" + </span> + <button + v-if="expandable && !isPreview" + class="button-unstyled" + :title="$t('status.expand')" + @click.prevent="toggleExpanded" > - <i class="button-icon icon-link-ext-alt" /> - </a> - <template v-if="expandable && !isPreview"> - <a - href="#" - title="Expand" - @click.prevent="toggleExpanded" - > - <i class="button-icon icon-plus-squared" /> - </a> - </template> - <a + <FAIcon + fixed-width + class="fa-scale-110" + icon="plus-square" + /> + </button> + <button v-if="unmuted" - href="#" + class="button-unstyled" @click.prevent="toggleMute" - ><i class="button-icon icon-eye-off" /></a> + > + <FAIcon + fixed-width + icon="eye-slash" + class="fa-scale-110" + /> + </button> </span> </div> @@ -214,19 +227,22 @@ style="min-width: 0" :class="{ '-strikethrough': !status.parent_visible }" > - <a - class="reply-to" - href="#" + <button + class="button-unstyled reply-to" :aria-label="$t('tool_tip.reply')" @click.prevent="gotoOriginal(status.in_reply_to_status_id)" > - <i class="button-icon reply-button icon-reply" /> + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="reply" + flip="horizontal" + /> <span class="faint-link reply-to-text" > {{ $t('status.reply_to') }} </span> - </a> + </button> </StatusPopover> <span @@ -259,11 +275,12 @@ :key="reply.id" :status-id="reply.id" > - <a - href="#" - class="reply-link" + <button + class="button-unstyled -link reply-link" @click.prevent="gotoOriginal(reply.id)" - >{{ reply.name }}</a> + > + {{ reply.name }} + </button> </StatusPopover> </div> </div> @@ -348,7 +365,6 @@ @onSuccess="clearError" /> </div> - </div> </div> <div diff --git a/src/components/status_content/status_content.js b/src/components/status_content/status_content.js index df095de3..a6f79d76 100644 --- a/src/components/status_content/status_content.js +++ b/src/components/status_content/status_content.js @@ -7,6 +7,24 @@ import fileType from 'src/services/file_type/file_type.service' import { processHtml } from 'src/services/tiny_post_html_processor/tiny_post_html_processor.service.js' import { mentionMatchesUrl, extractTagFromUrl } from 'src/services/matcher/matcher.service.js' import { mapGetters, mapState } from 'vuex' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faCircleNotch, + faFile, + faMusic, + faImage, + faLink, + faPollH +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faCircleNotch, + faFile, + faMusic, + faImage, + faLink, + faPollH +) const StatusContent = { name: 'StatusContent', diff --git a/src/components/status_content/status_content.vue b/src/components/status_content/status_content.vue index f7fb5ee2..90bfaf40 100644 --- a/src/components/status_content/status_content.vue +++ b/src/components/status_content/status_content.vue @@ -12,35 +12,34 @@ @click.prevent="linkClicked" v-html="status.summary_html" /> - <a + <button v-if="longSubject && showingLongSubject" - href="#" - class="tall-subject-hider" + class="button-unstyled -link tall-subject-hider" @click.prevent="showingLongSubject=false" - >{{ $t("status.hide_full_subject") }}</a> - <a + > + {{ $t("status.hide_full_subject") }} + </button> + <button v-else-if="longSubject" - class="tall-subject-hider" + class="button-unstyled -link tall-subject-hider" :class="{ 'tall-subject-hider_focused': focused }" - href="#" @click.prevent="showingLongSubject=true" > {{ $t("status.show_full_subject") }} - </a> + </button> </div> <div :class="{'tall-status': hideTallStatus}" class="status-content-wrapper" > - <a + <button v-if="hideTallStatus" - class="tall-status-hider" + class="button-unstyled -link tall-status-hider" :class="{ 'tall-status-hider_focused': focused }" - href="#" @click.prevent="toggleShowMore" > {{ $t("general.show_more") }} - </a> + </button> <div v-if="!hideSubjectStatus" :class="{ 'single-line': singleLine }" @@ -48,46 +47,44 @@ @click.prevent="linkClicked" v-html="postBodyHtml" /> - <a + <button v-if="hideSubjectStatus" - href="#" - class="cw-status-hider" + class="button-unstyled -link cw-status-hider" @click.prevent="toggleShowMore" > {{ $t("status.show_content") }} - <span + <FAIcon v-if="attachmentTypes.includes('image')" - class="icon-picture" + icon="image" /> - <span + <FAIcon v-if="attachmentTypes.includes('video')" - class="icon-video" + icon="video" /> - <span + <FAIcon v-if="attachmentTypes.includes('audio')" - class="icon-music" + icon="music" /> - <span + <FAIcon v-if="attachmentTypes.includes('unknown')" - class="icon-doc" + icon="file" /> - <span + <FAIcon v-if="status.poll && status.poll.options" - class="icon-chart-bar" + icon="poll-h" /> - <span + <FAIcon v-if="status.card" - class="icon-link" + icon="link" /> - </a> - <a + </button> + <button v-if="showingMore && !fullContent" - href="#" - class="status-unhider" + class="button-unstyled -link status-unhider" @click.prevent="toggleShowMore" > {{ tallStatus ? $t("general.show_less") : $t("status.hide_content") }} - </a> + </button> </div> <div v-if="status.poll && status.poll.options && !hideSubjectStatus"> @@ -182,6 +179,10 @@ $status-margin: 0.75em; text-align: center; display: inline-block; word-break: break-all; + + svg { + color: inherit; + } } img, video { diff --git a/src/components/status_popover/status_popover.js b/src/components/status_popover/status_popover.js index 51e7680c..c47f5631 100644 --- a/src/components/status_popover/status_popover.js +++ b/src/components/status_popover/status_popover.js @@ -1,4 +1,10 @@ import { find } from 'lodash' +import { library } from '@fortawesome/fontawesome-svg-core' +import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' + +library.add( + faCircleNotch +) const StatusPopover = { name: 'StatusPopover', diff --git a/src/components/status_popover/status_popover.vue b/src/components/status_popover/status_popover.vue index 162eb210..8237ce00 100644 --- a/src/components/status_popover/status_popover.vue +++ b/src/components/status_popover/status_popover.vue @@ -27,7 +27,11 @@ v-else class="status-preview-no-content" > - <i class="icon-spin4 animate-spin" /> + <FAIcon + icon="circle-notch" + spin + size="2x" + /> </div> </div> </Popover> diff --git a/src/components/still-image/still-image.vue b/src/components/still-image/still-image.vue index ad82210d..d3eb5925 100644 --- a/src/components/still-image/still-image.vue +++ b/src/components/still-image/still-image.vue @@ -42,7 +42,7 @@ width: 100%; height: 100%; object-fit: contain; - visibility: var(--still-image-canvas, visible); + visibility: var(--_still-image-canvas-visibility, visible); } img { @@ -66,16 +66,19 @@ border-radius: $fallback--tooltipRadius; border-radius: var(--tooltipRadius, $fallback--tooltipRadius); z-index: 2; - visibility: var(--still-image-label-visibility, visible); + visibility: var(--_still-image-label-visibility, visible); } &:hover canvas { display: none; } - &:hover::before, + &:hover::before { + visibility: var(--_still-image-label-visibility, hidden); + } + img { - visibility: var(--still-image-img, hidden); + visibility: var(--_still-image-img-visibility, hidden); } &:hover img { diff --git a/src/components/tab_switcher/tab_switcher.js b/src/components/tab_switcher/tab_switcher.js index 9c1da354..76e7ef03 100644 --- a/src/components/tab_switcher/tab_switcher.js +++ b/src/components/tab_switcher/tab_switcher.js @@ -1,5 +1,6 @@ import Vue from 'vue' import { mapState } from 'vuex' +import { FontAwesomeIcon as FAIcon } from '@fortawesome/vue-fontawesome' import './tab_switcher.scss' @@ -80,7 +81,7 @@ export default Vue.component('tab-switcher', { const tabs = this.$slots.default .map((slot, index) => { if (!slot.tag) return - const classesTab = ['tab'] + const classesTab = ['tab', 'button-default'] const classesWrapper = ['tab-wrapper'] if (this.activeIndex === index) { classesTab.push('active') @@ -107,7 +108,7 @@ export default Vue.component('tab-switcher', { class={classesTab.join(' ')} type="button" > - {!slot.data.attrs.icon ? '' : (<i class={'tab-icon icon-' + slot.data.attrs.icon}/>)} + {!slot.data.attrs.icon ? '' : (<FAIcon class="tab-icon" size="2x" fixed-width icon={slot.data.attrs.icon}/>)} <span class="text"> {slot.data.attrs.label} </span> diff --git a/src/components/tab_switcher/tab_switcher.scss b/src/components/tab_switcher/tab_switcher.scss index d2ef4857..0ed614b7 100644 --- a/src/components/tab_switcher/tab_switcher.scss +++ b/src/components/tab_switcher/tab_switcher.scss @@ -4,7 +4,7 @@ display: flex; .tab-icon { - font-size: 2em; + margin: 0.2em auto; display: block; } @@ -91,7 +91,7 @@ flex-direction: column; @media all and (max-width: 800px) { - min-width: 1em; + min-width: 4em; } &:not(.active)::after { diff --git a/src/components/timeago/timeago.vue b/src/components/timeago/timeago.vue index 6df0524d..55a2dd94 100644 --- a/src/components/timeago/timeago.vue +++ b/src/components/timeago/timeago.vue @@ -9,6 +9,7 @@ <script> import * as DateUtils from 'src/services/date_utils/date_utils.js' +import localeService from 'src/services/locale/locale.service.js' export default { name: 'Timeago', @@ -21,9 +22,10 @@ export default { }, computed: { localeDateString () { + const browserLocale = localeService.internalToBrowserLocale(this.$i18n.locale) return typeof this.time === 'string' - ? new Date(Date.parse(this.time)).toLocaleString() - : this.time.toLocaleString() + ? new Date(Date.parse(this.time)).toLocaleString(browserLocale) + : this.time.toLocaleString(browserLocale) } }, created () { diff --git a/src/components/timeline/timeline.js b/src/components/timeline/timeline.js index 17680542..665d195e 100644 --- a/src/components/timeline/timeline.js +++ b/src/components/timeline/timeline.js @@ -2,7 +2,13 @@ import Status from '../status/status.vue' import timelineFetcher from '../../services/timeline_fetcher/timeline_fetcher.service.js' import Conversation from '../conversation/conversation.vue' import TimelineMenu from '../timeline_menu/timeline_menu.vue' -import { throttle, keyBy } from 'lodash' +import { debounce, throttle, keyBy } from 'lodash' +import { library } from '@fortawesome/fontawesome-svg-core' +import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' + +library.add( + faCircleNotch +) export const getExcludedStatusIdsByPinning = (statuses, pinnedStatusIds) => { const ids = [] @@ -34,7 +40,8 @@ const Timeline = { paused: false, unfocused: false, bottomedOut: false, - virtualScrollIndex: 0 + virtualScrollIndex: 0, + blockingClicks: false } }, components: { @@ -43,17 +50,10 @@ const Timeline = { TimelineMenu }, computed: { - timelineError () { - return this.$store.state.statuses.error - }, - errorData () { - return this.$store.state.statuses.errorData - }, newStatusCount () { return this.timeline.newStatusCount }, showLoadButton () { - if (this.timelineError || this.errorData) return false return this.timeline.newStatusCount > 0 || this.timeline.flushMarker !== 0 }, loadButtonString () { @@ -64,8 +64,10 @@ const Timeline = { } }, classes () { + let rootClasses = !this.embedded ? ['panel', 'panel-default'] : [] + if (this.blockingClicks) rootClasses = rootClasses.concat(['-blocked', '_misclick-prevention']) return { - root: ['timeline'].concat(!this.embedded ? ['panel', 'panel-default'] : []), + root: rootClasses, header: ['timeline-heading'].concat(!this.embedded ? ['panel-heading'] : []), body: ['timeline-body'].concat(!this.embedded ? ['panel-body'] : []), footer: ['timeline-footer'].concat(!this.embedded ? ['panel-footer'] : []) @@ -124,6 +126,15 @@ const Timeline = { this.$store.commit('setLoading', { timeline: this.timelineName, value: false }) }, methods: { + stopBlockingClicks: debounce(function () { + this.blockingClicks = false + }, 1000), + blockClicksTemporarily () { + if (!this.blockingClicks) { + this.blockingClicks = true + } + this.stopBlockingClicks() + }, handleShortKey (e) { // Ignore when input fields are focused if (['textarea', 'input'].includes(e.target.tagName.toLowerCase())) return @@ -135,6 +146,7 @@ const Timeline = { this.$store.commit('queueFlush', { timeline: this.timelineName, id: 0 }) this.fetchOlderStatuses() } else { + this.blockClicksTemporarily() this.$store.commit('showNewStatuses', { timeline: this.timelineName }) this.paused = false } @@ -152,11 +164,12 @@ const Timeline = { userId: this.userId, tag: this.tag }).then(({ statuses }) => { - store.commit('setLoading', { timeline: this.timelineName, value: false }) if (statuses && statuses.length === 0) { this.bottomedOut = true } - }) + }).finally(() => + store.commit('setLoading', { timeline: this.timelineName, value: false }) + ) }, 1000, this), determineVisibleStatuses () { if (!this.$refs.timeline) return diff --git a/src/components/timeline/timeline.vue b/src/components/timeline/timeline.vue index c1e2f44b..4c43fe5c 100644 --- a/src/components/timeline/timeline.vue +++ b/src/components/timeline/timeline.vue @@ -1,24 +1,10 @@ <template> - <div :class="[classes.root, 'timeline']"> + <div :class="[classes.root, 'Timeline']"> <div :class="classes.header"> <TimelineMenu v-if="!embedded" /> - <div - v-if="timelineError" - class="loadmore-error alert error" - @click.prevent - > - {{ $t('timeline.error_fetching') }} - </div> - <div - v-else-if="errorData" - class="loadmore-error alert error" - @click.prevent - > - {{ errorData.statusText }} - </div> <button - v-else-if="showLoadButton" - class="loadmore-button" + v-if="showLoadButton" + class="button-default loadmore-button" @click.prevent="showNewStatuses" > {{ loadButtonString }} @@ -75,24 +61,24 @@ > {{ $t('timeline.no_more_statuses') }} </div> - <a - v-else-if="!timeline.loading && !errorData" - href="#" + <button + v-else-if="!timeline.loading" + class="button-unstyled -link -fullwidth" @click.prevent="fetchOlderStatuses()" > - <div class="new-status-notification text-center panel-footer">{{ $t('timeline.load_older') }}</div> - </a> - <a - v-else-if="errorData" - href="#" - > - <div class="new-status-notification text-center panel-footer">{{ errorData.error }}</div> - </a> + <div class="new-status-notification text-center panel-footer"> + {{ $t('timeline.load_older') }} + </div> + </button> <div v-else class="new-status-notification text-center panel-footer" > - <i class="icon-spin3 animate-spin" /> + <FAIcon + icon="circle-notch" + spin + size="lg" + /> </div> </div> </div> @@ -103,15 +89,20 @@ <style lang="scss"> @import '../../_variables.scss'; -.timeline { +.Timeline { .loadmore-text { opacity: 1; } + + &.-blocked { + cursor: progress; + } } .timeline-heading { max-width: 100%; flex-wrap: nowrap; + align-items: center; .loadmore-button { flex-shrink: 0; } diff --git a/src/components/timeline_menu/timeline_menu.js b/src/components/timeline_menu/timeline_menu.js index 2be75b06..8d6a58b1 100644 --- a/src/components/timeline_menu/timeline_menu.js +++ b/src/components/timeline_menu/timeline_menu.js @@ -1,7 +1,25 @@ import Popover from '../popover/popover.vue' import { mapState } from 'vuex' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faUsers, + faGlobe, + faBookmark, + faEnvelope, + faHome, + faChevronDown +} from '@fortawesome/free-solid-svg-icons' -// Route -> i18n key mapping, exported andnot in the computed +library.add( + faUsers, + faGlobe, + faBookmark, + faEnvelope, + faHome, + faChevronDown +) + +// Route -> i18n key mapping, exported and not in the computed // because nav panel benefits from the same information. export const timelineNames = () => { return { @@ -9,8 +27,7 @@ export const timelineNames = () => { 'bookmarks': 'nav.bookmarks', 'dms': 'nav.dms', 'public-timeline': 'nav.public_tl', - 'public-external-timeline': 'nav.twkn', - 'tag-timeline': 'tag' + 'public-external-timeline': 'nav.twkn' } } @@ -42,6 +59,14 @@ const TimelineMenu = { this.isOpen = true }, 25) }, + blockOpen (event) { + // For the blank area inside the button element. + // Just setting @click.stop="" makes unintuitive behavior when + // menu is open and clicking on the blank area doesn't close it. + if (!this.isOpen) { + event.stopPropagation() + } + }, timelineName () { const route = this.$route.name if (route === 'tag-timeline') { diff --git a/src/components/timeline_menu/timeline_menu.vue b/src/components/timeline_menu/timeline_menu.vue index b7e5f2da..3c86842b 100644 --- a/src/components/timeline_menu/timeline_menu.vue +++ b/src/components/timeline_menu/timeline_menu.vue @@ -1,7 +1,7 @@ <template> <Popover trigger="click" - class="timeline-menu" + class="TimelineMenu" :class="{ 'open': isOpen }" :margin="{ left: -15, right: -200 }" :bound-to="{ x: 'container' }" @@ -16,27 +16,47 @@ <ul> <li v-if="currentUser"> <router-link :to="{ name: 'friends' }"> - <i class="button-icon icon-home-2" />{{ $t("nav.timeline") }} + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding " + icon="home" + />{{ $t("nav.timeline") }} </router-link> </li> <li v-if="currentUser"> <router-link :to="{ name: 'bookmarks'}"> - <i class="button-icon icon-bookmark" />{{ $t("nav.bookmarks") }} + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding " + icon="bookmark" + />{{ $t("nav.bookmarks") }} </router-link> </li> <li v-if="currentUser"> <router-link :to="{ name: 'dms', params: { username: currentUser.screen_name } }"> - <i class="button-icon icon-mail-alt" />{{ $t("nav.dms") }} + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding " + icon="envelope" + />{{ $t("nav.dms") }} </router-link> </li> <li v-if="currentUser || !privateMode"> <router-link :to="{ name: 'public-timeline' }"> - <i class="button-icon icon-users" />{{ $t("nav.public_tl") }} + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding " + icon="users" + />{{ $t("nav.public_tl") }} </router-link> </li> <li v-if="federating && (currentUser || !privateMode)"> <router-link :to="{ name: 'public-external-timeline' }"> - <i class="button-icon icon-globe" />{{ $t("nav.twkn") }} + <FAIcon + fixed-width + class="fa-scale-110 fa-old-padding " + icon="globe" + />{{ $t("nav.twkn") }} </router-link> </li> </ul> @@ -45,8 +65,17 @@ slot="trigger" class="title timeline-menu-title" > - <span>{{ timelineName() }}</span> - <i class="icon-down-open" /> + <span class="timeline-title">{{ timelineName() }}</span> + <span> + <FAIcon + size="sm" + icon="chevron-down" + /> + </span> + <span + class="click-blocker" + @click="blockOpen" + /> </div> </Popover> </template> @@ -56,17 +85,19 @@ <style lang="scss"> @import '../../_variables.scss'; -.timeline-menu { +.TimelineMenu { flex-shrink: 1; margin-right: auto; min-width: 0; width: 24rem; + .timeline-menu-popover-wrap { overflow: hidden; // Match panel heading padding to line up menu with bottom of heading margin-top: 0.6rem; padding: 0 15px 15px 15px; } + .timeline-menu-popover { width: 24rem; max-width: 100vw; @@ -77,10 +108,12 @@ transform: translateY(-100%); transition: transform 100ms; } + .panel::after { border-top-right-radius: 0; border-top-left-radius: 0; } + &.open .timeline-menu-popover { transform: translateY(0); } @@ -88,25 +121,28 @@ .timeline-menu-title { margin: 0; cursor: pointer; - display: flex; user-select: none; width: 100%; + display: flex; - span { + .timeline-menu-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } - i { + svg { margin-left: 0.6em; - flex-shrink: 0; - font-size: 1rem; transition: transform 100ms; } + + .click-blocker { + cursor: default; + flex-grow: 1; + } } - &.open .timeline-menu-title i { + &.open .timeline-menu-title svg { color: $fallback--text; color: var(--panelText, $fallback--text); transform: rotate(180deg); @@ -171,8 +207,9 @@ } } - i { - margin-right: 0.5em; + svg { + margin-right: 0.4em; + margin-left: -0.2em; } } } diff --git a/src/components/user_avatar/user_avatar.vue b/src/components/user_avatar/user_avatar.vue index eb3d375e..0f7c584b 100644 --- a/src/components/user_avatar/user_avatar.vue +++ b/src/components/user_avatar/user_avatar.vue @@ -20,11 +20,14 @@ @import '../../_variables.scss'; .Avatar { - --still-image-label-visibility: hidden; + --_avatarShadowBox: var(--avatarStatusShadow); + --_avatarShadowFilter: var(--avatarStatusShadowFilter); + --_avatarShadowInset: var(--avatarStatusShadowInset); + --_still-image-label-visibility: hidden; width: 48px; height: 48px; - box-shadow: var(--avatarStatusShadow); + box-shadow: var(--_avatarShadowBox); border-radius: $fallback--avatarRadius; border-radius: var(--avatarRadius, $fallback--avatarRadius); @@ -34,8 +37,8 @@ } &.better-shadow { - box-shadow: var(--avatarStatusShadowInset); - filter: var(--avatarStatusShadowFilter) + box-shadow: var(--_avatarShadowInset); + filter: var(--_avatarShadowFilter); } &.animated::before { diff --git a/src/components/user_card/user_card.js b/src/components/user_card/user_card.js index 8e6b9d7f..3a8efafc 100644 --- a/src/components/user_card/user_card.js +++ b/src/components/user_card/user_card.js @@ -6,6 +6,22 @@ import ModerationTools from '../moderation_tools/moderation_tools.vue' import AccountActions from '../account_actions/account_actions.vue' import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator' import { mapGetters } from 'vuex' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faBell, + faRss, + faChevronDown, + faSearchPlus, + faExternalLinkAlt +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faRss, + faBell, + faChevronDown, + faSearchPlus, + faExternalLinkAlt +) export default { props: [ diff --git a/src/components/user_card/user_card.vue b/src/components/user_card/user_card.vue index 041bb80f..773f764a 100644 --- a/src/components/user_card/user_card.vue +++ b/src/components/user_card/user_card.vue @@ -21,7 +21,10 @@ :user="user" /> <div class="user-info-avatar-link-overlay"> - <i class="button-icon icon-zoom-in" /> + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="search-plus" + /> </div> </a> <router-link @@ -54,8 +57,12 @@ v-if="isOtherUser && !user.is_local" :href="user.statusnet_profile_url" target="_blank" + class="external-link-button" > - <i class="icon-link-ext usersettings" /> + <FAIcon + class="icon" + icon="external-link-alt" + /> </a> <AccountActions v-if="isOtherUser && loggedIn" @@ -76,7 +83,7 @@ v-if="!!visibleRole" class="alert user-role" > - {{ visibleRole }} + {{ $t(`user_card.roles.${visibleRole}`) }} </span> <span v-if="user.bot" @@ -85,7 +92,13 @@ bot </span> </template> - <span v-if="user.locked"><i class="icon icon-lock" /></span> + <span v-if="user.locked"> + <FAIcon + class="lock-icon" + icon="lock" + size="sm" + /> + </span> <span v-if="!mergedConfig.hideUserStats && !hideBio" class="dailyAvg" @@ -133,7 +146,10 @@ <option value="striped">Striped bg</option> <option value="side">Side stripe</option> </select> - <i class="icon-down-open" /> + <FAIcon + class="select-down-icon" + icon="chevron-down" + /> </label> </div> </div> @@ -146,33 +162,44 @@ <template v-if="relationship.following"> <ProgressButton v-if="!relationship.subscribing" - class="btn btn-default" + class="btn button-default" :click="subscribeUser" :title="$t('user_card.subscribe')" > - <i class="icon-bell-alt" /> + <FAIcon icon="bell" /> </ProgressButton> <ProgressButton v-else - class="btn btn-default toggled" + class="btn button-default toggled" :click="unsubscribeUser" :title="$t('user_card.unsubscribe')" > - <i class="icon-bell-ringing-o" /> + <FALayers> + <FAIcon + icon="rss" + transform="left-5 shrink-6 up-3 rotate-20" + flip="horizontal" + /> + <FAIcon + icon="rss" + transform="right-5 shrink-6 up-3 rotate-20" + /> + <FAIcon icon="bell" /> + </FALayers> </ProgressButton> </template> </div> <div> <button v-if="relationship.muting" - class="btn btn-default btn-block toggled" + class="btn button-default btn-block toggled" @click="unmuteUser" > {{ $t('user_card.muted') }} </button> <button v-else - class="btn btn-default btn-block" + class="btn button-default btn-block" @click="muteUser" > {{ $t('user_card.mute') }} @@ -180,7 +207,7 @@ </div> <div> <button - class="btn btn-default btn-block" + class="btn button-default btn-block" @click="mentionUser" > {{ $t('user_card.mention') }} @@ -255,6 +282,11 @@ .user-card { position: relative; + &:hover .Avatar { + --_still-image-img-visibility: visible; + --_still-image-canvas-visibility: hidden; + } + .panel-heading { padding: .5em 0; text-align: center; @@ -283,7 +315,7 @@ mask: linear-gradient(to top, white, transparent) bottom no-repeat, linear-gradient(to top, white, white); // Autoprefixed seem to ignore this one, and also syntax is different - -webkit-mask-composite: xor; + -webkit-mask-composite: xor; mask-composite: exclude; background-size: cover; mask-size: 100% 60%; @@ -355,20 +387,17 @@ max-height: 56px; .Avatar { + --_avatarShadowBox: var(--avatarShadow); + --_avatarShadowFilter: var(--avatarShadowFilter); + --_avatarShadowInset: var(--avatarShadowInset); + flex: 1 0 100%; width: 56px; height: 56px; - box-shadow: 0px 1px 8px rgba(0,0,0,0.75); - box-shadow: var(--avatarShadow); object-fit: cover; } } - &:hover .Avatar { - --still-image-img: visible; - --still-image-canvas: hidden; - } - &-avatar-link { position: relative; cursor: pointer; @@ -388,7 +417,7 @@ opacity: 0; transition: opacity .2s ease; - i { + svg { color: #FFF; } } @@ -398,10 +427,17 @@ } } - .usersettings { - color: $fallback--lightText; - color: var(--lightText, $fallback--lightText); - opacity: .8; + .external-link-button { + cursor: pointer; + width: 2.5em; + text-align: center; + margin: -0.5em 0; + padding: 0.5em 0; + + &:not(:hover) .icon { + color: $fallback--lightText; + color: var(--lightText, $fallback--lightText); + } } .user-summary { @@ -447,6 +483,10 @@ font-weight: light; font-size: 15px; + .lock-icon { + margin-left: 0.5em; + } + .user-screen-name { min-width: 1px; flex: 0 1 auto; @@ -467,7 +507,6 @@ .user-role { flex: none; - text-transform: capitalize; color: $fallback--text; color: var(--alertNeutralText, $fallback--text); background-color: $fallback--fg; @@ -508,7 +547,7 @@ padding-bottom: 0; flex: 1 0 auto; } - .userHighlightSel.select i { + .userHighlightSel.select svg { line-height: 22px; } diff --git a/src/components/user_list_popover/user_list_popover.js b/src/components/user_list_popover/user_list_popover.js index b60f2c4c..32ca2b8d 100644 --- a/src/components/user_list_popover/user_list_popover.js +++ b/src/components/user_list_popover/user_list_popover.js @@ -1,3 +1,9 @@ +import { library } from '@fortawesome/fontawesome-svg-core' +import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' + +library.add( + faCircleNotch +) const UserListPopover = { name: 'UserListPopover', diff --git a/src/components/user_list_popover/user_list_popover.vue b/src/components/user_list_popover/user_list_popover.vue index 185c73ca..95673733 100644 --- a/src/components/user_list_popover/user_list_popover.vue +++ b/src/components/user_list_popover/user_list_popover.vue @@ -31,7 +31,11 @@ </div> </div> <div v-else> - <i class="icon-spin4 animate-spin" /> + <FAIcon + icon="circle-notch" + spin + size="3x" + /> </div> </div> </Popover> diff --git a/src/components/user_profile/user_profile.js b/src/components/user_profile/user_profile.js index 201727d4..c0b55a6c 100644 --- a/src/components/user_profile/user_profile.js +++ b/src/components/user_profile/user_profile.js @@ -6,6 +6,14 @@ import Conversation from '../conversation/conversation.vue' import TabSwitcher from 'src/components/tab_switcher/tab_switcher.js' import List from '../list/list.vue' import withLoadMore from '../../hocs/with_load_more/with_load_more' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faCircleNotch +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faCircleNotch +) const FollowerList = withLoadMore({ fetch: (props, $store) => $store.dispatch('fetchFollowers', props.userId), diff --git a/src/components/user_profile/user_profile.vue b/src/components/user_profile/user_profile.vue index b26499b4..745e795d 100644 --- a/src/components/user_profile/user_profile.vue +++ b/src/components/user_profile/user_profile.vue @@ -20,14 +20,13 @@ :key="index" class="user-profile-field" > + <!-- eslint-disable vue/no-v-html --> <dt :title="user.fields_text[index].name" class="user-profile-field-name" @click.prevent="linkClicked" - > - {{ field.name }} - </dt> - <!-- eslint-disable vue/no-v-html --> + v-html="field.name" + /> <dd :title="user.fields_text[index].value" class="user-profile-field-value" @@ -122,9 +121,10 @@ </div> <div class="panel-body"> <span v-if="error">{{ error }}</span> - <i + <FAIcon v-else - class="icon-spin3 animate-spin" + spin + icon="circle-notch" /> </div> </div> @@ -142,6 +142,7 @@ .user-profile-fields { margin: 0 0.5em; + img { object-fit: contain; vertical-align: middle; diff --git a/src/components/user_reporting_modal/user_reporting_modal.js b/src/components/user_reporting_modal/user_reporting_modal.js index 38cf117b..8d171b2d 100644 --- a/src/components/user_reporting_modal/user_reporting_modal.js +++ b/src/components/user_reporting_modal/user_reporting_modal.js @@ -38,17 +38,23 @@ const UserReportingModal = { }, statuses () { return this.$store.state.reports.statuses + }, + preTickedIds () { + return this.$store.state.reports.preTickedIds } }, watch: { - userId: 'resetState' + userId: 'resetState', + preTickedIds (newValue) { + this.statusIdsToReport = newValue + } }, methods: { resetState () { // Reset state this.comment = '' this.forward = false - this.statusIdsToReport = [] + this.statusIdsToReport = this.preTickedIds this.processing = false this.error = false }, diff --git a/src/components/user_reporting_modal/user_reporting_modal.vue b/src/components/user_reporting_modal/user_reporting_modal.vue index 2a8d8d48..fb43094f 100644 --- a/src/components/user_reporting_modal/user_reporting_modal.vue +++ b/src/components/user_reporting_modal/user_reporting_modal.vue @@ -29,7 +29,7 @@ </div> <div> <button - class="btn btn-default" + class="btn button-default" :disabled="processing" @click="reportUser" > diff --git a/src/components/video_attachment/video_attachment.vue b/src/components/video_attachment/video_attachment.vue index a4bf01e8..8a3ea1e3 100644 --- a/src/components/video_attachment/video_attachment.vue +++ b/src/components/video_attachment/video_attachment.vue @@ -1,6 +1,7 @@ <template> <video class="video" + preload="metadata" :src="attachment.url" :loop="loopVideo" :controls="controls" diff --git a/src/hocs/with_load_more/with_load_more.js b/src/hocs/with_load_more/with_load_more.js index 6142f513..671b2b6f 100644 --- a/src/hocs/with_load_more/with_load_more.js +++ b/src/hocs/with_load_more/with_load_more.js @@ -3,6 +3,16 @@ import isEmpty from 'lodash/isEmpty' import { getComponentProps } from '../../services/component_utils/component_utils' import './with_load_more.scss' +import { FontAwesomeIcon as FAIcon } from '@fortawesome/vue-fontawesome' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faCircleNotch +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faCircleNotch +) + const withLoadMore = ({ fetch, // function to fetch entries and return a promise select, // function to select data from store @@ -19,12 +29,8 @@ const withLoadMore = ({ return { loading: false, bottomedOut: false, - error: false - } - }, - computed: { - entries () { - return select(this.$props, this.$store) || [] + error: false, + entries: [] } }, created () { @@ -38,6 +44,11 @@ const withLoadMore = ({ destroy && destroy(this.$props, this.$store) }, methods: { + // Entries is not a computed because computed can't track the dynamic + // selector for changes and won't trigger after fetch. + updateEntries () { + this.entries = select(this.$props, this.$store) || [] + }, fetchEntries () { if (!this.loading) { this.loading = true @@ -51,6 +62,9 @@ const withLoadMore = ({ this.loading = false this.error = true }) + .finally(() => { + this.updateEntries() + }) } }, scrollLoad (e) { @@ -81,8 +95,12 @@ const withLoadMore = ({ {children} </WrappedComponent> <div class="with-load-more-footer"> - {this.error && <a onClick={this.fetchEntries} class="alert error">{this.$t('general.generic_error')}</a>} - {!this.error && this.loading && <i class="icon-spin3 animate-spin"/>} + {this.error && + <button onClick={this.fetchEntries} class="button-unstyled -link -fullwidth alert error"> + {this.$t('general.generic_error')} + </button> + } + {!this.error && this.loading && <FAIcon spin icon="circle-notch"/>} {!this.error && !this.loading && !this.bottomedOut && <a onClick={this.fetchEntries}>{this.$t('general.more')}</a>} </div> </div> diff --git a/src/hocs/with_subscription/with_subscription.js b/src/hocs/with_subscription/with_subscription.js index 1775adcb..b1244276 100644 --- a/src/hocs/with_subscription/with_subscription.js +++ b/src/hocs/with_subscription/with_subscription.js @@ -3,6 +3,16 @@ import isEmpty from 'lodash/isEmpty' import { getComponentProps } from '../../services/component_utils/component_utils' import './with_subscription.scss' +import { FontAwesomeIcon as FAIcon } from '@fortawesome/vue-fontawesome' +import { library } from '@fortawesome/fontawesome-svg-core' +import { + faCircleNotch +} from '@fortawesome/free-solid-svg-icons' + +library.add( + faCircleNotch +) + const withSubscription = ({ fetch, // function to fetch entries and return a promise select, // function to select data from store @@ -72,7 +82,7 @@ const withSubscription = ({ <div class="with-subscription-loading"> {this.error ? <a onClick={this.fetchData} class="alert error">{this.$t('general.generic_error')}</a> - : <i class="icon-spin3 animate-spin"/> + : <FAIcon spin icon="circle-notch"/> } </div> ) diff --git a/src/i18n/en.json b/src/i18n/en.json index e25bda8f..1d087bbd 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -50,7 +50,8 @@ "scope_options": "Scope options", "text_limit": "Text limit", "title": "Features", - "who_to_follow": "Who to follow" + "who_to_follow": "Who to follow", + "upload_limit": "Upload limit" }, "finder": { "error_fetching_user": "Error fetching user", @@ -130,6 +131,7 @@ }, "notifications": { "broken_favorite": "Unknown status, searching for it…", + "error": "Error fetching notifications: {0}", "favorited_you": "favorited your status", "followed_you": "followed you", "follow_request": "wants to follow you", @@ -328,6 +330,7 @@ "hide_muted_posts": "Hide posts of muted users", "max_thumbnails": "Maximum amount of thumbnails per post", "hide_isp": "Hide instance-specific panel", + "hide_wallpaper": "Hide instance wallpaper", "preload_images": "Preload images", "use_one_click_nsfw": "Open NSFW attachments with just one click", "hide_post_stats": "Hide post statistics (e.g. the number of favorites)", @@ -377,7 +380,7 @@ "hide_followers_count_description": "Don't show follower count", "show_admin_badge": "Show Admin badge in my profile", "show_moderator_badge": "Show Moderator badge in my profile", - "nsfw_clickthrough": "Enable clickthrough NSFW attachment hiding", + "nsfw_clickthrough": "Enable clickthrough attachment and link preview image hiding for NSFW statuses", "oauth_tokens": "OAuth tokens", "token": "Token", "refresh_token": "Refresh Token", @@ -515,6 +518,7 @@ "inputs": "Input fields", "faint_text": "Faded text", "underlay": "Underlay", + "wallpaper": "Wallpaper", "poll": "Poll graph", "icons": "Icons", "highlight": "Highlighted elements", @@ -635,7 +639,7 @@ "timeline": { "collapse": "Collapse", "conversation": "Conversation", - "error_fetching": "Error fetching updates", + "error": "Error fetching timeline: {0}", "load_older": "Load older statuses", "no_retweet_hint": "Post is marked as followers-only or direct and cannot be repeated", "repeated": "repeated", @@ -661,13 +665,16 @@ "unmute_conversation": "Unmute conversation", "status_unavailable": "Status unavailable", "copy_link": "Copy link to status", + "external_source": "External source", "thread_muted": "Thread muted", "thread_muted_and_words": ", has words:", "show_full_subject": "Show full subject", "hide_full_subject": "Hide full subject", "show_content": "Show content", "hide_content": "Hide content", - "status_deleted": "This post was deleted" + "status_deleted": "This post was deleted", + "nsfw": "NSFW", + "expand": "Expand" }, "user_card": { "approve": "Approve", @@ -723,6 +730,10 @@ "quarantine": "Disallow user posts from federating", "delete_user": "Delete user", "delete_user_confirmation": "Are you absolutely sure? This action cannot be undone." + }, + "roles": { + "admin": "Admin", + "moderator": "Moderator" } }, "user_profile": { @@ -757,6 +768,7 @@ "upload": { "error": { "base": "Upload failed.", + "message": "Upload failed: {0}", "file_too_big": "File too big [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]", "default": "Try again later" }, diff --git a/src/i18n/eo.json b/src/i18n/eo.json index e73ac2f8..58f8e125 100644 --- a/src/i18n/eo.json +++ b/src/i18n/eo.json @@ -5,12 +5,13 @@ "features_panel": { "chat": "Babilejo", "gopher": "Gopher", - "media_proxy": "Vidaŭdaĵa prokurilo", + "media_proxy": "Vidaŭdaĵa retperilo", "scope_options": "Agordoj de amplekso", "text_limit": "Limo de teksto", "title": "Funkcioj", "who_to_follow": "Kiun aboni", - "pleroma_chat_messages": "Babilejo de Pleroma" + "pleroma_chat_messages": "Babilejo de Pleroma", + "upload_limit": "Limo de alŝutoj" }, "finder": { "error_fetching_user": "Eraris alporto de uzanto", @@ -33,7 +34,8 @@ "show_more": "Montri plion", "retry": "Reprovi", "error_retry": "Bonvolu reprovi", - "loading": "Enlegante…" + "loading": "Enlegante…", + "peek": "Antaŭmontri" }, "image_cropper": { "crop_picture": "Tondi bildon", @@ -70,9 +72,9 @@ "friend_requests": "Petoj pri abono", "mentions": "Mencioj", "dms": "Rektaj mesaĝoj", - "public_tl": "Publika tempolinio", - "timeline": "Tempolinio", - "twkn": "La tuta konata reto", + "public_tl": "Publika historio", + "timeline": "Historio", + "twkn": "Konata reto", "user_search": "Serĉi uzantojn", "who_to_follow": "Kiun aboni", "preferences": "Agordoj", @@ -80,7 +82,8 @@ "search": "Serĉi", "interactions": "Interagoj", "administration": "Administrado", - "bookmarks": "Legosignoj" + "bookmarks": "Legosignoj", + "timelines": "Historioj" }, "notifications": { "broken_favorite": "Nekonata stato, serĉante ĝin…", @@ -93,7 +96,8 @@ "no_more_notifications": "Neniuj pliaj sciigoj", "reacted_with": "reagis per {0}", "migrated_to": "migris al", - "follow_request": "volas vin aboni" + "follow_request": "volas vin aboni", + "error": "Eraris akirado de sciigoj: {0}" }, "post_status": { "new_status": "Afiŝi novan staton", @@ -107,14 +111,14 @@ "text/html": "HTML" }, "content_warning": "Temo (malnepra)", - "default": "Ĵus alvenis al la Universala Kongreso!", + "default": "Ĵus alvenis Esperantujon!", "direct_warning": "Ĉi tiu afiŝo estos videbla nur por ĉiuj menciitaj uzantoj.", "posting": "Afiŝante", "scope": { "direct": "Rekta – Afiŝi nur al menciitaj uzantoj", "private": "Nur abonantoj – Afiŝi nur al abonantoj", - "public": "Publika – Afiŝi al publikaj tempolinioj", - "unlisted": "Nelistigita – Ne afiŝi al publikaj tempolinioj" + "public": "Publika – Afiŝi al publikaj historioj", + "unlisted": "Nelistigita – Ne afiŝi al publikaj historioj" }, "scope_notice": { "unlisted": "Ĉi tiu afiŝo ne estos videbla en la Publika historio kaj La tuta konata reto", @@ -132,14 +136,14 @@ "registration": { "bio": "Priskribo", "email": "Retpoŝtadreso", - "fullname": "Vidiga nomo", + "fullname": "Prezenta nomo", "password_confirm": "Konfirmo de pasvorto", "registration": "Registriĝo", "token": "Invita ĵetono", "captcha": "TESTO DE HOMECO", "new_captcha": "Klaku la bildon por akiri novan teston", "username_placeholder": "ekz. lain", - "fullname_placeholder": "ekz. Lain Iwakura", + "fullname_placeholder": "ekz. Lain Ivakura", "bio_placeholder": "ekz.\nSaluton, mi estas Lain.\nMi estas animea knabino vivanta en Japanujo. Eble vi konas min pro la retejo « Wired ».", "validations": { "username_required": "ne povas resti malplena", @@ -162,7 +166,7 @@ "blocks_tab": "Blokitoj", "btnRadius": "Butonoj", "cBlue": "Blua (respondi, aboni)", - "cGreen": "Verda (kunhavigi)", + "cGreen": "Verda (diskonigi)", "cOrange": "Oranĝa (ŝati)", "cRed": "Ruĝa (nuligi)", "change_password": "Ŝanĝi pasvorton", @@ -193,7 +197,7 @@ "foreground": "Malfono", "general": "Ĝenerala", "hide_attachments_in_convo": "Kaŝi kunsendaĵojn en interparoloj", - "hide_attachments_in_tl": "Kaŝi kunsendaĵojn en tempolinio", + "hide_attachments_in_tl": "Kaŝi kunsendaĵojn en historioj", "max_thumbnails": "Maksimuma nombro da bildetoj en afiŝo", "hide_isp": "Kaŝi breton propran al nodo", "preload_images": "Antaŭ-enlegi bildojn", @@ -205,8 +209,8 @@ "import_theme": "Enlegi antaŭagordojn", "inputRadius": "Enigaj kampoj", "checkboxRadius": "Markbutonoj", - "instance_default": "(implicita: {value})", - "instance_default_simple": "(implicita)", + "instance_default": "(originale: {value})", + "instance_default_simple": "(originale)", "interface": "Fasado", "interfaceLanguage": "Lingvo de fasado", "invalid_theme_imported": "La elektita dosiero ne estas subtenata haŭto de Pleromo. Neniuj ŝanĝoj al via haŭto okazis.", @@ -217,7 +221,7 @@ "loop_video_silent_only": "Ripetadi nur filmojn sen sono (ekz. la «GIF-ojn» de Mastodon)", "mutes_tab": "Silentigoj", "play_videos_in_modal": "Ludi filmojn en ŝpruca kadro", - "use_contain_fit": "Ne tondi la kunsendaĵon en bildetoj", + "use_contain_fit": "Ne pritondi bildetojn de kunsendaĵoj", "name": "Nomo", "name_bio": "Nomo kaj priskribo", "new_password": "Nova pasvorto", @@ -233,7 +237,7 @@ "hide_followers_description": "Ne montri kiu min sekvas", "show_admin_badge": "Montri la insignon de administranto en mia profilo", "show_moderator_badge": "Montri la insignon de reguligisto en mia profilo", - "nsfw_clickthrough": "Ŝalti traklakan kaŝadon de konsternaj kunsendaĵoj", + "nsfw_clickthrough": "Ŝalti traklakan kaŝadon de kunsendaĵoj kaj antaŭmontroj de ligiloj por konsternaj statoj", "oauth_tokens": "Ĵetonoj de OAuth", "token": "Ĵetono", "refresh_token": "Ĵetono de aktualigo", @@ -246,7 +250,7 @@ "profile_banner": "Rubando de profilo", "profile_tab": "Profilo", "radii_help": "Agordi fasadan rondigon de randoj (bildere)", - "replies_in_timeline": "Respondoj en tempolinio", + "replies_in_timeline": "Respondoj en historioj", "reply_visibility_all": "Montri ĉiujn respondojn", "reply_visibility_following": "Montri nur respondojn por mi aŭ miaj abonatoj", "reply_visibility_self": "Montri nur respondojn por mi", @@ -263,7 +267,7 @@ "subject_line_email": "Kiel retpoŝto: «re: temo»", "subject_line_mastodon": "Kiel Mastodon: kopii senŝanĝe", "subject_line_noop": "Ne kopii", - "post_status_content_type": "Afiŝi specon de la enhavo de la stato", + "post_status_content_type": "Speco de enhavo de afiŝo", "stop_gifs": "Movi GIF-bildojn dum ŝvebo de muso", "streaming": "Ŝalti memagan fluigon de novaj afiŝoj kiam vi vidas la supron de la paĝo", "text": "Teksto", @@ -297,7 +301,12 @@ "older_version_imported": "La enportita dosiero estis farita per pli malnova versio de PleromaFE.", "future_version_imported": "La enportita dosiero estis farita per pli nova versio de PleromaFE.", "v2_imported": "La dosiero, kiun vi enportis, estis farita por malnova versio de PleromaFE. Ni provas maksimumigi interkonformecon, sed tamen eble montriĝos misoj.", - "upgraded_from_v2": "PleromaFE estis ĝisdatigita; la haŭto eble aspektos malsame ol kiel vi ĝin memoras." + "upgraded_from_v2": "PleromaFE estis ĝisdatigita; la haŭto eble aspektos malsame ol kiel vi ĝin memoras.", + "snapshot_missing": "Neniu momentokopio de haŭto estis en la dosiero, ĝi povas aspekti iom malsame ol oni intencis.", + "snapshot_present": "Ĉiuj valoroj estas transpasataj, ĉar momentokopio de haŭto estas enlegita. Vi povas enlegi anstataŭe la aktualajn datumojn de haŭto.", + "snapshot_source_mismatch": "Versioj konfliktas: plej probable la fasado estis reirigita kaj ree ĝisdatigita; se vi ŝanĝis la haŭton per pli malnova versio de la fasado, vi probable volas uzi la malnovan version. Alie uzu la novan.", + "migration_napshot_gone": "Ial mankis momentokopio; io povus aspekti malsame ol en via memoro.", + "migration_snapshot_ok": "Certige, momentokopio de la haŭto enlegiĝis. Vi povas provi enlegi datumojn de la haŭto." }, "use_source": "Nova versio", "use_snapshot": "Malnova versio", @@ -352,10 +361,11 @@ "icons": "Bildsimboloj", "poll": "Grafo de enketo", "underlay": "Subtavolo", - "popover": "Ŝpruchelpiloj, menuoj", + "popover": "Ŝprucaĵoj, menuoj", "post": "Afiŝoj/Priskriboj de uzantoj", "alert_neutral": "Neŭtrala", - "alert_warning": "Averto" + "alert_warning": "Averto", + "toggled": "Ŝaltita" }, "radii": { "_tab_label": "Rondeco" @@ -371,7 +381,7 @@ "hint": "Por ombroj vi ankaŭ povas uzi --variable kiel koloran valoron, por uzi variantojn de CSS3. Bonvolu rimarki, ke tiuokaze agordoj de maltravidebleco ne funkcios.", "filter_hint": { "always_drop_shadow": "Averto: ĉi tiu ombro ĉiam uzas {0} kiam la foliumilo tion subtenas.", - "drop_shadow_syntax": "{0} ne subtenas parametron {1} kaj ŝlosilvorton {2}.", + "drop_shadow_syntax": "{0} ne subtenas parametron {1} kaj ĉefvorton {2}.", "avatar_inset": "Bonvolu rimarki, ke agordi ambaŭ internajn kaj eksterajn ombrojn por profilbildoj povas redoni neatenditajn rezultojn ĉe profilbildoj travideblaj.", "spread_zero": "Ombroj kun vastigo > 0 aperos kvazaŭ ĝi estus fakte nulo", "inset_classic": "Internaj ombroj uzos {0}" @@ -386,9 +396,10 @@ "button": "Butono", "buttonHover": "Butono (je ŝvebo)", "buttonPressed": "Butono (premita)", - "buttonPressedHover": "Butono (premita kaj je ŝvebo)", + "buttonPressedHover": "Butono (je premo kaj ŝvebo)", "input": "Eniga kampo" - } + }, + "hintV3": "Kolorojn de ombroj vi ankaŭ povas skribi per la sistemo {0}." }, "fonts": { "_tab_label": "Tiparoj", @@ -411,7 +422,7 @@ "button": "Butono", "text": "Kelko da pliaj {0} kaj {1}", "mono": "enhavo", - "input": "Ĵus alvenis al la Universala Kongreso!", + "input": "Ĵus alvenis Esperantujon!", "faint_link": "helpan manlibron", "fine_print": "Legu nian {0} por nenion utilan ekscii!", "header_faint": "Tio estas en ordo", @@ -420,7 +431,7 @@ } }, "discoverable": "Permesi trovon de ĉi tiu konto en serĉrezultoj kaj aliaj servoj", - "mutes_and_blocks": "Silentigitoj kaj blokitoj", + "mutes_and_blocks": "Blokado kaj silentigoj", "chatMessageRadius": "Babileja mesaĝo", "changed_email": "Retpoŝtadreso sukcese ŝanĝiĝis!", "change_email_error": "Eraris ŝanĝo de via retpoŝtadreso.", @@ -448,7 +459,10 @@ "warning_of_generate_new_codes": "Kiam vi estigos novajn rehavajn kodojn, viaj malnovaj ne plu funkcios.", "generate_new_recovery_codes": "Estigi novajn rehavajn kodojn", "title": "Duobla aŭtentikigo", - "otp": "OTP" + "otp": "OTP", + "wait_pre_setup_otp": "antaŭagordante OTP", + "setup_otp": "Agordi OTP", + "confirm_and_enable": "Konfirmi kaj ŝalti OTP" }, "enter_current_password_to_confirm": "Enigu vian pasvorton por konfirmi vian identecon", "security": "Sekureco", @@ -480,11 +494,11 @@ }, "import_blocks_from_a_csv_file": "Enporti blokitojn el CSV-dosiero", "hide_muted_posts": "Kaŝi afiŝojn de silentigitaj uzantoj", - "emoji_reactions_on_timeline": "Montri bildosignajn reagojn en la tempolinio", + "emoji_reactions_on_timeline": "Montri bildosignajn reagojn en historioj", "pad_emoji": "Meti spacetojn ĉirkaŭ bildosigno post ties elekto", "domain_mutes": "Retnomoj", "notification_blocks": "Blokinte uzanton vi malabonos ĝin kaj haltigos ĉiujn sciigojn.", - "notification_mutes": "Por ne plu ricevi sciigojn de certa uzanto, silentigu.", + "notification_mutes": "Por ne plu ricevi sciigojn de certa uzanto, silentigu ĝin.", "notification_setting_hide_notification_contents": "Kaŝi la sendinton kaj la enhavojn de pasivaj sciigoj", "notification_setting_privacy": "Privateco", "notification_setting_block_from_strangers": "Bloki sciigojn de uzantoj, kiujn vi ne abonas", @@ -495,7 +509,14 @@ "backend_version": "Versio de internaĵo", "title": "Versio" }, - "accent": "Emfazo" + "accent": "Emfazo", + "virtual_scrolling": "Optimumigi bildigon de historioj", + "import_mutes_from_a_csv_file": "Enporti silentigojn el CSV-dosiero", + "mutes_imported": "Silentigoj enportiĝis! Traktado daŭros iom da tempo.", + "mute_import_error": "Eraris enporto de silentigoj", + "mute_import": "Enporto de silentigoj", + "mute_export_button": "Elportu viajn silentigojn al CSV-dosiero", + "mute_export": "Elporto de silentigoj" }, "timeline": { "collapse": "Maletendi", @@ -503,12 +524,13 @@ "error_fetching": "Eraris ĝisdatigo", "load_older": "Montri pli malnovajn statojn", "no_retweet_hint": "Afiŝo estas markita kiel rekta aŭ nur por abonantoj, kaj ne eblas ĝin ripeti", - "repeated": "ripetita", + "repeated": "ripetis", "show_new": "Montri novajn", "up_to_date": "Ĝisdata", "no_more_statuses": "Neniuj pliaj statoj", "no_statuses": "Neniuj statoj", - "reload": "Enlegi ree" + "reload": "Enlegi ree", + "error": "Eraris akirado de historio: {0}" }, "user_card": { "approve": "Aprobi", @@ -648,22 +670,23 @@ "media_nsfw": "Devige marki vidaŭdaĵojn konsternaj", "media_removal_desc": "Ĉi tiu nodo forigas vidaŭdaĵojn de afiŝoj el la jenaj nodoj:", "media_removal": "Forigo de vidaŭdaĵoj", - "ftl_removal": "Forigo de la historio de «La tuta konata reto»", + "ftl_removal": "Forigo el la historio de «La tuta konata reto»", "quarantine_desc": "Ĉi tiu nodo sendos nur publikajn afiŝojn al la jenaj nodoj:", "quarantine": "Kvaranteno", "reject_desc": "Ĉi tiu nodo ne akceptos mesaĝojn de la jenaj nodoj:", "reject": "Rifuzi", "accept_desc": "Ĉi tiu nodo nur akceptas mesaĝojn de la jenaj nodoj:", "accept": "Akcepti", - "simple_policies": "Specialaj politikoj de la nodo" + "simple_policies": "Specialaj politikoj de la nodo", + "ftl_removal_desc": "Ĉi tiu nodo forigas la jenajn nodojn el la historio de «La tuta konata reto»:" }, "mrf_policies": "Ŝaltis politikon de Mesaĝa ŝanĝilaro (MRF)", "keyword": { "is_replaced_by": "→", "replace": "Anstataŭigi", "reject": "Rifuzi", - "ftl_removal": "Forigo de la historio de «La tuta konata reto»", - "keyword_policies": "Politiko pri ŝlosilvortoj" + "ftl_removal": "Forigo el la historio de «La tuta konata reto»", + "keyword_policies": "Politiko pri ĉefvortoj" }, "federation": "Federado", "mrf_policies_desc": "Politikoj de Mesaĝa ŝanĝilaro (MRF) efikas sur federa konduto de la nodo. La sekvaj politikoj estas ŝaltitaj:" @@ -707,7 +730,9 @@ "pin": "Fiksi al profilo", "delete": "Forigi staton", "repeats": "Ripetoj", - "favorites": "Ŝatataj" + "favorites": "Ŝatoj", + "status_deleted": "Ĉi tiu afiŝo foriĝis", + "nsfw": "Konsterna" }, "time": { "years_short": "{0}j", @@ -718,8 +743,8 @@ "week_short": "{0}s", "weeks": "{0} semajnoj", "week": "{0} semajno", - "seconds_short": "{0}s", - "second_short": "{0}s", + "seconds_short": "{0}sek", + "second_short": "{0}sek", "seconds": "{0} sekundoj", "second": "{0} sekundo", "now_short": "nun", @@ -728,14 +753,14 @@ "month_short": "{0}m", "months": "{0} monatoj", "month": "{0} monato", - "minutes_short": "{0}m", - "minute_short": "{0}m", + "minutes_short": "{0}min", + "minute_short": "{0}min", "minutes": "{0} minutoj", "minute": "{0} minuto", "in_past": "antaŭ {0}", "in_future": "post {0}", - "hours_short": "{0}h", - "hour_short": "{0}h", + "hours_short": "{0}hor", + "hour_short": "{0}hor", "hours": "{0} horoj", "hour": "{0} horo", "days_short": "{0}t", @@ -769,7 +794,8 @@ "new": "Nova babilo", "chats": "Babiloj", "delete": "Forigi", - "you": "Vi:" + "you": "Vi:", + "message_user": "Mesaĝi al {nickname}" }, "password_reset": { "password_reset_required_but_mailer_is_disabled": "Vi devas restarigi vian pasvorton, sed restarigado de pasvortoj estas malŝaltita. Bonvolu kontakti la administranton de via nodo.", @@ -791,5 +817,8 @@ "additional_comments": "Aldonaj komentoj", "add_comment_description": "Ĉi tiu raporto sendiĝos al reguligistoj de via nodo. Vi povas komprenigi kial vi raportas ĉi tiun konton sube:", "title": "Raportante {0}" + }, + "shoutbox": { + "title": "Kriujo" } } diff --git a/src/i18n/es.json b/src/i18n/es.json index 6889df9a..f4d87eb3 100644 --- a/src/i18n/es.json +++ b/src/i18n/es.json @@ -14,7 +14,8 @@ "text_limit": "Límite de caracteres", "title": "Características", "who_to_follow": "A quién seguir", - "pleroma_chat_messages": "Chat de Pleroma" + "pleroma_chat_messages": "Chat de Pleroma", + "upload_limit": "Límite de subida" }, "finder": { "error_fetching_user": "Error al buscar usuario", @@ -104,7 +105,8 @@ "no_more_notifications": "No hay más notificaciones", "reacted_with": "reaccionó con {0}", "migrated_to": "migrado a", - "follow_request": "quiere seguirte" + "follow_request": "quiere seguirte", + "error": "Error obteniendo notificaciones:{0}" }, "polls": { "add_poll": "Añadir encuesta", @@ -313,7 +315,7 @@ "hide_followers_count_description": "No mostrar el número de cuentas que me siguen", "show_admin_badge": "Mostrar la insignia de Administrador en mi perfil", "show_moderator_badge": "Mostrar la insignia de Moderador en mi perfil", - "nsfw_clickthrough": "Activar el clic para ocultar los adjuntos NSFW", + "nsfw_clickthrough": "Habilitar la ocultación de la imagen de vista previa del enlace y el adjunto para los estados NSFW por defecto", "oauth_tokens": "Tokens de OAuth", "token": "Token", "refresh_token": "Actualizar el token", @@ -447,7 +449,8 @@ "underlay": "Subrayado", "popover": "Sugerencias, menús, superposiciones", "post": "Publicaciones/Biografías de Usuarios", - "alert_warning": "Precaución" + "alert_warning": "Precaución", + "wallpaper": "Fondo de pantalla" }, "radii": { "_tab_label": "Redondez" @@ -558,7 +561,8 @@ "mute_import_error": "Error al importar los silenciados", "mute_import": "Importar silenciados", "mute_export_button": "Exportar los silenciados a un archivo csv", - "mute_export": "Exportar silenciados" + "mute_export": "Exportar silenciados", + "hide_wallpaper": "Ocultar el fondo de pantalla de la instancia" }, "time": { "day": "{0} día", @@ -605,7 +609,8 @@ "up_to_date": "Actualizado", "no_more_statuses": "No hay más estados", "no_statuses": "Sin estados", - "reload": "Recargar" + "reload": "Recargar", + "error": "Error obteniendo la linea de tiempo:{0}" }, "status": { "favorites": "Favoritos", @@ -628,7 +633,11 @@ "copy_link": "Copiar el enlace al estado", "status_unavailable": "Estado no disponible", "bookmark": "Marcar", - "unbookmark": "Desmarcar" + "unbookmark": "Desmarcar", + "status_deleted": "Esta entrada ha sido eliminada", + "nsfw": "NSFW (No apropiado para el trabajo)", + "expand": "Expandir", + "external_source": "Fuente externa" }, "user_card": { "approve": "Aprobar", @@ -719,7 +728,8 @@ "error": { "base": "Subida fallida.", "file_too_big": "Archivo demasiado grande [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]", - "default": "Inténtalo más tarde" + "default": "Inténtalo más tarde", + "message": "Error de subida: {0}" }, "file_size_units": { "B": "B", diff --git a/src/i18n/he.json b/src/i18n/he.json index 7f2bf58f..4b920536 100644 --- a/src/i18n/he.json +++ b/src/i18n/he.json @@ -390,5 +390,13 @@ "GiB": "GiB", "TiB": "TiB" } + }, + "about": { + "mrf": { + "keyword": { + "keyword_policies": "פוליסת מילות מפתח" + }, + "federation": "פדרציה" + } } } diff --git a/src/i18n/it.json b/src/i18n/it.json index ce508630..b7d21e7e 100644 --- a/src/i18n/it.json +++ b/src/i18n/it.json @@ -30,7 +30,7 @@ "administration": "Amministrazione", "back": "Indietro", "interactions": "Interazioni", - "dms": "Messaggi diretti", + "dms": "Messaggi privati", "user_search": "Ricerca utenti", "search": "Ricerca", "who_to_follow": "Chi seguire", @@ -44,13 +44,14 @@ "notifications": "Notifiche", "read": "Letto!", "broken_favorite": "Stato sconosciuto, lo sto cercando…", - "favorited_you": "ha gradito il tuo messaggio", + "favorited_you": "gradisce il tuo messaggio", "load_older": "Carica notifiche precedenti", "repeated_you": "ha condiviso il tuo messaggio", "follow_request": "vuole seguirti", "no_more_notifications": "Fine delle notifiche", "migrated_to": "è migrato verso", - "reacted_with": "ha reagito con {0}" + "reacted_with": "ha reagito con {0}", + "error": "Errore nel caricare le notifiche: {0}" }, "settings": { "attachments": "Allegati", @@ -262,7 +263,8 @@ "border": "Bordo", "outgoing": "Inviati", "incoming": "Ricevuti" - } + }, + "wallpaper": "Sfondo" }, "common_colors": { "rgbo": "Icone, accenti, medaglie", @@ -381,7 +383,7 @@ "preload_images": "Precarica immagini", "hide_isp": "Nascondi pannello della stanza", "max_thumbnails": "Numero massimo di anteprime per messaggio", - "hide_muted_posts": "Nascondi messaggi degli utenti zittiti", + "hide_muted_posts": "Nascondi messaggi degli utenti zilenziati", "accent": "Accento", "emoji_reactions_on_timeline": "Mostra emoji di reazione sulle sequenze", "pad_emoji": "Affianca spazi agli emoji inseriti tramite selettore", @@ -414,7 +416,8 @@ "mute_import_error": "Errore nell'importazione", "mute_import": "Importa silenziati", "mute_export_button": "Esporta la tua lista di silenziati in un file CSV", - "mute_export": "Esporta silenziati" + "mute_export": "Esporta silenziati", + "hide_wallpaper": "Nascondi sfondo della stanza" }, "timeline": { "error_fetching": "Errore nell'aggiornamento", @@ -427,7 +430,8 @@ "repeated": "condiviso", "no_statuses": "Nessun messaggio", "no_more_statuses": "Fine dei messaggi", - "reload": "Ricarica" + "reload": "Ricarica", + "error": "Errore nel caricare la sequenza: {0}" }, "user_card": { "follow": "Segui", @@ -483,7 +487,11 @@ "follow_progress": "Richiedo…", "follow_sent": "Richiesta inviata!", "favorites": "Preferiti", - "message": "Contatta" + "message": "Contatta", + "roles": { + "moderator": "Moderatore", + "admin": "Amministratore" + } }, "chat": { "title": "Chat" @@ -491,16 +499,17 @@ "features_panel": { "chat": "Chat", "gopher": "Gopher", - "media_proxy": "Proxy multimedia", + "media_proxy": "Proxy allegati", "scope_options": "Opzioni visibilità", "text_limit": "Lunghezza massima", "title": "Caratteristiche", "who_to_follow": "Chi seguire", - "pleroma_chat_messages": "Chiacchiere" + "pleroma_chat_messages": "Chiacchiere", + "upload_limit": "Limite allegati" }, "finder": { "error_fetching_user": "Errore nel recupero dell'utente", - "find_user": "Trova utente" + "find_user": "Cerca utente" }, "login": { "login": "Accedi", @@ -510,18 +519,18 @@ "register": "Registrati", "username": "Nome utente", "description": "Accedi con OAuth", - "hint": "Accedi per partecipare alla discussione", + "hint": "Accedi per conversare", "authentication_code": "Codice di autenticazione", "enter_recovery_code": "Inserisci un codice di recupero", - "enter_two_factor_code": "Inserisci un codice two-factor", + "enter_two_factor_code": "Inserisci un codice 2FA", "recovery_code": "Codice di recupero", "heading": { - "totp": "Autenticazione two-factor", - "recovery": "Recupero two-factor" + "totp": "Autenticazione 2FA", + "recovery": "Recupero 2FA" } }, "post_status": { - "account_not_locked_warning": "Il tuo profilo non è {0}. Chiunque può seguirti e vedere i tuoi messaggi riservati ai tuoi seguaci.", + "account_not_locked_warning": "Il tuo profilo non è {0}. Chiunque può seguirti e vedere i tuoi messaggi per seguaci.", "account_not_locked_warning_link": "protetto", "attachments_sensitive": "Nascondi gli allegati", "content_type": { @@ -531,7 +540,7 @@ "text/html": "HTML" }, "content_warning": "Oggetto (facoltativo)", - "default": "Sono appena atterrato a Fiumicino.", + "default": "Sono appena atterrato a Città Laggiù.", "direct_warning": "Questo post sarà visibile solo dagli utenti menzionati.", "posting": "Sto pubblicando", "scope": { @@ -598,21 +607,21 @@ "reject": "Rifiuta", "accept": "Accetta", "simple_policies": "Regole specifiche alla stanza", - "accept_desc": "Questa stanza accetta messaggi solo dalle seguenti stanze:", - "reject_desc": "Questa stanza non accetterà messaggi dalle stanze seguenti:", + "accept_desc": "Questa stanza accetta messaggi solo dalle seguenti altre:", + "reject_desc": "Questa stanza rifiuterà i messaggi provenienti dalle seguenti:", "quarantine": "Quarantena", - "quarantine_desc": "Questa stanza inoltrerà solo messaggi pubblici alle seguenti stanze:", + "quarantine_desc": "Questa stanza inoltrerà solo messaggi pubblici alle seguenti:", "ftl_removal": "Rimozione dalla sequenza globale", - "ftl_removal_desc": "Questa stanza rimuove le seguenti stanze dalla sequenza globale:", + "ftl_removal_desc": "Questa stanza rimuove le seguenti dalla sequenza globale:", "media_removal": "Rimozione multimedia", "media_removal_desc": "Questa istanza rimuove gli allegati dalle seguenti stanze:", - "media_nsfw": "Allegati oscurati forzatamente", + "media_nsfw": "Allegati oscurati d'ufficio", "media_nsfw_desc": "Questa stanza oscura gli allegati dei messaggi provenienti da queste stanze:" }, "mrf_policies": "Regole RM abilitate", "mrf_policies_desc": "Le regole RM cambiano il comportamento federativo della stanza. Vigono le seguenti regole:" }, - "staff": "Equipaggio" + "staff": "Responsabili" }, "domain_mute_card": { "mute": "Zittisci", @@ -641,20 +650,20 @@ }, "polls": { "add_poll": "Sondaggio", - "add_option": "Alternativa", + "add_option": "Aggiungi opzione", "option": "Opzione", "votes": "voti", "vote": "Vota", "type": "Tipo di sondaggio", "single_choice": "Scelta singola", "multiple_choices": "Scelta multipla", - "expiry": "Scadenza", - "expires_in": "Scade fra {0}", - "expired": "Scaduto {0} fa", + "expiry": "Età", + "expires_in": "Chiude fra {0}", + "expired": "Chiuso {0} fa", "not_enough_options": "Aggiungi altre risposte" }, "interactions": { - "favs_repeats": "Condivisi e preferiti", + "favs_repeats": "Condivisi e Graditi", "load_older": "Carica vecchie interazioni", "moves": "Utenti migrati", "follows": "Nuovi seguìti" @@ -663,8 +672,8 @@ "load_all": "Carico tutti i {emojiAmount} emoji", "load_all_hint": "Primi {saneAmount} emoji caricati, caricarli tutti potrebbe causare rallentamenti.", "unicode": "Emoji Unicode", - "custom": "Emoji personale", - "add_emoji": "Inserisci Emoji", + "custom": "Emoji della stanza", + "add_emoji": "Inserisci emoji", "search_emoji": "Cerca un emoji", "keep_open": "Tieni aperto il menù", "emoji": "Emoji", @@ -679,7 +688,7 @@ "remote_user_resolver": "Cerca utenti remoti" }, "errors": { - "storage_unavailable": "Pleroma non ha potuto accedere ai dati del tuo browser. Le tue credenziali o le tue impostazioni locali non potranno essere salvate e potresti incontrare strani errori. Prova ad abilitare i cookie." + "storage_unavailable": "Pleroma non può accedere ai dati del tuo browser. Il tuo accesso o le tue impostazioni non saranno salvate e potresti incontrare strani errori. Prova ad abilitare i cookie." }, "status": { "pinned": "Intestato", @@ -693,17 +702,20 @@ "hide_full_subject": "Nascondi intero oggetto", "show_full_subject": "Mostra intero oggetto", "thread_muted_and_words": ", contiene:", - "thread_muted": "Discussione zittita", + "thread_muted": "Discussione silenziata", "copy_link": "Copia collegamento", "status_unavailable": "Messaggio non disponibile", "unmute_conversation": "Riabilita conversazione", - "mute_conversation": "Zittisci conversazione", + "mute_conversation": "Silenzia conversazione", "replies_list": "Risposte:", "reply_to": "Rispondi a", "delete_confirm": "Vuoi veramente eliminare questo messaggio?", "unbookmark": "Rimuovi segnalibro", "bookmark": "Aggiungi segnalibro", - "status_deleted": "Questo messagio è stato cancellato" + "status_deleted": "Questo messagio è stato cancellato", + "nsfw": "Pruriginoso", + "external_source": "Vai al sito", + "expand": "Espandi" }, "time": { "years_short": "{0}a", @@ -778,7 +790,8 @@ "error": { "default": "Riprova in seguito", "file_too_big": "File troppo pesante [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]", - "base": "Caricamento fallito." + "base": "Caricamento fallito.", + "message": "Caricamento fallito: {0}" } }, "tool_tip": { diff --git a/src/i18n/messages.js b/src/i18n/messages.js index c3195f10..2a1161be 100644 --- a/src/i18n/messages.js +++ b/src/i18n/messages.js @@ -33,7 +33,9 @@ const loaders = { ro: () => import('./ro.json'), ru: () => import('./ru.json'), te: () => import('./te.json'), - zh: () => import('./zh.json') + uk: () => import('./uk.json'), + zh: () => import('./zh.json'), + zh_Hant: () => import('./zh_Hant.json') } const messages = { diff --git a/src/i18n/pl.json b/src/i18n/pl.json index dfa0729d..7cf06796 100644 --- a/src/i18n/pl.json +++ b/src/i18n/pl.json @@ -50,7 +50,8 @@ "text_limit": "Limit tekstu", "title": "Funkcje", "who_to_follow": "Propozycje obserwacji", - "pleroma_chat_messages": "Czat Pleromy" + "pleroma_chat_messages": "Czat Pleromy", + "upload_limit": "Limit wysyłania" }, "finder": { "error_fetching_user": "Błąd przy pobieraniu profilu", @@ -140,7 +141,8 @@ "no_more_notifications": "Nie masz więcej powiadomień", "migrated_to": "wyemigrował do", "reacted_with": "zareagował z {0}", - "follow_request": "chce ciebie obserwować" + "follow_request": "chce ciebie obserwować", + "error": "Błąd pobierania powiadomień: {0}" }, "polls": { "add_poll": "Dodaj ankietę", @@ -501,7 +503,8 @@ "outgoing": "Wiadomości wychodzące", "incoming": "Wiadomości przychodzące", "border": "Granica" - } + }, + "wallpaper": "Tło" }, "radii": { "_tab_label": "Zaokrąglenie" @@ -596,7 +599,8 @@ "mute_import_error": "Wystąpił błąd podczas importowania wyciszeń", "mute_import": "Import wyciszeń", "mute_export_button": "Wyeksportuj swoje wyciszenia do pliku .csv", - "mute_export": "Eksport wyciszeń" + "mute_export": "Eksport wyciszeń", + "hide_wallpaper": "Ukryj tło instancji" }, "time": { "day": "{0} dzień", @@ -643,7 +647,8 @@ "up_to_date": "Na bieżąco", "no_more_statuses": "Brak kolejnych statusów", "no_statuses": "Brak statusów", - "reload": "Odśwież" + "reload": "Odśwież", + "error": "Błąd pobierania osi czasu: {0}" }, "status": { "favorites": "Ulubione", @@ -666,7 +671,11 @@ "hide_full_subject": "Ukryj cały temat", "show_full_subject": "Pokaż cały temat", "thread_muted_and_words": ", ma słowa:", - "thread_muted": "Wątek wyciszony" + "thread_muted": "Wątek wyciszony", + "status_deleted": "Ten wpis został usunięty", + "expand": "Rozwiń", + "nsfw": "NSFW", + "external_source": "Zewnętrzne źródło" }, "user_card": { "approve": "Przyjmij", @@ -757,7 +766,8 @@ "error": { "base": "Wysyłanie nie powiodło się.", "file_too_big": "Zbyt duży plik [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]", - "default": "Spróbuj ponownie później" + "default": "Spróbuj ponownie później", + "message": "Błąd wysyłania: {0}" }, "file_size_units": { "B": "B", diff --git a/src/i18n/pt.json b/src/i18n/pt.json index 1b8694d9..b79985e8 100644 --- a/src/i18n/pt.json +++ b/src/i18n/pt.json @@ -5,37 +5,61 @@ "features_panel": { "chat": "Chat", "gopher": "Gopher", - "media_proxy": "Proxy de mídia", + "media_proxy": "Proxy de multimédia", "scope_options": "Opções de privacidade", "text_limit": "Limite de caracteres", - "title": "Funções", - "who_to_follow": "Quem seguir" + "title": "Características", + "who_to_follow": "Quem seguir", + "upload_limit": "Limite de carregamento", + "pleroma_chat_messages": "Chat do Pleroma" }, "finder": { - "error_fetching_user": "Erro ao procurar usuário", - "find_user": "Buscar usuário" + "error_fetching_user": "Erro ao pesquisar utilizador", + "find_user": "Pesquisar utilizador" }, "general": { "apply": "Aplicar", "submit": "Enviar", "more": "Mais", - "generic_error": "Houve um erro", - "optional": "opcional" + "generic_error": "Ocorreu um erro", + "optional": "opcional", + "peek": "Espreitar", + "close": "Fechar", + "verify": "Verificar", + "confirm": "Confirmar", + "enable": "Ativar", + "disable": "Desativar", + "cancel": "Cancelar", + "show_less": "Mostrar menos", + "show_more": "Mostrar mais", + "retry": "Tenta novamente", + "error_retry": "Por favor, tenta novamente", + "loading": "A carregar…", + "dismiss": "Ignorar" }, "image_cropper": { "crop_picture": "Cortar imagem", - "save": "Salvar", - "cancel": "Cancelar" + "save": "Guardar", + "cancel": "Cancelar", + "save_without_cropping": "Guardar sem recortar" }, "login": { - "login": "Entrar", - "description": "Entrar com OAuth", - "logout": "Sair", - "password": "Senha", - "placeholder": "p.e. lain", - "register": "Registrar", - "username": "Usuário", - "hint": "Entre para participar da discussão" + "login": "Iniciar Sessão", + "description": "Iniciar sessão com OAuth", + "logout": "Terminar sessão", + "password": "Palavra-passe", + "placeholder": "ex. lain", + "register": "Registar", + "username": "Nome de Utilizador", + "hint": "Entra para participar na discussão", + "heading": { + "totp": "Autenticação de dois fatores", + "recovery": "Recuperação de dois fatores" + }, + "recovery_code": "Código de recuperação", + "authentication_code": "Código de autenticação", + "enter_two_factor_code": "Introduza o código de dois fatores", + "enter_recovery_code": "Introduza um código de recuperação" }, "media_modal": { "previous": "Anterior", @@ -45,100 +69,125 @@ "about": "Sobre", "back": "Voltar", "chat": "Chat local", - "friend_requests": "Solicitações de seguidores", + "friend_requests": "Pedidos de seguidores", "mentions": "Menções", - "dms": "Mensagens diretas", - "public_tl": "Linha do tempo pública", - "timeline": "Linha do tempo", - "twkn": "Toda a rede conhecida", - "user_search": "Buscar usuários", + "dms": "Mensagens Diretas", + "public_tl": "Cronologia Pública", + "timeline": "Cronologia", + "twkn": "Rede conhecida", + "user_search": "Pesquisa por Utilizadores", "who_to_follow": "Quem seguir", - "preferences": "Preferências" + "preferences": "Preferências", + "search": "Pesquisar", + "interactions": "Interações", + "administration": "Administração", + "chats": "Salas de Chat", + "timelines": "Cronologias", + "bookmarks": "Itens Guardados" }, "notifications": { - "broken_favorite": "Status desconhecido, buscando...", - "favorited_you": "favoritou sua postagem", - "followed_you": "seguiu você", + "broken_favorite": "Publicação desconhecida, a procurar…", + "favorited_you": "gostou do teu post", + "followed_you": "seguiu-te", "load_older": "Carregar notificações antigas", "notifications": "Notificações", "read": "Lido!", - "repeated_you": "repetiu sua postagem", - "no_more_notifications": "Mais nenhuma notificação" + "repeated_you": "partilhou o teu post", + "no_more_notifications": "Sem mais notificações", + "reacted_with": "reagiu com {0}", + "migrated_to": "migrou para", + "follow_request": "quer seguir-te", + "error": "Erro ao obter notificações: {0}" }, "post_status": { - "new_status": "Postar novo status", - "account_not_locked_warning": "Sua conta não é {0}. Qualquer pessoa pode te seguir e ver seus posts privados (só para seguidores).", - "account_not_locked_warning_link": "restrita", + "new_status": "Publicar nova publicação", + "account_not_locked_warning": "A sua conta não é {0}. Qualquer pessoa pode seguir-te e ver os seus posts privados (só para seguidores).", + "account_not_locked_warning_link": "restrito", "attachments_sensitive": "Marcar anexos como sensíveis", "content_type": { - "text/plain": "Texto puro" + "text/plain": "Texto puro", + "text/bbcode": "BBCode", + "text/html": "HTML", + "text/markdown": "Remarcação" }, "content_warning": "Assunto (opcional)", - "default": "Acabei de chegar no Rio!", + "default": "Acabei de chegar a Lisboa.", "direct_warning": "Este post será visível apenas para os usuários mencionados.", - "posting": "Publicando", + "posting": "A publicar", "scope": { "direct": "Direto - Enviar somente aos usuários mencionados", "private": "Apenas para seguidores - Enviar apenas para seguidores", - "public": "Público - Enviar a linhas do tempo públicas", - "unlisted": "Não listado - Não enviar a linhas do tempo públicas" - } + "public": "Público - Publicar em cronologias públicas", + "unlisted": "Não listado - Não exibir em cronologias públicas" + }, + "scope_notice": { + "unlisted": "Esta publicação não será visível na Cronologia pública e na Rede conhecida por todos", + "private": "Esta publicação será apenas visível para os teus seguidores", + "public": "Esta publicação será visível para todos" + }, + "empty_status_error": "Não consegues publicar um post vazio e sem ficheiros", + "preview_empty": "Vazio", + "preview": "Pré-visualização", + "media_description": "Descrição da multimédia", + "media_description_error": "Falha ao atualizar ficheiro, tente novamente", + "direct_warning_to_first_only": "Esta publicação só será visível para os utilizadores mencionados no início da mensagem.", + "direct_warning_to_all": "Esta publicação será visível para todos os utilizadores mencionados." }, "registration": { "bio": "Biografia", - "email": "Correio eletrônico", + "email": "Endereço de e-mail", "fullname": "Nome para exibição", - "password_confirm": "Confirmação de senha", - "registration": "Registro", + "password_confirm": "Confirmação de palavra-passe", + "registration": "Registo", "token": "Código do convite", "captcha": "CAPTCHA", "new_captcha": "Clique na imagem para carregar um novo captcha", - "username_placeholder": "p. ex. lain", - "fullname_placeholder": "p. ex. Lain Iwakura", - "bio_placeholder": "e.g.\nOi, sou Lain\nSou uma garota que vive no subúrbio do Japão. Você deve me conhecer da Rede.", + "username_placeholder": "ex. lain", + "fullname_placeholder": "ex. Lain Iwakura", + "bio_placeholder": "ex.\nOlá, sou a Lain\nSou uma menina de anime que vive no Japão suburbano. Devem conhecer-me do \"the Wired\".", "validations": { "username_required": "não pode ser deixado em branco", "fullname_required": "não pode ser deixado em branco", "email_required": "não pode ser deixado em branco", "password_required": "não pode ser deixado em branco", "password_confirmation_required": "não pode ser deixado em branco", - "password_confirmation_match": "deve ser idêntica à senha" + "password_confirmation_match": "deve corresponder à palavra-passe" } }, "settings": { - "app_name": "Nome do aplicativo", + "app_name": "Nome da aplicação", "attachmentRadius": "Anexos", "attachments": "Anexos", "avatar": "Avatar", "avatarAltRadius": "Avatares (Notificações)", "avatarRadius": "Avatares", - "background": "Pano de Fundo", + "background": "Imagem de Fundo", "bio": "Biografia", "blocks_tab": "Bloqueios", "btnRadius": "Botões", "cBlue": "Azul (Responder, seguir)", - "cGreen": "Verde (Repetir)", + "cGreen": "Verde (Partilhar)", "cOrange": "Laranja (Favoritar)", "cRed": "Vermelho (Cancelar)", - "change_password": "Mudar senha", - "change_password_error": "Houve um erro ao modificar sua senha.", - "changed_password": "Senha modificada com sucesso!", + "change_password": "Mudar palavra-passe", + "change_password_error": "Ocorreu um erro ao modificar a sua palavra-passe.", + "changed_password": "Palavra-passe modificada com sucesso!", "collapse_subject": "Esconder posts com assunto", "composing": "Escrita", - "confirm_new_password": "Confirmar nova senha", + "confirm_new_password": "Confirmar nova palavra-passe", "current_avatar": "Seu avatar atual", - "current_password": "Sua senha atual", + "current_password": "Palavra-passe atual", "current_profile_banner": "Sua capa de perfil atual", "data_import_export_tab": "Importação/exportação de dados", "default_vis": "Opção de privacidade padrão", - "delete_account": "Deletar conta", - "delete_account_description": "Deletar sua conta e mensagens permanentemente.", - "delete_account_error": "Houve um problema ao deletar sua conta. Se ele persistir, por favor entre em contato com o/a administrador/a da instância.", - "delete_account_instructions": "Digite sua senha no campo abaixo para confirmar a exclusão da conta.", + "delete_account": "Eliminar conta", + "delete_account_description": "Apagar os seus dados permanentemente e desativar a sua conta.", + "delete_account_error": "Ocorreu um erro ao remover a sua conta. Se este persistir, por favor entre em contato com o/a administrador/a da instância.", + "delete_account_instructions": "Escreva a sua palavra-passe no campo abaixo para confirmar a remoção da conta.", "avatar_size_instruction": "O tamanho mínimo recomendado para imagens de avatar é 150x150 pixels.", - "export_theme": "Salvar predefinições", + "export_theme": "Guardar predefinições", "filtering": "Filtragem", - "filtering_explanation": "Todas as postagens contendo estas palavras serão silenciadas; uma palavra por linha.", + "filtering_explanation": "Todas as publicações que contenham estas palavras serão silenciadas; uma palavra por linha", "follow_export": "Exportar quem você segue", "follow_export_button": "Exportar quem você segue para um arquivo CSV", "follow_export_processing": "Processando. Em breve você receberá a solicitação de download do arquivo", @@ -148,7 +197,7 @@ "foreground": "Primeiro Plano", "general": "Geral", "hide_attachments_in_convo": "Ocultar anexos em conversas", - "hide_attachments_in_tl": "Ocultar anexos na linha do tempo.", + "hide_attachments_in_tl": "Ocultar anexos na cronologia", "max_thumbnails": "Número máximo de miniaturas por post", "hide_isp": "Esconder painel específico da instância", "preload_images": "Pré-carregar imagens", @@ -159,7 +208,7 @@ "import_followers_from_a_csv_file": "Importe seguidores a partir de um arquivo CSV", "import_theme": "Carregar pré-definição", "inputRadius": "Campos de entrada", - "checkboxRadius": "Checkboxes", + "checkboxRadius": "Caixas de seleção", "instance_default": "(padrão: {value})", "instance_default_simple": "(padrão)", "interface": "Interface", @@ -171,16 +220,16 @@ "loop_video": "Repetir vídeos", "loop_video_silent_only": "Repetir apenas vídeos sem som (como os \"gifs\" do Mastodon)", "mutes_tab": "Silenciados", - "play_videos_in_modal": "Tocar vídeos diretamente no visualizador de mídia", + "play_videos_in_modal": "Reproduzir vídeos diretamente no visualizador de multimédia", "use_contain_fit": "Não cortar o anexo na miniatura", "name": "Nome", "name_bio": "Nome & Biografia", - "new_password": "Nova senha", + "new_password": "Nova palavra-passe", "notification_visibility": "Tipos de notificação para mostrar", "notification_visibility_follows": "Seguidas", "notification_visibility_likes": "Favoritos", "notification_visibility_mentions": "Menções", - "notification_visibility_repeats": "Repetições", + "notification_visibility_repeats": "Partilhas", "no_rich_text_description": "Remover formatação de todos os posts", "no_blocks": "Sem bloqueios", "no_mutes": "Sem silenciados", @@ -188,7 +237,7 @@ "hide_followers_description": "Não mostrar quem me segue", "show_admin_badge": "Mostrar título de Administrador em meu perfil", "show_moderator_badge": "Mostrar título de Moderador em meu perfil", - "nsfw_clickthrough": "Habilitar clique para ocultar anexos sensíveis", + "nsfw_clickthrough": "Ativar clique em anexos e pré-visualizações de links para ocultar anexos NSFW", "oauth_tokens": "Token OAuth", "token": "Token", "refresh_token": "Atualizar Token", @@ -201,7 +250,7 @@ "profile_banner": "Capa de perfil", "profile_tab": "Perfil", "radii_help": "Arredondar arestas da interface (em pixel)", - "replies_in_timeline": "Respostas na linha do tempo", + "replies_in_timeline": "Respostas na cronologia", "reply_visibility_all": "Mostrar todas as respostas", "reply_visibility_following": "Só mostrar respostas direcionadas a mim ou a usuários que sigo", "reply_visibility_self": "Só mostrar respostas direcionadas a mim", @@ -215,7 +264,7 @@ "settings": "Configurações", "subject_input_always_show": "Sempre mostrar campo de assunto", "subject_line_behavior": "Copiar assunto ao responder", - "subject_line_email": "Como em email: \"re: assunto\"", + "subject_line_email": "Como num e-mail: \"re: assunto\"", "subject_line_mastodon": "Como o Mastodon: copiar como está", "subject_line_noop": "Não copiar", "post_status_content_type": "Tipo de conteúdo do status", @@ -225,7 +274,7 @@ "theme": "Tema", "theme_help": "Use cores em código hexadecimal (#rrggbb) para personalizar seu esquema de cores.", "theme_help_v2_1": "Você também pode sobrescrever as cores e opacidade de alguns componentes ao modificar o checkbox, use \"Limpar todos\" para limpar todas as modificações.", - "theme_help_v2_2": "Alguns ícones sob registros são indicadores de fundo/contraste de textos, passe por cima para informações detalhadas. Tenha ciência de que os indicadores de contraste não funcionam muito bem com transparência.", + "theme_help_v2_2": "Alguns ícones em registo são indicadores de fundo/contraste de textos, passe por cima para obter informações detalhadas. Tenha em atenção que os indicadores de contraste não funcionam muito bem com transparência.", "tooltipRadius": "Dicas/alertas", "upload_a_photo": "Enviar uma foto", "user_settings": "Configurações de Usuário", @@ -245,7 +294,24 @@ "save_load_hint": "Manter as opções preserva as opções atuais ao selecionar ou carregar temas; também salva as opções ao exportar um tempo. Quanto todos os campos estiverem desmarcados, tudo será salvo ao exportar o tema.", "reset": "Restaurar o padrão", "clear_all": "Limpar tudo", - "clear_opacity": "Limpar opacidade" + "clear_opacity": "Limpar opacidade", + "help": { + "upgraded_from_v2": "O PleromaFE foi atualizado, a aparência do tema poderá ser um pouco diferente.", + "snapshot_source_mismatch": "Conflito de versões: o mais provável é que o FE tenha revertido e voltado a atualizar, foi alterado o tema numa versão anterior do FE, o mais provável é desejar utilizar a versão anterior; caso contrário, utilize a nova versão.", + "migration_napshot_gone": "Por algum motivo, a pré-visualização estava em falta, algumas coisas poderão parecer diferentes do que se lembra.", + "migration_snapshot_ok": "Para estar seguro, foi carregada uma versão de pré-visualização do tema. Pode tentar carregar dados do tema.", + "fe_downgraded": "Versão do PleromaFE revertida.", + "fe_upgraded": "O criador de temas do PleromaFE foi atualizado depois da atualização da versão.", + "snapshot_missing": "Não existia nenhuma pré-visualização do tema no ficheiro, então pode parecer diferente do previsto originalmente.", + "snapshot_present": "Foi carregada uma pré-visualização do tema, todos os valores são substituídos. Caso contrário, pode carregar o tema completo.", + "older_version_imported": "O ficheiro que importaste foi criado numa versão antiga do FE.", + "future_version_imported": "O ficheiro que importaste foi criado para uma versão mais recente do FE.", + "v2_imported": "O ficheiro que importaste foi feito para uma versão antiga do FE. Tentamos maximizar a compatibilidade, porém, poderão existir incongruências." + }, + "use_source": "Nova versão", + "use_snapshot": "Versão antiga", + "keep_as_is": "Manter como está", + "load_theme": "Carregar tema" }, "common": { "color": "Cor", @@ -280,7 +346,27 @@ "borders": "Bordas", "buttons": "Botões", "inputs": "Caixas de entrada", - "faint_text": "Texto esmaecido" + "faint_text": "Texto esmaecido", + "chat": { + "border": "Borda", + "outgoing": "Enviadas", + "incoming": "Recebidas" + }, + "tabs": "Abas", + "toggled": "Alternado", + "disabled": "Desativado", + "selectedMenu": "Elemento do menu seleccionado", + "selectedPost": "Publicação seleccionada", + "pressed": "Pressionado", + "highlight": "Elementos destacados", + "icons": "Ícones", + "poll": "Gráfico da sondagem", + "wallpaper": "Fundo de ecrã", + "underlay": "Sublinhado", + "popover": "Sugestões, menus, etiquetas", + "post": "Publicações/Bios", + "alert_neutral": "Neutro", + "alert_warning": "Precaução" }, "radii": { "_tab_label": "Arredondado" @@ -298,7 +384,7 @@ "always_drop_shadow": "Atenção, esta sombra sempre utiliza {0} quando compatível com o navegador.", "drop_shadow_syntax": "{0} não é compatível com o parâmetro {1} e a palavra-chave {2}.", "avatar_inset": "Tenha em mente que combinar as sombras de inserção e a não-inserção em avatares pode causar resultados inesperados em avatares transparentes.", - "spread_zero": "Sombras com uma difusão > 0 aparecerão como se fossem definidas como 0.", + "spread_zero": "Sombras com difusão > 0 aparecerão como se fossem definidas como zero", "inset_classic": "Sombras de inserção utilizarão {0}" }, "components": { @@ -313,7 +399,8 @@ "buttonPressed": "Botão (pressionado)", "buttonPressedHover": "Botão (pressionado+em cima)", "input": "Campo de entrada" - } + }, + "hintV3": "Para as sombras, também pode usar a notação {0} para usar outro espaço de cor." }, "fonts": { "_tab_label": "Fontes", @@ -336,30 +423,143 @@ "button": "Botão", "text": "Vários {0} e {1}", "mono": "conteúdo", - "input": "Acabei de chegar no Rio!", + "input": "Acabei de chegar a Lisboa.", "faint_link": "manual útil", "fine_print": "Leia nosso {0} para não aprender nada!", - "header_faint": "Está ok!", + "header_faint": "Isto está bem", "checkbox": "Li os termos e condições", "link": "um belo link" } - } + }, + "mfa": { + "scan": { + "secret_code": "Chave", + "title": "Scan", + "desc": "Utilizando a sua aplicação de dois fatores, faça scan deste código QR ou insira a chave de texto:" + }, + "authentication_methods": "Métodos de autenticação", + "recovery_codes": "Códigos de recuperação.", + "generate_new_recovery_codes": "Gerar novos códigos de recuperação", + "confirm_and_enable": "Confirmar e ativar a palavra-passe de utilização única", + "otp": "Palavra-passe de utilização única", + "verify": { + "desc": "Para ativar a autenticação de dois fatores, introduza o código da sua aplicação de dois fatores:" + }, + "recovery_codes_warning": "Anote os códigos ou armazene-os num lugar seguro - caso contrário, não os voltará a ver. Se perder acesso à sua aplicação de dois fatores e aos códigos de recuperação, a sua conta ficará bloqueada.", + "waiting_a_recovery_codes": "A receber códigos de recuperação…", + "warning_of_generate_new_codes": "Quando gera novos códigos de recuperação, os antigos deixam de funcionar.", + "title": "Autenticação de Dois Fatores", + "wait_pre_setup_otp": "pré-configuração de palavra-passe de utilização única", + "setup_otp": "Configurar palavra-passe de utilização única" + }, + "security": "Segurança", + "mute_import_error": "Erro ao importar os silenciados", + "mute_import": "Importar silenciados", + "mute_export_button": "Exporta os silenciados para um ficheiro csv", + "mute_export": "Exportar silenciados", + "blocks_imported": "Lista de utilizadores bloqueados importada! O processo pode demorar alguns instantes.", + "block_import_error": "Erro ao importar a lista de utilizadores bloqueados", + "block_import": "Importar utilizadores bloqueados", + "block_export_button": "Exporta a tua lista de utilizadores bloqueados para um ficheiro csv", + "block_export": "Exportar utilizadores bloqueados", + "enter_current_password_to_confirm": "Introduza a sua palavra-passe atual para confirmar a sua identidade", + "mutes_and_blocks": "Silenciados e Bloqueados", + "chatMessageRadius": "Mensagem de texto", + "changed_email": "Endereço de e-mail modificado com sucesso!", + "change_email_error": "Ocorreu um erro ao modificar o seu endereço de e-mail.", + "change_email": "Mudar Endereço de E-mail", + "bot": "Esta uma conta robô", + "import_mutes_from_a_csv_file": "Importar silenciados de um ficheiro csv", + "mutes_imported": "Silenciados importados! Processá-los pode demorar alguns instantes.", + "allow_following_move": "Permitir seguimento automático quando a conta for migrada para outra instância", + "domain_mutes": "Domínios", + "discoverable": "Permitir a descoberta desta conta em resultados de busca e outros serviços", + "emoji_reactions_on_timeline": "Mostrar reações de emoji na timeline", + "hide_muted_posts": "Esconder posts de utilizadores silenciados", + "hide_follows_count_description": "Não mostrar o número de contas seguidas", + "hide_followers_count_description": "Não mostrar o número de seguidores", + "notification_visibility_emoji_reactions": "Reações", + "new_email": "Novo endereço de e-mail", + "profile_fields": { + "value": "Conteúdo", + "add_field": "Adicionar campo", + "label": "Metadados do perfil", + "name": "Etiqueta" + }, + "import_blocks_from_a_csv_file": "Importar bloqueados a partir de um arquivo CSV", + "hide_wallpaper": "Esconder papel de parede da instância", + "notification_setting_privacy": "Privacidade", + "notification_setting_filters": "Filtros", + "fun": "Divertido", + "user_mutes": "Utilizadores", + "type_domains_to_mute": "Pesquisar domínios para silenciar", + "useStreamingApiWarning": "(não recomendado, experimental, pode omitir publicações)", + "useStreamingApi": "Receber publicações e notificações em tempo real", + "minimal_scopes_mode": "Minimizar as opções de publicação", + "search_user_to_mute": "Pesquisar utilizadores que pretende silenciar", + "search_user_to_block": "Pesquisa quais utilizadores desejas bloquear", + "notification_setting_hide_notification_contents": "Ocultar o remetente e o conteúdo das notificações push", + "version": { + "frontend_version": "Versão do Frontend", + "backend_version": "Versão do Backend", + "title": "Versão" + }, + "notification_blocks": "Bloquear um utilizador previne todas as notificações, bem como as desativa.", + "notification_mutes": "Para deixar de receber notificações de um utilizador específico, silencia-o.", + "notification_setting_block_from_strangers": "Bloqueia as notificações de utilizadores que não segues", + "greentext": "Texto verde (meme arrows)", + "virtual_scrolling": "Otimizar a apresentação da cronologia", + "reset_background_confirm": "Tens a certeza que desejas redefinir o fundo?", + "reset_banner_confirm": "Tens a certeza que desejas redefinir a imagem do cabeçalho?", + "reset_avatar_confirm": "Tens a certeza que desejas redefinir o avatar?", + "reset_profile_banner": "Redefinir imagem do cabeçalho do perfil", + "reset_profile_background": "Redefinir fundo de perfil", + "reset_avatar": "Redefinir avatar", + "autohide_floating_post_button": "Automaticamente ocultar o botão 'Nova Publicação' (telemóvel)", + "notification_visibility_moves": "Utilizador Migrado", + "accent": "Destaque", + "pad_emoji": "Preencher espaços ao adicionar emojis do seletor" }, "timeline": { "collapse": "Esconder", "conversation": "Conversa", "error_fetching": "Erro ao buscar atualizações", "load_older": "Carregar postagens antigas", - "no_retweet_hint": "Posts apenas para seguidores ou diretos não podem ser repetidos", - "repeated": "Repetido", + "no_retweet_hint": "Posts apenas para seguidores ou diretos não podem ser partilhados", + "repeated": "partilhado", "show_new": "Mostrar novas", "up_to_date": "Atualizado", "no_more_statuses": "Sem mais posts", - "no_statuses": "Sem posts" + "no_statuses": "Sem posts", + "reload": "Recarregar", + "error": "Erro a obter a cronologia: {0}" }, "status": { "reply_to": "Responder a", - "replies_list": "Respostas:" + "replies_list": "Respostas:", + "unbookmark": "Remover post dos Items Guardados", + "expand": "Expandir", + "nsfw": "NSFW (Não apropriado para trabalho)", + "status_deleted": "Esta publicação foi apagada", + "hide_content": "Ocultar o conteúdo", + "show_content": "Mostrar o conteúdo", + "hide_full_subject": "Ocultar o assunto completo", + "show_full_subject": "Mostrar o assunto completo", + "thread_muted_and_words": ", contém:", + "thread_muted": "Conversação silenciada", + "external_source": "Fonte externa", + "copy_link": "Copiar o link do post", + "status_unavailable": "Publicação indisponível", + "unmute_conversation": "Mostrar a conversação", + "mute_conversation": "Silenciar a conversação", + "delete_confirm": "Tens a certeza que desejas apagar a publicação?", + "bookmark": "Guardar", + "pin": "Fixar no perfil", + "pinned": "Afixado", + "unpin": "Desafixar do perfil", + "delete": "Eliminar publicação", + "repeats": "Partilhados", + "favorites": "Favoritos" }, "user_card": { "approve": "Aprovar", @@ -377,21 +577,52 @@ "following": "Seguindo!", "follows_you": "Segue você!", "its_you": "É você!", - "media": "Mídia", + "media": "Multimédia", "mute": "Silenciar", "muted": "Silenciado", "per_day": "por dia", "remote_follow": "Seguir remotamente", "statuses": "Postagens", "unblock": "Desbloquear", - "unblock_progress": "Desbloqueando...", - "block_progress": "Bloqueando...", + "unblock_progress": "A desbloquear…", + "block_progress": "A bloquear…", "unmute": "Retirar silêncio", - "unmute_progress": "Retirando silêncio...", - "mute_progress": "Silenciando..." + "unmute_progress": "A retirar silêncio…", + "mute_progress": "A silenciar…", + "admin_menu": { + "delete_user_confirmation": "Tens a certeza? Esta ação não pode ser revertida.", + "delete_user": "Eliminar utilizador", + "quarantine": "Não permitir publicações de utilizadores de instâncias remotas", + "disable_any_subscription": "Não permitir que nenhum utilizador te siga", + "disable_remote_subscription": "Não permitir seguidores de instâncias remotas", + "sandbox": "Forçar publicações apenas para seguidores", + "force_unlisted": "Forçar publicações como não listadas", + "strip_media": "Eliminar ficheiros multimédia das publicações", + "force_nsfw": "Marcar todas as publicações como NSFW (não apropriado para o trabalho)", + "delete_account": "Eliminar Conta", + "deactivate_account": "Desativar conta", + "activate_account": "Ativar conta", + "revoke_moderator": "Revogar permissões de Moderador", + "grant_moderator": "Conceder permissões de Moderador", + "revoke_admin": "Revogar permissões de Admin", + "grant_admin": "Conceder permissões de Admin", + "moderation": "Moderação" + }, + "show_repeats": "Mostrar partilhas", + "hide_repeats": "Ocultar partilhas", + "unsubscribe": "Retirar subscrição", + "subscribe": "Subscrever", + "report": "Denunciar", + "message": "Mensagem", + "mention": "Mencionar", + "hidden": "Ocultar", + "roles": { + "moderator": "Moderador", + "admin": "Admin" + } }, "user_profile": { - "timeline_title": "Linha do tempo do usuário", + "timeline_title": "Cronologia do Utilizador", "profile_does_not_exist": "Desculpe, este perfil não existe.", "profile_loading_error": "Desculpe, houve um erro ao carregar este perfil." }, @@ -400,17 +631,22 @@ "who_to_follow": "Quem seguir" }, "tool_tip": { - "media_upload": "Envio de mídia", - "repeat": "Repetir", + "media_upload": "Envio de multimédia", + "repeat": "Partilhar", "reply": "Responder", "favorite": "Favoritar", - "user_settings": "Configurações do usuário" + "user_settings": "Configurações do usuário", + "bookmark": "Guardar", + "reject_follow_request": "Rejeitar o pedido de seguimento", + "accept_follow_request": "Aceitar o pedido de seguimento", + "add_reaction": "Adicionar Reação" }, - "upload":{ + "upload": { "error": { "base": "Falha no envio.", "file_too_big": "Arquivo grande demais [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]", - "default": "Tente novamente mais tarde" + "default": "Tente novamente mais tarde", + "message": "Falha ao enviar: {0}" }, "file_size_units": { "B": "B", @@ -419,5 +655,179 @@ "GiB": "GiB", "TiB": "TiB" } + }, + "about": { + "mrf": { + "simple": { + "quarantine": "Quarentena", + "reject": "Rejeitar", + "accept": "Aceitar", + "media_removal_desc": "Este domínio remove multimédia das publicações dos seguintes domínios:", + "media_removal": "Remoção de multimédia", + "ftl_removal_desc": "Este domínio remove os seguintes domínios da cronologia \"Rede conhecida por todos\":", + "quarantine_desc": "Este domínio apenas irá publicar nos seguintes domínios:", + "reject_desc": "Este domínio não aceitará mensagens dos seguintes domínios:", + "accept_desc": "Este domínio aceita apenas mensagens dos seguintes domínios:", + "simple_policies": "Políticas especificas do domínio", + "media_nsfw": "Forçar definição de multimédia como Sensível", + "ftl_removal": "Remoção da cronologia da \"Rede conhecida por todos\"", + "media_nsfw_desc": "Este domínio força a multimédia a ser marcada como sensível nos seguintes domínios:" + }, + "keyword": { + "replace": "Substituir", + "reject": "Rejeitar", + "is_replaced_by": "→", + "keyword_policies": "Política de Palavras-Chave", + "ftl_removal": "Remoção da cronologia da \"Rede conhecida por todos\"" + }, + "federation": "Federação", + "mrf_policies": "Ativar Políticas MRF", + "mrf_policies_desc": "Políticas MRF manipulam o comportamento da federação nos domínios. As seguintes políticas estão ativadas:" + }, + "staff": "Staff" + }, + "remote_user_resolver": { + "searching_for": "A pesquisar por", + "error": "Não encontrado.", + "remote_user_resolver": "Resolução de utilizador remoto" + }, + "emoji": { + "unicode": "Emoji Unicode", + "custom": "Emoji customizado", + "add_emoji": "Inserir emoji", + "search_emoji": "Pesquisar por um emoji", + "emoji": "Emoji", + "load_all": "A carregar todos os {emojiAmount} emojis", + "load_all_hint": "Carregado o primeiro emoji {saneAmount}, carregar todos os emojis pode causar problemas de desempenho.", + "keep_open": "Manter o seletor aberto", + "stickers": "Autocolantes" + }, + "polls": { + "single_choice": "Escolha única", + "vote": "Vota", + "votes": "votos", + "option": "Opção", + "add_option": "Adicionar Opção", + "not_enough_options": "Demasiado poucas opções únicas na sondagem", + "expired": "A sondagem terminou há {0}", + "expires_in": "A sondagem termina em {0}", + "expiry": "Tempo para finalizar sondagem", + "multiple_choices": "Escolha múltipla", + "type": "Tipo de sondagem", + "add_poll": "Adicionar Sondagem" + }, + "importer": { + "error": "Ocorreu um erro ao importar este ficheiro.", + "success": "Importado com sucesso.", + "submit": "Enviar" + }, + "exporter": { + "processing": "A processar, brevemente ser-te-á pedido que descarregues o ficheiro", + "export": "Exportar" + }, + "domain_mute_card": { + "mute_progress": "A silenciar…", + "mute": "Silenciar", + "unmute": "Remover silêncio", + "unmute_progress": "A remover o silêncio…" + }, + "selectable_list": { + "select_all": "Seleccionar tudo" + }, + "interactions": { + "load_older": "Carregar interações mais antigas", + "follows": "Novos seguidores", + "favs_repeats": "Gostos e Partilhas", + "moves": "O utilizador migra" + }, + "errors": { + "storage_unavailable": "O Pleroma não conseguiu aceder ao armazenamento do navegador. A sua sessão ou definições locais não serão armazenadas e poderá encontrar problemas inesperados. Tente ativar as cookies." + }, + "shoutbox": { + "title": "Chat Geral" + }, + "chats": { + "chats": "Chats", + "empty_chat_list_placeholder": "Não tens conversações ainda. Inicia uma nova conversa!", + "error_sending_message": "Ocorreu algo de errado ao enviar a mensagem.", + "error_loading_chat": "Ocorreu algo de errado ao carregar o chat.", + "delete_confirm": "Desejas realmente apagar esta mensagem?", + "more": "Mais", + "empty_message_error": "Não podes publicar uma mensagem vazia", + "new": "Nova conversação", + "delete": "Apagar", + "message_user": "Mensagem de {nickname}", + "you": "Tu:" + }, + "search": { + "hashtags": "Hashtags", + "no_results": "Sem resultados", + "person_talking": "{count} pessoa a falar", + "people_talking": "{0} pessoas a falar", + "people": "Pessoas" + }, + "display_date": { + "today": "Hoje" + }, + "file_type": { + "file": "Ficheiro", + "image": "Imagem", + "video": "Vídeo", + "audio": "Áudio" + }, + "password_reset": { + "password_reset_required_but_mailer_is_disabled": "Deves repor a tua palavra-passe, porém, a reposição de palavra-passe está desativada. Contacta o administrador da tua instância.", + "password_reset_required": "Deves repor a tua palavra-passe para iniciar sessão.", + "password_reset_disabled": "A reposição da palavra-passe foi desativada. Contacta o administrador da tua instância.", + "too_many_requests": "Alcançaste o limite de tentativas, tenta novamente mais tarde.", + "return_home": "Voltar à página principal", + "check_email": "Verifica o teu endereço de e-mail para obter um link para repor a tua palavra-passe.", + "placeholder": "O teu endereço de e-mail ou nome de utilizador", + "instruction": "Introduz o teu endereço de e-mail ou nome de utilizador. Enviaremos um link para repores a tua palavra-passe.", + "password_reset": "Repor palavra-passe", + "forgot_password": "Esqueceu-se da palavra-passe?" + }, + "user_reporting": { + "generic_error": "Ocorreu um erro ao processar o teu pedido.", + "submit": "Enviar", + "forward_to": "Encaminhar para {0}", + "forward_description": "A conta é de outro servidor. Enviar também uma cópia da denúncia à outra instância?", + "additional_comments": "Comentários adicionais", + "add_comment_description": "Esta denúncia será enviada aos moderadores desta instância. Podes fornecer uma explicação pela qual te encontras a denunciar esta conta abaixo:", + "title": "Denunciar {0}" + }, + "time": { + "years_short": "{0}a", + "year_short": "{0}a", + "years": "{0} anos", + "year": "{0} ano", + "weeks_short": "{0}sem", + "week_short": "{0}sem", + "weeks": "{0} semanas", + "week": "{0} semana", + "seconds_short": "{0}s", + "second_short": "{0}s", + "seconds": "{0} segundos", + "second": "{0} segundo", + "now": "agora mesmo", + "now_short": "agora", + "months_short": "{0}m", + "month_short": "{0}m", + "months": "{0} meses", + "month": "{0} mês", + "minutes_short": "{0}min", + "minute_short": "{0}min", + "minutes": "{0} minutos", + "minute": "{0} minuto", + "in_past": "há {0}", + "in_future": "em {0}", + "hours_short": "{0}h", + "hour_short": "{0}h", + "hours": "{0} horas", + "hour": "{0} hora", + "days_short": "{0}d", + "day_short": "{0}d", + "days": "{0} dias", + "day": "{0} dia" } } diff --git a/src/i18n/ru.json b/src/i18n/ru.json index 8f421b50..30a65741 100644 --- a/src/i18n/ru.json +++ b/src/i18n/ru.json @@ -18,7 +18,13 @@ "generic_error": "Произошла ошибка", "optional": "не обязательно", "show_less": "Показать меньше", - "show_more": "Показать больше" + "show_more": "Показать больше", + "peek": "Свернуть", + "dismiss": "Закрыть", + "retry": "Попробуйте еще раз", + "error_retry": "Пожалуйста попробуйте еще раз", + "close": "Закрыть", + "loading": "Загрузка…" }, "login": { "login": "Войти", @@ -33,8 +39,12 @@ "recovery_code": "Код восстановления", "heading": { "TotpForm": "Двухфакторная аутентификация", - "RecoveryForm": "Two-factor recovery" - } + "RecoveryForm": "Two-factor recovery", + "totp": "Двухфакторная аутентификация", + "recovery": "Двухфакторное возвращение аккаунта" + }, + "hint": "Войдите чтобы присоединиться к дискуссии", + "description": "Войти с помощью OAuth" }, "nav": { "back": "Назад", @@ -46,22 +56,35 @@ "twkn": "Федеративная лента", "search": "Поиск", "friend_requests": "Запросы на чтение", - "bookmarks": "Закладки" + "bookmarks": "Закладки", + "chats": "Беседы", + "timelines": "Ленты", + "preferences": "Настройки", + "who_to_follow": "Кого читать", + "dms": "Личные Сообщения", + "administration": "Панель администратора", + "about": "О сервере", + "user_search": "Поиск пользователей" }, "notifications": { - "broken_favorite": "Неизвестный статус, ищем...", + "broken_favorite": "Неизвестный статус, ищем…", "favorited_you": "нравится ваш статус", "followed_you": "начал(а) читать вас", "load_older": "Загрузить старые уведомления", "notifications": "Уведомления", "read": "Прочесть", "repeated_you": "повторил(а) ваш статус", - "follow_request": "хочет читать вас" + "follow_request": "хочет читать вас", + "reacted_with": "добавил реакцию: {0}", + "migrated_to": "мигрировал на", + "no_more_notifications": "Нет дальнейших уведомлений", + "error": "Ошибка при обновлении уведомлений: {0}" }, "interactions": { "favs_repeats": "Повторы и фавориты", - "follows": "Новые подписки", - "load_older": "Загрузить старые взаимодействия" + "follows": "Новые читатели", + "load_older": "Загрузить старые взаимодействия", + "moves": "Миграции пользователей" }, "post_status": { "account_not_locked_warning": "Ваш аккаунт не {0}. Кто угодно может начать читать вас чтобы видеть посты только для подписчиков.", @@ -81,7 +104,21 @@ "private": "Для подписчиков - этот пост видят только подписчики", "public": "Публичный - этот пост виден всем", "unlisted": "Непубличный - этот пост не виден на публичных лентах" - } + }, + "preview_empty": "Пустой предпросмотр", + "media_description_error": "Не удалось обновить вложение, попробуйте еще раз", + "empty_status_error": "Нельзя отправить пустой статус без вложений", + "preview": "Предпросмотр", + "direct_warning_to_first_only": "Это сообщение увидят только пользователи упомянутые в его начале.", + "direct_warning_to_all": "Это сообщение увидят все упомянутые пользователи.", + "content_type": { + "text/bbcode": "BBCode", + "text/html": "HTML", + "text/markdown": "Markdown", + "text/plain": "Простой текст" + }, + "media_description": "Описание вложения", + "new_status": "Написать новый статус" }, "registration": { "bio": "Описание", @@ -97,7 +134,12 @@ "password_required": "не должен быть пустым", "password_confirmation_required": "не должно быть пустым", "password_confirmation_match": "должно совпадать с паролем" - } + }, + "bio_placeholder": "например:\nПривет, я Игорь Печкин.\nРаботаю почтальоном в деревне Простоквашино. С недавних пор велосипедист.", + "fullname_placeholder": "например: Почтальон Печкин", + "username_placeholder": "например: pechkin", + "captcha": "Код подтверждения", + "new_captcha": "Нажмите на изображение чтобы получить новый код" }, "settings": { "enter_current_password_to_confirm": "Введите свой текущий пароль", @@ -110,7 +152,7 @@ "generate_new_recovery_codes": "Получить новые коды востановления", "warning_of_generate_new_codes": "После получения новых кодов восстановления, старые больше не будут работать.", "recovery_codes": "Коды восстановления.", - "waiting_a_recovery_codes": "Получение кодов восстановления ...", + "waiting_a_recovery_codes": "Получение кодов восстановления…", "recovery_codes_warning": "Запишите эти коды и держите в безопасном месте - иначе вы их больше не увидите. Если вы потеряете доступ к OTP приложению - без резервных кодов вы больше не сможете залогиниться.", "authentication_methods": "Методы аутентификации", "scan": { @@ -141,14 +183,14 @@ "change_password": "Сменить пароль", "change_password_error": "Произошла ошибка при попытке изменить пароль.", "changed_password": "Пароль изменён успешно!", - "collapse_subject": "Сворачивать посты с темой", + "collapse_subject": "Сворачивать статусы с темой", "confirm_new_password": "Подтверждение нового пароля", "current_avatar": "Текущий аватар", "current_password": "Текущий пароль", "current_profile_banner": "Текущий баннер профиля", "data_import_export_tab": "Импорт / Экспорт данных", "delete_account": "Удалить аккаунт", - "delete_account_description": "Удалить ваш аккаунт и все ваши сообщения.", + "delete_account_description": "Удалить вашу учётную запись и все ваши сообщения.", "delete_account_error": "Возникла ошибка в процессе удаления вашего аккаунта. Если это повторяется, свяжитесь с администратором вашего сервера.", "delete_account_instructions": "Введите ваш пароль в поле ниже для подтверждения удаления.", "export_theme": "Сохранить Тему", @@ -196,7 +238,7 @@ "hide_followers_count_description": "Не показывать число моих подписчиков", "show_admin_badge": "Показывать значок администратора в моем профиле", "show_moderator_badge": "Показывать значок модератора в моем профиле", - "nsfw_clickthrough": "Включить скрытие NSFW вложений", + "nsfw_clickthrough": "Включить скрытие вложений и предпросмотра ссылок для NSFW статусов", "oauth_tokens": "OAuth токены", "token": "Токен", "refresh_token": "Рефреш токен", @@ -249,7 +291,18 @@ "save_load_hint": "Опции \"оставить...\" позволяют сохранить текущие настройки при выборе другой темы или импорта её из файла. Так же они влияют на то какие компоненты будут сохранены при экспорте темы. Когда все галочки сняты все компоненты будут экспортированы.", "reset": "Сбросить", "clear_all": "Очистить всё", - "clear_opacity": "Очистить прозрачность" + "clear_opacity": "Очистить прозрачность", + "use_source": "Новая версия", + "use_snapshot": "Старая версия", + "keep_as_is": "Оставить, как есть", + "load_theme": "Загрузить тему", + "help": { + "fe_upgraded": "Движок тем для фронт-энда Pleroma был изменен после обновления.", + "older_version_imported": "Файл, который вы импортировали, был сделан в старой версии фронт-энда.", + "future_version_imported": "Файл, который вы импортировали, был сделан в новой версии фронт-энда.", + "v2_imported": "Файл, который вы импортировали, был сделан под старый фронт-энд. Мы стараемся улучшить совместимость, но все еще возможны несостыковки.", + "upgraded_from_v2": "Фронт-энд Pleroma был изменен. Выбранная тема может выглядеть слегка по-другому." + } }, "common": { "color": "Цвет", @@ -284,7 +337,9 @@ "borders": "Границы", "buttons": "Кнопки", "inputs": "Поля ввода", - "faint_text": "Маловажный текст" + "faint_text": "Маловажный текст", + "post": "Сообщения и описание пользователя", + "alert_neutral": "Нейтральный" }, "radii": { "_tab_label": "Скругление" @@ -349,7 +404,75 @@ } }, "allow_following_move": "Разрешить автоматически читать новый аккаунт при перемещении на другой сервер", - "hide_user_stats": "Не показывать статистику пользователей (например количество читателей)" + "hide_user_stats": "Не показывать статистику пользователей (например количество читателей)", + "discoverable": "Разрешить показ аккаунта в поисковиках и других сервисах", + "default_vis": "Видимость постов по умолчанию", + "mutes_and_blocks": "Блокировки и игнорируемые", + "composing": "Составление постов", + "chatMessageRadius": "Сообщения в беседе", + "blocks_tab": "Блокировки", + "import_mutes_from_a_csv_file": "Импортировать игнорируемых из CSV файла", + "mutes_imported": "Игнорируемые импортированы! Обработка может занять некоторое время.", + "mute_import_error": "Произошла ошибка при импорте игнорируемых", + "mute_import": "Импорт игнорируемых", + "block_export_button": "Экспортирует блокировки в CSV файл", + "mute_export_button": "Экспортирует игнорируемых пользователей в CSV файл", + "mute_export": "Экспорт игнорируемых", + "blocks_imported": "Блокировки импортированы! Обработка может занять некоторое время.", + "block_import_error": "Произошла ошибка при импорте блокировок", + "block_import": "Импорт блокировок", + "block_export": "Экспортировать блокировки", + "security": "Безопасность", + "app_name": "Приложение", + "user_mutes": "Пользователи", + "post_status_content_type": "Формат составляемых статусов по умолчанию", + "subject_line_noop": "Не копировать", + "subject_line_mastodon": "Как в Mastodon: скопировать как есть", + "subject_line_email": "Как в e-mail: \"re: тема\"", + "subject_line_behavior": "Копировать тему в ответах", + "no_mutes": "Нет игнорируемых", + "no_blocks": "Нет блокировок", + "notification_visibility_emoji_reactions": "Реакции", + "notification_visibility_moves": "Миграции пользователей", + "use_contain_fit": "Не обрезать вложения в миниатюрах", + "profile_fields": { + "value": "Значение", + "name": "Пункт", + "add_field": "Добавить поле", + "label": "Таблица метаданных профиля" + }, + "play_videos_in_modal": "Проигрывать видео во всплывающей рамке", + "mutes_tab": "Игнорируемые", + "invalid_theme_imported": "Выбраный файл не является темой Pleroma. Изменений в тему не было внесено.", + "import_blocks_from_a_csv_file": "Импортировать блокировки из CSV файла", + "hide_filtered_statuses": "Не показывать отфильтрованные статусы", + "hide_muted_posts": "Не показывать статусы игнорируемых пользователей", + "hide_post_stats": "Не показывать статистику статусов (например количество отметок «Нравится»)", + "use_one_click_nsfw": "Открывать NSFW вложения одним кликом", + "preload_images": "Предварительно загружать изображения", + "max_thumbnails": "Максимальное число миниатюр показываемых в статусе", + "emoji_reactions_on_timeline": "Показывать эмодзи реакции в ленте", + "domain_mutes": "Узлы", + "notification_setting_privacy": "Приватность", + "notification_setting_block_from_strangers": "Не показывать уведомления от пользователей которых вы не читаете", + "notification_setting_filters": "Фильтрация", + "notifications": "Уведомления", + "virtual_scrolling": "Оптимизировать рендеринг ленты", + "hide_wallpaper": "Скрыть обои узла", + "accent": "Акцент", + "upload_a_photo": "Загрузить фото", + "notification_mutes": "Чтобы не получать уведомления от определённого пользователя, заглушите его.", + "reset_avatar_confirm": "Вы действительно хотите сбросить личный образ?", + "reset_profile_banner": "Сбросить личный баннер", + "reset_profile_background": "Сбросить личные обои", + "reset_avatar": "Сбросить личный образ", + "search_user_to_mute": "Искать, кого вы хотите заглушить", + "search_user_to_block": "Искать, кого вы хотите заблокировать", + "pad_emoji": "Выделять эмодзи пробелами при добавлении из панели", + "avatar_size_instruction": "Желательный наименьший размер личного образа 150 на 150 пикселей.", + "enable_web_push_notifications": "Включить web push-уведомления", + "notification_blocks": "Блокировка пользователя выключает все уведомления от него, а также отписывает вас от него.", + "notification_setting_hide_notification_contents": "Скрыть отправителя и содержимое push-уведомлений" }, "timeline": { "collapse": "Свернуть", @@ -359,11 +482,23 @@ "no_retweet_hint": "Пост помечен как \"только для подписчиков\" или \"личное\" и поэтому не может быть повторён", "repeated": "повторил(а)", "show_new": "Показать новые", - "up_to_date": "Обновлено" + "up_to_date": "Обновлено", + "error": "Ошибка при обновлении ленты: {0}" }, "status": { - "bookmark": "В закладки", - "unbookmark": "Удалить из закладок" + "bookmark": "Добавить в закладки", + "unbookmark": "Удалить из закладок", + "status_deleted": "Пост удален", + "reply_to": "Ответ", + "repeats": "Повторы", + "favorites": "Понравилось", + "unmute_conversation": "Прекратить игнорировать разговор", + "mute_conversation": "Игнорировать разговор", + "thread_muted": "Разговор игнорируется", + "external_source": "Перейти к источнику", + "delete_confirm": "Вы действительно хотите удалить данный статус?", + "delete": "Удалить", + "copy_link": "Скопировать ссылку" }, "user_card": { "block": "Заблокировать", @@ -376,7 +511,7 @@ "follow_unfollow": "Перестать читать", "followees": "Читаемые", "followers": "Читатели", - "following": "Читаю!", + "following": "Читаете!", "follows_you": "Читает вас!", "mute": "Игнорировать", "muted": "Игнорирую", @@ -401,6 +536,15 @@ "quarantine": "Не федерировать посты пользователя", "delete_user": "Удалить пользователя", "delete_user_confirmation": "Вы уверены? Это действие нельзя отменить." + }, + "media": "С вложениями", + "mention": "Упомянуть", + "show_repeats": "Показывать повторы", + "hide_repeats": "Скрыть повторы", + "report": "Пожаловаться", + "roles": { + "moderator": "Модератор", + "admin": "Администратор" } }, "user_profile": { @@ -468,15 +612,99 @@ "media_proxy": "Прокси для внешних вложений", "text_limit": "Лимит символов", "title": "Особенности", - "gopher": "Gopher" + "gopher": "Gopher", + "who_to_follow": "Предложения кого читать", + "pleroma_chat_messages": "Pleroma Чат", + "upload_limit": "Наибольший размер загружаемого файла" }, "tool_tip": { "accept_follow_request": "Принять запрос на чтение", - "reject_follow_request": "Отклонить запрос на чтение" + "reject_follow_request": "Отклонить запрос на чтение", + "media_upload": "Прикрепить вложение" }, "image_cropper": { "save_without_cropping": "Сохранить не обрезая", "save": "Сохранить", - "crop_picture": "Обрезать картинку" + "crop_picture": "Обрезать картинку", + "cancel": "Отменить" + }, + "errors": { + "storage_unavailable": "Pleroma не смогла получить доступ к хранилищу браузера. Ваша сессия и настройки не будут сохранены, и вы можете столкнуться с непредвиденными проблемами. Попробуйте включить файлы cookie." + }, + "polls": { + "not_enough_options": "Недостаточно уникальных вариантов в опросе", + "expired": "Опрос закончился {0} назад", + "expires_in": "Опрос заканчивается через {0}", + "expiry": "Срок опроса", + "multiple_choices": "Несколько вариантов", + "single_choice": "Один вариант", + "type": "Тип опроса", + "vote": "Проголосовать", + "votes": "голосов", + "option": "Вариант", + "add_option": "Добавить вариант", + "add_poll": "Прикрепить опрос" + }, + "media_modal": { + "next": "Следующая", + "previous": "Предыдущая" + }, + "importer": { + "error": "Произошла ошибка при импорте файла.", + "success": "Импорт прошел успешно.", + "submit": "Отправить" + }, + "selectable_list": { + "select_all": "Выбрать все" + }, + "emoji": { + "load_all": "Все {emojiAmount} эмодзи загружаются", + "load_all_hint": "Загружены первые {saneAmount} эмодзи, загрузка всех эмодзи может привести к проблемам с производительностью.", + "unicode": "Стандартные эмодзи", + "custom": "Пользовательские эмодзи", + "add_emoji": "Добавить эмодзи", + "search_emoji": "Поиск эмодзи", + "keep_open": "Оставить окно выбора открытым", + "emoji": "Эмодзи", + "stickers": "Стикеры" + }, + "shoutbox": { + "title": "Болтовня" + }, + "time": { + "days_short": "{0}дн", + "years_short": "{0}г", + "year_short": "{0}г", + "weeks_short": "{0}нед", + "week_short": "{0}нед", + "seconds_short": "{0}сек", + "second_short": "{0}с", + "now_short": "только что", + "now": "только что", + "months_short": "{0}мес", + "month_short": "{0}мес", + "minutes_short": "{0}мин", + "minute_short": "{0}мин", + "in_past": "{0} назад", + "in_future": "через {0}", + "hours_short": "{0}ч", + "hour_short": "{0}ч", + "hour": "{0} час", + "day_short": "{0}д", + "days": "{0} дней" + }, + "chats": { + "empty_chat_list_placeholder": "У вас пока нет бесед. Начните одну!", + "delete_confirm": "Вы точно хотите удалить сообщение?", + "empty_message_error": "Нельзя отправить пустое сообщение", + "new": "Новая беседа", + "chats": "Беседы", + "delete": "Удалить", + "message_user": "Напишите {nickname}", + "you": "Вы:" + }, + "remote_user_resolver": { + "error": "Не найдено.", + "searching_for": "Ищем" } } diff --git a/src/i18n/uk.json b/src/i18n/uk.json new file mode 100644 index 00000000..040d6f4f --- /dev/null +++ b/src/i18n/uk.json @@ -0,0 +1,823 @@ +{ + "general": { + "dismiss": "Закрити", + "close": "Закрити", + "verify": "Перевірити", + "confirm": "Підтвердити", + "enable": "Увімкнути", + "disable": "Вимкнути", + "cancel": "Скасувати", + "show_less": "Показати менше", + "show_more": "Показати більше", + "optional": "необов'язково", + "retry": "Спробуйте ще раз", + "error_retry": "Будь ласка, спробуйте ще раз", + "generic_error": "Виникла помилка", + "loading": "Завантаження…", + "more": "Більше", + "submit": "Відправити", + "apply": "Застосувати", + "peek": "Глянути" + }, + "finder": { + "error_fetching_user": "Користувача не знайдено", + "find_user": "Знайти користувача" + }, + "features_panel": { + "gopher": "Gopher", + "pleroma_chat_messages": "Чати", + "chat": "Міні-чат", + "who_to_follow": "Кого відстежувати", + "title": "Особливості", + "scope_options": "Параметри обсягу", + "media_proxy": "Посередник медіа-даних", + "text_limit": "Ліміт символів", + "upload_limit": "Обмеження завантажень" + }, + "exporter": { + "processing": "Опрацьовую, скоро ви зможете завантажити файл", + "export": "Експорт" + }, + "domain_mute_card": { + "unmute_progress": "Вмикаю…", + "unmute": "Вимкнути заглушення", + "mute_progress": "Вимикаю…", + "mute": "Ігнорувати" + }, + "shoutbox": { + "title": "Міні-чат" + }, + "about": { + "staff": "Адміністрація", + "mrf": { + "simple": { + "media_nsfw_desc": "Даний інстанс примусово позначає медіа в наступних інстансах як дратівливий:", + "media_nsfw": "Примусове визначення медіа як дратівливого", + "media_removal_desc": "Поточний інстанс видаляє медіа з дописів на перелічених інстансах:", + "media_removal": "Видалення медіа", + "ftl_removal_desc": "Цей інстанс видаляє перелічені інстанси з Федеративної стрічки:", + "ftl_removal": "Видалення зі стрічки Федеративної мережі", + "quarantine_desc": "Поточний інстанс надсилатиме тільки публічні дописи наступним інстансам:", + "quarantine": "Карантин", + "reject_desc": "Поточний інстанс не прийматиме повідомлення з перелічених інстансів:", + "accept": "Прийняти", + "reject": "Відхилити", + "accept_desc": "Поточний інстанс приймає повідомлення тільки з перелічених інстансів:", + "simple_policies": "Правила поточного інстансу" + }, + "mrf_policies_desc": "Правила MRF розповсюджуються на даний інстанс. Наступні правила активні:", + "mrf_policies": "Активувати правила MRF (модуль переписування повідомлень)", + "keyword": { + "is_replaced_by": "→", + "replace": "Замінити", + "reject": "Відхилити", + "ftl_removal": "Прибрати з федеративної стрічки", + "keyword_policies": "Політика щодо ключових слів" + }, + "federation": "Федерація" + } + }, + "login": { + "hint": "Увійдіть, щоб доєднатися до дискусії", + "username": "Ім'я користувача", + "register": "Зареєструватись", + "password": "Пароль", + "logout": "Вийти", + "description": "Увійти за допомогою OAuth", + "login": "Увійти", + "recovery_code": "Код відновлення", + "enter_recovery_code": "Введіть код відновлення", + "authentication_code": "Код автентифікації", + "heading": { + "recovery": "Двофакторне відновлення", + "totp": "Двофакторна автентифікація" + }, + "enter_two_factor_code": "Введіть двофакторний код автентифікації", + "placeholder": "напр. stepan" + }, + "importer": { + "error": "Під час імпортування файлу сталася помилка.", + "success": "Імпортовано успішно.", + "submit": "Відправити" + }, + "image_cropper": { + "cancel": "Відмінити", + "save_without_cropping": "Зберегти не обрізаючи", + "crop_picture": "Обрізати малюнок", + "save": "Зберегти" + }, + "polls": { + "expired": "Опитування закінчилось {0} тому", + "expires_in": "Опитування закінчується через {0}", + "expiry": "Термін опитування", + "multiple_choices": "Декілька варіантів", + "single_choice": "Один варіант", + "add_option": "Додати опцію", + "type": "Тип опитування", + "vote": "Проголосувати", + "votes": "голосів", + "option": "Відповідь", + "add_poll": "Додати опитування", + "not_enough_options": "Замало унікальних варіантів в опитуванні" + }, + "notifications": { + "reacted_with": "додав реакцію: {0}", + "migrated_to": "мігрував на", + "no_more_notifications": "Немає більше сповіщень", + "repeated_you": "поширив(-ла) ваш допис", + "read": "Прочитано!", + "notifications": "Сповіщення", + "load_older": "Завантажити давніші сповіщення", + "follow_request": "хоче підписатись на вас", + "followed_you": "підписався(-лась) на вас", + "favorited_you": "вподобав(-ла) ваш допис", + "broken_favorite": "Невідомий допис, шукаю його…", + "error": "Помилка при оновленні сповіщень: {0}" + }, + "nav": { + "chats": "Чати", + "timelines": "Стрічки", + "twkn": "Уся відома мережа", + "about": "Інформація", + "preferences": "Налаштування", + "friend_requests": "Запити послідовників", + "who_to_follow": "Кого відстежувати", + "search": "Пошук", + "user_search": "Пошук користувача", + "bookmarks": "Закладки", + "timeline": "Домашня стрічка", + "public_tl": "Публічна стрічка", + "dms": "Приватні повідомлення", + "interactions": "Взаємодії", + "mentions": "Згадування", + "back": "Назад", + "administration": "Адміністрування" + }, + "media_modal": { + "next": "Наступна", + "previous": "Попередня" + }, + "password_reset": { + "instruction": "Введіть свою адресу електронної пошти або ім’я користувача. Ми надішлемо вам посилання для скидання пароля.", + "placeholder": "Ваша електронна адреса або ім'я користувача", + "check_email": "Перевірте електронну пошту на наявність посилання для скидання пароля.", + "return_home": "Повернутися на головну сторінку", + "too_many_requests": "Ви досягли ліміту спроб, спробуйте ще раз пізніше.", + "password_reset_required_but_mailer_is_disabled": "Ви повинні скинути свій пароль, але скидання пароля вимкнено. Зверніться до адміністратора інстансу.", + "password_reset_disabled": "Скидання пароля вимкнено. Зверніться до адміністратора інстансу.", + "password_reset_required": "Для входу потрібно скинути пароль.", + "password_reset": "Відновити пароль", + "forgot_password": "Забули пароль?" + }, + "chats": { + "you": "Ви:", + "message_user": "Повідомлення для {nickname}", + "delete": "Видалити", + "chats": "Чати", + "new": "Новий чат", + "empty_message_error": "Не вдається опублікувати порожнє повідомлення", + "more": "Більше", + "delete_confirm": "Ви дійсно хочете видалити це повідомлення?", + "error_loading_chat": "Під час завантаження чату сталася помилка.", + "error_sending_message": "Під час надсилання повідомлення сталася помилка.", + "empty_chat_list_placeholder": "У вас ще немає чатів. Почніть новий чат!" + }, + "file_type": { + "audio": "Аудіо", + "video": "Відео", + "image": "Зображення", + "file": "Файл" + }, + "display_date": { + "today": "Сьогодні" + }, + "interactions": { + "load_older": "Завантажити давніші взаємодії", + "follows": "Нові підписки", + "favs_repeats": "Поширення та вподобайки", + "moves": "Міграції користувачів" + }, + "errors": { + "storage_unavailable": "Pleroma не змогла отримати доступ до сховища браузеру. Ваша сесія та налаштування не будуть збережені, це може спричинити непередбачувані проблеми. Спробуйте увімкнути cookie." + }, + "emoji": { + "stickers": "Стікери", + "custom": "Користувацькі емодзі", + "search_emoji": "Пошук емодзі", + "keep_open": "Тримати панель відкритою", + "add_emoji": "Додати емодзі", + "emoji": "Емодзі", + "load_all": "Всі {emojiAmount} эмодзі завантажуються", + "load_all_hint": "Завантажені перші {saneAmount} емодзі, завантаження всіх емодзі може призвести до проблем з продуктивністю.", + "unicode": "Стандартні емодзі" + }, + "post_status": { + "content_type": { + "text/bbcode": "BBCode", + "text/markdown": "Markdown", + "text/html": "HTML", + "text/plain": "Текстові дані" + }, + "attachments_sensitive": "Позначити вкладення як чутливі", + "account_not_locked_warning_link": "замкнена", + "account_not_locked_warning": "Ваша обліковка не {0}. Будь-хто може відстежувати вас для перегляду дописів тільки для підписників.", + "new_status": "Створити допис", + "direct_warning_to_first_only": "Цей допис побачать лише користувачі, що були згадані на початку повідомлення.", + "direct_warning_to_all": "Цей допис побачать всі згадані користувачі.", + "default": "Що нового?", + "content_warning": "Тема (необов'язково)", + "preview": "Попередній перегляд", + "posting": "Відправляється", + "empty_status_error": "Не можу опублікувати пустий статус без вкладень", + "scope": { + "unlisted": "Непублічний - цей допис буде відсутній у публічних стрічках", + "public": "Публічний - цей допис побачать усі", + "private": "Для читачів - цей допис побачать лише ваші читачі", + "direct": "Приватний - цей допис побачать лише згадані користувачі" + }, + "scope_notice": { + "unlisted": "Цей допис не буде видно в публічній стрічці та усій відомій мережі", + "private": "Цей допис побачать лише ваші підписники", + "public": "Цей допис бачитимуть усі" + }, + "preview_empty": "Пустий", + "media_description_error": "Не вдалось оновити медіа, спробуйте ще раз", + "media_description": "Опис медіа" + }, + "settings": { + "blocks_imported": "Блокування імпортовані! Їх обробка триватиме певний час.", + "block_import_error": "Помилка імпортування блокувань", + "block_import": "Імпорт блокувань", + "block_export_button": "Експорт блокувань у файл CSV", + "block_export": "Експорт блокувань", + "bio": "Про Вас", + "background": "Обкладинка", + "app_name": "Назва програми", + "follow_export": "Експортувати відстежуваних", + "filtering_explanation": "Усі статуси з цими словами будуть приховані, один на рядок", + "filtering": "Фільтрування", + "export_theme": "Зберегти переднабір", + "avatar_size_instruction": "Рекомендований мінімальний розмір для зображень аватара становить 150x150 пікселів.", + "delete_account_instructions": "Введіть ваш пароль в поле нижче, аби підтвердити видалення облікового запису.", + "delete_account_error": "Під час видалення вашого облікового запису виникла проблема. Якщо це трапляється постійно, будь ласка, зверніться до адміністратора вашого сервера.", + "delete_account_description": "Остаточно видалити ваш обліковий запис та усі ваші повідомлення.", + "delete_account": "Видалити обліковий запис", + "default_vis": "Обсяг видимості за замовчуванням", + "data_import_export_tab": "Імпорт/експорт даних", + "current_password": "Поточний пароль", + "confirm_new_password": "Підтвердіть новий пароль", + "composing": "Складання відповіді", + "collapse_subject": "Згорнути дописи з темами", + "changed_password": "Пароль успішно змінено!", + "change_password_error": "Не вдалося змінити пароль.", + "change_password": "Змінити пароль", + "cRed": "Червоний (Скасувати)", + "cGreen": "Зелений (Поширити)", + "cOrange": "Жовтогарячий (Вподобайки)", + "cBlue": "Блакитний (Відповісти, читати)", + "btnRadius": "Кнопки", + "blocks_tab": "Блокування", + "avatarRadius": "Аватарки", + "avatarAltRadius": "Аватарки у сповіщеннях", + "avatar": "Аватар", + "attachments": "Вкладення", + "attachmentRadius": "Вкладення", + "general": "Загальні", + "foreground": "Передній план", + "follows_imported": "Відстежуваних імпортовано! Їхня обробка потребує часу.", + "follow_import_error": "Помилка імпортування відстежуваних", + "follow_import": "Імпортувати відстежуваних", + "follow_export_button": "Експортувати відстежуваних до csv файлу", + "lock_account_description": "Обмежте свій обліковий запис лише схваленими читачами", + "links": "Посилання", + "limited_availability": "Недоступно у вашому браузері", + "invalid_theme_imported": "Вибраний файл не є темою Pleroma. У вашу тему не внесено жодних змін.", + "interfaceLanguage": "Мова оболонки", + "interface": "Оболонка", + "instance_default_simple": "(за замовчуванням)", + "instance_default": "(за замовчуванням: {value})", + "checkboxRadius": "Прапорці", + "inputRadius": "Поля вводу", + "import_theme": "Завантажити переднабір", + "import_followers_from_a_csv_file": "Імпортувати відстежуваних з csv файлу", + "import_blocks_from_a_csv_file": "Імпортувати заблокованих з csv файлу", + "hide_filtered_statuses": "Сховати відфільтровані статуси", + "hide_user_stats": "Приховувати статистику користувачів (напр. кількість відстежувачів)", + "hide_post_stats": "Приховувати статистику дописів (напр. кількість вподобаних)", + "use_one_click_nsfw": "Відкривати NSFW вкладення одним кліком миші", + "preload_images": "Передзавантажувати світлини", + "hide_isp": "Сховати панель з особливостями сервера", + "max_thumbnails": "Максимальна кількість мініатюр на повідомлення", + "hide_muted_posts": "Приховати повідомлення приглушених користувачів", + "hide_attachments_in_tl": "Приховувати вкладення у стрічці", + "hide_attachments_in_convo": "Приховувати вкладення у розмовах", + "mutes_tab": "Заглушені", + "loop_video_silent_only": "Зациклити відео без звуку (напр. Mastodon \"gifs\")", + "loop_video": "Зациклити відео", + "mfa": { + "verify": { + "desc": "Щоб увімкнути двофакторну автентифікацію, введіть код з вашого застосунку для двофакторної автентифікації:" + }, + "scan": { + "desc": "Відскануйте цей QR-код за допомогою програми двофакторної автентифікації або введіть текстовий ключ:", + "title": "Сканування", + "secret_code": "Ключ" + }, + "authentication_methods": "Методи автентифікації", + "recovery_codes_warning": "Запишіть ці коди і тримайте в безпечному місці - інакше ви їх ніколи не побачите. Якщо ви втратите доступ до OTP додатку - без резервних кодів ви не зможете отримати доступ до свого облікового запису.", + "waiting_a_recovery_codes": "Отримую резервні коди…", + "recovery_codes": "Резервні коди.", + "warning_of_generate_new_codes": "Після отримання нових резервних кодів, старі перестануть працювати.", + "generate_new_recovery_codes": "Згенерувати нові резервні коди", + "title": "Двофакторна автентифікація", + "confirm_and_enable": "Підтвердити та увімкнути OTP", + "wait_pre_setup_otp": "попереднє налаштування OTP", + "setup_otp": "Налаштування OTP", + "otp": "OTP" + }, + "enter_current_password_to_confirm": "Введіть свій поточний пароль", + "security": "Безпека", + "domain_mutes": "Домени", + "discoverable": "Дозволити виявлення цього облікового запису в результатах пошуку та інших службах", + "mutes_and_blocks": "Заглушення та блокування", + "changed_email": "Email успішно змінено!", + "change_email_error": "Сталася помилка під час зміни email.", + "change_email": "Змінити email", + "bot": "Це обліковий запис бота", + "import_mutes_from_a_csv_file": "Імпорт заглушених з csv файлу", + "mutes_imported": "Заглушені імпортовані! Їх обробка триватиме певний час.", + "mute_export_button": "Експорт заглушених у csv файл", + "mute_import_error": "Під час імпорту заглушених сталася помилка", + "mute_import": "Імпорт ігнорувань", + "mute_export": "Експорт ігнорувань", + "new_password": "Новий пароль", + "new_email": "Нова ел. пошта", + "name_bio": "Особисті дані", + "set_new_profile_banner": "Встановити новий банер", + "set_new_avatar": "Встановити новий аватар", + "security_tab": "Безпека", + "saving_ok": "Налаштування збережені", + "saving_err": "Помилка при збереженні налаштувань", + "reply_visibility_self": "Показувати лише адресовані мені відповіді", + "reply_visibility_following": "Показувати відповіді адресовані лише мені або користувачам, яких я читаю", + "reply_visibility_all": "Показати всі відповіді", + "replies_in_timeline": "Відповіді в стрічці", + "profile_tab": "Профіль", + "profile_banner": "Банер профілю", + "profile_background": "Обкладинка профілю", + "revoke_token": "Відкликати", + "oauth_tokens": "OAuth ключі", + "token": "Ключ", + "refresh_token": "Оновити ключ", + "valid_until": "Діє до", + "use_contain_fit": "Не обрізати краї мініатюр", + "name": "Ім'я", + "profile_fields": { + "value": "Зміст", + "name": "Назва", + "add_field": "Додати поле", + "label": "Метадані профілю" + }, + "play_videos_in_modal": "Відтворювати відео у спливаючій рамці", + "accent": "Акцент", + "chatMessageRadius": "Повідомлення в бесіді", + "notification_mutes": "Щоб перестати отримувати сповіщення від певного користувача, заглушіть його.", + "user_mutes": "Користувачі", + "no_mutes": "Заглушені відсутні", + "emoji_reactions_on_timeline": "Показувати реакції емоджі на стрічці", + "pad_emoji": "Автоматично додавати простір з обидвох сторін емоджі", + "allow_following_move": "Дозволити автостеження при переміщенні на інший інстанс", + "set_new_profile_background": "Встановити нову обкладинку профілю", + "radii_help": "Радіус заокруглення кутів інтерфейсу (в пікселях)", + "presets": "Переднабір", + "show_moderator_badge": "Показувати значок модератора в моєму профілі", + "show_admin_badge": "Показувати значок адміністратора в моєму профілі", + "hide_followers_description": "Не показувати хто підписаний на мене", + "hide_follows_description": "Не показувати на кого я підписаний", + "no_rich_text_description": "Видалення всього форматування тексту з усіх дописів", + "notification_visibility_emoji_reactions": "Реакції", + "notification_visibility_moves": "Міграція користувача", + "notification_visibility_repeats": "Поширення допису", + "notification_visibility_mentions": "Згадування", + "notification_visibility_likes": "Вподобайки", + "notification_visibility_follows": "Нові підписки", + "notification_visibility": "Отримувати сповіщення про наступні події", + "settings": "Налаштування", + "panelRadius": "Панелі", + "text": "Текст", + "tooltipRadius": "Підказки/попередження", + "values": { + "true": "так", + "false": "ні" + }, + "user_settings": "Користувацькі налаштування", + "upload_a_photo": "Завантажити фото", + "theme": "Тема", + "style": { + "switcher": { + "keep_fonts": "Залишити шрифти", + "keep_roundness": "Залишити скруглення", + "keep_opacity": "Залишити прозорості", + "keep_shadows": "Залишити тіні", + "keep_color": "Залишити кольори", + "use_source": "Нова версія", + "use_snapshot": "Стара версія", + "load_theme": "Завантажити тему", + "reset": "Скинути", + "clear_all": "Очистити все", + "help": { + "older_version_imported": "Імпортований файл було створено в старішій версії FE.", + "future_version_imported": "Імпортований файл було створено в новішій версії FE.", + "v2_imported": "Файл, який ви імпортували, був створений для старішої версії інтерфейсу Pleroma. Ми намагаємось покращити сумісність, але все одно можуть бути розбіжності.", + "upgraded_from_v2": "PleromaFE було оновлено, тема може дещо відрізнятися від тієї, яку ви пам’ятаєте.", + "snapshot_source_mismatch": "Конфлікт версій: Швидше за все, FE повернуто до попередньої версії та оновлено знову, якщо ви змінили тему за допомогою старішої версії FE, швидше за все, ви хочете використовувати стару версію, інакше використовуйте нову версію.", + "migration_napshot_gone": "З якоїсь причини знімок зник, деякі речі можуть бути не такими, як ви пам’ятаєте.", + "migration_snapshot_ok": "Для безпеки, знімок теми завантажено. Ви можете спробувати завантажити дані теми.", + "fe_downgraded": "Версію PleromaFE змінено на старшу.", + "fe_upgraded": "Двигун теми PleromaFE оновлено.", + "snapshot_missing": "У файлі немає жодного знімка теми, тому він може виглядати інакше, ніж передбачалося спочатку.", + "snapshot_present": "Знімок теми завантажено, тому всі значення було перезаписано. Натомість ви можете завантажити правильні дані теми." + }, + "keep_as_is": "Залишити як є", + "clear_opacity": "Очистити прозорість", + "save_load_hint": "Параметри \"Зберегти\" зберігають поточні параметри під час вибору або завантаження тем, вони також зберігають зазначені параметри під час експорту теми. Коли всі прапорці знято, експортування теми збереже все." + }, + "common": { + "color": "Колір", + "contrast": { + "context": { + "text": "для тексту", + "18pt": "для великого (18pt+) тексту" + }, + "level": { + "bad": "Не відповідає жодним вимогам щодо доступності", + "aaa": "відповідає вимогам рівня ААA (рекомендований)", + "aa": "відповідає вимогам рівня АА (мінімальний)" + }, + "hint": "Рівень контрасту: {ratio}, {level} {context}" + }, + "opacity": "Прозорість" + }, + "preview": { + "mono": "змісту", + "text": "Трохи більше {0} та {1}", + "button": "Кнопка", + "error": "Приклад помилки", + "content": "Зміст", + "header": "Попередній перегляд", + "link": "невеличке посилання", + "header_faint": "Це нормально", + "input": "Що нового?", + "checkbox": "Я переглянув умови використання", + "fine_print": "Прочитайте наш {0} аби нічого нового не дізнатись!", + "faint_link": "корисний підручник" + }, + "shadows": { + "components": { + "button": "Кнопка", + "input": "Поле вводу", + "panel": "Панель", + "panelHeader": "Заголовок панелі", + "avatarStatus": "Аватар користувача (в стрічці)", + "avatar": "Аватар користувача (профіль)", + "buttonPressedHover": "Кнопка (натиснута + наведений курсор)", + "buttonPressed": "Кнопка (натиснута)", + "buttonHover": "Кнопка (при наведенні)", + "popup": "Спливаючі вікна та підказки", + "topBar": "Верхня панель" + }, + "component": "Компонент", + "filter_hint": { + "inset_classic": "Тіні спрямовані всередину використовуватимуть {0}", + "spread_zero": "Тіні з поширенням > 0 відображатимуться так, ніби було встановлено нуль", + "avatar_inset": "Зауважте, що використання як вставних, так і невставних тіней на аватарах може привести до непередбачуваних результатів із прозорими аватарами.", + "drop_shadow_syntax": "{0} не підтримує параметр {1} та ключове слово {2}.", + "always_drop_shadow": "Увага! Ця тінь завжди використовує {0}, якщо підтримується браузером." + }, + "inset": "Всередину", + "blur": "Розмиття", + "shadow_id": "Тінь №{value}", + "override": "Перевизначити", + "_tab_label": "Тінь і підсвічування", + "hintV3": "Для тіней ви також можете використовувати позначення {0} для використання іншого кольорового слота.", + "spread": "Розмах" + }, + "fonts": { + "components": { + "input": "Поля вводу", + "interface": "Інтерфейс", + "postCode": "Моноширинний текст в дописі (форматований текст)", + "post": "Текст допису" + }, + "_tab_label": "Шрифти", + "size": "Розмір (в пікселях)", + "custom": "Нестандартний", + "weight": "Товщина", + "family": "Назва шрифту", + "help": "Виберіть шрифт для елементів інтерфейсу. Для \"нестандартного\" потрібно ввести точну назву шрифту, так як вона відображається в системі." + }, + "advanced_colors": { + "alert_warning": "Попередження", + "underlay": "Тло", + "inputs": "Поля входу", + "buttons": "Кнопки", + "borders": "Кордони", + "top_bar": "Верхня панель", + "panel_header": "Заголовок панелі", + "badge_notification": "Сповіщення", + "popover": "Підказки, меню, поповери", + "badge": "Тло значків", + "post": "Дописи/Дані користувачів", + "alert_neutral": "Нейтральний", + "alert_error": "Помилки", + "alert": "Фон сповіщень", + "_tab_label": "Додатково", + "selectedPost": "Вибраний допис", + "highlight": "Виділені елементи", + "poll": "Діаграма опитування", + "icons": "Іконки", + "faint_text": "Затемнений текст", + "chat": { + "border": "Кайма", + "outgoing": "Вихідні повідомлення", + "incoming": "Вхідні повідомлення" + }, + "toggled": "Переключено", + "disabled": "Вимкнено", + "selectedMenu": "Вибраний пункт меню", + "tabs": "Вкладки", + "pressed": "Натиснуто", + "wallpaper": "Шпалери" + }, + "common_colors": { + "rgbo": "Піктограми, акценти, значки", + "foreground_hint": "Перегляньте вкладку \"Додатково\" для більшого контролю", + "main": "Загальні кольори", + "_tab_label": "Загальні" + }, + "radii": { + "_tab_label": "Скруглення" + } + }, + "enable_web_push_notifications": "Увімкнути web push-сповіщення", + "notifications": "Сповіщення", + "fun": "Розваги", + "notification_setting_privacy": "Приватність", + "notification_setting_filters": "Фільтри", + "reset_avatar": "Скинути аватар", + "reset_profile_background": "Скинути обкладинку профілю", + "reset_avatar_confirm": "Ви дійсно хочете скинути аватар?", + "reset_profile_banner": "Скинули банер профілю", + "hide_follows_count_description": "Не показувати кількість підписників", + "reset_banner_confirm": "Ви дійсно хочете скинути банер?", + "reset_background_confirm": "Ви дійсно хочете скинути обкладинку?", + "subject_line_behavior": "Вигляд теми при відповіді", + "subject_input_always_show": "Завжди показувати поле для вводу теми", + "minimal_scopes_mode": "Мінімізувати набір варіантів осягу для допису", + "scope_copy": "Копіювати осяг при відповіді (завжди ввімкнено для особистих повідомлень)", + "search_user_to_mute": "Шукайте кого ви хочете заглушити", + "search_user_to_block": "Шукайте кого ви хочете заблокувати", + "autohide_floating_post_button": "Автоматично ховати кнопку \"Новий допис\" (в мобільній версії)", + "pause_on_unfocused": "Призупинити трансляцію, коли вкладка неактивна", + "hide_followers_count_description": "Не показувати кількість моїх підписників", + "notification_blocks": "Блокування користувача зупиняє всі сповіщення від нього, а також скасовує його відстеження.", + "notification_setting_hide_notification_contents": "Ховати відправника та вміст push-сповіщень", + "notification_setting_block_from_strangers": "Блокувати сповіщення від користувачів за якими ви не слідкуєте", + "type_domains_to_mute": "Пошук доменів для заглушення", + "nsfw_clickthrough": "Увімкнути приховування NSFW медіа", + "greentext": "Мемний текст", + "virtual_scrolling": "Оптимізувати оновлення стрічки", + "theme_help_v2_2": "Піктограми під деякими записами є показниками контрасту між фоном та текстом. Коли ви наведете на них курсор, ви отримаєте детальну інформацію. Пам'ятайте, якщо ви використовуєте прозорість, індикатори показують найгірший варіант.", + "theme_help_v2_1": "Ви також можете замінити кольори та видимість окремих компонентів, перемикаючи прапорці, використовуйте \"Очистити все\", щоб видалити всі заміни.", + "theme_help": "Використовувати шістнадцяткові коди кольору (#rrggbb) щоб редагувати тему.", + "no_blocks": "Блокування відсутні", + "subject_line_mastodon": "Як в mastodon: просто скопіювати", + "subject_line_email": "Як в email: \"re: тема\"", + "useStreamingApiWarning": "(Не рекомендується, експериментально, повідомлення можуть зникати)", + "useStreamingApi": "Отримувати повідомлення та сповіщення в режимі реального часу", + "streaming": "Ввімкнути автоматичне завантаження нових повідомлень при прокручуванні вгору", + "stop_gifs": "Відтворювати GIF анімації тільки при наведенні", + "post_status_content_type": "Тип вмісту допису", + "subject_line_noop": "Не копіювати", + "version": { + "frontend_version": "Версія фронтенду", + "backend_version": "Версія бекенду", + "title": "Версія" + }, + "hide_wallpaper": "Сховати шпалери екземпляру" + }, + "selectable_list": { + "select_all": "Вибрати все" + }, + "remote_user_resolver": { + "error": "Не знайдено.", + "searching_for": "Шукаю", + "remote_user_resolver": "Пошукова система для віддалених користувачів" + }, + "registration": { + "validations": { + "password_confirmation_match": "пароль та підтвердження паролю мають бути однаковими", + "password_confirmation_required": "не може бути порожнім", + "password_required": "не може бути порожнім", + "email_required": "не може бути порожнім", + "fullname_required": "не може бути порожнім", + "username_required": "не може бути порожнім" + }, + "bio_placeholder": "напр.\nНаш народ завжди прагне волі для себе і бажає її для інших народів. Він боровся і бореться за правду і справедливість. Ми хочемо жити у згоді і взаємному шануванні з усіми народами доброї волі. Такі самі права визнаємо за іншими народами, за які боремося для себе.", + "fullname_placeholder": "напр. Степан Бандера", + "username_placeholder": "напр. stepan", + "new_captcha": "Натисніть на зображення, щоб оновити код, якщо він нерозбірливий", + "token": "Ключ запрошення", + "registration": "Реєстрація", + "password_confirm": "Підтвердження паролю", + "fullname": "Відображене ім'я", + "email": "Ел. пошта", + "bio": "Про себе", + "captcha": "CAPTCHA" + }, + "who_to_follow": { + "who_to_follow": "На кого підписатися", + "more": "Більше" + }, + "tool_tip": { + "repeat": "Поширити", + "reply": "Відповісти", + "add_reaction": "Додати реакцію", + "user_settings": "Налаштування користувача", + "favorite": "Подобається", + "reject_follow_request": "Відхилити запит на підписку", + "accept_follow_request": "Прийняти запит на підписку", + "media_upload": "Завантажити медіа", + "bookmark": "Додати до закладок" + }, + "upload": { + "error": { + "base": "Збій при завантаженні.", + "file_too_big": "Файл завеликий [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]", + "default": "Спробуйте ще раз пізніше", + "message": "Помилка завантаження: {0}" + }, + "file_size_units": { + "TiB": "ТіБ", + "GiB": "ГіБ", + "MiB": "МіБ", + "KiB": "КіБ", + "B": "Б" + } + }, + "time": { + "weeks_short": "{0}тижд.", + "week_short": "{0}тижд.", + "years_short": "{0}р", + "year_short": "{0}р", + "years": "{0} роки", + "year": "{0} рік", + "weeks": "{0} тижнів", + "week": "{0} тиждень", + "second_short": "{0}с", + "second": "{0} секунда", + "now_short": "щойно", + "now": "щойно", + "months_short": "{0}міс.", + "month_short": "{0}міс.", + "months": "{0} місяці", + "month": "{0} місяць", + "minutes_short": "{0}хв", + "hours_short": "{0}год", + "hour_short": "{0}год", + "day_short": "{0}д", + "minute_short": "{0}хв", + "minutes": "{0} хвилини", + "minute": "{0} хвилина", + "in_past": "{0} тому", + "hours": "{0} години", + "hour": "{0} година", + "days_short": "{0}д", + "days": "{0} дні", + "day": "{0} день", + "seconds_short": "{0}с", + "seconds": "{0} секунди", + "in_future": "через {0}" + }, + "search": { + "no_results": "Немає результатів", + "hashtags": "Хештеги", + "people": "Люди", + "people_talking": "{count} людей говорять про це", + "person_talking": "{count} особа говорить про це" + }, + "user_card": { + "statuses": "Дописи", + "message": "Повідомлення", + "follow": "Підписатись", + "follow_unfollow": "Відписатись", + "follow_again": "Відправити запит знову?", + "follow_sent": "Запит відправлено!", + "blocked": "Заблоковано!", + "admin_menu": { + "activate_account": "Активувати обліковий запис", + "deactivate_account": "Деактивувати обліковий запис", + "delete_account": "Видалити обліковий запис", + "moderation": "Модерація", + "delete_user_confirmation": "Ви абсолютно впевнені? Цю дію неможливо буде скасовувати.", + "delete_user": "Видалити обліковий запис", + "strip_media": "Вилучити медіа з дописів користувача", + "force_nsfw": "Позначити всі дописи як NSFW", + "disable_any_subscription": "Взагалі заборонити підписку на користувача", + "disable_remote_subscription": "Заборонити підписуватись на користувачів з віддалених інстансів", + "sandbox": "Показувати дописи лише підписникам", + "force_unlisted": "Не показувати дописи в стрічці", + "revoke_moderator": "Позбавити прав модератора", + "grant_moderator": "Надати права модератора", + "revoke_admin": "Позбавити прав адміністратора", + "grant_admin": "Надати права адміністратора", + "quarantine": "Не розповсюджувати дописи на інших інстансах" + }, + "deny": "Відмовити", + "block": "Заблокувати", + "approve": "Схвалити", + "mention": "Згадати", + "unsubscribe": "Відписатись", + "subscribe": "Підписатись", + "report": "Поскаржитись", + "per_day": "на день", + "favorites": "Вподобання", + "media": "Медіа", + "show_repeats": "Показати поширення", + "hide_repeats": "Приховати поширення", + "its_you": "Це ти!", + "follows_you": "Підписаний на вас!", + "followers": "Підписники", + "followees": "Підписаний(-а)", + "follow_progress": "Запитую…", + "mute_progress": "Глушимо…", + "unmute_progress": "Знімаємо глушення…", + "unmute": "Зняти глушення", + "hidden": "Приховано", + "following": "Підписаний!", + "block_progress": "Блокуємо…", + "unblock_progress": "Розблоковуємо…", + "unblock": "Розблокувати", + "remote_follow": "Підписатись", + "muted": "Заглушений", + "mute": "Заглушити", + "roles": { + "moderator": "Модератор", + "admin": "Адміністратор" + } + }, + "status": { + "copy_link": "Скопіювати посилання на допис", + "status_unavailable": "Допис недоступний", + "replies_list": "Відповіді:", + "delete_confirm": "Ви дійсно хочете видалити цей допис?", + "delete": "Видалити допис", + "pin": "Закріпити в профілі", + "status_deleted": "Цей допис був видалений", + "favorites": "Вподобане", + "hide_content": "Сховати вміст", + "show_content": "Показати вміст", + "hide_full_subject": "Сховати всю тему", + "show_full_subject": "Показати всю тему", + "thread_muted_and_words": ", має слова:", + "mute_conversation": "Заглушити розмову", + "reply_to": "Відповідь", + "unbookmark": "Видалити із закладок", + "bookmark": "Додати до закладок", + "pinned": "Закріплено", + "unpin": "Відкріпити від профілю", + "repeats": "Поширення", + "nsfw": "Дратівливий вміст", + "thread_muted": "Нитка заглушена", + "unmute_conversation": "Припинити глушити розмову", + "external_source": "Зовнішнє джерело", + "expand": "Розгорнути" + }, + "timeline": { + "no_more_statuses": "Більше немає дописів", + "up_to_date": "Оновлено", + "reload": "Оновити", + "show_new": "Показати нові", + "load_older": "Завантажити давніші дописи", + "error": "Помилка завантаження стрічки: {0}", + "collapse": "Згорнути", + "conversation": "Розмова", + "no_statuses": "Ніяких статусів", + "repeated": "поширив(-ла)", + "no_retweet_hint": "Запис, позначено як \"тільки для підписників\" або \"особисте\" і тому не може бути поширений" + }, + "user_reporting": { + "submit": "Відправити", + "forward_to": "Переслати до {0}", + "forward_description": "Цей обліковий запис належить іншому інстансу. Відправити їм копію скарги?", + "additional_comments": "Додаткове пояснення", + "add_comment_description": "Скарга буде надіслана модераторам вашого інстансу. Нижче Ви можете додати пояснення чому ви вирішили поскаржитись на цей обліковий запис:", + "title": "Поскаржитись на {0}", + "generic_error": "Виникла помилка під час обробки вашого запиту." + }, + "user_profile": { + "profile_loading_error": "Вибачте, під час завантаження цього профілю виникла помилка.", + "profile_does_not_exist": "Вибачте, цей профіль більше не існує.", + "timeline_title": "Стрічка користувача" + } +} diff --git a/src/i18n/zh.json b/src/i18n/zh.json index 1fb0b548..b4185b30 100644 --- a/src/i18n/zh.json +++ b/src/i18n/zh.json @@ -11,10 +11,11 @@ "gopher": "Gopher", "media_proxy": "媒体代理", "scope_options": "可见范围设置", - "text_limit": "文字數量限制", + "text_limit": "文字数量限制", "title": "功能", "who_to_follow": "推荐关注", - "pleroma_chat_messages": "Pleroma 聊天" + "pleroma_chat_messages": "Pleroma 聊天", + "upload_limit": "上传限制" }, "finder": { "error_fetching_user": "获取用户时发生错误", @@ -24,8 +25,8 @@ "apply": "应用", "submit": "提交", "more": "更多", - "generic_error": "发生一个错误", - "optional": "可选项", + "generic_error": "发生了一个错误", + "optional": "可选", "show_more": "展开", "show_less": "收起", "cancel": "取消", @@ -34,7 +35,7 @@ "confirm": "确认", "verify": "验证", "dismiss": "忽略", - "peek": "窥探", + "peek": "预览", "close": "关闭", "retry": "重试", "error_retry": "请重试", @@ -95,28 +96,29 @@ }, "notifications": { "broken_favorite": "未知的状态,正在搜索中…", - "favorited_you": "收藏了你的状态", + "favorited_you": "喜欢了你的状态", "followed_you": "关注了你", "load_older": "加载更早的通知", "notifications": "通知", - "read": "阅读!", + "read": "已阅!", "repeated_you": "转发了你的状态", "no_more_notifications": "没有更多的通知", - "reacted_with": "和 {0} 互动过", - "migrated_to": "迁移到", - "follow_request": "想要关注你" + "reacted_with": "作出了 {0} 的反应", + "migrated_to": "迁移到了", + "follow_request": "想要关注你", + "error": "取得通知时发生错误:{0}" }, "polls": { - "add_poll": "增加问卷调查", + "add_poll": "增加投票", "add_option": "增加选项", "option": "选项", "votes": "投票", "vote": "投票", - "type": "问卷类型", - "single_choice": "单选项", - "multiple_choices": "多选项", - "expiry": "问卷的时间", - "expires_in": "投票于 {0} 内结束", + "type": "投票类型", + "single_choice": "单选", + "multiple_choices": "多选", + "expiry": "投票期限", + "expires_in": "投票于 {0} 后结束", "expired": "投票 {0} 前已结束", "not_enough_options": "投票的选项太少" }, @@ -124,7 +126,7 @@ "add_sticker": "添加贴纸" }, "interactions": { - "favs_repeats": "转发和收藏", + "favs_repeats": "转发和喜欢", "follows": "新的关注者", "load_older": "加载更早的互动", "moves": "用户迁移" @@ -141,10 +143,10 @@ "text/bbcode": "BBCode" }, "content_warning": "主题(可选)", - "default": "刚刚抵达洛杉矶", + "default": "刚刚抵达上海。", "direct_warning_to_all": "本条内容只有被提及的用户能够看到。", "direct_warning_to_first_only": "本条内容只有被在消息开始处提及的用户能够看到。", - "posting": "发送", + "posting": "发送中", "scope_notice": { "public": "本条内容可以被所有人看到", "private": "关注你的人才能看到本条内容", @@ -165,7 +167,7 @@ "registration": { "bio": "简介", "email": "电子邮箱", - "fullname": "全名", + "fullname": "显示名称", "password_confirm": "确认密码", "registration": "注册", "token": "邀请码", @@ -189,7 +191,7 @@ "settings": { "app_name": "App 名称", "security": "安全", - "enter_current_password_to_confirm": "输入你当前密码来确认你的身份", + "enter_current_password_to_confirm": "输入您当前的密码来确认您的身份", "mfa": { "otp": "OTP", "setup_otp": "设置 OTP", @@ -197,18 +199,18 @@ "confirm_and_enable": "确认并启用 OTP", "title": "双因素验证", "generate_new_recovery_codes": "生成新的恢复码", - "warning_of_generate_new_codes": "当你生成新的恢复码时,你的旧恢复码就失效了。", + "warning_of_generate_new_codes": "当您生成新的恢复码时,您旧的恢复码将会失效。", "recovery_codes": "恢复码。", "waiting_a_recovery_codes": "正在接收备份码…", - "recovery_codes_warning": "抄写这些号码,或者保存在安全的地方。这些号码不会再次显示。如果你无法访问你的 2FA app,也丢失了你的恢复码,你的账号就再也无法登录了。", + "recovery_codes_warning": "抄写这些号码,或者将其保存在安全的地方。这些号码不会再次显示。如果您无法访问您的 2FA app,也丢失了您的恢复码,您就再也无法登录您的账号了。", "authentication_methods": "身份验证方法", "scan": { "title": "扫一下", - "desc": "使用你的双因素验证 app,扫描这个二维码,或者输入这些文字密钥:", + "desc": "使用您的双因素验证 app,扫描这个二维码,或者输入这些文字密钥:", "secret_code": "密钥" }, "verify": { - "desc": "要启用双因素验证,请把你的双因素验证 app 里的数字输入:" + "desc": "要启用双因素验证,请输入您的双因素验证 app 里的数字:" } }, "attachmentRadius": "附件", @@ -218,22 +220,22 @@ "avatarRadius": "头像", "background": "背景", "bio": "简介", - "block_export": "拉黑名单导出", - "block_export_button": "导出你的拉黑名单到一个 csv 文件", - "block_import": "拉黑名单导入", - "block_import_error": "导入拉黑名单出错", - "blocks_imported": "拉黑名单导入成功!需要一点时间来处理。", - "blocks_tab": "块", + "block_export": "屏蔽名单导出", + "block_export_button": "导出你的屏蔽名单到一个 csv 文件", + "block_import": "屏蔽名单导入", + "block_import_error": "导入屏蔽名单出错", + "blocks_imported": "屏蔽名单导入成功!需要一点时间来处理。", + "blocks_tab": "屏蔽", "btnRadius": "按钮", "cBlue": "蓝色(回复,关注)", "cGreen": "绿色(转发)", - "cOrange": "橙色(收藏)", + "cOrange": "橙色(喜欢)", "cRed": "红色(取消)", "change_password": "修改密码", "change_password_error": "修改密码的时候出了点问题。", "changed_password": "成功修改了密码!", "collapse_subject": "折叠带主题的内容", - "composing": "正在书写", + "composing": "写作", "confirm_new_password": "确认新密码", "current_avatar": "当前头像", "current_password": "当前密码", @@ -243,8 +245,8 @@ "delete_account": "删除账户", "delete_account_description": "永久删除你的帐号和所有数据。", "delete_account_error": "删除账户时发生错误,如果一直删除不了,请联系实例管理员。", - "delete_account_instructions": "在下面输入你的密码来确认删除账户", - "avatar_size_instruction": "推荐的头像图片最小的尺寸是 150x150 像素。", + "delete_account_instructions": "在下面输入您的密码来确认删除账户。", + "avatar_size_instruction": "推荐的头像图片最小尺寸为 150x150 像素。", "export_theme": "导出预置主题", "filtering": "过滤器", "filtering_explanation": "所有包含以下词汇的内容都会被隐藏,一行一个", @@ -258,11 +260,11 @@ "hide_attachments_in_convo": "在对话中隐藏附件", "hide_attachments_in_tl": "在时间线上隐藏附件", "hide_muted_posts": "不显示被隐藏的用户的帖子", - "max_thumbnails": "最多再每个帖子所能显示的缩略图数量", - "hide_isp": "隐藏指定实例的面板H", + "max_thumbnails": "每个帖子最多能显示的缩略图数量", + "hide_isp": "隐藏实例独有的面板", "preload_images": "预载图片", - "use_one_click_nsfw": "点击一次以打开工作场所不适宜的附件", - "hide_post_stats": "隐藏推文相关的统计数据(例如:收藏的次数)", + "use_one_click_nsfw": "点击一次以打开工作场所不适宜(NSFW)的附件", + "hide_post_stats": "隐藏帖子的统计数据(例如:喜欢的次数)", "hide_user_stats": "隐藏用户的统计数据(例如:关注者的数量)", "hide_filtered_statuses": "隐藏过滤的状态", "import_blocks_from_a_csv_file": "从 csv 文件中导入拉黑名单", @@ -277,7 +279,7 @@ "invalid_theme_imported": "您所选择的主题文件不被 Pleroma 支持,因此主题未被修改。", "limited_availability": "在您的浏览器中无法使用", "links": "链接", - "lock_account_description": "你需要手动审核关注请求", + "lock_account_description": "您需要手动审核关注请求", "loop_video": "循环视频", "loop_video_silent_only": "只循环没有声音的视频(例如:Mastodon 里的“GIF”)", "mutes_tab": "隐藏", @@ -292,13 +294,13 @@ "notification_visibility_mentions": "提及", "notification_visibility_repeats": "转发", "no_rich_text_description": "不显示富文本格式", - "no_blocks": "没有拉黑的", + "no_blocks": "没有屏蔽", "no_mutes": "没有隐藏", "hide_follows_description": "不要显示我所关注的人", "hide_followers_description": "不要显示关注我的人", - "show_admin_badge": "显示管理徽章", - "show_moderator_badge": "显示版主徽章", - "nsfw_clickthrough": "将不和谐附件隐藏,点击才能打开", + "show_admin_badge": "在我的个人资料中显示管理员徽章", + "show_moderator_badge": "在我的个人资料中显示监察员徽章", + "nsfw_clickthrough": "将不和谐附件和链接预览隐藏,点击才会显示", "oauth_tokens": "OAuth令牌", "token": "令牌", "refresh_token": "刷新令牌", @@ -307,7 +309,7 @@ "panelRadius": "面板", "pause_on_unfocused": "在离开页面时暂停时间线推送", "presets": "预置", - "profile_background": "个人资料背景图", + "profile_background": "个人背景图", "profile_banner": "横幅图片", "profile_tab": "个人资料", "radii_help": "设置界面边缘的圆角 (单位:像素)", @@ -321,24 +323,24 @@ "search_user_to_block": "搜索你想屏蔽的用户", "search_user_to_mute": "搜索你想要隐藏的用户", "security_tab": "安全", - "scope_copy": "回复时的复制范围(私信是总是复制的)", - "minimal_scopes_mode": "最小发文范围", + "scope_copy": "回复时复制可见范围(私信中永远会复制)", + "minimal_scopes_mode": "使发文可见范围的选项最少化", "set_new_avatar": "设置新头像", "set_new_profile_background": "设置新的个人资料背景", "set_new_profile_banner": "设置新的横幅图片", "settings": "设置", "subject_input_always_show": "总是显示主题框", "subject_line_behavior": "回复时复制主题", - "subject_line_email": "比如电邮: \"re: 主题\"", - "subject_line_mastodon": "比如 mastodon: copy as is", + "subject_line_email": "类似电子邮件: \"re: 主题\"", + "subject_line_mastodon": "类似 mastodon: 与原主题相同", "subject_line_noop": "不要复制", "post_status_content_type": "发文状态内容类型", "stop_gifs": "鼠标悬停时播放GIF", - "streaming": "开启滚动到顶部时的自动推送", + "streaming": "滚动到顶部时自动推送新内容", "text": "文本", "theme": "主题", "theme_help": "使用十六进制代码(#rrggbb)来设置主题颜色。", - "theme_help_v2_1": "你也可以通过切换复选框来覆盖某些组件的颜色和透明。使用“清除所有”来清楚所有覆盖设置。", + "theme_help_v2_1": "您也可以通过选中复选框来覆盖某些组件的颜色和透明度。使用“清除所有”按钮来清除所有覆盖设置。", "theme_help_v2_2": "某些条目下的图标是背景或文本对比指示器,鼠标悬停可以获取详细信息。请记住,使用透明度来显示最差的情况。", "tooltipRadius": "提醒", "upload_a_photo": "上传照片", @@ -349,7 +351,7 @@ }, "notifications": "通知", "notification_mutes": "要停止收到某个指定的用户的通知,请使用隐藏功能。", - "notification_blocks": "拉黑一个用户会停掉所有他的通知,等同于取消关注。", + "notification_blocks": "屏蔽一个用户会停止接收来自该用户的所有通知,并且会取消对该用户的关注。", "enable_web_push_notifications": "启用 web 推送通知", "style": { "switcher": { @@ -364,7 +366,7 @@ "clear_opacity": "清除透明度", "load_theme": "加载主题", "help": { - "upgraded_from_v2": "PleromaFE 已升级,主题会和你记忆中的不太一样。", + "upgraded_from_v2": "PleromaFE 已升级,主题会与您记忆中的不太一样。", "older_version_imported": "您导入的文件来自旧版本的 FE。", "future_version_imported": "您导入的文件来自更高版本的 FE。", "v2_imported": "您导入的文件是旧版 FE 的。我们尽可能保持兼容性,但还是可能出现不一致的情况。", @@ -400,7 +402,7 @@ "_tab_label": "常规", "main": "常用颜色", "foreground_hint": "点击”高级“ 标签进行细致的控制", - "rgbo": "图标,口音,徽章" + "rgbo": "图标,强调,徽章" }, "advanced_colors": { "_tab_label": "高级", @@ -420,7 +422,7 @@ "incoming": "收到的" }, "disabled": "禁用的", - "pressed": "按下的", + "pressed": "压下的", "highlight": "强调元素", "selectedMenu": "选中的菜单项", "selectedPost": "选中的发布内容", @@ -431,7 +433,9 @@ "alert_neutral": "中性", "alert_warning": "警告", "tabs": "标签页", - "underlay": "底衬" + "underlay": "底衬", + "toggled": "按下的", + "wallpaper": "壁纸" }, "radii": { "_tab_label": "圆角" @@ -443,14 +447,14 @@ "shadow_id": "阴影 #{value}", "blur": "模糊", "spread": "扩散", - "inset": "插入内部", + "inset": "内阴影", "hint": "对于阴影你还可以使用 --variable 作为颜色值来使用 CSS3 变量。请注意,这种情况下,透明设置将不起作用。", "filter_hint": { "always_drop_shadow": "警告,此阴影设置会总是使用 {0} ,如果浏览器支持的话。", "drop_shadow_syntax": "{0} 不支持参数 {1} 和关键词 {2} 。", "avatar_inset": "请注意组合两个内部和非内部的阴影到头像上,在透明头像上可能会有意料之外的效果。", "spread_zero": "阴影的扩散 > 0 会同设置成零一样", - "inset_classic": "插入内部的阴影会使用 {0}" + "inset_classic": "内阴影会使用 {0}" }, "components": { "panel": "面板", @@ -458,17 +462,18 @@ "topBar": "顶栏", "avatar": "用户头像(在个人资料栏)", "avatarStatus": "用户头像(在帖子显示栏)", - "popup": "弹窗和工具提示", + "popup": "弹窗与工具提示", "button": "按钮", "buttonHover": "按钮(悬停)", - "buttonPressed": "按钮(按下)", - "buttonPressedHover": "按钮(按下和悬停)", + "buttonPressed": "按钮(压下)", + "buttonPressedHover": "按钮(压下和悬停)", "input": "输入框" - } + }, + "hintV3": "对于阴影,您还可以使用 {0} 表示法来使用其它颜色插槽。" }, "fonts": { "_tab_label": "字体", - "help": "给用户界面的元素选择字体。选择 “自选”的你必须输入确切的字体名称。", + "help": "为用户界面的元素选择字体。若选择 “自选”,您必须输入与系统显示完全一致的字体名称。", "components": { "interface": "界面", "input": "输入框", @@ -477,22 +482,22 @@ }, "family": "字体名称", "size": "大小 (in px)", - "weight": "字重 (粗体))", + "weight": "字重 (粗体)", "custom": "自选" }, "preview": { "header": "预览", "content": "内容", - "error": "例子错误", + "error": "错误示例", "button": "按钮", "text": "有堆 {0} 和 {1}", - "mono": "内容", - "input": "刚刚抵达上海", - "faint_link": "帮助菜单", + "mono": "monospace 内容", + "input": "刚刚抵达上海。", + "faint_link": "帮助手册", "fine_print": "阅读我们的 {0} ,然而什么也学不到!", "header_faint": "这很正常", - "checkbox": "我已经浏览了 TOC", - "link": "一个很棒的摇滚链接" + "checkbox": "我已经浏览了条款及细则", + "link": "一个棒棒的小小链接" } }, "version": { @@ -503,7 +508,7 @@ "notification_setting_filters": "过滤器", "domain_mutes": "域名", "changed_email": "邮箱修改成功!", - "change_email_error": "修改你的电子邮箱时发生错误", + "change_email_error": "修改您的电子邮箱时发生错误。", "change_email": "修改电子邮箱", "allow_following_move": "正在关注的账号迁移时自动重新关注", "notification_setting_privacy_option": "在通知推送中隐藏发送者和内容", @@ -516,13 +521,13 @@ "notification_setting_hide_notification_contents": "隐藏推送通知中的发送者与内容信息", "notification_setting_block_from_strangers": "屏蔽来自你没有关注的用户的通知", "type_domains_to_mute": "搜索需要隐藏的域名", - "useStreamingApi": "实时接收发布以及通知", + "useStreamingApi": "实时接收帖子和通知", "user_mutes": "用户", - "reset_background_confirm": "您确定要重置个人资料背景图吗?", + "reset_background_confirm": "您确定要重置背景图吗?", "reset_banner_confirm": "您确定要重置横幅图片吗?", "reset_avatar_confirm": "您确定要重置头像吗?", "reset_profile_banner": "重置横幅图片", - "reset_profile_background": "重置个人资料背景图", + "reset_profile_background": "重置个人背景图", "reset_avatar": "重置头像", "hide_followers_count_description": "不显示关注者数量", "profile_fields": { @@ -537,9 +542,17 @@ "mutes_and_blocks": "隐藏与屏蔽", "bot": "这是一个机器人账号", "fun": "趣味", - "useStreamingApiWarning": "(不推荐使用,试验性,已知会跳过一些消息)", + "useStreamingApiWarning": "(不推荐使用,试验性,已知会跳过一些帖子)", "chatMessageRadius": "聊天消息", - "greentext": "Meme 箭头" + "greentext": "Meme 箭头", + "virtual_scrolling": "优化时间线渲染", + "import_mutes_from_a_csv_file": "从 csv 文件导入隐藏名单", + "mutes_imported": "隐藏名单导入成功!处理它们将需要一段时间。", + "mute_import_error": "导入隐藏名单出错", + "mute_import": "隐藏名单导入", + "mute_export_button": "导出你的隐藏名单到一个 csv 文件", + "mute_export": "隐藏名单导出", + "hide_wallpaper": "隐藏实例壁纸" }, "time": { "day": "{0} 天", @@ -580,16 +593,17 @@ "conversation": "对话", "error_fetching": "获取更新时发生错误", "load_older": "加载更早的状态", - "no_retweet_hint": "这条内容仅关注者可见,或者是私信,因此不能转发。", - "repeated": "已转发", + "no_retweet_hint": "这条内容仅关注者可见,或者是私信,因此不能转发", + "repeated": "转发了", "show_new": "显示新内容", "up_to_date": "已是最新", "no_more_statuses": "没有更多的状态", "no_statuses": "没有状态更新", - "reload": "重新载入" + "reload": "重新载入", + "error": "取得时间轴时发生错误:{0}" }, "status": { - "favorites": "收藏", + "favorites": "喜欢", "repeats": "转发", "delete": "删除状态", "pin": "在个人资料置顶", @@ -609,24 +623,28 @@ "status_unavailable": "状态不可取得", "unbookmark": "取消书签", "bookmark": "书签", - "thread_muted_and_words": ",含有过滤词:" + "thread_muted_and_words": ",含有过滤词:", + "status_deleted": "该状态已被删除", + "nsfw": "NSFW", + "external_source": "外部来源", + "expand": "展开" }, "user_card": { - "approve": "允许", + "approve": "核准", "block": "屏蔽", "blocked": "已屏蔽!", "deny": "拒绝", - "favorites": "收藏", + "favorites": "喜欢", "follow": "关注", "follow_sent": "请求已发送!", - "follow_progress": "请求中", + "follow_progress": "请求中…", "follow_again": "再次发送请求?", "follow_unfollow": "取消关注", "followees": "正在关注", "followers": "关注者", "following": "正在关注!", "follows_you": "关注了你!", - "its_you": "就是你!!", + "its_you": "就是你!", "media": "媒体", "mute": "隐藏", "muted": "已隐藏", @@ -636,18 +654,18 @@ "statuses": "状态", "subscribe": "订阅", "unsubscribe": "退订", - "unblock": "取消拉黑", - "unblock_progress": "取消拉黑中…", - "block_progress": "拉黑中…", + "unblock": "取消屏蔽", + "unblock_progress": "正在取消屏蔽…", + "block_progress": "正在屏蔽…", "unmute": "取消隐藏", "unmute_progress": "取消隐藏中…", "mute_progress": "隐藏中…", "admin_menu": { - "moderation": "权限", + "moderation": "仲裁", "grant_admin": "赋予管理权限", "revoke_admin": "撤销管理权限", - "grant_moderator": "赋予版主权限", - "revoke_moderator": "撤销版主权限", + "grant_moderator": "赋予监察员权限", + "revoke_moderator": "撤销监察员权限", "activate_account": "激活账号", "deactivate_account": "关闭账号", "delete_account": "删除账号", @@ -659,7 +677,7 @@ "disable_any_subscription": "完全禁止关注用户", "quarantine": "从联合实例中禁止用户帖子", "delete_user": "删除用户", - "delete_user_confirmation": "你确认吗?此操作无法撤销。" + "delete_user_confirmation": "你确定吗?此操作无法撤销。" }, "hidden": "已隐藏", "show_repeats": "显示转发", @@ -674,22 +692,22 @@ }, "user_reporting": { "title": "报告 {0}", - "add_comment_description": "此报告会发送给你的实例管理员。你可以在下面提供更多详细信息解释报告的缘由:", + "add_comment_description": "此报告会发送给您的实例监察员。您可以在下面提供更多详细信息解释报告的缘由:", "additional_comments": "其它信息", - "forward_description": "这个账号是从另外一个服务器。同时发送一个副本到那里?", + "forward_description": "这个账号来自另一个服务器。是否同时发送一份报告副本到那里?", "forward_to": "转发 {0}", "submit": "提交", - "generic_error": "当处理你的请求时,发生了一个错误。" + "generic_error": "当处理您的请求时,发生了一个错误。" }, "who_to_follow": { "more": "更多", "who_to_follow": "推荐关注" }, "tool_tip": { - "media_upload": "上传多媒体", + "media_upload": "上传媒体", "repeat": "转发", "reply": "回复", - "favorite": "收藏", + "favorite": "喜欢", "user_settings": "用户设置", "reject_follow_request": "拒绝关注请求", "add_reaction": "添加互动", @@ -700,7 +718,8 @@ "error": { "base": "上传不成功。", "file_too_big": "文件太大了 [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]", - "default": "迟些再试" + "default": "迟些再试", + "message": "上传错误:{0}" }, "file_size_units": { "B": "B", @@ -720,12 +739,12 @@ "password_reset": { "forgot_password": "忘记密码了?", "password_reset": "重置密码", - "instruction": "输入你的电邮地址或者用户名,我们将发送一个链接到你的邮箱,用于重置密码。", - "placeholder": "你的电邮地址或者用户名", - "check_email": "检查你的邮箱,会有一个链接用于重置密码。", + "instruction": "输入您的电邮地址或者用户名,我们将发送一个链接到您的邮箱,用于重置密码。", + "placeholder": "您的电邮地址或者用户名", + "check_email": "检查您的邮箱,会有一个链接用于重置密码。", "return_home": "回到首页", - "too_many_requests": "你触发了尝试的限制,请稍后再试。", - "password_reset_disabled": "密码重置已经被禁用。请联系你的实例管理员。", + "too_many_requests": "您达到了尝试次数的上限,请稍后再试。", + "password_reset_disabled": "密码重置已被禁用。请联系您的实例管理员。", "password_reset_required_but_mailer_is_disabled": "您必须重置密码,但是密码重置被禁用了。请联系您所在实例的管理员。", "password_reset_required": "您必须重置密码才能登陆。" }, @@ -736,7 +755,7 @@ }, "emoji": { "keep_open": "选择器保持打开", - "stickers": "贴图", + "stickers": "贴纸", "unicode": "Unicode 表情符号", "custom": "自定义表情符号", "add_emoji": "插入表情符号", @@ -748,22 +767,22 @@ "about": { "mrf": { "simple": { - "quarantine_desc": "本实例只会把公开状态发送非下列实例:", + "quarantine_desc": "本实例向以下实例仅发送公开的帖子:", "quarantine": "隔离", "reject_desc": "本实例不会接收来自下列实例的消息:", "reject": "拒绝", "accept_desc": "本实例只接收来自下列实例的消息:", - "simple_policies": "站规", + "simple_policies": "对于特定实例的策略", "accept": "接受", "media_removal": "移除媒体", - "media_nsfw_desc": "本实例将来自以下实例的媒体强制设置为敏感内容:", + "media_nsfw_desc": "本实例将来自以下实例的媒体内容强制设置为敏感内容:", "media_nsfw": "强制设置媒体为敏感内容", - "media_removal_desc": "本实例移除了来自以下实例的媒体内容:", - "ftl_removal_desc": "该实例在从“全部已知网络”时间线上移除了:", + "media_removal_desc": "本实例移除来自以下实例的媒体内容:", + "ftl_removal_desc": "该实例在从“全部已知网络”时间线上移除了下列实例:", "ftl_removal": "从“全部已知网络”时间线上移除" }, "mrf_policies_desc": "MRF 策略会影响本实例的互通行为。以下策略已启用:", - "mrf_policies": "已启动 MRF 策略", + "mrf_policies": "已启用的 MRF 策略", "keyword": { "ftl_removal": "从“全部已知网络”时间线上移除", "keyword_policies": "关键词策略", @@ -771,7 +790,7 @@ "replace": "替换", "reject": "拒绝" }, - "federation": "联邦" + "federation": "联邦互通" }, "staff": "管理人员" }, diff --git a/src/i18n/zh_Hant.json b/src/i18n/zh_Hant.json index 79a992fc..a8d0dc3c 100644 --- a/src/i18n/zh_Hant.json +++ b/src/i18n/zh_Hant.json @@ -35,7 +35,8 @@ "follow_request": "想要關注你", "followed_you": "關注了你", "favorited_you": "喜歡了你的發文", - "broken_favorite": "未知的狀態,正在搜索中…" + "broken_favorite": "未知的狀態,正在搜索中…", + "error": "獲取通知錯誤:{0}" }, "nav": { "chats": "聊天", @@ -121,7 +122,8 @@ "media_proxy": "媒體代理", "pleroma_chat_messages": "Pleroma 聊天", "chat": "聊天", - "gopher": "Gopher" + "gopher": "Gopher", + "upload_limit": "上傳限制" }, "exporter": { "processing": "正在處理,稍後會提示您下載文件", @@ -351,7 +353,7 @@ "reset_avatar": "重置頭像", "discoverable": "允許通過搜索檢索等服務找到此賬號", "delete_account_error": "刪除賬戶時發生錯誤,如果一直刪除不了,請聯繫實例管理員。", - "composing": "正在書寫", + "composing": "寫作設置", "chatMessageRadius": "聊天訊息", "mfa": { "confirm_and_enable": "確認並啟用OTP", @@ -524,7 +526,8 @@ "mute_import": "靜音導入", "mute_import_error": "導入靜音時出錯", "mute_export_button": "將靜音導出到csv文件", - "mute_export": "靜音導出" + "mute_export": "靜音導出", + "hide_wallpaper": "隱藏實例桌布" }, "chats": { "more": "更多", @@ -680,7 +683,7 @@ "fullname": "顯示名稱", "bio_placeholder": "例如:\n你好,我是玲音。\n我是一個住在日本郊區的動畫少女。你可能在 Wired 見過我。", "fullname_placeholder": "例如:岩倉玲音", - "username_placeholder": "例如:玲音", + "username_placeholder": "例如:lain", "new_captcha": "點擊圖片獲取新的驗證碼", "captcha": "CAPTCHA", "token": "邀請碼", diff --git a/src/main.js b/src/main.js index 0a898022..90ee2887 100644 --- a/src/main.js +++ b/src/main.js @@ -33,6 +33,8 @@ import VueClickOutside from 'v-click-outside' import PortalVue from 'portal-vue' import VBodyScrollLock from './directives/body_scroll_lock' +import { FontAwesomeIcon, FontAwesomeLayers } from '@fortawesome/vue-fontawesome' + import afterStoreSetup from './boot/after_store.js' const currentLocale = (window.navigator.language || 'en').split('-')[0] @@ -45,6 +47,9 @@ Vue.use(VueClickOutside) Vue.use(PortalVue) Vue.use(VBodyScrollLock) +Vue.component('FAIcon', FontAwesomeIcon) +Vue.component('FALayers', FontAwesomeLayers) + const i18n = new VueI18n({ // By default, use the browser locale, we will update it if neccessary locale: 'en', diff --git a/src/modules/api.js b/src/modules/api.js index 0a354c3f..08485a30 100644 --- a/src/modules/api.js +++ b/src/modules/api.js @@ -75,12 +75,18 @@ const api = { } else if (message.event === 'delete') { dispatch('deleteStatusById', message.id) } else if (message.event === 'pleroma:chat_update') { - dispatch('addChatMessages', { - chatId: message.chatUpdate.id, - messages: [message.chatUpdate.lastMessage] - }) - dispatch('updateChat', { chat: message.chatUpdate }) - maybeShowChatNotification(store, message.chatUpdate) + // The setTimeout wrapper is a temporary band-aid to avoid duplicates for the user's own messages when doing optimistic sending. + // The cause of the duplicates is the WS event arriving earlier than the HTTP response. + // This setTimeout wrapper can be removed once the commit `8e41baff` is in the stable Pleroma release. + // (`8e41baff` adds the idempotency key to the chat message entity, which PleromaFE uses when it's available, and it makes this artificial delay unnecessary). + setTimeout(() => { + dispatch('addChatMessages', { + chatId: message.chatUpdate.id, + messages: [message.chatUpdate.lastMessage] + }) + dispatch('updateChat', { chat: message.chatUpdate }) + maybeShowChatNotification(store, message.chatUpdate) + }, 100) } } ) diff --git a/src/modules/chats.js b/src/modules/chats.js index 21e30933..0a373d88 100644 --- a/src/modules/chats.js +++ b/src/modules/chats.js @@ -16,7 +16,8 @@ const defaultState = { openedChats: {}, openedChatMessageServices: {}, fetcher: undefined, - currentChatId: null + currentChatId: null, + lastReadMessageId: null } const getChatById = (state, id) => { @@ -92,9 +93,14 @@ const chats = { commit('setCurrentChatFetcher', { fetcher: undefined }) }, readChat ({ rootState, commit, dispatch }, { id, lastReadId }) { + const isNewMessage = rootState.chats.lastReadMessageId !== lastReadId + dispatch('resetChatNewMessageCount') - commit('readChat', { id }) - rootState.api.backendInteractor.readChat({ id, lastReadId }) + commit('readChat', { id, lastReadId }) + + if (isNewMessage) { + rootState.api.backendInteractor.readChat({ id, lastReadId }) + } }, deleteChatMessage ({ rootState, commit }, value) { rootState.api.backendInteractor.deleteChatMessage(value) @@ -106,6 +112,9 @@ const chats = { }, clearOpenedChats ({ rootState, commit, dispatch, rootGetters }) { commit('clearOpenedChats', { commit }) + }, + handleMessageError ({ commit }, value) { + commit('handleMessageError', { commit, ...value }) } }, mutations: { @@ -208,11 +217,16 @@ const chats = { } } }, - readChat (state, { id }) { + readChat (state, { id, lastReadId }) { + state.lastReadMessageId = lastReadId const chat = getChatById(state, id) if (chat) { chat.unread = 0 } + }, + handleMessageError (state, { chatId, fakeId, isRetry }) { + const chatMessageService = state.openedChatMessageServices[chatId] + chatService.handleMessageError(chatMessageService, fakeId, isRetry) } } } diff --git a/src/modules/config.js b/src/modules/config.js index cd7c8670..444808cf 100644 --- a/src/modules/config.js +++ b/src/modules/config.js @@ -20,6 +20,7 @@ export const defaultState = { customTheme: undefined, customThemeSource: undefined, hideISP: false, + hideInstanceWallpaper: false, // bad name: actually hides posts of muted USERS hideMutedPosts: undefined, // instance default collapseMessageWithSubject: undefined, // instance default diff --git a/src/modules/instance.js b/src/modules/instance.js index b3cbffc6..411b1caa 100644 --- a/src/modules/instance.js +++ b/src/modules/instance.js @@ -27,9 +27,10 @@ const defaultState = { hideSitename: false, hideUserStats: false, loginMethod: 'password', - logo: '/static/logo.png', + logo: '/static/logo.svg', logoMargin: '.2em', logoMask: true, + logoLeft: false, minimalScopesMode: false, nsfwCensorImage: undefined, postContentType: 'text/plain', @@ -126,7 +127,7 @@ const instance = { imageUrl: false, replacement: values[key] } - }).sort((a, b) => a.displayText - b.displayText) + }).sort((a, b) => a.name > b.name ? 1 : -1) commit('setInstanceOption', { name: 'emoji', value: emoji }) } else { throw (res) @@ -153,7 +154,7 @@ const instance = { } // Technically could use tags but those are kinda useless right now, // should have been "pack" field, that would be more useful - }).sort((a, b) => a.displayText.toLowerCase() > b.displayText.toLowerCase() ? 1 : 0) + }).sort((a, b) => a.displayText.toLowerCase() > b.displayText.toLowerCase() ? 1 : -1) commit('setInstanceOption', { name: 'customEmoji', value: emoji }) } else { throw (res) diff --git a/src/modules/reports.js b/src/modules/reports.js index 904022f1..fea83e5f 100644 --- a/src/modules/reports.js +++ b/src/modules/reports.js @@ -4,12 +4,14 @@ const reports = { state: { userId: null, statuses: [], + preTickedIds: [], modalActivated: false }, mutations: { - openUserReportingModal (state, { userId, statuses }) { + openUserReportingModal (state, { userId, statuses, preTickedIds }) { state.userId = userId state.statuses = statuses + state.preTickedIds = preTickedIds state.modalActivated = true }, closeUserReportingModal (state) { @@ -17,9 +19,15 @@ const reports = { } }, actions: { - openUserReportingModal ({ rootState, commit }, userId) { - const statuses = filter(rootState.statuses.allStatuses, status => status.user.id === userId) - commit('openUserReportingModal', { userId, statuses }) + openUserReportingModal ({ rootState, commit }, { userId, statusIds = [] }) { + const preTickedStatuses = statusIds.map(id => rootState.statuses.allStatusesObject[id]) + const preTickedIds = statusIds + const statuses = preTickedStatuses.concat( + filter(rootState.statuses.allStatuses, + status => status.user.id === userId && !preTickedIds.includes(status.id) + ) + ) + commit('openUserReportingModal', { userId, statuses, preTickedIds }) }, closeUserReportingModal ({ commit }) { commit('closeUserReportingModal') diff --git a/src/modules/statuses.js b/src/modules/statuses.js index e673141d..33c68c57 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -39,8 +39,7 @@ const emptyNotifications = () => ({ minId: Number.POSITIVE_INFINITY, data: [], idStore: {}, - loading: false, - error: false + loading: false }) export const defaultState = () => ({ @@ -50,8 +49,6 @@ export const defaultState = () => ({ maxId: 0, notifications: emptyNotifications(), favorites: new Set(), - error: false, - errorData: null, timelines: { mentions: emptyTl(), public: emptyTl(), @@ -462,18 +459,9 @@ export const mutations = { const newStatus = state.allStatusesObject[id] newStatus.nsfw = nsfw }, - setError (state, { value }) { - state.error = value - }, - setErrorData (state, { value }) { - state.errorData = value - }, setNotificationsLoading (state, { value }) { state.notifications.loading = value }, - setNotificationsError (state, { value }) { - state.notifications.error = value - }, setNotificationsSilence (state, { value }) { state.notifications.desktopNotificationSilence = value }, @@ -588,18 +576,9 @@ const statuses = { } commit('addNewNotifications', { dispatch, notifications, older, rootGetters, newNotificationSideEffects }) }, - setError ({ rootState, commit }, { value }) { - commit('setError', { value }) - }, - setErrorData ({ rootState, commit }, { value }) { - commit('setErrorData', { value }) - }, setNotificationsLoading ({ rootState, commit }, { value }) { commit('setNotificationsLoading', { value }) }, - setNotificationsError ({ rootState, commit }, { value }) { - commit('setNotificationsError', { value }) - }, setNotificationsSilence ({ rootState, commit }, { value }) { commit('setNotificationsSilence', { value }) }, diff --git a/src/modules/users.js b/src/modules/users.js index 9245db5c..655db4c7 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -137,11 +137,11 @@ export const mutations = { }, saveFriendIds (state, { id, friendIds }) { const user = state.usersObject[id] - user.friendIds = uniq(concat(user.friendIds, friendIds)) + user.friendIds = uniq(concat(user.friendIds || [], friendIds)) }, saveFollowerIds (state, { id, followerIds }) { const user = state.usersObject[id] - user.followerIds = uniq(concat(user.followerIds, followerIds)) + user.followerIds = uniq(concat(user.followerIds || [], followerIds)) }, // Because frontend doesn't have a reason to keep these stuff in memory // outside of viewing someones user profile. @@ -202,7 +202,9 @@ export const mutations = { }, setPinnedToUser (state, status) { const user = state.usersObject[status.user.id] + user.pinnedStatusIds = user.pinnedStatusIds || [] const index = user.pinnedStatusIds.indexOf(status.id) + if (status.pinned && index === -1) { user.pinnedStatusIds.push(status.id) } else if (!status.pinned && index !== -1) { diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 1a3495d4..f4483149 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -129,7 +129,11 @@ const promisedRequest = ({ method, url, params, payload, credentials, headers = return reject(new StatusCodeError(response.status, json, { url, options }, response)) } return resolve(json) - })) + }) + .catch((error) => { + return reject(new StatusCodeError(response.status, error, { url, options }, response)) + }) + ) }) } @@ -158,7 +162,12 @@ const updateProfileImages = ({ credentials, avatar = null, banner = null, backgr body: form }) .then((data) => data.json()) - .then((data) => parseUser(data)) + .then((data) => { + if (data.error) { + throw new Error(data.error) + } + return parseUser(data) + }) } const updateProfile = ({ credentials, params }) => { @@ -556,7 +565,7 @@ const fetchTimeline = ({ }) .then((data) => data.json()) .then((data) => { - if (!data.error) { + if (!data.errors) { return { data: data.map(isNotifications ? parseNotification : parseStatus), pagination } } else { data.status = status @@ -1210,7 +1219,7 @@ const chatMessages = ({ id, credentials, maxId, sinceId, limit = 20 }) => { }) } -const sendChatMessage = ({ id, content, mediaId = null, credentials }) => { +const sendChatMessage = ({ id, content, mediaId = null, idempotencyKey, credentials }) => { const payload = { 'content': content } @@ -1219,11 +1228,18 @@ const sendChatMessage = ({ id, content, mediaId = null, credentials }) => { payload['media_id'] = mediaId } + const headers = {} + + if (idempotencyKey) { + headers['idempotency-key'] = idempotencyKey + } + return promisedRequest({ url: PLEROMA_CHAT_MESSAGES_URL(id), method: 'POST', payload: payload, - credentials + credentials, + headers }) } diff --git a/src/services/chat_service/chat_service.js b/src/services/chat_service/chat_service.js index 95c69482..e653ebc1 100644 --- a/src/services/chat_service/chat_service.js +++ b/src/services/chat_service/chat_service.js @@ -3,9 +3,10 @@ import _ from 'lodash' const empty = (chatId) => { return { idIndex: {}, + idempotencyKeyIndex: {}, messages: [], newMessageCount: 0, - lastSeenTimestamp: 0, + lastSeenMessageId: '0', chatId: chatId, minId: undefined, maxId: undefined @@ -13,10 +14,20 @@ const empty = (chatId) => { } const clear = (storage) => { - storage.idIndex = {} - storage.messages.splice(0, storage.messages.length) + const failedMessageIds = [] + + for (const message of storage.messages) { + if (message.error) { + failedMessageIds.push(message.id) + } else { + delete storage.idIndex[message.id] + delete storage.idempotencyKeyIndex[message.idempotency_key] + } + } + + storage.messages = storage.messages.filter(m => failedMessageIds.includes(m.id)) storage.newMessageCount = 0 - storage.lastSeenTimestamp = 0 + storage.lastSeenMessageId = '0' storage.minId = undefined storage.maxId = undefined } @@ -37,6 +48,25 @@ const deleteMessage = (storage, messageId) => { } } +const handleMessageError = (storage, fakeId, isRetry) => { + if (!storage) { return } + const fakeMessage = storage.idIndex[fakeId] + if (fakeMessage) { + fakeMessage.error = true + fakeMessage.pending = false + if (!isRetry) { + // Ensure the failed message doesn't stay at the bottom of the list. + const lastPersistedMessage = _.orderBy(storage.messages, ['pending', 'id'], ['asc', 'desc'])[0] + if (lastPersistedMessage) { + const oldId = fakeMessage.id + fakeMessage.id = `${lastPersistedMessage.id}-${new Date().getTime()}` + storage.idIndex[fakeMessage.id] = fakeMessage + delete storage.idIndex[oldId] + } + } + } +} + const add = (storage, { messages: newMessages, updateMaxId = true }) => { if (!storage) { return } for (let i = 0; i < newMessages.length; i++) { @@ -45,7 +75,25 @@ const add = (storage, { messages: newMessages, updateMaxId = true }) => { // sanity check if (message.chat_id !== storage.chatId) { return } - if (!storage.minId || message.id < storage.minId) { + if (message.fakeId) { + const fakeMessage = storage.idIndex[message.fakeId] + if (fakeMessage) { + // In case the same id exists (chat update before POST response) + // make sure to remove the older duplicate message. + if (storage.idIndex[message.id]) { + delete storage.idIndex[message.id] + storage.messages = storage.messages.filter(msg => msg.id !== message.id) + } + Object.assign(fakeMessage, message, { error: false }) + delete fakeMessage['fakeId'] + storage.idIndex[fakeMessage.id] = fakeMessage + delete storage.idIndex[message.fakeId] + + return + } + } + + if (!storage.minId || (!message.pending && message.id < storage.minId)) { storage.minId = message.id } @@ -55,20 +103,26 @@ const add = (storage, { messages: newMessages, updateMaxId = true }) => { } } - if (!storage.idIndex[message.id]) { - if (storage.lastSeenTimestamp < message.created_at) { + if (!storage.idIndex[message.id] && !isConfirmation(storage, message)) { + if (storage.lastSeenMessageId < message.id) { storage.newMessageCount++ } - storage.messages.push(message) storage.idIndex[message.id] = message + storage.messages.push(storage.idIndex[message.id]) + storage.idempotencyKeyIndex[message.idempotency_key] = true } } } +const isConfirmation = (storage, message) => { + if (!message.idempotency_key) return + return storage.idempotencyKeyIndex[message.idempotency_key] +} + const resetNewMessageCount = (storage) => { if (!storage) { return } storage.newMessageCount = 0 - storage.lastSeenTimestamp = new Date() + storage.lastSeenMessageId = storage.maxId } // Inserts date separators and marks the head and tail if it's the chain of messages made by the same user @@ -76,7 +130,7 @@ const getView = (storage) => { if (!storage) { return [] } const result = [] - const messages = _.sortBy(storage.messages, ['id', 'desc']) + const messages = _.orderBy(storage.messages, ['pending', 'id'], ['asc', 'asc']) const firstMessage = messages[0] let previousMessage = messages[messages.length - 1] let currentMessageChainId @@ -148,7 +202,8 @@ const ChatService = { getView, deleteMessage, resetNewMessageCount, - clear + clear, + handleMessageError } export default ChatService diff --git a/src/services/chat_utils/chat_utils.js b/src/services/chat_utils/chat_utils.js index 583438f7..de6e0625 100644 --- a/src/services/chat_utils/chat_utils.js +++ b/src/services/chat_utils/chat_utils.js @@ -3,7 +3,7 @@ import { showDesktopNotification } from '../desktop_notification_utils/desktop_n export const maybeShowChatNotification = (store, chat) => { if (!chat.lastMessage) return if (store.rootState.chats.currentChatId === chat.id && !document.hidden) return - if (store.rootState.users.currentUser.id === chat.lastMessage.account.id) return + if (store.rootState.users.currentUser.id === chat.lastMessage.account_id) return const opts = { tag: chat.lastMessage.id, @@ -18,3 +18,24 @@ export const maybeShowChatNotification = (store, chat) => { showDesktopNotification(store.rootState, opts) } + +export const buildFakeMessage = ({ content, chatId, attachments, userId, idempotencyKey }) => { + const fakeMessage = { + content, + chat_id: chatId, + created_at: new Date(), + id: `${new Date().getTime()}`, + attachments: attachments, + account_id: userId, + idempotency_key: idempotencyKey, + emojis: [], + pending: true, + isNormalized: true + } + + if (attachments[0]) { + fakeMessage.attachment = attachments[0] + } + + return fakeMessage +} diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js index 1884478a..6ed663e1 100644 --- a/src/services/entity_normalizer/entity_normalizer.service.js +++ b/src/services/entity_normalizer/entity_normalizer.service.js @@ -1,6 +1,16 @@ import escape from 'escape-html' import parseLinkHeader from 'parse-link-header' import { isStatusNotification } from '../notification_utils/notification_utils.js' +import punycode from 'punycode.js' + +/** NOTICE! ** + * Do not initialize UI-generated data here. + * It will override existing data. + * + * i.e. user.pinnedStatusIds was set to [] here + * UI code would update it with data but upon next user fetch + * it would be reverted back to [] + */ const qvitterStatusType = (status) => { if (status.is_post_verb) { @@ -53,7 +63,7 @@ export const parseUser = (data) => { output.fields = data.fields output.fields_html = data.fields.map(field => { return { - name: addEmojis(field.name, data.emojis), + name: addEmojis(escape(field.name), data.emojis), value: addEmojis(field.value, data.emojis) } }) @@ -173,15 +183,17 @@ export const parseUser = (data) => { output.locked = data.locked output.followers_count = data.followers_count output.statuses_count = data.statuses_count - output.friendIds = [] - output.followerIds = [] - output.pinnedStatusIds = [] if (data.pleroma) { output.follow_request_count = data.pleroma.follow_request_count output.tags = data.pleroma.tags - output.deactivated = data.pleroma.deactivated + + // deactivated was changed to is_active in Pleroma 2.3.0 + // so check if is_active is present + output.deactivated = typeof data.pleroma.is_active !== 'undefined' + ? !data.pleroma.is_active // new backend + : data.pleroma.deactivated // old backend output.notification_settings = data.pleroma.notification_settings output.unread_chat_count = data.pleroma.unread_chat_count @@ -191,6 +203,18 @@ export const parseUser = (data) => { output.rights = output.rights || {} output.notification_settings = output.notification_settings || {} + // Convert punycode to unicode + if (output.screen_name.includes('@')) { + const parts = output.screen_name.split('@') + let unicodeDomain = punycode.toUnicode(parts[1]) + if (unicodeDomain !== parts[1]) { + // Add some identifier so users can potentially spot spoofing attempts: + // lain.com and xn--lin-6cd.com would appear identical otherwise. + unicodeDomain = '🌏' + unicodeDomain + output.screen_name = [parts[0], unicodeDomain].join('@') + } + } + return output } @@ -274,7 +298,7 @@ export const parseStatus = (data) => { if (output.poll) { output.poll.options = (output.poll.options || []).map(field => ({ ...field, - title_html: addEmojis(field.title, data.emojis) + title_html: addEmojis(escape(field.title), data.emojis) })) } output.pinned = data.pinned @@ -429,6 +453,9 @@ export const parseChatMessage = (message) => { } else { output.attachments = [] } + output.pending = !!message.pending + output.error = false + output.idempotency_key = message.idempotency_key output.isNormalized = true return output } diff --git a/src/services/favicon_service/favicon_service.js b/src/services/favicon_service/favicon_service.js new file mode 100644 index 00000000..d1ddee41 --- /dev/null +++ b/src/services/favicon_service/favicon_service.js @@ -0,0 +1,61 @@ +import { find } from 'lodash' + +const createFaviconService = () => { + let favimg, favcanvas, favcontext, favicon + const faviconWidth = 128 + const faviconHeight = 128 + const badgeRadius = 32 + + const initFaviconService = () => { + const nodes = document.getElementsByTagName('link') + favicon = find(nodes, node => node.rel === 'icon') + if (favicon) { + favcanvas = document.createElement('canvas') + favcanvas.width = faviconWidth + favcanvas.height = faviconHeight + favimg = new Image() + favimg.src = favicon.href + favcontext = favcanvas.getContext('2d') + } + } + + const isImageLoaded = (img) => img.complete && img.naturalHeight !== 0 + + const clearFaviconBadge = () => { + if (!favimg || !favcontext || !favicon) return + + favcontext.clearRect(0, 0, faviconWidth, faviconHeight) + if (isImageLoaded(favimg)) { + favcontext.drawImage(favimg, 0, 0, favimg.width, favimg.height, 0, 0, faviconWidth, faviconHeight) + } + favicon.href = favcanvas.toDataURL('image/png') + } + + const drawFaviconBadge = () => { + if (!favimg || !favcontext || !favcontext) return + + clearFaviconBadge() + + const style = getComputedStyle(document.body) + const badgeColor = `${style.getPropertyValue('--badgeNotification') || 'rgb(240, 100, 100)'}` + + if (isImageLoaded(favimg)) { + favcontext.drawImage(favimg, 0, 0, favimg.width, favimg.height, 0, 0, faviconWidth, faviconHeight) + } + favcontext.fillStyle = badgeColor + favcontext.beginPath() + favcontext.arc(faviconWidth - badgeRadius, badgeRadius, badgeRadius, 0, 2 * Math.PI, false) + favcontext.fill() + favicon.href = favcanvas.toDataURL('image/png') + } + + return { + initFaviconService, + clearFaviconBadge, + drawFaviconBadge + } +} + +const FaviconService = createFaviconService() + +export default FaviconService diff --git a/src/services/locale/locale.service.js b/src/services/locale/locale.service.js new file mode 100644 index 00000000..5be99d81 --- /dev/null +++ b/src/services/locale/locale.service.js @@ -0,0 +1,12 @@ +const specialLanguageCodes = { + 'ja_easy': 'ja', + 'zh_Hant': 'zh-HANT' +} + +const internalToBrowserLocale = code => specialLanguageCodes[code] || code + +const localeService = { + internalToBrowserLocale +} + +export default localeService diff --git a/src/services/notifications_fetcher/notifications_fetcher.service.js b/src/services/notifications_fetcher/notifications_fetcher.service.js index c908b644..beeb167c 100644 --- a/src/services/notifications_fetcher/notifications_fetcher.service.js +++ b/src/services/notifications_fetcher/notifications_fetcher.service.js @@ -2,7 +2,6 @@ import apiService from '../api/api.service.js' import { promiseInterval } from '../promise_interval/promise_interval.js' const update = ({ store, notifications, older }) => { - store.dispatch('setNotificationsError', { value: false }) store.dispatch('addNewNotifications', { notifications, older }) } @@ -47,11 +46,22 @@ const fetchAndUpdate = ({ store, credentials, older = false }) => { const fetchNotifications = ({ store, args, older }) => { return apiService.fetchTimeline(args) - .then(({ data: notifications }) => { + .then((response) => { + if (response.errors) { + throw new Error(`${response.status} ${response.statusText}`) + } + const notifications = response.data update({ store, notifications, older }) return notifications - }, () => store.dispatch('setNotificationsError', { value: true })) - .catch(() => store.dispatch('setNotificationsError', { value: true })) + }) + .catch((error) => { + store.dispatch('pushGlobalNotice', { + level: 'error', + messageKey: 'notifications.error', + messageArgs: [error.message], + timeout: 5000 + }) + }) } const startFetching = ({ credentials, store }) => { diff --git a/src/services/promise_interval/promise_interval.js b/src/services/promise_interval/promise_interval.js index cf17970d..0c0a66a0 100644 --- a/src/services/promise_interval/promise_interval.js +++ b/src/services/promise_interval/promise_interval.js @@ -10,7 +10,14 @@ export const promiseInterval = (promiseCall, interval) => { let timeout = null const func = () => { - promiseCall().finally(() => { + const promise = promiseCall() + // something unexpected happened and promiseCall did not + // return a promise, abort the loop. + if (!(promise && promise.finally)) { + console.warn('promiseInterval: promise call did not return a promise, stopping interval.') + return + } + promise.finally(() => { if (stopped) return timeout = window.setTimeout(func, interval) }) diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js index 07425abd..a2bba67b 100644 --- a/src/services/style_setter/style_setter.js +++ b/src/services/style_setter/style_setter.js @@ -242,9 +242,18 @@ export const generateShadows = (input, colors) => { panelHeader: 'panel', input: 'input' } - const inputShadows = input.shadows && !input.themeEngineVersion - ? shadows2to3(input.shadows, input.opacity) - : input.shadows || {} + + const cleanInputShadows = Object.fromEntries( + Object.entries(input.shadows || {}) + .map(([name, shadowSlot]) => [ + name, + // defaulting color to black to avoid potential problems + shadowSlot.map(shadowDef => ({ color: '#000000', ...shadowDef })) + ]) + ) + const inputShadows = cleanInputShadows && !input.themeEngineVersion + ? shadows2to3(cleanInputShadows, input.opacity) + : cleanInputShadows || {} const shadows = Object.entries({ ...DEFAULT_SHADOWS, ...inputShadows diff --git a/src/services/theme_data/pleromafe.js b/src/services/theme_data/pleromafe.js index 7ed85797..bec1eebd 100644 --- a/src/services/theme_data/pleromafe.js +++ b/src/services/theme_data/pleromafe.js @@ -84,6 +84,10 @@ export const SLOT_INHERITANCE = { opacity: 'bg', priority: 1 }, + wallpaper: { + depends: ['bg'], + color: (mod, bg) => brightness(-2 * mod, bg).rgb + }, fg: { depends: [], priority: 1 diff --git a/src/services/timeline_fetcher/timeline_fetcher.service.js b/src/services/timeline_fetcher/timeline_fetcher.service.js index 72ea4890..921df3ed 100644 --- a/src/services/timeline_fetcher/timeline_fetcher.service.js +++ b/src/services/timeline_fetcher/timeline_fetcher.service.js @@ -6,9 +6,6 @@ import { promiseInterval } from '../promise_interval/promise_interval.js' const update = ({ store, statuses, timeline, showImmediately, userId, pagination }) => { const ccTimeline = camelCase(timeline) - store.dispatch('setError', { value: false }) - store.dispatch('setErrorData', { value: null }) - store.dispatch('addNewStatuses', { timeline: ccTimeline, userId, @@ -52,9 +49,8 @@ const fetchAndUpdate = ({ return apiService.fetchTimeline(args) .then(response => { - if (response.error) { - store.dispatch('setErrorData', { value: response }) - return + if (response.errors) { + throw new Error(`${response.status} ${response.statusText}`) } const { data: statuses, pagination } = response @@ -63,7 +59,15 @@ const fetchAndUpdate = ({ } update({ store, statuses, timeline, showImmediately, userId, pagination }) return { statuses, pagination } - }, () => store.dispatch('setError', { value: true })) + }) + .catch((error) => { + store.dispatch('pushGlobalNotice', { + level: 'error', + messageKey: 'timeline.error', + messageArgs: [error.message], + timeout: 5000 + }) + }) } const startFetching = ({ timeline = 'friends', credentials, store, userId = false, tag = false }) => { diff --git a/static/config.json b/static/config.json index 0030f78f..f59e645a 100644 --- a/static/config.json +++ b/static/config.json @@ -10,9 +10,10 @@ "hideSitename": false, "hideUserStats": false, "loginMethod": "password", - "logo": "/static/logo.png", + "logo": "/static/logo.svg", "logoMargin": ".1em", "logoMask": true, + "logoLeft": false, "minimalScopesMode": false, "nsfwCensorImage": "", "postContentType": "text/plain", diff --git a/static/emoji.json b/static/emoji.json index ae93d17e..12b91b3f 100644 --- a/static/emoji.json +++ b/static/emoji.json @@ -1,969 +1,1431 @@ { - "womans_clothes": "\ud83d\udc5a", - "cookie": "\ud83c\udf6a", - "woman_with_headscarf": "\ud83e\uddd5", - "no_smoking": "\ud83d\udead", - "e-mail": "\ud83d\udce7", - "regional_indicator_d": "\ud83c\udde9", - "oncoming_bus": "\ud83d\ude8d", - "knife": "\ud83d\udd2a", - "person_getting_haircut": "\ud83d\udc87", - "grimacing": "\ud83d\ude2c", - "ophiuchus": "\u26ce", - "regional_indicator_q": "\ud83c\uddf6", - "thinking": "\ud83e\udd14", - "signal_strength": "\ud83d\udcf6", - "cactus": "\ud83c\udf35", - "bullettrain_front": "\ud83d\ude85", - "floppy_disk": "\ud83d\udcbe", - "doughnut": "\ud83c\udf69", - "tv": "\ud83d\udcfa", - "1234": "\ud83d\udd22", - "anguished": "\ud83d\ude27", - "clock1030": "\ud83d\udd65", - "u7533": "\ud83c\ude38", - "speak_no_evil": "\ud83d\ude4a", - "chart_with_upwards_trend": "\ud83d\udcc8", - "trophy": "\ud83c\udfc6", - "musical_score": "\ud83c\udfbc", - "chestnut": "\ud83c\udf30", - "clock1130": "\ud83d\udd66", - "abcd": "\ud83d\udd21", - "syringe": "\ud83d\udc89", - "shrimp": "\ud83e\udd90", - "pisces": "\u2653", - "left_facing_fist": "\ud83e\udd1b", - "bar_chart": "\ud83d\udcca", - "eagle": "\ud83e\udd85", - "woman": "\ud83d\udc69", - "keycap_ten": "\ud83d\udd1f", - "yellow_heart": "\ud83d\udc9b", - "croissant": "\ud83e\udd50", - "mosque": "\ud83d\udd4c", - "rice_ball": "\ud83c\udf59", - "volcano": "\ud83c\udf0b", - "baggage_claim": "\ud83d\udec4", - "family": "\ud83d\udc6a", - "beetle": "\ud83d\udc1e", - "older_adult": "\ud83e\uddd3", - "clock830": "\ud83d\udd63", - "bacon": "\ud83e\udd53", - "sound": "\ud83d\udd09", - "no_bicycles": "\ud83d\udeb3", - "rewind": "\u23ea", - "adult": "\ud83e\uddd1", - "scream_cat": "\ud83d\ude40", - "person_playing_water_polo": "\ud83e\udd3d", - "blue_car": "\ud83d\ude99", - "smiley": "\ud83d\ude03", - "kaaba": "\ud83d\udd4b", - "twisted_rightwards_arrows": "\ud83d\udd00", - "last_quarter_moon": "\ud83c\udf17", - "first_place": "\ud83e\udd47", - "joy_cat": "\ud83d\ude39", - "sleeping": "\ud83d\ude34", - "basketball": "\ud83c\udfc0", - "pray": "\ud83d\ude4f", - "trumpet": "\ud83c\udfba", - "purple_heart": "\ud83d\udc9c", - "broken_heart": "\ud83d\udc94", - "astonished": "\ud83d\ude32", - "soccer": "\u26bd", - "princess": "\ud83d\udc78", - "ant": "\ud83d\udc1c", - "pig": "\ud83d\udc37", - "vhs": "\ud83d\udcfc", - "scream": "\ud83d\ude31", - "mouse": "\ud83d\udc2d", - "field_hockey": "\ud83c\udfd1", - "ab": "\ud83c\udd8e", - "tokyo_tower": "\ud83d\uddfc", - "girl": "\ud83d\udc67", - "u55b6": "\ud83c\ude3a", - "guard": "\ud83d\udc82", - "regional_indicator_s": "\ud83c\uddf8", - "tulip": "\ud83c\udf37", - "capital_abcd": "\ud83d\udd20", - "beginner": "\ud83d\udd30", - "couplekiss": "\ud83d\udc8f", - "u5408": "\ud83c\ude34", - "black_medium_small_square": "\u25fe", - "paperclip": "\ud83d\udcce", - "hedgehog": "\ud83e\udd94", - "musical_note": "\ud83c\udfb5", - "pill": "\ud83d\udc8a", - "blue_heart": "\ud83d\udc99", - "mens": "\ud83d\udeb9", - "third_place": "\ud83e\udd49", - "stew": "\ud83c\udf72", - "prince": "\ud83e\udd34", - "mortar_board": "\ud83c\udf93", - "clock6": "\ud83d\udd55", - "beer": "\ud83c\udf7a", - "person_tipping_hand": "\ud83d\udc81", - "triangular_ruler": "\ud83d\udcd0", - "regional_indicator_y": "\ud83c\uddfe", - "person_facepalming": "\ud83e\udd26", - "steam_locomotive": "\ud83d\ude82", - "fire_engine": "\ud83d\ude92", - "horse": "\ud83d\udc34", - "ribbon": "\ud83c\udf80", - "white_large_square": "\u2b1c", - "smirk": "\ud83d\ude0f", - "genie": "\ud83e\uddde", - "tangerine": "\ud83c\udf4a", - "cl": "\ud83c\udd91", - "japanese_goblin": "\ud83d\udc7a", - "regional_indicator_u": "\ud83c\uddfa", - "ring": "\ud83d\udc8d", - "roller_coaster": "\ud83c\udfa2", - "100": "\ud83d\udcaf", - "clock12": "\ud83d\udd5b", - "two_hearts": "\ud83d\udc95", - "anger": "\ud83d\udca2", - "black_circle": "\u26ab", - "revolving_hearts": "\ud83d\udc9e", - "space_invader": "\ud83d\udc7e", - "bell": "\ud83d\udd14", - "point_up_2": "\ud83d\udc46", - "person_mountain_biking": "\ud83d\udeb5", - "flags": "\ud83c\udf8f", - "pushpin": "\ud83d\udccc", - "large_blue_diamond": "\ud83d\udd37", - "fairy": "\ud83e\uddda", - "european_post_office": "\ud83c\udfe4", - "statue_of_liberty": "\ud83d\uddfd", - "man": "\ud83d\udc68", - "microphone": "\ud83c\udfa4", - "inbox_tray": "\ud83d\udce5", - "bath": "\ud83d\udec0", - "person_gesturing_ok": "\ud83d\ude46", - "clap": "\ud83d\udc4f", - "confused": "\ud83d\ude15", - "fortune_cookie": "\ud83e\udd60", - "kissing_closed_eyes": "\ud83d\ude1a", - "kissing_heart": "\ud83d\ude18", - "tropical_fish": "\ud83d\udc20", - "taco": "\ud83c\udf2e", - "kimono": "\ud83d\udc58", - "u7a7a": "\ud83c\ude33", - "rat": "\ud83d\udc00", - "taurus": "\u2649", - "shopping_cart": "\ud83d\uded2", - "womans_hat": "\ud83d\udc52", - "blossom": "\ud83c\udf3c", - "moyai": "\ud83d\uddff", - "clock130": "\ud83d\udd5c", - "telescope": "\ud83d\udd2d", - "running_shirt_with_sash": "\ud83c\udfbd", - "person_running": "\ud83c\udfc3", - "dizzy": "\ud83d\udcab", - "crescent_moon": "\ud83c\udf19", - "boom": "\ud83d\udca5", - "restroom": "\ud83d\udebb", - "fist": "\u270a", - "white_flower": "\ud83d\udcae", - "clown": "\ud83e\udd21", - "neutral_face": "\ud83d\ude10", - "id": "\ud83c\udd94", - "carrot": "\ud83e\udd55", - "rice_scene": "\ud83c\udf91", - "foggy": "\ud83c\udf01", - "turtle": "\ud83d\udc22", - "mailbox_with_mail": "\ud83d\udcec", - "baseball": "\u26be", - "grin": "\ud83d\ude01", - "bathtub": "\ud83d\udec1", - "feet": "\ud83d\udc3e", - "small_red_triangle": "\ud83d\udd3a", - "camel": "\ud83d\udc2b", - "aquarius": "\u2652", - "face_with_symbols_over_mouth": "\ud83e\udd2c", - "handbag": "\ud83d\udc5c", - "date": "\ud83d\udcc5", - "nail_care": "\ud83d\udc85", - "satellite": "\ud83d\udce1", - "candy": "\ud83c\udf6c", - "white_medium_small_square": "\u25fd", - "clock930": "\ud83d\udd64", - "fearful": "\ud83d\ude28", - "fork_and_knife": "\ud83c\udf74", - "person_wearing_turban": "\ud83d\udc73", - "confounded": "\ud83d\ude16", - "helicopter": "\ud83d\ude81", - "arrow_double_down": "\u23ec", - "convenience_store": "\ud83c\udfea", - "ghost": "\ud83d\udc7b", - "bus": "\ud83d\ude8c", - "waning_gibbous_moon": "\ud83c\udf16", - "bank": "\ud83c\udfe6", - "department_store": "\ud83c\udfec", - "hockey": "\ud83c\udfd2", - "fingers_crossed": "\ud83e\udd1e", - "blond_haired_person": "\ud83d\udc71", - "mag": "\ud83d\udd0d", - "cut_of_meat": "\ud83e\udd69", - "wink": "\ud83d\ude09", - "railway_car": "\ud83d\ude83", - "face_vomiting": "\ud83e\udd2e", - "star_struck": "\ud83e\udd29", - "first_quarter_moon_with_face": "\ud83c\udf1b", - "octagonal_sign": "\ud83d\uded1", - "hospital": "\ud83c\udfe5", - "monkey": "\ud83d\udc12", - "curly_loop": "\u27b0", - "avocado": "\ud83e\udd51", - "earth_americas": "\ud83c\udf0e", - "flashlight": "\ud83d\udd26", - "8ball": "\ud83c\udfb1", - "clock630": "\ud83d\udd61", - "boar": "\ud83d\udc17", - "birthday": "\ud83c\udf82", - "crocodile": "\ud83d\udc0a", - "confetti_ball": "\ud83c\udf8a", - "door": "\ud83d\udeaa", - "school_satchel": "\ud83c\udf92", - "peanuts": "\ud83e\udd5c", - "regional_indicator_m": "\ud83c\uddf2", - "bust_in_silhouette": "\ud83d\udc64", - "sweat_drops": "\ud83d\udca6", - "tongue": "\ud83d\udc45", - "mag_right": "\ud83d\udd0e", - "t_rex": "\ud83e\udd96", - "post_office": "\ud83c\udfe3", - "shell": "\ud83d\udc1a", - "disappointed_relieved": "\ud83d\ude25", - "card_index": "\ud83d\udcc7", - "oncoming_automobile": "\ud83d\ude98", - "passport_control": "\ud83d\udec2", - "cherry_blossom": "\ud83c\udf38", - "shallow_pan_of_food": "\ud83e\udd58", - "heart": "\u2764\ufe0f", - "heartbeat": "\ud83d\udc93", - "crazy_face": "\ud83e\udd2a", - "grapes": "\ud83c\udf47", - "symbols": "\ud83d\udd23", - "gift": "\ud83c\udf81", - "scorpion": "\ud83e\udd82", - "wedding": "\ud83d\udc92", - "last_quarter_moon_with_face": "\ud83c\udf1c", - "love_letter": "\ud83d\udc8c", - "postal_horn": "\ud83d\udcef", - "stuffed_flatbread": "\ud83e\udd59", - "heavy_dollar_sign": "\ud83d\udcb2", - "love_hotel": "\ud83c\udfe9", - "yen": "\ud83d\udcb4", - "person_in_steamy_room": "\ud83e\uddd6", - "palm_tree": "\ud83c\udf34", - "name_badge": "\ud83d\udcdb", - "clock430": "\ud83d\udd5f", - "bike": "\ud83d\udeb2", - "snail": "\ud83d\udc0c", - "bowling": "\ud83c\udfb3", - "umbrella": "\u2614", - "sleeping_accommodation": "\ud83d\udecc", - "fireworks": "\ud83c\udf86", - "closed_book": "\ud83d\udcd5", - "city_sunset": "\ud83c\udf07", - "persevere": "\ud83d\ude23", - "bento": "\ud83c\udf71", - "nut_and_bolt": "\ud83d\udd29", - "page_facing_up": "\ud83d\udcc4", - "snowman": "\u26c4", - "two_women_holding_hands": "\ud83d\udc6d", - "regional_indicator_o": "\ud83c\uddf4", - "calling": "\ud83d\udcf2", - "person_shrugging": "\ud83e\udd37", - "sneezing_face": "\ud83e\udd27", - "arrows_clockwise": "\ud83d\udd03", - "no_pedestrians": "\ud83d\udeb7", - "potato": "\ud83e\udd54", - "cheese": "\ud83e\uddc0", - "full_moon": "\ud83c\udf15", - "mount_fuji": "\ud83d\uddfb", - "sob": "\ud83d\ude2d", - "construction": "\ud83d\udea7", - "head_bandage": "\ud83e\udd15", - "sailboat": "\u26f5", - "slight_frown": "\ud83d\ude41", - "ping_pong": "\ud83c\udfd3", - "hatched_chick": "\ud83d\udc25", - "sun_with_face": "\ud83c\udf1e", - "seedling": "\ud83c\udf31", - "repeat_one": "\ud83d\udd02", - "muscle": "\ud83d\udcaa", - "bridge_at_night": "\ud83c\udf09", - "raised_hands": "\ud83d\ude4c", - "house": "\ud83c\udfe0", - "nerd": "\ud83e\udd13", - "penguin": "\ud83d\udc27", - "peach": "\ud83c\udf51", - "dumpling": "\ud83e\udd5f", - "watch": "\u231a", - "womens": "\ud83d\udeba", - "round_pushpin": "\ud83d\udccd", - "alarm_clock": "\u23f0", - "relieved": "\ud83d\ude0c", - "sagittarius": "\u2650", - "busstop": "\ud83d\ude8f", - "regional_indicator_a": "\ud83c\udde6", - "sandal": "\ud83d\udc61", - "whale2": "\ud83d\udc0b", - "book": "\ud83d\udcd6", - "sweat": "\ud83d\ude13", - "movie_camera": "\ud83c\udfa5", - "clock230": "\ud83d\udd5d", - "tiger": "\ud83d\udc2f", - "tractor": "\ud83d\ude9c", - "smile": "\ud83d\ude04", - "vertical_traffic_light": "\ud83d\udea6", - "exploding_head": "\ud83e\udd2f", - "raised_hand": "\u270b", - "smoking": "\ud83d\udeac", - "page_with_curl": "\ud83d\udcc3", - "exclamation": "\u2757", - "fish": "\ud83d\udc1f", - "mans_shoe": "\ud83d\udc5e", - "sos": "\ud83c\udd98", - "unlock": "\ud83d\udd13", - "dolls": "\ud83c\udf8e", - "ear_of_rice": "\ud83c\udf3e", - "cat2": "\ud83d\udc08", - "u7121": "\ud83c\ude1a", - "repeat": "\ud83d\udd01", - "cool": "\ud83c\udd92", - "minibus": "\ud83d\ude90", - "aerial_tramway": "\ud83d\udea1", - "key": "\ud83d\udd11", - "child": "\ud83e\uddd2", - "camera": "\ud83d\udcf7", - "sunflower": "\ud83c\udf3b", - "white_check_mark": "\u2705", - "white_square_button": "\ud83d\udd33", - "banana": "\ud83c\udf4c", - "milky_way": "\ud83c\udf0c", - "person_gesturing_no": "\ud83d\ude45", - "sushi": "\ud83c\udf63", - "heart_eyes_cat": "\ud83d\ude3b", - "guitar": "\ud83c\udfb8", - "pie": "\ud83e\udd67", - "calendar": "\ud83d\udcc6", - "bear": "\ud83d\udc3b", - "person_in_lotus_position": "\ud83e\uddd8", - "clock10": "\ud83d\udd59", - "top": "\ud83d\udd1d", - "fuelpump": "\u26fd", - "rainbow": "\ud83c\udf08", - "snowboarder": "\ud83c\udfc2", - "drum": "\ud83e\udd41", - "leaves": "\ud83c\udf43", - "first_quarter_moon": "\ud83c\udf13", - "spoon": "\ud83e\udd44", - "pouting_cat": "\ud83d\ude3e", - "shaved_ice": "\ud83c\udf67", - "unamused": "\ud83d\ude12", - "train2": "\ud83d\ude86", - "clock1230": "\ud83d\udd67", - "regional_indicator_r": "\ud83c\uddf7", - "fast_forward": "\u23e9", - "accept": "\ud83c\ude51", - "hammer": "\ud83d\udd28", - "panda_face": "\ud83d\udc3c", - "briefcase": "\ud83d\udcbc", - "package": "\ud83d\udce6", - "flag_black": "\ud83c\udff4", - "smiling_imp": "\ud83d\ude08", - "sunrise_over_mountains": "\ud83c\udf04", - "airplane_departure": "\ud83d\udeeb", - "tiger2": "\ud83d\udc05", - "non-potable_water": "\ud83d\udeb1", - "bird": "\ud83d\udc26", - "barber": "\ud83d\udc88", - "cry": "\ud83d\ude22", - "billed_cap": "\ud83e\udde2", - "pouch": "\ud83d\udc5d", - "link": "\ud83d\udd17", - "zebra": "\ud83e\udd93", - "kiss": "\ud83d\udc8b", - "scorpius": "\u264f", - "prayer_beads": "\ud83d\udcff", - "high_brightness": "\ud83d\udd06", - "kissing_smiling_eyes": "\ud83d\ude19", - "rhino": "\ud83e\udd8f", - "left_luggage": "\ud83d\udec5", - "o": "\u2b55", - "crying_cat_face": "\ud83d\ude3f", - "clock8": "\ud83d\udd57", - "dress": "\ud83d\udc57", - "clock7": "\ud83d\udd56", - "bowl_with_spoon": "\ud83e\udd63", - "rolling_eyes": "\ud83d\ude44", - "fax": "\ud83d\udce0", - "worried": "\ud83d\ude1f", - "grey_question": "\u2754", - "saxophone": "\ud83c\udfb7", - "burrito": "\ud83c\udf2f", - "salad": "\ud83e\udd57", - "regional_indicator_z": "\ud83c\uddff", - "bikini": "\ud83d\udc59", - "milk": "\ud83e\udd5b", - "stars": "\ud83c\udf20", - "lips": "\ud83d\udc44", - "cd": "\ud83d\udcbf", - "weary": "\ud83d\ude29", - "face_with_raised_eyebrow": "\ud83e\udd28", - "lizard": "\ud83e\udd8e", - "tone1": "\ud83c\udffb", - "bullettrain_side": "\ud83d\ude84", - "nose": "\ud83d\udc43", - "innocent": "\ud83d\ude07", - "wilted_rose": "\ud83e\udd40", - "mahjong": "\ud83c\udc04", - "factory": "\ud83c\udfed", - "people_wrestling": "\ud83e\udd3c", - "mailbox": "\ud83d\udceb", - "rage": "\ud83d\ude21", - "wheelchair": "\u267f", - "x": "\u274c", - "flower_playing_cards": "\ud83c\udfb4", - "nauseated_face": "\ud83e\udd22", - "underage": "\ud83d\udd1e", - "ideograph_advantage": "\ud83c\ude50", - "high_heel": "\ud83d\udc60", - "dizzy_face": "\ud83d\ude35", - "stuck_out_tongue": "\ud83d\ude1b", - "mailbox_with_no_mail": "\ud83d\udced", - "orange_heart": "\ud83e\udde1", - "raised_back_of_hand": "\ud83e\udd1a", - "footprints": "\ud83d\udc63", - "notebook_with_decorative_cover": "\ud83d\udcd4", - "mask": "\ud83d\ude37", - "sunglasses": "\ud83d\ude0e", - "pancakes": "\ud83e\udd5e", - "regional_indicator_f": "\ud83c\uddeb", - "dog": "\ud83d\udc36", - "pig2": "\ud83d\udc16", - "ng": "\ud83c\udd96", - "unicorn": "\ud83e\udd84", - "triumph": "\ud83d\ude24", - "eggplant": "\ud83c\udf46", - "egg": "\ud83e\udd5a", - "office": "\ud83c\udfe2", - "goat": "\ud83d\udc10", - "handshake": "\ud83e\udd1d", - "star": "\u2b50", - "rugby_football": "\ud83c\udfc9", - "call_me": "\ud83e\udd19", - "rice_cracker": "\ud83c\udf58", - "droplet": "\ud83d\udca7", - "badminton": "\ud83c\udff8", - "waxing_crescent_moon": "\ud83c\udf12", - "ocean": "\ud83c\udf0a", - "slot_machine": "\ud83c\udfb0", - "wine_glass": "\ud83c\udf77", - "elephant": "\ud83d\udc18", - "blowfish": "\ud83d\udc21", - "ledger": "\ud83d\udcd2", - "money_mouth": "\ud83e\udd11", - "heart_decoration": "\ud83d\udc9f", - "arrow_down_small": "\ud83d\udd3d", - "station": "\ud83d\ude89", - "man_with_chinese_cap": "\ud83d\udc72", - "vampire": "\ud83e\udddb", - "pencil": "\ud83d\udcdd", - "cyclone": "\ud83c\udf00", - "mushroom": "\ud83c\udf44", - "sandwich": "\ud83e\udd6a", - "champagne": "\ud83c\udf7e", - "expressionless": "\ud83d\ude11", - "cold_sweat": "\ud83d\ude30", - "maple_leaf": "\ud83c\udf41", - "dromedary_camel": "\ud83d\udc2a", - "vs": "\ud83c\udd9a", - "person_fencing": "\ud83e\udd3a", - "straight_ruler": "\ud83d\udccf", - "baby_bottle": "\ud83c\udf7c", - "currency_exchange": "\ud83d\udcb1", - "regional_indicator_h": "\ud83c\udded", - "stuck_out_tongue_closed_eyes": "\ud83d\ude1d", - "closed_lock_with_key": "\ud83d\udd10", - "eyes": "\ud83d\udc40", - "water_buffalo": "\ud83d\udc03", - "lock_with_ink_pen": "\ud83d\udd0f", - "heavy_plus_sign": "\u2795", - "bookmark": "\ud83d\udd16", - "soon": "\ud83d\udd1c", - "orange_book": "\ud83d\udcd9", - "pineapple": "\ud83c\udf4d", - "clock9": "\ud83d\udd58", - "small_blue_diamond": "\ud83d\udd39", - "black_large_square": "\u2b1b", - "person_surfing": "\ud83c\udfc4", - "leo": "\u264c", - "merperson": "\ud83e\udddc", - "canoe": "\ud83d\udef6", - "rooster": "\ud83d\udc13", - "hear_no_evil": "\ud83d\ude49", - "corn": "\ud83c\udf3d", - "takeout_box": "\ud83e\udd61", - "oncoming_taxi": "\ud83d\ude96", - "taxi": "\ud83d\ude95", - "chart": "\ud83d\udcb9", - "goal": "\ud83e\udd45", - "melon": "\ud83c\udf48", - "notes": "\ud83c\udfb6", - "sparkler": "\ud83c\udf87", - "dolphin": "\ud83d\udc2c", - "speedboat": "\ud83d\udea4", - "cancer": "\u264b", - "sled": "\ud83d\udef7", - "tanabata_tree": "\ud83c\udf8b", - "train": "\ud83d\ude8b", - "christmas_tree": "\ud83c\udf84", - "two_men_holding_hands": "\ud83d\udc6c", - "back": "\ud83d\udd19", - "balloon": "\ud83c\udf88", - "checkered_flag": "\ud83c\udfc1", - "loop": "\u27bf", - "wc": "\ud83d\udebe", - "jeans": "\ud83d\udc56", - "green_apple": "\ud83c\udf4f", - "crown": "\ud83d\udc51", - "cowboy": "\ud83e\udd20", - "postbox": "\ud83d\udcee", - "volleyball": "\ud83c\udfd0", - "upside_down": "\ud83d\ude43", - "cricket": "\ud83e\udd97", - "custard": "\ud83c\udf6e", - "rose": "\ud83c\udf39", - "eyeglasses": "\ud83d\udc53", - "oncoming_police_car": "\ud83d\ude94", - "atm": "\ud83c\udfe7", - "flying_saucer": "\ud83d\udef8", - "alien": "\ud83d\udc7d", - "hamster": "\ud83d\udc39", - "trident": "\ud83d\udd31", - "disappointed": "\ud83d\ude1e", - "cow": "\ud83d\udc2e", - "police_officer": "\ud83d\udc6e", - "popcorn": "\ud83c\udf7f", - "baby_chick": "\ud83d\udc24", - "video_camera": "\ud83d\udcf9", - "zzz": "\ud83d\udca4", - "person_climbing": "\ud83e\uddd7", - "star2": "\ud83c\udf1f", - "ok": "\ud83c\udd97", - "capricorn": "\u2651", - "chicken": "\ud83d\udc14", - "arrow_double_up": "\u23eb", - "zombie": "\ud83e\udddf", - "closed_umbrella": "\ud83c\udf02", - "person_walking": "\ud83d\udeb6", - "lemon": "\ud83c\udf4b", - "heartpulse": "\ud83d\udc97", - "regional_indicator_i": "\ud83c\uddee", - "sauropod": "\ud83e\udd95", - "u7981": "\ud83c\ude32", - "regional_indicator_w": "\ud83c\uddfc", - "evergreen_tree": "\ud83c\udf32", - "mobile_phone_off": "\ud83d\udcf4", - "koko": "\ud83c\ude01", - "poop": "\ud83d\udca9", - "cup_with_straw": "\ud83e\udd64", - "leopard": "\ud83d\udc06", - "radio_button": "\ud83d\udd18", - "mega": "\ud83d\udce3", - "metal": "\ud83e\udd18", - "shushing_face": "\ud83e\udd2b", - "stuck_out_tongue_winking_eye": "\ud83d\ude1c", - "octopus": "\ud83d\udc19", - "boxing_glove": "\ud83e\udd4a", - "person_juggling": "\ud83e\udd39", - "money_with_wings": "\ud83d\udcb8", - "dollar": "\ud83d\udcb5", - "bride_with_veil": "\ud83d\udc70", - "second_place": "\ud83e\udd48", - "spaghetti": "\ud83c\udf5d", - "waning_crescent_moon": "\ud83c\udf18", - "football": "\ud83c\udfc8", - "white_circle": "\u26aa", - "full_moon_with_face": "\ud83c\udf1d", - "selfie": "\ud83e\udd33", - "tone3": "\ud83c\udffd", - "rabbit": "\ud83d\udc30", - "computer": "\ud83d\udcbb", - "clock11": "\ud83d\udd5a", - "heavy_minus_sign": "\u2796", - "synagogue": "\ud83d\udd4d", - "hourglass": "\u231b", - "gem": "\ud83d\udc8e", - "person_doing_cartwheel": "\ud83e\udd38", - "new_moon_with_face": "\ud83c\udf1a", - "sunrise": "\ud83c\udf05", - "regional_indicator_x": "\ud83c\uddfd", - "open_file_folder": "\ud83d\udcc2", - "gift_heart": "\ud83d\udc9d", - "tada": "\ud83c\udf89", - "green_heart": "\ud83d\udc9a", - "battery": "\ud83d\udd0b", - "regional_indicator_t": "\ud83c\uddf9", - "wrench": "\ud83d\udd27", - "aries": "\u2648", - "man_in_tuxedo": "\ud83e\udd35", - "regional_indicator_e": "\ud83c\uddea", - "regional_indicator_l": "\ud83c\uddf1", - "cake": "\ud83c\udf70", - "clapper": "\ud83c\udfac", - "japanese_castle": "\ud83c\udfef", - "crystal_ball": "\ud83d\udd2e", - "golf": "\u26f3", - "no_mobile_phones": "\ud83d\udcf5", - "person_biking": "\ud83d\udeb4", - "icecream": "\ud83c\udf66", - "mage": "\ud83e\uddd9", - "bookmark_tabs": "\ud83d\udcd1", - "tone4": "\ud83c\udffe", - "mountain_cableway": "\ud83d\udea0", - "person_playing_handball": "\ud83e\udd3e", - "bulb": "\ud83d\udca1", - "clock330": "\ud83d\udd5e", - "metro": "\ud83d\ude87", - "wave": "\ud83d\udc4b", - "whale": "\ud83d\udc33", - "strawberry": "\ud83c\udf53", - "hatching_chick": "\ud83d\udc23", - "trolleybus": "\ud83d\ude8e", - "lollipop": "\ud83c\udf6d", - "clipboard": "\ud83d\udccb", - "point_right": "\ud83d\udc49", - "u6307": "\ud83c\ude2f", - "santa": "\ud83c\udf85", - "hibiscus": "\ud83c\udf3a", - "green_book": "\ud83d\udcd7", - "skull": "\ud83d\udc80", - "tumbler_glass": "\ud83e\udd43", - "clock2": "\ud83d\udd51", - "open_mouth": "\ud83d\ude2e", - "bouquet": "\ud83d\udc90", - "champagne_glass": "\ud83e\udd42", - "poodle": "\ud83d\udc29", - "hushed": "\ud83d\ude2f", - "earth_asia": "\ud83c\udf0f", - "face_with_monocle": "\ud83e\uddd0", - "libra": "\u264e", - "clock5": "\ud83d\udd54", - "ambulance": "\ud83d\ude91", - "u5272": "\ud83c\ude39", - "lipstick": "\ud83d\udc84", - "apple": "\ud83c\udf4e", - "headphones": "\ud83c\udfa7", - "turkey": "\ud83e\udd83", - "pretzel": "\ud83e\udd68", - "bug": "\ud83d\udc1b", - "school": "\ud83c\udfeb", - "speaker": "\ud83d\udd08", - "boot": "\ud83d\udc62", - "cat": "\ud83d\udc31", - "dancer": "\ud83d\udc83", - "no_entry": "\u26d4", - "kissing_cat": "\ud83d\ude3d", - "art": "\ud83c\udfa8", - "coat": "\ud83e\udde5", - "credit_card": "\ud83d\udcb3", - "customs": "\ud83d\udec3", - "broccoli": "\ud83e\udd66", - "point_left": "\ud83d\udc48", - "canned_food": "\ud83e\udd6b", - "sheep": "\ud83d\udc11", - "person_bowing": "\ud83d\ude47", - "scroll": "\ud83d\udcdc", - "martial_arts_uniform": "\ud83e\udd4b", - "amphora": "\ud83c\udffa", - "thought_balloon": "\ud83d\udcad", - "no_bell": "\ud83d\udd15", - "musical_keyboard": "\ud83c\udfb9", - "people_with_bunny_ears_partying": "\ud83d\udc6f", - "european_castle": "\ud83c\udff0", - "punch": "\ud83d\udc4a", - "camera_with_flash": "\ud83d\udcf8", - "regional_indicator_p": "\ud83c\uddf5", - "red_car": "\ud83d\ude97", - "regional_indicator_j": "\ud83c\uddef", - "owl": "\ud83e\udd89", - "chart_with_downwards_trend": "\ud83d\udcc9", - "older_woman": "\ud83d\udc75", - "gemini": "\u264a", - "incoming_envelope": "\ud83d\udce8", - "waxing_gibbous_moon": "\ud83c\udf14", - "toilet": "\ud83d\udebd", - "dragon_face": "\ud83d\udc32", - "koala": "\ud83d\udc28", - "tone5": "\ud83c\udfff", - "kiwi": "\ud83e\udd5d", - "dash": "\ud83d\udca8", - "imp": "\ud83d\udc7f", - "tent": "\u26fa", - "regional_indicator_b": "\ud83c\udde7", - "monorail": "\ud83d\ude9d", - "ox": "\ud83d\udc02", - "giraffe": "\ud83e\udd92", - "new": "\ud83c\udd95", - "person_raising_hand": "\ud83d\ude4b", - "japan": "\ud83d\uddfe", - "rice": "\ud83c\udf5a", - "ticket": "\ud83c\udfab", - "rotating_light": "\ud83d\udea8", - "loudspeaker": "\ud83d\udce2", - "person_getting_massage": "\ud83d\udc86", - "loud_sound": "\ud83d\udd0a", - "hugging": "\ud83e\udd17", - "herb": "\ud83c\udf3f", - "baby": "\ud83d\udc76", - "angel": "\ud83d\udc7c", - "athletic_shoe": "\ud83d\udc5f", - "euro": "\ud83d\udcb6", - "ram": "\ud83d\udc0f", - "large_orange_diamond": "\ud83d\udd36", - "red_circle": "\ud83d\udd34", - "ferris_wheel": "\ud83c\udfa1", - "drooling_face": "\ud83e\udd24", - "microscope": "\ud83d\udd2c", - "middle_finger": "\ud83d\udd95", - "pager": "\ud83d\udcdf", - "pensive": "\ud83d\ude14", - "potable_water": "\ud83d\udeb0", - "abc": "\ud83d\udd24", - "four_leaf_clover": "\ud83c\udf40", - "vulcan": "\ud83d\udd96", - "french_bread": "\ud83e\udd56", - "motor_scooter": "\ud83d\udef5", - "moneybag": "\ud83d\udcb0", - "sparkles": "\u2728", - "gloves": "\ud83e\udde4", - "envelope_with_arrow": "\ud83d\udce9", - "thumbsdown": "\ud83d\udc4e", - "regional_indicator_g": "\ud83c\uddec", - "video_game": "\ud83c\udfae", - "on": "\ud83d\udd1b", - "open_hands": "\ud83d\udc50", - "monkey_face": "\ud83d\udc35", - "mountain_railway": "\ud83d\ude9e", - "bee": "\ud83d\udc1d", - "scooter": "\ud83d\udef4", - "fishing_pole_and_fish": "\ud83c\udfa3", - "smiley_cat": "\ud83d\ude3a", - "heart_eyes": "\ud83d\ude0d", - "horse_racing": "\ud83c\udfc7", - "ear": "\ud83d\udc42", - "blue_circle": "\ud83d\udd35", - "crossed_flags": "\ud83c\udf8c", - "black_joker": "\ud83c\udccf", - "six_pointed_star": "\ud83d\udd2f", - "fountain": "\u26f2", - "free": "\ud83c\udd93", - "tennis": "\ud83c\udfbe", - "yum": "\ud83d\ude0b", - "fried_shrimp": "\ud83c\udf64", - "dragon": "\ud83d\udc09", - "purse": "\ud83d\udc5b", - "clock1": "\ud83d\udd50", - "airplane_arriving": "\ud83d\udeec", - "cucumber": "\ud83e\udd52", - "man_dancing": "\ud83d\udd7a", - "clock730": "\ud83d\udd62", - "deer": "\ud83e\udd8c", - "meat_on_bone": "\ud83c\udf56", - "bomb": "\ud83d\udca3", - "night_with_stars": "\ud83c\udf03", - "snake": "\ud83d\udc0d", - "ramen": "\ud83c\udf5c", - "end": "\ud83d\udd1a", - "do_not_litter": "\ud83d\udeaf", - "joy": "\ud83d\ude02", - "light_rail": "\ud83d\ude88", - "game_die": "\ud83c\udfb2", - "violin": "\ud83c\udfbb", - "tone2": "\ud83c\udffc", - "tropical_drink": "\ud83c\udf79", - "love_you_gesture": "\ud83e\udd1f", - "cherries": "\ud83c\udf52", - "traffic_light": "\ud83d\udea5", - "iphone": "\ud83d\udcf1", - "socks": "\ud83e\udde6", - "wind_chime": "\ud83c\udf90", - "no_entry_sign": "\ud83d\udeab", - "elf": "\ud83e\udddd", - "squid": "\ud83e\udd91", - "person_pouting": "\ud83d\ude4e", - "smile_cat": "\ud83d\ude38", - "beers": "\ud83c\udf7b", - "minidisc": "\ud83d\udcbd", - "clock4": "\ud83d\udd53", - "ice_cream": "\ud83c\udf68", - "cocktail": "\ud83c\udf78", - "clock3": "\ud83d\udd52", - "frowning": "\ud83d\ude26", - "hamburger": "\ud83c\udf54", - "brain": "\ud83e\udde0", - "heavy_division_sign": "\u2797", - "tophat": "\ud83c\udfa9", - "no_mouth": "\ud83d\ude36", - "ski": "\ud83c\udfbf", - "right_facing_fist": "\ud83e\udd1c", - "mailbox_closed": "\ud83d\udcea", - "chocolate_bar": "\ud83c\udf6b", - "rabbit2": "\ud83d\udc07", - "honey_pot": "\ud83c\udf6f", - "izakaya_lantern": "\ud83c\udfee", - "articulated_lorry": "\ud83d\ude9b", - "face_with_hand_over_mouth": "\ud83e\udd2d", - "japanese_ogre": "\ud83d\udc79", - "zap": "\u26a1", - "rocket": "\ud83d\ude80", - "pizza": "\ud83c\udf55", - "pound": "\ud83d\udcb7", - "person_swimming": "\ud83c\udfca", - "anchor": "\u2693", - "coconut": "\ud83e\udd65", - "sparkling_heart": "\ud83d\udc96", - "older_man": "\ud83d\udc74", - "mouse2": "\ud83d\udc01", - "angry": "\ud83d\ude20", - "up": "\ud83c\udd99", - "gorilla": "\ud83e\udd8d", - "children_crossing": "\ud83d\udeb8", - "smirk_cat": "\ud83d\ude3c", - "pregnant_woman": "\ud83e\udd30", - "electric_plug": "\ud83d\udd0c", - "dog2": "\ud83d\udc15", - "question": "\u2753", - "carousel_horse": "\ud83c\udfa0", - "church": "\u26ea", - "outbox_tray": "\ud83d\udce4", - "cinema": "\ud83c\udfa6", - "flushed": "\ud83d\ude33", - "blush": "\ud83d\ude0a", - "medal": "\ud83c\udfc5", - "coffee": "\u2615", - "gun": "\ud83d\udd2b", - "city_dusk": "\ud83c\udf06", - "watermelon": "\ud83c\udf49", - "cricket_game": "\ud83c\udfcf", - "shower": "\ud83d\udebf", - "mute": "\ud83d\udd07", - "breast_feeding": "\ud83e\udd31", - "sweat_smile": "\ud83d\ude05", - "construction_worker": "\ud83d\udc77", - "cow2": "\ud83d\udc04", - "arrows_counterclockwise": "\ud83d\udd04", - "u6e80": "\ud83c\ude35", - "grinning": "\ud83d\ude00", - "globe_with_meridians": "\ud83c\udf10", - "diamond_shape_with_a_dot_inside": "\ud83d\udca0", - "deciduous_tree": "\ud83c\udf33", - "shark": "\ud83e\udd88", - "tram": "\ud83d\ude8a", - "person_rowing_boat": "\ud83d\udea3", - "chopsticks": "\ud83e\udd62", - "black_heart": "\ud83d\udda4", - "seat": "\ud83d\udcba", - "kissing": "\ud83d\ude17", - "laughing": "\ud83d\ude06", - "slight_smile": "\ud83d\ude42", - "radio": "\ud83d\udcfb", - "arrow_up_small": "\ud83d\udd3c", - "dango": "\ud83c\udf61", - "rofl": "\ud83e\udd23", - "see_no_evil": "\ud83d\ude48", - "thermometer_face": "\ud83e\udd12", - "hotdog": "\ud83c\udf2d", - "virgo": "\u264d", - "poultry_leg": "\ud83c\udf57", - "hotel": "\ud83c\udfe8", - "wolf": "\ud83d\udc3a", - "curry": "\ud83c\udf5b", - "regional_indicator_v": "\ud83c\uddfb", - "crab": "\ud83e\udd80", - "tired_face": "\ud83d\ude2b", - "place_of_worship": "\ud83d\uded0", - "ok_hand": "\ud83d\udc4c", - "speech_balloon": "\ud83d\udcac", - "sleepy": "\ud83d\ude2a", - "earth_africa": "\ud83c\udf0d", - "police_car": "\ud83d\ude93", - "small_red_triangle_down": "\ud83d\udd3b", - "bearded_person": "\ud83e\uddd4", - "curling_stone": "\ud83e\udd4c", - "scarf": "\ud83e\udde3", - "fire": "\ud83d\udd25", - "file_folder": "\ud83d\udcc1", - "zipper_mouth": "\ud83e\udd10", - "new_moon": "\ud83c\udf11", - "regional_indicator_n": "\ud83c\uddf3", - "negative_squared_cross_mark": "\u274e", - "newspaper": "\ud83d\udcf0", - "dvd": "\ud83d\udcc0", - "pear": "\ud83c\udf50", - "partly_sunny": "\u26c5", - "black_square_button": "\ud83d\udd32", - "low_brightness": "\ud83d\udd05", - "sake": "\ud83c\udf76", - "bow_and_arrow": "\ud83c\udff9", - "cooking": "\ud83c\udf73", - "fish_cake": "\ud83c\udf65", - "tomato": "\ud83c\udf45", - "couple_with_heart": "\ud83d\udc91", - "telephone_receiver": "\ud83d\udcde", - "triangular_flag_on_post": "\ud83d\udea9", - "jack_o_lantern": "\ud83c\udf83", - "blue_book": "\ud83d\udcd8", - "clock530": "\ud83d\udd60", - "u6709": "\ud83c\ude36", - "palms_up_together": "\ud83e\udd32", - "lion_face": "\ud83e\udd81", - "lock": "\ud83d\udd12", - "duck": "\ud83e\udd86", - "truck": "\ud83d\ude9a", - "oden": "\ud83c\udf62", - "busts_in_silhouette": "\ud83d\udc65", - "hourglass_flowing_sand": "\u23f3", - "frog": "\ud83d\udc38", - "fox": "\ud83e\udd8a", - "bread": "\ud83c\udf5e", - "put_litter_in_its_place": "\ud83d\udeae", - "couple": "\ud83d\udc6b", - "bamboo": "\ud83c\udf8d", - "regional_indicator_c": "\ud83c\udde8", - "menorah": "\ud83d\udd4e", - "circus_tent": "\ud83c\udfaa", - "lying_face": "\ud83e\udd25", - "small_orange_diamond": "\ud83d\udd38", - "ship": "\ud83d\udea2", - "person_frowning": "\ud83d\ude4d", - "racehorse": "\ud83d\udc0e", - "thumbsup": "\ud83d\udc4d", - "cupid": "\ud83d\udc98", - "robot": "\ud83e\udd16", - "fallen_leaf": "\ud83c\udf42", - "pig_nose": "\ud83d\udc3d", - "vibration_mode": "\ud83d\udcf3", - "necktie": "\ud83d\udc54", - "boy": "\ud83d\udc66", - "house_with_garden": "\ud83c\udfe1", - "point_down": "\ud83d\udc47", - "grey_exclamation": "\u2755", - "books": "\ud83d\udcda", - "regional_indicator_k": "\ud83c\uddf0", - "shirt": "\ud83d\udc55", - "fries": "\ud83c\udf5f", - "dart": "\ud83c\udfaf", - "tea": "\ud83c\udf75", - "mrs_claus": "\ud83e\udd36", - "suspension_railway": "\ud83d\ude9f", - "baby_symbol": "\ud83d\udebc", - "sweet_potato": "\ud83c\udf60", - "butterfly": "\ud83e\udd8b", - "performing_arts": "\ud83c\udfad", - "notebook": "\ud83d\udcd3", - "bat": "\ud83e\udd87" -} + "100": "💯", + "1234": "🔢", + "1st_place_medal": "🥇", + "2nd_place_medal": "🥈", + "3rd_place_medal": "🥉", + "8ball": "🎱", + "a_button_blood_type": "🅰", + "ab": "🆎", + "abacus": "🧮", + "abc": "🔤", + "abcd": "🔡", + "accept": "🉑", + "adhesive_bandage": "🩹", + "admission_tickets": "🎟", + "adult": "🧑", + "aerial_tramway": "🚡", + "airplane": "✈", + "airplane_arriving": "🛬", + "airplane_departure": "🛫", + "alarm_clock": "⏰", + "alembic": "⚗️", + "alien": "👽", + "ambulance": "🚑", + "amphora": "🏺", + "anchor": "⚓", + "angel": "👼", + "anger": "💢", + "anger_right": "🗯", + "angry": "😠", + "anguished": "😧", + "ant": "🐜", + "apple": "🍎", + "aquarius": "♒", + "aries": "♈", + "arrow_backward": "◀️", + "arrow_double_down": "⏬", + "arrow_double_up": "⏫", + "arrow_down": "⬇️", + "arrow_down_small": "🔽", + "arrow_forward": "▶️", + "arrow_heading_down": "⤵️", + "arrow_heading_up": "⤴️", + "arrow_left": "⬅️", + "arrow_lower_left": "↙️", + "arrow_lower_right": "↘️", + "arrow_right": "➡", + "arrow_right_hook": "↪️", + "arrow_up": "⬆️", + "arrow_up_down": "↕", + "arrow_up_small": "🔼", + "arrow_upper_left": "↖", + "arrow_upper_right": "↗️", + "arrows_clockwise": "🔃", + "arrows_counterclockwise": "🔄", + "art": "🎨", + "articulated_lorry": "🚛", + "artist_palette": "🎨", + "asterisk": "*⃣", + "astonished": "😲", + "athletic_shoe": "👟", + "atm": "🏧", + "atom": "⚛", + "atom_symbol": "⚛️", + "auto_rickshaw": "🛺", + "automobile": "🚗", + "avocado": "🥑", + "axe": "🪓", + "b_button_blood_type": "🅱", + "baby": "👶", + "baby_bottle": "🍼", + "baby_chick": "🐤", + "baby_symbol": "🚼", + "back": "🔙", + "bacon": "🥓", + "badger": "🦡", + "badminton": "🏸", + "bagel": "🥯", + "baggage_claim": "🛄", + "baguette_bread": "🥖", + "balance_scale": "⚖️", + "bald": "🦲", + "ballet_shoes": "🩰", + "balloon": "🎈", + "ballot_box": "🗳", + "ballot_box_with_check": "☑️", + "bamboo": "🎍", + "banana": "🍌", + "bangbang": "‼️", + "banjo": "🪕", + "bank": "🏦", + "bar_chart": "📊", + "barber": "💈", + "baseball": "⚾", + "basket": "🧺", + "basketball": "🏀", + "basketballer": "⛹", + "bat": "🦇", + "bath": "🛀", + "bathtub": "🛁", + "battery": "🔋", + "beach_umbrella": "⛱", + "beach_with_umbrella": "🏖", + "bear": "🐻", + "beard": "🧔", + "bearded_person": "🧔", + "bed": "🛏", + "bee": "🐝", + "beer": "🍺", + "beers": "🍻", + "beetle": "🐞", + "beginner": "🔰", + "bell": "🔔", + "bellhop_bell": "🛎", + "bento": "🍱", + "beverage_box": "🧃", + "bicyclist": "🚴", + "bike": "🚲", + "bikini": "👙", + "billed_cap": "🧢", + "biohazard": "☣️", + "bird": "🐦", + "birthday": "🎂", + "black_circle": "⚫", + "black_heart": "🖤", + "black_joker": "🃏", + "black_large_square": "⬛", + "black_medium_small_square": "◾", + "black_medium_square": "◼", + "black_nib": "✒️", + "black_small_square": "▪", + "black_square_button": "🔲", + "blond_haired_person": "👱", + "blossom": "🌼", + "blowfish": "🐡", + "blue_book": "📘", + "blue_car": "🚙", + "blue_circle": "🔵", + "blue_heart": "💙", + "blue_square": "🟦", + "blush": "😊", + "boar": "🐗", + "bomb": "💣", + "bone": "🦴", + "book": "📖", + "bookmark": "🔖", + "bookmark_tabs": "📑", + "books": "📚", + "boom": "💥", + "boot": "👢", + "bouquet": "💐", + "bow": "🙇", + "bow_and_arrow": "🏹", + "bowl_with_spoon": "🥣", + "bowling": "🎳", + "boxing_glove": "🥊", + "boy": "👦", + "brain": "🧠", + "bread": "🍞", + "breast_feeding": "🤱", + "breastfeeding": "🤱", + "brick": "🧱", + "bride_with_veil": "👰", + "bridge_at_night": "🌉", + "briefcase": "💼", + "briefs": "🩲", + "broccoli": "🥦", + "broken_heart": "💔", + "broom": "🧹", + "brown_circle": "🟤", + "brown_heart": "🤎", + "bug": "🐛", + "building_construction": "🏗", + "bulb": "💡", + "bullettrain_front": "🚅", + "bullettrain_side": "🚄", + "burrito": "🌯", + "bus": "🚌", + "busstop": "🚏", + "bust_in_silhouette": "👤", + "busts_in_silhouette": "👥", + "butter": "🧈", + "butterfly": "🦋", + "cactus": "🌵", + "cake": "🍰", + "calendar": "📆", + "call_me": "🤙", + "call_me_hand": "🤙", + "calling": "📲", + "camel": "🐫", + "camera": "📷", + "camera_with_flash": "📸", + "camping": "🏕", + "cancer": "♋", + "candle": "🕯", + "candy": "🍬", + "canned_food": "🥫", + "canoe": "🛶", + "capital_abcd": "🔠", + "capricorn": "♑", + "card_file_box": "🗃", + "card_index": "📇", + "card_index_dividers": "🗂", + "carousel_horse": "🎠", + "carrot": "🥕", + "cat": "🐱", + "cat2": "🐈", + "cd": "💿", + "chains": "⛓️", + "chair": "🪑", + "champagne": "🍾", + "champagne_glass": "🥂", + "chart": "💹", + "chart_with_downwards_trend": "📉", + "chart_with_upwards_trend": "📈", + "check_box_with_check": "☑", + "check_mark": "✔", + "checkered_flag": "🏁", + "cheese": "🧀", + "cheese_wedge": "🧀", + "cherries": "🍒", + "cherry_blossom": "🌸", + "chess_pawn": "♟", + "chestnut": "🌰", + "chicken": "🐔", + "child": "🧒", + "children_crossing": "🚸", + "chipmunk": "🐿", + "chocolate_bar": "🍫", + "chopsticks": "🥢", + "christmas_tree": "🎄", + "church": "⛪", + "cinema": "🎦", + "circled_m": "Ⓜ", + "circus_tent": "🎪", + "city_dusk": "🌆", + "city_sunset": "🌇", + "cityscape": "🏙", + "cityscape_at_dusk": "🌆", + "cl": "🆑", + "clap": "👏", + "clapper": "🎬", + "classical_building": "🏛", + "clinking_glasses": "🥂", + "clipboard": "📋", + "clock1": "🕐", + "clock10": "🕙", + "clock1030": "🕥", + "clock11": "🕚", + "clock1130": "🕦", + "clock12": "🕛", + "clock1230": "🕧", + "clock130": "🕜", + "clock2": "🕑", + "clock230": "🕝", + "clock3": "🕒", + "clock330": "🕞", + "clock4": "🕓", + "clock430": "🕟", + "clock5": "🕔", + "clock530": "🕠", + "clock6": "🕕", + "clock630": "🕡", + "clock7": "🕖", + "clock730": "🕢", + "clock8": "🕗", + "clock830": "🕣", + "clock9": "🕘", + "clock930": "🕤", + "closed_book": "📕", + "closed_lock_with_key": "🔐", + "closed_umbrella": "🌂", + "cloud": "☁️", + "cloud_with_lightning": "🌩", + "cloud_with_lightning_and_rain": "⛈️", + "cloud_with_rain": "🌧", + "cloud_with_snow": "🌨", + "clown": "🤡", + "clown_face": "🤡", + "club_suit": "♣️", + "clubs": "♣", + "coat": "🧥", + "cocktail": "🍸", + "coconut": "🥥", + "coffee": "☕", + "coffin": "⚰️", + "cold_face": "🥶", + "cold_sweat": "😰", + "comet": "☄️", + "compass": "🧭", + "compression": "🗜", + "computer": "💻", + "computer_mouse": "🖱", + "confetti_ball": "🎊", + "confounded": "😖", + "confused": "😕", + "congratulations": "㊗", + "construction": "🚧", + "construction_worker": "👷", + "control_knobs": "🎛", + "convenience_store": "🏪", + "cookie": "🍪", + "cooking": "🍳", + "cool": "🆒", + "cop": "👮", + "copyright": "©", + "corn": "🌽", + "couch_and_lamp": "🛋", + "couple": "👫", + "couple_with_heart": "💑", + "couplekiss": "💏", + "cow": "🐮", + "cow2": "🐄", + "cowboy": "🤠", + "cowboy_hat_face": "🤠", + "crab": "🦀", + "crayon": "🖍", + "crazy_face": "🤪", + "credit_card": "💳", + "crescent_moon": "🌙", + "cricket": "🦗", + "cricket_game": "🏏", + "crocodile": "🐊", + "croissant": "🥐", + "cross": "✝️", + "crossed_fingers": "🤞", + "crossed_flags": "🎌", + "crossed_swords": "⚔️", + "crown": "👑", + "cry": "😢", + "crying_cat_face": "😿", + "crystal_ball": "🔮", + "cucumber": "🥒", + "cup_with_straw": "🥤", + "cupcake": "🧁", + "cupid": "💘", + "curling_stone": "🥌", + "curly_hair": "🦱", + "curly_loop": "➰", + "currency_exchange": "💱", + "curry": "🍛", + "custard": "🍮", + "customs": "🛃", + "cut_of_meat": "🥩", + "cyclone": "🌀", + "dagger": "🗡", + "dancer": "💃", + "dancers": "👯", + "dango": "🍡", + "dark_skin_tone": "🏿", + "dark_sunglasses": "🕶", + "dart": "🎯", + "dash": "💨", + "date": "📅", + "deaf_person": "🧏", + "deciduous_tree": "🌳", + "deer": "🦌", + "department_store": "🏬", + "derelict_house": "🏚", + "desert": "🏜", + "desert_island": "🏝", + "desktop_computer": "🖥", + "detective": "🕵", + "diamond_shape_with_a_dot_inside": "💠", + "diamond_suit": "♦️", + "diamonds": "♦", + "disappointed": "😞", + "disappointed_relieved": "😥", + "diving_mask": "🤿", + "diya_lamp": "🪔", + "dizzy": "💫", + "dizzy_face": "😵", + "dna": "🧬", + "do_not_litter": "🚯", + "dog": "🐶", + "dog2": "🐕", + "dollar": "💵", + "dolls": "🎎", + "dolphin": "🐬", + "door": "🚪", + "double_exclamation_mark": "‼", + "doughnut": "🍩", + "dove": "🕊", + "down_arrow": "⬇", + "downleft_arrow": "↙", + "downright_arrow": "↘", + "dragon": "🐉", + "dragon_face": "🐲", + "dress": "👗", + "dromedary_camel": "🐪", + "drooling_face": "🤤", + "drop_of_blood": "🩸", + "droplet": "💧", + "drum": "🥁", + "duck": "🦆", + "dumpling": "🥟", + "dvd": "📀", + "e-mail": "📧", + "eagle": "🦅", + "ear": "👂", + "ear_of_rice": "🌾", + "ear_with_hearing_aid": "🦻", + "earth_africa": "🌍", + "earth_americas": "🌎", + "earth_asia": "🌏", + "egg": "🥚", + "eggplant": "🍆", + "eight": "8⃣", + "eight_pointed_black_star": "✴️", + "eight_spoked_asterisk": "✳️", + "eightpointed_star": "✴", + "eightspoked_asterisk": "✳", + "eject_button": "⏏", + "electric_plug": "🔌", + "elephant": "🐘", + "elf": "🧝", + "end": "🔚", + "envelope": "✉", + "envelope_with_arrow": "📩", + "euro": "💶", + "european_castle": "🏰", + "european_post_office": "🏤", + "evergreen_tree": "🌲", + "exclamation": "❗", + "exclamation_question_mark": "⁉", + "exploding_head": "🤯", + "expressionless": "😑", + "eye": "👁", + "eyeglasses": "👓", + "eyes": "👀", + "face_vomiting": "🤮", + "face_with_hand_over_mouth": "🤭", + "face_with_headbandage": "🤕", + "face_with_monocle": "🧐", + "face_with_raised_eyebrow": "🤨", + "face_with_symbols_on_mouth": "🤬", + "face_with_symbols_over_mouth": "🤬", + "face_with_thermometer": "🤒", + "factory": "🏭", + "fairy": "🧚", + "falafel": "🧆", + "fallen_leaf": "🍂", + "family": "👪", + "fast_forward": "⏩", + "fax": "📠", + "fearful": "😨", + "feet": "🐾", + "female_sign": "♀", + "ferris_wheel": "🎡", + "ferry": "⛴️", + "field_hockey": "🏑", + "file_cabinet": "🗄", + "file_folder": "📁", + "film_frames": "🎞", + "film_projector": "📽", + "fingers_crossed": "🤞", + "fire": "🔥", + "fire_engine": "🚒", + "fire_extinguisher": "🧯", + "firecracker": "🧨", + "fireworks": "🎆", + "first_place": "🥇", + "first_quarter_moon": "🌓", + "first_quarter_moon_with_face": "🌛", + "fish": "🐟", + "fish_cake": "🍥", + "fishing_pole_and_fish": "🎣", + "fist": "✊", + "five": "5⃣", + "flag_black": "🏴", + "flag_white": "🏳", + "flags": "🎏", + "flamingo": "🦩", + "flashlight": "🔦", + "flat_shoe": "🥿", + "fleur-de-lis": "⚜", + "fleurde-lis": "⚜️", + "floppy_disk": "💾", + "flower_playing_cards": "🎴", + "flushed": "😳", + "flying_disc": "🥏", + "flying_saucer": "🛸", + "fog": "🌫", + "foggy": "🌁", + "foot": "🦶", + "football": "🏈", + "footprints": "👣", + "fork_and_knife": "🍴", + "fork_and_knife_with_plate": "🍽", + "fortune_cookie": "🥠", + "fountain": "⛲", + "fountain_pen": "🖋", + "four": "4⃣", + "four_leaf_clover": "🍀", + "fox": "🦊", + "framed_picture": "🖼", + "free": "🆓", + "french_bread": "🥖", + "fried_shrimp": "🍤", + "fries": "🍟", + "frog": "🐸", + "frowning": "😦", + "frowning_face": "☹️", + "fuelpump": "⛽", + "full_moon": "🌕", + "full_moon_with_face": "🌝", + "funeral_urn": "⚱️", + "game_die": "🎲", + "garlic": "🧄", + "gear": "⚙️", + "gem": "💎", + "gemini": "♊", + "genie": "🧞", + "ghost": "👻", + "gift": "🎁", + "gift_heart": "💝", + "giraffe": "🦒", + "girl": "👧", + "glass_of_milk": "🥛", + "globe_with_meridians": "🌐", + "gloves": "🧤", + "goal": "🥅", + "goal_net": "🥅", + "goat": "🐐", + "goggles": "🥽", + "golf": "⛳", + "golfer": "🏌", + "gorilla": "🦍", + "grapes": "🍇", + "green_apple": "🍏", + "green_book": "📗", + "green_circle": "🟢", + "green_heart": "💚", + "green_salad": "🥗", + "green_square": "🟩", + "grey_exclamation": "❕", + "grey_question": "❔", + "grimacing": "😬", + "grin": "😁", + "grinning": "😀", + "guard": "💂", + "guardsman": "💂", + "guide_dog": "🦮", + "guitar": "🎸", + "gun": "🔫", + "haircut": "💇", + "hamburger": "🍔", + "hammer": "🔨", + "hammer_and_pick": "⚒️", + "hammer_and_wrench": "🛠", + "hamster": "🐹", + "hand_with_fingers_splayed": "🖐", + "handbag": "👜", + "handshake": "🤝", + "hash": "#⃣", + "hatched_chick": "🐥", + "hatching_chick": "🐣", + "head_bandage": "🤕", + "headphones": "🎧", + "hear_no_evil": "🙉", + "heart": "❤️", + "heart_decoration": "💟", + "heart_exclamation": "❣", + "heart_eyes": "😍", + "heart_eyes_cat": "😻", + "heart_suit": "♥️", + "heartbeat": "💓", + "heartpulse": "💗", + "hearts": "♥", + "heavy_check_mark": "✔️", + "heavy_division_sign": "➗", + "heavy_dollar_sign": "💲", + "heavy_minus_sign": "➖", + "heavy_multiplication_x": "✖️", + "heavy_plus_sign": "➕", + "hedgehog": "🦔", + "helicopter": "🚁", + "herb": "🌿", + "hibiscus": "🌺", + "high_brightness": "🔆", + "high_heel": "👠", + "hiking_boot": "🥾", + "hindu_temple": "🛕", + "hippopotamus": "🦛", + "hockey": "🏒", + "hole": "🕳", + "honey_pot": "🍯", + "horse": "🐴", + "horse_racing": "🏇", + "hospital": "🏥", + "hot_face": "🥵", + "hot_pepper": "🌶", + "hot_springs": "♨", + "hotdog": "🌭", + "hotel": "🏨", + "hotsprings": "♨️", + "hourglass": "⌛", + "hourglass_flowing_sand": "⏳", + "house": "🏠", + "house_with_garden": "🏡", + "houses": "🏘", + "hugging": "🤗", + "hundred_points": "💯", + "hushed": "😯", + "ice": "🧊", + "ice_cream": "🍨", + "ice_hockey": "🏒", + "ice_skate": "⛸️", + "icecream": "🍦", + "id": "🆔", + "ideograph_advantage": "🉐", + "imp": "👿", + "inbox_tray": "📥", + "incoming_envelope": "📨", + "index_pointing_up": "☝", + "infinity": "♾", + "information": "ℹ️", + "information_desk_person": "💁", + "information_source": "ℹ", + "innocent": "😇", + "input_numbers": "🔢", + "interrobang": "⁉️", + "iphone": "📱", + "izakaya_lantern": "🏮", + "jack_o_lantern": "🎃", + "japan": "🗾", + "japanese_castle": "🏯", + "japanese_congratulations_button": "㊗️", + "japanese_free_of_charge_button": "🈚", + "japanese_goblin": "👺", + "japanese_ogre": "👹", + "japanese_reserved_button": "🈯", + "japanese_secret_button": "㊙️", + "japanese_service_charge_button": "🈂", + "jeans": "👖", + "joy": "😂", + "joy_cat": "😹", + "joystick": "🕹", + "kaaba": "🕋", + "kangaroo": "🦘", + "key": "🔑", + "keyboard": "⌨️", + "keycap_ten": "🔟", + "kick_scooter": "🛴", + "kimono": "👘", + "kiss": "💋", + "kissing": "😗", + "kissing_cat": "😽", + "kissing_closed_eyes": "😚", + "kissing_heart": "😘", + "kissing_smiling_eyes": "😙", + "kitchen_knife": "🔪", + "kite": "🪁", + "kiwi": "🥝", + "kiwi_fruit": "🥝", + "knife": "🔪", + "koala": "🐨", + "koko": "🈁", + "lab_coat": "🥼", + "label": "🏷", + "lacrosse": "🥍", + "large_blue_diamond": "🔷", + "large_orange_diamond": "🔶", + "last_quarter_moon": "🌗", + "last_quarter_moon_with_face": "🌜", + "last_track_button": "⏮️", + "latin_cross": "✝", + "laughing": "😆", + "leafy_green": "🥬", + "leaves": "🍃", + "ledger": "📒", + "left_arrow": "⬅", + "left_arrow_curving_right": "↪", + "left_facing_fist": "🤛", + "left_luggage": "🛅", + "left_right_arrow": "↔", + "leftfacing_fist": "🤛", + "leftright_arrow": "↔️", + "leftwards_arrow_with_hook": "↩️", + "leg": "🦵", + "lemon": "🍋", + "leo": "♌", + "leopard": "🐆", + "level_slider": "🎚", + "libra": "♎", + "light_rail": "🚈", + "light_skin_tone": "🏻", + "link": "🔗", + "linked_paperclips": "🖇", + "lion_face": "🦁", + "lips": "👄", + "lipstick": "💄", + "lizard": "🦎", + "llama": "🦙", + "lobster": "🦞", + "lock": "🔒", + "lock_with_ink_pen": "🔏", + "lollipop": "🍭", + "loop": "➿", + "lotion_bottle": "🧴", + "loud_sound": "🔊", + "loudspeaker": "📢", + "love_hotel": "🏩", + "love_letter": "💌", + "love_you_gesture": "🤟", + "loveyou_gesture": "🤟", + "low_brightness": "🔅", + "luggage": "🧳", + "lying_face": "🤥", + "m": "Ⓜ️", + "mag": "🔍", + "mag_right": "🔎", + "mage": "🧙", + "magnet": "🧲", + "mahjong": "🀄", + "mailbox": "📫", + "mailbox_closed": "📪", + "mailbox_with_mail": "📬", + "mailbox_with_no_mail": "📭", + "male_sign": "♂", + "man": "👨", + "man_dancing": "🕺", + "man_in_suit": "🕴", + "man_in_tuxedo": "🤵", + "man_with_chinese_cap": "👲", + "man_with_gua_pi_mao": "👲", + "man_with_turban": "👳", + "mango": "🥭", + "mans_shoe": "👞", + "mantelpiece_clock": "🕰", + "manual_wheelchair": "🦽", + "maple_leaf": "🍁", + "martial_arts_uniform": "🥋", + "mask": "😷", + "massage": "💆", + "mate": "🧉", + "meat_on_bone": "🍖", + "mechanical_arm": "🦾", + "mechanical_leg": "🦿", + "medal": "🏅", + "medical_symbol": "⚕", + "medium_skin_tone": "🏽", + "mediumdark_skin_tone": "🏾", + "mediumlight_skin_tone": "🏼", + "mega": "📣", + "melon": "🍈", + "memo": "📝", + "menorah": "🕎", + "mens": "🚹", + "merperson": "🧜", + "metal": "🤘", + "metro": "🚇", + "microbe": "🦠", + "microphone": "🎤", + "microscope": "🔬", + "middle_finger": "🖕", + "military_medal": "🎖", + "milk": "🥛", + "milky_way": "🌌", + "minibus": "🚐", + "minidisc": "💽", + "mobile_phone_off": "📴", + "money_mouth": "🤑", + "money_with_wings": "💸", + "moneybag": "💰", + "moneymouth_face": "🤑", + "monkey": "🐒", + "monkey_face": "🐵", + "monorail": "🚝", + "moon_cake": "🥮", + "mortar_board": "🎓", + "mosque": "🕌", + "mosquito": "🦟", + "motor_boat": "🛥", + "motor_scooter": "🛵", + "motorcycle": "🏍", + "motorized_wheelchair": "🦼", + "motorway": "🛣", + "mount_fuji": "🗻", + "mountain": "⛰️", + "mountain_bicyclist": "🚵", + "mountain_cableway": "🚠", + "mountain_railway": "🚞", + "mouse": "🐭", + "mouse2": "🐁", + "movie_camera": "🎥", + "moyai": "🗿", + "mrs_claus": "🤶", + "multiplication_sign": "✖", + "muscle": "💪", + "mushroom": "🍄", + "musical_keyboard": "🎹", + "musical_note": "🎵", + "musical_score": "🎼", + "mute": "🔇", + "nail_care": "💅", + "name_badge": "📛", + "national_park": "🏞", + "nauseated_face": "🤢", + "nazar_amulet": "🧿", + "necktie": "👔", + "negative_squared_cross_mark": "❎", + "nerd": "🤓", + "neutral_face": "😐", + "new": "🆕", + "new_moon": "🌑", + "new_moon_with_face": "🌚", + "newspaper": "📰", + "next_track_button": "⏭️", + "ng": "🆖", + "night_with_stars": "🌃", + "nine": "9⃣", + "no_bell": "🔕", + "no_bicycles": "🚳", + "no_entry": "⛔", + "no_entry_sign": "🚫", + "no_good": "🙅", + "no_mobile_phones": "📵", + "no_mouth": "😶", + "no_pedestrians": "🚷", + "no_smoking": "🚭", + "non-potable_water": "🚱", + "nose": "👃", + "notebook": "📓", + "notebook_with_decorative_cover": "📔", + "notes": "🎶", + "nut_and_bolt": "🔩", + "o": "⭕", + "o_button_blood_type": "🅾", + "ocean": "🌊", + "octagonal_sign": "🛑", + "octopus": "🐙", + "oden": "🍢", + "office": "🏢", + "oil_drum": "🛢", + "ok": "🆗", + "ok_hand": "👌", + "ok_woman": "🙆", + "old_key": "🗝", + "older_adult": "🧓", + "older_man": "👴", + "older_person": "🧓", + "older_woman": "👵", + "om_symbol": "🕉", + "on": "🔛", + "oncoming_automobile": "🚘", + "oncoming_bus": "🚍", + "oncoming_fist": "👊", + "oncoming_police_car": "🚔", + "oncoming_taxi": "🚖", + "one": "1⃣", + "onepiece_swimsuit": "🩱", + "onion": "🧅", + "open_file_folder": "📂", + "open_hands": "👐", + "open_mouth": "😮", + "ophiuchus": "⛎", + "orange_book": "📙", + "orange_circle": "🟠", + "orange_heart": "🧡", + "orange_square": "🟧", + "orangutan": "🦧", + "orthodox_cross": "☦️", + "otter": "🦦", + "outbox_tray": "📤", + "owl": "🦉", + "ox": "🐂", + "oyster": "🦪", + "p_button": "🅿", + "package": "📦", + "page_facing_up": "📄", + "page_with_curl": "📃", + "pager": "📟", + "paintbrush": "🖌", + "palm_tree": "🌴", + "palms_up_together": "🤲", + "pancakes": "🥞", + "panda_face": "🐼", + "paperclip": "📎", + "parachute": "🪂", + "parrot": "🦜", + "part_alternation_mark": "〽", + "partly_sunny": "⛅", + "partying_face": "🥳", + "passenger_ship": "🛳", + "passport_control": "🛂", + "pause_button": "⏸️", + "peace": "☮", + "peace_symbol": "☮️", + "peach": "🍑", + "peacock": "🦚", + "peanuts": "🥜", + "pear": "🍐", + "pen": "🖊", + "pencil": "📝", + "pencil2": "✏", + "penguin": "🐧", + "pensive": "😔", + "people_with_bunny_ears_partying": "👯", + "people_wrestling": "🤼", + "performing_arts": "🎭", + "persevere": "😣", + "person": "🧑", + "person_biking": "🚴", + "person_bouncing_ball": "⛹️", + "person_bowing": "🙇", + "person_cartwheeling": "🤸", + "person_climbing": "🧗", + "person_doing_cartwheel": "🤸", + "person_facepalming": "🤦", + "person_fencing": "🤺", + "person_frowning": "🙍", + "person_gesturing_no": "🙅", + "person_gesturing_ok": "🙆", + "person_getting_haircut": "💇", + "person_getting_massage": "💆", + "person_in_lotus_position": "🧘", + "person_in_steamy_room": "🧖", + "person_juggling": "🤹", + "person_kneeling": "🧎", + "person_mountain_biking": "🚵", + "person_playing_handball": "🤾", + "person_playing_water_polo": "🤽", + "person_pouting": "🙎", + "person_raising_hand": "🙋", + "person_rowing_boat": "🚣", + "person_running": "🏃", + "person_shrugging": "🤷", + "person_standing": "🧍", + "person_surfing": "🏄", + "person_swimming": "🏊", + "person_tipping_hand": "💁", + "person_walking": "🚶", + "person_wearing_turban": "👳", + "person_with_blond_hair": "👱", + "person_with_pouting_face": "🙎", + "petri_dish": "🧫", + "pick": "⛏️", + "pie": "🥧", + "pig": "🐷", + "pig2": "🐖", + "pig_nose": "🐽", + "pill": "💊", + "pinching_hand": "🤏", + "pineapple": "🍍", + "ping_pong": "🏓", + "pisces": "♓", + "pizza": "🍕", + "place_of_worship": "🛐", + "play_button": "▶", + "play_or_pause_button": "⏯️", + "play_pause": "⏯", + "pleading_face": "🥺", + "point_down": "👇", + "point_left": "👈", + "point_right": "👉", + "point_up": "☝️", + "point_up_2": "👆", + "police_car": "🚓", + "police_officer": "👮", + "poodle": "🐩", + "poop": "💩", + "popcorn": "🍿", + "post_office": "🏣", + "postal_horn": "📯", + "postbox": "📮", + "potable_water": "🚰", + "potato": "🥔", + "pouch": "👝", + "poultry_leg": "🍗", + "pound": "💷", + "pouting_cat": "😾", + "pray": "🙏", + "prayer_beads": "📿", + "pregnant_woman": "🤰", + "pretzel": "🥨", + "prince": "🤴", + "princess": "👸", + "printer": "🖨", + "probing_cane": "🦯", + "punch": "👊", + "purple_circle": "🟣", + "purple_heart": "💜", + "purse": "👛", + "pushpin": "📌", + "put_litter_in_its_place": "🚮", + "puzzle_piece": "🧩", + "question": "❓", + "rabbit": "🐰", + "rabbit2": "🐇", + "raccoon": "🦝", + "racehorse": "🐎", + "racing_car": "🏎", + "radio": "📻", + "radio_button": "🔘", + "radioactive": "☢️", + "rage": "😡", + "railway_car": "🚃", + "railway_track": "🛤", + "rainbow": "🌈", + "raised_back_of_hand": "🤚", + "raised_hand": "✋", + "raised_hands": "🙌", + "raising_hand": "🙋", + "ram": "🐏", + "ramen": "🍜", + "rat": "🐀", + "razor": "🪒", + "receipt": "🧾", + "record_button": "⏺️", + "recycle": "♻", + "recycling_symbol": "♻️", + "red_car": "🚗", + "red_circle": "🔴", + "red_envelope": "🧧", + "red_hair": "🦰", + "red_heart": "❤", + "red_square": "🟥", + "regional_indicator_a": "🇦", + "regional_indicator_b": "🇧", + "regional_indicator_c": "🇨", + "regional_indicator_d": "🇩", + "regional_indicator_e": "🇪", + "regional_indicator_f": "🇫", + "regional_indicator_g": "🇬", + "regional_indicator_h": "🇭", + "regional_indicator_i": "🇮", + "regional_indicator_j": "🇯", + "regional_indicator_k": "🇰", + "regional_indicator_l": "🇱", + "regional_indicator_m": "🇲", + "regional_indicator_n": "🇳", + "regional_indicator_o": "🇴", + "regional_indicator_p": "🇵", + "regional_indicator_q": "🇶", + "regional_indicator_r": "🇷", + "regional_indicator_s": "🇸", + "regional_indicator_t": "🇹", + "regional_indicator_u": "🇺", + "regional_indicator_v": "🇻", + "regional_indicator_w": "🇼", + "regional_indicator_x": "🇽", + "regional_indicator_y": "🇾", + "regional_indicator_z": "🇿", + "registered": "®", + "relieved": "😌", + "reminder_ribbon": "🎗", + "repeat": "🔁", + "repeat_one": "🔂", + "rescue_worker’s_helmet": "⛑️", + "restroom": "🚻", + "reverse_button": "◀", + "revolving_hearts": "💞", + "rewind": "⏪", + "rhino": "🦏", + "rhinoceros": "🦏", + "ribbon": "🎀", + "rice": "🍚", + "rice_ball": "🍙", + "rice_cracker": "🍘", + "rice_scene": "🎑", + "right_arrow": "➡️", + "right_arrow_curving_down": "⤵", + "right_arrow_curving_left": "↩", + "right_arrow_curving_up": "⤴", + "right_facing_fist": "🤜", + "rightfacing_fist": "🤜", + "ring": "💍", + "ringed_planet": "🪐", + "robot": "🤖", + "rocket": "🚀", + "rofl": "🤣", + "roll_of_paper": "🧻", + "rolledup_newspaper": "🗞", + "roller_coaster": "🎢", + "rolling_eyes": "🙄", + "rolling_on_the_floor_laughing": "🤣", + "rooster": "🐓", + "rose": "🌹", + "rosette": "🏵", + "rotating_light": "🚨", + "round_pushpin": "📍", + "rowboat": "🚣", + "rugby_football": "🏉", + "runner": "🏃", + "running_shirt_with_sash": "🎽", + "safety_pin": "🧷", + "safety_vest": "🦺", + "sagittarius": "♐", + "sailboat": "⛵", + "sake": "🍶", + "salad": "🥗", + "salt": "🧂", + "sandal": "👡", + "sandwich": "🥪", + "santa": "🎅", + "sari": "🥻", + "satellite": "📡", + "sauropod": "🦕", + "saxophone": "🎷", + "scales": "⚖", + "scarf": "🧣", + "school": "🏫", + "school_satchel": "🎒", + "scissors": "✂", + "scooter": "🛴", + "scorpion": "🦂", + "scorpius": "♏", + "scream": "😱", + "scream_cat": "🙀", + "scroll": "📜", + "seat": "💺", + "second_place": "🥈", + "secret": "㊙", + "see_no_evil": "🙈", + "seedling": "🌱", + "selfie": "🤳", + "seven": "7⃣", + "shallow_pan_of_food": "🥘", + "shamrock": "☘️", + "shark": "🦈", + "shaved_ice": "🍧", + "sheep": "🐑", + "shell": "🐚", + "shield": "🛡", + "shinto_shrine": "⛩️", + "ship": "🚢", + "shirt": "👕", + "shopping_bags": "🛍", + "shopping_cart": "🛒", + "shorts": "🩳", + "shower": "🚿", + "shrimp": "🦐", + "shushing_face": "🤫", + "sign_of_the_horns": "🤘", + "signal_strength": "📶", + "six": "6⃣", + "six_pointed_star": "🔯", + "skateboard": "🛹", + "ski": "🎿", + "skier": "⛷️", + "skull": "💀", + "skull_and_crossbones": "☠️", + "skull_crossbones": "☠", + "skunk": "🦨", + "sled": "🛷", + "sleeping": "😴", + "sleeping_accommodation": "🛌", + "sleepy": "😪", + "slight_frown": "🙁", + "slight_smile": "🙂", + "slightly_frowning_face": "🙁", + "slot_machine": "🎰", + "sloth": "🦥", + "small_airplane": "🛩", + "small_blue_diamond": "🔹", + "small_orange_diamond": "🔸", + "small_red_triangle": "🔺", + "small_red_triangle_down": "🔻", + "smile": "😄", + "smile_cat": "😸", + "smiley": "😃", + "smiley_cat": "😺", + "smiling": "☺️", + "smiling_face": "☺", + "smiling_face_with_hearts": "🥰", + "smiling_imp": "😈", + "smirk": "😏", + "smirk_cat": "😼", + "smoking": "🚬", + "snail": "🐌", + "snake": "🐍", + "sneezing_face": "🤧", + "snowboarder": "🏂", + "snowcapped_mountain": "🏔", + "snowflake": "❄", + "snowman": "⛄", + "soap": "🧼", + "sob": "😭", + "soccer": "⚽", + "socks": "🧦", + "softball": "🥎", + "soon": "🔜", + "sos": "🆘", + "sound": "🔉", + "space_invader": "👾", + "spade_suit": "♠️", + "spades": "♠", + "spaghetti": "🍝", + "sparkle": "❇", + "sparkler": "🎇", + "sparkles": "✨", + "sparkling_heart": "💖", + "speak_no_evil": "🙊", + "speaker": "🔈", + "speaking_head": "🗣", + "speech_balloon": "💬", + "speech_left": "🗨", + "speedboat": "🚤", + "spider": "🕷", + "spider_web": "🕸", + "spiral_calendar": "🗓", + "spiral_notepad": "🗒", + "sponge": "🧽", + "spoon": "🥄", + "squid": "🦑", + "stadium": "🏟", + "star": "⭐", + "star2": "🌟", + "star_and_crescent": "☪️", + "star_of_david": "✡", + "star_struck": "🤩", + "stars": "🌠", + "starstruck": "🤩", + "station": "🚉", + "statue_of_liberty": "🗽", + "steam_locomotive": "🚂", + "stethoscope": "🩺", + "stew": "🍲", + "stop_button": "⏹️", + "stopwatch": "⏱️", + "straight_ruler": "📏", + "strawberry": "🍓", + "stuck_out_tongue": "😛", + "stuck_out_tongue_closed_eyes": "😝", + "stuck_out_tongue_winking_eye": "😜", + "studio_microphone": "🎙", + "stuffed_flatbread": "🥙", + "sun": "☀", + "sun_behind_large_cloud": "🌥", + "sun_behind_rain_cloud": "🌦", + "sun_behind_small_cloud": "🌤", + "sun_with_face": "🌞", + "sunflower": "🌻", + "sunglasses": "😎", + "sunny": "☀️", + "sunrise": "🌅", + "sunrise_over_mountains": "🌄", + "superhero": "🦸", + "supervillain": "🦹", + "surfer": "🏄", + "sushi": "🍣", + "suspension_railway": "🚟", + "swan": "🦢", + "sweat": "😓", + "sweat_drops": "💦", + "sweat_smile": "😅", + "sweet_potato": "🍠", + "swimmer": "🏊", + "symbols": "🔣", + "synagogue": "🕍", + "syringe": "💉", + "t_rex": "🦖", + "taco": "🌮", + "tada": "🎉", + "takeout_box": "🥡", + "tanabata_tree": "🎋", + "tangerine": "🍊", + "taurus": "♉", + "taxi": "🚕", + "tea": "🍵", + "teddy_bear": "🧸", + "telephone": "☎", + "telephone_receiver": "📞", + "telescope": "🔭", + "tennis": "🎾", + "tent": "⛺", + "test_tube": "🧪", + "thermometer": "🌡", + "thermometer_face": "🤒", + "thinking": "🤔", + "third_place": "🥉", + "thought_balloon": "💭", + "thread": "🧵", + "three": "3⃣", + "thumbsdown": "👎", + "thumbsup": "👍", + "ticket": "🎫", + "tiger": "🐯", + "tiger2": "🐅", + "timer_clock": "⏲️", + "tired_face": "😫", + "tm": "™", + "toilet": "🚽", + "tokyo_tower": "🗼", + "tomato": "🍅", + "tone1": "🏻", + "tone2": "🏼", + "tone3": "🏽", + "tone4": "🏾", + "tone5": "🏿", + "tongue": "👅", + "toolbox": "🧰", + "tooth": "🦷", + "top": "🔝", + "tophat": "🎩", + "tornado": "🌪", + "track_next": "⏭", + "track_previous": "⏮", + "trackball": "🖲", + "tractor": "🚜", + "trade_mark": "™️", + "traffic_light": "🚥", + "train": "🚋", + "train2": "🚆", + "tram": "🚊", + "trex": "🦖", + "triangular_flag_on_post": "🚩", + "triangular_ruler": "📐", + "trident": "🔱", + "triumph": "😤", + "trolleybus": "🚎", + "trophy": "🏆", + "tropical_drink": "🍹", + "tropical_fish": "🐠", + "truck": "🚚", + "trumpet": "🎺", + "tulip": "🌷", + "tumbler_glass": "🥃", + "turkey": "🦃", + "turtle": "🐢", + "tv": "📺", + "twisted_rightwards_arrows": "🔀", + "two": "2⃣", + "two_hearts": "💕", + "two_men_holding_hands": "👬", + "two_women_holding_hands": "👭", + "u5272": "🈹", + "u5408": "🈴", + "u55b6": "🈺", + "u6307": "🈯", + "u6708": "🈷", + "u6709": "🈶", + "u6e80": "🈵", + "u7121": "🈚", + "u7533": "🈸", + "u7981": "🈲", + "u7a7a": "🈳", + "umbrella": "☔", + "umbrella_on_ground": "⛱️", + "unamused": "😒", + "underage": "🔞", + "unicorn": "🦄", + "unlock": "🔓", + "up": "🆙", + "up_arrow": "⬆", + "updown_arrow": "↕️", + "upleft_arrow": "↖️", + "upright_arrow": "↗", + "upside_down": "🙃", + "v": "✌️", + "vampire": "🧛", + "vertical_traffic_light": "🚦", + "vhs": "📼", + "vibration_mode": "📳", + "victory_hand": "✌", + "video_camera": "📹", + "video_game": "🎮", + "violin": "🎻", + "virgo": "♍", + "volcano": "🌋", + "volleyball": "🏐", + "vs": "🆚", + "vulcan": "🖖", + "vulcan_salute": "🖖", + "waffle": "🧇", + "walking": "🚶", + "waning_crescent_moon": "🌘", + "waning_gibbous_moon": "🌖", + "warning": "⚠", + "wastebasket": "🗑", + "watch": "⌚", + "water_buffalo": "🐃", + "watermelon": "🍉", + "wave": "👋", + "wavy_dash": "〰️", + "waxing_crescent_moon": "🌒", + "waxing_gibbous_moon": "🌔", + "wc": "🚾", + "weary": "😩", + "wedding": "💒", + "weightlifter": "🏋", + "whale": "🐳", + "whale2": "🐋", + "wheel_of_dharma": "☸️", + "wheelchair": "♿", + "white_check_mark": "✅", + "white_circle": "⚪", + "white_flower": "💮", + "white_hair": "🦳", + "white_heart": "🤍", + "white_large_square": "⬜", + "white_medium_small_square": "◽", + "white_medium_square": "◻️", + "white_small_square": "▫️", + "white_square_button": "🔳", + "wilted_flower": "🥀", + "wilted_rose": "🥀", + "wind_blowing_face": "🌬", + "wind_chime": "🎐", + "wine_glass": "🍷", + "wink": "😉", + "wolf": "🐺", + "woman": "👩", + "woman_with_headscarf": "🧕", + "womans_clothes": "👚", + "womans_hat": "👒", + "womens": "🚺", + "woozy_face": "🥴", + "world_map": "🗺", + "worried": "😟", + "wrench": "🔧", + "writing_hand": "✍️", + "x": "❌", + "yarn": "🧶", + "yawning_face": "🥱", + "yellow_circle": "🟡", + "yellow_heart": "💛", + "yellow_square": "🟨", + "yen": "💴", + "yin_yang": "☯️", + "yoyo": "🪀", + "yum": "😋", + "zany_face": "🤪", + "zap": "⚡", + "zebra": "🦓", + "zero": "0⃣", + "zipper_mouth": "🤐", + "zombie": "🧟", + "zzz": "💤" +}
\ No newline at end of file diff --git a/static/fontello.json b/static/fontello.json deleted file mode 100644 index b0136fd9..00000000 --- a/static/fontello.json +++ /dev/null @@ -1,416 +0,0 @@ -{ - "name": "", - "css_prefix_text": "icon-", - "css_use_suffix": false, - "hinting": true, - "units_per_em": 1000, - "ascent": 857, - "glyphs": [ - { - "uid": "9bd60140934a1eb9236fd7a8ab1ff6ba", - "css": "spin4", - "code": 59444, - "src": "fontelico" - }, - { - "uid": "5211af474d3a9848f67f945e2ccaf143", - "css": "cancel", - "code": 59392, - "src": "fontawesome" - }, - { - "uid": "eeec3208c90b7b48e804919d0d2d4a41", - "css": "upload", - "code": 59393, - "src": "fontawesome" - }, - { - "uid": "2a6740fc2f9d0edea54205963f662594", - "css": "spin3", - "code": 59442, - "src": "fontelico" - }, - { - "uid": "c6be5a58ee4e63a5ec399c2b0d15cf2c", - "css": "reply", - "code": 61714, - "src": "fontawesome" - }, - { - "uid": "474656633f79ea2f1dad59ff63f6bf07", - "css": "star", - "code": 59394, - "src": "fontawesome" - }, - { - "uid": "d17030afaecc1e1c22349b99f3c4992a", - "css": "star-empty", - "code": 59395, - "src": "fontawesome" - }, - { - "uid": "09feb4465d9bd1364f4e301c9ddbaa92", - "css": "retweet", - "code": 59396, - "src": "fontawesome" - }, - { - "uid": "7fd683b2c518ceb9e5fa6757f2276faa", - "css": "eye-off", - "code": 59397, - "src": "fontawesome" - }, - { - "uid": "73ffeb70554099177620847206c12457", - "css": "binoculars", - "code": 61925, - "src": "fontawesome" - }, - { - "uid": "e99461abfef3923546da8d745372c995", - "css": "cog", - "code": 59399, - "src": "fontawesome" - }, - { - "uid": "1bafeeb1808a5fe24484c7890096901a", - "css": "user-plus", - "code": 62004, - "src": "fontawesome" - }, - { - "uid": "559647a6f430b3aeadbecd67194451dd", - "css": "menu", - "code": 61641, - "src": "fontawesome" - }, - { - "uid": "0d20938846444af8deb1920dc85a29fb", - "css": "logout", - "code": 59400, - "src": "fontawesome" - }, - { - "uid": "ccddff8e8670dcd130e3cb55fdfc2fd0", - "css": "down-open", - "code": 59401, - "src": "fontawesome" - }, - { - "uid": "44b9e75612c5fad5505edd70d071651f", - "css": "attach", - "code": 59402, - "src": "entypo" - }, - { - "uid": "e15f0d620a7897e2035c18c80142f6d9", - "css": "link-ext", - "code": 61582, - "src": "fontawesome" - }, - { - "uid": "e35de5ea31cd56970498e33efbcb8e36", - "css": "link-ext-alt", - "code": 61583, - "src": "fontawesome" - }, - { - "uid": "381da2c2f7fd51f8de877c044d7f439d", - "css": "picture", - "code": 59403, - "src": "fontawesome" - }, - { - "uid": "872d9516df93eb6b776cc4d94bd97dac", - "css": "video", - "code": 59404, - "src": "fontawesome" - }, - { - "uid": "399ef63b1e23ab1b761dfbb5591fa4da", - "css": "right-open", - "code": 59405, - "src": "fontawesome" - }, - { - "uid": "d870630ff8f81e6de3958ecaeac532f2", - "css": "left-open", - "code": 59406, - "src": "fontawesome" - }, - { - "uid": "fe6697b391355dec12f3d86d6d490397", - "css": "up-open", - "code": 59407, - "src": "fontawesome" - }, - { - "uid": "9c1376672bb4f1ed616fdd78a23667e9", - "css": "comment-empty", - "code": 61669, - "src": "fontawesome" - }, - { - "uid": "ccc2329632396dc096bb638d4b46fb98", - "css": "mail-alt", - "code": 61664, - "src": "fontawesome" - }, - { - "uid": "c1f1975c885aa9f3dad7810c53b82074", - "css": "lock", - "code": 59409, - "src": "fontawesome" - }, - { - "uid": "05376be04a27d5a46e855a233d6e8508", - "css": "lock-open-alt", - "code": 61758, - "src": "fontawesome" - }, - { - "uid": "197375a3cea8cb90b02d06e4ddf1433d", - "css": "globe", - "code": 59410, - "src": "fontawesome" - }, - { - "uid": "b3a9e2dab4d19ea3b2f628242c926bfe", - "css": "brush", - "code": 59411, - "src": "iconic" - }, - { - "uid": "9dd9e835aebe1060ba7190ad2b2ed951", - "css": "search", - "code": 59398, - "src": "fontawesome" - }, - { - "uid": "ca90da02d2c6a3183f2458e4dc416285", - "css": "adjust", - "code": 59414, - "src": "fontawesome" - }, - { - "uid": "5e2ab018e3044337bcef5f7e94098ea1", - "css": "thumbs-up-alt", - "code": 61796, - "src": "fontawesome" - }, - { - "uid": "c76b7947c957c9b78b11741173c8349b", - "css": "attention", - "code": 59412, - "src": "fontawesome" - }, - { - "uid": "1a5cfa186647e8c929c2b17b9fc4dac1", - "css": "plus-squared", - "code": 61694, - "src": "fontawesome" - }, - { - "uid": "44e04715aecbca7f266a17d5a7863c68", - "css": "plus", - "code": 59413, - "src": "fontawesome" - }, - { - "uid": "41087bc74d4b20b55059c60a33bf4008", - "css": "edit", - "code": 59415, - "src": "fontawesome" - }, - { - "uid": "5717236f6134afe2d2a278a5c9b3927a", - "css": "play-circled", - "code": 61764, - "src": "fontawesome" - }, - { - "uid": "d35a1d35efeb784d1dc9ac18b9b6c2b6", - "css": "pencil", - "code": 59416, - "src": "fontawesome" - }, - { - "uid": "266d5d9adf15a61800477a5acf9a4462", - "css": "chart-bar", - "code": 59419, - "src": "fontawesome" - }, - { - "uid": "d862a10e1448589215be19702f98f2c1", - "css": "smile", - "code": 61720, - "src": "fontawesome" - }, - { - "uid": "671f29fa10dda08074a4c6a341bb4f39", - "css": "bell-alt", - "code": 61683, - "src": "fontawesome" - }, - { - "uid": "5bb103cd29de77e0e06a52638527b575", - "css": "wrench", - "code": 59418, - "src": "fontawesome" - }, - { - "uid": "5b0772e9484a1a11646793a82edd622a", - "css": "pin", - "code": 59417, - "src": "fontawesome" - }, - { - "uid": "22411a88489225a018f68db737de3c77", - "css": "ellipsis", - "code": 61761, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M214 411V518Q214 540 199 556T161 571H54Q31 571 16 556T0 518V411Q0 388 16 373T54 357H161Q183 357 199 373T214 411ZM500 411V518Q500 540 484 556T446 571H339Q317 571 301 556T286 518V411Q286 388 301 373T339 357H446Q469 357 484 373T500 411ZM786 411V518Q786 540 770 556T732 571H625Q603 571 587 556T571 518V411Q571 388 587 373T625 357H732Q755 357 770 373T786 411Z", - "width": 785.7 - }, - "search": [ - "ellipsis" - ] - }, - { - "uid": "0bef873af785ead27781fdf98b3ae740", - "css": "bell-ringing-o", - "code": 59408, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M497.8 0C468.3 0 444.4 23.9 444.4 53.3 444.4 61.1 446.1 68.3 448.9 75 301.7 96.7 213.3 213.3 213.3 320 213.3 588.3 117.8 712.8 35.6 782.2 35.6 821.1 67.8 853.3 106.7 853.3H355.6C355.6 931.7 419.4 995.6 497.8 995.6S640 931.7 640 853.3H888.9C927.8 853.3 960 821.1 960 782.2 877.8 712.8 782.2 588.3 782.2 320 782.2 213.3 693.9 96.7 546.7 75 549.4 68.3 551.1 61.1 551.1 53.3 551.1 23.9 527.2 0 497.8 0ZM189.4 44.8C108.4 118.6 70.5 215.1 71.1 320.2L142.2 319.8C141.7 231.2 170.4 158.3 237.3 97.4L189.4 44.8ZM806.2 44.8L758.3 97.4C825.2 158.3 853.9 231.2 853.3 319.8L924.4 320.2C925.1 215.1 887.2 118.6 806.2 44.8ZM408.9 844.4C413.9 844.4 417.8 848.3 417.8 853.3 417.8 897.2 453.9 933.3 497.8 933.3 502.8 933.3 506.7 937.2 506.7 942.2S502.8 951.1 497.8 951.1C443.9 951.1 400 907.2 400 853.3 400 848.3 403.9 844.4 408.9 844.4Z", - "width": 1000 - }, - "search": [ - "bell-ringing-o" - ] - }, - { - "uid": "0b2b66e526028a6972d51a6f10281b4b", - "css": "zoom-in", - "code": 59420, - "src": "fontawesome" - }, - { - "uid": "0bda4bc779d4c32623dec2e43bd67ee8", - "css": "gauge", - "code": 61668, - "src": "fontawesome" - }, - { - "uid": "31972e4e9d080eaa796290349ae6c1fd", - "css": "users", - "code": 59421, - "src": "fontawesome" - }, - { - "uid": "e82cedfa1d5f15b00c5a81c9bd731ea2", - "css": "info-circled", - "code": 59423, - "src": "fontawesome" - }, - { - "uid": "w3nzesrlbezu6f30q7ytyq919p6gdlb6", - "css": "home-2", - "code": 59425, - "src": "typicons" - }, - { - "uid": "dcedf50ab1ede3283d7a6c70e2fe32f3", - "css": "chat", - "code": 59422, - "src": "fontawesome" - }, - { - "uid": "3a00327e61b997b58518bd43ed83c3df", - "css": "login", - "code": 59424, - "src": "fontawesome" - }, - { - "uid": "f3ebd6751c15a280af5cc5f4a764187d", - "css": "arrow-curved", - "code": 59426, - "src": "iconic" - }, - { - "uid": "0ddd3e8201ccc7d41f7b7c9d27eca6c1", - "css": "link", - "code": 59427, - "src": "fontawesome" - }, - { - "uid": "4aad6bb50b02c18508aae9cbe14e784e", - "css": "share", - "code": 61920, - "src": "fontawesome" - }, - { - "uid": "8b80d36d4ef43889db10bc1f0dc9a862", - "css": "user", - "code": 59428, - "src": "fontawesome" - }, - { - "uid": "12f4ece88e46abd864e40b35e05b11cd", - "css": "ok", - "code": 59431, - "src": "fontawesome" - }, - { - "uid": "4109c474ff99cad28fd5a2c38af2ec6f", - "css": "filter", - "code": 61616, - "src": "fontawesome" - }, - { - "uid": "9a76bc135eac17d2c8b8ad4a5774fc87", - "css": "download", - "code": 59429, - "src": "fontawesome" - }, - { - "uid": "f04a5d24e9e659145b966739c4fde82a", - "css": "bookmark", - "code": 59430, - "src": "fontawesome" - }, - { - "uid": "2f5ef6f6b7aaebc56458ab4e865beff5", - "css": "bookmark-empty", - "code": 61591, - "src": "fontawesome" - }, - { - "uid": "9ea0a737ccc45d6c510dcbae56058849", - "css": "music", - "code": 59432, - "src": "fontawesome" - }, - { - "uid": "1b5a5d7b7e3c71437f5a26befdd045ed", - "css": "doc", - "code": 59433, - "src": "fontawesome" - }, - { - "uid": "98d9c83c1ee7c2c25af784b518c522c5", - "css": "block", - "code": 59434, - "src": "fontawesome" - }, - { - "uid": "3e674995cacc2b09692c096ea7eb6165", - "css": "megaphone", - "code": 59435, - "src": "fontawesome" - } - ] -}
\ No newline at end of file diff --git a/static/logo.png b/static/logo.png Binary files differdeleted file mode 100644 index 7744b1ac..00000000 --- a/static/logo.png +++ /dev/null diff --git a/static/logo.svg b/static/logo.svg new file mode 100644 index 00000000..68e647e6 --- /dev/null +++ b/static/logo.svg @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="svg4485" + width="512" + height="512" + viewBox="0 0 512 512" + sodipodi:docname="logo.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"> + <metadata + id="metadata4491"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs4489" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1274" + inkscape:window-height="1410" + id="namedview4487" + showgrid="false" + inkscape:zoom="1.2636719" + inkscape:cx="305.99333" + inkscape:cy="304.30809" + inkscape:window-x="1280" + inkscape:window-y="22" + inkscape:window-maximized="0" + inkscape:current-layer="g4612" + inkscape:document-rotation="0" /> + <g + id="g4612"> + <g + id="g850" + transform="matrix(0.99659595,0,0,0.99659595,0.37313949,0.87143746)"> + <path + style="opacity:1;fill:#fba457;fill-opacity:1;stroke:#009bff;stroke-width:0;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.175879" + d="m 194.75841,124.65165 a 20.449443,20.449443 0 0 0 -20.44944,20.44945 v 242.24725 h 65.28091 v -262.6967 z" + id="path4497" /> + <path + style="fill:#fba457;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 272.6236,124.65165 V 256 h 45.61799 a 20.449443,20.449443 0 0 0 20.44944,-20.44945 v -110.8989 z" + id="path4516" /> + <path + style="opacity:1;fill:#fba457;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 272.6236,322.06744 v 65.28091 h 45.61799 a 20.449443,20.449443 0 0 0 20.44944,-20.44945 v -44.83146 z" + id="path4516-5" /> + </g> + </g> +</svg> diff --git a/static/terms-of-service.html b/static/terms-of-service.html index 3b6bbb36..2b7bf769 100644 --- a/static/terms-of-service.html +++ b/static/terms-of-service.html @@ -6,4 +6,4 @@ Pleroma install containing the real ToS for your instance.</p> <p>See the <a href='https://docs.pleroma.social/backend/configuration/static_dir/'>Pleroma documentation</a> for more information.</p> <br> -<img src="/static/logo.png" style="display: block; margin: auto; max-width: 100%; height: 50px; object-fit: contain;" /> +<img src="/static/logo.svg" style="display: block; margin: auto; max-width: 100%; height: 50px; object-fit: contain;" /> diff --git a/static/themes/redmond-xx-se.json b/static/themes/redmond-xx-se.json index 24480d2c..b62769db 100644 --- a/static/themes/redmond-xx-se.json +++ b/static/themes/redmond-xx-se.json @@ -267,6 +267,7 @@ }, "colors": { "bg": "#c0c0c0", + "wallpaper": "#008080", "text": "#000000", "link": "#0000ff", "accent": "#000080", diff --git a/static/themes/redmond-xx.json b/static/themes/redmond-xx.json index cf9010fe..83b59109 100644 --- a/static/themes/redmond-xx.json +++ b/static/themes/redmond-xx.json @@ -258,6 +258,7 @@ }, "colors": { "bg": "#c0c0c0", + "wallpaper": "#008080", "text": "#000000", "link": "#0000ff", "accent": "#000080", diff --git a/static/themes/redmond-xxi.json b/static/themes/redmond-xxi.json index 7fdc4a6d..60ceae7c 100644 --- a/static/themes/redmond-xxi.json +++ b/static/themes/redmond-xxi.json @@ -240,6 +240,7 @@ }, "colors": { "bg": "#d6d6ce", + "wallpaper": "#396ba5", "text": "#000000", "link": "#0000ff", "accent": "#0a246a", diff --git a/test/unit/specs/components/user_profile.spec.js b/test/unit/specs/components/user_profile.spec.js index dcf066f9..80092b41 100644 --- a/test/unit/specs/components/user_profile.spec.js +++ b/test/unit/specs/components/user_profile.spec.js @@ -8,8 +8,7 @@ const localVue = createLocalVue() localVue.use(Vuex) const mutations = { - clearTimeline: () => {}, - setError: () => {} + clearTimeline: () => {} } const actions = { diff --git a/test/unit/specs/services/chat_service/chat_service.spec.js b/test/unit/specs/services/chat_service/chat_service.spec.js index 2eb89a2d..0251cae7 100644 --- a/test/unit/specs/services/chat_service/chat_service.spec.js +++ b/test/unit/specs/services/chat_service/chat_service.spec.js @@ -2,17 +2,20 @@ import chatService from '../../../../../src/services/chat_service/chat_service.j const message1 = { id: '9wLkdcmQXD21Oy8lEX', + idempotency_key: '1', created_at: (new Date('2020-06-22T18:45:53.000Z')) } const message2 = { id: '9wLkdp6ihaOVdNj8Wu', + idempotency_key: '2', account_id: '9vmRb29zLQReckr5ay', created_at: (new Date('2020-06-22T18:45:56.000Z')) } const message3 = { id: '9wLke9zL4Dy4OZR2RM', + idempotency_key: '3', account_id: '9vmRb29zLQReckr5ay', created_at: (new Date('2020-07-22T18:45:59.000Z')) } @@ -44,10 +47,10 @@ describe('chatService', () => { chatService.resetNewMessageCount(chat) expect(chat.newMessageCount).to.eql(0) + expect(chat.lastSeenMessageId).to.eql(message2.id) - const createdAt = new Date() - createdAt.setSeconds(createdAt.getSeconds() + 10) - chatService.add(chat, { messages: [ { message3, created_at: createdAt } ] }) + // Add message with higher id + chatService.add(chat, { messages: [ message3 ] }) expect(chat.newMessageCount).to.eql(1) }) }) diff --git a/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js b/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js index e1f7a958..a3f49b2c 100644 --- a/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js +++ b/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js @@ -311,6 +311,12 @@ describe('API Entities normalizer', () => { expect(parseUser(user)).to.have.property('hide_followers_count', false) expect(parseUser(user)).to.have.property('hide_follows_count', true) }) + + it('converts IDN to unicode and marks it as internatonal', () => { + const user = makeMockUserMasto({ acct: 'lain@xn--lin-6cd.com' }) + + expect(parseUser(user)).to.have.property('screen_name').that.equal('lain@🌏lаin.com') + }) }) // We currently use QvitterAPI notifications only, and especially due to MastoAPI lacking is_seen, support for MastoAPI diff --git a/tools/emoji_merger.js b/tools/emoji_merger.js new file mode 100644 index 00000000..a74e847e --- /dev/null +++ b/tools/emoji_merger.js @@ -0,0 +1,67 @@ +/* + Emoji merger script, quick hack of a tool to: + - update some missing emoji from an external source + - sort the emoji + - remove all multipart emoji (reactions don't allow them) + + Merges emoji from here: https://gist.github.com/oliveratgithub/0bf11a9aff0d6da7b46f1490f86a71eb + to the simpler format we're using. +*/ + +// Existing emojis we have +const oldEmojiFilename = '../static/emoji.json' + +// The file downloaded from https://gist.github.com/oliveratgithub/0bf11a9aff0d6da7b46f1490f86a71eb +const newEmojiFilename = 'emojis.json' + +// Output, replace the static/emoji.json with this file if it looks correct +const outputFilename = 'output.json' + +const run = () => { + const fs = require('fs') + + let newEmojisObject = {} + let emojisObject = {} + + let data = fs.readFileSync(newEmojiFilename, 'utf8') + + // First filter out anything that's more than one codepoint + const newEmojis = JSON.parse(data).emojis.filter(e => e.emoji.length <= 2) + + // Create a table with format { shortname: emoji }, remove the : + newEmojis.forEach(e => { + const name = e.shortname.slice(1, e.shortname.length - 1).toLowerCase() + if (name.length > 0) { + newEmojisObject[name] = e.emoji + } + }) + + data = fs.readFileSync(oldEmojiFilename, 'utf8') + + emojisObject = JSON.parse(data) + + // Get rid of longer emojis that don't play nice with reactions + Object.keys(emojisObject).forEach(e => { + if (emojisObject[e].length > 2) emojisObject[e] = undefined + }) + + // Add new emojis from the new tables to the old table + Object.keys(newEmojisObject).forEach(e => { + if (!emojisObject[e] && newEmojisObject[e].length <= 2) { + emojisObject[e] = newEmojisObject[e] + } + }) + + // Sort by key + const sorted = Object.keys(emojisObject).sort().reduce((acc, key) => { + if (key.length === 0) return acc + acc[key] = emojisObject[key] + return acc + }, {}) + + fs.writeFile(outputFilename, JSON.stringify(sorted, null, 2), 'utf8', (err) => { + if (err) console.log('Error writing file', err) + }) +} + +run() diff --git a/tools/emojis.json b/tools/emojis.json new file mode 100644 index 00000000..62f25070 --- /dev/null +++ b/tools/emojis.json @@ -0,0 +1,4036 @@ +{ + "emojis": [ + {"emoji": "👩👩👧👧", "name": "family: woman, woman, girl, girl", "shortname": ":woman_woman_girl_girl:", "unicode": "1F469 200D 1F469 200D 1F467 200D 1F467", "html": "👩‍👩‍👧‍👧", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩👩👧👦", "name": "family: woman, woman, girl, boy", "shortname": ":woman_woman_girl_boy:", "unicode": "1F469 200D 1F469 200D 1F467 200D 1F466", "html": "👩‍👩‍👧‍👦", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩👩👦👦", "name": "family: woman, woman, boy, boy", "shortname": ":woman_woman_boy_boy:", "unicode": "1F469 200D 1F469 200D 1F466 200D 1F466", "html": "👩‍👩‍👦‍👦", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨👩👧👧", "name": "family: man, woman, girl, girl", "shortname": ":man_woman_girl_girl:", "unicode": "1F468 200D 1F469 200D 1F467 200D 1F467", "html": "👨‍👩‍👧‍👧", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨👩👧👦", "name": "family: man, woman, girl, boy", "shortname": ":man_woman_girl_boy:", "unicode": "1F468 200D 1F469 200D 1F467 200D 1F466", "html": "👨‍👩‍👧‍👦", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨👩👦👦", "name": "family: man, woman, boy, boy", "shortname": ":man_woman_boy_boy:", "unicode": "1F468 200D 1F469 200D 1F466 200D 1F466", "html": "👨‍👩‍👦‍👦", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨👨👧👧", "name": "family: man, man, girl, girl", "shortname": ":man_man_girl_girl:", "unicode": "1F468 200D 1F468 200D 1F467 200D 1F467", "html": "👨‍👨‍👧‍👧", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨👨👧👦", "name": "family: man, man, girl, boy", "shortname": ":man_man_girl_boy:", "unicode": "1F468 200D 1F468 200D 1F467 200D 1F466", "html": "👨‍👨‍👧‍👦", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨👨👦👦", "name": "family: man, man, boy, boy", "shortname": ":man_man_boy_boy:", "unicode": "1F468 200D 1F468 200D 1F466 200D 1F466", "html": "👨‍👨‍👦‍👦", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩👩👧", "name": "family: woman, woman, girl", "shortname": ":woman_woman_girl:", "unicode": "1F469 200D 1F469 200D 1F467", "html": "👩‍👩‍👧", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩👩👦", "name": "family: woman, woman, boy", "shortname": ":woman_woman_boy:", "unicode": "1F469 200D 1F469 200D 1F466", "html": "👩‍👩‍👦", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩👧👧", "name": "family: woman, girl, girl", "shortname": ":woman_girl_girl:", "unicode": "1F469 200D 1F467 200D 1F467", "html": "👩‍👧‍👧", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩👧👦", "name": "family: woman, girl, boy", "shortname": ":woman_girl_boy:", "unicode": "1F469 200D 1F467 200D 1F466", "html": "👩‍👧‍👦", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩👦👦", "name": "family: woman, boy, boy", "shortname": ":woman_boy_boy:", "unicode": "1F469 200D 1F466 200D 1F466", "html": "👩‍👦‍👦", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨👩👧", "name": "family: man, woman, girl", "shortname": ":man_woman_girl:", "unicode": "1F468 200D 1F469 200D 1F467", "html": "👨‍👩‍👧", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨👨👧", "name": "family: man, man, girl", "shortname": ":man_man_girl:", "unicode": "1F468 200D 1F468 200D 1F467", "html": "👨‍👨‍👧", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨👨👦", "name": "family: man, man, boy", "shortname": ":man_man_boy:", "unicode": "1F468 200D 1F468 200D 1F466", "html": "👨‍👨‍👦", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨👧👧", "name": "family: man, girl, girl", "shortname": ":man_girl_girl:", "unicode": "1F468 200D 1F467 200D 1F467", "html": "👨‍👧‍👧", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨👧👦", "name": "family: man, girl, boy", "shortname": ":man_girl_boy:", "unicode": "1F468 200D 1F467 200D 1F466", "html": "👨‍👧‍👦", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨👦👦", "name": "family: man, boy, boy", "shortname": ":man_boy_boy:", "unicode": "1F468 200D 1F466 200D 1F466", "html": "👨‍👦‍👦", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩👧", "name": "family: woman, girl", "shortname": ":woman_girl:", "unicode": "1F469 200D 1F467", "html": "👩‍👧", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩👦", "name": "family: woman, boy", "shortname": ":woman_boy:", "unicode": "1F469 200D 1F466", "html": "👩‍👦", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨👧", "name": "family: man, girl", "shortname": ":man_girl:", "unicode": "1F468 200D 1F467", "html": "👨‍👧", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨👦", "name": "family: man, boy", "shortname": ":man_boy:", "unicode": "1F468 200D 1F466", "html": "👨‍👦", "category": "People & Body (family)", "order": ""}, + {"emoji": "😂", "name": "face with tears of joy", "shortname": ":joy:", "unicode": "1f602", "html": "😂", "category": "Smileys & Emotion (face-smiling)", "order": "3"}, + {"emoji": "❤️", "name": "red heart", "shortname": ":heart:", "unicode": "2764", "html": "❤", "category": "Smileys & Emotion (emotion)", "order": "1286"}, + {"emoji": "♥️", "name": "heart suit", "shortname": ":heart_suit:", "unicode": "2665 FE0F", "html": "♥️", "category": "Activities (game)", "order": ""}, + {"emoji": "😍", "name": "smiling face with heart-eyes", "shortname": ":heart_eyes:", "unicode": "1f60d", "html": "😍", "category": "Smileys & Emotion (face-affection)", "order": "13"}, + {"emoji": "😭", "name": "loudly crying face", "shortname": ":sob:", "unicode": "1f62d", "html": "😭", "category": "Smileys & Emotion (face-concerned)", "order": "55"}, + {"emoji": "😊", "name": "smiling face with smiling eyes", "shortname": ":blush:", "unicode": "1f60a", "html": "😊", "category": "Smileys & Emotion (face-smiling)", "order": "10"}, + {"emoji": "😒", "name": "unamused face", "shortname": ":unamused:", "unicode": "1f612", "html": "😒", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": "41"}, + {"emoji": "😘", "name": "face blowing a kiss", "shortname": ":kissing_heart:", "unicode": "1f618", "html": "😘", "category": "Smileys & Emotion (face-affection)", "order": "14"}, + {"emoji": "💕", "name": "two hearts", "shortname": ":two_hearts:", "unicode": "1f495", "html": "💕", "category": "Smileys & Emotion (emotion)", "order": "1289"}, + {"emoji": "☺️", "name": "smiling face", "shortname": ":smiling:", "unicode": "263A FE0F", "html": "☺", "category": "Smileys & Emotion (face-affection)", "order": ""}, + {"emoji": "😩", "name": "weary face", "shortname": ":weary:", "unicode": "1f629", "html": "😩", "category": "Smileys & Emotion (face-concerned)", "order": "59"}, + {"emoji": "👌🏿", "name": "OK hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F44C 1F3FF", "html": "👌🏿", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "👌🏾", "name": "OK hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F44C 1F3FE", "html": "👌🏾", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "👌🏽", "name": "OK hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F44C 1F3FD", "html": "👌🏽", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "👌🏼", "name": "OK hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F44C 1F3FC", "html": "👌🏼", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "👌🏻", "name": "OK hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F44C 1F3FB", "html": "👌🏻", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "👌", "name": "OK hand", "shortname": ":ok_hand:", "unicode": "1f44c", "html": "👌", "category": "People & Body (hand-fingers-partial)", "order": "1170"}, + {"emoji": "😔", "name": "pensive face", "shortname": ":pensive:", "unicode": "1f614", "html": "😔", "category": "Smileys & Emotion (face-sleepy)", "order": "43"}, + {"emoji": "😏", "name": "smirking face", "shortname": ":smirk:", "unicode": "1f60f", "html": "😏", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": "26"}, + {"emoji": "😁", "name": "beaming face with smiling eyes", "shortname": ":grin:", "unicode": "1f601", "html": "😁", "category": "Smileys & Emotion (face-smiling)", "order": "2"}, + {"emoji": "♻", "name": "recycling symbol", "shortname": ":recycle:", "unicode": "267b", "html": "♻", "category": "Symbols (other-symbol)", "order": "2072"}, + {"emoji": "😉", "name": "winking face", "shortname": ":wink:", "unicode": "1f609", "html": "😉", "category": "Smileys & Emotion (face-smiling)", "order": "9"}, + {"emoji": "👍🏿", "name": "thumbs up: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F44D 1F3FF", "html": "👍🏿", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "👍🏾", "name": "thumbs up: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F44D 1F3FE", "html": "👍🏾", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "👍🏽", "name": "thumbs up: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F44D 1F3FD", "html": "👍🏽", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "👍🏼", "name": "thumbs up: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F44D 1F3FC", "html": "👍🏼", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "👍🏻", "name": "thumbs up: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F44D 1F3FB", "html": "👍🏻", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "👍", "name": "thumbs up", "shortname": ":thumbsup:", "unicode": "1f44d", "html": "👍", "category": "People & Body (hand-fingers-closed)", "order": "1176"}, + {"emoji": "🙏🏿", "name": "folded hands: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64F 1F3FF", "html": "🙏🏿", "category": "People & Body (hands)", "order": ""}, + {"emoji": "🙏🏾", "name": "folded hands: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64F 1F3FE", "html": "🙏🏾", "category": "People & Body (hands)", "order": ""}, + {"emoji": "🙏🏽", "name": "folded hands: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64F 1F3FD", "html": "🙏🏽", "category": "People & Body (hands)", "order": ""}, + {"emoji": "🙏🏼", "name": "folded hands: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64F 1F3FC", "html": "🙏🏼", "category": "People & Body (hands)", "order": ""}, + {"emoji": "🙏🏻", "name": "folded hands: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64F 1F3FB", "html": "🙏🏻", "category": "People & Body (hands)", "order": ""}, + {"emoji": "🙏", "name": "folded hands", "shortname": ":pray:", "unicode": "1f64f", "html": "🙏", "category": "People & Body (hands)", "order": "1248"}, + {"emoji": "😌", "name": "relieved face", "shortname": ":relieved:", "unicode": "1f60c", "html": "😌", "category": "Smileys & Emotion (face-sleepy)", "order": "35"}, + {"emoji": "🎶", "name": "musical notes", "shortname": ":notes:", "unicode": "1f3b6", "html": "🎶", "category": "Objects (music)", "order": "1825"}, + {"emoji": "😳", "name": "flushed face", "shortname": ":flushed:", "unicode": "1f633", "html": "😳", "category": "Smileys & Emotion (face-concerned)", "order": "63"}, + {"emoji": "🙌🏿", "name": "raising hands: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64C 1F3FF", "html": "🙌🏿", "category": "People & Body (hands)", "order": ""}, + {"emoji": "🙌🏾", "name": "raising hands: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64C 1F3FE", "html": "🙌🏾", "category": "People & Body (hands)", "order": ""}, + {"emoji": "🙌🏽", "name": "raising hands: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64C 1F3FD", "html": "🙌🏽", "category": "People & Body (hands)", "order": ""}, + {"emoji": "🙌🏼", "name": "raising hands: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64C 1F3FC", "html": "🙌🏼", "category": "People & Body (hands)", "order": ""}, + {"emoji": "🙌🏻", "name": "raising hands: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64C 1F3FB", "html": "🙌🏻", "category": "People & Body (hands)", "order": ""}, + {"emoji": "🙌", "name": "raising hands", "shortname": ":raised_hands:", "unicode": "1f64c", "html": "🙌", "category": "People & Body (hands)", "order": "1242"}, + {"emoji": "🙈", "name": "see-no-evil monkey", "shortname": ":see_no_evil:", "unicode": "1f648", "html": "🙈", "category": "Smileys & Emotion (monkey-face)", "order": "96"}, + {"emoji": "😢", "name": "crying face", "shortname": ":cry:", "unicode": "1f622", "html": "😢", "category": "Smileys & Emotion (face-concerned)", "order": "54"}, + {"emoji": "😎", "name": "smiling face with sunglasses", "shortname": ":sunglasses:", "unicode": "1f60e", "html": "😎", "category": "Smileys & Emotion (face-glasses)", "order": "12"}, + {"emoji": "✌🏿", "name": "victory hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "270C 1F3FF", "html": "✌🏿", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "✌🏾", "name": "victory hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "270C 1F3FE", "html": "✌🏾", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "✌🏽", "name": "victory hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "270C 1F3FD", "html": "✌🏽", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "✌🏼", "name": "victory hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "270C 1F3FC", "html": "✌🏼", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "✌🏻", "name": "victory hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "270C 1F3FB", "html": "✌🏻", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "✌️", "name": "victory hand", "shortname": ":v:", "unicode": "270c", "html": "✌", "category": "People & Body (hand-fingers-partial)", "order": "1128"}, + {"emoji": "👀", "name": "eyes", "shortname": ":eyes:", "unicode": "1f440", "html": "👀", "category": "People & Body (body-parts)", "order": "1279"}, + {"emoji": "😅", "name": "grinning face with sweat", "shortname": ":sweat_smile:", "unicode": "1f605", "html": "😅", "category": "Smileys & Emotion (face-smiling)", "order": "7"}, + {"emoji": "✨", "name": "sparkles", "shortname": ":sparkles:", "unicode": "2728", "html": "✨", "category": "Activities (event)", "order": "1760"}, + {"emoji": "😴", "name": "sleeping face", "shortname": ":sleeping:", "unicode": "1f634", "html": "😴", "category": "Smileys & Emotion (face-sleepy)", "order": "34"}, + {"emoji": "😄", "name": "grinning face with smiling eyes", "shortname": ":smile:", "unicode": "1f604", "html": "😄", "category": "Smileys & Emotion (face-smiling)", "order": "6"}, + {"emoji": "💜", "name": "purple heart", "shortname": ":purple_heart:", "unicode": "1f49c", "html": "💜", "category": "Smileys & Emotion (emotion)", "order": "1295"}, + {"emoji": "💔", "name": "broken heart", "shortname": ":broken_heart:", "unicode": "1f494", "html": "💔", "category": "Smileys & Emotion (emotion)", "order": "1288"}, + {"emoji": "💯", "name": "hundred points", "shortname": ":hundred_points:", "unicode": "1F4AF", "html": "💯", "category": "Smileys & Emotion (emotion)", "order": ""}, + {"emoji": "😑", "name": "expressionless face", "shortname": ":expressionless:", "unicode": "1f611", "html": "😑", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": "23"}, + {"emoji": "💖", "name": "sparkling heart", "shortname": ":sparkling_heart:", "unicode": "1f496", "html": "💖", "category": "Smileys & Emotion (emotion)", "order": "1290"}, + {"emoji": "💙", "name": "blue heart", "shortname": ":blue_heart:", "unicode": "1f499", "html": "💙", "category": "Smileys & Emotion (emotion)", "order": "1292"}, + {"emoji": "😕", "name": "confused face", "shortname": ":confused:", "unicode": "1f615", "html": "😕", "category": "Smileys & Emotion (face-concerned)", "order": "44"}, + {"emoji": "💁🏿♂", "name": "man tipping hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F481 1F3FF 200D 2642", "html": "💁🏿‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏾♂", "name": "man tipping hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F481 1F3FE 200D 2642", "html": "💁🏾‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏽♂", "name": "man tipping hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F481 1F3FD 200D 2642", "html": "💁🏽‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏼♂", "name": "man tipping hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F481 1F3FC 200D 2642", "html": "💁🏼‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏻♂", "name": "man tipping hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F481 1F3FB 200D 2642", "html": "💁🏻‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁♂", "name": "man tipping hand", "shortname": ":man_tipping_hand:", "unicode": "1F481 200D 2642", "html": "💁‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏿", "name": "person tipping hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F481 1F3FF", "html": "💁🏿", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏾", "name": "person tipping hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F481 1F3FE", "html": "💁🏾", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏽", "name": "person tipping hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F481 1F3FD", "html": "💁🏽", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏼", "name": "person tipping hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F481 1F3FC", "html": "💁🏼", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏻", "name": "person tipping hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F481 1F3FB", "html": "💁🏻", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁", "name": "person tipping hand", "shortname": ":information_desk_person:", "unicode": "1f481", "html": "💁", "category": "People & Body (person-gesture)", "order": "567"}, + {"emoji": "😜", "name": "winking face with tongue", "shortname": ":stuck_out_tongue_winking_eye:", "unicode": "1f61c", "html": "😜", "category": "Smileys & Emotion (face-tongue)", "order": "38"}, + {"emoji": "😞", "name": "disappointed face", "shortname": ":disappointed:", "unicode": "1f61e", "html": "😞", "category": "Smileys & Emotion (face-concerned)", "order": "51"}, + {"emoji": "😋", "name": "face savoring food", "shortname": ":yum:", "unicode": "1f60b", "html": "😋", "category": "Smileys & Emotion (face-tongue)", "order": "11"}, + {"emoji": "😐", "name": "neutral face", "shortname": ":neutral_face:", "unicode": "1f610", "html": "😐", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": "22"}, + {"emoji": "😪", "name": "sleepy face", "shortname": ":sleepy:", "unicode": "1f62a", "html": "😪", "category": "Smileys & Emotion (face-sleepy)", "order": "32"}, + {"emoji": "👏🏿", "name": "clapping hands: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F44F 1F3FF", "html": "👏🏿", "category": "People & Body (hands)", "order": ""}, + {"emoji": "👏🏾", "name": "clapping hands: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F44F 1F3FE", "html": "👏🏾", "category": "People & Body (hands)", "order": ""}, + {"emoji": "👏🏽", "name": "clapping hands: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F44F 1F3FD", "html": "👏🏽", "category": "People & Body (hands)", "order": ""}, + {"emoji": "👏🏼", "name": "clapping hands: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F44F 1F3FC", "html": "👏🏼", "category": "People & Body (hands)", "order": ""}, + {"emoji": "👏🏻", "name": "clapping hands: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F44F 1F3FB", "html": "👏🏻", "category": "People & Body (hands)", "order": ""}, + {"emoji": "👏", "name": "clapping hands", "shortname": ":clap:", "unicode": "1f44f", "html": "👏", "category": "People & Body (hands)", "order": "1224"}, + {"emoji": "💘", "name": "heart with arrow", "shortname": ":cupid:", "unicode": "1f498", "html": "💘", "category": "Smileys & Emotion (emotion)", "order": "1285"}, + {"emoji": "💗", "name": "growing heart", "shortname": ":heartpulse:", "unicode": "1f497", "html": "💗", "category": "Smileys & Emotion (emotion)", "order": "1291"}, + {"emoji": "💞", "name": "revolving hearts", "shortname": ":revolving_hearts:", "unicode": "1f49e", "html": "💞", "category": "Smileys & Emotion (emotion)", "order": "1298"}, + {"emoji": "⬅️", "name": "left arrow", "shortname": ":arrow_left:", "unicode": "2b05", "html": "⬅", "category": "Symbols (arrow)", "order": "2008"}, + {"emoji": "🙊", "name": "speak-no-evil monkey", "shortname": ":speak_no_evil:", "unicode": "1f64a", "html": "🙊", "category": "Smileys & Emotion (monkey-face)", "order": "98"}, + {"emoji": "✋🏿", "name": "raised hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "270B 1F3FF", "html": "✋🏿", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "✋🏾", "name": "raised hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "270B 1F3FE", "html": "✋🏾", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "✋🏽", "name": "raised hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "270B 1F3FD", "html": "✋🏽", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "✋🏼", "name": "raised hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "270B 1F3FC", "html": "✋🏼", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "✋🏻", "name": "raised hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "270B 1F3FB", "html": "✋🏻", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "✋", "name": "raised hand", "shortname": ":raised_hand:", "unicode": "270B", "html": "✋", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "💋", "name": "kiss mark", "shortname": ":kiss:", "unicode": "1f48b", "html": "💋", "category": "Smileys & Emotion (emotion)", "order": "1284"}, + {"emoji": "👉🏿", "name": "backhand index pointing right: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F449 1F3FF", "html": "👉🏿", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👉🏾", "name": "backhand index pointing right: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F449 1F3FE", "html": "👉🏾", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👉🏽", "name": "backhand index pointing right: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F449 1F3FD", "html": "👉🏽", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👉🏼", "name": "backhand index pointing right: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F449 1F3FC", "html": "👉🏼", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👉🏻", "name": "backhand index pointing right: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F449 1F3FB", "html": "👉🏻", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👉", "name": "backhand index pointing right", "shortname": ":point_right:", "unicode": "1f449", "html": "👉", "category": "People & Body (hand-single-finger)", "order": "1098"}, + {"emoji": "🌸", "name": "cherry blossom", "shortname": ":cherry_blossom:", "unicode": "1f338", "html": "🌸", "category": "Animals & Nature (plant-flower)", "order": "1428"}, + {"emoji": "😱", "name": "face screaming in fear", "shortname": ":scream:", "unicode": "1f631", "html": "😱", "category": "Smileys & Emotion (face-concerned)", "order": "62"}, + {"emoji": "🔥", "name": "fire", "shortname": ":fire:", "unicode": "1f525", "html": "🔥", "category": "Travel & Places (sky & weather)", "order": "1753"}, + {"emoji": "😡", "name": "pouting face", "shortname": ":rage:", "unicode": "1f621", "html": "😡", "category": "Smileys & Emotion (face-negative)", "order": "65"}, + {"emoji": "😃", "name": "grinning face with big eyes", "shortname": ":smiley:", "unicode": "1f603", "html": "😃", "category": "Smileys & Emotion (face-smiling)", "order": "5"}, + {"emoji": "🎉", "name": "party popper", "shortname": ":tada:", "unicode": "1f389", "html": "🎉", "category": "Activities (event)", "order": "1762"}, + {"emoji": "👊🏿", "name": "oncoming fist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F44A 1F3FF", "html": "👊🏿", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "👊🏾", "name": "oncoming fist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F44A 1F3FE", "html": "👊🏾", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "👊🏽", "name": "oncoming fist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F44A 1F3FD", "html": "👊🏽", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "👊🏼", "name": "oncoming fist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F44A 1F3FC", "html": "👊🏼", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "👊🏻", "name": "oncoming fist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F44A 1F3FB", "html": "👊🏻", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "👊", "name": "oncoming fist", "shortname": ":oncoming_fist:", "unicode": "1F44A", "html": "👊", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "😫", "name": "tired face", "shortname": ":tired_face:", "unicode": "1f62b", "html": "😫", "category": "Smileys & Emotion (face-concerned)", "order": "33"}, + {"emoji": "📷", "name": "camera", "shortname": ":camera:", "unicode": "1f4f7", "html": "📷", "category": "Objects (light & video)", "order": "1861"}, + {"emoji": "🌹", "name": "rose", "shortname": ":rose:", "unicode": "1f339", "html": "🌹", "category": "Animals & Nature (plant-flower)", "order": "1431"}, + {"emoji": "😝", "name": "squinting face with tongue", "shortname": ":stuck_out_tongue_closed_eyes:", "unicode": "1f61d", "html": "😝", "category": "Smileys & Emotion (face-tongue)", "order": "39"}, + {"emoji": "💪🏿", "name": "flexed biceps: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F4AA 1F3FF", "html": "💪🏿", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "💪🏾", "name": "flexed biceps: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F4AA 1F3FE", "html": "💪🏾", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "💪🏽", "name": "flexed biceps: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F4AA 1F3FD", "html": "💪🏽", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "💪🏼", "name": "flexed biceps: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F4AA 1F3FC", "html": "💪🏼", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "💪🏻", "name": "flexed biceps: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F4AA 1F3FB", "html": "💪🏻", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "💪", "name": "flexed biceps", "shortname": ":muscle:", "unicode": "1f4aa", "html": "💪", "category": "People & Body (body-parts)", "order": "1080"}, + {"emoji": "💀", "name": "skull", "shortname": ":skull:", "unicode": "1f480", "html": "💀", "category": "Smileys & Emotion (face-negative)", "order": "80"}, + {"emoji": "☀️", "name": "sun", "shortname": ":sunny:", "unicode": "2600", "html": "☀", "category": "Travel & Places (sky & weather)", "order": "1724"}, + {"emoji": "💛", "name": "yellow heart", "shortname": ":yellow_heart:", "unicode": "1f49b", "html": "💛", "category": "Smileys & Emotion (emotion)", "order": "1294"}, + {"emoji": "😤", "name": "face with steam from nose", "shortname": ":triumph:", "unicode": "1f624", "html": "😤", "category": "Smileys & Emotion (face-negative)", "order": "53"}, + {"emoji": "🌚", "name": "new moon face", "shortname": ":new_moon_with_face:", "unicode": "1f31a", "html": "🌚", "category": "Travel & Places (sky & weather)", "order": "1720"}, + {"emoji": "😆", "name": "grinning squinting face", "shortname": ":laughing:", "unicode": "1f606", "html": "😆", "category": "Smileys & Emotion (face-smiling)", "order": "8"}, + {"emoji": "😓", "name": "downcast face with sweat", "shortname": ":sweat:", "unicode": "1f613", "html": "😓", "category": "Smileys & Emotion (face-concerned)", "order": "42"}, + {"emoji": "👈🏿", "name": "backhand index pointing left: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F448 1F3FF", "html": "👈🏿", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👈🏾", "name": "backhand index pointing left: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F448 1F3FE", "html": "👈🏾", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👈🏽", "name": "backhand index pointing left: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F448 1F3FD", "html": "👈🏽", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👈🏼", "name": "backhand index pointing left: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F448 1F3FC", "html": "👈🏼", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👈🏻", "name": "backhand index pointing left: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F448 1F3FB", "html": "👈🏻", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👈", "name": "backhand index pointing left", "shortname": ":point_left:", "unicode": "1f448", "html": "👈", "category": "People & Body (hand-single-finger)", "order": "1092"}, + {"emoji": "✔️", "name": "check mark", "shortname": ":heavy_check_mark:", "unicode": "2714", "html": "✔", "category": "Symbols (other-symbol)", "order": "2080"}, + {"emoji": "😻", "name": "smiling cat with heart-eyes", "shortname": ":heart_eyes_cat:", "unicode": "1f63b", "html": "😻", "category": "Smileys & Emotion (cat-face)", "order": "90"}, + {"emoji": "😀", "name": "grinning face", "shortname": ":grinning:", "unicode": "1f600", "html": "😀", "category": "Smileys & Emotion (face-smiling)", "order": "1"}, + {"emoji": "😷", "name": "face with medical mask", "shortname": ":mask:", "unicode": "1f637", "html": "😷", "category": "Smileys & Emotion (face-unwell)", "order": "71"}, + {"emoji": "💚", "name": "green heart", "shortname": ":green_heart:", "unicode": "1f49a", "html": "💚", "category": "Smileys & Emotion (emotion)", "order": "1293"}, + {"emoji": "👋🏿", "name": "waving hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F44B 1F3FF", "html": "👋🏿", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "👋🏾", "name": "waving hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F44B 1F3FE", "html": "👋🏾", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "👋🏽", "name": "waving hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F44B 1F3FD", "html": "👋🏽", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "👋🏼", "name": "waving hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F44B 1F3FC", "html": "👋🏼", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "👋🏻", "name": "waving hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F44B 1F3FB", "html": "👋🏻", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "👋", "name": "waving hand", "shortname": ":wave:", "unicode": "1f44b", "html": "👋", "category": "People & Body (hand-fingers-open)", "order": "1218"}, + {"emoji": "😣", "name": "persevering face", "shortname": ":persevere:", "unicode": "1f623", "html": "😣", "category": "Smileys & Emotion (face-concerned)", "order": "27"}, + {"emoji": "💓", "name": "beating heart", "shortname": ":heartbeat:", "unicode": "1f493", "html": "💓", "category": "Smileys & Emotion (emotion)", "order": "1287"}, + {"emoji": "▶️", "name": "play button", "shortname": ":arrow_forward:", "unicode": "25b6", "html": "▶", "category": "Symbols (av-symbol)", "order": "2051"}, + {"emoji": "◀️", "name": "reverse button", "shortname": ":arrow_backward:", "unicode": "25c0", "html": "◀", "category": "Symbols (av-symbol)", "order": "2055"}, + {"emoji": "↪️", "name": "left arrow curving right", "shortname": ":arrow_right_hook:", "unicode": "21aa", "html": "↪", "category": "Symbols (arrow)", "order": "2013"}, + {"emoji": "↩️", "name": "right arrow curving left", "shortname": ":leftwards_arrow_with_hook:", "unicode": "21a9", "html": "↩", "category": "Symbols (arrow)", "order": "2012"}, + {"emoji": "👑", "name": "crown", "shortname": ":crown:", "unicode": "1f451", "html": "👑", "category": "Objects (clothing)", "order": "1333"}, + {"emoji": "😚", "name": "kissing face with closed eyes", "shortname": ":kissing_closed_eyes:", "unicode": "1f61a", "html": "😚", "category": "Smileys & Emotion (face-affection)", "order": "17"}, + {"emoji": "😛", "name": "face with tongue", "shortname": ":stuck_out_tongue:", "unicode": "1f61b", "html": "😛", "category": "Smileys & Emotion (face-tongue)", "order": "37"}, + {"emoji": "😥", "name": "sad but relieved face", "shortname": ":disappointed_relieved:", "unicode": "1f625", "html": "😥", "category": "Smileys & Emotion (face-concerned)", "order": "28"}, + {"emoji": "😇", "name": "smiling face with halo", "shortname": ":innocent:", "unicode": "1f607", "html": "😇", "category": "Smileys & Emotion (face-smiling)", "order": "67"}, + {"emoji": "🎧", "name": "headphone", "shortname": ":headphones:", "unicode": "1f3a7", "html": "🎧", "category": "Objects (music)", "order": "1830"}, + {"emoji": "✅", "name": "check mark button", "shortname": ":white_check_mark:", "unicode": "2705", "html": "✅", "category": "Symbols (other-symbol)", "order": "2078"}, + {"emoji": "😖", "name": "confounded face", "shortname": ":confounded:", "unicode": "1f616", "html": "😖", "category": "Smileys & Emotion (face-concerned)", "order": "50"}, + {"emoji": "➡", "name": "right arrow", "shortname": ":arrow_right:", "unicode": "27a1", "html": "➡", "category": "Symbols (arrow)", "order": "2004"}, + {"emoji": "😠", "name": "angry face", "shortname": ":angry:", "unicode": "1f620", "html": "😠", "category": "Smileys & Emotion (face-negative)", "order": "66"}, + {"emoji": "😬", "name": "grimacing face", "shortname": ":grimacing:", "unicode": "1f62c", "html": "😬", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": "60"}, + {"emoji": "🌟", "name": "glowing star", "shortname": ":star2:", "unicode": "1f31f", "html": "🌟", "category": "Travel & Places (sky & weather)", "order": "1728"}, + {"emoji": "🔫", "name": "pistol", "shortname": ":gun:", "unicode": "1f52b", "html": "🔫", "category": "Objects (tool)", "order": "1956"}, + {"emoji": "🙋🏿♂", "name": "man raising hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64B 1F3FF 200D 2642", "html": "🙋🏿‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏾♂", "name": "man raising hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64B 1F3FE 200D 2642", "html": "🙋🏾‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏽♂", "name": "man raising hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64B 1F3FD 200D 2642", "html": "🙋🏽‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏼♂", "name": "man raising hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64B 1F3FC 200D 2642", "html": "🙋🏼‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏻♂", "name": "man raising hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64B 1F3FB 200D 2642", "html": "🙋🏻‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋♂", "name": "man raising hand", "shortname": ":man_raising_hand:", "unicode": "1F64B 200D 2642", "html": "🙋‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏿", "name": "person raising hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64B 1F3FF", "html": "🙋🏿", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏾", "name": "person raising hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64B 1F3FE", "html": "🙋🏾", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏽", "name": "person raising hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64B 1F3FD", "html": "🙋🏽", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏼", "name": "person raising hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64B 1F3FC", "html": "🙋🏼", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏻", "name": "person raising hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64B 1F3FB", "html": "🙋🏻", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋", "name": "person raising hand", "shortname": ":raising_hand:", "unicode": "1f64b", "html": "🙋", "category": "People & Body (person-gesture)", "order": "585"}, + {"emoji": "👎🏿", "name": "thumbs down: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F44E 1F3FF", "html": "👎🏿", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "👎🏾", "name": "thumbs down: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F44E 1F3FE", "html": "👎🏾", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "👎🏽", "name": "thumbs down: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F44E 1F3FD", "html": "👎🏽", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "👎🏼", "name": "thumbs down: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F44E 1F3FC", "html": "👎🏼", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "👎🏻", "name": "thumbs down: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F44E 1F3FB", "html": "👎🏻", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "👎", "name": "thumbs down", "shortname": ":thumbsdown:", "unicode": "1f44e", "html": "👎", "category": "People & Body (hand-fingers-closed)", "order": "1182"}, + {"emoji": "💃🏿", "name": "woman dancing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F483 1F3FF", "html": "💃🏿", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💃🏾", "name": "woman dancing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F483 1F3FE", "html": "💃🏾", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💃🏽", "name": "woman dancing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F483 1F3FD", "html": "💃🏽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💃🏼", "name": "woman dancing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F483 1F3FC", "html": "💃🏼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💃🏻", "name": "woman dancing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F483 1F3FB", "html": "💃🏻", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💃", "name": "woman dancing", "shortname": ":dancer:", "unicode": "1f483", "html": "💃", "category": "People & Body (person-activity)", "order": "729"}, + {"emoji": "🎵", "name": "musical note", "shortname": ":musical_note:", "unicode": "1f3b5", "html": "🎵", "category": "Objects (music)", "order": "1824"}, + {"emoji": "😶", "name": "face without mouth", "shortname": ":no_mouth:", "unicode": "1f636", "html": "😶", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": "24"}, + {"emoji": "💫", "name": "dizzy", "shortname": ":dizzy:", "unicode": "1f4ab", "html": "💫", "category": "Smileys & Emotion (emotion)", "order": "1308"}, + {"emoji": "✊🏿", "name": "raised fist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "270A 1F3FF", "html": "✊🏿", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "✊🏾", "name": "raised fist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "270A 1F3FE", "html": "✊🏾", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "✊🏽", "name": "raised fist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "270A 1F3FD", "html": "✊🏽", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "✊🏼", "name": "raised fist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "270A 1F3FC", "html": "✊🏼", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "✊🏻", "name": "raised fist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "270A 1F3FB", "html": "✊🏻", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "✊", "name": "raised fist", "shortname": ":fist:", "unicode": "270a", "html": "✊", "category": "People & Body (hand-fingers-closed)", "order": "1188"}, + {"emoji": "👇🏿", "name": "backhand index pointing down: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F447 1F3FF", "html": "👇🏿", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👇🏾", "name": "backhand index pointing down: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F447 1F3FE", "html": "👇🏾", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👇🏽", "name": "backhand index pointing down: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F447 1F3FD", "html": "👇🏽", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👇🏼", "name": "backhand index pointing down: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F447 1F3FC", "html": "👇🏼", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👇🏻", "name": "backhand index pointing down: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F447 1F3FB", "html": "👇🏻", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👇", "name": "backhand index pointing down", "shortname": ":point_down:", "unicode": "1f447", "html": "👇", "category": "People & Body (hand-single-finger)", "order": "1122"}, + {"emoji": "🔴", "name": "red circle", "shortname": ":red_circle:", "unicode": "1f534", "html": "🔴", "category": "Symbols (geometric)", "order": "2179"}, + {"emoji": "🙅🏿♂", "name": "man gesturing NO: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F645 1F3FF 200D 2642", "html": "🙅🏿‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏾♂", "name": "man gesturing NO: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F645 1F3FE 200D 2642", "html": "🙅🏾‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏽♂", "name": "man gesturing NO: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F645 1F3FD 200D 2642", "html": "🙅🏽‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏼♂", "name": "man gesturing NO: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F645 1F3FC 200D 2642", "html": "🙅🏼‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏻♂", "name": "man gesturing NO: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F645 1F3FB 200D 2642", "html": "🙅🏻‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅♂", "name": "man gesturing NO", "shortname": ":man_gesturing_NO:", "unicode": "1F645 200D 2642", "html": "🙅‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏿", "name": "person gesturing NO: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F645 1F3FF", "html": "🙅🏿", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏾", "name": "person gesturing NO: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F645 1F3FE", "html": "🙅🏾", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏽", "name": "person gesturing NO: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F645 1F3FD", "html": "🙅🏽", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏼", "name": "person gesturing NO: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F645 1F3FC", "html": "🙅🏼", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏻", "name": "person gesturing NO: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F645 1F3FB", "html": "🙅🏻", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅", "name": "person gesturing NO", "shortname": ":no_good:", "unicode": "1f645", "html": "🙅", "category": "People & Body (person-gesture)", "order": "531"}, + {"emoji": "💥", "name": "collision", "shortname": ":boom:", "unicode": "1f4a5", "html": "💥", "category": "Smileys & Emotion (emotion)", "order": "1305"}, + {"emoji": "©️", "name": "copyright", "shortname": ":copyright:", "unicode": "00A9 FE0F", "html": "©️", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "💭", "name": "thought balloon", "shortname": ":thought_balloon:", "unicode": "1f4ad", "html": "💭", "category": "Smileys & Emotion (emotion)", "order": "1312"}, + {"emoji": "👅", "name": "tongue", "shortname": ":tongue:", "unicode": "1f445", "html": "👅", "category": "People & Body (body-parts)", "order": "1282"}, + {"emoji": "💩", "name": "pile of poo", "shortname": ":poop:", "unicode": "1f4a9", "html": "💩", "category": "Smileys & Emotion (face-costume)", "order": "85"}, + {"emoji": "😰", "name": "anxious face with sweat", "shortname": ":cold_sweat:", "unicode": "1f630", "html": "😰", "category": "Smileys & Emotion (face-concerned)", "order": "61"}, + {"emoji": "💎", "name": "gem stone", "shortname": ":gem:", "unicode": "1f48e", "html": "💎", "category": "Objects (clothing)", "order": "1341"}, + {"emoji": "🙆🏿♂", "name": "man gesturing OK: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F646 1F3FF 200D 2642", "html": "🙆🏿‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏾♂", "name": "man gesturing OK: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F646 1F3FE 200D 2642", "html": "🙆🏾‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏽♂", "name": "man gesturing OK: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F646 1F3FD 200D 2642", "html": "🙆🏽‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏼♂", "name": "man gesturing OK: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F646 1F3FC 200D 2642", "html": "🙆🏼‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏻♂", "name": "man gesturing OK: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F646 1F3FB 200D 2642", "html": "🙆🏻‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆♂", "name": "man gesturing OK", "shortname": ":man_gesturing_OK:", "unicode": "1F646 200D 2642", "html": "🙆‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏿", "name": "person gesturing OK: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F646 1F3FF", "html": "🙆🏿", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏾", "name": "person gesturing OK: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F646 1F3FE", "html": "🙆🏾", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏽", "name": "person gesturing OK: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F646 1F3FD", "html": "🙆🏽", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏼", "name": "person gesturing OK: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F646 1F3FC", "html": "🙆🏼", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏻", "name": "person gesturing OK: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F646 1F3FB", "html": "🙆🏻", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆", "name": "person gesturing OK", "shortname": ":ok_woman:", "unicode": "1f646", "html": "🙆", "category": "People & Body (person-gesture)", "order": "549"}, + {"emoji": "🍕", "name": "pizza", "shortname": ":pizza:", "unicode": "1f355", "html": "🍕", "category": "Food & Drink (food-prepared)", "order": "1484"}, + {"emoji": "😹", "name": "cat with tears of joy", "shortname": ":joy_cat:", "unicode": "1f639", "html": "😹", "category": "Smileys & Emotion (cat-face)", "order": "89"}, + {"emoji": "🌞", "name": "sun with face", "shortname": ":sun_with_face:", "unicode": "1f31e", "html": "🌞", "category": "Travel & Places (sky & weather)", "order": "1726"}, + {"emoji": "🍃", "name": "leaf fluttering in wind", "shortname": ":leaves:", "unicode": "1f343", "html": "🍃", "category": "Animals & Nature (plant-other)", "order": "1448"}, + {"emoji": "💦", "name": "sweat droplets", "shortname": ":sweat_drops:", "unicode": "1f4a6", "html": "💦", "category": "Smileys & Emotion (emotion)", "order": "1306"}, + {"emoji": "🐧", "name": "penguin", "shortname": ":penguin:", "unicode": "1f427", "html": "🐧", "category": "Animals & Nature (animal-bird)", "order": "1394"}, + {"emoji": "💤", "name": "zzz", "shortname": ":zzz:", "unicode": "1f4a4", "html": "💤", "category": "Smileys & Emotion (emotion)", "order": "1302"}, + {"emoji": "🚶🏿♀", "name": "woman walking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B6 1F3FF 200D 2640", "html": "🚶🏿‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏾♀", "name": "woman walking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B6 1F3FE 200D 2640", "html": "🚶🏾‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏽♀", "name": "woman walking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B6 1F3FD 200D 2640", "html": "🚶🏽‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏼♀", "name": "woman walking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B6 1F3FC 200D 2640", "html": "🚶🏼‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏻♀", "name": "woman walking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B6 1F3FB 200D 2640", "html": "🚶🏻‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶♀", "name": "woman walking", "shortname": ":woman_walking:", "unicode": "1F6B6 200D 2640", "html": "🚶‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏿", "name": "person walking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B6 1F3FF", "html": "🚶🏿", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏾", "name": "person walking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B6 1F3FE", "html": "🚶🏾", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏽", "name": "person walking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B6 1F3FD", "html": "🚶🏽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏼", "name": "person walking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B6 1F3FC", "html": "🚶🏼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏻", "name": "person walking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B6 1F3FB", "html": "🚶🏻", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶", "name": "person walking", "shortname": ":walking:", "unicode": "1f6b6", "html": "🚶", "category": "People & Body (person-activity)", "order": "693"}, + {"emoji": "✈️", "name": "airplane", "shortname": ":airplane:", "unicode": "2708", "html": "✈", "category": "Travel & Places (transport-air)", "order": "1650"}, + {"emoji": "🎈", "name": "balloon", "shortname": ":balloon:", "unicode": "1f388", "html": "🎈", "category": "Activities (event)", "order": "1761"}, + {"emoji": "⭐", "name": "star", "shortname": ":star:", "unicode": "2b50", "html": "⭐", "category": "Travel & Places (sky & weather)", "order": "1727"}, + {"emoji": "🎀", "name": "ribbon", "shortname": ":ribbon:", "unicode": "1f380", "html": "🎀", "category": "Activities (event)", "order": "1770"}, + {"emoji": "☑️", "name": "check box with check", "shortname": ":ballot_box_with_check:", "unicode": "2611", "html": "☑", "category": "Symbols (other-symbol)", "order": "2079"}, + {"emoji": "😟", "name": "worried face", "shortname": ":worried:", "unicode": "1f61f", "html": "😟", "category": "Smileys & Emotion (face-concerned)", "order": "52"}, + {"emoji": "🔞", "name": "no one under eighteen", "shortname": ":underage:", "unicode": "1f51e", "html": "🔞", "category": "Symbols (warning)", "order": "1999"}, + {"emoji": "😨", "name": "fearful face", "shortname": ":fearful:", "unicode": "1f628", "html": "😨", "category": "Smileys & Emotion (face-concerned)", "order": "58"}, + {"emoji": "🍀", "name": "four leaf clover", "shortname": ":four_leaf_clover:", "unicode": "1f340", "html": "🍀", "category": "Animals & Nature (plant-other)", "order": "1445"}, + {"emoji": "🌺", "name": "hibiscus", "shortname": ":hibiscus:", "unicode": "1f33a", "html": "🌺", "category": "Animals & Nature (plant-flower)", "order": "1433"}, + {"emoji": "🎤", "name": "microphone", "shortname": ":microphone:", "unicode": "1f3a4", "html": "🎤", "category": "Objects (music)", "order": "1829"}, + {"emoji": "👐🏿", "name": "open hands: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F450 1F3FF", "html": "👐🏿", "category": "People & Body (hands)", "order": ""}, + {"emoji": "👐🏾", "name": "open hands: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F450 1F3FE", "html": "👐🏾", "category": "People & Body (hands)", "order": ""}, + {"emoji": "👐🏽", "name": "open hands: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F450 1F3FD", "html": "👐🏽", "category": "People & Body (hands)", "order": ""}, + {"emoji": "👐🏼", "name": "open hands: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F450 1F3FC", "html": "👐🏼", "category": "People & Body (hands)", "order": ""}, + {"emoji": "👐🏻", "name": "open hands: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F450 1F3FB", "html": "👐🏻", "category": "People & Body (hands)", "order": ""}, + {"emoji": "👐", "name": "open hands", "shortname": ":open_hands:", "unicode": "1f450", "html": "👐", "category": "People & Body (hands)", "order": "1236"}, + {"emoji": "👻", "name": "ghost", "shortname": ":ghost:", "unicode": "1f47b", "html": "👻", "category": "Smileys & Emotion (face-costume)", "order": "82"}, + {"emoji": "🌴", "name": "palm tree", "shortname": ":palm_tree:", "unicode": "1f334", "html": "🌴", "category": "Animals & Nature (plant-other)", "order": "1440"}, + {"emoji": "‼️", "name": "double exclamation mark", "shortname": ":bangbang:", "unicode": "203c", "html": "‼", "category": "Symbols (other-symbol)", "order": "2096"}, + {"emoji": "💅🏿", "name": "nail polish: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F485 1F3FF", "html": "💅🏿", "category": "People & Body (hand-prop)", "order": ""}, + {"emoji": "💅🏾", "name": "nail polish: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F485 1F3FE", "html": "💅🏾", "category": "People & Body (hand-prop)", "order": ""}, + {"emoji": "💅🏽", "name": "nail polish: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F485 1F3FD", "html": "💅🏽", "category": "People & Body (hand-prop)", "order": ""}, + {"emoji": "💅🏼", "name": "nail polish: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F485 1F3FC", "html": "💅🏼", "category": "People & Body (hand-prop)", "order": ""}, + {"emoji": "💅🏻", "name": "nail polish: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F485 1F3FB", "html": "💅🏻", "category": "People & Body (hand-prop)", "order": ""}, + {"emoji": "💅", "name": "nail polish", "shortname": ":nail_care:", "unicode": "1f485", "html": "💅", "category": "People & Body (hand-prop)", "order": "1260"}, + {"emoji": "❌", "name": "cross mark", "shortname": ":x:", "unicode": "274c", "html": "❌", "category": "Symbols (other-symbol)", "order": "2082"}, + {"emoji": "👽", "name": "alien", "shortname": ":alien:", "unicode": "1f47d", "html": "👽", "category": "Smileys & Emotion (face-costume)", "order": "83"}, + {"emoji": "🙇🏿♀", "name": "woman bowing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F647 1F3FF 200D 2640", "html": "🙇🏿‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏾♀", "name": "woman bowing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F647 1F3FE 200D 2640", "html": "🙇🏾‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏽♀", "name": "woman bowing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F647 1F3FD 200D 2640", "html": "🙇🏽‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏼♀", "name": "woman bowing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F647 1F3FC 200D 2640", "html": "🙇🏼‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏻♀", "name": "woman bowing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F647 1F3FB 200D 2640", "html": "🙇🏻‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇♀", "name": "woman bowing", "shortname": ":woman_bowing:", "unicode": "1F647 200D 2640", "html": "🙇‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏿", "name": "person bowing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F647 1F3FF", "html": "🙇🏿", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏾", "name": "person bowing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F647 1F3FE", "html": "🙇🏾", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏽", "name": "person bowing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F647 1F3FD", "html": "🙇🏽", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏼", "name": "person bowing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F647 1F3FC", "html": "🙇🏼", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏻", "name": "person bowing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F647 1F3FB", "html": "🙇🏻", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇", "name": "person bowing", "shortname": ":bow:", "unicode": "1f647", "html": "🙇", "category": "People & Body (person-gesture)", "order": "603"}, + {"emoji": "☁", "name": "cloud", "shortname": ":cloud:", "unicode": "2601", "html": "☁", "category": "Travel & Places (sky & weather)", "order": "1730"}, + {"emoji": "⚽", "name": "soccer ball", "shortname": ":soccer:", "unicode": "26bd", "html": "⚽", "category": "Activities (sport)", "order": "1781"}, + {"emoji": "👼🏿", "name": "baby angel: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F47C 1F3FF", "html": "👼🏿", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "👼🏾", "name": "baby angel: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F47C 1F3FE", "html": "👼🏾", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "👼🏽", "name": "baby angel: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F47C 1F3FD", "html": "👼🏽", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "👼🏼", "name": "baby angel: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F47C 1F3FC", "html": "👼🏼", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "👼🏻", "name": "baby angel: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F47C 1F3FB", "html": "👼🏻", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "👼", "name": "baby angel", "shortname": ":angel:", "unicode": "1f47c", "html": "👼", "category": "People & Body (person-fantasy)", "order": "141"}, + {"emoji": "👯♂", "name": "men with bunny ears", "shortname": ":men_with_bunny_ears:", "unicode": "1F46F 200D 2642", "html": "👯‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👯", "name": "people with bunny ears", "shortname": ":dancers:", "unicode": "1f46f", "html": "👯", "category": "People & Body (person-activity)", "order": "741"}, + {"emoji": "❗", "name": "exclamation mark", "shortname": ":exclamation:", "unicode": "2757", "html": "❗", "category": "Symbols (other-symbol)", "order": "2101"}, + {"emoji": "❄️", "name": "snowflake", "shortname": ":snowflake:", "unicode": "2744", "html": "❄", "category": "Travel & Places (sky & weather)", "order": "1749"}, + {"emoji": "☝🏿", "name": "index pointing up: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "261D 1F3FF", "html": "☝🏿", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "☝🏾", "name": "index pointing up: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "261D 1F3FE", "html": "☝🏾", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "☝🏽", "name": "index pointing up: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "261D 1F3FD", "html": "☝🏽", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "☝🏼", "name": "index pointing up: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "261D 1F3FC", "html": "☝🏼", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "☝🏻", "name": "index pointing up: light skin tone", "shortname": ":light_skin_tone:", "unicode": "261D 1F3FB", "html": "☝🏻", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "☝️", "name": "index pointing up", "shortname": ":point_up:", "unicode": "261d", "html": "☝", "category": "People & Body (hand-single-finger)", "order": "1104"}, + {"emoji": "😙", "name": "kissing face with smiling eyes", "shortname": ":kissing_smiling_eyes:", "unicode": "1f619", "html": "😙", "category": "Smileys & Emotion (face-affection)", "order": "16"}, + {"emoji": "🌈", "name": "rainbow", "shortname": ":rainbow:", "unicode": "1f308", "html": "🌈", "category": "Travel & Places (sky & weather)", "order": "1743"}, + {"emoji": "🌙", "name": "crescent moon", "shortname": ":crescent_moon:", "unicode": "1f319", "html": "🌙", "category": "Travel & Places (sky & weather)", "order": "1719"}, + {"emoji": "💟", "name": "heart decoration", "shortname": ":heart_decoration:", "unicode": "1f49f", "html": "💟", "category": "Smileys & Emotion (emotion)", "order": "1299"}, + {"emoji": "💝", "name": "heart with ribbon", "shortname": ":gift_heart:", "unicode": "1f49d", "html": "💝", "category": "Smileys & Emotion (emotion)", "order": "1297"}, + {"emoji": "🎁", "name": "wrapped gift", "shortname": ":gift:", "unicode": "1f381", "html": "🎁", "category": "Activities (event)", "order": "1771"}, + {"emoji": "🍻", "name": "clinking beer mugs", "shortname": ":beers:", "unicode": "1f37b", "html": "🍻", "category": "Food & Drink (drink)", "order": "1530"}, + {"emoji": "😧", "name": "anguished face", "shortname": ":anguished:", "unicode": "1f627", "html": "😧", "category": "Smileys & Emotion (face-concerned)", "order": "57"}, + {"emoji": "🌍", "name": "globe showing Europe-Africa", "shortname": ":earth_africa:", "unicode": "1f30d", "html": "🌍", "category": "Travel & Places (place-map)", "order": "1538"}, + {"emoji": "🎥", "name": "movie camera", "shortname": ":movie_camera:", "unicode": "1f3a5", "html": "🎥", "category": "Objects (light & video)", "order": "1856"}, + {"emoji": "⚓", "name": "anchor", "shortname": ":anchor:", "unicode": "2693", "html": "⚓", "category": "Travel & Places (transport-water)", "order": "1642"}, + {"emoji": "⚡", "name": "high voltage", "shortname": ":zap:", "unicode": "26a1", "html": "⚡", "category": "Travel & Places (sky & weather)", "order": "1748"}, + {"emoji": "♣️", "name": "club suit", "shortname": ":club_suit:", "unicode": "2663 FE0F", "html": "♣️", "category": "Activities (game)", "order": ""}, + {"emoji": "✖️", "name": "multiplication sign", "shortname": ":heavy_multiplication_x:", "unicode": "2716", "html": "✖", "category": "Symbols (other-symbol)", "order": "2081"}, + {"emoji": "🏃🏿♀", "name": "woman running: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C3 1F3FF 200D 2640", "html": "🏃🏿‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏾♀", "name": "woman running: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C3 1F3FE 200D 2640", "html": "🏃🏾‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏽♀", "name": "woman running: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C3 1F3FD 200D 2640", "html": "🏃🏽‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏼♀", "name": "woman running: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C3 1F3FC 200D 2640", "html": "🏃🏼‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏻♀", "name": "woman running: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C3 1F3FB 200D 2640", "html": "🏃🏻‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃♀", "name": "woman running", "shortname": ":woman_running:", "unicode": "1F3C3 200D 2640", "html": "🏃‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏿", "name": "person running: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C3 1F3FF", "html": "🏃🏿", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏾", "name": "person running: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C3 1F3FE", "html": "🏃🏾", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏽", "name": "person running: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C3 1F3FD", "html": "🏃🏽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏼", "name": "person running: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C3 1F3FC", "html": "🏃🏼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏻", "name": "person running: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C3 1F3FB", "html": "🏃🏻", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃", "name": "person running", "shortname": ":runner:", "unicode": "1f3c3", "html": "🏃", "category": "People & Body (person-activity)", "order": "711"}, + {"emoji": "🌻", "name": "sunflower", "shortname": ":sunflower:", "unicode": "1f33b", "html": "🌻", "category": "Animals & Nature (plant-flower)", "order": "1434"}, + {"emoji": "🌎", "name": "globe showing Americas", "shortname": ":earth_americas:", "unicode": "1f30e", "html": "🌎", "category": "Travel & Places (place-map)", "order": "1539"}, + {"emoji": "💐", "name": "bouquet", "shortname": ":bouquet:", "unicode": "1f490", "html": "💐", "category": "Animals & Nature (plant-flower)", "order": "1427"}, + {"emoji": "🐶", "name": "dog face", "shortname": ":dog:", "unicode": "1f436", "html": "🐶", "category": "Animals & Nature (animal-mammal)", "order": "1345"}, + {"emoji": "💰", "name": "money bag", "shortname": ":moneybag:", "unicode": "1f4b0", "html": "💰", "category": "Objects (money)", "order": "1891"}, + {"emoji": "🌿", "name": "herb", "shortname": ":herb:", "unicode": "1f33f", "html": "🌿", "category": "Animals & Nature (plant-other)", "order": "1443"}, + {"emoji": "👫", "name": "woman and man holding hands", "shortname": ":couple:", "unicode": "1f46b", "html": "👫", "category": "People & Body (family)", "order": "1018"}, + {"emoji": "🍂", "name": "fallen leaf", "shortname": ":fallen_leaf:", "unicode": "1f342", "html": "🍂", "category": "Animals & Nature (plant-other)", "order": "1447"}, + {"emoji": "🌷", "name": "tulip", "shortname": ":tulip:", "unicode": "1f337", "html": "🌷", "category": "Animals & Nature (plant-flower)", "order": "1436"}, + {"emoji": "🎂", "name": "birthday cake", "shortname": ":birthday:", "unicode": "1f382", "html": "🎂", "category": "Food & Drink (food-sweet)", "order": "1513"}, + {"emoji": "🐱", "name": "cat face", "shortname": ":cat:", "unicode": "1f431", "html": "🐱", "category": "Animals & Nature (animal-mammal)", "order": "1350"}, + {"emoji": "☕", "name": "hot beverage", "shortname": ":coffee:", "unicode": "2615", "html": "☕", "category": "Food & Drink (drink)", "order": "1522"}, + {"emoji": "😵", "name": "dizzy face", "shortname": ":dizzy_face:", "unicode": "1f635", "html": "😵", "category": "Smileys & Emotion (face-unwell)", "order": "64"}, + {"emoji": "👆🏿", "name": "backhand index pointing up: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F446 1F3FF", "html": "👆🏿", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👆🏾", "name": "backhand index pointing up: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F446 1F3FE", "html": "👆🏾", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👆🏽", "name": "backhand index pointing up: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F446 1F3FD", "html": "👆🏽", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👆🏼", "name": "backhand index pointing up: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F446 1F3FC", "html": "👆🏼", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👆🏻", "name": "backhand index pointing up: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F446 1F3FB", "html": "👆🏻", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "👆", "name": "backhand index pointing up", "shortname": ":point_up_2:", "unicode": "1f446", "html": "👆", "category": "People & Body (hand-single-finger)", "order": "1110"}, + {"emoji": "😮", "name": "face with open mouth", "shortname": ":open_mouth:", "unicode": "1f62e", "html": "😮", "category": "Smileys & Emotion (face-concerned)", "order": "29"}, + {"emoji": "😯", "name": "hushed face", "shortname": ":hushed:", "unicode": "1f62f", "html": "😯", "category": "Smileys & Emotion (face-concerned)", "order": "31"}, + {"emoji": "🏀", "name": "basketball", "shortname": ":basketball:", "unicode": "1f3c0", "html": "🏀", "category": "Activities (sport)", "order": "1783"}, + {"emoji": "🎄", "name": "Christmas tree", "shortname": ":christmas_tree:", "unicode": "1f384", "html": "🎄", "category": "Activities (event)", "order": "1757"}, + {"emoji": "💍", "name": "ring", "shortname": ":ring:", "unicode": "1f48d", "html": "💍", "category": "Objects (clothing)", "order": "1340"}, + {"emoji": "🌝", "name": "full moon face", "shortname": ":full_moon_with_face:", "unicode": "1f31d", "html": "🌝", "category": "Travel & Places (sky & weather)", "order": "1725"}, + {"emoji": "😲", "name": "astonished face", "shortname": ":astonished:", "unicode": "1f632", "html": "😲", "category": "Smileys & Emotion (face-concerned)", "order": "47"}, + {"emoji": "👭", "name": "women holding hands", "shortname": ":two_women_holding_hands:", "unicode": "1f46d", "html": "👭", "category": "People & Body (family)", "order": "1030"}, + {"emoji": "💸", "name": "money with wings", "shortname": ":money_with_wings:", "unicode": "1f4b8", "html": "💸", "category": "Objects (money)", "order": "1896"}, + {"emoji": "😿", "name": "crying cat", "shortname": ":crying_cat_face:", "unicode": "1f63f", "html": "😿", "category": "Smileys & Emotion (cat-face)", "order": "94"}, + {"emoji": "🙉", "name": "hear-no-evil monkey", "shortname": ":hear_no_evil:", "unicode": "1f649", "html": "🙉", "category": "Smileys & Emotion (monkey-face)", "order": "97"}, + {"emoji": "💨", "name": "dashing away", "shortname": ":dash:", "unicode": "1f4a8", "html": "💨", "category": "Smileys & Emotion (emotion)", "order": "1307"}, + {"emoji": "🌵", "name": "cactus", "shortname": ":cactus:", "unicode": "1f335", "html": "🌵", "category": "Animals & Nature (plant-other)", "order": "1441"}, + {"emoji": "♨️", "name": "hot springs", "shortname": ":hotsprings:", "unicode": "2668", "html": "♨", "category": "Travel & Places (place-other)", "order": "1591"}, + {"emoji": "☎️", "name": "telephone", "shortname": ":telephone:", "unicode": "260e", "html": "☎", "category": "Objects (phone)", "order": "1840"}, + {"emoji": "🍁", "name": "maple leaf", "shortname": ":maple_leaf:", "unicode": "1f341", "html": "🍁", "category": "Animals & Nature (plant-other)", "order": "1446"}, + {"emoji": "👸🏿", "name": "princess: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F478 1F3FF", "html": "👸🏿", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👸🏾", "name": "princess: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F478 1F3FE", "html": "👸🏾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👸🏽", "name": "princess: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F478 1F3FD", "html": "👸🏽", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👸🏼", "name": "princess: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F478 1F3FC", "html": "👸🏼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👸🏻", "name": "princess: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F478 1F3FB", "html": "👸🏻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👸", "name": "princess", "shortname": ":princess:", "unicode": "1f478", "html": "👸", "category": "People & Body (person-role)", "order": "459"}, + {"emoji": "💆🏿♂", "name": "man getting massage: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F486 1F3FF 200D 2642", "html": "💆🏿‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏾♂", "name": "man getting massage: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F486 1F3FE 200D 2642", "html": "💆🏾‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏽♂", "name": "man getting massage: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F486 1F3FD 200D 2642", "html": "💆🏽‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏼♂", "name": "man getting massage: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F486 1F3FC 200D 2642", "html": "💆🏼‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏻♂", "name": "man getting massage: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F486 1F3FB 200D 2642", "html": "💆🏻‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆♂", "name": "man getting massage", "shortname": ":man_getting_massage:", "unicode": "1F486 200D 2642", "html": "💆‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏿", "name": "person getting massage: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F486 1F3FF", "html": "💆🏿", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏾", "name": "person getting massage: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F486 1F3FE", "html": "💆🏾", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏽", "name": "person getting massage: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F486 1F3FD", "html": "💆🏽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏼", "name": "person getting massage: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F486 1F3FC", "html": "💆🏼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏻", "name": "person getting massage: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F486 1F3FB", "html": "💆🏻", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆", "name": "person getting massage", "shortname": ":massage:", "unicode": "1f486", "html": "💆", "category": "People & Body (person-activity)", "order": "657"}, + {"emoji": "💌", "name": "love letter", "shortname": ":love_letter:", "unicode": "1f48c", "html": "💌", "category": "Smileys & Emotion (emotion)", "order": "1301"}, + {"emoji": "🏆", "name": "trophy", "shortname": ":trophy:", "unicode": "1f3c6", "html": "🏆", "category": "Activities (award-medal)", "order": "1776"}, + {"emoji": "🙍🏿♂", "name": "man frowning: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64D 1F3FF 200D 2642", "html": "🙍🏿‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏾♂", "name": "man frowning: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64D 1F3FE 200D 2642", "html": "🙍🏾‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏽♂", "name": "man frowning: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64D 1F3FD 200D 2642", "html": "🙍🏽‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏼♂", "name": "man frowning: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64D 1F3FC 200D 2642", "html": "🙍🏼‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏻♂", "name": "man frowning: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64D 1F3FB 200D 2642", "html": "🙍🏻‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍♂", "name": "man frowning", "shortname": ":man_frowning:", "unicode": "1F64D 200D 2642", "html": "🙍‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏿", "name": "person frowning: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64D 1F3FF", "html": "🙍🏿", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏾", "name": "person frowning: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64D 1F3FE", "html": "🙍🏾", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏽", "name": "person frowning: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64D 1F3FD", "html": "🙍🏽", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏼", "name": "person frowning: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64D 1F3FC", "html": "🙍🏼", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏻", "name": "person frowning: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64D 1F3FB", "html": "🙍🏻", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍", "name": "person frowning", "shortname": ":person_frowning:", "unicode": "1f64d", "html": "🙍", "category": "People & Body (person-gesture)", "order": "495"}, + {"emoji": "🇺🇸", "name": "flag: United States", "shortname": ":us:", "unicode": "1f1fa", "html": "🇺", "category": "Flags (country-flag)", "order": ""}, + {"emoji": "🎊", "name": "confetti ball", "shortname": ":confetti_ball:", "unicode": "1f38a", "html": "🎊", "category": "Activities (event)", "order": "1763"}, + {"emoji": "🌼", "name": "blossom", "shortname": ":blossom:", "unicode": "1f33c", "html": "🌼", "category": "Animals & Nature (plant-flower)", "order": "1435"}, + {"emoji": "🔪", "name": "kitchen knife", "shortname": ":kitchen_knife:", "unicode": "1F52A", "html": "🔪", "category": "Food & Drink (dishware)", "order": ""}, + {"emoji": "👄", "name": "mouth", "shortname": ":lips:", "unicode": "1f444", "html": "👄", "category": "People & Body (body-parts)", "order": "1283"}, + {"emoji": "🍟", "name": "french fries", "shortname": ":fries:", "unicode": "1f35f", "html": "🍟", "category": "Food & Drink (food-prepared)", "order": "1483"}, + {"emoji": "🍩", "name": "doughnut", "shortname": ":doughnut:", "unicode": "1f369", "html": "🍩", "category": "Food & Drink (food-sweet)", "order": "1511"}, + {"emoji": "😦", "name": "frowning face with open mouth", "shortname": ":frowning:", "unicode": "1f626", "html": "😦", "category": "Smileys & Emotion (face-concerned)", "order": "56"}, + {"emoji": "🌊", "name": "water wave", "shortname": ":ocean:", "unicode": "1f30a", "html": "🌊", "category": "Travel & Places (sky & weather)", "order": "1755"}, + {"emoji": "💣", "name": "bomb", "shortname": ":bomb:", "unicode": "1f4a3", "html": "💣", "category": "Smileys & Emotion (emotion)", "order": "1304"}, + {"emoji": "🆗", "name": "OK button", "shortname": ":ok:", "unicode": "1f197", "html": "🆗", "category": "Symbols (alphanum)", "order": "2137"}, + {"emoji": "🌀", "name": "cyclone", "shortname": ":cyclone:", "unicode": "1f300", "html": "🌀", "category": "Travel & Places (sky & weather)", "order": "1742"}, + {"emoji": "🚀", "name": "rocket", "shortname": ":rocket:", "unicode": "1f680", "html": "🚀", "category": "Travel & Places (transport-air)", "order": "1659"}, + {"emoji": "☔", "name": "umbrella with rain drops", "shortname": ":umbrella:", "unicode": "2614", "html": "☔", "category": "Travel & Places (sky & weather)", "order": "1746"}, + {"emoji": "💏", "name": "kiss", "shortname": ":couplekiss:", "unicode": "1f48f", "html": "💏", "category": "People & Body (family)", "order": "1036"}, + {"emoji": "👩❤️💋👩", "name": "kiss: woman, woman", "shortname": ":couple_woman_kiss:", "unicode": "1F469 200D 2764 FE0F 200D 1F48B 200D 1F469", "html": "👩‍❤‍💋‍👩", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨❤️💋👨", "name": "kiss: man, man", "shortname": ":couple_man_kiss:", "unicode": "1F468 200D 2764 FE0F 200D 1F48B 200D 1F468", "html": "👨‍❤‍💋‍👨", "category": "People & Body (family)", "order": ""}, + {"emoji": "💑", "name": "couple with heart", "shortname": ":couple_with_heart:", "unicode": "1f491", "html": "💑", "category": "People & Body (family)", "order": "1040"}, + {"emoji": "👩❤️👩", "name": "couple with heart: woman, woman", "shortname": ":woman_woman:", "unicode": "1F469 200D 2764 FE0F 200D 1F469", "html": "👩‍❤‍👩", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨❤️👨", "name": "couple with heart: man, man", "shortname": ":man_man_love:", "unicode": "1F468 200D 2764 FE0F 200D 1F468", "html": "👨‍❤‍👨", "category": "People & Body (family)", "order": ""}, + {"emoji": "🍭", "name": "lollipop", "shortname": ":lollipop:", "unicode": "1f36d", "html": "🍭", "category": "Food & Drink (food-sweet)", "order": "1517"}, + {"emoji": "🎬", "name": "clapper board", "shortname": ":clapper:", "unicode": "1f3ac", "html": "🎬", "category": "Objects (light & video)", "order": "1859"}, + {"emoji": "🐷", "name": "pig face", "shortname": ":pig:", "unicode": "1f437", "html": "🐷", "category": "Animals & Nature (animal-mammal)", "order": "1364"}, + {"emoji": "😈", "name": "smiling face with horns", "shortname": ":smiling_imp:", "unicode": "1f608", "html": "😈", "category": "Smileys & Emotion (face-negative)", "order": "76"}, + {"emoji": "👿", "name": "angry face with horns", "shortname": ":imp:", "unicode": "1f47f", "html": "👿", "category": "Smileys & Emotion (face-negative)", "order": "77"}, + {"emoji": "🐝", "name": "honeybee", "shortname": ":bee:", "unicode": "1f41d", "html": "🐝", "category": "Animals & Nature (animal-bug)", "order": "1422"}, + {"emoji": "😽", "name": "kissing cat", "shortname": ":kissing_cat:", "unicode": "1f63d", "html": "😽", "category": "Smileys & Emotion (cat-face)", "order": "92"}, + {"emoji": "💢", "name": "anger symbol", "shortname": ":anger:", "unicode": "1f4a2", "html": "💢", "category": "Smileys & Emotion (emotion)", "order": "1303"}, + {"emoji": "🎼", "name": "musical score", "shortname": ":musical_score:", "unicode": "1f3bc", "html": "🎼", "category": "Objects (music)", "order": "1823"}, + {"emoji": "🎅🏿", "name": "Santa Claus: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F385 1F3FF", "html": "🎅🏿", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🎅🏾", "name": "Santa Claus: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F385 1F3FE", "html": "🎅🏾", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🎅🏽", "name": "Santa Claus: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F385 1F3FD", "html": "🎅🏽", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🎅🏼", "name": "Santa Claus: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F385 1F3FC", "html": "🎅🏼", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🎅🏻", "name": "Santa Claus: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F385 1F3FB", "html": "🎅🏻", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🎅", "name": "Santa Claus", "shortname": ":santa:", "unicode": "1f385", "html": "🎅", "category": "People & Body (person-fantasy)", "order": "447"}, + {"emoji": "🌏", "name": "globe showing Asia-Australia", "shortname": ":earth_asia:", "unicode": "1f30f", "html": "🌏", "category": "Travel & Places (place-map)", "order": "1540"}, + {"emoji": "🏈", "name": "american football", "shortname": ":football:", "unicode": "1f3c8", "html": "🏈", "category": "Activities (sport)", "order": "1785"}, + {"emoji": "🎸", "name": "guitar", "shortname": ":guitar:", "unicode": "1f3b8", "html": "🎸", "category": "Objects (musical-instrument)", "order": "1833"}, + {"emoji": "♦️", "name": "diamond suit", "shortname": ":diamond_suit:", "unicode": "2666 FE0F", "html": "♦️", "category": "Activities (game)", "order": ""}, + {"emoji": "🐼", "name": "panda", "shortname": ":panda_face:", "unicode": "1f43c", "html": "🐼", "category": "Animals & Nature (animal-mammal)", "order": "1385"}, + {"emoji": "💬", "name": "speech balloon", "shortname": ":speech_balloon:", "unicode": "1f4ac", "html": "💬", "category": "Smileys & Emotion (emotion)", "order": "1309"}, + {"emoji": "🍓", "name": "strawberry", "shortname": ":strawberry:", "unicode": "1f353", "html": "🍓", "category": "Food & Drink (food-fruit)", "order": "1461"}, + {"emoji": "😼", "name": "cat with wry smile", "shortname": ":smirk_cat:", "unicode": "1f63c", "html": "😼", "category": "Smileys & Emotion (cat-face)", "order": "91"}, + {"emoji": "🍌", "name": "banana", "shortname": ":banana:", "unicode": "1f34c", "html": "🍌", "category": "Food & Drink (food-fruit)", "order": "1454"}, + {"emoji": "🍉", "name": "watermelon", "shortname": ":watermelon:", "unicode": "1f349", "html": "🍉", "category": "Food & Drink (food-fruit)", "order": "1451"}, + {"emoji": "⛄", "name": "snowman without snow", "shortname": ":snowman:", "unicode": "26c4", "html": "⛄", "category": "Travel & Places (sky & weather)", "order": "1751"}, + {"emoji": "😸", "name": "grinning cat with smiling eyes", "shortname": ":smile_cat:", "unicode": "1f638", "html": "😸", "category": "Smileys & Emotion (cat-face)", "order": "88"}, + {"emoji": "♠️", "name": "spade suit", "shortname": ":spade_suit:", "unicode": "2660 FE0F", "html": "♠️", "category": "Activities (game)", "order": ""}, + {"emoji": "🔝", "name": "TOP arrow", "shortname": ":top:", "unicode": "1f51d", "html": "🔝", "category": "Symbols (arrow)", "order": "2022"}, + {"emoji": "🍆", "name": "eggplant", "shortname": ":eggplant:", "unicode": "1f346", "html": "🍆", "category": "Food & Drink (food-vegetable)", "order": "1465"}, + {"emoji": "🔮", "name": "crystal ball", "shortname": ":crystal_ball:", "unicode": "1f52e", "html": "🔮", "category": "Activities (game)", "order": "1974"}, + {"emoji": "🍴", "name": "fork and knife", "shortname": ":fork_and_knife:", "unicode": "1f374", "html": "🍴", "category": "Food & Drink (dishware)", "order": "1534"}, + {"emoji": "📲", "name": "mobile phone with arrow", "shortname": ":calling:", "unicode": "1f4f2", "html": "📲", "category": "Objects (phone)", "order": "1839"}, + {"emoji": "📱", "name": "mobile phone", "shortname": ":iphone:", "unicode": "1f4f1", "html": "📱", "category": "Objects (phone)", "order": "1838"}, + {"emoji": "⛅", "name": "sun behind cloud", "shortname": ":partly_sunny:", "unicode": "26c5", "html": "⛅", "category": "Travel & Places (sky & weather)", "order": "1731"}, + {"emoji": "⚠️", "name": "warning", "shortname": ":warning:", "unicode": "26a0", "html": "⚠", "category": "Symbols (warning)", "order": "1989"}, + {"emoji": "🙀", "name": "weary cat", "shortname": ":scream_cat:", "unicode": "1f640", "html": "🙀", "category": "Smileys & Emotion (cat-face)", "order": "93"}, + {"emoji": "🔸", "name": "small orange diamond", "shortname": ":small_orange_diamond:", "unicode": "1f538", "html": "🔸", "category": "Symbols (geometric)", "order": "2169"}, + {"emoji": "👶🏿", "name": "baby: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F476 1F3FF", "html": "👶🏿", "category": "People & Body (person)", "order": ""}, + {"emoji": "👶🏾", "name": "baby: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F476 1F3FE", "html": "👶🏾", "category": "People & Body (person)", "order": ""}, + {"emoji": "👶🏽", "name": "baby: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F476 1F3FD", "html": "👶🏽", "category": "People & Body (person)", "order": ""}, + {"emoji": "👶🏼", "name": "baby: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F476 1F3FC", "html": "👶🏼", "category": "People & Body (person)", "order": ""}, + {"emoji": "👶🏻", "name": "baby: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F476 1F3FB", "html": "👶🏻", "category": "People & Body (person)", "order": ""}, + {"emoji": "👶", "name": "baby", "shortname": ":baby:", "unicode": "1f476", "html": "👶", "category": "People & Body (person)", "order": "135"}, + {"emoji": "🐾", "name": "paw prints", "shortname": ":feet:", "unicode": "1f43e", "html": "🐾", "category": "Animals & Nature (animal-mammal)", "order": "1386"}, + {"emoji": "👣", "name": "footprints", "shortname": ":footprints:", "unicode": "1f463", "html": "👣", "category": "People & Body (person-symbol)", "order": "1278"}, + {"emoji": "🍺", "name": "beer mug", "shortname": ":beer:", "unicode": "1f37a", "html": "🍺", "category": "Food & Drink (drink)", "order": "1529"}, + {"emoji": "🍷", "name": "wine glass", "shortname": ":wine_glass:", "unicode": "1f377", "html": "🍷", "category": "Food & Drink (drink)", "order": "1526"}, + {"emoji": "⭕", "name": "hollow red circle", "shortname": ":o:", "unicode": "2b55", "html": "⭕", "category": "Symbols (other-symbol)", "order": "2077"}, + {"emoji": "📹", "name": "video camera", "shortname": ":video_camera:", "unicode": "1f4f9", "html": "📹", "category": "Objects (light & video)", "order": "1863"}, + {"emoji": "🐰", "name": "rabbit face", "shortname": ":rabbit:", "unicode": "1f430", "html": "🐰", "category": "Animals & Nature (animal-mammal)", "order": "1379"}, + {"emoji": "🍹", "name": "tropical drink", "shortname": ":tropical_drink:", "unicode": "1f379", "html": "🍹", "category": "Food & Drink (drink)", "order": "1528"}, + {"emoji": "🚬", "name": "cigarette", "shortname": ":smoking:", "unicode": "1f6ac", "html": "🚬", "category": "Objects (other-object)", "order": "1969"}, + {"emoji": "👾", "name": "alien monster", "shortname": ":space_invader:", "unicode": "1f47e", "html": "👾", "category": "Smileys & Emotion (face-costume)", "order": "84"}, + {"emoji": "🍑", "name": "peach", "shortname": ":peach:", "unicode": "1f351", "html": "🍑", "category": "Food & Drink (food-fruit)", "order": "1459"}, + {"emoji": "🐍", "name": "snake", "shortname": ":snake:", "unicode": "1f40d", "html": "🐍", "category": "Animals & Nature (animal-reptile)", "order": "1403"}, + {"emoji": "🐢", "name": "turtle", "shortname": ":turtle:", "unicode": "1f422", "html": "🐢", "category": "Animals & Nature (animal-reptile)", "order": "1401"}, + {"emoji": "🍒", "name": "cherries", "shortname": ":cherries:", "unicode": "1f352", "html": "🍒", "category": "Food & Drink (food-fruit)", "order": "1460"}, + {"emoji": "😗", "name": "kissing face", "shortname": ":kissing:", "unicode": "1f617", "html": "😗", "category": "Smileys & Emotion (face-affection)", "order": "15"}, + {"emoji": "🐸", "name": "frog", "shortname": ":frog:", "unicode": "1f438", "html": "🐸", "category": "Animals & Nature (animal-amphibian)", "order": "1399"}, + {"emoji": "🌌", "name": "milky way", "shortname": ":milky_way:", "unicode": "1f30c", "html": "🌌", "category": "Travel & Places (sky & weather)", "order": "1592"}, + {"emoji": "🚨", "name": "police car light", "shortname": ":rotating_light:", "unicode": "1f6a8", "html": "🚨", "category": "Travel & Places (transport-ground)", "order": "1637"}, + {"emoji": "🐣", "name": "hatching chick", "shortname": ":hatching_chick:", "unicode": "1f423", "html": "🐣", "category": "Animals & Nature (animal-bird)", "order": "1390"}, + {"emoji": "📕", "name": "closed book", "shortname": ":closed_book:", "unicode": "1f4d5", "html": "📕", "category": "Objects (book-paper)", "order": "1875"}, + {"emoji": "🍬", "name": "candy", "shortname": ":candy:", "unicode": "1f36c", "html": "🍬", "category": "Food & Drink (food-sweet)", "order": "1516"}, + {"emoji": "🍔", "name": "hamburger", "shortname": ":hamburger:", "unicode": "1f354", "html": "🍔", "category": "Food & Drink (food-prepared)", "order": "1482"}, + {"emoji": "🐻", "name": "bear", "shortname": ":bear:", "unicode": "1f43b", "html": "🐻", "category": "Animals & Nature (animal-mammal)", "order": "1383"}, + {"emoji": "🐯", "name": "tiger face", "shortname": ":tiger:", "unicode": "1f42f", "html": "🐯", "category": "Animals & Nature (animal-mammal)", "order": "1353"}, + {"emoji": "🚗", "name": "automobile", "shortname": ":automobile:", "unicode": "1F697", "html": "🚗", "category": "Travel & Places (transport-ground)", "order": ""}, + {"emoji": "⏩", "name": "fast-forward button", "shortname": ":fast_forward:", "unicode": "2.3E+10", "html": "⏩", "category": "Symbols (av-symbol)", "order": "2052"}, + {"emoji": "🍦", "name": "soft ice cream", "shortname": ":icecream:", "unicode": "1f366", "html": "🍦", "category": "Food & Drink (food-sweet)", "order": "1508"}, + {"emoji": "🍍", "name": "pineapple", "shortname": ":pineapple:", "unicode": "1f34d", "html": "🍍", "category": "Food & Drink (food-fruit)", "order": "1455"}, + {"emoji": "🌾", "name": "sheaf of rice", "shortname": ":ear_of_rice:", "unicode": "1f33e", "html": "🌾", "category": "Animals & Nature (plant-other)", "order": "1442"}, + {"emoji": "💉", "name": "syringe", "shortname": ":syringe:", "unicode": "1f489", "html": "💉", "category": "Objects (medical)", "order": "1967"}, + {"emoji": "🚮", "name": "litter in bin sign", "shortname": ":put_litter_in_its_place:", "unicode": "1f6ae", "html": "🚮", "category": "Symbols (transport-sign)", "order": "1977"}, + {"emoji": "🍫", "name": "chocolate bar", "shortname": ":chocolate_bar:", "unicode": "1f36b", "html": "🍫", "category": "Food & Drink (food-sweet)", "order": "1515"}, + {"emoji": "▪️", "name": "black small square", "shortname": ":black_small_square:", "unicode": "25aa", "html": "▪", "category": "Symbols (geometric)", "order": "2159"}, + {"emoji": "📺", "name": "television", "shortname": ":tv:", "unicode": "1f4fa", "html": "📺", "category": "Objects (light & video)", "order": "1860"}, + {"emoji": "💊", "name": "pill", "shortname": ":pill:", "unicode": "1f48a", "html": "💊", "category": "Objects (medical)", "order": "1968"}, + {"emoji": "🐙", "name": "octopus", "shortname": ":octopus:", "unicode": "1f419", "html": "🐙", "category": "Animals & Nature (animal-marine)", "order": "1413"}, + {"emoji": "🎃", "name": "jack-o-lantern", "shortname": ":jack_o_lantern:", "unicode": "1f383", "html": "🎃", "category": "Activities (event)", "order": "1756"}, + {"emoji": "🍇", "name": "grapes", "shortname": ":grapes:", "unicode": "1f347", "html": "🍇", "category": "Food & Drink (food-fruit)", "order": "1449"}, + {"emoji": "😺", "name": "grinning cat", "shortname": ":smiley_cat:", "unicode": "1f63a", "html": "😺", "category": "Smileys & Emotion (cat-face)", "order": "87"}, + {"emoji": "💿", "name": "optical disk", "shortname": ":cd:", "unicode": "1f4bf", "html": "💿", "category": "Objects (computer)", "order": "1854"}, + {"emoji": "🍸", "name": "cocktail glass", "shortname": ":cocktail:", "unicode": "1f378", "html": "🍸", "category": "Food & Drink (drink)", "order": "1527"}, + {"emoji": "🍰", "name": "shortcake", "shortname": ":cake:", "unicode": "1f370", "html": "🍰", "category": "Food & Drink (food-sweet)", "order": "1514"}, + {"emoji": "🎮", "name": "video game", "shortname": ":video_game:", "unicode": "1f3ae", "html": "🎮", "category": "Activities (game)", "order": "1804"}, + {"emoji": "™️", "name": "trade mark", "shortname": ":trade_mark:", "unicode": "2122 FE0F", "html": "™️", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "⬇️", "name": "down arrow", "shortname": ":arrow_down:", "unicode": "2b07", "html": "⬇", "category": "Symbols (arrow)", "order": "2006"}, + {"emoji": "🚫", "name": "prohibited", "shortname": ":no_entry_sign:", "unicode": "1f6ab", "html": "🚫", "category": "Symbols (warning)", "order": "1992"}, + {"emoji": "💄", "name": "lipstick", "shortname": ":lipstick:", "unicode": "1f484", "html": "💄", "category": "Objects (clothing)", "order": "1339"}, + {"emoji": "🐳", "name": "spouting whale", "shortname": ":whale:", "unicode": "1f433", "html": "🐳", "category": "Animals & Nature (animal-marine)", "order": "1406"}, + {"emoji": "📝", "name": "memo", "shortname": ":memo:", "unicode": "1F4DD", "html": "📝", "category": "Objects (writing)", "order": ""}, + {"emoji": "®️", "name": "registered", "shortname": ":registered:", "unicode": "00AE FE0F", "html": "®️", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "🍪", "name": "cookie", "shortname": ":cookie:", "unicode": "1f36a", "html": "🍪", "category": "Food & Drink (food-sweet)", "order": "1512"}, + {"emoji": "🐬", "name": "dolphin", "shortname": ":dolphin:", "unicode": "1f42c", "html": "🐬", "category": "Animals & Nature (animal-marine)", "order": "1408"}, + {"emoji": "🔊", "name": "speaker high volume", "shortname": ":loud_sound:", "unicode": "1f50a", "html": "🔊", "category": "Objects (sound)", "order": "1817"}, + {"emoji": "👨🏿", "name": "man: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF", "html": "👨🏿", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏾", "name": "man: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE", "html": "👨🏾", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏽", "name": "man: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD", "html": "👨🏽", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏼", "name": "man: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC", "html": "👨🏼", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏻", "name": "man: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB", "html": "👨🏻", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨", "name": "man", "shortname": ":man:", "unicode": "1f468", "html": "👨", "category": "People & Body (person)", "order": "111"}, + {"emoji": "🐥", "name": "front-facing baby chick", "shortname": ":hatched_chick:", "unicode": "1f425", "html": "🐥", "category": "Animals & Nature (animal-bird)", "order": "1392"}, + {"emoji": "🐒", "name": "monkey", "shortname": ":monkey:", "unicode": "1f412", "html": "🐒", "category": "Animals & Nature (animal-mammal)", "order": "1343"}, + {"emoji": "📚", "name": "books", "shortname": ":books:", "unicode": "1f4da", "html": "📚", "category": "Objects (book-paper)", "order": "1880"}, + {"emoji": "👹", "name": "ogre", "shortname": ":japanese_ogre:", "unicode": "1f479", "html": "👹", "category": "Smileys & Emotion (face-costume)", "order": "78"}, + {"emoji": "💂🏿♀", "name": "woman guard: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F482 1F3FF 200D 2640", "html": "💂🏿‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏾♀", "name": "woman guard: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F482 1F3FE 200D 2640", "html": "💂🏾‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏽♀", "name": "woman guard: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F482 1F3FD 200D 2640", "html": "💂🏽‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏼♀", "name": "woman guard: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F482 1F3FC 200D 2640", "html": "💂🏼‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏻♀", "name": "woman guard: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F482 1F3FB 200D 2640", "html": "💂🏻‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂♀", "name": "woman guard", "shortname": ":woman_guard:", "unicode": "1F482 200D 2640", "html": "💂‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏿", "name": "guard: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F482 1F3FF", "html": "💂🏿", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏾", "name": "guard: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F482 1F3FE", "html": "💂🏾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏽", "name": "guard: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F482 1F3FD", "html": "💂🏽", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏼", "name": "guard: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F482 1F3FC", "html": "💂🏼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏻", "name": "guard: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F482 1F3FB", "html": "💂🏻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂", "name": "guard", "shortname": ":guardsman:", "unicode": "1f482", "html": "💂", "category": "People & Body (person-role)", "order": "375"}, + {"emoji": "📢", "name": "loudspeaker", "shortname": ":loudspeaker:", "unicode": "1f4e2", "html": "📢", "category": "Objects (sound)", "order": "1818"}, + {"emoji": "✂️", "name": "scissors", "shortname": ":scissors:", "unicode": "2702", "html": "✂", "category": "Objects (office)", "order": "1940"}, + {"emoji": "👧🏿", "name": "girl: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F467 1F3FF", "html": "👧🏿", "category": "People & Body (person)", "order": ""}, + {"emoji": "👧🏾", "name": "girl: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F467 1F3FE", "html": "👧🏾", "category": "People & Body (person)", "order": ""}, + {"emoji": "👧🏽", "name": "girl: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F467 1F3FD", "html": "👧🏽", "category": "People & Body (person)", "order": ""}, + {"emoji": "👧🏼", "name": "girl: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F467 1F3FC", "html": "👧🏼", "category": "People & Body (person)", "order": ""}, + {"emoji": "👧🏻", "name": "girl: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F467 1F3FB", "html": "👧🏻", "category": "People & Body (person)", "order": ""}, + {"emoji": "👧", "name": "girl", "shortname": ":girl:", "unicode": "1f467", "html": "👧", "category": "People & Body (person)", "order": "105"}, + {"emoji": "🎓", "name": "graduation cap", "shortname": ":mortar_board:", "unicode": "1f393", "html": "🎓", "category": "Objects (clothing)", "order": "1336"}, + {"emoji": "🇫🇷", "name": "flag: France", "shortname": ":fr:", "unicode": "1f1eb", "html": "🇫", "category": "Flags (country-flag)", "order": ""}, + {"emoji": "⚾️", "name": "", "shortname": ":baseball:", "unicode": "26be", "html": "⚾", "category": "", "order": "1782"}, + {"emoji": "🚦", "name": "vertical traffic light", "shortname": ":vertical_traffic_light:", "unicode": "1f6a6", "html": "🚦", "category": "Travel & Places (transport-ground)", "order": "1639"}, + {"emoji": "👩🏿", "name": "woman: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF", "html": "👩🏿", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏾", "name": "woman: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE", "html": "👩🏾", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏽", "name": "woman: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD", "html": "👩🏽", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏼", "name": "woman: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC", "html": "👩🏼", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏻", "name": "woman: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB", "html": "👩🏻", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩", "name": "woman", "shortname": ":woman:", "unicode": "1f469", "html": "👩", "category": "People & Body (person)", "order": "117"}, + {"emoji": "🎆", "name": "fireworks", "shortname": ":fireworks:", "unicode": "1f386", "html": "🎆", "category": "Activities (event)", "order": "1758"}, + {"emoji": "🌠", "name": "shooting star", "shortname": ":stars:", "unicode": "1f320", "html": "🌠", "category": "Travel & Places (sky & weather)", "order": "1729"}, + {"emoji": "🆘", "name": "SOS button", "shortname": ":sos:", "unicode": "1f198", "html": "🆘", "category": "Symbols (alphanum)", "order": "2139"}, + {"emoji": "🍄", "name": "mushroom", "shortname": ":mushroom:", "unicode": "1f344", "html": "🍄", "category": "Food & Drink (food-vegetable)", "order": "1471"}, + {"emoji": "😾", "name": "pouting cat", "shortname": ":pouting_cat:", "unicode": "1f63e", "html": "😾", "category": "Smileys & Emotion (cat-face)", "order": "95"}, + {"emoji": "🛅", "name": "left luggage", "shortname": ":left_luggage:", "unicode": "1f6c5", "html": "🛅", "category": "Symbols (transport-sign)", "order": "1988"}, + {"emoji": "👠", "name": "high-heeled shoe", "shortname": ":high_heel:", "unicode": "1f460", "html": "👠", "category": "Objects (clothing)", "order": "1330"}, + {"emoji": "🎯", "name": "direct hit", "shortname": ":dart:", "unicode": "1f3af", "html": "🎯", "category": "Activities (game)", "order": "1798"}, + {"emoji": "🏊🏿♀", "name": "woman swimming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CA 1F3FF 200D 2640", "html": "🏊🏿‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏾♀", "name": "woman swimming: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CA 1F3FE 200D 2640", "html": "🏊🏾‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏽♀", "name": "woman swimming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CA 1F3FD 200D 2640", "html": "🏊🏽‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏼♀", "name": "woman swimming: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CA 1F3FC 200D 2640", "html": "🏊🏼‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏻♀", "name": "woman swimming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CA 1F3FB 200D 2640", "html": "🏊🏻‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊♀", "name": "woman swimming", "shortname": ":woman_swimming:", "unicode": "1F3CA 200D 2640", "html": "🏊‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏿", "name": "person swimming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CA 1F3FF", "html": "🏊🏿", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏾", "name": "person swimming: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CA 1F3FE", "html": "🏊🏾", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏽", "name": "person swimming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CA 1F3FD", "html": "🏊🏽", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏼", "name": "person swimming: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CA 1F3FC", "html": "🏊🏼", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏻", "name": "person swimming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CA 1F3FB", "html": "🏊🏻", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊", "name": "person swimming", "shortname": ":swimmer:", "unicode": "1f3ca", "html": "🏊", "category": "People & Body (person-sport)", "order": "836"}, + {"emoji": "🔑", "name": "key", "shortname": ":key:", "unicode": "1f511", "html": "🔑", "category": "Objects (lock)", "order": "1948"}, + {"emoji": "👙", "name": "bikini", "shortname": ":bikini:", "unicode": "1f459", "html": "👙", "category": "Objects (clothing)", "order": "1321"}, + {"emoji": "👪", "name": "family", "shortname": ":family:", "unicode": "1f46a", "html": "👪", "category": "People & Body (family)", "order": "1044"}, + {"emoji": "✏", "name": "pencil", "shortname": ":pencil2:", "unicode": "270f", "html": "✏", "category": "Objects (writing)", "order": "1914"}, + {"emoji": "🐘", "name": "elephant", "shortname": ":elephant:", "unicode": "1f418", "html": "🐘", "category": "Animals & Nature (animal-mammal)", "order": "1373"}, + {"emoji": "💧", "name": "droplet", "shortname": ":droplet:", "unicode": "1f4a7", "html": "💧", "category": "Travel & Places (sky & weather)", "order": "1754"}, + {"emoji": "🌱", "name": "seedling", "shortname": ":seedling:", "unicode": "1f331", "html": "🌱", "category": "Animals & Nature (plant-other)", "order": "1437"}, + {"emoji": "🍎", "name": "red apple", "shortname": ":apple:", "unicode": "1f34e", "html": "🍎", "category": "Food & Drink (food-fruit)", "order": "1456"}, + {"emoji": "🆒", "name": "COOL button", "shortname": ":cool:", "unicode": "1f192", "html": "🆒", "category": "Symbols (alphanum)", "order": "2129"}, + {"emoji": "📞", "name": "telephone receiver", "shortname": ":telephone_receiver:", "unicode": "1f4de", "html": "📞", "category": "Objects (phone)", "order": "1841"}, + {"emoji": "💵", "name": "dollar banknote", "shortname": ":dollar:", "unicode": "1f4b5", "html": "💵", "category": "Objects (money)", "order": "1893"}, + {"emoji": "🏡", "name": "house with garden", "shortname": ":house_with_garden:", "unicode": "1f3e1", "html": "🏡", "category": "Travel & Places (place-building)", "order": "1560"}, + {"emoji": "📖", "name": "open book", "shortname": ":book:", "unicode": "1f4d6", "html": "📖", "category": "Objects (book-paper)", "order": "1876"}, + {"emoji": "💇🏿♂", "name": "man getting haircut: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F487 1F3FF 200D 2642", "html": "💇🏿‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏾♂", "name": "man getting haircut: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F487 1F3FE 200D 2642", "html": "💇🏾‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏽♂", "name": "man getting haircut: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F487 1F3FD 200D 2642", "html": "💇🏽‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏼♂", "name": "man getting haircut: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F487 1F3FC 200D 2642", "html": "💇🏼‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏻♂", "name": "man getting haircut: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F487 1F3FB 200D 2642", "html": "💇🏻‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇♂", "name": "man getting haircut", "shortname": ":man_getting_haircut:", "unicode": "1F487 200D 2642", "html": "💇‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏿", "name": "person getting haircut: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F487 1F3FF", "html": "💇🏿", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏾", "name": "person getting haircut: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F487 1F3FE", "html": "💇🏾", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏽", "name": "person getting haircut: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F487 1F3FD", "html": "💇🏽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏼", "name": "person getting haircut: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F487 1F3FC", "html": "💇🏼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏻", "name": "person getting haircut: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F487 1F3FB", "html": "💇🏻", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇", "name": "person getting haircut", "shortname": ":haircut:", "unicode": "1f487", "html": "💇", "category": "People & Body (person-activity)", "order": "675"}, + {"emoji": "💻", "name": "laptop", "shortname": ":computer:", "unicode": "1f4bb", "html": "💻", "category": "Objects (computer)", "order": "1846"}, + {"emoji": "💡", "name": "light bulb", "shortname": ":bulb:", "unicode": "1f4a1", "html": "💡", "category": "Objects (light & video)", "order": "1871"}, + {"emoji": "❓", "name": "question mark", "shortname": ":question:", "unicode": "2753", "html": "❓", "category": "Symbols (other-symbol)", "order": "2098"}, + {"emoji": "🔙", "name": "BACK arrow", "shortname": ":back:", "unicode": "1f519", "html": "🔙", "category": "Symbols (arrow)", "order": "2018"}, + {"emoji": "👦🏿", "name": "boy: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F466 1F3FF", "html": "👦🏿", "category": "People & Body (person)", "order": ""}, + {"emoji": "👦🏾", "name": "boy: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F466 1F3FE", "html": "👦🏾", "category": "People & Body (person)", "order": ""}, + {"emoji": "👦🏽", "name": "boy: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F466 1F3FD", "html": "👦🏽", "category": "People & Body (person)", "order": ""}, + {"emoji": "👦🏼", "name": "boy: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F466 1F3FC", "html": "👦🏼", "category": "People & Body (person)", "order": ""}, + {"emoji": "👦🏻", "name": "boy: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F466 1F3FB", "html": "👦🏻", "category": "People & Body (person)", "order": ""}, + {"emoji": "👦", "name": "boy", "shortname": ":boy:", "unicode": "1f466", "html": "👦", "category": "People & Body (person)", "order": "99"}, + {"emoji": "🔐", "name": "locked with key", "shortname": ":closed_lock_with_key:", "unicode": "1f510", "html": "🔐", "category": "Objects (lock)", "order": "1947"}, + {"emoji": "🙎🏿♂", "name": "man pouting: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64E 1F3FF 200D 2642", "html": "🙎🏿‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏾♂", "name": "man pouting: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64E 1F3FE 200D 2642", "html": "🙎🏾‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏽♂", "name": "man pouting: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64E 1F3FD 200D 2642", "html": "🙎🏽‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏼♂", "name": "man pouting: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64E 1F3FC 200D 2642", "html": "🙎🏼‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏻♂", "name": "man pouting: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64E 1F3FB 200D 2642", "html": "🙎🏻‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎♂", "name": "man pouting", "shortname": ":man_pouting:", "unicode": "1F64E 200D 2642", "html": "🙎‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏿", "name": "person pouting: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64E 1F3FF", "html": "🙎🏿", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏾", "name": "person pouting: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64E 1F3FE", "html": "🙎🏾", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏽", "name": "person pouting: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64E 1F3FD", "html": "🙎🏽", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏼", "name": "person pouting: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64E 1F3FC", "html": "🙎🏼", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏻", "name": "person pouting: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64E 1F3FB", "html": "🙎🏻", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎", "name": "person pouting", "shortname": ":person_with_pouting_face:", "unicode": "1f64e", "html": "🙎", "category": "People & Body (person-gesture)", "order": "513"}, + {"emoji": "🍊", "name": "tangerine", "shortname": ":tangerine:", "unicode": "1f34a", "html": "🍊", "category": "Food & Drink (food-fruit)", "order": "1452"}, + {"emoji": "↔️", "name": "left-right arrow", "shortname": ":leftright_arrow:", "unicode": "2194 FE0F", "html": "↔️", "category": "Symbols (arrow)", "order": ""}, + {"emoji": "🌅", "name": "sunrise", "shortname": ":sunrise:", "unicode": "1f305", "html": "🌅", "category": "Travel & Places (place-other)", "order": "1587"}, + {"emoji": "🍗", "name": "poultry leg", "shortname": ":poultry_leg:", "unicode": "1f357", "html": "🍗", "category": "Food & Drink (food-prepared)", "order": "1480"}, + {"emoji": "🔵", "name": "blue circle", "shortname": ":blue_circle:", "unicode": "1f535", "html": "🔵", "category": "Symbols (geometric)", "order": "2180"}, + {"emoji": "🚘", "name": "oncoming automobile", "shortname": ":oncoming_automobile:", "unicode": "1f698", "html": "🚘", "category": "Travel & Places (transport-ground)", "order": "1625"}, + {"emoji": "🍧", "name": "shaved ice", "shortname": ":shaved_ice:", "unicode": "1f367", "html": "🍧", "category": "Food & Drink (food-sweet)", "order": "1509"}, + {"emoji": "🇮🇹", "name": "flag: Italy", "shortname": ":it:", "unicode": "1F1EE 1F1F9", "html": "🇮", "category": "Flags (country-flag)", "order": ""}, + {"emoji": "🐦", "name": "bird", "shortname": ":bird:", "unicode": "1f426", "html": "🐦", "category": "Animals & Nature (animal-bird)", "order": "1393"}, + {"emoji": "🇬🇧", "name": "flag: United Kingdom", "shortname": ":gb:", "unicode": "1F1EC 1F1E7", "html": "🇬", "category": "Flags (country-flag)", "order": ""}, + {"emoji": "🌛", "name": "first quarter moon face", "shortname": ":first_quarter_moon_with_face:", "unicode": "1f31b", "html": "🌛", "category": "Travel & Places (sky & weather)", "order": "1721"}, + {"emoji": "👓", "name": "glasses", "shortname": ":eyeglasses:", "unicode": "1f453", "html": "👓", "category": "Objects (clothing)", "order": "1314"}, + {"emoji": "🐐", "name": "goat", "shortname": ":goat:", "unicode": "1f410", "html": "🐐", "category": "Animals & Nature (animal-mammal)", "order": "1370"}, + {"emoji": "🌃", "name": "night with stars", "shortname": ":night_with_stars:", "unicode": "1f303", "html": "🌃", "category": "Travel & Places (place-other)", "order": "1585"}, + {"emoji": "👵🏿", "name": "old woman: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F475 1F3FF", "html": "👵🏿", "category": "People & Body (person)", "order": ""}, + {"emoji": "👵🏾", "name": "old woman: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F475 1F3FE", "html": "👵🏾", "category": "People & Body (person)", "order": ""}, + {"emoji": "👵🏽", "name": "old woman: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F475 1F3FD", "html": "👵🏽", "category": "People & Body (person)", "order": ""}, + {"emoji": "👵🏼", "name": "old woman: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F475 1F3FC", "html": "👵🏼", "category": "People & Body (person)", "order": ""}, + {"emoji": "👵🏻", "name": "old woman: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F475 1F3FB", "html": "👵🏻", "category": "People & Body (person)", "order": ""}, + {"emoji": "👵", "name": "old woman", "shortname": ":older_woman:", "unicode": "1f475", "html": "👵", "category": "People & Body (person)", "order": "129"}, + {"emoji": "⚫", "name": "black circle", "shortname": ":black_circle:", "unicode": "26ab", "html": "⚫", "category": "Symbols (geometric)", "order": "2178"}, + {"emoji": "🌑", "name": "new moon", "shortname": ":new_moon:", "unicode": "1f311", "html": "🌑", "category": "Travel & Places (sky & weather)", "order": "1711"}, + {"emoji": "👬", "name": "men holding hands", "shortname": ":two_men_holding_hands:", "unicode": "1f46c", "html": "👬", "category": "People & Body (family)", "order": "1024"}, + {"emoji": "⚪", "name": "white circle", "shortname": ":white_circle:", "unicode": "26aa", "html": "⚪", "category": "Symbols (geometric)", "order": "2177"}, + {"emoji": "🛃", "name": "customs", "shortname": ":customs:", "unicode": "1f6c3", "html": "🛃", "category": "Symbols (transport-sign)", "order": "1986"}, + {"emoji": "🐠", "name": "tropical fish", "shortname": ":tropical_fish:", "unicode": "1f420", "html": "🐠", "category": "Animals & Nature (animal-marine)", "order": "1410"}, + {"emoji": "🏠", "name": "house", "shortname": ":house:", "unicode": "1f3e0", "html": "🏠", "category": "Travel & Places (place-building)", "order": "1559"}, + {"emoji": "🔃", "name": "clockwise vertical arrows", "shortname": ":arrows_clockwise:", "unicode": "1f503", "html": "🔃", "category": "Symbols (arrow)", "order": "2016"}, + {"emoji": "🌜", "name": "last quarter moon face", "shortname": ":last_quarter_moon_with_face:", "unicode": "1f31c", "html": "🌜", "category": "Travel & Places (sky & weather)", "order": "1722"}, + {"emoji": "📍", "name": "round pushpin", "shortname": ":round_pushpin:", "unicode": "1f4cd", "html": "📍", "category": "Objects (office)", "order": "1935"}, + {"emoji": "🌕", "name": "full moon", "shortname": ":full_moon:", "unicode": "1f315", "html": "🌕", "category": "Travel & Places (sky & weather)", "order": "1715"}, + {"emoji": "👟", "name": "running shoe", "shortname": ":athletic_shoe:", "unicode": "1f45f", "html": "👟", "category": "Objects (clothing)", "order": "1329"}, + {"emoji": "🍋", "name": "lemon", "shortname": ":lemon:", "unicode": "1f34b", "html": "🍋", "category": "Food & Drink (food-fruit)", "order": "1453"}, + {"emoji": "🍼", "name": "baby bottle", "shortname": ":baby_bottle:", "unicode": "1f37c", "html": "🍼", "category": "Food & Drink (drink)", "order": "1520"}, + {"emoji": "🎨", "name": "artist palette", "shortname": ":artist_palette:", "unicode": "1F3A8", "html": "🎨", "category": "Activities (arts & crafts)", "order": ""}, + {"emoji": "✉️", "name": "envelope", "shortname": ":envelope:", "unicode": "2709 FE0F", "html": "✉", "category": "Objects (mail)", "order": ""}, + {"emoji": "🍝", "name": "spaghetti", "shortname": ":spaghetti:", "unicode": "1f35d", "html": "🍝", "category": "Food & Drink (food-asian)", "order": "1501"}, + {"emoji": "🎐", "name": "wind chime", "shortname": ":wind_chime:", "unicode": "1f390", "html": "🎐", "category": "Activities (event)", "order": "1768"}, + {"emoji": "🍥", "name": "fish cake with swirl", "shortname": ":fish_cake:", "unicode": "1f365", "html": "🍥", "category": "Food & Drink (food-asian)", "order": "1506"}, + {"emoji": "🌲", "name": "evergreen tree", "shortname": ":evergreen_tree:", "unicode": "1f332", "html": "🌲", "category": "Animals & Nature (plant-other)", "order": "1438"}, + {"emoji": "🆙", "name": "UP! button", "shortname": ":up:", "unicode": "1f199", "html": "🆙", "category": "Symbols (alphanum)", "order": "2140"}, + {"emoji": "⬆️", "name": "up arrow", "shortname": ":arrow_up:", "unicode": "2b06", "html": "⬆", "category": "Symbols (arrow)", "order": "2002"}, + {"emoji": "↗️", "name": "up-right arrow", "shortname": ":arrow_upper_right:", "unicode": "2197", "html": "↗", "category": "Symbols (arrow)", "order": "2003"}, + {"emoji": "↘️", "name": "down-right arrow", "shortname": ":arrow_lower_right:", "unicode": "2198", "html": "↘", "category": "Symbols (arrow)", "order": "2005"}, + {"emoji": "↙️", "name": "down-left arrow", "shortname": ":arrow_lower_left:", "unicode": "2199", "html": "↙", "category": "Symbols (arrow)", "order": "2007"}, + {"emoji": "🎭", "name": "performing arts", "shortname": ":performing_arts:", "unicode": "1f3ad", "html": "🎭", "category": "Activities (arts & crafts)", "order": "1598"}, + {"emoji": "👃🏿", "name": "nose: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F443 1F3FF", "html": "👃🏿", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "👃🏾", "name": "nose: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F443 1F3FE", "html": "👃🏾", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "👃🏽", "name": "nose: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F443 1F3FD", "html": "👃🏽", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "👃🏼", "name": "nose: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F443 1F3FC", "html": "👃🏼", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "👃🏻", "name": "nose: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F443 1F3FB", "html": "👃🏻", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "👃", "name": "nose", "shortname": ":nose:", "unicode": "1f443", "html": "👃", "category": "People & Body (body-parts)", "order": "1272"}, + {"emoji": "🐽", "name": "pig nose", "shortname": ":pig_nose:", "unicode": "1f43d", "html": "🐽", "category": "Animals & Nature (animal-mammal)", "order": "1367"}, + {"emoji": "🐟", "name": "fish", "shortname": ":fish:", "unicode": "1f41f", "html": "🐟", "category": "Animals & Nature (animal-marine)", "order": "1409"}, + {"emoji": "👳🏿♀", "name": "woman wearing turban: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F473 1F3FF 200D 2640", "html": "👳🏿‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏾♀", "name": "woman wearing turban: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F473 1F3FE 200D 2640", "html": "👳🏾‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏽♀", "name": "woman wearing turban: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F473 1F3FD 200D 2640", "html": "👳🏽‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏼♀", "name": "woman wearing turban: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F473 1F3FC 200D 2640", "html": "👳🏼‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏻♀", "name": "woman wearing turban: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F473 1F3FB 200D 2640", "html": "👳🏻‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳♀", "name": "woman wearing turban", "shortname": ":woman_wearing_turban:", "unicode": "1F473 200D 2640", "html": "👳‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏿", "name": "person wearing turban: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F473 1F3FF", "html": "👳🏿", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏾", "name": "person wearing turban: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F473 1F3FE", "html": "👳🏾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏽", "name": "person wearing turban: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F473 1F3FD", "html": "👳🏽", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏼", "name": "person wearing turban: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F473 1F3FC", "html": "👳🏼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏻", "name": "person wearing turban: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F473 1F3FB", "html": "👳🏻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳", "name": "person wearing turban", "shortname": ":man_with_turban:", "unicode": "1f473", "html": "👳", "category": "People & Body (person-role)", "order": "411"}, + {"emoji": "🐨", "name": "koala", "shortname": ":koala:", "unicode": "1f428", "html": "🐨", "category": "Animals & Nature (animal-mammal)", "order": "1384"}, + {"emoji": "👂🏿", "name": "ear: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F442 1F3FF", "html": "👂🏿", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "👂🏾", "name": "ear: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F442 1F3FE", "html": "👂🏾", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "👂🏽", "name": "ear: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F442 1F3FD", "html": "👂🏽", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "👂🏼", "name": "ear: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F442 1F3FC", "html": "👂🏼", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "👂🏻", "name": "ear: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F442 1F3FB", "html": "👂🏻", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "👂", "name": "ear", "shortname": ":ear:", "unicode": "1f442", "html": "👂", "category": "People & Body (body-parts)", "order": "1266"}, + {"emoji": "✳️", "name": "eight-spoked asterisk", "shortname": ":eight_spoked_asterisk:", "unicode": "2733", "html": "✳", "category": "Symbols (other-symbol)", "order": "2093"}, + {"emoji": "🔹", "name": "small blue diamond", "shortname": ":small_blue_diamond:", "unicode": "1f539", "html": "🔹", "category": "Symbols (geometric)", "order": "2170"}, + {"emoji": "🚿", "name": "shower", "shortname": ":shower:", "unicode": "1f6bf", "html": "🚿", "category": "Objects (household)", "order": "1672"}, + {"emoji": "🐛", "name": "bug", "shortname": ":bug:", "unicode": "1f41b", "html": "🐛", "category": "Animals & Nature (animal-bug)", "order": "1420"}, + {"emoji": "🍜", "name": "steaming bowl", "shortname": ":ramen:", "unicode": "1f35c", "html": "🍜", "category": "Food & Drink (food-asian)", "order": "1500"}, + {"emoji": "🎩", "name": "top hat", "shortname": ":tophat:", "unicode": "1f3a9", "html": "🎩", "category": "Objects (clothing)", "order": "1335"}, + {"emoji": "👰🏿", "name": "bride with veil: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F470 1F3FF", "html": "👰🏿", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👰🏾", "name": "bride with veil: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F470 1F3FE", "html": "👰🏾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👰🏽", "name": "bride with veil: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F470 1F3FD", "html": "👰🏽", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👰🏼", "name": "bride with veil: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F470 1F3FC", "html": "👰🏼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👰🏻", "name": "bride with veil: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F470 1F3FB", "html": "👰🏻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👰", "name": "bride with veil", "shortname": ":bride_with_veil:", "unicode": "1f470", "html": "👰", "category": "People & Body (person-role)", "order": "471"}, + {"emoji": "⛽", "name": "fuel pump", "shortname": ":fuelpump:", "unicode": "26fd", "html": "⛽", "category": "Travel & Places (transport-ground)", "order": "1636"}, + {"emoji": "🏁", "name": "chequered flag", "shortname": ":checkered_flag:", "unicode": "1f3c1", "html": "🏁", "category": "Flags (flag)", "order": "2181"}, + {"emoji": "🐴", "name": "horse face", "shortname": ":horse:", "unicode": "1f434", "html": "🐴", "category": "Animals & Nature (animal-mammal)", "order": "1356"}, + {"emoji": "⌚", "name": "watch", "shortname": ":watch:", "unicode": "231a", "html": "⌚", "category": "Travel & Places (time)", "order": "1682"}, + {"emoji": "🐵", "name": "monkey face", "shortname": ":monkey_face:", "unicode": "1f435", "html": "🐵", "category": "Animals & Nature (animal-mammal)", "order": "1342"}, + {"emoji": "🚼", "name": "baby symbol", "shortname": ":baby_symbol:", "unicode": "1f6bc", "html": "🚼", "category": "Symbols (transport-sign)", "order": "1983"}, + {"emoji": "🆕", "name": "NEW button", "shortname": ":new:", "unicode": "1f195", "html": "🆕", "category": "Symbols (alphanum)", "order": "2134"}, + {"emoji": "🆓", "name": "FREE button", "shortname": ":free:", "unicode": "1f193", "html": "🆓", "category": "Symbols (alphanum)", "order": "2130"}, + {"emoji": "🎇", "name": "sparkler", "shortname": ":sparkler:", "unicode": "1f387", "html": "🎇", "category": "Activities (event)", "order": "1759"}, + {"emoji": "🌽", "name": "ear of corn", "shortname": ":corn:", "unicode": "1f33d", "html": "🌽", "category": "Food & Drink (food-vegetable)", "order": "1468"}, + {"emoji": "🎾", "name": "tennis", "shortname": ":tennis:", "unicode": "1f3be", "html": "🎾", "category": "Activities (sport)", "order": "1787"}, + {"emoji": "⏰", "name": "alarm clock", "shortname": ":alarm_clock:", "unicode": "23f0", "html": "⏰", "category": "Travel & Places (time)", "order": "1683"}, + {"emoji": "🔋", "name": "battery", "shortname": ":battery:", "unicode": "1f50b", "html": "🔋", "category": "Objects (computer)", "order": "1844"}, + {"emoji": "❕", "name": "white exclamation mark", "shortname": ":grey_exclamation:", "unicode": "2755", "html": "❕", "category": "Symbols (other-symbol)", "order": "2100"}, + {"emoji": "🐺", "name": "wolf", "shortname": ":wolf:", "unicode": "1f43a", "html": "🐺", "category": "Animals & Nature (animal-mammal)", "order": "1348"}, + {"emoji": "🗿", "name": "moai", "shortname": ":moyai:", "unicode": "1f5ff", "html": "🗿", "category": "Objects (other-object)", "order": "1972"}, + {"emoji": "🐮", "name": "cow face", "shortname": ":cow:", "unicode": "1f42e", "html": "🐮", "category": "Animals & Nature (animal-mammal)", "order": "1360"}, + {"emoji": "📣", "name": "megaphone", "shortname": ":mega:", "unicode": "1f4e3", "html": "📣", "category": "Objects (sound)", "order": "1819"}, + {"emoji": "👴🏿", "name": "old man: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F474 1F3FF", "html": "👴🏿", "category": "People & Body (person)", "order": ""}, + {"emoji": "👴🏾", "name": "old man: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F474 1F3FE", "html": "👴🏾", "category": "People & Body (person)", "order": ""}, + {"emoji": "👴🏽", "name": "old man: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F474 1F3FD", "html": "👴🏽", "category": "People & Body (person)", "order": ""}, + {"emoji": "👴🏼", "name": "old man: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F474 1F3FC", "html": "👴🏼", "category": "People & Body (person)", "order": ""}, + {"emoji": "👴🏻", "name": "old man: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F474 1F3FB", "html": "👴🏻", "category": "People & Body (person)", "order": ""}, + {"emoji": "👴", "name": "old man", "shortname": ":older_man:", "unicode": "1f474", "html": "👴", "category": "People & Body (person)", "order": "123"}, + {"emoji": "👗", "name": "dress", "shortname": ":dress:", "unicode": "1f457", "html": "👗", "category": "Objects (clothing)", "order": "1319"}, + {"emoji": "🔗", "name": "link", "shortname": ":link:", "unicode": "1f517", "html": "🔗", "category": "Objects (tool)", "order": "1965"}, + {"emoji": "🐔", "name": "chicken", "shortname": ":chicken:", "unicode": "1f414", "html": "🐔", "category": "Animals & Nature (animal-bird)", "order": "1388"}, + {"emoji": "🍳", "name": "cooking", "shortname": ":cooking:", "unicode": "1F373", "html": "🍳", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🐋", "name": "whale", "shortname": ":whale2:", "unicode": "1f40b", "html": "🐋", "category": "Animals & Nature (animal-marine)", "order": "1407"}, + {"emoji": "↖", "name": "up-left arrow", "shortname": ":arrow_upper_left:", "unicode": "2196", "html": "↖", "category": "Symbols (arrow)", "order": "2009"}, + {"emoji": "🌳", "name": "deciduous tree", "shortname": ":deciduous_tree:", "unicode": "1f333", "html": "🌳", "category": "Animals & Nature (plant-other)", "order": "1439"}, + {"emoji": "🍱", "name": "bento box", "shortname": ":bento:", "unicode": "1f371", "html": "🍱", "category": "Food & Drink (food-asian)", "order": "1495"}, + {"emoji": "📌", "name": "pushpin", "shortname": ":pushpin:", "unicode": "1f4cc", "html": "📌", "category": "Objects (office)", "order": "1934"}, + {"emoji": "🔜", "name": "SOON arrow", "shortname": ":soon:", "unicode": "1f51c", "html": "🔜", "category": "Symbols (arrow)", "order": "2021"}, + {"emoji": "🔁", "name": "repeat button", "shortname": ":repeat:", "unicode": "1f501", "html": "🔁", "category": "Symbols (av-symbol)", "order": "2049"}, + {"emoji": "🐉", "name": "dragon", "shortname": ":dragon:", "unicode": "1f409", "html": "🐉", "category": "Animals & Nature (animal-reptile)", "order": "1405"}, + {"emoji": "🐹", "name": "hamster", "shortname": ":hamster:", "unicode": "1f439", "html": "🐹", "category": "Animals & Nature (animal-mammal)", "order": "1378"}, + {"emoji": "⛳", "name": "flag in hole", "shortname": ":golf:", "unicode": "26f3", "html": "⛳", "category": "Activities (sport)", "order": "1799"}, + {"emoji": "🏄🏿♀", "name": "woman surfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C4 1F3FF 200D 2640", "html": "🏄🏿‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏾♀", "name": "woman surfing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C4 1F3FE 200D 2640", "html": "🏄🏾‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏽♀", "name": "woman surfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C4 1F3FD 200D 2640", "html": "🏄🏽‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏼♀", "name": "woman surfing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C4 1F3FC 200D 2640", "html": "🏄🏼‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏻♀", "name": "woman surfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C4 1F3FB 200D 2640", "html": "🏄🏻‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄♀", "name": "woman surfing", "shortname": ":woman_surfing:", "unicode": "1F3C4 200D 2640", "html": "🏄‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏿", "name": "person surfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C4 1F3FF", "html": "🏄🏿", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏾", "name": "person surfing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C4 1F3FE", "html": "🏄🏾", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏽", "name": "person surfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C4 1F3FD", "html": "🏄🏽", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏼", "name": "person surfing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C4 1F3FC", "html": "🏄🏼", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏻", "name": "person surfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C4 1F3FB", "html": "🏄🏻", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄", "name": "person surfing", "shortname": ":surfer:", "unicode": "1f3c4", "html": "🏄", "category": "People & Body (person-sport)", "order": "800"}, + {"emoji": "🐭", "name": "mouse face", "shortname": ":mouse:", "unicode": "1f42d", "html": "🐭", "category": "Animals & Nature (animal-mammal)", "order": "1375"}, + {"emoji": "🌒", "name": "waxing crescent moon", "shortname": ":waxing_crescent_moon:", "unicode": "1f312", "html": "🌒", "category": "Travel & Places (sky & weather)", "order": "1712"}, + {"emoji": "🚙", "name": "sport utility vehicle", "shortname": ":blue_car:", "unicode": "1f699", "html": "🚙", "category": "Travel & Places (transport-ground)", "order": "1626"}, + {"emoji": "🅰️", "name": "A button (blood type)", "shortname": ":a:", "unicode": "1f170", "html": "🅰", "category": "Symbols (alphanum)", "order": "2125"}, + {"emoji": "⁉️", "name": "exclamation question mark", "shortname": ":interrobang:", "unicode": "2049", "html": "⁉", "category": "Symbols (other-symbol)", "order": "2097"}, + {"emoji": "🈹", "name": "Japanese discount button", "shortname": ":u5272:", "unicode": "1f239", "html": "🈹", "category": "Symbols (alphanum)", "order": "2148"}, + {"emoji": "🔌", "name": "electric plug", "shortname": ":electric_plug:", "unicode": "1f50c", "html": "🔌", "category": "Objects (computer)", "order": "1845"}, + {"emoji": "🌓", "name": "first quarter moon", "shortname": ":first_quarter_moon:", "unicode": "1f313", "html": "🌓", "category": "Travel & Places (sky & weather)", "order": "1713"}, + {"emoji": "♋", "name": "Cancer", "shortname": ":cancer:", "unicode": "264b", "html": "♋", "category": "Symbols (zodiac)", "order": "2038"}, + {"emoji": "🔱", "name": "trident emblem", "shortname": ":trident:", "unicode": "1f531", "html": "🔱", "category": "Symbols (other-symbol)", "order": "2076"}, + {"emoji": "🍞", "name": "bread", "shortname": ":bread:", "unicode": "1f35e", "html": "🍞", "category": "Food & Drink (food-prepared)", "order": "1474"}, + {"emoji": "👮🏿♀", "name": "woman police officer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F46E 1F3FF 200D 2640", "html": "👮🏿‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏾♀", "name": "woman police officer: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F46E 1F3FE 200D 2640", "html": "👮🏾‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏽♀", "name": "woman police officer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F46E 1F3FD 200D 2640", "html": "👮🏽‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏼♀", "name": "woman police officer: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F46E 1F3FC 200D 2640", "html": "👮🏼‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏻♀", "name": "woman police officer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F46E 1F3FB 200D 2640", "html": "👮🏻‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮♀", "name": "woman police officer", "shortname": ":woman_police_officer:", "unicode": "1F46E 200D 2640", "html": "👮‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏿", "name": "police officer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F46E 1F3FF", "html": "👮🏿", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏾", "name": "police officer: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F46E 1F3FE", "html": "👮🏾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏽", "name": "police officer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F46E 1F3FD", "html": "👮🏽", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏼", "name": "police officer: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F46E 1F3FC", "html": "👮🏼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏻", "name": "police officer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F46E 1F3FB", "html": "👮🏻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮", "name": "police officer", "shortname": ":cop:", "unicode": "1f46e", "html": "👮", "category": "People & Body (person-role)", "order": "339"}, + {"emoji": "🍵", "name": "teacup without handle", "shortname": ":tea:", "unicode": "1f375", "html": "🍵", "category": "Food & Drink (drink)", "order": "1523"}, + {"emoji": "🎣", "name": "fishing pole", "shortname": ":fishing_pole_and_fish:", "unicode": "1f3a3", "html": "🎣", "category": "Activities (sport)", "order": "1801"}, + {"emoji": "🌔", "name": "waxing gibbous moon", "shortname": ":waxing_gibbous_moon:", "unicode": "1F314", "html": "🌔", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🚲", "name": "bicycle", "shortname": ":bike:", "unicode": "1f6b2", "html": "🚲", "category": "Travel & Places (transport-ground)", "order": "1630"}, + {"emoji": "👤", "name": "bust in silhouette", "shortname": ":bust_in_silhouette:", "unicode": "1F464", "html": "👤", "category": "People & Body (person-symbol)", "order": ""}, + {"emoji": "🍚", "name": "cooked rice", "shortname": ":rice:", "unicode": "1f35a", "html": "🍚", "category": "Food & Drink (food-asian)", "order": "1498"}, + {"emoji": "📻", "name": "radio", "shortname": ":radio:", "unicode": "1f4fb", "html": "📻", "category": "Objects (music)", "order": "1831"}, + {"emoji": "🐤", "name": "baby chick", "shortname": ":baby_chick:", "unicode": "1f424", "html": "🐤", "category": "Animals & Nature (animal-bird)", "order": "1391"}, + {"emoji": "⤵️", "name": "right arrow curving down", "shortname": ":arrow_heading_down:", "unicode": "2935", "html": "⤵", "category": "Symbols (arrow)", "order": "2015"}, + {"emoji": "🌘", "name": "waning crescent moon", "shortname": ":waning_crescent_moon:", "unicode": "1f318", "html": "🌘", "category": "Travel & Places (sky & weather)", "order": "1718"}, + {"emoji": "↕", "name": "up-down arrow", "shortname": ":arrow_up_down:", "unicode": "2195", "html": "↕", "category": "Symbols (arrow)", "order": "2010"}, + {"emoji": "🇪", "name": "", "shortname": "", "unicode": "", "html": "🇪", "category": "", "order": ""}, + {"emoji": "🌗", "name": "last quarter moon", "shortname": ":last_quarter_moon:", "unicode": "1f317", "html": "🌗", "category": "Travel & Places (sky & weather)", "order": "1717"}, + {"emoji": "🔘", "name": "radio button", "shortname": ":radio_button:", "unicode": "1f518", "html": "🔘", "category": "Symbols (geometric)", "order": "2174"}, + {"emoji": "🐑", "name": "ewe", "shortname": ":sheep:", "unicode": "1f411", "html": "🐑", "category": "Animals & Nature (animal-mammal)", "order": "1369"}, + {"emoji": "👱🏿♀", "name": "woman: dark skin tone, blond hair", "shortname": ":dark_skin_tone_blond_hair:", "unicode": "1F471 1F3FF 200D 2640", "html": "👱🏿‍♀", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏾♀", "name": "woman: medium-dark skin tone, blond hair", "shortname": ":mediumdark_skin_tone_blond_hair:", "unicode": "1F471 1F3FE 200D 2640", "html": "👱🏾‍♀", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏽♀", "name": "woman: medium skin tone, blond hair", "shortname": ":medium_skin_tone_blond_hair:", "unicode": "1F471 1F3FD 200D 2640", "html": "👱🏽‍♀", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏼♀", "name": "woman: medium-light skin tone, blond hair", "shortname": ":mediumlight_skin_tone_blond_hair:", "unicode": "1F471 1F3FC 200D 2640", "html": "👱🏼‍♀", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏻♀", "name": "woman: light skin tone, blond hair", "shortname": ":light_skin_tone_blond_hair:", "unicode": "1F471 1F3FB 200D 2640", "html": "👱🏻‍♀", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱♀", "name": "woman: blond hair", "shortname": ":blond_hair:", "unicode": "1F471 200D 2640", "html": "👱‍♀", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏿", "name": "person: dark skin tone, blond hair", "shortname": ":dark_skin_tone_blond_hair:", "unicode": "1F471 1F3FF", "html": "👱🏿", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏾", "name": "person: medium-dark skin tone, blond hair", "shortname": ":mediumdark_skin_tone_blond_hair:", "unicode": "1F471 1F3FE", "html": "👱🏾", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏽", "name": "person: medium skin tone, blond hair", "shortname": ":medium_skin_tone_blond_hair:", "unicode": "1F471 1F3FD", "html": "👱🏽", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏼", "name": "person: medium-light skin tone, blond hair", "shortname": ":mediumlight_skin_tone_blond_hair:", "unicode": "1F471 1F3FC", "html": "👱🏼", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏻", "name": "person: light skin tone, blond hair", "shortname": ":light_skin_tone_blond_hair:", "unicode": "1F471 1F3FB", "html": "👱🏻", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱", "name": "person: blond hair", "shortname": ":person_with_blond_hair:", "unicode": "1f471", "html": "👱", "category": "People & Body (person)", "order": "429"}, + {"emoji": "🌖", "name": "waning gibbous moon", "shortname": ":waning_gibbous_moon:", "unicode": "1f316", "html": "🌖", "category": "Travel & Places (sky & weather)", "order": "1716"}, + {"emoji": "🔒", "name": "locked", "shortname": ":lock:", "unicode": "1f512", "html": "🔒", "category": "Objects (lock)", "order": "1944"}, + {"emoji": "🍏", "name": "green apple", "shortname": ":green_apple:", "unicode": "1f34f", "html": "🍏", "category": "Food & Drink (food-fruit)", "order": "1457"}, + {"emoji": "👺", "name": "goblin", "shortname": ":japanese_goblin:", "unicode": "1f47a", "html": "👺", "category": "Smileys & Emotion (face-costume)", "order": "79"}, + {"emoji": "➰", "name": "curly loop", "shortname": ":curly_loop:", "unicode": "27b0", "html": "➰", "category": "Symbols (other-symbol)", "order": "2090"}, + {"emoji": "🚩", "name": "triangular flag", "shortname": ":triangular_flag_on_post:", "unicode": "1f6a9", "html": "🚩", "category": "Flags (flag)", "order": "2182"}, + {"emoji": "🔄", "name": "counterclockwise arrows button", "shortname": ":arrows_counterclockwise:", "unicode": "1f504", "html": "🔄", "category": "Symbols (arrow)", "order": "2017"}, + {"emoji": "🐎", "name": "horse", "shortname": ":racehorse:", "unicode": "1f40e", "html": "🐎", "category": "Animals & Nature (animal-mammal)", "order": "1357"}, + {"emoji": "🍤", "name": "fried shrimp", "shortname": ":fried_shrimp:", "unicode": "1f364", "html": "🍤", "category": "Food & Drink (food-asian)", "order": "1505"}, + {"emoji": "🌄", "name": "sunrise over mountains", "shortname": ":sunrise_over_mountains:", "unicode": "1f304", "html": "🌄", "category": "Travel & Places (place-other)", "order": "1586"}, + {"emoji": "🌋", "name": "volcano", "shortname": ":volcano:", "unicode": "1f30b", "html": "🌋", "category": "Travel & Places (place-geographic)", "order": "1546"}, + {"emoji": "🐓", "name": "rooster", "shortname": ":rooster:", "unicode": "1f413", "html": "🐓", "category": "Animals & Nature (animal-bird)", "order": "1389"}, + {"emoji": "📥", "name": "inbox tray", "shortname": ":inbox_tray:", "unicode": "1f4e5", "html": "📥", "category": "Objects (mail)", "order": "1906"}, + {"emoji": "💒", "name": "wedding", "shortname": ":wedding:", "unicode": "1f492", "html": "💒", "category": "Travel & Places (place-building)", "order": "1574"}, + {"emoji": "🍣", "name": "sushi", "shortname": ":sushi:", "unicode": "1f363", "html": "🍣", "category": "Food & Drink (food-asian)", "order": "1504"}, + {"emoji": "〰", "name": "wavy dash", "shortname": ":wavy_dash:", "unicode": "3030", "html": "〰", "category": "Symbols (other-symbol)", "order": "2102"}, + {"emoji": "🍨", "name": "ice cream", "shortname": ":ice_cream:", "unicode": "1f368", "html": "🍨", "category": "Food & Drink (food-sweet)", "order": "1510"}, + {"emoji": "⏪", "name": "fast reverse button", "shortname": ":rewind:", "unicode": "23ea", "html": "⏪", "category": "Symbols (av-symbol)", "order": "2056"}, + {"emoji": "🍅", "name": "tomato", "shortname": ":tomato:", "unicode": "1f345", "html": "🍅", "category": "Food & Drink (food-fruit)", "order": "1463"}, + {"emoji": "🐇", "name": "rabbit", "shortname": ":rabbit2:", "unicode": "1f407", "html": "🐇", "category": "Animals & Nature (animal-mammal)", "order": "1380"}, + {"emoji": "✴️", "name": "eight-pointed star", "shortname": ":eight_pointed_black_star:", "unicode": "2734", "html": "✴", "category": "Symbols (other-symbol)", "order": "2094"}, + {"emoji": "🔺", "name": "red triangle pointed up", "shortname": ":small_red_triangle:", "unicode": "1f53a", "html": "🔺", "category": "Symbols (geometric)", "order": "2171"}, + {"emoji": "🔆", "name": "bright button", "shortname": ":high_brightness:", "unicode": "1f506", "html": "🔆", "category": "Symbols (av-symbol)", "order": "2068"}, + {"emoji": "➕", "name": "plus sign", "shortname": ":heavy_plus_sign:", "unicode": "2795", "html": "➕", "category": "Symbols (other-symbol)", "order": "2084"}, + {"emoji": "👲🏿", "name": "man with skullcap: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F472 1F3FF", "html": "👲🏿", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👲🏾", "name": "man with skullcap: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F472 1F3FE", "html": "👲🏾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👲🏽", "name": "man with skullcap: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F472 1F3FD", "html": "👲🏽", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👲🏼", "name": "man with skullcap: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F472 1F3FC", "html": "👲🏼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👲🏻", "name": "man with skullcap: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F472 1F3FB", "html": "👲🏻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👲", "name": "man with skullcap", "shortname": ":man_with_gua_pi_mao:", "unicode": "1f472", "html": "👲", "category": "People & Body (person-role)", "order": "489"}, + {"emoji": "🏪", "name": "convenience store", "shortname": ":convenience_store:", "unicode": "1f3ea", "html": "🏪", "category": "Travel & Places (place-building)", "order": "1568"}, + {"emoji": "👥", "name": "busts in silhouette", "shortname": ":busts_in_silhouette:", "unicode": "1f465", "html": "👥", "category": "People & Body (person-symbol)", "order": "767"}, + {"emoji": "🐞", "name": "lady beetle", "shortname": ":beetle:", "unicode": "1f41e", "html": "🐞", "category": "Animals & Nature (animal-bug)", "order": "1423"}, + {"emoji": "🔻", "name": "red triangle pointed down", "shortname": ":small_red_triangle_down:", "unicode": "1f53b", "html": "🔻", "category": "Symbols (geometric)", "order": "2172"}, + {"emoji": "🇩🇪", "name": "flag: Germany", "shortname": ":ger:", "unicode": "1F1E9 1F1EA", "html": "🇩", "category": "Flags (country-flag)", "order": ""}, + {"emoji": "⤴️", "name": "right arrow curving up", "shortname": ":arrow_heading_up:", "unicode": "2934", "html": "⤴", "category": "Symbols (arrow)", "order": "2014"}, + {"emoji": "📛", "name": "name badge", "shortname": ":name_badge:", "unicode": "1f4db", "html": "📛", "category": "Symbols (other-symbol)", "order": "2073"}, + {"emoji": "🛀🏿", "name": "person taking bath: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6C0 1F3FF", "html": "🛀🏿", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🛀🏾", "name": "person taking bath: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6C0 1F3FE", "html": "🛀🏾", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🛀🏽", "name": "person taking bath: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6C0 1F3FD", "html": "🛀🏽", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🛀🏼", "name": "person taking bath: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6C0 1F3FC", "html": "🛀🏼", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🛀🏻", "name": "person taking bath: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6C0 1F3FB", "html": "🛀🏻", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🛀", "name": "person taking bath", "shortname": ":bath:", "unicode": "1f6c0", "html": "🛀", "category": "People & Body (person-resting)", "order": "1673"}, + {"emoji": "⛔", "name": "no entry", "shortname": ":no_entry:", "unicode": "26d4", "html": "⛔", "category": "Symbols (warning)", "order": "1991"}, + {"emoji": "🐊", "name": "crocodile", "shortname": ":crocodile:", "unicode": "1f40a", "html": "🐊", "category": "Animals & Nature (animal-reptile)", "order": "1400"}, + {"emoji": "🌰", "name": "chestnut", "shortname": ":chestnut:", "unicode": "1F330", "html": "🌰", "category": "Food & Drink (food-vegetable)", "order": ""}, + {"emoji": "🐕", "name": "dog", "shortname": ":dog2:", "unicode": "1f415", "html": "🐕", "category": "Animals & Nature (animal-mammal)", "order": "1346"}, + {"emoji": "🐈", "name": "cat", "shortname": ":cat2:", "unicode": "1f408", "html": "🐈", "category": "Animals & Nature (animal-mammal)", "order": "1351"}, + {"emoji": "🔨", "name": "hammer", "shortname": ":hammer:", "unicode": "1f528", "html": "🔨", "category": "Objects (tool)", "order": "1950"}, + {"emoji": "🍖", "name": "meat on bone", "shortname": ":meat_on_bone:", "unicode": "1f356", "html": "🍖", "category": "Food & Drink (food-prepared)", "order": "1479"}, + {"emoji": "🐚", "name": "spiral shell", "shortname": ":shell:", "unicode": "1f41a", "html": "🐚", "category": "Animals & Nature (animal-marine)", "order": "1414"}, + {"emoji": "❇️", "name": "sparkle", "shortname": ":sparkle:", "unicode": "2747", "html": "❇", "category": "Symbols (other-symbol)", "order": "2095"}, + {"emoji": "⛵", "name": "sailboat", "shortname": ":sailboat:", "unicode": "26F5", "html": "⛵", "category": "Travel & Places (transport-water)", "order": ""}, + {"emoji": "🅱️", "name": "B button (blood type)", "shortname": ":b:", "unicode": "1f171", "html": "🅱", "category": "Symbols (alphanum)", "order": "2127"}, + {"emoji": "Ⓜ️", "name": "circled M", "shortname": ":m:", "unicode": "24c2", "html": "Ⓜ", "category": "Symbols (alphanum)", "order": "2133"}, + {"emoji": "🐩", "name": "poodle", "shortname": ":poodle:", "unicode": "1f429", "html": "🐩", "category": "Animals & Nature (animal-mammal)", "order": "1347"}, + {"emoji": "♒", "name": "Aquarius", "shortname": ":aquarius:", "unicode": "2652", "html": "♒", "category": "Symbols (zodiac)", "order": "2045"}, + {"emoji": "🍲", "name": "pot of food", "shortname": ":stew:", "unicode": "1f372", "html": "🍲", "category": "Food & Drink (food-prepared)", "order": "1492"}, + {"emoji": "👖", "name": "jeans", "shortname": ":jeans:", "unicode": "1f456", "html": "👖", "category": "Objects (clothing)", "order": "1318"}, + {"emoji": "🍯", "name": "honey pot", "shortname": ":honey_pot:", "unicode": "1f36f", "html": "🍯", "category": "Food & Drink (food-sweet)", "order": "1519"}, + {"emoji": "🎹", "name": "musical keyboard", "shortname": ":musical_keyboard:", "unicode": "1f3b9", "html": "🎹", "category": "Objects (musical-instrument)", "order": "1834"}, + {"emoji": "🔓", "name": "unlocked", "shortname": ":unlock:", "unicode": "1f513", "html": "🔓", "category": "Objects (lock)", "order": "1945"}, + {"emoji": "✒", "name": "black nib", "shortname": ":black_nib:", "unicode": "2712", "html": "✒", "category": "Objects (writing)", "order": "1915"}, + {"emoji": "🗽", "name": "Statue of Liberty", "shortname": ":statue_of_liberty:", "unicode": "1f5fd", "html": "🗽", "category": "Travel & Places (place-building)", "order": "1576"}, + {"emoji": "💲", "name": "heavy dollar sign", "shortname": ":heavy_dollar_sign:", "unicode": "1f4b2", "html": "💲", "category": "Objects (money)", "order": "1900"}, + {"emoji": "🏂", "name": "snowboarder", "shortname": ":snowboarder:", "unicode": "1f3c2", "html": "🏂", "category": "People & Body (person-sport)", "order": "776"}, + {"emoji": "💮", "name": "white flower", "shortname": ":white_flower:", "unicode": "1f4ae", "html": "💮", "category": "Animals & Nature (plant-flower)", "order": "1429"}, + {"emoji": "👔", "name": "necktie", "shortname": ":necktie:", "unicode": "1f454", "html": "👔", "category": "Objects (clothing)", "order": "1316"}, + {"emoji": "💠", "name": "diamond with a dot", "shortname": ":diamond_shape_with_a_dot_inside:", "unicode": "1f4a0", "html": "💠", "category": "Symbols (geometric)", "order": "2173"}, + {"emoji": "♈", "name": "Aries", "shortname": ":aries:", "unicode": "2648", "html": "♈", "category": "Symbols (zodiac)", "order": "2035"}, + {"emoji": "🚺", "name": "women’s room", "shortname": ":womens:", "unicode": "1f6ba", "html": "🚺", "category": "Symbols (transport-sign)", "order": "1981"}, + {"emoji": "🐜", "name": "ant", "shortname": ":ant:", "unicode": "1f41c", "html": "🐜", "category": "Animals & Nature (animal-bug)", "order": "1421"}, + {"emoji": "♏", "name": "Scorpio", "shortname": ":scorpius:", "unicode": "264f", "html": "♏", "category": "Symbols (zodiac)", "order": "2042"}, + {"emoji": "🌇", "name": "sunset", "shortname": ":city_sunset:", "unicode": "1f307", "html": "🌇", "category": "Travel & Places (place-other)", "order": "1589"}, + {"emoji": "⏳", "name": "hourglass not done", "shortname": ":hourglass_flowing_sand:", "unicode": "23f3", "html": "⏳", "category": "Travel & Places (time)", "order": "1681"}, + {"emoji": "🅾️", "name": "O button (blood type)", "shortname": ":o2:", "unicode": "1f17e", "html": "🅾", "category": "Symbols (alphanum)", "order": "2136"}, + {"emoji": "🐲", "name": "dragon face", "shortname": ":dragon_face:", "unicode": "1f432", "html": "🐲", "category": "Animals & Nature (animal-reptile)", "order": "1404"}, + {"emoji": "🐌", "name": "snail", "shortname": ":snail:", "unicode": "1f40c", "html": "🐌", "category": "Animals & Nature (animal-bug)", "order": "1419"}, + {"emoji": "📀", "name": "dvd", "shortname": ":dvd:", "unicode": "1f4c0", "html": "📀", "category": "Objects (computer)", "order": "1855"}, + {"emoji": "👕", "name": "t-shirt", "shortname": ":shirt:", "unicode": "1f455", "html": "👕", "category": "Objects (clothing)", "order": "1317"}, + {"emoji": "🎲", "name": "game die", "shortname": ":game_die:", "unicode": "1f3b2", "html": "🎲", "category": "Activities (game)", "order": "1806"}, + {"emoji": "➖", "name": "minus sign", "shortname": ":heavy_minus_sign:", "unicode": "2796", "html": "➖", "category": "Symbols (other-symbol)", "order": "2088"}, + {"emoji": "🎎", "name": "Japanese dolls", "shortname": ":dolls:", "unicode": "1f38e", "html": "🎎", "category": "Activities (event)", "order": "1766"}, + {"emoji": "♐", "name": "Sagittarius", "shortname": ":sagittarius:", "unicode": "2650", "html": "♐", "category": "Symbols (zodiac)", "order": "2043"}, + {"emoji": "🎱", "name": "pool 8 ball", "shortname": ":8ball:", "unicode": "1f3b1", "html": "🎱", "category": "Activities (game)", "order": "1788"}, + {"emoji": "🚌", "name": "bus", "shortname": ":bus:", "unicode": "1f68c", "html": "🚌", "category": "Travel & Places (transport-ground)", "order": "1614"}, + {"emoji": "🍮", "name": "custard", "shortname": ":custard:", "unicode": "1f36e", "html": "🍮", "category": "Food & Drink (food-sweet)", "order": "1518"}, + {"emoji": "🎌", "name": "crossed flags", "shortname": ":crossed_flags:", "unicode": "1f38c", "html": "🎌", "category": "Flags (flag)", "order": "2183"}, + {"emoji": "〽️", "name": "part alternation mark", "shortname": ":part_alternation_mark:", "unicode": "303d", "html": "〽", "category": "Symbols (other-symbol)", "order": "2092"}, + {"emoji": "🐫", "name": "two-hump camel", "shortname": ":camel:", "unicode": "1f42b", "html": "🐫", "category": "Animals & Nature (animal-mammal)", "order": "1372"}, + {"emoji": "🍛", "name": "curry rice", "shortname": ":curry:", "unicode": "1f35b", "html": "🍛", "category": "Food & Drink (food-asian)", "order": "1499"}, + {"emoji": "🚂", "name": "locomotive", "shortname": ":steam_locomotive:", "unicode": "1f682", "html": "🚂", "category": "Travel & Places (transport-ground)", "order": "1602"}, + {"emoji": "🏥", "name": "hospital", "shortname": ":hospital:", "unicode": "1f3e5", "html": "🏥", "category": "Travel & Places (place-building)", "order": "1564"}, + {"emoji": "🇯🇵", "name": "flag: Japan", "shortname": ":jp:", "unicode": "1F1EF 1F1F5", "html": "🇯", "category": "Flags (country-flag)", "order": ""}, + {"emoji": "🔷", "name": "large blue diamond", "shortname": ":large_blue_diamond:", "unicode": "1f537", "html": "🔷", "category": "Symbols (geometric)", "order": "2168"}, + {"emoji": "🎋", "name": "tanabata tree", "shortname": ":tanabata_tree:", "unicode": "1f38b", "html": "🎋", "category": "Activities (event)", "order": "1764"}, + {"emoji": "🔔", "name": "bell", "shortname": ":bell:", "unicode": "1f514", "html": "🔔", "category": "Objects (sound)", "order": "1821"}, + {"emoji": "♌", "name": "Leo", "shortname": ":leo:", "unicode": "264c", "html": "♌", "category": "Symbols (zodiac)", "order": "2039"}, + {"emoji": "♊", "name": "Gemini", "shortname": ":gemini:", "unicode": "264a", "html": "♊", "category": "Symbols (zodiac)", "order": "2037"}, + {"emoji": "🍐", "name": "pear", "shortname": ":pear:", "unicode": "1f350", "html": "🍐", "category": "Food & Drink (food-fruit)", "order": "1458"}, + {"emoji": "🔶", "name": "large orange diamond", "shortname": ":large_orange_diamond:", "unicode": "1f536", "html": "🔶", "category": "Symbols (geometric)", "order": "2167"}, + {"emoji": "♉", "name": "Taurus", "shortname": ":taurus:", "unicode": "2649", "html": "♉", "category": "Symbols (zodiac)", "order": "2036"}, + {"emoji": "🌐", "name": "globe with meridians", "shortname": ":globe_with_meridians:", "unicode": "1f310", "html": "🌐", "category": "Travel & Places (place-map)", "order": "1541"}, + {"emoji": "🚪", "name": "door", "shortname": ":door:", "unicode": "1f6aa", "html": "🚪", "category": "Objects (household)", "order": "1662"}, + {"emoji": "🕕", "name": "six o’clock", "shortname": ":clock6:", "unicode": "1f555", "html": "🕕", "category": "Travel & Places (time)", "order": "1699"}, + {"emoji": "🚔", "name": "oncoming police car", "shortname": ":oncoming_police_car:", "unicode": "1f694", "html": "🚔", "category": "Travel & Places (transport-ground)", "order": "1621"}, + {"emoji": "📩", "name": "envelope with arrow", "shortname": ":envelope_with_arrow:", "unicode": "1f4e9", "html": "📩", "category": "Objects (mail)", "order": "1904"}, + {"emoji": "🌂", "name": "closed umbrella", "shortname": ":closed_umbrella:", "unicode": "1f302", "html": "🌂", "category": "Travel & Places (sky & weather)", "order": "1744"}, + {"emoji": "🎷", "name": "saxophone", "shortname": ":saxophone:", "unicode": "1f3b7", "html": "🎷", "category": "Objects (musical-instrument)", "order": "1832"}, + {"emoji": "⛪", "name": "church", "shortname": ":church:", "unicode": "26ea", "html": "⛪", "category": "Travel & Places (place-religious)", "order": "1577"}, + {"emoji": "🚴🏿♀", "name": "woman biking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B4 1F3FF 200D 2640", "html": "🚴🏿‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏾♀", "name": "woman biking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B4 1F3FE 200D 2640", "html": "🚴🏾‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏽♀", "name": "woman biking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B4 1F3FD 200D 2640", "html": "🚴🏽‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏼♀", "name": "woman biking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B4 1F3FC 200D 2640", "html": "🚴🏼‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏻♀", "name": "woman biking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B4 1F3FB 200D 2640", "html": "🚴🏻‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴♀", "name": "woman biking", "shortname": ":woman_biking:", "unicode": "1F6B4 200D 2640", "html": "🚴‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏿", "name": "person biking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B4 1F3FF", "html": "🚴🏿", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏾", "name": "person biking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B4 1F3FE", "html": "🚴🏾", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏽", "name": "person biking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B4 1F3FD", "html": "🚴🏽", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏼", "name": "person biking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B4 1F3FC", "html": "🚴🏼", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏻", "name": "person biking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B4 1F3FB", "html": "🚴🏻", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴", "name": "person biking", "shortname": ":bicyclist:", "unicode": "1f6b4", "html": "🚴", "category": "People & Body (person-sport)", "order": "890"}, + {"emoji": "♓", "name": "Pisces", "shortname": ":pisces:", "unicode": "2653", "html": "♓", "category": "Symbols (zodiac)", "order": "2046"}, + {"emoji": "🍡", "name": "dango", "shortname": ":dango:", "unicode": "1f361", "html": "🍡", "category": "Food & Drink (food-asian)", "order": "1507"}, + {"emoji": "♑", "name": "Capricorn", "shortname": ":capricorn:", "unicode": "2651", "html": "♑", "category": "Symbols (zodiac)", "order": "2044"}, + {"emoji": "🏢", "name": "office building", "shortname": ":office:", "unicode": "1f3e2", "html": "🏢", "category": "Travel & Places (place-building)", "order": "1561"}, + {"emoji": "🚣🏿♀", "name": "woman rowing boat: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6A3 1F3FF 200D 2640", "html": "🚣🏿‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏾♀", "name": "woman rowing boat: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6A3 1F3FE 200D 2640", "html": "🚣🏾‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏽♀", "name": "woman rowing boat: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6A3 1F3FD 200D 2640", "html": "🚣🏽‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏼♀", "name": "woman rowing boat: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6A3 1F3FC 200D 2640", "html": "🚣🏼‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏻♀", "name": "woman rowing boat: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6A3 1F3FB 200D 2640", "html": "🚣🏻‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣♀", "name": "woman rowing boat", "shortname": ":woman_rowing_boat:", "unicode": "1F6A3 200D 2640", "html": "🚣‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏿", "name": "person rowing boat: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6A3 1F3FF", "html": "🚣🏿", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏾", "name": "person rowing boat: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6A3 1F3FE", "html": "🚣🏾", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏽", "name": "person rowing boat: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6A3 1F3FD", "html": "🚣🏽", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏼", "name": "person rowing boat: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6A3 1F3FC", "html": "🚣🏼", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏻", "name": "person rowing boat: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6A3 1F3FB", "html": "🚣🏻", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣", "name": "person rowing boat", "shortname": ":rowboat:", "unicode": "1f6a3", "html": "🚣", "category": "People & Body (person-sport)", "order": "818"}, + {"emoji": "👒", "name": "woman’s hat", "shortname": ":womans_hat:", "unicode": "1f452", "html": "👒", "category": "Objects (clothing)", "order": "1334"}, + {"emoji": "👞", "name": "man’s shoe", "shortname": ":mans_shoe:", "unicode": "1f45e", "html": "👞", "category": "Objects (clothing)", "order": "1328"}, + {"emoji": "🏩", "name": "love hotel", "shortname": ":love_hotel:", "unicode": "1f3e9", "html": "🏩", "category": "Travel & Places (place-building)", "order": "1567"}, + {"emoji": "🗻", "name": "mount fuji", "shortname": ":mount_fuji:", "unicode": "1f5fb", "html": "🗻", "category": "Travel & Places (place-geographic)", "order": "1547"}, + {"emoji": "🐪", "name": "camel", "shortname": ":dromedary_camel:", "unicode": "1f42a", "html": "🐪", "category": "Animals & Nature (animal-mammal)", "order": "1371"}, + {"emoji": "👜", "name": "handbag", "shortname": ":handbag:", "unicode": "1f45c", "html": "👜", "category": "Objects (clothing)", "order": "1324"}, + {"emoji": "⌛", "name": "hourglass done", "shortname": ":hourglass:", "unicode": "231b", "html": "⌛", "category": "Travel & Places (time)", "order": "1680"}, + {"emoji": "❎", "name": "cross mark button", "shortname": ":negative_squared_cross_mark:", "unicode": "274e", "html": "❎", "category": "Symbols (other-symbol)", "order": "2083"}, + {"emoji": "🎺", "name": "trumpet", "shortname": ":trumpet:", "unicode": "1f3ba", "html": "🎺", "category": "Objects (musical-instrument)", "order": "1835"}, + {"emoji": "🏫", "name": "school", "shortname": ":school:", "unicode": "1f3eb", "html": "🏫", "category": "Travel & Places (place-building)", "order": "1569"}, + {"emoji": "🐄", "name": "cow", "shortname": ":cow2:", "unicode": "1f404", "html": "🐄", "category": "Animals & Nature (animal-mammal)", "order": "1363"}, + {"emoji": "🌆", "name": "cityscape at dusk", "shortname": ":cityscape_at_dusk:", "unicode": "1F306", "html": "🌆", "category": "Travel & Places (place-other)", "order": ""}, + {"emoji": "👷🏿♀", "name": "woman construction worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F477 1F3FF 200D 2640", "html": "👷🏿‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏾♀", "name": "woman construction worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F477 1F3FE 200D 2640", "html": "👷🏾‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏽♀", "name": "woman construction worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F477 1F3FD 200D 2640", "html": "👷🏽‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏼♀", "name": "woman construction worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F477 1F3FC 200D 2640", "html": "👷🏼‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏻♀", "name": "woman construction worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F477 1F3FB 200D 2640", "html": "👷🏻‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷♀", "name": "woman construction worker", "shortname": ":woman_construction_worker:", "unicode": "1F477 200D 2640", "html": "👷‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏿", "name": "construction worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F477 1F3FF", "html": "👷🏿", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏾", "name": "construction worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F477 1F3FE", "html": "👷🏾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏽", "name": "construction worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F477 1F3FD", "html": "👷🏽", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏼", "name": "construction worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F477 1F3FC", "html": "👷🏼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏻", "name": "construction worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F477 1F3FB", "html": "👷🏻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷", "name": "construction worker", "shortname": ":construction_worker:", "unicode": "1f477", "html": "👷", "category": "People & Body (person-role)", "order": "393"}, + {"emoji": "🚽", "name": "toilet", "shortname": ":toilet:", "unicode": "1f6bd", "html": "🚽", "category": "Objects (household)", "order": "1671"}, + {"emoji": "🐖", "name": "pig", "shortname": ":pig2:", "unicode": "1f416", "html": "🐖", "category": "Animals & Nature (animal-mammal)", "order": "1365"}, + {"emoji": "❔", "name": "white question mark", "shortname": ":grey_question:", "unicode": "2754", "html": "❔", "category": "Symbols (other-symbol)", "order": "2099"}, + {"emoji": "🔰", "name": "Japanese symbol for beginner", "shortname": ":beginner:", "unicode": "1f530", "html": "🔰", "category": "Symbols (other-symbol)", "order": "2075"}, + {"emoji": "🎻", "name": "violin", "shortname": ":violin:", "unicode": "1f3bb", "html": "🎻", "category": "Objects (musical-instrument)", "order": "1836"}, + {"emoji": "🔛", "name": "ON! arrow", "shortname": ":on:", "unicode": "1f51b", "html": "🔛", "category": "Symbols (arrow)", "order": "2020"}, + {"emoji": "💳", "name": "credit card", "shortname": ":credit_card:", "unicode": "1f4b3", "html": "💳", "category": "Objects (money)", "order": "1897"}, + {"emoji": "🆔", "name": "ID button", "shortname": ":id:", "unicode": "1f194", "html": "🆔", "category": "Symbols (alphanum)", "order": "2132"}, + {"emoji": "㊙", "name": "Japanese secret button", "shortname": ":secret:", "unicode": "3299", "html": "㊙", "category": "Symbols (alphanum)", "order": "2156"}, + {"emoji": "🎡", "name": "ferris wheel", "shortname": ":ferris_wheel:", "unicode": "1f3a1", "html": "🎡", "category": "Travel & Places (place-other)", "order": "1594"}, + {"emoji": "🎳", "name": "bowling", "shortname": ":bowling:", "unicode": "1f3b3", "html": "🎳", "category": "Activities (sport)", "order": "1789"}, + {"emoji": "♎", "name": "Libra", "shortname": ":libra:", "unicode": "264e", "html": "♎", "category": "Symbols (zodiac)", "order": "2041"}, + {"emoji": "♍", "name": "Virgo", "shortname": ":virgo:", "unicode": "264d", "html": "♍", "category": "Symbols (zodiac)", "order": "2040"}, + {"emoji": "💈", "name": "barber pole", "shortname": ":barber:", "unicode": "1f488", "html": "💈", "category": "Travel & Places (place-other)", "order": "1596"}, + {"emoji": "👛", "name": "purse", "shortname": ":purse:", "unicode": "1f45b", "html": "👛", "category": "Objects (clothing)", "order": "1323"}, + {"emoji": "🎢", "name": "roller coaster", "shortname": ":roller_coaster:", "unicode": "1f3a2", "html": "🎢", "category": "Travel & Places (place-other)", "order": "1595"}, + {"emoji": "🐀", "name": "rat", "shortname": ":rat:", "unicode": "1f400", "html": "🐀", "category": "Animals & Nature (animal-mammal)", "order": "1377"}, + {"emoji": "📅", "name": "calendar", "shortname": ":date:", "unicode": "1f4c5", "html": "📅", "category": "Objects (office)", "order": "1925"}, + {"emoji": "🏉", "name": "rugby football", "shortname": ":rugby_football:", "unicode": "1f3c9", "html": "🏉", "category": "Activities (sport)", "order": "1786"}, + {"emoji": "🐏", "name": "ram", "shortname": ":ram:", "unicode": "1f40f", "html": "🐏", "category": "Animals & Nature (animal-mammal)", "order": "1368"}, + {"emoji": "🔼", "name": "upwards button", "shortname": ":arrow_up_small:", "unicode": "1f53c", "html": "🔼", "category": "Symbols (av-symbol)", "order": "2058"}, + {"emoji": "🔲", "name": "black square button", "shortname": ":black_square_button:", "unicode": "1f532", "html": "🔲", "category": "Symbols (geometric)", "order": "2175"}, + {"emoji": "📴", "name": "mobile phone off", "shortname": ":mobile_phone_off:", "unicode": "1f4f4", "html": "📴", "category": "Symbols (av-symbol)", "order": "2071"}, + {"emoji": "🗼", "name": "Tokyo tower", "shortname": ":tokyo_tower:", "unicode": "1f5fc", "html": "🗼", "category": "Travel & Places (place-building)", "order": "1575"}, + {"emoji": "㊗", "name": "Japanese congratulations button", "shortname": ":congratulations:", "unicode": "3297", "html": "㊗", "category": "Symbols (alphanum)", "order": "2155"}, + {"emoji": "👘", "name": "kimono", "shortname": ":kimono:", "unicode": "1f458", "html": "👘", "category": "Objects (clothing)", "order": "1320"}, + {"emoji": "🇷🇺", "name": "flag: Russia", "shortname": ":ru:", "unicode": "1F1F7 1F1FA", "html": "🇷", "category": "Flags (country-flag)", "order": ""}, + {"emoji": "🚢", "name": "ship", "shortname": ":ship:", "unicode": "1f6a2", "html": "🚢", "category": "Travel & Places (transport-water)", "order": "1649"}, + {"emoji": "🔎", "name": "magnifying glass tilted right", "shortname": ":mag_right:", "unicode": "1f50e", "html": "🔎", "category": "Objects (light & video)", "order": "1866"}, + {"emoji": "🔍", "name": "magnifying glass tilted left", "shortname": ":mag:", "unicode": "1f50d", "html": "🔍", "category": "Objects (light & video)", "order": "1865"}, + {"emoji": "🚒", "name": "fire engine", "shortname": ":fire_engine:", "unicode": "1f692", "html": "🚒", "category": "Travel & Places (transport-ground)", "order": "1619"}, + {"emoji": "🕦", "name": "eleven-thirty", "shortname": ":clock1130:", "unicode": "1f566", "html": "🕦", "category": "Travel & Places (time)", "order": "1710"}, + {"emoji": "🚓", "name": "police car", "shortname": ":police_car:", "unicode": "1f693", "html": "🚓", "category": "Travel & Places (transport-ground)", "order": "1620"}, + {"emoji": "🃏", "name": "joker", "shortname": ":black_joker:", "unicode": "1f0cf", "html": "🃏", "category": "Activities (game)", "order": "1811"}, + {"emoji": "🌉", "name": "bridge at night", "shortname": ":bridge_at_night:", "unicode": "1f309", "html": "🌉", "category": "Travel & Places (place-other)", "order": "1590"}, + {"emoji": "📦", "name": "package", "shortname": ":package:", "unicode": "1f4e6", "html": "📦", "category": "Objects (mail)", "order": "1907"}, + {"emoji": "🚖", "name": "oncoming taxi", "shortname": ":oncoming_taxi:", "unicode": "1f696", "html": "🚖", "category": "Travel & Places (transport-ground)", "order": "1623"}, + {"emoji": "📆", "name": "tear-off calendar", "shortname": ":calendar:", "unicode": "1f4c6", "html": "📆", "category": "Objects (office)", "order": "1926"}, + {"emoji": "🏇", "name": "horse racing", "shortname": ":horse_racing:", "unicode": "1f3c7", "html": "🏇", "category": "People & Body (person-sport)", "order": "769"}, + {"emoji": "🐅", "name": "tiger", "shortname": ":tiger2:", "unicode": "1f405", "html": "🐅", "category": "Animals & Nature (animal-mammal)", "order": "1354"}, + {"emoji": "👢", "name": "woman’s boot", "shortname": ":boot:", "unicode": "1f462", "html": "👢", "category": "Objects (clothing)", "order": "1332"}, + {"emoji": "🚑", "name": "ambulance", "shortname": ":ambulance:", "unicode": "1f691", "html": "🚑", "category": "Travel & Places (transport-ground)", "order": "1618"}, + {"emoji": "🔳", "name": "white square button", "shortname": ":white_square_button:", "unicode": "1f533", "html": "🔳", "category": "Symbols (geometric)", "order": "2176"}, + {"emoji": "🐗", "name": "boar", "shortname": ":boar:", "unicode": "1f417", "html": "🐗", "category": "Animals & Nature (animal-mammal)", "order": "1366"}, + {"emoji": "🎒", "name": "backpack", "shortname": ":school_satchel:", "unicode": "1f392", "html": "🎒", "category": "Objects (clothing)", "order": "1327"}, + {"emoji": "➿", "name": "double curly loop", "shortname": ":loop:", "unicode": "27bf", "html": "➿", "category": "Symbols (other-symbol)", "order": "2091"}, + {"emoji": "💷", "name": "pound banknote", "shortname": ":pound:", "unicode": "1f4b7", "html": "💷", "category": "Objects (money)", "order": "1895"}, + {"emoji": "ℹ", "name": "information", "shortname": ":information_source:", "unicode": "2139", "html": "ℹ", "category": "Symbols (alphanum)", "order": "2131"}, + {"emoji": "🐂", "name": "ox", "shortname": ":ox:", "unicode": "1f402", "html": "🐂", "category": "Animals & Nature (animal-mammal)", "order": "1361"}, + {"emoji": "🍙", "name": "rice ball", "shortname": ":rice_ball:", "unicode": "1f359", "html": "🍙", "category": "Food & Drink (food-asian)", "order": "1497"}, + {"emoji": "🆚", "name": "VS button", "shortname": ":vs:", "unicode": "1f19a", "html": "🆚", "category": "Symbols (alphanum)", "order": "2141"}, + {"emoji": "🔚", "name": "END arrow", "shortname": ":end:", "unicode": "1f51a", "html": "🔚", "category": "Symbols (arrow)", "order": "2019"}, + {"emoji": "🅿️", "name": "P button", "shortname": ":parking:", "unicode": "1f17f", "html": "🅿", "category": "Symbols (alphanum)", "order": "2138"}, + {"emoji": "👡", "name": "woman’s sandal", "shortname": ":sandal:", "unicode": "1f461", "html": "👡", "category": "Objects (clothing)", "order": "1331"}, + {"emoji": "⛺", "name": "tent", "shortname": ":tent:", "unicode": "26fa", "html": "⛺", "category": "Travel & Places (place-other)", "order": "1583"}, + {"emoji": "💺", "name": "seat", "shortname": ":seat:", "unicode": "1f4ba", "html": "💺", "category": "Travel & Places (transport-air)", "order": "1654"}, + {"emoji": "🚕", "name": "taxi", "shortname": ":taxi:", "unicode": "1f695", "html": "🚕", "category": "Travel & Places (transport-ground)", "order": "1622"}, + {"emoji": "◾", "name": "black medium-small square", "shortname": ":black_medium_small_square:", "unicode": "25fe", "html": "◾", "category": "Symbols (geometric)", "order": "2164"}, + {"emoji": "💼", "name": "briefcase", "shortname": ":briefcase:", "unicode": "1f4bc", "html": "💼", "category": "Objects (office)", "order": "1921"}, + {"emoji": "📰", "name": "newspaper", "shortname": ":newspaper:", "unicode": "1f4f0", "html": "📰", "category": "Objects (book-paper)", "order": "1886"}, + {"emoji": "🎪", "name": "circus tent", "shortname": ":circus_tent:", "unicode": "1f3aa", "html": "🎪", "category": "Travel & Places (place-other)", "order": "1597"}, + {"emoji": "🔯", "name": "dotted six-pointed star", "shortname": ":six_pointed_star:", "unicode": "1f52f", "html": "🔯", "category": "Symbols (religion)", "order": "2034"}, + {"emoji": "🚹", "name": "men’s room", "shortname": ":mens:", "unicode": "1f6b9", "html": "🚹", "category": "Symbols (transport-sign)", "order": "1980"}, + {"emoji": "🏰", "name": "castle", "shortname": ":european_castle:", "unicode": "1f3f0", "html": "🏰", "category": "Travel & Places (place-building)", "order": "1573"}, + {"emoji": "🔦", "name": "flashlight", "shortname": ":flashlight:", "unicode": "1f526", "html": "🔦", "category": "Objects (light & video)", "order": "1872"}, + {"emoji": "🌁", "name": "foggy", "shortname": ":foggy:", "unicode": "1f301", "html": "🌁", "category": "Travel & Places (place-other)", "order": "1584"}, + {"emoji": "⏫", "name": "fast up button", "shortname": ":arrow_double_up:", "unicode": "23eb", "html": "⏫", "category": "Symbols (av-symbol)", "order": "2059"}, + {"emoji": "🎍", "name": "pine decoration", "shortname": ":bamboo:", "unicode": "1f38d", "html": "🎍", "category": "Activities (event)", "order": "1765"}, + {"emoji": "🎫", "name": "ticket", "shortname": ":ticket:", "unicode": "1f3ab", "html": "🎫", "category": "Activities (event)", "order": "1774"}, + {"emoji": "🚁", "name": "helicopter", "shortname": ":helicopter:", "unicode": "1f681", "html": "🚁", "category": "Travel & Places (transport-air)", "order": "1655"}, + {"emoji": "💽", "name": "computer disk", "shortname": ":minidisc:", "unicode": "1f4bd", "html": "💽", "category": "Objects (computer)", "order": "1852"}, + {"emoji": "🚍", "name": "oncoming bus", "shortname": ":oncoming_bus:", "unicode": "1f68d", "html": "🚍", "category": "Travel & Places (transport-ground)", "order": "1615"}, + {"emoji": "🍈", "name": "melon", "shortname": ":melon:", "unicode": "1f348", "html": "🍈", "category": "Food & Drink (food-fruit)", "order": "1450"}, + {"emoji": "▫", "name": "white small square", "shortname": ":white_small_square:", "unicode": "25ab", "html": "▫", "category": "Symbols (geometric)", "order": "2160"}, + {"emoji": "🏤", "name": "post office", "shortname": ":european_post_office:", "unicode": "1f3e4", "html": "🏤", "category": "Travel & Places (place-building)", "order": "1563"}, + {"emoji": "🔟", "name": "keycap: 10", "shortname": ":keycap_ten:", "unicode": "1f51f", "html": "🔟", "category": "Symbols (keycap)", "order": "2118"}, + {"emoji": "📓", "name": "notebook", "shortname": ":notebook:", "unicode": "1f4d3", "html": "📓", "category": "Objects (book-paper)", "order": "1881"}, + {"emoji": "🔕", "name": "bell with slash", "shortname": ":no_bell:", "unicode": "1f515", "html": "🔕", "category": "Objects (sound)", "order": "1822"}, + {"emoji": "🍢", "name": "oden", "shortname": ":oden:", "unicode": "1f362", "html": "🍢", "category": "Food & Drink (food-asian)", "order": "1503"}, + {"emoji": "🎏", "name": "carp streamer", "shortname": ":flags:", "unicode": "1f38f", "html": "🎏", "category": "Activities (event)", "order": "1767"}, + {"emoji": "🎠", "name": "carousel horse", "shortname": ":carousel_horse:", "unicode": "1f3a0", "html": "🎠", "category": "Travel & Places (place-other)", "order": "1593"}, + {"emoji": "🐡", "name": "blowfish", "shortname": ":blowfish:", "unicode": "1f421", "html": "🐡", "category": "Animals & Nature (animal-marine)", "order": "1411"}, + {"emoji": "📈", "name": "chart increasing", "shortname": ":chart_with_upwards_trend:", "unicode": "1f4c8", "html": "📈", "category": "Objects (office)", "order": "1930"}, + {"emoji": "🍠", "name": "roasted sweet potato", "shortname": ":sweet_potato:", "unicode": "1f360", "html": "🍠", "category": "Food & Drink (food-asian)", "order": "1502"}, + {"emoji": "🎿", "name": "skis", "shortname": ":ski:", "unicode": "1f3bf", "html": "🎿", "category": "Activities (sport)", "order": "1803"}, + {"emoji": "🕛", "name": "twelve o’clock", "shortname": ":clock12:", "unicode": "1f55b", "html": "🕛", "category": "Travel & Places (time)", "order": "1687"}, + {"emoji": "📶", "name": "antenna bars", "shortname": ":signal_strength:", "unicode": "1f4f6", "html": "📶", "category": "Symbols (av-symbol)", "order": "2069"}, + {"emoji": "🚧", "name": "construction", "shortname": ":construction:", "unicode": "1f6a7", "html": "🚧", "category": "Travel & Places (transport-ground)", "order": "1640"}, + {"emoji": "#", "name": "", "shortname": "", "unicode": "", "html": "#", "category": "", "order": ""}, + {"emoji": "◼", "name": "black medium square", "shortname": ":black_medium_square:", "unicode": "25fc", "html": "◼", "category": "Symbols (geometric)", "order": "2162"}, + {"emoji": "📡", "name": "satellite antenna", "shortname": ":satellite:", "unicode": "1f4e1", "html": "📡", "category": "Objects (science)", "order": "1869"}, + {"emoji": "💶", "name": "euro banknote", "shortname": ":euro:", "unicode": "1f4b6", "html": "💶", "category": "Objects (money)", "order": "1894"}, + {"emoji": "👚", "name": "woman’s clothes", "shortname": ":womans_clothes:", "unicode": "1f45a", "html": "👚", "category": "Objects (clothing)", "order": "1322"}, + {"emoji": "📒", "name": "ledger", "shortname": ":ledger:", "unicode": "1f4d2", "html": "📒", "category": "Objects (book-paper)", "order": "1882"}, + {"emoji": "🐆", "name": "leopard", "shortname": ":leopard:", "unicode": "1f406", "html": "🐆", "category": "Animals & Nature (animal-mammal)", "order": "1355"}, + {"emoji": "🔅", "name": "dim button", "shortname": ":low_brightness:", "unicode": "1f505", "html": "🔅", "category": "Symbols (av-symbol)", "order": "2067"}, + {"emoji": "🕒", "name": "three o’clock", "shortname": ":clock3:", "unicode": "1f552", "html": "🕒", "category": "Travel & Places (time)", "order": "1693"}, + {"emoji": "🏬", "name": "department store", "shortname": ":department_store:", "unicode": "1f3ec", "html": "🏬", "category": "Travel & Places (place-building)", "order": "1570"}, + {"emoji": "🚚", "name": "delivery truck", "shortname": ":truck:", "unicode": "1f69a", "html": "🚚", "category": "Travel & Places (transport-ground)", "order": "1627"}, + {"emoji": "🍶", "name": "sake", "shortname": ":sake:", "unicode": "1f376", "html": "🍶", "category": "Food & Drink (drink)", "order": "1524"}, + {"emoji": "🚃", "name": "railway car", "shortname": ":railway_car:", "unicode": "1f683", "html": "🚃", "category": "Travel & Places (transport-ground)", "order": "1603"}, + {"emoji": "🚤", "name": "speedboat", "shortname": ":speedboat:", "unicode": "1f6a4", "html": "🚤", "category": "Travel & Places (transport-water)", "order": "1645"}, + {"emoji": "🇰🇷", "name": "flag: South Korea", "shortname": ":ko:", "unicode": "1F1F0 1F1F7", "html": "🇰", "category": "Flags (country-flag)", "order": ""}, + {"emoji": "📼", "name": "videocassette", "shortname": ":vhs:", "unicode": "1f4fc", "html": "📼", "category": "Objects (light & video)", "order": "1864"}, + {"emoji": "🕐", "name": "one o’clock", "shortname": ":clock1:", "unicode": "1f550", "html": "🕐", "category": "Travel & Places (time)", "order": "1689"}, + {"emoji": "⏬", "name": "fast down button", "shortname": ":arrow_double_down:", "unicode": "23ec", "html": "⏬", "category": "Symbols (av-symbol)", "order": "2061"}, + {"emoji": "🐃", "name": "water buffalo", "shortname": ":water_buffalo:", "unicode": "1f403", "html": "🐃", "category": "Animals & Nature (animal-mammal)", "order": "1362"}, + {"emoji": "🔽", "name": "downwards button", "shortname": ":arrow_down_small:", "unicode": "1f53d", "html": "🔽", "category": "Symbols (av-symbol)", "order": "2060"}, + {"emoji": "💴", "name": "yen banknote", "shortname": ":yen:", "unicode": "1f4b4", "html": "💴", "category": "Objects (money)", "order": "1892"}, + {"emoji": "🔇", "name": "muted speaker", "shortname": ":mute:", "unicode": "1f507", "html": "🔇", "category": "Objects (sound)", "order": "1814"}, + {"emoji": "🎽", "name": "running shirt", "shortname": ":running_shirt_with_sash:", "unicode": "1f3bd", "html": "🎽", "category": "Activities (sport)", "order": "1802"}, + {"emoji": "⬜", "name": "white large square", "shortname": ":white_large_square:", "unicode": "2b1c", "html": "⬜", "category": "Symbols (geometric)", "order": "2166"}, + {"emoji": "♿", "name": "wheelchair symbol", "shortname": ":wheelchair:", "unicode": "267f", "html": "♿", "category": "Symbols (transport-sign)", "order": "1979"}, + {"emoji": "🕑", "name": "two o’clock", "shortname": ":clock2:", "unicode": "1f551", "html": "🕑", "category": "Travel & Places (time)", "order": "1691"}, + {"emoji": "📎", "name": "paperclip", "shortname": ":paperclip:", "unicode": "1f4ce", "html": "📎", "category": "Objects (office)", "order": "1936"}, + {"emoji": "🏧", "name": "ATM sign", "shortname": ":atm:", "unicode": "1f3e7", "html": "🏧", "category": "Symbols (transport-sign)", "order": "1976"}, + {"emoji": "🎦", "name": "cinema", "shortname": ":cinema:", "unicode": "1f3a6", "html": "🎦", "category": "Symbols (av-symbol)", "order": "2066"}, + {"emoji": "🔭", "name": "telescope", "shortname": ":telescope:", "unicode": "1f52d", "html": "🔭", "category": "Objects (science)", "order": "1868"}, + {"emoji": "🎑", "name": "moon viewing ceremony", "shortname": ":rice_scene:", "unicode": "1f391", "html": "🎑", "category": "Activities (event)", "order": "1769"}, + {"emoji": "📘", "name": "blue book", "shortname": ":blue_book:", "unicode": "1f4d8", "html": "📘", "category": "Objects (book-paper)", "order": "1878"}, + {"emoji": "◻️", "name": "white medium square", "shortname": ":white_medium_square:", "unicode": "25fb", "html": "◻", "category": "Symbols (geometric)", "order": "2161"}, + {"emoji": "📮", "name": "postbox", "shortname": ":postbox:", "unicode": "1f4ee", "html": "📮", "category": "Objects (mail)", "order": "1912"}, + {"emoji": "📧", "name": "e-mail", "shortname": ":e-mail:", "unicode": "1f4e7", "html": "📧", "category": "Objects (mail)", "order": "1902"}, + {"emoji": "🐁", "name": "mouse", "shortname": ":mouse2:", "unicode": "1f401", "html": "🐁", "category": "Animals & Nature (animal-mammal)", "order": "1376"}, + {"emoji": "🚄", "name": "high-speed train", "shortname": ":bullettrain_side:", "unicode": "1f684", "html": "🚄", "category": "Travel & Places (transport-ground)", "order": "1604"}, + {"emoji": "🉐", "name": "Japanese bargain button", "shortname": ":ideograph_advantage:", "unicode": "1f250", "html": "🉐", "category": "Symbols (alphanum)", "order": "2147"}, + {"emoji": "🔩", "name": "nut and bolt", "shortname": ":nut_and_bolt:", "unicode": "1f529", "html": "🔩", "category": "Objects (tool)", "order": "1960"}, + {"emoji": "🆖", "name": "NG button", "shortname": ":ng:", "unicode": "1f196", "html": "🆖", "category": "Symbols (alphanum)", "order": "2135"}, + {"emoji": "🏨", "name": "hotel", "shortname": ":hotel:", "unicode": "1f3e8", "html": "🏨", "category": "Travel & Places (place-building)", "order": "1566"}, + {"emoji": "🚾", "name": "water closet", "shortname": ":wc:", "unicode": "1f6be", "html": "🚾", "category": "Symbols (transport-sign)", "order": "1984"}, + {"emoji": "🏮", "name": "red paper lantern", "shortname": ":izakaya_lantern:", "unicode": "1f3ee", "html": "🏮", "category": "Objects (light & video)", "order": "1873"}, + {"emoji": "🔂", "name": "repeat single button", "shortname": ":repeat_one:", "unicode": "1f502", "html": "🔂", "category": "Symbols (av-symbol)", "order": "2050"}, + {"emoji": "📬", "name": "open mailbox with raised flag", "shortname": ":mailbox_with_mail:", "unicode": "1f4ec", "html": "📬", "category": "Objects (mail)", "order": "1910"}, + {"emoji": "📉", "name": "chart decreasing", "shortname": ":chart_with_downwards_trend:", "unicode": "1f4c9", "html": "📉", "category": "Objects (office)", "order": "1931"}, + {"emoji": "📗", "name": "green book", "shortname": ":green_book:", "unicode": "1f4d7", "html": "📗", "category": "Objects (book-paper)", "order": "1877"}, + {"emoji": "🚜", "name": "tractor", "shortname": ":tractor:", "unicode": "1f69c", "html": "🚜", "category": "Travel & Places (transport-ground)", "order": "1629"}, + {"emoji": "⛲", "name": "fountain", "shortname": ":fountain:", "unicode": "26f2", "html": "⛲", "category": "Travel & Places (place-other)", "order": "1582"}, + {"emoji": "🚇", "name": "metro", "shortname": ":metro:", "unicode": "1f687", "html": "🚇", "category": "Travel & Places (transport-ground)", "order": "1607"}, + {"emoji": "📋", "name": "clipboard", "shortname": ":clipboard:", "unicode": "1f4cb", "html": "📋", "category": "Objects (office)", "order": "1933"}, + {"emoji": "📵", "name": "no mobile phones", "shortname": ":no_mobile_phones:", "unicode": "1f4f5", "html": "📵", "category": "Symbols (warning)", "order": "1998"}, + {"emoji": "🕓", "name": "four o’clock", "shortname": ":clock4:", "unicode": "1f553", "html": "🕓", "category": "Travel & Places (time)", "order": "1695"}, + {"emoji": "🚭", "name": "no smoking", "shortname": ":no_smoking:", "unicode": "1f6ad", "html": "🚭", "category": "Symbols (warning)", "order": "1994"}, + {"emoji": "⬛", "name": "black large square", "shortname": ":black_large_square:", "unicode": "2b1b", "html": "⬛", "category": "Symbols (geometric)", "order": "2165"}, + {"emoji": "🎰", "name": "slot machine", "shortname": ":slot_machine:", "unicode": "1f3b0", "html": "🎰", "category": "Activities (game)", "order": "1601"}, + {"emoji": "🕔", "name": "five o’clock", "shortname": ":clock5:", "unicode": "1f554", "html": "🕔", "category": "Travel & Places (time)", "order": "1697"}, + {"emoji": "🛁", "name": "bathtub", "shortname": ":bathtub:", "unicode": "1f6c1", "html": "🛁", "category": "Objects (household)", "order": "1679"}, + {"emoji": "📜", "name": "scroll", "shortname": ":scroll:", "unicode": "1f4dc", "html": "📜", "category": "Objects (book-paper)", "order": "1884"}, + {"emoji": "🚉", "name": "station", "shortname": ":station:", "unicode": "1f689", "html": "🚉", "category": "Travel & Places (transport-ground)", "order": "1609"}, + {"emoji": "🍘", "name": "rice cracker", "shortname": ":rice_cracker:", "unicode": "1f358", "html": "🍘", "category": "Food & Drink (food-asian)", "order": "1496"}, + {"emoji": "🏦", "name": "bank", "shortname": ":bank:", "unicode": "1f3e6", "html": "🏦", "category": "Travel & Places (place-building)", "order": "1565"}, + {"emoji": "🔧", "name": "wrench", "shortname": ":wrench:", "unicode": "1f527", "html": "🔧", "category": "Objects (tool)", "order": "1959"}, + {"emoji": "🈯️", "name": "", "shortname": ":u6307:", "unicode": "1f22f", "html": "🈯", "category": "", "order": "2146"}, + {"emoji": "🚛", "name": "articulated lorry", "shortname": ":articulated_lorry:", "unicode": "1f69b", "html": "🚛", "category": "Travel & Places (transport-ground)", "order": "1628"}, + {"emoji": "📄", "name": "page facing up", "shortname": ":page_facing_up:", "unicode": "1f4c4", "html": "📄", "category": "Objects (book-paper)", "order": "1885"}, + {"emoji": "⛎", "name": "Ophiuchus", "shortname": ":ophiuchus:", "unicode": "26ce", "html": "⛎", "category": "Symbols (zodiac)", "order": "2047"}, + {"emoji": "📊", "name": "bar chart", "shortname": ":bar_chart:", "unicode": "1f4ca", "html": "📊", "category": "Objects (office)", "order": "1932"}, + {"emoji": "🚷", "name": "no pedestrians", "shortname": ":no_pedestrians:", "unicode": "1f6b7", "html": "🚷", "category": "Symbols (warning)", "order": "1997"}, + {"emoji": "🇨🇳", "name": "flag: China", "shortname": ":cn:", "unicode": "1F1E8 1F1F3", "html": "🇨", "category": "Flags (country-flag)", "order": ""}, + {"emoji": "📳", "name": "vibration mode", "shortname": ":vibration_mode:", "unicode": "1f4f3", "html": "📳", "category": "Symbols (av-symbol)", "order": "2070"}, + {"emoji": "🕙", "name": "ten o’clock", "shortname": ":clock10:", "unicode": "1f559", "html": "🕙", "category": "Travel & Places (time)", "order": "1707"}, + {"emoji": "🕘", "name": "nine o’clock", "shortname": ":clock9:", "unicode": "1f558", "html": "🕘", "category": "Travel & Places (time)", "order": "1705"}, + {"emoji": "🚅", "name": "bullet train", "shortname": ":bullettrain_front:", "unicode": "1f685", "html": "🚅", "category": "Travel & Places (transport-ground)", "order": "1605"}, + {"emoji": "🚐", "name": "minibus", "shortname": ":minibus:", "unicode": "1f690", "html": "🚐", "category": "Travel & Places (transport-ground)", "order": "1617"}, + {"emoji": "🚊", "name": "tram", "shortname": ":tram:", "unicode": "1f68a", "html": "🚊", "category": "Travel & Places (transport-ground)", "order": "1610"}, + {"emoji": "🕗", "name": "eight o’clock", "shortname": ":clock8:", "unicode": "1f557", "html": "🕗", "category": "Travel & Places (time)", "order": "1703"}, + {"emoji": "🈳", "name": "Japanese vacancy button", "shortname": ":u7a7a:", "unicode": "1f233", "html": "🈳", "category": "Symbols (alphanum)", "order": "2154"}, + {"emoji": "🚥", "name": "horizontal traffic light", "shortname": ":traffic_light:", "unicode": "1f6a5", "html": "🚥", "category": "Travel & Places (transport-ground)", "order": "1638"}, + {"emoji": "🚵🏿♀", "name": "woman mountain biking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B5 1F3FF 200D 2640", "html": "🚵🏿‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏾♀", "name": "woman mountain biking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B5 1F3FE 200D 2640", "html": "🚵🏾‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏽♀", "name": "woman mountain biking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B5 1F3FD 200D 2640", "html": "🚵🏽‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏼♀", "name": "woman mountain biking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B5 1F3FC 200D 2640", "html": "🚵🏼‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏻♀", "name": "woman mountain biking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B5 1F3FB 200D 2640", "html": "🚵🏻‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵♀", "name": "woman mountain biking", "shortname": ":woman_mountain_biking:", "unicode": "1F6B5 200D 2640", "html": "🚵‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏿", "name": "person mountain biking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B5 1F3FF", "html": "🚵🏿", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏾", "name": "person mountain biking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B5 1F3FE", "html": "🚵🏾", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏽", "name": "person mountain biking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B5 1F3FD", "html": "🚵🏽", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏼", "name": "person mountain biking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B5 1F3FC", "html": "🚵🏼", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏻", "name": "person mountain biking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B5 1F3FB", "html": "🚵🏻", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵", "name": "person mountain biking", "shortname": ":mountain_bicyclist:", "unicode": "1f6b5", "html": "🚵", "category": "People & Body (person-sport)", "order": "908"}, + {"emoji": "🔬", "name": "microscope", "shortname": ":microscope:", "unicode": "1f52c", "html": "🔬", "category": "Objects (science)", "order": "1867"}, + {"emoji": "🏯", "name": "Japanese castle", "shortname": ":japanese_castle:", "unicode": "1f3ef", "html": "🏯", "category": "Travel & Places (place-building)", "order": "1572"}, + {"emoji": "🔖", "name": "bookmark", "shortname": ":bookmark:", "unicode": "1f516", "html": "🔖", "category": "Objects (book-paper)", "order": "1889"}, + {"emoji": "📑", "name": "bookmark tabs", "shortname": ":bookmark_tabs:", "unicode": "1f4d1", "html": "📑", "category": "Objects (book-paper)", "order": "1888"}, + {"emoji": "👝", "name": "clutch bag", "shortname": ":pouch:", "unicode": "1f45d", "html": "👝", "category": "Objects (clothing)", "order": "1325"}, + {"emoji": "🆎", "name": "AB button (blood type)", "shortname": ":ab:", "unicode": "1f18e", "html": "🆎", "category": "Symbols (alphanum)", "order": "2126"}, + {"emoji": "📃", "name": "page with curl", "shortname": ":page_with_curl:", "unicode": "1f4c3", "html": "📃", "category": "Objects (book-paper)", "order": "1883"}, + {"emoji": "🎴", "name": "flower playing cards", "shortname": ":flower_playing_cards:", "unicode": "1f3b4", "html": "🎴", "category": "Activities (game)", "order": "1813"}, + {"emoji": "🕚", "name": "eleven o’clock", "shortname": ":clock11:", "unicode": "1f55a", "html": "🕚", "category": "Travel & Places (time)", "order": "1709"}, + {"emoji": "📠", "name": "fax machine", "shortname": ":fax:", "unicode": "1f4e0", "html": "📠", "category": "Objects (phone)", "order": "1843"}, + {"emoji": "🕖", "name": "seven o’clock", "shortname": ":clock7:", "unicode": "1f556", "html": "🕖", "category": "Travel & Places (time)", "order": "1701"}, + {"emoji": "◽", "name": "white medium-small square", "shortname": ":white_medium_small_square:", "unicode": "25fd", "html": "◽", "category": "Symbols (geometric)", "order": "2163"}, + {"emoji": "💱", "name": "currency exchange", "shortname": ":currency_exchange:", "unicode": "1f4b1", "html": "💱", "category": "Objects (money)", "order": "1899"}, + {"emoji": "🔉", "name": "speaker medium volume", "shortname": ":sound:", "unicode": "1f509", "html": "🔉", "category": "Objects (sound)", "order": "1816"}, + {"emoji": "💹", "name": "chart increasing with yen", "shortname": ":chart:", "unicode": "1f4b9", "html": "💹", "category": "Objects (money)", "order": "1898"}, + {"emoji": "🆑", "name": "CL button", "shortname": ":cl:", "unicode": "1f191", "html": "🆑", "category": "Symbols (alphanum)", "order": "2128"}, + {"emoji": "💾", "name": "floppy disk", "shortname": ":floppy_disk:", "unicode": "1f4be", "html": "💾", "category": "Objects (computer)", "order": "1853"}, + {"emoji": "🏣", "name": "Japanese post office", "shortname": ":post_office:", "unicode": "1f3e3", "html": "🏣", "category": "Travel & Places (place-building)", "order": "1562"}, + {"emoji": "🔈", "name": "speaker low volume", "shortname": ":speaker:", "unicode": "1f508", "html": "🔈", "category": "Objects (sound)", "order": "1815"}, + {"emoji": "🗾", "name": "map of Japan", "shortname": ":japan:", "unicode": "1f5fe", "html": "🗾", "category": "Travel & Places (place-map)", "order": "1543"}, + {"emoji": "🈺", "name": "Japanese open for business button", "shortname": ":u55b6:", "unicode": "1f23a", "html": "🈺", "category": "Symbols (alphanum)", "order": "2157"}, + {"emoji": "🀄", "name": "mahjong red dragon", "shortname": ":mahjong:", "unicode": "1f004", "html": "🀄", "category": "Activities (game)", "order": "1812"}, + {"emoji": "📨", "name": "incoming envelope", "shortname": ":incoming_envelope:", "unicode": "1f4e8", "html": "📨", "category": "Objects (mail)", "order": "1903"}, + {"emoji": "📙", "name": "orange book", "shortname": ":orange_book:", "unicode": "1f4d9", "html": "📙", "category": "Objects (book-paper)", "order": "1879"}, + {"emoji": "🚻", "name": "restroom", "shortname": ":restroom:", "unicode": "1f6bb", "html": "🚻", "category": "Symbols (transport-sign)", "order": "1982"}, + {"emoji": "🈚️", "name": "", "shortname": ":u7121:", "unicode": "1f21a", "html": "🈚", "category": "", "order": "2149"}, + {"emoji": "🈶", "name": "Japanese not free of charge button", "shortname": ":u6709:", "unicode": "1f236", "html": "🈶", "category": "Symbols (alphanum)", "order": "2145"}, + {"emoji": "📐", "name": "triangular ruler", "shortname": ":triangular_ruler:", "unicode": "1f4d0", "html": "📐", "category": "Objects (office)", "order": "1939"}, + {"emoji": "🚋", "name": "tram car", "shortname": ":train:", "unicode": "1f68b", "html": "🚋", "category": "Travel & Places (transport-ground)", "order": "1613"}, + {"emoji": "🈸", "name": "Japanese application button", "shortname": ":u7533:", "unicode": "1f238", "html": "🈸", "category": "Symbols (alphanum)", "order": "2152"}, + {"emoji": "🚎", "name": "trolleybus", "shortname": ":trolleybus:", "unicode": "1f68e", "html": "🚎", "category": "Travel & Places (transport-ground)", "order": "1616"}, + {"emoji": "🈷", "name": "Japanese monthly amount button", "shortname": ":u6708:", "unicode": "1f237", "html": "🈷", "category": "Symbols (alphanum)", "order": "2144"}, + {"emoji": "🔢", "name": "input numbers", "shortname": ":input_numbers:", "unicode": "1F522", "html": "🔢", "category": "Symbols (alphanum)", "order": ""}, + {"emoji": "📔", "name": "notebook with decorative cover", "shortname": ":notebook_with_decorative_cover:", "unicode": "1f4d4", "html": "📔", "category": "Objects (book-paper)", "order": "1874"}, + {"emoji": "🈲", "name": "Japanese prohibited button", "shortname": ":u7981:", "unicode": "1f232", "html": "🈲", "category": "Symbols (alphanum)", "order": "2150"}, + {"emoji": "🈵", "name": "Japanese no vacancy button", "shortname": ":u6e80:", "unicode": "1f235", "html": "🈵", "category": "Symbols (alphanum)", "order": "2158"}, + {"emoji": "📯", "name": "postal horn", "shortname": ":postal_horn:", "unicode": "1f4ef", "html": "📯", "category": "Objects (sound)", "order": "1820"}, + {"emoji": "🏭", "name": "factory", "shortname": ":factory:", "unicode": "1f3ed", "html": "🏭", "category": "Travel & Places (place-building)", "order": "1571"}, + {"emoji": "🚸", "name": "children crossing", "shortname": ":children_crossing:", "unicode": "1f6b8", "html": "🚸", "category": "Symbols (warning)", "order": "1990"}, + {"emoji": "🚆", "name": "train", "shortname": ":train2:", "unicode": "1f686", "html": "🚆", "category": "Travel & Places (transport-ground)", "order": "1606"}, + {"emoji": "📏", "name": "straight ruler", "shortname": ":straight_ruler:", "unicode": "1f4cf", "html": "📏", "category": "Objects (office)", "order": "1938"}, + {"emoji": "📟", "name": "pager", "shortname": ":pager:", "unicode": "1f4df", "html": "📟", "category": "Objects (phone)", "order": "1842"}, + {"emoji": "🉑", "name": "Japanese acceptable button", "shortname": ":accept:", "unicode": "1f251", "html": "🉑", "category": "Symbols (alphanum)", "order": "2151"}, + {"emoji": "🈴", "name": "Japanese passing grade button", "shortname": ":u5408:", "unicode": "1f234", "html": "🈴", "category": "Symbols (alphanum)", "order": "2153"}, + {"emoji": "🔏", "name": "locked with pen", "shortname": ":lock_with_ink_pen:", "unicode": "1f50f", "html": "🔏", "category": "Objects (lock)", "order": "1946"}, + {"emoji": "🕜", "name": "one-thirty", "shortname": ":clock130:", "unicode": "1f55c", "html": "🕜", "category": "Travel & Places (time)", "order": "1690"}, + {"emoji": "🈂️", "name": "Japanese service charge button", "shortname": ":sa:", "unicode": "1f202", "html": "🈂", "category": "Symbols (alphanum)", "order": "2143"}, + {"emoji": "📤", "name": "outbox tray", "shortname": ":outbox_tray:", "unicode": "1f4e4", "html": "📤", "category": "Objects (mail)", "order": "1905"}, + {"emoji": "🔀", "name": "shuffle tracks button", "shortname": ":twisted_rightwards_arrows:", "unicode": "1f500", "html": "🔀", "category": "Symbols (av-symbol)", "order": "2048"}, + {"emoji": "📫", "name": "closed mailbox with raised flag", "shortname": ":mailbox:", "unicode": "1f4eb", "html": "📫", "category": "Objects (mail)", "order": "1908"}, + {"emoji": "🚈", "name": "light rail", "shortname": ":light_rail:", "unicode": "1f688", "html": "🚈", "category": "Travel & Places (transport-ground)", "order": "1608"}, + {"emoji": "🕤", "name": "nine-thirty", "shortname": ":clock930:", "unicode": "1f564", "html": "🕤", "category": "Travel & Places (time)", "order": "1706"}, + {"emoji": "🚏", "name": "bus stop", "shortname": ":busstop:", "unicode": "1f68f", "html": "🚏", "category": "Travel & Places (transport-ground)", "order": "1633"}, + {"emoji": "📂", "name": "open file folder", "shortname": ":open_file_folder:", "unicode": "1f4c2", "html": "📂", "category": "Objects (office)", "order": "1923"}, + {"emoji": "📁", "name": "file folder", "shortname": ":file_folder:", "unicode": "1f4c1", "html": "📁", "category": "Objects (office)", "order": "1922"}, + {"emoji": "🚰", "name": "potable water", "shortname": ":potable_water:", "unicode": "1f6b0", "html": "🚰", "category": "Symbols (transport-sign)", "order": "1978"}, + {"emoji": "📇", "name": "card index", "shortname": ":card_index:", "unicode": "1f4c7", "html": "📇", "category": "Objects (office)", "order": "1929"}, + {"emoji": "🕝", "name": "two-thirty", "shortname": ":clock230:", "unicode": "1f55d", "html": "🕝", "category": "Travel & Places (time)", "order": "1692"}, + {"emoji": "🚝", "name": "monorail", "shortname": ":monorail:", "unicode": "1f69d", "html": "🚝", "category": "Travel & Places (transport-ground)", "order": "1611"}, + {"emoji": "🕧", "name": "twelve-thirty", "shortname": ":clock1230:", "unicode": "1f567", "html": "🕧", "category": "Travel & Places (time)", "order": "1688"}, + {"emoji": "🕥", "name": "ten-thirty", "shortname": ":clock1030:", "unicode": "1f565", "html": "🕥", "category": "Travel & Places (time)", "order": "1708"}, + {"emoji": "🔤", "name": "input latin letters", "shortname": ":abc:", "unicode": "1f524", "html": "🔤", "category": "Symbols (alphanum)", "order": "2124"}, + {"emoji": "📪", "name": "closed mailbox with lowered flag", "shortname": ":mailbox_closed:", "unicode": "1f4ea", "html": "📪", "category": "Objects (mail)", "order": "1909"}, + {"emoji": "🕟", "name": "four-thirty", "shortname": ":clock430:", "unicode": "1f55f", "html": "🕟", "category": "Travel & Places (time)", "order": "1696"}, + {"emoji": "🚞", "name": "mountain railway", "shortname": ":mountain_railway:", "unicode": "1f69e", "html": "🚞", "category": "Travel & Places (transport-ground)", "order": "1612"}, + {"emoji": "🚯", "name": "no littering", "shortname": ":do_not_litter:", "unicode": "1f6af", "html": "🚯", "category": "Symbols (warning)", "order": "1995"}, + {"emoji": "🕞", "name": "three-thirty", "shortname": ":clock330:", "unicode": "1f55e", "html": "🕞", "category": "Travel & Places (time)", "order": "1694"}, + {"emoji": "➗", "name": "division sign", "shortname": ":heavy_division_sign:", "unicode": "2797", "html": "➗", "category": "Symbols (other-symbol)", "order": "2089"}, + {"emoji": "🕢", "name": "seven-thirty", "shortname": ":clock730:", "unicode": "1f562", "html": "🕢", "category": "Travel & Places (time)", "order": "1702"}, + {"emoji": "🕠", "name": "five-thirty", "shortname": ":clock530:", "unicode": "1f560", "html": "🕠", "category": "Travel & Places (time)", "order": "1698"}, + {"emoji": "🔠", "name": "input latin uppercase", "shortname": ":capital_abcd:", "unicode": "1f520", "html": "🔠", "category": "Symbols (alphanum)", "order": "2120"}, + {"emoji": "📭", "name": "open mailbox with lowered flag", "shortname": ":mailbox_with_no_mail:", "unicode": "1f4ed", "html": "📭", "category": "Objects (mail)", "order": "1911"}, + {"emoji": "🔣", "name": "input symbols", "shortname": ":symbols:", "unicode": "1f523", "html": "🔣", "category": "Symbols (alphanum)", "order": "2123"}, + {"emoji": "🚡", "name": "aerial tramway", "shortname": ":aerial_tramway:", "unicode": "1f6a1", "html": "🚡", "category": "Travel & Places (transport-air)", "order": "1658"}, + {"emoji": "🕣", "name": "eight-thirty", "shortname": ":clock830:", "unicode": "1f563", "html": "🕣", "category": "Travel & Places (time)", "order": "1704"}, + {"emoji": "🕡", "name": "six-thirty", "shortname": ":clock630:", "unicode": "1f561", "html": "🕡", "category": "Travel & Places (time)", "order": "1700"}, + {"emoji": "🔡", "name": "input latin lowercase", "shortname": ":abcd:", "unicode": "1f521", "html": "🔡", "category": "Symbols (alphanum)", "order": "2121"}, + {"emoji": "🚠", "name": "mountain cableway", "shortname": ":mountain_cableway:", "unicode": "1f6a0", "html": "🚠", "category": "Travel & Places (transport-air)", "order": "1657"}, + {"emoji": "🈁", "name": "Japanese here button", "shortname": ":koko:", "unicode": "1f201", "html": "🈁", "category": "Symbols (alphanum)", "order": "2142"}, + {"emoji": "🛂", "name": "passport control", "shortname": ":passport_control:", "unicode": "1f6c2", "html": "🛂", "category": "Symbols (transport-sign)", "order": "1985"}, + {"emoji": "🚱", "name": "non-potable water", "shortname": ":non-potable_water:", "unicode": "1f6b1", "html": "🚱", "category": "Symbols (warning)", "order": "1996"}, + {"emoji": "🚟", "name": "suspension railway", "shortname": ":suspension_railway:", "unicode": "1f69f", "html": "🚟", "category": "Travel & Places (transport-air)", "order": "1656"}, + {"emoji": "🛄", "name": "baggage claim", "shortname": ":baggage_claim:", "unicode": "1f6c4", "html": "🛄", "category": "Symbols (transport-sign)", "order": "1987"}, + {"emoji": "🚳", "name": "no bicycles", "shortname": ":no_bicycles:", "unicode": "1f6b3", "html": "🚳", "category": "Symbols (warning)", "order": "1993"}, + {"emoji": "🏳🌈", "name": "rainbow flag", "shortname": ":rainbow_flag:", "unicode": "1F3F3 200D 1F308", "html": "🏳‍🌈", "category": "Flags (flag)", "order": ""}, + {"emoji": "🕵🏿♀", "name": "woman detective: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F575 1F3FF 200D 2640", "html": "🕵🏿‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏾♀", "name": "woman detective: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F575 1F3FE 200D 2640", "html": "🕵🏾‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏽♀", "name": "woman detective: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F575 1F3FD 200D 2640", "html": "🕵🏽‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏼♀", "name": "woman detective: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F575 1F3FC 200D 2640", "html": "🕵🏼‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏻♀", "name": "woman detective: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F575 1F3FB 200D 2640", "html": "🕵🏻‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵♀", "name": "woman detective", "shortname": ":woman_detective:", "unicode": "1F575 200D 2640", "html": "🕵‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏿", "name": "detective: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F575 1F3FF", "html": "🕵🏿", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏾", "name": "detective: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F575 1F3FE", "html": "🕵🏾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏽", "name": "detective: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F575 1F3FD", "html": "🕵🏽", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏼", "name": "detective: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F575 1F3FC", "html": "🕵🏼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏻", "name": "detective: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F575 1F3FB", "html": "🕵🏻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵", "name": "detective", "shortname": ":detective:", "unicode": "1F575", "html": "🕵", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "☹", "name": "frowning face", "shortname": ":frowning_face:", "unicode": "2639", "html": "☹", "category": "Smileys & Emotion (face-concerned)", "order": ""}, + {"emoji": "☠", "name": "skull and crossbones", "shortname": ":skull_crossbones:", "unicode": "2620", "html": "☠", "category": "Smileys & Emotion (face-negative)", "order": "81"}, + {"emoji": "🤗", "name": "hugging face", "shortname": ":hugging:", "unicode": "1f917", "html": "🤗", "category": "Smileys & Emotion (face-hand)", "order": "20"}, + {"emoji": "🤖", "name": "robot", "shortname": ":robot:", "unicode": "1F916", "html": "🤖", "category": "Smileys & Emotion (face-costume)", "order": ""}, + {"emoji": "🤕", "name": "face with head-bandage", "shortname": ":face_with_headbandage:", "unicode": "1F915", "html": "🤕", "category": "Smileys & Emotion (face-unwell)", "order": ""}, + {"emoji": "🤔", "name": "thinking face", "shortname": ":thinking:", "unicode": "1f914", "html": "🤔", "category": "Smileys & Emotion (face-hand)", "order": "21"}, + {"emoji": "🤓", "name": "nerd face", "shortname": ":nerd:", "unicode": "1f913", "html": "🤓", "category": "Smileys & Emotion (face-glasses)", "order": "36"}, + {"emoji": "🤒", "name": "face with thermometer", "shortname": ":face_with_thermometer:", "unicode": "1F912", "html": "🤒", "category": "Smileys & Emotion (face-unwell)", "order": ""}, + {"emoji": "🤑", "name": "money-mouth face", "shortname": ":moneymouth_face:", "unicode": "1F911", "html": "🤑", "category": "Smileys & Emotion (face-tongue)", "order": ""}, + {"emoji": "🤐", "name": "zipper-mouth face", "shortname": ":zipper_mouth:", "unicode": "1f910", "html": "🤐", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": "30"}, + {"emoji": "🙄", "name": "face with rolling eyes", "shortname": ":rolling_eyes:", "unicode": "1f644", "html": "🙄", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": "25"}, + {"emoji": "🙃", "name": "upside-down face", "shortname": ":upside_down:", "unicode": "1f643", "html": "🙃", "category": "Smileys & Emotion (face-smiling)", "order": "45"}, + {"emoji": "🙂", "name": "slightly smiling face", "shortname": ":slight_smile:", "unicode": "1f642", "html": "🙂", "category": "Smileys & Emotion (face-smiling)", "order": "19"}, + {"emoji": "🙁", "name": "slightly frowning face", "shortname": ":slightly_frowning_face:", "unicode": "1F641", "html": "🙁", "category": "Smileys & Emotion (face-concerned)", "order": ""}, + {"emoji": "🤘🏿", "name": "sign of the horns: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F918 1F3FF", "html": "🤘🏿", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤘🏾", "name": "sign of the horns: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F918 1F3FE", "html": "🤘🏾", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤘🏽", "name": "sign of the horns: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F918 1F3FD", "html": "🤘🏽", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤘🏼", "name": "sign of the horns: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F918 1F3FC", "html": "🤘🏼", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤘🏻", "name": "sign of the horns: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F918 1F3FB", "html": "🤘🏻", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤘", "name": "sign of the horns", "shortname": ":sign_of_the_horns:", "unicode": "1F918", "html": "🤘", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🖖🏿", "name": "vulcan salute: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F596 1F3FF", "html": "🖖🏿", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "🖖🏾", "name": "vulcan salute: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F596 1F3FE", "html": "🖖🏾", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "🖖🏽", "name": "vulcan salute: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F596 1F3FD", "html": "🖖🏽", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "🖖🏼", "name": "vulcan salute: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F596 1F3FC", "html": "🖖🏼", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "🖖🏻", "name": "vulcan salute: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F596 1F3FB", "html": "🖖🏻", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "🖖", "name": "vulcan salute", "shortname": ":vulcan_salute:", "unicode": "1F596", "html": "🖖", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "🖕🏿", "name": "middle finger: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F595 1F3FF", "html": "🖕🏿", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "🖕🏾", "name": "middle finger: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F595 1F3FE", "html": "🖕🏾", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "🖕🏽", "name": "middle finger: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F595 1F3FD", "html": "🖕🏽", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "🖕🏼", "name": "middle finger: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F595 1F3FC", "html": "🖕🏼", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "🖕🏻", "name": "middle finger: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F595 1F3FB", "html": "🖕🏻", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "🖕", "name": "middle finger", "shortname": ":middle_finger:", "unicode": "1f595", "html": "🖕", "category": "People & Body (hand-single-finger)", "order": "1116"}, + {"emoji": "🖐🏿", "name": "hand with fingers splayed: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F590 1F3FF", "html": "🖐🏿", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "🖐🏾", "name": "hand with fingers splayed: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F590 1F3FE", "html": "🖐🏾", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "🖐🏽", "name": "hand with fingers splayed: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F590 1F3FD", "html": "🖐🏽", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "🖐🏼", "name": "hand with fingers splayed: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F590 1F3FC", "html": "🖐🏼", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "🖐🏻", "name": "hand with fingers splayed: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F590 1F3FB", "html": "🖐🏻", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "🖐", "name": "hand with fingers splayed", "shortname": ":hand_with_fingers_splayed:", "unicode": "1F590", "html": "🖐", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "✍🏿", "name": "writing hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "270D 1F3FF", "html": "✍🏿", "category": "People & Body (hand-prop)", "order": ""}, + {"emoji": "✍🏾", "name": "writing hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "270D 1F3FE", "html": "✍🏾", "category": "People & Body (hand-prop)", "order": ""}, + {"emoji": "✍🏽", "name": "writing hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "270D 1F3FD", "html": "✍🏽", "category": "People & Body (hand-prop)", "order": ""}, + {"emoji": "✍🏼", "name": "writing hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "270D 1F3FC", "html": "✍🏼", "category": "People & Body (hand-prop)", "order": ""}, + {"emoji": "✍🏻", "name": "writing hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "270D 1F3FB", "html": "✍🏻", "category": "People & Body (hand-prop)", "order": ""}, + {"emoji": "✍", "name": "writing hand", "shortname": ":writing_hand:", "unicode": "270d", "html": "✍", "category": "People & Body (hand-prop)", "order": "1230"}, + {"emoji": "🕶", "name": "sunglasses", "shortname": ":dark_sunglasses:", "unicode": "1f576", "html": "🕶", "category": "Objects (clothing)", "order": "1315"}, + {"emoji": "👁🗨", "name": "eye in speech bubble", "shortname": ":eye_speachbubble:", "unicode": "1F441 200D 1F5E8", "html": "👁‍🗨", "category": "Smileys & Emotion (emotion)", "order": ""}, + {"emoji": "👁", "name": "eye", "shortname": ":eye:", "unicode": "1f441", "html": "👁", "category": "People & Body (body-parts)", "order": "1280"}, + {"emoji": "🏋🏿♀", "name": "woman lifting weights: dark skin tone", "shortname": ":weightlifter_woman_dt:", "unicode": "1F3CB 1F3FF 200D 2640", "html": "🏋🏿‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏾♀", "name": "woman lifting weights: medium-dark skin tone", "shortname": ":weightlifter_woman_mdt:", "unicode": "1F3CB 1F3FE 200D 2640", "html": "🏋🏾‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏽♀", "name": "woman lifting weights: medium skin tone", "shortname": ":weightlifter_woman_mt:", "unicode": "1F3CB 1F3FD 200D 2640", "html": "🏋🏽‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏼♀", "name": "woman lifting weights: medium-light skin tone", "shortname": ":weightlifter_woman_mlt:", "unicode": "1F3CB 1F3FC 200D 2640", "html": "🏋🏼‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏻♀", "name": "woman lifting weights: light skin tone", "shortname": ":weightlifter_woman_lt:", "unicode": "1F3CB 1F3FB 200D 2640", "html": "🏋🏻‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋♀", "name": "woman lifting weights", "shortname": ":weightlifter_woman:", "unicode": "1F3CB 200D 2640", "html": "🏋‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏿", "name": "person lifting weights: dark skin tone", "shortname": ":weightlifter_dt:", "unicode": "1F3CB 1F3FF", "html": "🏋🏿", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏾", "name": "person lifting weights: medium-dark skin tone", "shortname": ":weightlifter_mdt:", "unicode": "1F3CB 1F3FE", "html": "🏋🏾", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏽", "name": "person lifting weights: medium skin tone", "shortname": ":weightlifter_mt:", "unicode": "1F3CB 1F3FD", "html": "🏋🏽", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏼", "name": "person lifting weights: medium-light skin tone", "shortname": ":weightlifter_mlt:", "unicode": "1F3CB 1F3FC", "html": "🏋🏼", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏻", "name": "person lifting weights: light skin tone", "shortname": ":weightlifter_lt:", "unicode": "1F3CB 1F3FB", "html": "🏋🏻", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋", "name": "person lifting weights", "shortname": ":weightlifter:", "unicode": "1F3CB", "html": "🏋", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏿♀", "name": "woman bouncing ball: dark skin tone", "shortname": ":basketballer_woman_dt:", "unicode": ":basketballer:", "html": "⛹🏿‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏾♀", "name": "woman bouncing ball: medium-dark skin tone", "shortname": ":basketballer_woman_mdt:", "unicode": ":basketballer:", "html": "⛹🏾‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏽♀", "name": "woman bouncing ball: medium skin tone", "shortname": ":basketballer_woman_mt:", "unicode": ":basketballer:", "html": "⛹🏽‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏼♀", "name": "woman bouncing ball: medium-light skin tone", "shortname": ":basketballer_woman_mlt:", "unicode": ":basketballer:", "html": "⛹🏼‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏻♀", "name": "woman bouncing ball: light skin tone", "shortname": ":basketballer_woman_lt:", "unicode": ":basketballer:", "html": "⛹🏻‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹♀", "name": "woman bouncing ball", "shortname": ":woman_bouncing_ball:", "unicode": ":basketballer_woman:", "html": "⛹‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏿", "name": "person bouncing ball: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": ":basketballer_dt:", "html": "⛹🏿", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏾", "name": "person bouncing ball: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": ":basketballer_mdt:", "html": "⛹🏾", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏽", "name": "person bouncing ball: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": ":basketballer_mt:", "html": "⛹🏽", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏼", "name": "person bouncing ball: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": ":basketballer_mlt:", "html": "⛹🏼", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏻", "name": "person bouncing ball: light skin tone", "shortname": ":basketballer_lt:", "unicode": "26F9 1F3FB", "html": "⛹🏻", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹", "name": "person bouncing ball", "shortname": ":basketballer:", "unicode": "26F9", "html": "⛹", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🕴", "name": "man in suit levitating", "shortname": ":man_in_suit:", "unicode": "1f574", "html": "🕴", "category": "People & Body (person-activity)", "order": "784"}, + {"emoji": "🏌", "name": "person golfing", "shortname": ":golfer:", "unicode": "1f3cc", "html": "🏌", "category": "People & Body (person-sport)", "order": "782"}, + {"emoji": "🏌♀", "name": "woman golfing", "shortname": ":golfer_woman:", "unicode": "1F3CC 200D 2640", "html": "🏌‍♀", "category": "People & Body (person-sport)", "order": "783"}, + {"emoji": "*️⃣", "name": "keycap: #", "shortname": "*", "unicode": "0023 FE0F 20E3", "html": "*", "category": "Symbols (keycap)", "order": "2118"}, + {"emoji": "❣️", "name": "heart exclamation", "shortname": ":heart_exclamation:", "unicode": "2763", "html": "❣", "category": "Smileys & Emotion (emotion)", "order": "1300"}, + {"emoji": "✡️", "name": "star of David", "shortname": ":star_of_david:", "unicode": "2721", "html": "✡", "category": "Symbols (religion)", "order": "2026"}, + {"emoji": "✝️", "name": "latin cross", "shortname": ":cross:", "unicode": "271d", "html": "✝", "category": "Symbols (religion)", "order": "2029"}, + {"emoji": "⚜", "name": "fleur-de-lis", "shortname": ":fleur-de-lis:", "unicode": "269c", "html": "⚜", "category": "Symbols (other-symbol)", "order": "2074"}, + {"emoji": "⚛", "name": "atom symbol", "shortname": ":atom:", "unicode": "269b", "html": "⚛", "category": "Symbols (religion)", "order": "2024"}, + {"emoji": "☸", "name": "wheel of dharma", "shortname": ":wheel_of_dharma:", "unicode": "2638", "html": "☸", "category": "Symbols (religion)", "order": "2027"}, + {"emoji": "☯", "name": "yin yang", "shortname": ":yin_yang:", "unicode": "262f", "html": "☯", "category": "Symbols (religion)", "order": "2028"}, + {"emoji": "☮", "name": "peace symbol", "shortname": ":peace:", "unicode": "262e", "html": "☮", "category": "Symbols (religion)", "order": "2032"}, + {"emoji": "☪", "name": "star and crescent", "shortname": ":star_and_crescent:", "unicode": "262a", "html": "☪", "category": "Symbols (religion)", "order": "2031"}, + {"emoji": "☦", "name": "orthodox cross", "shortname": ":orthodox_cross:", "unicode": "2626", "html": "☦", "category": "Symbols (religion)", "order": "2030"}, + {"emoji": "☣", "name": "biohazard", "shortname": ":biohazard:", "unicode": "2623", "html": "☣", "category": "Symbols (warning)", "order": "2001"}, + {"emoji": "☢", "name": "radioactive", "shortname": ":radioactive:", "unicode": "2622", "html": "☢", "category": "Symbols (warning)", "order": "2000"}, + {"emoji": "🛐", "name": "place of worship", "shortname": ":place_of_worship:", "unicode": "1f6d0", "html": "🛐", "category": "Symbols (religion)", "order": "2023"}, + {"emoji": "🗯", "name": "right anger bubble", "shortname": ":anger_right:", "unicode": "1f5ef", "html": "🗯", "category": "Smileys & Emotion (emotion)", "order": "1311"}, + {"emoji": "🕎", "name": "menorah", "shortname": ":menorah:", "unicode": "1f54e", "html": "🕎", "category": "Symbols (religion)", "order": "2033"}, + {"emoji": "🕉", "name": "om", "shortname": ":om_symbol:", "unicode": "1f549", "html": "🕉", "category": "Symbols (religion)", "order": "2025"}, + {"emoji": "⚱", "name": "funeral urn", "shortname": ":funeral_urn:", "unicode": "26B1", "html": "⚱", "category": "Objects (other-object)", "order": ""}, + {"emoji": "⚰", "name": "coffin", "shortname": ":coffin:", "unicode": "26b0", "html": "⚰", "category": "Objects (other-object)", "order": "1970"}, + {"emoji": "⚙", "name": "gear", "shortname": ":gear:", "unicode": "2699", "html": "⚙", "category": "Objects (tool)", "order": "1961"}, + {"emoji": "⚗", "name": "alembic", "shortname": ":alembic:", "unicode": "2697", "html": "⚗", "category": "Objects (science)", "order": "1963"}, + {"emoji": "⚖", "name": "balance scale", "shortname": ":scales:", "unicode": "2696", "html": "⚖", "category": "Objects (tool)", "order": "1964"}, + {"emoji": "⚔", "name": "crossed swords", "shortname": ":crossed_swords:", "unicode": "2694", "html": "⚔", "category": "Objects (tool)", "order": "1955"}, + {"emoji": "⌨", "name": "keyboard", "shortname": ":keyboard:", "unicode": "2328", "html": "⌨", "category": "Objects (computer)", "order": "1849"}, + {"emoji": "🛢", "name": "oil drum", "shortname": ":oil_drum:", "unicode": "1F6E2", "html": "🛢", "category": "Travel & Places (transport-ground)", "order": ""}, + {"emoji": "🛡", "name": "shield", "shortname": ":shield:", "unicode": "1f6e1", "html": "🛡", "category": "Objects (tool)", "order": "1958"}, + {"emoji": "🛠", "name": "hammer and wrench", "shortname": ":hammer_and_wrench:", "unicode": "1F6E0", "html": "🛠", "category": "Objects (tool)", "order": ""}, + {"emoji": "🛏", "name": "bed", "shortname": ":bed:", "unicode": "1f6cf", "html": "🛏", "category": "Objects (household)", "order": "1669"}, + {"emoji": "🛎", "name": "bellhop bell", "shortname": ":bellhop_bell:", "unicode": "1F6CE", "html": "🛎", "category": "Travel & Places (hotel)", "order": ""}, + {"emoji": "🛍", "name": "shopping bags", "shortname": ":shopping_bags:", "unicode": "1f6cd", "html": "🛍", "category": "Objects (clothing)", "order": "1326"}, + {"emoji": "🛌", "name": "person in bed", "shortname": ":sleeping_accommodation:", "unicode": "1f6cc", "html": "🛌", "category": "People & Body (person-resting)", "order": "1663"}, + {"emoji": "🛋", "name": "couch and lamp", "shortname": ":couch_and_lamp:", "unicode": "1F6CB", "html": "🛋", "category": "Objects (household)", "order": ""}, + {"emoji": "🗳", "name": "ballot box with ballot", "shortname": ":ballot_box:", "unicode": "1f5f3", "html": "🗳", "category": "Objects (mail)", "order": "1913"}, + {"emoji": "🗡", "name": "dagger", "shortname": ":dagger:", "unicode": "1F5E1", "html": "🗡", "category": "Objects (tool)", "order": ""}, + {"emoji": "🗞", "name": "rolled-up newspaper", "shortname": ":rolledup_newspaper:", "unicode": "1F5DE", "html": "🗞", "category": "Objects (book-paper)", "order": ""}, + {"emoji": "🗝", "name": "old key", "shortname": ":old_key:", "unicode": "1F5DD", "html": "🗝", "category": "Objects (lock)", "order": ""}, + {"emoji": "🗜", "name": "clamp", "shortname": ":compression:", "unicode": "1f5dc", "html": "🗜", "category": "Objects (tool)", "order": "1962"}, + {"emoji": "🗓", "name": "spiral calendar", "shortname": ":spiral_calendar:", "unicode": "1F5D3", "html": "🗓", "category": "Objects (office)", "order": ""}, + {"emoji": "🗒", "name": "spiral notepad", "shortname": ":spiral_notepad:", "unicode": "1F5D2", "html": "🗒", "category": "Objects (office)", "order": ""}, + {"emoji": "🗑", "name": "wastebasket", "shortname": ":wastebasket:", "unicode": "1f5d1", "html": "🗑", "category": "Objects (office)", "order": "1943"}, + {"emoji": "🗄", "name": "file cabinet", "shortname": ":file_cabinet:", "unicode": "1f5c4", "html": "🗄", "category": "Objects (office)", "order": "1942"}, + {"emoji": "🗃", "name": "card file box", "shortname": ":card_file_box:", "unicode": "1F5C3", "html": "🗃", "category": "Objects (office)", "order": ""}, + {"emoji": "🗂", "name": "card index dividers", "shortname": ":card_index_dividers:", "unicode": "1F5C2", "html": "🗂", "category": "Objects (office)", "order": ""}, + {"emoji": "🖼", "name": "framed picture", "shortname": ":framed_picture:", "unicode": "1F5BC", "html": "🖼", "category": "Activities (arts & crafts)", "order": ""}, + {"emoji": "🖲", "name": "trackball", "shortname": ":trackball:", "unicode": "1f5b2", "html": "🖲", "category": "Objects (computer)", "order": "1851"}, + {"emoji": "🖱", "name": "computer mouse", "shortname": ":computer_mouse:", "unicode": "1F5B1", "html": "🖱", "category": "Objects (computer)", "order": ""}, + {"emoji": "🖨", "name": "printer", "shortname": ":printer:", "unicode": "1f5a8", "html": "🖨", "category": "Objects (computer)", "order": "1848"}, + {"emoji": "🖥", "name": "desktop computer", "shortname": ":desktop_computer:", "unicode": "1F5A5", "html": "🖥", "category": "Objects (computer)", "order": ""}, + {"emoji": "🖍", "name": "crayon", "shortname": ":crayon:", "unicode": "1F58D", "html": "🖍", "category": "Objects (writing)", "order": ""}, + {"emoji": "🖌", "name": "paintbrush", "shortname": ":paintbrush:", "unicode": "1F58C", "html": "🖌", "category": "Objects (writing)", "order": ""}, + {"emoji": "🖋", "name": "fountain pen", "shortname": ":fountain_pen:", "unicode": "1F58B", "html": "🖋", "category": "Objects (writing)", "order": ""}, + {"emoji": "🖊", "name": "pen", "shortname": ":pen:", "unicode": "1F58A", "html": "🖊", "category": "Objects (writing)", "order": ""}, + {"emoji": "🖇", "name": "linked paperclips", "shortname": ":linked_paperclips:", "unicode": "1F587", "html": "🖇", "category": "Objects (office)", "order": ""}, + {"emoji": "🕹", "name": "joystick", "shortname": ":joystick:", "unicode": "1f579", "html": "🕹", "category": "Activities (game)", "order": "1805"}, + {"emoji": "🕳", "name": "hole", "shortname": ":hole:", "unicode": "1f573", "html": "🕳", "category": "Smileys & Emotion (emotion)", "order": "1313"}, + {"emoji": "🕰", "name": "mantelpiece clock", "shortname": ":mantelpiece_clock:", "unicode": "1F570", "html": "🕰", "category": "Travel & Places (time)", "order": ""}, + {"emoji": "🕯", "name": "candle", "shortname": ":candle:", "unicode": "1f56f", "html": "🕯", "category": "Objects (light & video)", "order": "1870"}, + {"emoji": "📿", "name": "prayer beads", "shortname": ":prayer_beads:", "unicode": "1f4ff", "html": "📿", "category": "Objects (clothing)", "order": "1338"}, + {"emoji": "📽", "name": "film projector", "shortname": ":film_projector:", "unicode": "1F4FD", "html": "📽", "category": "Objects (light & video)", "order": ""}, + {"emoji": "📸", "name": "camera with flash", "shortname": ":camera_with_flash:", "unicode": "1f4f8", "html": "📸", "category": "Objects (light & video)", "order": "1862"}, + {"emoji": "🏺", "name": "amphora", "shortname": ":amphora:", "unicode": "1f3fa", "html": "🏺", "category": "Food & Drink (dishware)", "order": "1537"}, + {"emoji": "🏷", "name": "label", "shortname": ":label:", "unicode": "1f3f7", "html": "🏷", "category": "Objects (book-paper)", "order": "1890"}, + {"emoji": "🏴", "name": "black flag", "shortname": ":flag_black:", "unicode": "1f3f4", "html": "🏴", "category": "Flags (flag)", "order": "2184"}, + {"emoji": "🏳", "name": "white flag", "shortname": ":flag_white:", "unicode": "1f3f3", "html": "🏳", "category": "Flags (flag)", "order": "2185"}, + {"emoji": "🎞", "name": "film frames", "shortname": ":film_frames:", "unicode": "1f39e", "html": "🎞", "category": "Objects (light & video)", "order": "1857"}, + {"emoji": "🎛", "name": "control knobs", "shortname": ":control_knobs:", "unicode": "1f39b", "html": "🎛", "category": "Objects (music)", "order": "1828"}, + {"emoji": "🎚", "name": "level slider", "shortname": ":level_slider:", "unicode": "1f39a", "html": "🎚", "category": "Objects (music)", "order": "1827"}, + {"emoji": "🎙", "name": "studio microphone", "shortname": ":studio_microphone:", "unicode": "1F399", "html": "🎙", "category": "Objects (music)", "order": ""}, + {"emoji": "🌡", "name": "thermometer", "shortname": ":thermometer:", "unicode": "1f321", "html": "🌡", "category": "Travel & Places (sky & weather)", "order": "1723"}, + {"emoji": "🛳", "name": "passenger ship", "shortname": ":passenger_ship:", "unicode": "1F6F3", "html": "🛳", "category": "Travel & Places (transport-water)", "order": ""}, + {"emoji": "🛰", "name": "satellite", "shortname": ":satellite:", "unicode": "1F6F0", "html": "🛰", "category": "Travel & Places (transport-air)", "order": ""}, + {"emoji": "🛬", "name": "airplane arrival", "shortname": ":airplane_arriving:", "unicode": "1f6ec", "html": "🛬", "category": "Travel & Places (transport-air)", "order": "1653"}, + {"emoji": "🛫", "name": "airplane departure", "shortname": ":airplane_departure:", "unicode": "1f6eb", "html": "🛫", "category": "Travel & Places (transport-air)", "order": "1652"}, + {"emoji": "🛩", "name": "small airplane", "shortname": ":small_airplane:", "unicode": "1F6E9", "html": "🛩", "category": "Travel & Places (transport-air)", "order": ""}, + {"emoji": "🛥", "name": "motor boat", "shortname": ":motor_boat:", "unicode": "1F6E5", "html": "🛥", "category": "Travel & Places (transport-water)", "order": ""}, + {"emoji": "🛤", "name": "railway track", "shortname": ":railway_track:", "unicode": "1f6e4", "html": "🛤", "category": "Travel & Places (transport-ground)", "order": "1635"}, + {"emoji": "🛣", "name": "motorway", "shortname": ":motorway:", "unicode": "1f6e3", "html": "🛣", "category": "Travel & Places (transport-ground)", "order": "1634"}, + {"emoji": "🗺", "name": "world map", "shortname": ":world_map:", "unicode": "1F5FA", "html": "🗺", "category": "Travel & Places (place-map)", "order": ""}, + {"emoji": "🕍", "name": "synagogue", "shortname": ":synagogue:", "unicode": "1f54d", "html": "🕍", "category": "Travel & Places (place-religious)", "order": "1579"}, + {"emoji": "🕌", "name": "mosque", "shortname": ":mosque:", "unicode": "1f54c", "html": "🕌", "category": "Travel & Places (place-religious)", "order": "1578"}, + {"emoji": "🕋", "name": "kaaba", "shortname": ":kaaba:", "unicode": "1f54b", "html": "🕋", "category": "Travel & Places (place-religious)", "order": "1581"}, + {"emoji": "🏟", "name": "stadium", "shortname": ":stadium:", "unicode": "1f3df", "html": "🏟", "category": "Travel & Places (place-building)", "order": "1553"}, + {"emoji": "🏞", "name": "national park", "shortname": ":national_park:", "unicode": "1F3DE", "html": "🏞", "category": "Travel & Places (place-geographic)", "order": ""}, + {"emoji": "🏝", "name": "desert island", "shortname": ":desert_island:", "unicode": "1F3DD", "html": "🏝", "category": "Travel & Places (place-geographic)", "order": ""}, + {"emoji": "🏜", "name": "desert", "shortname": ":desert:", "unicode": "1f3dc", "html": "🏜", "category": "Travel & Places (place-geographic)", "order": "1550"}, + {"emoji": "🏛", "name": "classical building", "shortname": ":classical_building:", "unicode": "1f3db", "html": "🏛", "category": "Travel & Places (place-building)", "order": "1554"}, + {"emoji": "🏚", "name": "derelict house", "shortname": ":derelict_house:", "unicode": "1F3DA", "html": "🏚", "category": "Travel & Places (place-building)", "order": ""}, + {"emoji": "🏙", "name": "cityscape", "shortname": ":cityscape:", "unicode": "1f3d9", "html": "🏙", "category": "Travel & Places (place-other)", "order": "1557"}, + {"emoji": "🏘", "name": "houses", "shortname": ":houses:", "unicode": "1F3D8", "html": "🏘", "category": "Travel & Places (place-building)", "order": ""}, + {"emoji": "🏗", "name": "building construction", "shortname": ":building_construction:", "unicode": "1F3D7", "html": "🏗", "category": "Travel & Places (place-building)", "order": ""}, + {"emoji": "🏖", "name": "beach with umbrella", "shortname": ":beach_with_umbrella:", "unicode": "1F3D6", "html": "🏖", "category": "Travel & Places (place-geographic)", "order": ""}, + {"emoji": "🏕", "name": "camping", "shortname": ":camping:", "unicode": "1f3d5", "html": "🏕", "category": "Travel & Places (place-geographic)", "order": "1548"}, + {"emoji": "🏔", "name": "snow-capped mountain", "shortname": ":snowcapped_mountain:", "unicode": "1F3D4", "html": "🏔", "category": "Travel & Places (place-geographic)", "order": ""}, + {"emoji": "🏎", "name": "racing car", "shortname": ":racing_car:", "unicode": "1F3CE", "html": "🏎", "category": "Travel & Places (transport-ground)", "order": ""}, + {"emoji": "🏍", "name": "motorcycle", "shortname": ":motorcycle:", "unicode": "1F3CD", "html": "🏍", "category": "Travel & Places (transport-ground)", "order": ""}, + {"emoji": "🏹", "name": "bow and arrow", "shortname": ":bow_and_arrow:", "unicode": "1f3f9", "html": "🏹", "category": "Objects (tool)", "order": "1957"}, + {"emoji": "🏸", "name": "badminton", "shortname": ":badminton:", "unicode": "1F3F8", "html": "🏸", "category": "Activities (sport)", "order": ""}, + {"emoji": "🏵", "name": "rosette", "shortname": ":rosette:", "unicode": "1f3f5", "html": "🏵", "category": "Animals & Nature (plant-flower)", "order": "1430"}, + {"emoji": "🏓", "name": "ping pong", "shortname": ":ping_pong:", "unicode": "1F3D3", "html": "🏓", "category": "Activities (sport)", "order": ""}, + {"emoji": "🏒", "name": "ice hockey", "shortname": ":ice_hockey:", "unicode": "1F3D2", "html": "🏒", "category": "Activities (sport)", "order": ""}, + {"emoji": "🏑", "name": "field hockey", "shortname": ":field_hockey:", "unicode": "1F3D1", "html": "🏑", "category": "Activities (sport)", "order": ""}, + {"emoji": "🏐", "name": "volleyball", "shortname": ":volleyball:", "unicode": "1f3d0", "html": "🏐", "category": "Activities (sport)", "order": "1784"}, + {"emoji": "🏏", "name": "cricket game", "shortname": ":cricket_game:", "unicode": "1F3CF", "html": "🏏", "category": "Activities (sport)", "order": ""}, + {"emoji": "🏅", "name": "sports medal", "shortname": ":medal:", "unicode": "1f3c5", "html": "🏅", "category": "Activities (award-medal)", "order": "1777"}, + {"emoji": "🎟", "name": "admission tickets", "shortname": ":admission_tickets:", "unicode": "1F39F", "html": "🎟", "category": "Activities (event)", "order": ""}, + {"emoji": "🎗", "name": "reminder ribbon", "shortname": ":reminder_ribbon:", "unicode": "1f397", "html": "🎗", "category": "Activities (event)", "order": "1772"}, + {"emoji": "🎖", "name": "military medal", "shortname": ":military_medal:", "unicode": "1F396", "html": "🎖", "category": "Activities (award-medal)", "order": ""}, + {"emoji": "🧀", "name": "cheese wedge", "shortname": ":cheese_wedge:", "unicode": "1F9C0", "html": "🧀", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🍿", "name": "popcorn", "shortname": ":popcorn:", "unicode": "1f37f", "html": "🍿", "category": "Food & Drink (food-prepared)", "order": "1494"}, + {"emoji": "🍾", "name": "bottle with popping cork", "shortname": ":champagne:", "unicode": "1f37e", "html": "🍾", "category": "Food & Drink (drink)", "order": "1525"}, + {"emoji": "🍽", "name": "fork and knife with plate", "shortname": ":fork_and_knife_with_plate:", "unicode": "1F37D", "html": "🍽", "category": "Food & Drink (dishware)", "order": ""}, + {"emoji": "🌶", "name": "hot pepper", "shortname": ":hot_pepper:", "unicode": "1f336", "html": "🌶", "category": "Food & Drink (food-vegetable)", "order": "1469"}, + {"emoji": "🌯", "name": "burrito", "shortname": ":burrito:", "unicode": "1f32f", "html": "🌯", "category": "Food & Drink (food-prepared)", "order": "1487"}, + {"emoji": "🌮", "name": "taco", "shortname": ":taco:", "unicode": "1f32e", "html": "🌮", "category": "Food & Drink (food-prepared)", "order": "1486"}, + {"emoji": "🌭", "name": "hot dog", "shortname": ":hotdog:", "unicode": "1f32d", "html": "🌭", "category": "Food & Drink (food-prepared)", "order": "1485"}, + {"emoji": "☘", "name": "shamrock", "shortname": ":shamrock:", "unicode": "2618", "html": "☘", "category": "Animals & Nature (plant-other)", "order": "1444"}, + {"emoji": "☄", "name": "comet", "shortname": ":comet:", "unicode": "2604", "html": "☄", "category": "Travel & Places (sky & weather)", "order": "1752"}, + {"emoji": "☃️", "name": "snowman", "shortname": ":snowman:", "unicode": "2603 FE0F", "html": "☃", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "☂️", "name": "umbrella", "shortname": ":umbrella:", "unicode": "2602 FE0F", "html": "☂", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🦄", "name": "unicorn", "shortname": ":unicorn:", "unicode": "1F984", "html": "🦄", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🦃", "name": "turkey", "shortname": ":turkey:", "unicode": "1f983", "html": "🦃", "category": "Animals & Nature (animal-bird)", "order": "1387"}, + {"emoji": "🦂", "name": "scorpion", "shortname": ":scorpion:", "unicode": "1f982", "html": "🦂", "category": "Animals & Nature (animal-bug)", "order": "1426"}, + {"emoji": "🦁", "name": "lion", "shortname": ":lion_face:", "unicode": "1f981", "html": "🦁", "category": "Animals & Nature (animal-mammal)", "order": "1352"}, + {"emoji": "🦀", "name": "crab", "shortname": ":crab:", "unicode": "1f980", "html": "🦀", "category": "Food & Drink (food-marine)", "order": "1415"}, + {"emoji": "🕸", "name": "spider web", "shortname": ":spider_web:", "unicode": "1f578", "html": "🕸", "category": "Animals & Nature (animal-bug)", "order": "1425"}, + {"emoji": "🕷", "name": "spider", "shortname": ":spider:", "unicode": "1f577", "html": "🕷", "category": "Animals & Nature (animal-bug)", "order": "1424"}, + {"emoji": "🕊", "name": "dove", "shortname": ":dove:", "unicode": "1F54A", "html": "🕊", "category": "Animals & Nature (animal-bird)", "order": ""}, + {"emoji": "🐿", "name": "chipmunk", "shortname": ":chipmunk:", "unicode": "1f43f", "html": "🐿", "category": "Animals & Nature (animal-mammal)", "order": "1381"}, + {"emoji": "🌬", "name": "wind face", "shortname": ":wind_blowing_face:", "unicode": "1f32c", "html": "🌬", "category": "Travel & Places (sky & weather)", "order": "1741"}, + {"emoji": "🌫", "name": "fog", "shortname": ":fog:", "unicode": "1f32b", "html": "🌫", "category": "Travel & Places (sky & weather)", "order": "1740"}, + {"emoji": "🌪", "name": "tornado", "shortname": ":tornado:", "unicode": "1F32A", "html": "🌪", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🌩", "name": "cloud with lightning", "shortname": ":cloud_with_lightning:", "unicode": "1F329", "html": "🌩", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🌨", "name": "cloud with snow", "shortname": ":cloud_with_snow:", "unicode": "1F328", "html": "🌨", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🌧", "name": "cloud with rain", "shortname": ":cloud_with_rain:", "unicode": "1F327", "html": "🌧", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🌦", "name": "sun behind rain cloud", "shortname": ":sun_behind_rain_cloud:", "unicode": "1F326", "html": "🌦", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🌥", "name": "sun behind large cloud", "shortname": ":sun_behind_large_cloud:", "unicode": "1F325", "html": "🌥", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🌤", "name": "sun behind small cloud", "shortname": ":sun_behind_small_cloud:", "unicode": "1F324", "html": "🌤", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🗣", "name": "speaking head", "shortname": ":speaking_head:", "unicode": "1F5E3", "html": "🗣", "category": "People & Body (person-symbol)", "order": ""}, + {"emoji": "⏺", "name": "record button", "shortname": ":record_button:", "unicode": "23FA", "html": "⏺", "category": "Symbols (av-symbol)", "order": ""}, + {"emoji": "⏹", "name": "stop button", "shortname": ":stop_button:", "unicode": "23F9", "html": "⏹", "category": "Symbols (av-symbol)", "order": ""}, + {"emoji": "⏸", "name": "pause button", "shortname": ":pause_button:", "unicode": "23F8", "html": "⏸", "category": "Symbols (av-symbol)", "order": ""}, + {"emoji": "⏯", "name": "play or pause button", "shortname": ":play_pause:", "unicode": "23ef", "html": "⏯", "category": "Symbols (av-symbol)", "order": "2054"}, + {"emoji": "⏮", "name": "last track button", "shortname": ":track_previous:", "unicode": "23ee", "html": "⏮", "category": "Symbols (av-symbol)", "order": "2057"}, + {"emoji": "⏭", "name": "next track button", "shortname": ":track_next:", "unicode": "23ed", "html": "⏭", "category": "Symbols (av-symbol)", "order": "2053"}, + {"emoji": "⛱", "name": "umbrella on ground", "shortname": ":beach_umbrella:", "unicode": "26f1", "html": "⛱", "category": "Travel & Places (sky & weather)", "order": "1747"}, + {"emoji": "⛓", "name": "chains", "shortname": ":chains:", "unicode": "26d3", "html": "⛓", "category": "Objects (tool)", "order": "1966"}, + {"emoji": "⛏", "name": "pick", "shortname": ":pick:", "unicode": "26cf", "html": "⛏", "category": "Objects (tool)", "order": "1951"}, + {"emoji": "⚒", "name": "hammer and pick", "shortname": ":hammer_and_pick:", "unicode": "2692", "html": "⚒", "category": "Objects (tool)", "order": ""}, + {"emoji": "⏲", "name": "timer clock", "shortname": ":timer_clock:", "unicode": "23F2", "html": "⏲", "category": "Travel & Places (time)", "order": ""}, + {"emoji": "⏱", "name": "stopwatch", "shortname": ":stopwatch:", "unicode": "23f1", "html": "⏱", "category": "Travel & Places (time)", "order": "1684"}, + {"emoji": "⛴", "name": "ferry", "shortname": ":ferry:", "unicode": "26f4", "html": "⛴", "category": "Travel & Places (transport-water)", "order": "1647"}, + {"emoji": "⛰", "name": "mountain", "shortname": ":mountain:", "unicode": "26f0", "html": "⛰", "category": "Travel & Places (place-geographic)", "order": "1545"}, + {"emoji": "⛩", "name": "shinto shrine", "shortname": ":shinto_shrine:", "unicode": "2.6E+10", "html": "⛩", "category": "Travel & Places (place-religious)", "order": "1580"}, + {"emoji": "⛸", "name": "ice skate", "shortname": ":ice_skate:", "unicode": "26f8", "html": "⛸", "category": "Activities (sport)", "order": "1800"}, + {"emoji": "⛷", "name": "skier", "shortname": ":skier:", "unicode": "26f7", "html": "⛷", "category": "People & Body (person-sport)", "order": "775"}, + {"emoji": "⛈", "name": "cloud with lightning and rain", "shortname": ":cloud_with_lightning_and_rain:", "unicode": "26C8", "html": "⛈", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "⛑", "name": "rescue worker’s helmet", "shortname": ":rescue_worker’s_helmet:", "unicode": "26D1", "html": "⛑", "category": "Objects (clothing)", "order": ""}, + {"emoji": "🇦🇨", "name": "flag: Ascension Island", "shortname": ":flag_ac:", "unicode": "1f1e6-1f1e8", "html": "🇦🇨", "category": "Flags (country-flag)", "order": "2187"}, + {"emoji": "🇦🇩", "name": "flag: Andorra", "shortname": ":flag_ad:", "unicode": "1f1e6-1f1e9", "html": "🇦🇩", "category": "Flags (country-flag)", "order": "2188"}, + {"emoji": "🇦🇪", "name": "flag: United Arab Emirates", "shortname": ":flag_ae:", "unicode": "1f1e6-1f1ea", "html": "🇦🇪", "category": "Flags (country-flag)", "order": "2189"}, + {"emoji": "🇦🇫", "name": "flag: Afghanistan", "shortname": ":flag_af:", "unicode": "1f1e6-1f1eb", "html": "🇦🇫", "category": "Flags (country-flag)", "order": "2190"}, + {"emoji": "🇦🇬", "name": "flag: Antigua & Barbuda", "shortname": ":flag_ag:", "unicode": "1f1e6-1f1ec", "html": "🇦🇬", "category": "Flags (country-flag)", "order": "2191"}, + {"emoji": "🇦🇮", "name": "flag: Anguilla", "shortname": ":flag_ai:", "unicode": "1f1e6-1f1ee", "html": "🇦🇮", "category": "Flags (country-flag)", "order": "2192"}, + {"emoji": "🇦🇱", "name": "flag: Albania", "shortname": ":flag_al:", "unicode": "1f1e6-1f1f1", "html": "🇦🇱", "category": "Flags (country-flag)", "order": "2193"}, + {"emoji": "🇦🇲", "name": "flag: Armenia", "shortname": ":flag_am:", "unicode": "1f1e6-1f1f2", "html": "🇦🇲", "category": "Flags (country-flag)", "order": "2194"}, + {"emoji": "🇦🇴", "name": "flag: Angola", "shortname": ":flag-ao:", "unicode": "1f1e6-1f1f4", "html": "🇦🇴", "category": "Flags (country-flag)", "order": "2195"}, + {"emoji": "🇦🇶", "name": "flag: Antarctica", "shortname": ":flag-aq:", "unicode": "1f1e6-1f1f6", "html": "🇦🇶", "category": "Flags (country-flag)", "order": "2196"}, + {"emoji": "🇦🇷", "name": "flag: Argentina", "shortname": ":flag-ar:", "unicode": "1f1e6-1f1f7", "html": "🇦🇷", "category": "Flags (country-flag)", "order": "2197"}, + {"emoji": "🇦🇸", "name": "flag: American Samoa", "shortname": ":flag-as:", "unicode": "1f1e6-1f1f8", "html": "🇦🇸", "category": "Flags (country-flag)", "order": "2198"}, + {"emoji": "🇦🇹", "name": "flag: Austria", "shortname": ":flag-at:", "unicode": "1f1e6-1f1f9", "html": "🇦🇹", "category": "Flags (country-flag)", "order": "2199"}, + {"emoji": "🇦🇺", "name": "flag: Australia", "shortname": ":flag-au:", "unicode": "1f1e6-1f1fa", "html": "🇦🇺", "category": "Flags (country-flag)", "order": "2200"}, + {"emoji": "🇦🇼", "name": "flag: Aruba", "shortname": ":flag-aw:", "unicode": "1f1e6-1f1fc", "html": "🇦🇼", "category": "Flags (country-flag)", "order": "2201"}, + {"emoji": "🇦🇽", "name": "flag: Åland Islands", "shortname": ":flag-ax:", "unicode": "1f1e6-1f1fd", "html": "🇦🇽", "category": "Flags (country-flag)", "order": "2202"}, + {"emoji": "🇦🇿", "name": "flag: Azerbaijan", "shortname": ":flag-az:", "unicode": "1f1e6-1f1ff", "html": "🇦🇿", "category": "Flags (country-flag)", "order": "2203"}, + {"emoji": "🇧🇦", "name": "flag: Bosnia & Herzegovina", "shortname": ":flag-ba:", "unicode": "1f1e7-1f1e6", "html": "🇧🇦", "category": "Flags (country-flag)", "order": "2204"}, + {"emoji": "🇧🇧", "name": "flag: Barbados", "shortname": ":flag-bb:", "unicode": "1f1e7-1f1e7", "html": "🇧🇧", "category": "Flags (country-flag)", "order": "2205"}, + {"emoji": "🇧🇩", "name": "flag: Bangladesh", "shortname": ":flag-bd:", "unicode": "1f1e7-1f1e9", "html": "🇧🇩", "category": "Flags (country-flag)", "order": "2206"}, + {"emoji": "🇧🇪", "name": "flag: Belgium", "shortname": ":flag-be:", "unicode": "1f1e7-1f1ea", "html": "🇧🇪", "category": "Flags (country-flag)", "order": "2207"}, + {"emoji": "🇧🇫", "name": "flag: Burkina Faso", "shortname": ":flag-bf:", "unicode": "1f1e7-1f1eb", "html": "🇧🇫", "category": "Flags (country-flag)", "order": "2208"}, + {"emoji": "🇧🇬", "name": "flag: Bulgaria", "shortname": ":flag-bg:", "unicode": "1f1e7-1f1ec", "html": "🇧🇬", "category": "Flags (country-flag)", "order": "2209"}, + {"emoji": "🇧🇭", "name": "flag: Bahrain", "shortname": ":flag-bh:", "unicode": "1f1e7-1f1ed", "html": "🇧🇭", "category": "Flags (country-flag)", "order": "2210"}, + {"emoji": "🇧🇮", "name": "flag: Burundi", "shortname": ":flag-bi:", "unicode": "1f1e7-1f1ee", "html": "🇧🇮", "category": "Flags (country-flag)", "order": "2211"}, + {"emoji": "🇧🇯", "name": "flag: Benin", "shortname": ":flag-bj:", "unicode": "1f1e7-1f1ef", "html": "🇧🇯", "category": "Flags (country-flag)", "order": "2212"}, + {"emoji": "🇧🇱", "name": "flag: St. Barthélemy", "shortname": ":flag-bl:", "unicode": "1f1e7-1f1f1", "html": "🇧🇱", "category": "Flags (country-flag)", "order": "2213"}, + {"emoji": "🇧🇲", "name": "flag: Bermuda", "shortname": ":flag-bm:", "unicode": "1f1e7-1f1f2", "html": "🇧🇲", "category": "Flags (country-flag)", "order": "2214"}, + {"emoji": "🇧🇳", "name": "flag: Brunei", "shortname": ":flag-bn:", "unicode": "1f1e7-1f1f3", "html": "🇧🇳", "category": "Flags (country-flag)", "order": "2215"}, + {"emoji": "🇧🇴", "name": "flag: Bolivia", "shortname": ":flag-bo:", "unicode": "1f1e7-1f1f4", "html": "🇧🇴", "category": "Flags (country-flag)", "order": "2216"}, + {"emoji": "🇧🇶", "name": "flag: Caribbean Netherlands", "shortname": ":flag-bq:", "unicode": "1f1e7-1f1f6", "html": "🇧🇶", "category": "Flags (country-flag)", "order": "2217"}, + {"emoji": "🇧🇷", "name": "flag: Brazil", "shortname": ":flag-br:", "unicode": "1f1e7-1f1f7", "html": "🇧🇷", "category": "Flags (country-flag)", "order": "2218"}, + {"emoji": "🇧🇸", "name": "flag: Bahamas", "shortname": ":flag-bs:", "unicode": "1f1e7-1f1f8", "html": "🇧🇸", "category": "Flags (country-flag)", "order": "2219"}, + {"emoji": "🇧🇹", "name": "flag: Bhutan", "shortname": ":flag-bt:", "unicode": "1f1e7-1f1f9", "html": "🇧🇹", "category": "Flags (country-flag)", "order": "2220"}, + {"emoji": "🇧🇻", "name": "flag: Bouvet Island", "shortname": ":flag-bv:", "unicode": "1f1e7-1f1fb", "html": "🇧🇻", "category": "Flags (country-flag)", "order": "2221"}, + {"emoji": "🇧🇼", "name": "flag: Botswana", "shortname": ":flag-bw:", "unicode": "1f1e7-1f1fc", "html": "🇧🇼", "category": "Flags (country-flag)", "order": "2222"}, + {"emoji": "🇧🇾", "name": "flag: Belarus", "shortname": ":flag-by:", "unicode": "1f1e7-1f1fe", "html": "🇧🇾", "category": "Flags (country-flag)", "order": "2223"}, + {"emoji": "🇧🇿", "name": "flag: Belize", "shortname": ":flag-bz:", "unicode": "1f1e7-1f1ff", "html": "🇧🇿", "category": "Flags (country-flag)", "order": "2224"}, + {"emoji": "🇨🇦", "name": "flag: Canada", "shortname": ":flag-ca:", "unicode": "1f1e8-1f1e6", "html": "🇨🇦", "category": "Flags (country-flag)", "order": "2225"}, + {"emoji": "🇨🇨", "name": "flag: Cocos (Keeling) Islands", "shortname": ":flag-cc:", "unicode": "1f1e8-1f1e8", "html": "🇨🇨", "category": "Flags (country-flag)", "order": "2226"}, + {"emoji": "🇨🇩", "name": "flag: Congo - Kinshasa", "shortname": ":flag-cd:", "unicode": "1f1e8-1f1e9", "html": "🇨🇩", "category": "Flags (country-flag)", "order": "2227"}, + {"emoji": "🇨🇫", "name": "flag: Central African Republic", "shortname": ":flag-cf:", "unicode": "1f1e8-1f1eb", "html": "🇨🇫", "category": "Flags (country-flag)", "order": "2228"}, + {"emoji": "🇨🇬", "name": "flag: Congo - Brazzaville", "shortname": ":flag-cg:", "unicode": "1f1e8-1f1ec", "html": "🇨🇬", "category": "Flags (country-flag)", "order": "2229"}, + {"emoji": "🇨🇭", "name": "flag: Switzerland", "shortname": ":flag-ch:", "unicode": "1f1e8-1f1ed", "html": "🇨🇭", "category": "Flags (country-flag)", "order": "2230"}, + {"emoji": "🇨🇮", "name": "flag: Côte d’Ivoire", "shortname": ":flag-ci:", "unicode": "1f1e8-1f1ee", "html": "🇨🇮", "category": "Flags (country-flag)", "order": "2231"}, + {"emoji": "🇨🇰", "name": "flag: Cook Islands", "shortname": ":flag-ck:", "unicode": "1f1e8-1f1f0", "html": "🇨🇰", "category": "Flags (country-flag)", "order": "2232"}, + {"emoji": "🇨🇱", "name": "flag: Chile", "shortname": ":flag-cl:", "unicode": "1f1e8-1f1f1", "html": "🇨🇱", "category": "Flags (country-flag)", "order": "2233"}, + {"emoji": "🇨🇲", "name": "flag: Cameroon", "shortname": ":flag-cm:", "unicode": "1f1e8-1f1f2", "html": "🇨🇲", "category": "Flags (country-flag)", "order": "2234"}, + {"emoji": "🇨🇳", "name": "flag: China", "shortname": ":flag-cn:", "unicode": "1f1e8-1f1f3", "html": "🇨🇳", "category": "Flags (country-flag)", "order": "2235"}, + {"emoji": "🇨🇴", "name": "flag: Colombia", "shortname": ":flag-co:", "unicode": "1f1e8-1f1f4", "html": "🇨🇴", "category": "Flags (country-flag)", "order": "2236"}, + {"emoji": "🇨🇵", "name": "flag: Clipperton Island", "shortname": ":flag-cp:", "unicode": "1f1e8-1f1f5", "html": "🇨🇵", "category": "Flags (country-flag)", "order": "2237"}, + {"emoji": "🇨🇷", "name": "flag: Costa Rica", "shortname": ":flag-cr:", "unicode": "1f1e8-1f1f7", "html": "🇨🇷", "category": "Flags (country-flag)", "order": "2238"}, + {"emoji": "🇨🇺", "name": "flag: Cuba", "shortname": ":flag-cu:", "unicode": "1f1e8-1f1fa", "html": "🇨🇺", "category": "Flags (country-flag)", "order": "2239"}, + {"emoji": "🇨🇻", "name": "flag: Cape Verde", "shortname": ":flag-cv:", "unicode": "1f1e8-1f1fb", "html": "🇨🇻", "category": "Flags (country-flag)", "order": "2240"}, + {"emoji": "🇨🇼", "name": "flag: Curaçao", "shortname": ":flag-cw:", "unicode": "1f1e8-1f1fc", "html": "🇨🇼", "category": "Flags (country-flag)", "order": "2241"}, + {"emoji": "🇨🇽", "name": "flag: Christmas Island", "shortname": ":flag-cx:", "unicode": "1f1e8-1f1fd", "html": "🇨🇽", "category": "Flags (country-flag)", "order": "2242"}, + {"emoji": "🇨🇾", "name": "flag: Cyprus", "shortname": ":flag-cy:", "unicode": "1f1e8-1f1fe", "html": "🇨🇾", "category": "Flags (country-flag)", "order": "2243"}, + {"emoji": "🇨🇿", "name": "flag: Czechia", "shortname": ":flag-cz:", "unicode": "1f1e8-1f1ff", "html": "🇨🇿", "category": "Flags (country-flag)", "order": "2244"}, + {"emoji": "🇩🇪", "name": "flag: Germany", "shortname": ":flag-de:", "unicode": "1f1e9-1f1ea", "html": "🇩🇪", "category": "Flags (country-flag)", "order": "2245"}, + {"emoji": "🇩🇬", "name": "flag: Diego Garcia", "shortname": ":flag-dg:", "unicode": "1f1e9-1f1ec", "html": "🇩🇬", "category": "Flags (country-flag)", "order": "2246"}, + {"emoji": "🇩🇯", "name": "flag: Djibouti", "shortname": ":flag-dj:", "unicode": "1f1e9-1f1ef", "html": "🇩🇯", "category": "Flags (country-flag)", "order": "2247"}, + {"emoji": "🇩🇰", "name": "flag: Denmark", "shortname": ":flag-dk:", "unicode": "1f1e9-1f1f0", "html": "🇩🇰", "category": "Flags (country-flag)", "order": "2248"}, + {"emoji": "🇩🇲", "name": "flag: Dominica", "shortname": ":flag-dm:", "unicode": "1f1e9-1f1f2", "html": "🇩🇲", "category": "Flags (country-flag)", "order": "2249"}, + {"emoji": "🇩🇴", "name": "flag: Dominican Republic", "shortname": ":flag-do:", "unicode": "1f1e9-1f1f4", "html": "🇩🇴", "category": "Flags (country-flag)", "order": "2250"}, + {"emoji": "🇩🇿", "name": "flag: Algeria", "shortname": ":flag-dz:", "unicode": "1f1e9-1f1ff", "html": "🇩🇿", "category": "Flags (country-flag)", "order": "2251"}, + {"emoji": "🇪🇦", "name": "flag: Ceuta & Melilla", "shortname": ":flag-ea:", "unicode": "1f1ea-1f1e6", "html": "🇪🇦", "category": "Flags (country-flag)", "order": "2252"}, + {"emoji": "🇪🇨", "name": "flag: Ecuador", "shortname": ":flag-ec:", "unicode": "1f1ea-1f1e8", "html": "🇪🇨", "category": "Flags (country-flag)", "order": "2253"}, + {"emoji": "🇪🇪", "name": "flag: Estonia", "shortname": ":flag-ee:", "unicode": "1f1ea-1f1ea", "html": "🇪🇪", "category": "Flags (country-flag)", "order": "2254"}, + {"emoji": "🇪🇬", "name": "flag: Egypt", "shortname": ":flag-eg:", "unicode": "1f1ea-1f1ec", "html": "🇪🇬", "category": "Flags (country-flag)", "order": "2255"}, + {"emoji": "🇪🇭", "name": "flag: Western Sahara", "shortname": ":flag-eh:", "unicode": "1f1ea-1f1ed", "html": "🇪🇭", "category": "Flags (country-flag)", "order": "2256"}, + {"emoji": "🇪🇷", "name": "flag: Eritrea", "shortname": ":flag-er:", "unicode": "1f1ea-1f1f7", "html": "🇪🇷", "category": "Flags (country-flag)", "order": "2257"}, + {"emoji": "🇪🇸", "name": "flag: Spain", "shortname": ":flag-es:", "unicode": "1f1ea-1f1f8", "html": "🇪🇸", "category": "Flags (country-flag)", "order": "2258"}, + {"emoji": "🇪🇹", "name": "flag: Ethiopia", "shortname": ":flag-et:", "unicode": "1f1ea-1f1f9", "html": "🇪🇹", "category": "Flags (country-flag)", "order": "2259"}, + {"emoji": "🇪🇺", "name": "flag: European Union", "shortname": ":flag-eu:", "unicode": "1f1ea-1f1fa", "html": "🇪🇺", "category": "Flags (country-flag)", "order": "2260"}, + {"emoji": "🇫🇮", "name": "flag: Finland", "shortname": ":flag-fi:", "unicode": "1f1eb-1f1ee", "html": "🇫🇮", "category": "Flags (country-flag)", "order": "2261"}, + {"emoji": "🇫🇯", "name": "flag: Fiji", "shortname": ":flag-fj:", "unicode": "1f1eb-1f1ef", "html": "🇫🇯", "category": "Flags (country-flag)", "order": "2262"}, + {"emoji": "🇫🇰", "name": "flag: Falkland Islands", "shortname": ":flag-fk:", "unicode": "1f1eb-1f1f0", "html": "🇫🇰", "category": "Flags (country-flag)", "order": "2263"}, + {"emoji": "🇫🇲", "name": "flag: Micronesia", "shortname": ":flag-fm:", "unicode": "1f1eb-1f1f2", "html": "🇫🇲", "category": "Flags (country-flag)", "order": "2264"}, + {"emoji": "🇫🇴", "name": "flag: Faroe Islands", "shortname": ":flag-fo:", "unicode": "1f1eb-1f1f4", "html": "🇫🇴", "category": "Flags (country-flag)", "order": "2265"}, + {"emoji": "🇫🇷", "name": "flag: France", "shortname": ":flag-fr:", "unicode": "1f1eb-1f1f7", "html": "🇫🇷", "category": "Flags (country-flag)", "order": "2266"}, + {"emoji": "🇬🇦", "name": "flag: Gabon", "shortname": ":flag-ga:", "unicode": "1f1ec-1f1e6", "html": "🇬🇦", "category": "Flags (country-flag)", "order": "2267"}, + {"emoji": "🇬🇧", "name": "flag: United Kingdom", "shortname": ":flag-gb:", "unicode": "1f1ec-1f1e7", "html": "🇬🇧", "category": "Flags (country-flag)", "order": "2268"}, + {"emoji": "🇬🇩", "name": "flag: Grenada", "shortname": ":flag-gd:", "unicode": "1f1ec-1f1e9", "html": "🇬🇩", "category": "Flags (country-flag)", "order": "2269"}, + {"emoji": "🇬🇪", "name": "flag: Georgia", "shortname": ":flag-ge:", "unicode": "1f1ec-1f1ea", "html": "🇬🇪", "category": "Flags (country-flag)", "order": "2270"}, + {"emoji": "🇬🇫", "name": "flag: French Guiana", "shortname": ":flag-gf:", "unicode": "1f1ec-1f1eb", "html": "🇬🇫", "category": "Flags (country-flag)", "order": "2271"}, + {"emoji": "🇬🇬", "name": "flag: Guernsey", "shortname": ":flag-gg:", "unicode": "1f1ec-1f1ec", "html": "🇬🇬", "category": "Flags (country-flag)", "order": "2272"}, + {"emoji": "🇬🇭", "name": "flag: Ghana", "shortname": ":flag-gh:", "unicode": "1f1ec-1f1ed", "html": "🇬🇭", "category": "Flags (country-flag)", "order": "2273"}, + {"emoji": "🇬🇮", "name": "flag: Gibraltar", "shortname": ":flag-gi:", "unicode": "1f1ec-1f1ee", "html": "🇬🇮", "category": "Flags (country-flag)", "order": "2274"}, + {"emoji": "🇬🇱", "name": "flag: Greenland", "shortname": ":flag-gl:", "unicode": "1f1ec-1f1f1", "html": "🇬🇱", "category": "Flags (country-flag)", "order": "2275"}, + {"emoji": "🇬🇲", "name": "flag: Gambia", "shortname": ":flag-gm:", "unicode": "1f1ec-1f1f2", "html": "🇬🇲", "category": "Flags (country-flag)", "order": "2276"}, + {"emoji": "🇬🇳", "name": "flag: Guinea", "shortname": ":flag-gn:", "unicode": "1f1ec-1f1f3", "html": "🇬🇳", "category": "Flags (country-flag)", "order": "2277"}, + {"emoji": "🇬🇵", "name": "flag: Guadeloupe", "shortname": ":flag-gp:", "unicode": "1f1ec-1f1f5", "html": "🇬🇵", "category": "Flags (country-flag)", "order": "2278"}, + {"emoji": "🇬🇶", "name": "flag: Equatorial Guinea", "shortname": ":flag-gq:", "unicode": "1f1ec-1f1f6", "html": "🇬🇶", "category": "Flags (country-flag)", "order": "2279"}, + {"emoji": "🇬🇷", "name": "flag: Greece", "shortname": ":flag-gr:", "unicode": "1f1ec-1f1f7", "html": "🇬🇷", "category": "Flags (country-flag)", "order": "2280"}, + {"emoji": "🇬🇸", "name": "flag: South Georgia & South Sandwich Islands", "shortname": ":flag-gs:", "unicode": "1f1ec-1f1f8", "html": "🇬🇸", "category": "Flags (country-flag)", "order": "2281"}, + {"emoji": "🇬🇹", "name": "flag: Guatemala", "shortname": ":flag-gt:", "unicode": "1f1ec-1f1f9", "html": "🇬🇹", "category": "Flags (country-flag)", "order": "2282"}, + {"emoji": "🇬🇺", "name": "flag: Guam", "shortname": ":flag-gu:", "unicode": "1f1ec-1f1fa", "html": "🇬🇺", "category": "Flags (country-flag)", "order": "2283"}, + {"emoji": "🇬🇼", "name": "flag: Guinea-Bissau", "shortname": ":flag-gw:", "unicode": "1f1ec-1f1fc", "html": "🇬🇼", "category": "Flags (country-flag)", "order": "2284"}, + {"emoji": "🇬🇾", "name": "flag: Guyana", "shortname": ":flag-gy:", "unicode": "1f1ec-1f1fe", "html": "🇬🇾", "category": "Flags (country-flag)", "order": "2285"}, + {"emoji": "🇭🇰", "name": "flag: Hong Kong SAR China", "shortname": ":flag-hk:", "unicode": "1f1ed-1f1f0", "html": "🇭🇰", "category": "Flags (country-flag)", "order": "2286"}, + {"emoji": "🇭🇲", "name": "flag: Heard & McDonald Islands", "shortname": ":flag-hm:", "unicode": "1f1ed-1f1f2", "html": "🇭🇲", "category": "Flags (country-flag)", "order": "2287"}, + {"emoji": "🇭🇳", "name": "flag: Honduras", "shortname": ":flag-hn:", "unicode": "1f1ed-1f1f3", "html": "🇭🇳", "category": "Flags (country-flag)", "order": "2288"}, + {"emoji": "🇭🇷", "name": "flag: Croatia", "shortname": ":flag-hr:", "unicode": "1f1ed-1f1f7", "html": "🇭🇷", "category": "Flags (country-flag)", "order": "2289"}, + {"emoji": "🇭🇹", "name": "flag: Haiti", "shortname": ":flag-ht:", "unicode": "1f1ed-1f1f9", "html": "🇭🇹", "category": "Flags (country-flag)", "order": "2290"}, + {"emoji": "🇭🇺", "name": "flag: Hungary", "shortname": ":flag-hu:", "unicode": "1f1ed-1f1fa", "html": "🇭🇺", "category": "Flags (country-flag)", "order": "2291"}, + {"emoji": "🇮🇨", "name": "flag: Canary Islands", "shortname": ":flag-ic:", "unicode": "1f1ee-1f1e8", "html": "🇮🇨", "category": "Flags (country-flag)", "order": "2292"}, + {"emoji": "🇮🇩", "name": "flag: Indonesia", "shortname": ":flag-id:", "unicode": "1f1ee-1f1e9", "html": "🇮🇩", "category": "Flags (country-flag)", "order": "2293"}, + {"emoji": "🇮🇪", "name": "flag: Ireland", "shortname": ":flag-ie:", "unicode": "1f1ee-1f1ea", "html": "🇮🇪", "category": "Flags (country-flag)", "order": "2294"}, + {"emoji": "🇮🇱", "name": "flag: Israel", "shortname": ":flag-il:", "unicode": "1f1ee-1f1f1", "html": "🇮🇱", "category": "Flags (country-flag)", "order": "2295"}, + {"emoji": "🇮🇲", "name": "flag: Isle of Man", "shortname": ":flag-im:", "unicode": "1f1ee-1f1f2", "html": "🇮🇲", "category": "Flags (country-flag)", "order": "2296"}, + {"emoji": "🇮🇳", "name": "flag: India", "shortname": ":flag-in:", "unicode": "1f1ee-1f1f3", "html": "🇮🇳", "category": "Flags (country-flag)", "order": "2297"}, + {"emoji": "🇮🇴", "name": "flag: British Indian Ocean Territory", "shortname": ":flag-io:", "unicode": "1f1ee-1f1f4", "html": "🇮🇴", "category": "Flags (country-flag)", "order": "2298"}, + {"emoji": "🇮🇶", "name": "flag: Iraq", "shortname": ":flag-iq:", "unicode": "1f1ee-1f1f6", "html": "🇮🇶", "category": "Flags (country-flag)", "order": "2299"}, + {"emoji": "🇮🇷", "name": "flag: Iran", "shortname": ":flag-ir:", "unicode": "1f1ee-1f1f7", "html": "🇮🇷", "category": "Flags (country-flag)", "order": "2300"}, + {"emoji": "🇮🇸", "name": "flag: Iceland", "shortname": ":flag-is:", "unicode": "1f1ee-1f1f8", "html": "🇮🇸", "category": "Flags (country-flag)", "order": "2301"}, + {"emoji": "🇮🇹", "name": "flag: Italy", "shortname": ":flag-it:", "unicode": "1f1ee-1f1f9", "html": "🇮🇹", "category": "Flags (country-flag)", "order": "2302"}, + {"emoji": "🇯🇪", "name": "flag: Jersey", "shortname": ":flag-je:", "unicode": "1f1ef-1f1ea", "html": "🇯🇪", "category": "Flags (country-flag)", "order": "2303"}, + {"emoji": "🇯🇲", "name": "flag: Jamaica", "shortname": ":flag-jm:", "unicode": "1f1ef-1f1f2", "html": "🇯🇲", "category": "Flags (country-flag)", "order": "2304"}, + {"emoji": "🇯🇴", "name": "flag: Jordan", "shortname": ":flag-jo:", "unicode": "1f1ef-1f1f4", "html": "🇯🇴", "category": "Flags (country-flag)", "order": "2305"}, + {"emoji": "🇯🇵", "name": "flag: Japan", "shortname": ":flag-jp:", "unicode": "1f1ef-1f1f5", "html": "🇯🇵", "category": "Flags (country-flag)", "order": "2306"}, + {"emoji": "🇰🇪", "name": "flag: Kenya", "shortname": ":flag-ke:", "unicode": "1f1f0-1f1ea", "html": "🇰🇪", "category": "Flags (country-flag)", "order": "2307"}, + {"emoji": "🇰🇬", "name": "flag: Kyrgyzstan", "shortname": ":flag-kg:", "unicode": "1f1f0-1f1ec", "html": "🇰🇬", "category": "Flags (country-flag)", "order": "2308"}, + {"emoji": "🇰🇭", "name": "flag: Cambodia", "shortname": ":flag-kh:", "unicode": "1f1f0-1f1ed", "html": "🇰🇭", "category": "Flags (country-flag)", "order": "2309"}, + {"emoji": "🇰🇮", "name": "flag: Kiribati", "shortname": ":flag-ki:", "unicode": "1f1f0-1f1ee", "html": "🇰🇮", "category": "Flags (country-flag)", "order": "2310"}, + {"emoji": "🇰🇲", "name": "flag: Comoros", "shortname": ":flag-km:", "unicode": "1f1f0-1f1f2", "html": "🇰🇲", "category": "Flags (country-flag)", "order": "2311"}, + {"emoji": "🇰🇳", "name": "flag: St. Kitts & Nevis", "shortname": ":flag-kn:", "unicode": "1f1f0-1f1f3", "html": "🇰🇳", "category": "Flags (country-flag)", "order": "2312"}, + {"emoji": "🇰🇵", "name": "flag: North Korea", "shortname": ":flag-kp:", "unicode": "1f1f0-1f1f5", "html": "🇰🇵", "category": "Flags (country-flag)", "order": "2313"}, + {"emoji": "🇰🇷", "name": "flag: South Korea", "shortname": ":flag-kr:", "unicode": "1f1f0-1f1f7", "html": "🇰🇷", "category": "Flags (country-flag)", "order": "2314"}, + {"emoji": "🇰🇼", "name": "flag: Kuwait", "shortname": ":flag-kw:", "unicode": "1f1f0-1f1fc", "html": "🇰🇼", "category": "Flags (country-flag)", "order": "2315"}, + {"emoji": "🇰🇾", "name": "flag: Cayman Islands", "shortname": ":flag-ky:", "unicode": "1f1f0-1f1fe", "html": "🇰🇾", "category": "Flags (country-flag)", "order": "2316"}, + {"emoji": "🇰🇿", "name": "flag: Kazakhstan", "shortname": ":flag-kz:", "unicode": "1f1f0-1f1ff", "html": "🇰🇿", "category": "Flags (country-flag)", "order": "2317"}, + {"emoji": "🇱🇦", "name": "flag: Laos", "shortname": ":flag-la:", "unicode": "1f1f1-1f1e6", "html": "🇱🇦", "category": "Flags (country-flag)", "order": "2318"}, + {"emoji": "🇱🇧", "name": "flag: Lebanon", "shortname": ":flag-lb:", "unicode": "1f1f1-1f1e7", "html": "🇱🇧", "category": "Flags (country-flag)", "order": "2319"}, + {"emoji": "🇱🇨", "name": "flag: St. Lucia", "shortname": ":flag-lc:", "unicode": "1f1f1-1f1e8", "html": "🇱🇨", "category": "Flags (country-flag)", "order": "2320"}, + {"emoji": "🇱🇮", "name": "flag: Liechtenstein", "shortname": ":flag-li:", "unicode": "1f1f1-1f1ee", "html": "🇱🇮", "category": "Flags (country-flag)", "order": "2321"}, + {"emoji": "🇱🇰", "name": "flag: Sri Lanka", "shortname": ":flag-lk:", "unicode": "1f1f1-1f1f0", "html": "🇱🇰", "category": "Flags (country-flag)", "order": "2322"}, + {"emoji": "🇱🇷", "name": "flag: Liberia", "shortname": ":flag-lr:", "unicode": "1f1f1-1f1f7", "html": "🇱🇷", "category": "Flags (country-flag)", "order": "2323"}, + {"emoji": "🇱🇸", "name": "flag: Lesotho", "shortname": ":flag-ls:", "unicode": "1f1f1-1f1f8", "html": "🇱🇸", "category": "Flags (country-flag)", "order": "2324"}, + {"emoji": "🇱🇹", "name": "flag: Lithuania", "shortname": ":flag-lt:", "unicode": "1f1f1-1f1f9", "html": "🇱🇹", "category": "Flags (country-flag)", "order": "2325"}, + {"emoji": "🇱🇺", "name": "flag: Luxembourg", "shortname": ":flag-lu:", "unicode": "1f1f1-1f1fa", "html": "🇱🇺", "category": "Flags (country-flag)", "order": "2326"}, + {"emoji": "🇱🇻", "name": "flag: Latvia", "shortname": ":flag-lv:", "unicode": "1f1f1-1f1fb", "html": "🇱🇻", "category": "Flags (country-flag)", "order": "2327"}, + {"emoji": "🇱🇾", "name": "flag: Libya", "shortname": ":flag-ly:", "unicode": "1f1f1-1f1fe", "html": "🇱🇾", "category": "Flags (country-flag)", "order": "2328"}, + {"emoji": "🇲🇦", "name": "flag: Morocco", "shortname": ":flag-ma:", "unicode": "1f1f2-1f1e6", "html": "🇲🇦", "category": "Flags (country-flag)", "order": "2329"}, + {"emoji": "🇲🇨", "name": "flag: Monaco", "shortname": ":flag-mc:", "unicode": "1f1f2-1f1e8", "html": "🇲🇨", "category": "Flags (country-flag)", "order": "2330"}, + {"emoji": "🇲🇩", "name": "flag: Moldova", "shortname": ":flag-md:", "unicode": "1f1f2-1f1e9", "html": "🇲🇩", "category": "Flags (country-flag)", "order": "2331"}, + {"emoji": "🇲🇪", "name": "flag: Montenegro", "shortname": ":flag-me:", "unicode": "1f1f2-1f1ea", "html": "🇲🇪", "category": "Flags (country-flag)", "order": "2332"}, + {"emoji": "🇲🇫", "name": "flag: St. Martin", "shortname": ":flag-mf:", "unicode": "1f1f2-1f1eb", "html": "🇲🇫", "category": "Flags (country-flag)", "order": "2333"}, + {"emoji": "🇲🇬", "name": "flag: Madagascar", "shortname": ":flag-mg:", "unicode": "1f1f2-1f1ec", "html": "🇲🇬", "category": "Flags (country-flag)", "order": "2334"}, + {"emoji": "🇲🇭", "name": "flag: Marshall Islands", "shortname": ":flag-mh:", "unicode": "1f1f2-1f1ed", "html": "🇲🇭", "category": "Flags (country-flag)", "order": "2335"}, + {"emoji": "🇲🇰", "name": "flag: North Macedonia", "shortname": ":flag-mk:", "unicode": "1f1f2-1f1f0", "html": "🇲🇰", "category": "Flags (country-flag)", "order": "2336"}, + {"emoji": "🇲🇱", "name": "flag: Mali", "shortname": ":flag-ml:", "unicode": "1f1f2-1f1f1", "html": "🇲🇱", "category": "Flags (country-flag)", "order": "2337"}, + {"emoji": "🇲🇲", "name": "flag: Myanmar (Burma)", "shortname": ":flag-mm:", "unicode": "1f1f2-1f1f2", "html": "🇲🇲", "category": "Flags (country-flag)", "order": "2338"}, + {"emoji": "🇲🇳", "name": "flag: Mongolia", "shortname": ":flag-mn:", "unicode": "1f1f2-1f1f3", "html": "🇲🇳", "category": "Flags (country-flag)", "order": "2339"}, + {"emoji": "🇲🇴", "name": "flag: Macao SAR China", "shortname": ":flag-mo:", "unicode": "1f1f2-1f1f4", "html": "🇲🇴", "category": "Flags (country-flag)", "order": "2340"}, + {"emoji": "🇲🇵", "name": "flag: Northern Mariana Islands", "shortname": ":flag-mp:", "unicode": "1f1f2-1f1f5", "html": "🇲🇵", "category": "Flags (country-flag)", "order": "2341"}, + {"emoji": "🇲🇶", "name": "flag: Martinique", "shortname": ":flag-mq:", "unicode": "1f1f2-1f1f6", "html": "🇲🇶", "category": "Flags (country-flag)", "order": "2342"}, + {"emoji": "🇲🇷", "name": "flag: Mauritania", "shortname": ":flag-mr:", "unicode": "1f1f2-1f1f7", "html": "🇲🇷", "category": "Flags (country-flag)", "order": "2343"}, + {"emoji": "🇲🇸", "name": "flag: Montserrat", "shortname": ":flag-ms:", "unicode": "1f1f2-1f1f8", "html": "🇲🇸", "category": "Flags (country-flag)", "order": "2344"}, + {"emoji": "🇲🇹", "name": "flag: Malta", "shortname": ":flag-mt:", "unicode": "1f1f2-1f1f9", "html": "🇲🇹", "category": "Flags (country-flag)", "order": "2345"}, + {"emoji": "🇲🇺", "name": "flag: Mauritius", "shortname": ":flag-mu:", "unicode": "1f1f2-1f1fa", "html": "🇲🇺", "category": "Flags (country-flag)", "order": "2346"}, + {"emoji": "🇲🇻", "name": "flag: Maldives", "shortname": ":flag-mv:", "unicode": "1f1f2-1f1fb", "html": "🇲🇻", "category": "Flags (country-flag)", "order": "2347"}, + {"emoji": "🇲🇼", "name": "flag: Malawi", "shortname": ":flag-mw:", "unicode": "1f1f2-1f1fc", "html": "🇲🇼", "category": "Flags (country-flag)", "order": "2348"}, + {"emoji": "🇲🇽", "name": "flag: Mexico", "shortname": ":flag-mx:", "unicode": "1f1f2-1f1fd", "html": "🇲🇽", "category": "Flags (country-flag)", "order": "2349"}, + {"emoji": "🇲🇾", "name": "flag: Malaysia", "shortname": ":flag-my:", "unicode": "1f1f2-1f1fe", "html": "🇲🇾", "category": "Flags (country-flag)", "order": "2350"}, + {"emoji": "🇲🇿", "name": "flag: Mozambique", "shortname": ":flag-mz:", "unicode": "1f1f2-1f1ff", "html": "🇲🇿", "category": "Flags (country-flag)", "order": "2351"}, + {"emoji": "🇳🇦", "name": "flag: Namibia", "shortname": ":flag-na:", "unicode": "1f1f3-1f1e6", "html": "🇳🇦", "category": "Flags (country-flag)", "order": "2352"}, + {"emoji": "🇳🇨", "name": "flag: New Caledonia", "shortname": ":flag-nc:", "unicode": "1f1f3-1f1e8", "html": "🇳🇨", "category": "Flags (country-flag)", "order": "2353"}, + {"emoji": "🇳🇪", "name": "flag: Niger", "shortname": ":flag-ne:", "unicode": "1f1f3-1f1ea", "html": "🇳🇪", "category": "Flags (country-flag)", "order": "2354"}, + {"emoji": "🇳🇫", "name": "flag: Norfolk Island", "shortname": ":flag-nf:", "unicode": "1f1f3-1f1eb", "html": "🇳🇫", "category": "Flags (country-flag)", "order": "2355"}, + {"emoji": "🇳🇬", "name": "flag: Nigeria", "shortname": ":flag-ng:", "unicode": "1f1f3-1f1ec", "html": "🇳🇬", "category": "Flags (country-flag)", "order": "2356"}, + {"emoji": "🇳🇮", "name": "flag: Nicaragua", "shortname": ":flag-ni:", "unicode": "1f1f3-1f1ee", "html": "🇳🇮", "category": "Flags (country-flag)", "order": "2357"}, + {"emoji": "🇳🇱", "name": "flag: Netherlands", "shortname": ":flag-nl:", "unicode": "1f1f3-1f1f1", "html": "🇳🇱", "category": "Flags (country-flag)", "order": "2358"}, + {"emoji": "🇳🇴", "name": "flag: Norway", "shortname": ":flag-no:", "unicode": "1f1f3-1f1f4", "html": "🇳🇴", "category": "Flags (country-flag)", "order": "2359"}, + {"emoji": "🇳🇵", "name": "flag: Nepal", "shortname": ":flag-np:", "unicode": "1f1f3-1f1f5", "html": "🇳🇵", "category": "Flags (country-flag)", "order": "2360"}, + {"emoji": "🇳🇷", "name": "flag: Nauru", "shortname": ":flag-nr:", "unicode": "1f1f3-1f1f7", "html": "🇳🇷", "category": "Flags (country-flag)", "order": "2361"}, + {"emoji": "🇳🇺", "name": "flag: Niue", "shortname": ":flag-nu:", "unicode": "1f1f3-1f1fa", "html": "🇳🇺", "category": "Flags (country-flag)", "order": "2362"}, + {"emoji": "🇳🇿", "name": "flag: New Zealand", "shortname": ":flag-nz:", "unicode": "1f1f3-1f1ff", "html": "🇳🇿", "category": "Flags (country-flag)", "order": "2363"}, + {"emoji": "🇴🇲", "name": "flag: Oman", "shortname": ":flag-om:", "unicode": "1f1f4-1f1f2", "html": "🇴🇲", "category": "Flags (country-flag)", "order": "2364"}, + {"emoji": "🇵🇦", "name": "flag: Panama", "shortname": ":flag-pa:", "unicode": "1f1f5-1f1e6", "html": "🇵🇦", "category": "Flags (country-flag)", "order": "2365"}, + {"emoji": "🇵🇪", "name": "flag: Peru", "shortname": ":flag-pe:", "unicode": "1f1f5-1f1ea", "html": "🇵🇪", "category": "Flags (country-flag)", "order": "2366"}, + {"emoji": "🇵🇫", "name": "flag: French Polynesia", "shortname": ":flag-pf:", "unicode": "1f1f5-1f1eb", "html": "🇵🇫", "category": "Flags (country-flag)", "order": "2367"}, + {"emoji": "🇵🇬", "name": "flag: Papua New Guinea", "shortname": ":flag-pg:", "unicode": "1f1f5-1f1ec", "html": "🇵🇬", "category": "Flags (country-flag)", "order": "2368"}, + {"emoji": "🇵🇭", "name": "flag: Philippines", "shortname": ":flag-ph:", "unicode": "1f1f5-1f1ed", "html": "🇵🇭", "category": "Flags (country-flag)", "order": "2369"}, + {"emoji": "🇵🇰", "name": "flag: Pakistan", "shortname": ":flag-pk:", "unicode": "1f1f5-1f1f0", "html": "🇵🇰", "category": "Flags (country-flag)", "order": "2370"}, + {"emoji": "🇵🇱", "name": "flag: Poland", "shortname": ":flag-pl:", "unicode": "1f1f5-1f1f1", "html": "🇵🇱", "category": "Flags (country-flag)", "order": "2371"}, + {"emoji": "🇵🇲", "name": "flag: St. Pierre & Miquelon", "shortname": ":flag-pm:", "unicode": "1f1f5-1f1f2", "html": "🇵🇲", "category": "Flags (country-flag)", "order": "2372"}, + {"emoji": "🇵🇳", "name": "flag: Pitcairn Islands", "shortname": ":flag-pn:", "unicode": "1f1f5-1f1f3", "html": "🇵🇳", "category": "Flags (country-flag)", "order": "2373"}, + {"emoji": "🇵🇷", "name": "flag: Puerto Rico", "shortname": ":flag-pr:", "unicode": "1f1f5-1f1f7", "html": "🇵🇷", "category": "Flags (country-flag)", "order": "2374"}, + {"emoji": "🇵🇸", "name": "flag: Palestinian Territories", "shortname": ":flag-ps:", "unicode": "1f1f5-1f1f8", "html": "🇵🇸", "category": "Flags (country-flag)", "order": "2375"}, + {"emoji": "🇵🇹", "name": "flag: Portugal", "shortname": ":flag-pt:", "unicode": "1f1f5-1f1f9", "html": "🇵🇹", "category": "Flags (country-flag)", "order": "2376"}, + {"emoji": "🇵🇼", "name": "flag: Palau", "shortname": ":flag-pw:", "unicode": "1f1f5-1f1fc", "html": "🇵🇼", "category": "Flags (country-flag)", "order": "2377"}, + {"emoji": "🇵🇾", "name": "flag: Paraguay", "shortname": ":flag-py:", "unicode": "1f1f5-1f1fe", "html": "🇵🇾", "category": "Flags (country-flag)", "order": "2378"}, + {"emoji": "🇶🇦", "name": "flag: Qatar", "shortname": ":flag-qa:", "unicode": "1f1f6-1f1e6", "html": "🇶🇦", "category": "Flags (country-flag)", "order": "2379"}, + {"emoji": "🇷🇪", "name": "flag: Réunion", "shortname": ":flag-re:", "unicode": "1f1f7-1f1ea", "html": "🇷🇪", "category": "Flags (country-flag)", "order": "2380"}, + {"emoji": "🇷🇴", "name": "flag: Romania", "shortname": ":flag-ro:", "unicode": "1f1f7-1f1f4", "html": "🇷🇴", "category": "Flags (country-flag)", "order": "2381"}, + {"emoji": "🇷🇸", "name": "flag: Serbia", "shortname": ":flag-rs:", "unicode": "1f1f7-1f1f8", "html": "🇷🇸", "category": "Flags (country-flag)", "order": "2382"}, + {"emoji": "🇷🇺", "name": "flag: Russia", "shortname": ":flag-ru:", "unicode": "1f1f7-1f1fa", "html": "🇷🇺", "category": "Flags (country-flag)", "order": "2383"}, + {"emoji": "🇷🇼", "name": "flag: Rwanda", "shortname": ":flag-rw:", "unicode": "1f1f7-1f1fc", "html": "🇷🇼", "category": "Flags (country-flag)", "order": "2384"}, + {"emoji": "🇸🇦", "name": "flag: Saudi Arabia", "shortname": ":flag-sa:", "unicode": "1f1f8-1f1e6", "html": "🇸🇦", "category": "Flags (country-flag)", "order": "2385"}, + {"emoji": "🇸🇧", "name": "flag: Solomon Islands", "shortname": ":flag-sb:", "unicode": "1f1f8-1f1e7", "html": "🇸🇧", "category": "Flags (country-flag)", "order": "2386"}, + {"emoji": "🇸🇨", "name": "flag: Seychelles", "shortname": ":flag-sc:", "unicode": "1f1f8-1f1e8", "html": "🇸🇨", "category": "Flags (country-flag)", "order": "2387"}, + {"emoji": "🇸🇩", "name": "flag: Sudan", "shortname": ":flag-sd:", "unicode": "1f1f8-1f1e9", "html": "🇸🇩", "category": "Flags (country-flag)", "order": "2388"}, + {"emoji": "🇸🇪", "name": "flag: Sweden", "shortname": ":flag-se:", "unicode": "1f1f8-1f1ea", "html": "🇸🇪", "category": "Flags (country-flag)", "order": "2389"}, + {"emoji": "🇸🇬", "name": "flag: Singapore", "shortname": ":flag-sg:", "unicode": "1f1f8-1f1ec", "html": "🇸🇬", "category": "Flags (country-flag)", "order": "2390"}, + {"emoji": "🇸🇭", "name": "flag: St. Helena", "shortname": ":flag-sh:", "unicode": "1f1f8-1f1ed", "html": "🇸🇭", "category": "Flags (country-flag)", "order": "2391"}, + {"emoji": "🇸🇮", "name": "flag: Slovenia", "shortname": ":flag-si:", "unicode": "1f1f8-1f1ee", "html": "🇸🇮", "category": "Flags (country-flag)", "order": "2392"}, + {"emoji": "🇸🇯", "name": "flag: Svalbard & Jan Mayen", "shortname": ":flag-sj:", "unicode": "1f1f8-1f1ef", "html": "🇸🇯", "category": "Flags (country-flag)", "order": "2393"}, + {"emoji": "🇸🇰", "name": "flag: Slovakia", "shortname": ":flag-sk:", "unicode": "1f1f8-1f1f0", "html": "🇸🇰", "category": "Flags (country-flag)", "order": "2394"}, + {"emoji": "🇸🇱", "name": "flag: Sierra Leone", "shortname": ":flag-sl:", "unicode": "1f1f8-1f1f1", "html": "🇸🇱", "category": "Flags (country-flag)", "order": "2395"}, + {"emoji": "🇸🇲", "name": "flag: San Marino", "shortname": ":flag-sm:", "unicode": "1f1f8-1f1f2", "html": "🇸🇲", "category": "Flags (country-flag)", "order": "2396"}, + {"emoji": "🇸🇳", "name": "flag: Senegal", "shortname": ":flag-sn:", "unicode": "1f1f8-1f1f3", "html": "🇸🇳", "category": "Flags (country-flag)", "order": "2397"}, + {"emoji": "🇸🇴", "name": "flag: Somalia", "shortname": ":flag-so:", "unicode": "1f1f8-1f1f4", "html": "🇸🇴", "category": "Flags (country-flag)", "order": "2398"}, + {"emoji": "🇸🇷", "name": "flag: Suriname", "shortname": ":flag-sr:", "unicode": "1f1f8-1f1f7", "html": "🇸🇷", "category": "Flags (country-flag)", "order": "2399"}, + {"emoji": "🇸🇸", "name": "flag: South Sudan", "shortname": ":flag-ss:", "unicode": "1f1f8-1f1f8", "html": "🇸🇸", "category": "Flags (country-flag)", "order": "2400"}, + {"emoji": "🇸🇹", "name": "flag: São Tomé & Príncipe", "shortname": ":flag-st:", "unicode": "1f1f8-1f1f9", "html": "🇸🇹", "category": "Flags (country-flag)", "order": "2401"}, + {"emoji": "🇸🇻", "name": "flag: El Salvador", "shortname": ":flag-sv:", "unicode": "1f1f8-1f1fb", "html": "🇸🇻", "category": "Flags (country-flag)", "order": "2402"}, + {"emoji": "🇸🇽", "name": "flag: Sint Maarten", "shortname": ":flag-sx:", "unicode": "1f1f8-1f1fd", "html": "🇸🇽", "category": "Flags (country-flag)", "order": "2403"}, + {"emoji": "🇸🇾", "name": "flag: Syria", "shortname": ":flag-sy:", "unicode": "1f1f8-1f1fe", "html": "🇸🇾", "category": "Flags (country-flag)", "order": "2404"}, + {"emoji": "🇸🇿", "name": "flag: Eswatini", "shortname": ":flag-sz:", "unicode": "1f1f8-1f1ff", "html": "🇸🇿", "category": "Flags (country-flag)", "order": "2405"}, + {"emoji": "🇹🇦", "name": "flag: Tristan da Cunha", "shortname": ":flag-ta:", "unicode": "1f1f9-1f1e6", "html": "🇹🇦", "category": "Flags (country-flag)", "order": "2406"}, + {"emoji": "🇹🇨", "name": "flag: Turks & Caicos Islands", "shortname": ":flag-tc:", "unicode": "1f1f9-1f1e8", "html": "🇹🇨", "category": "Flags (country-flag)", "order": "2407"}, + {"emoji": "🇹🇩", "name": "flag: Chad", "shortname": ":flag-td:", "unicode": "1f1f9-1f1e9", "html": "🇹🇩", "category": "Flags (country-flag)", "order": "2408"}, + {"emoji": "🇹🇫", "name": "flag: French Southern Territories", "shortname": ":flag-tf:", "unicode": "1f1f9-1f1eb", "html": "🇹🇫", "category": "Flags (country-flag)", "order": "2409"}, + {"emoji": "🇹🇬", "name": "flag: Togo", "shortname": ":flag-tg:", "unicode": "1f1f9-1f1ec", "html": "🇹🇬", "category": "Flags (country-flag)", "order": "2410"}, + {"emoji": "🇹🇭", "name": "flag: Thailand", "shortname": ":flag-th:", "unicode": "1f1f9-1f1ed", "html": "🇹🇭", "category": "Flags (country-flag)", "order": "2411"}, + {"emoji": "🇹🇯", "name": "flag: Tajikistan", "shortname": ":flag-tj:", "unicode": "1f1f9-1f1ef", "html": "🇹🇯", "category": "Flags (country-flag)", "order": "2412"}, + {"emoji": "🇹🇰", "name": "flag: Tokelau", "shortname": ":flag-tk:", "unicode": "1f1f9-1f1f0", "html": "🇹🇰", "category": "Flags (country-flag)", "order": "2413"}, + {"emoji": "🇹🇱", "name": "flag: Timor-Leste", "shortname": ":flag-tl:", "unicode": "1f1f9-1f1f1", "html": "🇹🇱", "category": "Flags (country-flag)", "order": "2414"}, + {"emoji": "🇹🇲", "name": "flag: Turkmenistan", "shortname": ":flag-tm:", "unicode": "1f1f9-1f1f2", "html": "🇹🇲", "category": "Flags (country-flag)", "order": "2415"}, + {"emoji": "🇹🇳", "name": "flag: Tunisia", "shortname": ":flag-tn:", "unicode": "1f1f9-1f1f3", "html": "🇹🇳", "category": "Flags (country-flag)", "order": "2416"}, + {"emoji": "🇹🇴", "name": "flag: Tonga", "shortname": ":flag-to:", "unicode": "1f1f9-1f1f4", "html": "🇹🇴", "category": "Flags (country-flag)", "order": "2417"}, + {"emoji": "🇹🇷", "name": "flag: Turkey", "shortname": ":flag-tr:", "unicode": "1f1f9-1f1f7", "html": "🇹🇷", "category": "Flags (country-flag)", "order": "2418"}, + {"emoji": "🇹🇹", "name": "flag: Trinidad & Tobago", "shortname": ":flag-tt:", "unicode": "1f1f9-1f1f9", "html": "🇹🇹", "category": "Flags (country-flag)", "order": "2419"}, + {"emoji": "🇹🇻", "name": "flag: Tuvalu", "shortname": ":flag-tv:", "unicode": "1f1f9-1f1fb", "html": "🇹🇻", "category": "Flags (country-flag)", "order": "2420"}, + {"emoji": "🇹🇼", "name": "flag: Taiwan", "shortname": ":flag-tw:", "unicode": "1f1f9-1f1fc", "html": "🇹🇼", "category": "Flags (country-flag)", "order": "2421"}, + {"emoji": "🇹🇿", "name": "flag: Tanzania", "shortname": ":flag-tz:", "unicode": "1f1f9-1f1ff", "html": "🇹🇿", "category": "Flags (country-flag)", "order": "2422"}, + {"emoji": "🇺🇦", "name": "flag: Ukraine", "shortname": ":flag-ua:", "unicode": "1f1fa-1f1e6", "html": "🇺🇦", "category": "Flags (country-flag)", "order": "2423"}, + {"emoji": "🇺🇬", "name": "flag: Uganda", "shortname": ":flag-ug:", "unicode": "1f1fa-1f1ec", "html": "🇺🇬", "category": "Flags (country-flag)", "order": "2424"}, + {"emoji": "🇺🇲", "name": "flag: U.S. Outlying Islands", "shortname": ":flag-um:", "unicode": "1f1fa-1f1f2", "html": "🇺🇲", "category": "Flags (country-flag)", "order": "2425"}, + {"emoji": "🇺🇸", "name": "flag: United States", "shortname": ":flag-us:", "unicode": "1f1fa-1f1f8", "html": "🇺🇸", "category": "Flags (country-flag)", "order": "2427"}, + {"emoji": "🇺🇾", "name": "flag: Uruguay", "shortname": ":flag-uy:", "unicode": "1f1fa-1f1fe", "html": "🇺🇾", "category": "Flags (country-flag)", "order": "2428"}, + {"emoji": "🇺🇿", "name": "flag: Uzbekistan", "shortname": ":flag-uz:", "unicode": "1f1fa-1f1ff", "html": "🇺🇿", "category": "Flags (country-flag)", "order": "2429"}, + {"emoji": "🇻🇦", "name": "flag: Vatican City", "shortname": ":flag-va:", "unicode": "1f1fb-1f1e6", "html": "🇻🇦", "category": "Flags (country-flag)", "order": "2430"}, + {"emoji": "🇻🇨", "name": "flag: St. Vincent & Grenadines", "shortname": ":flag-vc:", "unicode": "1f1fb-1f1e8", "html": "🇻🇨", "category": "Flags (country-flag)", "order": "2431"}, + {"emoji": "🇻🇪", "name": "flag: Venezuela", "shortname": ":flag-ve:", "unicode": "1f1fb-1f1ea", "html": "🇻🇪", "category": "Flags (country-flag)", "order": "2432"}, + {"emoji": "🇻🇬", "name": "flag: British Virgin Islands", "shortname": ":flag-vg:", "unicode": "1f1fb-1f1ec", "html": "🇻🇬", "category": "Flags (country-flag)", "order": "2433"}, + {"emoji": "🇻🇮", "name": "flag: U.S. Virgin Islands", "shortname": ":flag-vi:", "unicode": "1f1fb-1f1ee", "html": "🇻🇮", "category": "Flags (country-flag)", "order": "2434"}, + {"emoji": "🇻🇳", "name": "flag: Vietnam", "shortname": ":flag-vn:", "unicode": "1f1fb-1f1f3", "html": "🇻🇳", "category": "Flags (country-flag)", "order": "2435"}, + {"emoji": "🇻🇺", "name": "flag: Vanuatu", "shortname": ":flag_vu:", "unicode": "1f1fb-1f1fa", "html": "🇻🇺", "category": "Flags (country-flag)", "order": "2436"}, + {"emoji": "🇼🇫", "name": "flag: Wallis & Futuna", "shortname": ":flag_wf:", "unicode": "1f1fc-1f1eb", "html": "🇼🇫", "category": "Flags (country-flag)", "order": "2437"}, + {"emoji": "🇼🇸", "name": "flag: Samoa", "shortname": ":flag_ws:", "unicode": "1f1fc-1f1f8", "html": "🇼🇸", "category": "Flags (country-flag)", "order": "2438"}, + {"emoji": "🇽🇰", "name": "flag: Kosovo", "shortname": ":flag_xk:", "unicode": "1f1fd-1f1f0", "html": "🇽🇰", "category": "Flags (country-flag)", "order": "2439"}, + {"emoji": "🇾🇪", "name": "flag: Yemen", "shortname": ":flag_ye:", "unicode": "1f1fe-1f1ea", "html": "🇾🇪", "category": "Flags (country-flag)", "order": "2440"}, + {"emoji": "🇾🇹", "name": "flag: Mayotte", "shortname": ":flag_yt:", "unicode": "1f1fe-1f1f9", "html": "🇾🇹", "category": "Flags (country-flag)", "order": "2441"}, + {"emoji": "🇿🇦", "name": "flag: South Africa", "shortname": ":flag_za:", "unicode": "1f1ff-1f1e6", "html": "🇿🇦", "category": "Flags (country-flag)", "order": "2442"}, + {"emoji": "🇿🇲", "name": "flag: Zambia", "shortname": ":flag_zm:", "unicode": "1f1ff-1f1f2", "html": "🇿🇲", "category": "Flags (country-flag)", "order": "2443"}, + {"emoji": "🇿🇼", "name": "flag: Zimbabwe", "shortname": ":flag_zw:", "unicode": "1f1ff-1f1fc", "html": "🇿🇼", "category": "Flags (country-flag)", "order": "2444"}, + {"emoji": "🖤", "name": "black heart", "shortname": ":black_heart:", "unicode": "1f5a4", "html": "🖤", "category": "Smileys & Emotion (emotion)", "order": "1296"}, + {"emoji": "🗨", "name": "left speech bubble", "shortname": ":speech_left:", "unicode": "1f5e8", "html": "🗨", "category": "Smileys & Emotion (emotion)", "order": "1310"}, + {"emoji": "🥚", "name": "egg", "shortname": ":egg:", "unicode": "1f95a", "html": "🥚", "category": "Food & Drink (food-prepared)", "order": "1489"}, + {"emoji": "🛑", "name": "stop sign", "shortname": ":octagonal_sign:", "unicode": "1f6d1", "html": "🛑", "category": "Travel & Places (transport-ground)", "order": "1641"}, + {"emoji": "♠", "name": "spade suit", "shortname": ":spades:", "unicode": "2660", "html": "♠", "category": "Activities (game)", "order": "1807"}, + {"emoji": "♥", "name": "heart suit", "shortname": ":hearts:", "unicode": "2665", "html": "♥", "category": "Activities (game)", "order": "1808"}, + {"emoji": "♦", "name": "diamond suit", "shortname": ":diamonds:", "unicode": "2666", "html": "♦", "category": "Activities (game)", "order": "1809"}, + {"emoji": "♣", "name": "club suit", "shortname": ":clubs:", "unicode": "2663", "html": "♣", "category": "Activities (game)", "order": "1810"}, + {"emoji": "🥁", "name": "drum", "shortname": ":drum:", "unicode": "1f941", "html": "🥁", "category": "Objects (musical-instrument)", "order": "1837"}, + {"emoji": "↔", "name": "left-right arrow", "shortname": ":left_right_arrow:", "unicode": "2194", "html": "↔", "category": "Symbols (arrow)", "order": "2011"}, + {"emoji": "©", "name": "copyright", "shortname": ":copyright:", "unicode": "00a9", "html": "©", "category": "Symbols (other-symbol)", "order": "2103"}, + {"emoji": "®", "name": "registered", "shortname": ":registered:", "unicode": "00ae", "html": "®", "category": "Symbols (other-symbol)", "order": "2104"}, + {"emoji": "™", "name": "trade mark", "shortname": ":tm:", "unicode": "2122", "html": "™", "category": "Symbols (other-symbol)", "order": "2105"}, + {"emoji": "0️⃣", "name": "keycap: 0", "shortname": ":0:", "unicode": "0030 FE0F 20E3", "html": "0", "category": "Symbols (keycap)", "order": ""}, + {"emoji": "1️⃣", "name": "keycap: 1", "shortname": ":1:", "unicode": "0031 FE0F 20E3", "html": "1", "category": "Symbols (keycap)", "order": ""}, + {"emoji": "2️⃣", "name": "keycap: 2", "shortname": ":2:", "unicode": "0032 FE0F 20E3", "html": "2", "category": "Symbols (keycap)", "order": ""}, + {"emoji": "3️⃣", "name": "keycap: 3", "shortname": ":3:", "unicode": "0033 FE0F 20E3", "html": "3", "category": "Symbols (keycap)", "order": ""}, + {"emoji": "4️⃣", "name": "keycap: 4", "shortname": ":4:", "unicode": "0034 FE0F 20E3", "html": "4", "category": "Symbols (keycap)", "order": ""}, + {"emoji": "5️⃣", "name": "keycap: 5", "shortname": ":5:", "unicode": "0035 FE0F 20E3", "html": "5", "category": "Symbols (keycap)", "order": ""}, + {"emoji": "6️⃣", "name": "keycap: 6", "shortname": ":6:", "unicode": "0036 FE0F 20E3", "html": "6", "category": "Symbols (keycap)", "order": ""}, + {"emoji": "7️⃣", "name": "keycap: 7", "shortname": ":7:", "unicode": "0037 FE0F 20E3", "html": "7", "category": "Symbols (keycap)", "order": ""}, + {"emoji": "8️⃣", "name": "keycap: 8", "shortname": ":8:", "unicode": "0038 FE0F 20E3", "html": "8", "category": "Symbols (keycap)", "order": ""}, + {"emoji": "9️⃣", "name": "keycap: 9", "shortname": ":9:", "unicode": "0039 FE0F 20E3", "html": "9", "category": "Symbols (keycap)", "order": ""}, + {"emoji": "#⃣", "name": "keycap: #", "shortname": ":hash:", "unicode": "0023-20e3", "html": "#⃣", "category": "Symbols (keycap)", "order": "2106"}, + {"emoji": "*⃣", "name": "keycap: #", "shortname": ":asterisk:", "unicode": "002a-20e3", "html": "*⃣", "category": "Symbols (keycap)", "order": "2107"}, + {"emoji": "0⃣", "name": "keycap: 0", "shortname": ":zero:", "unicode": "0030-20e3", "html": "0⃣", "category": "Symbols (keycap)", "order": "2108"}, + {"emoji": "1⃣", "name": "keycap: 1", "shortname": ":one:", "unicode": "0031-20e3", "html": "1⃣", "category": "Symbols (keycap)", "order": "2109"}, + {"emoji": "2⃣", "name": "keycap: 2", "shortname": ":two:", "unicode": "0032-20e3", "html": "2⃣", "category": "Symbols (keycap)", "order": "2110"}, + {"emoji": "3⃣", "name": "keycap: 3", "shortname": ":three:", "unicode": "0033-20e3", "html": "3⃣", "category": "Symbols (keycap)", "order": "2111"}, + {"emoji": "4⃣", "name": "keycap: 4", "shortname": ":four:", "unicode": "0034-20e3", "html": "4⃣", "category": "Symbols (keycap)", "order": "2112"}, + {"emoji": "5⃣", "name": "keycap: 5", "shortname": ":five:", "unicode": "0035-20e3", "html": "5⃣", "category": "Symbols (keycap)", "order": "2113"}, + {"emoji": "6⃣", "name": "keycap: 6", "shortname": ":six:", "unicode": "0036-20e3", "html": "6⃣", "category": "Symbols (keycap)", "order": "2114"}, + {"emoji": "7⃣", "name": "keycap: 7", "shortname": ":seven:", "unicode": "0037-20e3", "html": "7⃣", "category": "Symbols (keycap)", "order": "2115"}, + {"emoji": "8⃣", "name": "keycap: 8", "shortname": ":eight:", "unicode": "0038-20e3", "html": "8⃣", "category": "Symbols (keycap)", "order": "2116"}, + {"emoji": "9⃣", "name": "keycap: 9", "shortname": ":nine:", "unicode": "0039-20e3", "html": "9⃣", "category": "Symbols (keycap)", "order": "2117"}, + {"emoji": "🤣", "name": "rolling on the floor laughing", "shortname": ":rolling_on_the_floor_laughing:", "unicode": "1F923", "html": "🤣", "category": "Smileys & Emotion (face-smiling)", "order": ""}, + {"emoji": "🥰", "name": "smiling face with hearts", "shortname": ":smiling_face_with_hearts:", "unicode": "1F970", "html": "🥰", "category": "Smileys & Emotion (face-affection)", "order": ""}, + {"emoji": "🤩", "name": "star-struck", "shortname": ":starstruck:", "unicode": "1F929", "html": "🤩", "category": "Smileys & Emotion (face-affection)", "order": ""}, + {"emoji": "☺", "name": "smiling face", "shortname": ":smiling_face:", "unicode": "263A", "html": "☺", "category": "Smileys & Emotion (face-affection)", "order": ""}, + {"emoji": "🤪", "name": "zany face", "shortname": ":zany_face:", "unicode": "1F92A", "html": "🤪", "category": "Smileys & Emotion (face-tongue)", "order": ""}, + {"emoji": "🤭", "name": "face with hand over mouth", "shortname": ":face_with_hand_over_mouth:", "unicode": "1F92D", "html": "🤭", "category": "Smileys & Emotion (face-hand)", "order": ""}, + {"emoji": "🤫", "name": "shushing face", "shortname": ":shushing_face:", "unicode": "1F92B", "html": "🤫", "category": "Smileys & Emotion (face-hand)", "order": ""}, + {"emoji": "🤨", "name": "face with raised eyebrow", "shortname": ":face_with_raised_eyebrow:", "unicode": "1F928", "html": "🤨", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": ""}, + {"emoji": "🤥", "name": "lying face", "shortname": ":lying_face:", "unicode": "1F925", "html": "🤥", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": ""}, + {"emoji": "🤤", "name": "drooling face", "shortname": ":drooling_face:", "unicode": "1F924", "html": "🤤", "category": "Smileys & Emotion (face-sleepy)", "order": ""}, + {"emoji": "🤢", "name": "nauseated face", "shortname": ":nauseated_face:", "unicode": "1F922", "html": "🤢", "category": "Smileys & Emotion (face-unwell)", "order": ""}, + {"emoji": "🤮", "name": "face vomiting", "shortname": ":face_vomiting:", "unicode": "1F92E", "html": "🤮", "category": "Smileys & Emotion (face-unwell)", "order": ""}, + {"emoji": "🤧", "name": "sneezing face", "shortname": ":sneezing_face:", "unicode": "1F927", "html": "🤧", "category": "Smileys & Emotion (face-unwell)", "order": ""}, + {"emoji": "🥵", "name": "hot face", "shortname": ":hot_face:", "unicode": "1F975", "html": "🥵", "category": "Smileys & Emotion (face-unwell)", "order": ""}, + {"emoji": "🥶", "name": "cold face", "shortname": ":cold_face:", "unicode": "1F976", "html": "🥶", "category": "Smileys & Emotion (face-unwell)", "order": ""}, + {"emoji": "🥴", "name": "woozy face", "shortname": ":woozy_face:", "unicode": "1F974", "html": "🥴", "category": "Smileys & Emotion (face-unwell)", "order": ""}, + {"emoji": "🤯", "name": "exploding head", "shortname": ":exploding_head:", "unicode": "1F92F", "html": "🤯", "category": "Smileys & Emotion (face-unwell)", "order": ""}, + {"emoji": "🤠", "name": "cowboy hat face", "shortname": ":cowboy_hat_face:", "unicode": "1F920", "html": "🤠", "category": "Smileys & Emotion (face-hat)", "order": ""}, + {"emoji": "🥳", "name": "partying face", "shortname": ":partying_face:", "unicode": "1F973", "html": "🥳", "category": "Smileys & Emotion (face-hat)", "order": ""}, + {"emoji": "🧐", "name": "face with monocle", "shortname": ":face_with_monocle:", "unicode": "1F9D0", "html": "🧐", "category": "Smileys & Emotion (face-glasses)", "order": ""}, + {"emoji": "☹️", "name": "frowning face", "shortname": ":frowning_face:", "unicode": "2639 FE0F", "html": "☹️", "category": "Smileys & Emotion (face-concerned)", "order": ""}, + {"emoji": "🥺", "name": "pleading face", "shortname": ":pleading_face:", "unicode": "1F97A", "html": "🥺", "category": "Smileys & Emotion (face-concerned)", "order": ""}, + {"emoji": "🥱", "name": "yawning face", "shortname": ":yawning_face:", "unicode": "1F971", "html": "🥱", "category": "Smileys & Emotion (face-concerned)", "order": ""}, + {"emoji": "🤬", "name": "face with symbols on mouth", "shortname": ":face_with_symbols_on_mouth:", "unicode": "1F92C", "html": "🤬", "category": "Smileys & Emotion (face-negative)", "order": ""}, + {"emoji": "☠️", "name": "skull and crossbones", "shortname": ":skull_and_crossbones:", "unicode": "2620 FE0F", "html": "☠️", "category": "Smileys & Emotion (face-negative)", "order": ""}, + {"emoji": "🤡", "name": "clown face", "shortname": ":clown_face:", "unicode": "1F921", "html": "🤡", "category": "Smileys & Emotion (face-costume)", "order": ""}, + {"emoji": "❣", "name": "heart exclamation", "shortname": ":heart_exclamation:", "unicode": "2763", "html": "❣", "category": "Smileys & Emotion (emotion)", "order": ""}, + {"emoji": "❤", "name": "red heart", "shortname": ":red_heart:", "unicode": "2764", "html": "❤", "category": "Smileys & Emotion (emotion)", "order": ""}, + {"emoji": "🧡", "name": "orange heart", "shortname": ":orange_heart:", "unicode": "1F9E1", "html": "🧡", "category": "Smileys & Emotion (emotion)", "order": ""}, + {"emoji": "🤎", "name": "brown heart", "shortname": ":brown_heart:", "unicode": "1F90E", "html": "🤎", "category": "Smileys & Emotion (emotion)", "order": ""}, + {"emoji": "🤍", "name": "white heart", "shortname": ":white_heart:", "unicode": "1F90D", "html": "🤍", "category": "Smileys & Emotion (emotion)", "order": ""}, + {"emoji": "🕳️", "name": "hole", "shortname": ":hole:", "unicode": "1F573 FE0F", "html": "🕳️", "category": "Smileys & Emotion (emotion)", "order": ""}, + {"emoji": "👁️🗨️", "name": "eye in speech bubble", "shortname": ":eye_in_speech_bubble:", "unicode": "1F441 FE0F 200D 1F5E8 FE0F", "html": "👁️‍🗨️", "category": "Smileys & Emotion (emotion)", "order": ""}, + {"emoji": "👁🗨️", "name": "eye in speech bubble", "shortname": ":eye_in_speech_bubble:", "unicode": "1F441 200D 1F5E8 FE0F", "html": "👁‍🗨️", "category": "Smileys & Emotion (emotion)", "order": ""}, + {"emoji": "👁️🗨", "name": "eye in speech bubble", "shortname": ":eye_in_speech_bubble:", "unicode": "1F441 FE0F 200D 1F5E8", "html": "👁️‍🗨", "category": "Smileys & Emotion (emotion)", "order": ""}, + {"emoji": "🗨️", "name": "left speech bubble", "shortname": ":left_speech_bubble:", "unicode": "1F5E8 FE0F", "html": "🗨️", "category": "Smileys & Emotion (emotion)", "order": ""}, + {"emoji": "🗯️", "name": "right anger bubble", "shortname": ":right_anger_bubble:", "unicode": "1F5EF FE0F", "html": "🗯️", "category": "Smileys & Emotion (emotion)", "order": ""}, + {"emoji": "🤚", "name": "raised back of hand", "shortname": ":raised_back_of_hand:", "unicode": "1F91A", "html": "🤚", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "🤚🏻", "name": "raised back of hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F91A 1F3FB", "html": "🤚🏻", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "🤚🏼", "name": "raised back of hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F91A 1F3FC", "html": "🤚🏼", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "🤚🏽", "name": "raised back of hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F91A 1F3FD", "html": "🤚🏽", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "🤚🏾", "name": "raised back of hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F91A 1F3FE", "html": "🤚🏾", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "🤚🏿", "name": "raised back of hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F91A 1F3FF", "html": "🤚🏿", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "🖐️", "name": "hand with fingers splayed", "shortname": ":hand_with_fingers_splayed:", "unicode": "1F590 FE0F", "html": "🖐️", "category": "People & Body (hand-fingers-open)", "order": ""}, + {"emoji": "🤏", "name": "pinching hand", "shortname": ":pinching_hand:", "unicode": "1F90F", "html": "🤏", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤏🏻", "name": "pinching hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F90F 1F3FB", "html": "🤏🏻", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤏🏼", "name": "pinching hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F90F 1F3FC", "html": "🤏🏼", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤏🏽", "name": "pinching hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F90F 1F3FD", "html": "🤏🏽", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤏🏾", "name": "pinching hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F90F 1F3FE", "html": "🤏🏾", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤏🏿", "name": "pinching hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F90F 1F3FF", "html": "🤏🏿", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "✌", "name": "victory hand", "shortname": ":victory_hand:", "unicode": "270C", "html": "✌", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤞", "name": "crossed fingers", "shortname": ":crossed_fingers:", "unicode": "1F91E", "html": "🤞", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤞🏻", "name": "crossed fingers: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F91E 1F3FB", "html": "🤞🏻", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤞🏼", "name": "crossed fingers: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F91E 1F3FC", "html": "🤞🏼", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤞🏽", "name": "crossed fingers: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F91E 1F3FD", "html": "🤞🏽", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤞🏾", "name": "crossed fingers: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F91E 1F3FE", "html": "🤞🏾", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤞🏿", "name": "crossed fingers: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F91E 1F3FF", "html": "🤞🏿", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤟", "name": "love-you gesture", "shortname": ":loveyou_gesture:", "unicode": "1F91F", "html": "🤟", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤟🏻", "name": "love-you gesture: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F91F 1F3FB", "html": "🤟🏻", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤟🏼", "name": "love-you gesture: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F91F 1F3FC", "html": "🤟🏼", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤟🏽", "name": "love-you gesture: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F91F 1F3FD", "html": "🤟🏽", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤟🏾", "name": "love-you gesture: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F91F 1F3FE", "html": "🤟🏾", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤟🏿", "name": "love-you gesture: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F91F 1F3FF", "html": "🤟🏿", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤙", "name": "call me hand", "shortname": ":call_me_hand:", "unicode": "1F919", "html": "🤙", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤙🏻", "name": "call me hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F919 1F3FB", "html": "🤙🏻", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤙🏼", "name": "call me hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F919 1F3FC", "html": "🤙🏼", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤙🏽", "name": "call me hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F919 1F3FD", "html": "🤙🏽", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤙🏾", "name": "call me hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F919 1F3FE", "html": "🤙🏾", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "🤙🏿", "name": "call me hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F919 1F3FF", "html": "🤙🏿", "category": "People & Body (hand-fingers-partial)", "order": ""}, + {"emoji": "☝", "name": "index pointing up", "shortname": ":index_pointing_up:", "unicode": "261D", "html": "☝", "category": "People & Body (hand-single-finger)", "order": ""}, + {"emoji": "🤛", "name": "left-facing fist", "shortname": ":leftfacing_fist:", "unicode": "1F91B", "html": "🤛", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "🤛🏻", "name": "left-facing fist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F91B 1F3FB", "html": "🤛🏻", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "🤛🏼", "name": "left-facing fist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F91B 1F3FC", "html": "🤛🏼", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "🤛🏽", "name": "left-facing fist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F91B 1F3FD", "html": "🤛🏽", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "🤛🏾", "name": "left-facing fist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F91B 1F3FE", "html": "🤛🏾", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "🤛🏿", "name": "left-facing fist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F91B 1F3FF", "html": "🤛🏿", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "🤜", "name": "right-facing fist", "shortname": ":rightfacing_fist:", "unicode": "1F91C", "html": "🤜", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "🤜🏻", "name": "right-facing fist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F91C 1F3FB", "html": "🤜🏻", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "🤜🏼", "name": "right-facing fist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F91C 1F3FC", "html": "🤜🏼", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "🤜🏽", "name": "right-facing fist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F91C 1F3FD", "html": "🤜🏽", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "🤜🏾", "name": "right-facing fist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F91C 1F3FE", "html": "🤜🏾", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "🤜🏿", "name": "right-facing fist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F91C 1F3FF", "html": "🤜🏿", "category": "People & Body (hand-fingers-closed)", "order": ""}, + {"emoji": "🤲", "name": "palms up together", "shortname": ":palms_up_together:", "unicode": "1F932", "html": "🤲", "category": "People & Body (hands)", "order": ""}, + {"emoji": "🤲🏻", "name": "palms up together: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F932 1F3FB", "html": "🤲🏻", "category": "People & Body (hands)", "order": ""}, + {"emoji": "🤲🏼", "name": "palms up together: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F932 1F3FC", "html": "🤲🏼", "category": "People & Body (hands)", "order": ""}, + {"emoji": "🤲🏽", "name": "palms up together: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F932 1F3FD", "html": "🤲🏽", "category": "People & Body (hands)", "order": ""}, + {"emoji": "🤲🏾", "name": "palms up together: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F932 1F3FE", "html": "🤲🏾", "category": "People & Body (hands)", "order": ""}, + {"emoji": "🤲🏿", "name": "palms up together: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F932 1F3FF", "html": "🤲🏿", "category": "People & Body (hands)", "order": ""}, + {"emoji": "🤝", "name": "handshake", "shortname": ":handshake:", "unicode": "1F91D", "html": "🤝", "category": "People & Body (hands)", "order": ""}, + {"emoji": "✍️", "name": "writing hand", "shortname": ":writing_hand:", "unicode": "270D FE0F", "html": "✍️", "category": "People & Body (hand-prop)", "order": ""}, + {"emoji": "🤳", "name": "selfie", "shortname": ":selfie:", "unicode": "1F933", "html": "🤳", "category": "People & Body (hand-prop)", "order": ""}, + {"emoji": "🤳🏻", "name": "selfie: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F933 1F3FB", "html": "🤳🏻", "category": "People & Body (hand-prop)", "order": ""}, + {"emoji": "🤳🏼", "name": "selfie: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F933 1F3FC", "html": "🤳🏼", "category": "People & Body (hand-prop)", "order": ""}, + {"emoji": "🤳🏽", "name": "selfie: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F933 1F3FD", "html": "🤳🏽", "category": "People & Body (hand-prop)", "order": ""}, + {"emoji": "🤳🏾", "name": "selfie: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F933 1F3FE", "html": "🤳🏾", "category": "People & Body (hand-prop)", "order": ""}, + {"emoji": "🤳🏿", "name": "selfie: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F933 1F3FF", "html": "🤳🏿", "category": "People & Body (hand-prop)", "order": ""}, + {"emoji": "🦾", "name": "mechanical arm", "shortname": ":mechanical_arm:", "unicode": "1F9BE", "html": "🦾", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦿", "name": "mechanical leg", "shortname": ":mechanical_leg:", "unicode": "1F9BF", "html": "🦿", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦵", "name": "leg", "shortname": ":leg:", "unicode": "1F9B5", "html": "🦵", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦵🏻", "name": "leg: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B5 1F3FB", "html": "🦵🏻", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦵🏼", "name": "leg: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B5 1F3FC", "html": "🦵🏼", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦵🏽", "name": "leg: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B5 1F3FD", "html": "🦵🏽", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦵🏾", "name": "leg: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B5 1F3FE", "html": "🦵🏾", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦵🏿", "name": "leg: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B5 1F3FF", "html": "🦵🏿", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦶", "name": "foot", "shortname": ":foot:", "unicode": "1F9B6", "html": "🦶", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦶🏻", "name": "foot: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B6 1F3FB", "html": "🦶🏻", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦶🏼", "name": "foot: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B6 1F3FC", "html": "🦶🏼", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦶🏽", "name": "foot: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B6 1F3FD", "html": "🦶🏽", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦶🏾", "name": "foot: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B6 1F3FE", "html": "🦶🏾", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦶🏿", "name": "foot: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B6 1F3FF", "html": "🦶🏿", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦻", "name": "ear with hearing aid", "shortname": ":ear_with_hearing_aid:", "unicode": "1F9BB", "html": "🦻", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦻🏻", "name": "ear with hearing aid: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9BB 1F3FB", "html": "🦻🏻", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦻🏼", "name": "ear with hearing aid: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9BB 1F3FC", "html": "🦻🏼", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦻🏽", "name": "ear with hearing aid: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9BB 1F3FD", "html": "🦻🏽", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦻🏾", "name": "ear with hearing aid: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9BB 1F3FE", "html": "🦻🏾", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦻🏿", "name": "ear with hearing aid: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9BB 1F3FF", "html": "🦻🏿", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🧠", "name": "brain", "shortname": ":brain:", "unicode": "1F9E0", "html": "🧠", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦷", "name": "tooth", "shortname": ":tooth:", "unicode": "1F9B7", "html": "🦷", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🦴", "name": "bone", "shortname": ":bone:", "unicode": "1F9B4", "html": "🦴", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "👁️", "name": "eye", "shortname": ":eye:", "unicode": "1F441 FE0F", "html": "👁️", "category": "People & Body (body-parts)", "order": ""}, + {"emoji": "🧒", "name": "child", "shortname": ":child:", "unicode": "1F9D2", "html": "🧒", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧒🏻", "name": "child: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D2 1F3FB", "html": "🧒🏻", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧒🏼", "name": "child: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D2 1F3FC", "html": "🧒🏼", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧒🏽", "name": "child: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D2 1F3FD", "html": "🧒🏽", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧒🏾", "name": "child: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D2 1F3FE", "html": "🧒🏾", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧒🏿", "name": "child: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D2 1F3FF", "html": "🧒🏿", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑", "name": "person", "shortname": ":person:", "unicode": "1F9D1", "html": "🧑", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏻", "name": "person: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB", "html": "🧑🏻", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏼", "name": "person: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC", "html": "🧑🏼", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏽", "name": "person: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD", "html": "🧑🏽", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏾", "name": "person: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE", "html": "🧑🏾", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏿", "name": "person: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF", "html": "🧑🏿", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧔", "name": "man: beard", "shortname": ":beard:", "unicode": "1F9D4", "html": "🧔", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧔🏻", "name": "man: light skin tone, beard", "shortname": ":light_skin_tone_beard:", "unicode": "1F9D4 1F3FB", "html": "🧔🏻", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧔🏼", "name": "man: medium-light skin tone, beard", "shortname": ":mediumlight_skin_tone_beard:", "unicode": "1F9D4 1F3FC", "html": "🧔🏼", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧔🏽", "name": "man: medium skin tone, beard", "shortname": ":medium_skin_tone_beard:", "unicode": "1F9D4 1F3FD", "html": "🧔🏽", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧔🏾", "name": "man: medium-dark skin tone, beard", "shortname": ":mediumdark_skin_tone_beard:", "unicode": "1F9D4 1F3FE", "html": "🧔🏾", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧔🏿", "name": "man: dark skin tone, beard", "shortname": ":dark_skin_tone_beard:", "unicode": "1F9D4 1F3FF", "html": "🧔🏿", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🦰", "name": "man: red hair", "shortname": ":red_hair:", "unicode": "1F468 200D 1F9B0", "html": "👨‍🦰", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏻🦰", "name": "man: light skin tone, red hair", "shortname": ":light_skin_tone_red_hair:", "unicode": "1F468 1F3FB 200D 1F9B0", "html": "👨🏻‍🦰", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏼🦰", "name": "man: medium-light skin tone, red hair", "shortname": ":mediumlight_skin_tone_red_hair:", "unicode": "1F468 1F3FC 200D 1F9B0", "html": "👨🏼‍🦰", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏽🦰", "name": "man: medium skin tone, red hair", "shortname": ":medium_skin_tone_red_hair:", "unicode": "1F468 1F3FD 200D 1F9B0", "html": "👨🏽‍🦰", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏾🦰", "name": "man: medium-dark skin tone, red hair", "shortname": ":mediumdark_skin_tone_red_hair:", "unicode": "1F468 1F3FE 200D 1F9B0", "html": "👨🏾‍🦰", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏿🦰", "name": "man: dark skin tone, red hair", "shortname": ":dark_skin_tone_red_hair:", "unicode": "1F468 1F3FF 200D 1F9B0", "html": "👨🏿‍🦰", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🦱", "name": "man: curly hair", "shortname": ":curly_hair:", "unicode": "1F468 200D 1F9B1", "html": "👨‍🦱", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏻🦱", "name": "man: light skin tone, curly hair", "shortname": ":light_skin_tone_curly_hair:", "unicode": "1F468 1F3FB 200D 1F9B1", "html": "👨🏻‍🦱", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏼🦱", "name": "man: medium-light skin tone, curly hair", "shortname": ":mediumlight_skin_tone_curly_hair:", "unicode": "1F468 1F3FC 200D 1F9B1", "html": "👨🏼‍🦱", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏽🦱", "name": "man: medium skin tone, curly hair", "shortname": ":medium_skin_tone_curly_hair:", "unicode": "1F468 1F3FD 200D 1F9B1", "html": "👨🏽‍🦱", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏾🦱", "name": "man: medium-dark skin tone, curly hair", "shortname": ":mediumdark_skin_tone_curly_hair:", "unicode": "1F468 1F3FE 200D 1F9B1", "html": "👨🏾‍🦱", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏿🦱", "name": "man: dark skin tone, curly hair", "shortname": ":dark_skin_tone_curly_hair:", "unicode": "1F468 1F3FF 200D 1F9B1", "html": "👨🏿‍🦱", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🦳", "name": "man: white hair", "shortname": ":white_hair:", "unicode": "1F468 200D 1F9B3", "html": "👨‍🦳", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏻🦳", "name": "man: light skin tone, white hair", "shortname": ":light_skin_tone_white_hair:", "unicode": "1F468 1F3FB 200D 1F9B3", "html": "👨🏻‍🦳", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏼🦳", "name": "man: medium-light skin tone, white hair", "shortname": ":mediumlight_skin_tone_white_hair:", "unicode": "1F468 1F3FC 200D 1F9B3", "html": "👨🏼‍🦳", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏽🦳", "name": "man: medium skin tone, white hair", "shortname": ":medium_skin_tone_white_hair:", "unicode": "1F468 1F3FD 200D 1F9B3", "html": "👨🏽‍🦳", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏾🦳", "name": "man: medium-dark skin tone, white hair", "shortname": ":mediumdark_skin_tone_white_hair:", "unicode": "1F468 1F3FE 200D 1F9B3", "html": "👨🏾‍🦳", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏿🦳", "name": "man: dark skin tone, white hair", "shortname": ":dark_skin_tone_white_hair:", "unicode": "1F468 1F3FF 200D 1F9B3", "html": "👨🏿‍🦳", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🦲", "name": "man: bald", "shortname": ":bald:", "unicode": "1F468 200D 1F9B2", "html": "👨‍🦲", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏻🦲", "name": "man: light skin tone, bald", "shortname": ":light_skin_tone_bald:", "unicode": "1F468 1F3FB 200D 1F9B2", "html": "👨🏻‍🦲", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏼🦲", "name": "man: medium-light skin tone, bald", "shortname": ":mediumlight_skin_tone_bald:", "unicode": "1F468 1F3FC 200D 1F9B2", "html": "👨🏼‍🦲", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏽🦲", "name": "man: medium skin tone, bald", "shortname": ":medium_skin_tone_bald:", "unicode": "1F468 1F3FD 200D 1F9B2", "html": "👨🏽‍🦲", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏾🦲", "name": "man: medium-dark skin tone, bald", "shortname": ":mediumdark_skin_tone_bald:", "unicode": "1F468 1F3FE 200D 1F9B2", "html": "👨🏾‍🦲", "category": "People & Body (person)", "order": ""}, + {"emoji": "👨🏿🦲", "name": "man: dark skin tone, bald", "shortname": ":dark_skin_tone_bald:", "unicode": "1F468 1F3FF 200D 1F9B2", "html": "👨🏿‍🦲", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🦰", "name": "woman: red hair", "shortname": ":red_hair:", "unicode": "1F469 200D 1F9B0", "html": "👩‍🦰", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏻🦰", "name": "woman: light skin tone, red hair", "shortname": ":light_skin_tone_red_hair:", "unicode": "1F469 1F3FB 200D 1F9B0", "html": "👩🏻‍🦰", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏼🦰", "name": "woman: medium-light skin tone, red hair", "shortname": ":mediumlight_skin_tone_red_hair:", "unicode": "1F469 1F3FC 200D 1F9B0", "html": "👩🏼‍🦰", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏽🦰", "name": "woman: medium skin tone, red hair", "shortname": ":medium_skin_tone_red_hair:", "unicode": "1F469 1F3FD 200D 1F9B0", "html": "👩🏽‍🦰", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏾🦰", "name": "woman: medium-dark skin tone, red hair", "shortname": ":mediumdark_skin_tone_red_hair:", "unicode": "1F469 1F3FE 200D 1F9B0", "html": "👩🏾‍🦰", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏿🦰", "name": "woman: dark skin tone, red hair", "shortname": ":dark_skin_tone_red_hair:", "unicode": "1F469 1F3FF 200D 1F9B0", "html": "👩🏿‍🦰", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🦰", "name": "person: red hair", "shortname": ":red_hair:", "unicode": "1F9D1 200D 1F9B0", "html": "🧑‍🦰", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏻🦰", "name": "person: light skin tone, red hair", "shortname": ":light_skin_tone_red_hair:", "unicode": "1F9D1 1F3FB 200D 1F9B0", "html": "🧑🏻‍🦰", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏼🦰", "name": "person: medium-light skin tone, red hair", "shortname": ":mediumlight_skin_tone_red_hair:", "unicode": "1F9D1 1F3FC 200D 1F9B0", "html": "🧑🏼‍🦰", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏽🦰", "name": "person: medium skin tone, red hair", "shortname": ":medium_skin_tone_red_hair:", "unicode": "1F9D1 1F3FD 200D 1F9B0", "html": "🧑🏽‍🦰", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏾🦰", "name": "person: medium-dark skin tone, red hair", "shortname": ":mediumdark_skin_tone_red_hair:", "unicode": "1F9D1 1F3FE 200D 1F9B0", "html": "🧑🏾‍🦰", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏿🦰", "name": "person: dark skin tone, red hair", "shortname": ":dark_skin_tone_red_hair:", "unicode": "1F9D1 1F3FF 200D 1F9B0", "html": "🧑🏿‍🦰", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🦱", "name": "woman: curly hair", "shortname": ":curly_hair:", "unicode": "1F469 200D 1F9B1", "html": "👩‍🦱", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏻🦱", "name": "woman: light skin tone, curly hair", "shortname": ":light_skin_tone_curly_hair:", "unicode": "1F469 1F3FB 200D 1F9B1", "html": "👩🏻‍🦱", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏼🦱", "name": "woman: medium-light skin tone, curly hair", "shortname": ":mediumlight_skin_tone_curly_hair:", "unicode": "1F469 1F3FC 200D 1F9B1", "html": "👩🏼‍🦱", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏽🦱", "name": "woman: medium skin tone, curly hair", "shortname": ":medium_skin_tone_curly_hair:", "unicode": "1F469 1F3FD 200D 1F9B1", "html": "👩🏽‍🦱", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏾🦱", "name": "woman: medium-dark skin tone, curly hair", "shortname": ":mediumdark_skin_tone_curly_hair:", "unicode": "1F469 1F3FE 200D 1F9B1", "html": "👩🏾‍🦱", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏿🦱", "name": "woman: dark skin tone, curly hair", "shortname": ":dark_skin_tone_curly_hair:", "unicode": "1F469 1F3FF 200D 1F9B1", "html": "👩🏿‍🦱", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🦱", "name": "person: curly hair", "shortname": ":curly_hair:", "unicode": "1F9D1 200D 1F9B1", "html": "🧑‍🦱", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏻🦱", "name": "person: light skin tone, curly hair", "shortname": ":light_skin_tone_curly_hair:", "unicode": "1F9D1 1F3FB 200D 1F9B1", "html": "🧑🏻‍🦱", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏼🦱", "name": "person: medium-light skin tone, curly hair", "shortname": ":mediumlight_skin_tone_curly_hair:", "unicode": "1F9D1 1F3FC 200D 1F9B1", "html": "🧑🏼‍🦱", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏽🦱", "name": "person: medium skin tone, curly hair", "shortname": ":medium_skin_tone_curly_hair:", "unicode": "1F9D1 1F3FD 200D 1F9B1", "html": "🧑🏽‍🦱", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏾🦱", "name": "person: medium-dark skin tone, curly hair", "shortname": ":mediumdark_skin_tone_curly_hair:", "unicode": "1F9D1 1F3FE 200D 1F9B1", "html": "🧑🏾‍🦱", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏿🦱", "name": "person: dark skin tone, curly hair", "shortname": ":dark_skin_tone_curly_hair:", "unicode": "1F9D1 1F3FF 200D 1F9B1", "html": "🧑🏿‍🦱", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🦳", "name": "woman: white hair", "shortname": ":white_hair:", "unicode": "1F469 200D 1F9B3", "html": "👩‍🦳", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏻🦳", "name": "woman: light skin tone, white hair", "shortname": ":light_skin_tone_white_hair:", "unicode": "1F469 1F3FB 200D 1F9B3", "html": "👩🏻‍🦳", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏼🦳", "name": "woman: medium-light skin tone, white hair", "shortname": ":mediumlight_skin_tone_white_hair:", "unicode": "1F469 1F3FC 200D 1F9B3", "html": "👩🏼‍🦳", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏽🦳", "name": "woman: medium skin tone, white hair", "shortname": ":medium_skin_tone_white_hair:", "unicode": "1F469 1F3FD 200D 1F9B3", "html": "👩🏽‍🦳", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏾🦳", "name": "woman: medium-dark skin tone, white hair", "shortname": ":mediumdark_skin_tone_white_hair:", "unicode": "1F469 1F3FE 200D 1F9B3", "html": "👩🏾‍🦳", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏿🦳", "name": "woman: dark skin tone, white hair", "shortname": ":dark_skin_tone_white_hair:", "unicode": "1F469 1F3FF 200D 1F9B3", "html": "👩🏿‍🦳", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🦳", "name": "person: white hair", "shortname": ":white_hair:", "unicode": "1F9D1 200D 1F9B3", "html": "🧑‍🦳", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏻🦳", "name": "person: light skin tone, white hair", "shortname": ":light_skin_tone_white_hair:", "unicode": "1F9D1 1F3FB 200D 1F9B3", "html": "🧑🏻‍🦳", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏼🦳", "name": "person: medium-light skin tone, white hair", "shortname": ":mediumlight_skin_tone_white_hair:", "unicode": "1F9D1 1F3FC 200D 1F9B3", "html": "🧑🏼‍🦳", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏽🦳", "name": "person: medium skin tone, white hair", "shortname": ":medium_skin_tone_white_hair:", "unicode": "1F9D1 1F3FD 200D 1F9B3", "html": "🧑🏽‍🦳", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏾🦳", "name": "person: medium-dark skin tone, white hair", "shortname": ":mediumdark_skin_tone_white_hair:", "unicode": "1F9D1 1F3FE 200D 1F9B3", "html": "🧑🏾‍🦳", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏿🦳", "name": "person: dark skin tone, white hair", "shortname": ":dark_skin_tone_white_hair:", "unicode": "1F9D1 1F3FF 200D 1F9B3", "html": "🧑🏿‍🦳", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🦲", "name": "woman: bald", "shortname": ":bald:", "unicode": "1F469 200D 1F9B2", "html": "👩‍🦲", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏻🦲", "name": "woman: light skin tone, bald", "shortname": ":light_skin_tone_bald:", "unicode": "1F469 1F3FB 200D 1F9B2", "html": "👩🏻‍🦲", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏼🦲", "name": "woman: medium-light skin tone, bald", "shortname": ":mediumlight_skin_tone_bald:", "unicode": "1F469 1F3FC 200D 1F9B2", "html": "👩🏼‍🦲", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏽🦲", "name": "woman: medium skin tone, bald", "shortname": ":medium_skin_tone_bald:", "unicode": "1F469 1F3FD 200D 1F9B2", "html": "👩🏽‍🦲", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏾🦲", "name": "woman: medium-dark skin tone, bald", "shortname": ":mediumdark_skin_tone_bald:", "unicode": "1F469 1F3FE 200D 1F9B2", "html": "👩🏾‍🦲", "category": "People & Body (person)", "order": ""}, + {"emoji": "👩🏿🦲", "name": "woman: dark skin tone, bald", "shortname": ":dark_skin_tone_bald:", "unicode": "1F469 1F3FF 200D 1F9B2", "html": "👩🏿‍🦲", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🦲", "name": "person: bald", "shortname": ":bald:", "unicode": "1F9D1 200D 1F9B2", "html": "🧑‍🦲", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏻🦲", "name": "person: light skin tone, bald", "shortname": ":light_skin_tone_bald:", "unicode": "1F9D1 1F3FB 200D 1F9B2", "html": "🧑🏻‍🦲", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏼🦲", "name": "person: medium-light skin tone, bald", "shortname": ":mediumlight_skin_tone_bald:", "unicode": "1F9D1 1F3FC 200D 1F9B2", "html": "🧑🏼‍🦲", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏽🦲", "name": "person: medium skin tone, bald", "shortname": ":medium_skin_tone_bald:", "unicode": "1F9D1 1F3FD 200D 1F9B2", "html": "🧑🏽‍🦲", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏾🦲", "name": "person: medium-dark skin tone, bald", "shortname": ":mediumdark_skin_tone_bald:", "unicode": "1F9D1 1F3FE 200D 1F9B2", "html": "🧑🏾‍🦲", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧑🏿🦲", "name": "person: dark skin tone, bald", "shortname": ":dark_skin_tone_bald:", "unicode": "1F9D1 1F3FF 200D 1F9B2", "html": "🧑🏿‍🦲", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱♀️", "name": "woman: blond hair", "shortname": ":blond_hair:", "unicode": "1F471 200D 2640 FE0F", "html": "👱‍♀️", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏻♀️", "name": "woman: light skin tone, blond hair", "shortname": ":light_skin_tone_blond_hair:", "unicode": "1F471 1F3FB 200D 2640 FE0F", "html": "👱🏻‍♀️", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏼♀️", "name": "woman: medium-light skin tone, blond hair", "shortname": ":mediumlight_skin_tone_blond_hair:", "unicode": "1F471 1F3FC 200D 2640 FE0F", "html": "👱🏼‍♀️", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏽♀️", "name": "woman: medium skin tone, blond hair", "shortname": ":medium_skin_tone_blond_hair:", "unicode": "1F471 1F3FD 200D 2640 FE0F", "html": "👱🏽‍♀️", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏾♀️", "name": "woman: medium-dark skin tone, blond hair", "shortname": ":mediumdark_skin_tone_blond_hair:", "unicode": "1F471 1F3FE 200D 2640 FE0F", "html": "👱🏾‍♀️", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏿♀️", "name": "woman: dark skin tone, blond hair", "shortname": ":dark_skin_tone_blond_hair:", "unicode": "1F471 1F3FF 200D 2640 FE0F", "html": "👱🏿‍♀️", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱♂️", "name": "man: blond hair", "shortname": ":blond_hair:", "unicode": "1F471 200D 2642 FE0F", "html": "👱‍♂️", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱♂", "name": "man: blond hair", "shortname": ":blond_hair:", "unicode": "1F471 200D 2642", "html": "👱‍♂", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏻♂️", "name": "man: light skin tone, blond hair", "shortname": ":light_skin_tone_blond_hair:", "unicode": "1F471 1F3FB 200D 2642 FE0F", "html": "👱🏻‍♂️", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏻♂", "name": "man: light skin tone, blond hair", "shortname": ":light_skin_tone_blond_hair:", "unicode": "1F471 1F3FB 200D 2642", "html": "👱🏻‍♂", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏼♂️", "name": "man: medium-light skin tone, blond hair", "shortname": ":mediumlight_skin_tone_blond_hair:", "unicode": "1F471 1F3FC 200D 2642 FE0F", "html": "👱🏼‍♂️", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏼♂", "name": "man: medium-light skin tone, blond hair", "shortname": ":mediumlight_skin_tone_blond_hair:", "unicode": "1F471 1F3FC 200D 2642", "html": "👱🏼‍♂", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏽♂️", "name": "man: medium skin tone, blond hair", "shortname": ":medium_skin_tone_blond_hair:", "unicode": "1F471 1F3FD 200D 2642 FE0F", "html": "👱🏽‍♂️", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏽♂", "name": "man: medium skin tone, blond hair", "shortname": ":medium_skin_tone_blond_hair:", "unicode": "1F471 1F3FD 200D 2642", "html": "👱🏽‍♂", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏾♂️", "name": "man: medium-dark skin tone, blond hair", "shortname": ":mediumdark_skin_tone_blond_hair:", "unicode": "1F471 1F3FE 200D 2642 FE0F", "html": "👱🏾‍♂️", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏾♂", "name": "man: medium-dark skin tone, blond hair", "shortname": ":mediumdark_skin_tone_blond_hair:", "unicode": "1F471 1F3FE 200D 2642", "html": "👱🏾‍♂", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏿♂️", "name": "man: dark skin tone, blond hair", "shortname": ":dark_skin_tone_blond_hair:", "unicode": "1F471 1F3FF 200D 2642 FE0F", "html": "👱🏿‍♂️", "category": "People & Body (person)", "order": ""}, + {"emoji": "👱🏿♂", "name": "man: dark skin tone, blond hair", "shortname": ":dark_skin_tone_blond_hair:", "unicode": "1F471 1F3FF 200D 2642", "html": "👱🏿‍♂", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧓", "name": "older person", "shortname": ":older_person:", "unicode": "1F9D3", "html": "🧓", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧓🏻", "name": "older person: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D3 1F3FB", "html": "🧓🏻", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧓🏼", "name": "older person: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D3 1F3FC", "html": "🧓🏼", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧓🏽", "name": "older person: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D3 1F3FD", "html": "🧓🏽", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧓🏾", "name": "older person: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D3 1F3FE", "html": "🧓🏾", "category": "People & Body (person)", "order": ""}, + {"emoji": "🧓🏿", "name": "older person: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D3 1F3FF", "html": "🧓🏿", "category": "People & Body (person)", "order": ""}, + {"emoji": "🙍♂️", "name": "man frowning", "shortname": ":man_frowning:", "unicode": "1F64D 200D 2642 FE0F", "html": "🙍‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏻♂️", "name": "man frowning: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64D 1F3FB 200D 2642 FE0F", "html": "🙍🏻‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏼♂️", "name": "man frowning: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64D 1F3FC 200D 2642 FE0F", "html": "🙍🏼‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏽♂️", "name": "man frowning: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64D 1F3FD 200D 2642 FE0F", "html": "🙍🏽‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏾♂️", "name": "man frowning: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64D 1F3FE 200D 2642 FE0F", "html": "🙍🏾‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏿♂️", "name": "man frowning: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64D 1F3FF 200D 2642 FE0F", "html": "🙍🏿‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍♀️", "name": "woman frowning", "shortname": ":woman_frowning:", "unicode": "1F64D 200D 2640 FE0F", "html": "🙍‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍♀", "name": "woman frowning", "shortname": ":woman_frowning:", "unicode": "1F64D 200D 2640", "html": "🙍‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏻♀️", "name": "woman frowning: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64D 1F3FB 200D 2640 FE0F", "html": "🙍🏻‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏻♀", "name": "woman frowning: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64D 1F3FB 200D 2640", "html": "🙍🏻‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏼♀️", "name": "woman frowning: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64D 1F3FC 200D 2640 FE0F", "html": "🙍🏼‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏼♀", "name": "woman frowning: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64D 1F3FC 200D 2640", "html": "🙍🏼‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏽♀️", "name": "woman frowning: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64D 1F3FD 200D 2640 FE0F", "html": "🙍🏽‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏽♀", "name": "woman frowning: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64D 1F3FD 200D 2640", "html": "🙍🏽‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏾♀️", "name": "woman frowning: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64D 1F3FE 200D 2640 FE0F", "html": "🙍🏾‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏾♀", "name": "woman frowning: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64D 1F3FE 200D 2640", "html": "🙍🏾‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏿♀️", "name": "woman frowning: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64D 1F3FF 200D 2640 FE0F", "html": "🙍🏿‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙍🏿♀", "name": "woman frowning: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64D 1F3FF 200D 2640", "html": "🙍🏿‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎♂️", "name": "man pouting", "shortname": ":man_pouting:", "unicode": "1F64E 200D 2642 FE0F", "html": "🙎‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏻♂️", "name": "man pouting: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64E 1F3FB 200D 2642 FE0F", "html": "🙎🏻‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏼♂️", "name": "man pouting: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64E 1F3FC 200D 2642 FE0F", "html": "🙎🏼‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏽♂️", "name": "man pouting: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64E 1F3FD 200D 2642 FE0F", "html": "🙎🏽‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏾♂️", "name": "man pouting: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64E 1F3FE 200D 2642 FE0F", "html": "🙎🏾‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏿♂️", "name": "man pouting: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64E 1F3FF 200D 2642 FE0F", "html": "🙎🏿‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎♀️", "name": "woman pouting", "shortname": ":woman_pouting:", "unicode": "1F64E 200D 2640 FE0F", "html": "🙎‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎♀", "name": "woman pouting", "shortname": ":woman_pouting:", "unicode": "1F64E 200D 2640", "html": "🙎‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏻♀️", "name": "woman pouting: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64E 1F3FB 200D 2640 FE0F", "html": "🙎🏻‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏻♀", "name": "woman pouting: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64E 1F3FB 200D 2640", "html": "🙎🏻‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏼♀️", "name": "woman pouting: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64E 1F3FC 200D 2640 FE0F", "html": "🙎🏼‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏼♀", "name": "woman pouting: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64E 1F3FC 200D 2640", "html": "🙎🏼‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏽♀️", "name": "woman pouting: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64E 1F3FD 200D 2640 FE0F", "html": "🙎🏽‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏽♀", "name": "woman pouting: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64E 1F3FD 200D 2640", "html": "🙎🏽‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏾♀️", "name": "woman pouting: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64E 1F3FE 200D 2640 FE0F", "html": "🙎🏾‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏾♀", "name": "woman pouting: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64E 1F3FE 200D 2640", "html": "🙎🏾‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏿♀️", "name": "woman pouting: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64E 1F3FF 200D 2640 FE0F", "html": "🙎🏿‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙎🏿♀", "name": "woman pouting: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64E 1F3FF 200D 2640", "html": "🙎🏿‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅♂️", "name": "man gesturing NO", "shortname": ":man_gesturing_NO:", "unicode": "1F645 200D 2642 FE0F", "html": "🙅‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏻♂️", "name": "man gesturing NO: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F645 1F3FB 200D 2642 FE0F", "html": "🙅🏻‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏼♂️", "name": "man gesturing NO: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F645 1F3FC 200D 2642 FE0F", "html": "🙅🏼‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏽♂️", "name": "man gesturing NO: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F645 1F3FD 200D 2642 FE0F", "html": "🙅🏽‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏾♂️", "name": "man gesturing NO: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F645 1F3FE 200D 2642 FE0F", "html": "🙅🏾‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏿♂️", "name": "man gesturing NO: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F645 1F3FF 200D 2642 FE0F", "html": "🙅🏿‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅♀️", "name": "woman gesturing NO", "shortname": ":woman_gesturing_NO:", "unicode": "1F645 200D 2640 FE0F", "html": "🙅‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅♀", "name": "woman gesturing NO", "shortname": ":woman_gesturing_NO:", "unicode": "1F645 200D 2640", "html": "🙅‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏻♀️", "name": "woman gesturing NO: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F645 1F3FB 200D 2640 FE0F", "html": "🙅🏻‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏻♀", "name": "woman gesturing NO: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F645 1F3FB 200D 2640", "html": "🙅🏻‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏼♀️", "name": "woman gesturing NO: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F645 1F3FC 200D 2640 FE0F", "html": "🙅🏼‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏼♀", "name": "woman gesturing NO: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F645 1F3FC 200D 2640", "html": "🙅🏼‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏽♀️", "name": "woman gesturing NO: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F645 1F3FD 200D 2640 FE0F", "html": "🙅🏽‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏽♀", "name": "woman gesturing NO: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F645 1F3FD 200D 2640", "html": "🙅🏽‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏾♀️", "name": "woman gesturing NO: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F645 1F3FE 200D 2640 FE0F", "html": "🙅🏾‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏾♀", "name": "woman gesturing NO: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F645 1F3FE 200D 2640", "html": "🙅🏾‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏿♀️", "name": "woman gesturing NO: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F645 1F3FF 200D 2640 FE0F", "html": "🙅🏿‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙅🏿♀", "name": "woman gesturing NO: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F645 1F3FF 200D 2640", "html": "🙅🏿‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆♂️", "name": "man gesturing OK", "shortname": ":man_gesturing_OK:", "unicode": "1F646 200D 2642 FE0F", "html": "🙆‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏻♂️", "name": "man gesturing OK: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F646 1F3FB 200D 2642 FE0F", "html": "🙆🏻‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏼♂️", "name": "man gesturing OK: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F646 1F3FC 200D 2642 FE0F", "html": "🙆🏼‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏽♂️", "name": "man gesturing OK: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F646 1F3FD 200D 2642 FE0F", "html": "🙆🏽‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏾♂️", "name": "man gesturing OK: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F646 1F3FE 200D 2642 FE0F", "html": "🙆🏾‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏿♂️", "name": "man gesturing OK: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F646 1F3FF 200D 2642 FE0F", "html": "🙆🏿‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆♀️", "name": "woman gesturing OK", "shortname": ":woman_gesturing_OK:", "unicode": "1F646 200D 2640 FE0F", "html": "🙆‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆♀", "name": "woman gesturing OK", "shortname": ":woman_gesturing_OK:", "unicode": "1F646 200D 2640", "html": "🙆‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏻♀️", "name": "woman gesturing OK: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F646 1F3FB 200D 2640 FE0F", "html": "🙆🏻‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏻♀", "name": "woman gesturing OK: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F646 1F3FB 200D 2640", "html": "🙆🏻‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏼♀️", "name": "woman gesturing OK: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F646 1F3FC 200D 2640 FE0F", "html": "🙆🏼‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏼♀", "name": "woman gesturing OK: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F646 1F3FC 200D 2640", "html": "🙆🏼‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏽♀️", "name": "woman gesturing OK: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F646 1F3FD 200D 2640 FE0F", "html": "🙆🏽‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏽♀", "name": "woman gesturing OK: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F646 1F3FD 200D 2640", "html": "🙆🏽‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏾♀️", "name": "woman gesturing OK: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F646 1F3FE 200D 2640 FE0F", "html": "🙆🏾‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏾♀", "name": "woman gesturing OK: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F646 1F3FE 200D 2640", "html": "🙆🏾‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏿♀️", "name": "woman gesturing OK: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F646 1F3FF 200D 2640 FE0F", "html": "🙆🏿‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙆🏿♀", "name": "woman gesturing OK: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F646 1F3FF 200D 2640", "html": "🙆🏿‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁♂️", "name": "man tipping hand", "shortname": ":man_tipping_hand:", "unicode": "1F481 200D 2642 FE0F", "html": "💁‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏻♂️", "name": "man tipping hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F481 1F3FB 200D 2642 FE0F", "html": "💁🏻‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏼♂️", "name": "man tipping hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F481 1F3FC 200D 2642 FE0F", "html": "💁🏼‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏽♂️", "name": "man tipping hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F481 1F3FD 200D 2642 FE0F", "html": "💁🏽‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏾♂️", "name": "man tipping hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F481 1F3FE 200D 2642 FE0F", "html": "💁🏾‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏿♂️", "name": "man tipping hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F481 1F3FF 200D 2642 FE0F", "html": "💁🏿‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁♀️", "name": "woman tipping hand", "shortname": ":woman_tipping_hand:", "unicode": "1F481 200D 2640 FE0F", "html": "💁‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁♀", "name": "woman tipping hand", "shortname": ":woman_tipping_hand:", "unicode": "1F481 200D 2640", "html": "💁‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏻♀️", "name": "woman tipping hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F481 1F3FB 200D 2640 FE0F", "html": "💁🏻‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏻♀", "name": "woman tipping hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F481 1F3FB 200D 2640", "html": "💁🏻‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏼♀️", "name": "woman tipping hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F481 1F3FC 200D 2640 FE0F", "html": "💁🏼‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏼♀", "name": "woman tipping hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F481 1F3FC 200D 2640", "html": "💁🏼‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏽♀️", "name": "woman tipping hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F481 1F3FD 200D 2640 FE0F", "html": "💁🏽‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏽♀", "name": "woman tipping hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F481 1F3FD 200D 2640", "html": "💁🏽‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏾♀️", "name": "woman tipping hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F481 1F3FE 200D 2640 FE0F", "html": "💁🏾‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏾♀", "name": "woman tipping hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F481 1F3FE 200D 2640", "html": "💁🏾‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏿♀️", "name": "woman tipping hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F481 1F3FF 200D 2640 FE0F", "html": "💁🏿‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "💁🏿♀", "name": "woman tipping hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F481 1F3FF 200D 2640", "html": "💁🏿‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋♂️", "name": "man raising hand", "shortname": ":man_raising_hand:", "unicode": "1F64B 200D 2642 FE0F", "html": "🙋‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏻♂️", "name": "man raising hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64B 1F3FB 200D 2642 FE0F", "html": "🙋🏻‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏼♂️", "name": "man raising hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64B 1F3FC 200D 2642 FE0F", "html": "🙋🏼‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏽♂️", "name": "man raising hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64B 1F3FD 200D 2642 FE0F", "html": "🙋🏽‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏾♂️", "name": "man raising hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64B 1F3FE 200D 2642 FE0F", "html": "🙋🏾‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏿♂️", "name": "man raising hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64B 1F3FF 200D 2642 FE0F", "html": "🙋🏿‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋♀️", "name": "woman raising hand", "shortname": ":woman_raising_hand:", "unicode": "1F64B 200D 2640 FE0F", "html": "🙋‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋♀", "name": "woman raising hand", "shortname": ":woman_raising_hand:", "unicode": "1F64B 200D 2640", "html": "🙋‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏻♀️", "name": "woman raising hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64B 1F3FB 200D 2640 FE0F", "html": "🙋🏻‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏻♀", "name": "woman raising hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64B 1F3FB 200D 2640", "html": "🙋🏻‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏼♀️", "name": "woman raising hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64B 1F3FC 200D 2640 FE0F", "html": "🙋🏼‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏼♀", "name": "woman raising hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64B 1F3FC 200D 2640", "html": "🙋🏼‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏽♀️", "name": "woman raising hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64B 1F3FD 200D 2640 FE0F", "html": "🙋🏽‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏽♀", "name": "woman raising hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64B 1F3FD 200D 2640", "html": "🙋🏽‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏾♀️", "name": "woman raising hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64B 1F3FE 200D 2640 FE0F", "html": "🙋🏾‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏾♀", "name": "woman raising hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64B 1F3FE 200D 2640", "html": "🙋🏾‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏿♀️", "name": "woman raising hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64B 1F3FF 200D 2640 FE0F", "html": "🙋🏿‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙋🏿♀", "name": "woman raising hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64B 1F3FF 200D 2640", "html": "🙋🏿‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏", "name": "deaf person", "shortname": ":deaf_person:", "unicode": "1F9CF", "html": "🧏", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏻", "name": "deaf person: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CF 1F3FB", "html": "🧏🏻", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏼", "name": "deaf person: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CF 1F3FC", "html": "🧏🏼", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏽", "name": "deaf person: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CF 1F3FD", "html": "🧏🏽", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏾", "name": "deaf person: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CF 1F3FE", "html": "🧏🏾", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏿", "name": "deaf person: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CF 1F3FF", "html": "🧏🏿", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏♂️", "name": "deaf man", "shortname": ":deaf_man:", "unicode": "1F9CF 200D 2642 FE0F", "html": "🧏‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏♂", "name": "deaf man", "shortname": ":deaf_man:", "unicode": "1F9CF 200D 2642", "html": "🧏‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏻♂️", "name": "deaf man: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CF 1F3FB 200D 2642 FE0F", "html": "🧏🏻‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏻♂", "name": "deaf man: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CF 1F3FB 200D 2642", "html": "🧏🏻‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏼♂️", "name": "deaf man: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CF 1F3FC 200D 2642 FE0F", "html": "🧏🏼‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏼♂", "name": "deaf man: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CF 1F3FC 200D 2642", "html": "🧏🏼‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏽♂️", "name": "deaf man: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CF 1F3FD 200D 2642 FE0F", "html": "🧏🏽‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏽♂", "name": "deaf man: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CF 1F3FD 200D 2642", "html": "🧏🏽‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏾♂️", "name": "deaf man: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CF 1F3FE 200D 2642 FE0F", "html": "🧏🏾‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏾♂", "name": "deaf man: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CF 1F3FE 200D 2642", "html": "🧏🏾‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏿♂️", "name": "deaf man: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CF 1F3FF 200D 2642 FE0F", "html": "🧏🏿‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏿♂", "name": "deaf man: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CF 1F3FF 200D 2642", "html": "🧏🏿‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏♀️", "name": "deaf woman", "shortname": ":deaf_woman:", "unicode": "1F9CF 200D 2640 FE0F", "html": "🧏‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏♀", "name": "deaf woman", "shortname": ":deaf_woman:", "unicode": "1F9CF 200D 2640", "html": "🧏‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏻♀️", "name": "deaf woman: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CF 1F3FB 200D 2640 FE0F", "html": "🧏🏻‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏻♀", "name": "deaf woman: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CF 1F3FB 200D 2640", "html": "🧏🏻‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏼♀️", "name": "deaf woman: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CF 1F3FC 200D 2640 FE0F", "html": "🧏🏼‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏼♀", "name": "deaf woman: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CF 1F3FC 200D 2640", "html": "🧏🏼‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏽♀️", "name": "deaf woman: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CF 1F3FD 200D 2640 FE0F", "html": "🧏🏽‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏽♀", "name": "deaf woman: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CF 1F3FD 200D 2640", "html": "🧏🏽‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏾♀️", "name": "deaf woman: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CF 1F3FE 200D 2640 FE0F", "html": "🧏🏾‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏾♀", "name": "deaf woman: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CF 1F3FE 200D 2640", "html": "🧏🏾‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏿♀️", "name": "deaf woman: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CF 1F3FF 200D 2640 FE0F", "html": "🧏🏿‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧏🏿♀", "name": "deaf woman: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CF 1F3FF 200D 2640", "html": "🧏🏿‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇♂️", "name": "man bowing", "shortname": ":man_bowing:", "unicode": "1F647 200D 2642 FE0F", "html": "🙇‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇♂", "name": "man bowing", "shortname": ":man_bowing:", "unicode": "1F647 200D 2642", "html": "🙇‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏻♂️", "name": "man bowing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F647 1F3FB 200D 2642 FE0F", "html": "🙇🏻‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏻♂", "name": "man bowing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F647 1F3FB 200D 2642", "html": "🙇🏻‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏼♂️", "name": "man bowing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F647 1F3FC 200D 2642 FE0F", "html": "🙇🏼‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏼♂", "name": "man bowing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F647 1F3FC 200D 2642", "html": "🙇🏼‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏽♂️", "name": "man bowing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F647 1F3FD 200D 2642 FE0F", "html": "🙇🏽‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏽♂", "name": "man bowing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F647 1F3FD 200D 2642", "html": "🙇🏽‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏾♂️", "name": "man bowing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F647 1F3FE 200D 2642 FE0F", "html": "🙇🏾‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏾♂", "name": "man bowing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F647 1F3FE 200D 2642", "html": "🙇🏾‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏿♂️", "name": "man bowing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F647 1F3FF 200D 2642 FE0F", "html": "🙇🏿‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏿♂", "name": "man bowing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F647 1F3FF 200D 2642", "html": "🙇🏿‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇♀️", "name": "woman bowing", "shortname": ":woman_bowing:", "unicode": "1F647 200D 2640 FE0F", "html": "🙇‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏻♀️", "name": "woman bowing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F647 1F3FB 200D 2640 FE0F", "html": "🙇🏻‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏼♀️", "name": "woman bowing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F647 1F3FC 200D 2640 FE0F", "html": "🙇🏼‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏽♀️", "name": "woman bowing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F647 1F3FD 200D 2640 FE0F", "html": "🙇🏽‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏾♀️", "name": "woman bowing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F647 1F3FE 200D 2640 FE0F", "html": "🙇🏾‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🙇🏿♀️", "name": "woman bowing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F647 1F3FF 200D 2640 FE0F", "html": "🙇🏿‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦", "name": "person facepalming", "shortname": ":person_facepalming:", "unicode": "1F926", "html": "🤦", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏻", "name": "person facepalming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F926 1F3FB", "html": "🤦🏻", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏼", "name": "person facepalming: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F926 1F3FC", "html": "🤦🏼", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏽", "name": "person facepalming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F926 1F3FD", "html": "🤦🏽", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏾", "name": "person facepalming: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F926 1F3FE", "html": "🤦🏾", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏿", "name": "person facepalming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F926 1F3FF", "html": "🤦🏿", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦♂️", "name": "man facepalming", "shortname": ":man_facepalming:", "unicode": "1F926 200D 2642 FE0F", "html": "🤦‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦♂", "name": "man facepalming", "shortname": ":man_facepalming:", "unicode": "1F926 200D 2642", "html": "🤦‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏻♂️", "name": "man facepalming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F926 1F3FB 200D 2642 FE0F", "html": "🤦🏻‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏻♂", "name": "man facepalming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F926 1F3FB 200D 2642", "html": "🤦🏻‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏼♂️", "name": "man facepalming: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F926 1F3FC 200D 2642 FE0F", "html": "🤦🏼‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏼♂", "name": "man facepalming: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F926 1F3FC 200D 2642", "html": "🤦🏼‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏽♂️", "name": "man facepalming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F926 1F3FD 200D 2642 FE0F", "html": "🤦🏽‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏽♂", "name": "man facepalming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F926 1F3FD 200D 2642", "html": "🤦🏽‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏾♂️", "name": "man facepalming: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F926 1F3FE 200D 2642 FE0F", "html": "🤦🏾‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏾♂", "name": "man facepalming: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F926 1F3FE 200D 2642", "html": "🤦🏾‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏿♂️", "name": "man facepalming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F926 1F3FF 200D 2642 FE0F", "html": "🤦🏿‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏿♂", "name": "man facepalming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F926 1F3FF 200D 2642", "html": "🤦🏿‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦♀️", "name": "woman facepalming", "shortname": ":woman_facepalming:", "unicode": "1F926 200D 2640 FE0F", "html": "🤦‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦♀", "name": "woman facepalming", "shortname": ":woman_facepalming:", "unicode": "1F926 200D 2640", "html": "🤦‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏻♀️", "name": "woman facepalming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F926 1F3FB 200D 2640 FE0F", "html": "🤦🏻‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏻♀", "name": "woman facepalming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F926 1F3FB 200D 2640", "html": "🤦🏻‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏼♀️", "name": "woman facepalming: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F926 1F3FC 200D 2640 FE0F", "html": "🤦🏼‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏼♀", "name": "woman facepalming: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F926 1F3FC 200D 2640", "html": "🤦🏼‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏽♀️", "name": "woman facepalming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F926 1F3FD 200D 2640 FE0F", "html": "🤦🏽‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏽♀", "name": "woman facepalming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F926 1F3FD 200D 2640", "html": "🤦🏽‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏾♀️", "name": "woman facepalming: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F926 1F3FE 200D 2640 FE0F", "html": "🤦🏾‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏾♀", "name": "woman facepalming: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F926 1F3FE 200D 2640", "html": "🤦🏾‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏿♀️", "name": "woman facepalming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F926 1F3FF 200D 2640 FE0F", "html": "🤦🏿‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤦🏿♀", "name": "woman facepalming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F926 1F3FF 200D 2640", "html": "🤦🏿‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷", "name": "person shrugging", "shortname": ":person_shrugging:", "unicode": "1F937", "html": "🤷", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏻", "name": "person shrugging: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F937 1F3FB", "html": "🤷🏻", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏼", "name": "person shrugging: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F937 1F3FC", "html": "🤷🏼", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏽", "name": "person shrugging: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F937 1F3FD", "html": "🤷🏽", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏾", "name": "person shrugging: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F937 1F3FE", "html": "🤷🏾", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏿", "name": "person shrugging: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F937 1F3FF", "html": "🤷🏿", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷♂️", "name": "man shrugging", "shortname": ":man_shrugging:", "unicode": "1F937 200D 2642 FE0F", "html": "🤷‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷♂", "name": "man shrugging", "shortname": ":man_shrugging:", "unicode": "1F937 200D 2642", "html": "🤷‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏻♂️", "name": "man shrugging: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F937 1F3FB 200D 2642 FE0F", "html": "🤷🏻‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏻♂", "name": "man shrugging: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F937 1F3FB 200D 2642", "html": "🤷🏻‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏼♂️", "name": "man shrugging: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F937 1F3FC 200D 2642 FE0F", "html": "🤷🏼‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏼♂", "name": "man shrugging: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F937 1F3FC 200D 2642", "html": "🤷🏼‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏽♂️", "name": "man shrugging: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F937 1F3FD 200D 2642 FE0F", "html": "🤷🏽‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏽♂", "name": "man shrugging: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F937 1F3FD 200D 2642", "html": "🤷🏽‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏾♂️", "name": "man shrugging: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F937 1F3FE 200D 2642 FE0F", "html": "🤷🏾‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏾♂", "name": "man shrugging: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F937 1F3FE 200D 2642", "html": "🤷🏾‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏿♂️", "name": "man shrugging: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F937 1F3FF 200D 2642 FE0F", "html": "🤷🏿‍♂️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏿♂", "name": "man shrugging: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F937 1F3FF 200D 2642", "html": "🤷🏿‍♂", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷♀️", "name": "woman shrugging", "shortname": ":woman_shrugging:", "unicode": "1F937 200D 2640 FE0F", "html": "🤷‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷♀", "name": "woman shrugging", "shortname": ":woman_shrugging:", "unicode": "1F937 200D 2640", "html": "🤷‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏻♀️", "name": "woman shrugging: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F937 1F3FB 200D 2640 FE0F", "html": "🤷🏻‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏻♀", "name": "woman shrugging: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F937 1F3FB 200D 2640", "html": "🤷🏻‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏼♀️", "name": "woman shrugging: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F937 1F3FC 200D 2640 FE0F", "html": "🤷🏼‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏼♀", "name": "woman shrugging: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F937 1F3FC 200D 2640", "html": "🤷🏼‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏽♀️", "name": "woman shrugging: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F937 1F3FD 200D 2640 FE0F", "html": "🤷🏽‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏽♀", "name": "woman shrugging: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F937 1F3FD 200D 2640", "html": "🤷🏽‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏾♀️", "name": "woman shrugging: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F937 1F3FE 200D 2640 FE0F", "html": "🤷🏾‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏾♀", "name": "woman shrugging: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F937 1F3FE 200D 2640", "html": "🤷🏾‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏿♀️", "name": "woman shrugging: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F937 1F3FF 200D 2640 FE0F", "html": "🤷🏿‍♀️", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🤷🏿♀", "name": "woman shrugging: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F937 1F3FF 200D 2640", "html": "🤷🏿‍♀", "category": "People & Body (person-gesture)", "order": ""}, + {"emoji": "🧑⚕️", "name": "health worker", "shortname": ":health_worker:", "unicode": "1F9D1 200D 2695 FE0F", "html": "🧑‍⚕️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑⚕", "name": "health worker", "shortname": ":health_worker:", "unicode": "1F9D1 200D 2695", "html": "🧑‍⚕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻⚕️", "name": "health worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 2695 FE0F", "html": "🧑🏻‍⚕️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻⚕", "name": "health worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 2695", "html": "🧑🏻‍⚕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼⚕️", "name": "health worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 2695 FE0F", "html": "🧑🏼‍⚕️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼⚕", "name": "health worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 2695", "html": "🧑🏼‍⚕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽⚕️", "name": "health worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 2695 FE0F", "html": "🧑🏽‍⚕️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽⚕", "name": "health worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 2695", "html": "🧑🏽‍⚕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾⚕️", "name": "health worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 2695 FE0F", "html": "🧑🏾‍⚕️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾⚕", "name": "health worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 2695", "html": "🧑🏾‍⚕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿⚕️", "name": "health worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 2695 FE0F", "html": "🧑🏿‍⚕️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿⚕", "name": "health worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 2695", "html": "🧑🏿‍⚕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨⚕️", "name": "man health worker", "shortname": ":man_health_worker:", "unicode": "1F468 200D 2695 FE0F", "html": "👨‍⚕️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨⚕", "name": "man health worker", "shortname": ":man_health_worker:", "unicode": "1F468 200D 2695", "html": "👨‍⚕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻⚕️", "name": "man health worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 2695 FE0F", "html": "👨🏻‍⚕️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻⚕", "name": "man health worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 2695", "html": "👨🏻‍⚕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼⚕️", "name": "man health worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 2695 FE0F", "html": "👨🏼‍⚕️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼⚕", "name": "man health worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 2695", "html": "👨🏼‍⚕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽⚕️", "name": "man health worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 2695 FE0F", "html": "👨🏽‍⚕️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽⚕", "name": "man health worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 2695", "html": "👨🏽‍⚕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾⚕️", "name": "man health worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 2695 FE0F", "html": "👨🏾‍⚕️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾⚕", "name": "man health worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 2695", "html": "👨🏾‍⚕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿⚕️", "name": "man health worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 2695 FE0F", "html": "👨🏿‍⚕️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿⚕", "name": "man health worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 2695", "html": "👨🏿‍⚕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩⚕️", "name": "woman health worker", "shortname": ":woman_health_worker:", "unicode": "1F469 200D 2695 FE0F", "html": "👩‍⚕️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩⚕", "name": "woman health worker", "shortname": ":woman_health_worker:", "unicode": "1F469 200D 2695", "html": "👩‍⚕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻⚕️", "name": "woman health worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 2695 FE0F", "html": "👩🏻‍⚕️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻⚕", "name": "woman health worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 2695", "html": "👩🏻‍⚕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼⚕️", "name": "woman health worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 2695 FE0F", "html": "👩🏼‍⚕️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼⚕", "name": "woman health worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 2695", "html": "👩🏼‍⚕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽⚕️", "name": "woman health worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 2695 FE0F", "html": "👩🏽‍⚕️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽⚕", "name": "woman health worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 2695", "html": "👩🏽‍⚕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾⚕️", "name": "woman health worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 2695 FE0F", "html": "👩🏾‍⚕️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾⚕", "name": "woman health worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 2695", "html": "👩🏾‍⚕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿⚕️", "name": "woman health worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 2695 FE0F", "html": "👩🏿‍⚕️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿⚕", "name": "woman health worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 2695", "html": "👩🏿‍⚕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🎓", "name": "student", "shortname": ":student:", "unicode": "1F9D1 200D 1F393", "html": "🧑‍🎓", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻🎓", "name": "student: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F393", "html": "🧑🏻‍🎓", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼🎓", "name": "student: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F393", "html": "🧑🏼‍🎓", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽🎓", "name": "student: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F393", "html": "🧑🏽‍🎓", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾🎓", "name": "student: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F393", "html": "🧑🏾‍🎓", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿🎓", "name": "student: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F393", "html": "🧑🏿‍🎓", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🎓", "name": "man student", "shortname": ":man_student:", "unicode": "1F468 200D 1F393", "html": "👨‍🎓", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻🎓", "name": "man student: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F393", "html": "👨🏻‍🎓", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼🎓", "name": "man student: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F393", "html": "👨🏼‍🎓", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽🎓", "name": "man student: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F393", "html": "👨🏽‍🎓", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾🎓", "name": "man student: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F393", "html": "👨🏾‍🎓", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿🎓", "name": "man student: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F393", "html": "👨🏿‍🎓", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🎓", "name": "woman student", "shortname": ":woman_student:", "unicode": "1F469 200D 1F393", "html": "👩‍🎓", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻🎓", "name": "woman student: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F393", "html": "👩🏻‍🎓", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼🎓", "name": "woman student: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F393", "html": "👩🏼‍🎓", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽🎓", "name": "woman student: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F393", "html": "👩🏽‍🎓", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾🎓", "name": "woman student: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F393", "html": "👩🏾‍🎓", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿🎓", "name": "woman student: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F393", "html": "👩🏿‍🎓", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏫", "name": "teacher", "shortname": ":teacher:", "unicode": "1F9D1 200D 1F3EB", "html": "🧑‍🏫", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻🏫", "name": "teacher: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F3EB", "html": "🧑🏻‍🏫", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼🏫", "name": "teacher: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F3EB", "html": "🧑🏼‍🏫", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽🏫", "name": "teacher: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F3EB", "html": "🧑🏽‍🏫", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾🏫", "name": "teacher: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F3EB", "html": "🧑🏾‍🏫", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿🏫", "name": "teacher: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F3EB", "html": "🧑🏿‍🏫", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏫", "name": "man teacher", "shortname": ":man_teacher:", "unicode": "1F468 200D 1F3EB", "html": "👨‍🏫", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻🏫", "name": "man teacher: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F3EB", "html": "👨🏻‍🏫", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼🏫", "name": "man teacher: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F3EB", "html": "👨🏼‍🏫", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽🏫", "name": "man teacher: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F3EB", "html": "👨🏽‍🏫", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾🏫", "name": "man teacher: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F3EB", "html": "👨🏾‍🏫", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿🏫", "name": "man teacher: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F3EB", "html": "👨🏿‍🏫", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏫", "name": "woman teacher", "shortname": ":woman_teacher:", "unicode": "1F469 200D 1F3EB", "html": "👩‍🏫", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻🏫", "name": "woman teacher: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F3EB", "html": "👩🏻‍🏫", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼🏫", "name": "woman teacher: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F3EB", "html": "👩🏼‍🏫", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽🏫", "name": "woman teacher: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F3EB", "html": "👩🏽‍🏫", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾🏫", "name": "woman teacher: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F3EB", "html": "👩🏾‍🏫", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿🏫", "name": "woman teacher: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F3EB", "html": "👩🏿‍🏫", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑⚖️", "name": "judge", "shortname": ":judge:", "unicode": "1F9D1 200D 2696 FE0F", "html": "🧑‍⚖️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑⚖", "name": "judge", "shortname": ":judge:", "unicode": "1F9D1 200D 2696", "html": "🧑‍⚖", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻⚖️", "name": "judge: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 2696 FE0F", "html": "🧑🏻‍⚖️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻⚖", "name": "judge: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 2696", "html": "🧑🏻‍⚖", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼⚖️", "name": "judge: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 2696 FE0F", "html": "🧑🏼‍⚖️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼⚖", "name": "judge: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 2696", "html": "🧑🏼‍⚖", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽⚖️", "name": "judge: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 2696 FE0F", "html": "🧑🏽‍⚖️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽⚖", "name": "judge: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 2696", "html": "🧑🏽‍⚖", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾⚖️", "name": "judge: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 2696 FE0F", "html": "🧑🏾‍⚖️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾⚖", "name": "judge: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 2696", "html": "🧑🏾‍⚖", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿⚖️", "name": "judge: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 2696 FE0F", "html": "🧑🏿‍⚖️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿⚖", "name": "judge: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 2696", "html": "🧑🏿‍⚖", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨⚖️", "name": "man judge", "shortname": ":man_judge:", "unicode": "1F468 200D 2696 FE0F", "html": "👨‍⚖️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨⚖", "name": "man judge", "shortname": ":man_judge:", "unicode": "1F468 200D 2696", "html": "👨‍⚖", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻⚖️", "name": "man judge: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 2696 FE0F", "html": "👨🏻‍⚖️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻⚖", "name": "man judge: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 2696", "html": "👨🏻‍⚖", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼⚖️", "name": "man judge: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 2696 FE0F", "html": "👨🏼‍⚖️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼⚖", "name": "man judge: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 2696", "html": "👨🏼‍⚖", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽⚖️", "name": "man judge: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 2696 FE0F", "html": "👨🏽‍⚖️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽⚖", "name": "man judge: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 2696", "html": "👨🏽‍⚖", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾⚖️", "name": "man judge: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 2696 FE0F", "html": "👨🏾‍⚖️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾⚖", "name": "man judge: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 2696", "html": "👨🏾‍⚖", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿⚖️", "name": "man judge: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 2696 FE0F", "html": "👨🏿‍⚖️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿⚖", "name": "man judge: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 2696", "html": "👨🏿‍⚖", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩⚖️", "name": "woman judge", "shortname": ":woman_judge:", "unicode": "1F469 200D 2696 FE0F", "html": "👩‍⚖️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩⚖", "name": "woman judge", "shortname": ":woman_judge:", "unicode": "1F469 200D 2696", "html": "👩‍⚖", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻⚖️", "name": "woman judge: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 2696 FE0F", "html": "👩🏻‍⚖️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻⚖", "name": "woman judge: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 2696", "html": "👩🏻‍⚖", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼⚖️", "name": "woman judge: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 2696 FE0F", "html": "👩🏼‍⚖️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼⚖", "name": "woman judge: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 2696", "html": "👩🏼‍⚖", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽⚖️", "name": "woman judge: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 2696 FE0F", "html": "👩🏽‍⚖️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽⚖", "name": "woman judge: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 2696", "html": "👩🏽‍⚖", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾⚖️", "name": "woman judge: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 2696 FE0F", "html": "👩🏾‍⚖️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾⚖", "name": "woman judge: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 2696", "html": "👩🏾‍⚖", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿⚖️", "name": "woman judge: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 2696 FE0F", "html": "👩🏿‍⚖️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿⚖", "name": "woman judge: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 2696", "html": "👩🏿‍⚖", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🌾", "name": "farmer", "shortname": ":farmer:", "unicode": "1F9D1 200D 1F33E", "html": "🧑‍🌾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻🌾", "name": "farmer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F33E", "html": "🧑🏻‍🌾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼🌾", "name": "farmer: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F33E", "html": "🧑🏼‍🌾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽🌾", "name": "farmer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F33E", "html": "🧑🏽‍🌾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾🌾", "name": "farmer: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F33E", "html": "🧑🏾‍🌾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿🌾", "name": "farmer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F33E", "html": "🧑🏿‍🌾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🌾", "name": "man farmer", "shortname": ":man_farmer:", "unicode": "1F468 200D 1F33E", "html": "👨‍🌾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻🌾", "name": "man farmer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F33E", "html": "👨🏻‍🌾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼🌾", "name": "man farmer: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F33E", "html": "👨🏼‍🌾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽🌾", "name": "man farmer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F33E", "html": "👨🏽‍🌾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾🌾", "name": "man farmer: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F33E", "html": "👨🏾‍🌾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿🌾", "name": "man farmer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F33E", "html": "👨🏿‍🌾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🌾", "name": "woman farmer", "shortname": ":woman_farmer:", "unicode": "1F469 200D 1F33E", "html": "👩‍🌾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻🌾", "name": "woman farmer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F33E", "html": "👩🏻‍🌾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼🌾", "name": "woman farmer: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F33E", "html": "👩🏼‍🌾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽🌾", "name": "woman farmer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F33E", "html": "👩🏽‍🌾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾🌾", "name": "woman farmer: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F33E", "html": "👩🏾‍🌾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿🌾", "name": "woman farmer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F33E", "html": "👩🏿‍🌾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🍳", "name": "cook", "shortname": ":cook:", "unicode": "1F9D1 200D 1F373", "html": "🧑‍🍳", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻🍳", "name": "cook: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F373", "html": "🧑🏻‍🍳", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼🍳", "name": "cook: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F373", "html": "🧑🏼‍🍳", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽🍳", "name": "cook: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F373", "html": "🧑🏽‍🍳", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾🍳", "name": "cook: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F373", "html": "🧑🏾‍🍳", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿🍳", "name": "cook: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F373", "html": "🧑🏿‍🍳", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🍳", "name": "man cook", "shortname": ":man_cook:", "unicode": "1F468 200D 1F373", "html": "👨‍🍳", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻🍳", "name": "man cook: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F373", "html": "👨🏻‍🍳", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼🍳", "name": "man cook: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F373", "html": "👨🏼‍🍳", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽🍳", "name": "man cook: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F373", "html": "👨🏽‍🍳", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾🍳", "name": "man cook: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F373", "html": "👨🏾‍🍳", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿🍳", "name": "man cook: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F373", "html": "👨🏿‍🍳", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🍳", "name": "woman cook", "shortname": ":woman_cook:", "unicode": "1F469 200D 1F373", "html": "👩‍🍳", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻🍳", "name": "woman cook: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F373", "html": "👩🏻‍🍳", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼🍳", "name": "woman cook: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F373", "html": "👩🏼‍🍳", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽🍳", "name": "woman cook: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F373", "html": "👩🏽‍🍳", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾🍳", "name": "woman cook: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F373", "html": "👩🏾‍🍳", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿🍳", "name": "woman cook: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F373", "html": "👩🏿‍🍳", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🔧", "name": "mechanic", "shortname": ":mechanic:", "unicode": "1F9D1 200D 1F527", "html": "🧑‍🔧", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻🔧", "name": "mechanic: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F527", "html": "🧑🏻‍🔧", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼🔧", "name": "mechanic: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F527", "html": "🧑🏼‍🔧", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽🔧", "name": "mechanic: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F527", "html": "🧑🏽‍🔧", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾🔧", "name": "mechanic: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F527", "html": "🧑🏾‍🔧", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿🔧", "name": "mechanic: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F527", "html": "🧑🏿‍🔧", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🔧", "name": "man mechanic", "shortname": ":man_mechanic:", "unicode": "1F468 200D 1F527", "html": "👨‍🔧", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻🔧", "name": "man mechanic: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F527", "html": "👨🏻‍🔧", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼🔧", "name": "man mechanic: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F527", "html": "👨🏼‍🔧", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽🔧", "name": "man mechanic: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F527", "html": "👨🏽‍🔧", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾🔧", "name": "man mechanic: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F527", "html": "👨🏾‍🔧", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿🔧", "name": "man mechanic: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F527", "html": "👨🏿‍🔧", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🔧", "name": "woman mechanic", "shortname": ":woman_mechanic:", "unicode": "1F469 200D 1F527", "html": "👩‍🔧", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻🔧", "name": "woman mechanic: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F527", "html": "👩🏻‍🔧", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼🔧", "name": "woman mechanic: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F527", "html": "👩🏼‍🔧", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽🔧", "name": "woman mechanic: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F527", "html": "👩🏽‍🔧", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾🔧", "name": "woman mechanic: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F527", "html": "👩🏾‍🔧", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿🔧", "name": "woman mechanic: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F527", "html": "👩🏿‍🔧", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏭", "name": "factory worker", "shortname": ":factory_worker:", "unicode": "1F9D1 200D 1F3ED", "html": "🧑‍🏭", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻🏭", "name": "factory worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F3ED", "html": "🧑🏻‍🏭", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼🏭", "name": "factory worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F3ED", "html": "🧑🏼‍🏭", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽🏭", "name": "factory worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F3ED", "html": "🧑🏽‍🏭", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾🏭", "name": "factory worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F3ED", "html": "🧑🏾‍🏭", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿🏭", "name": "factory worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F3ED", "html": "🧑🏿‍🏭", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏭", "name": "man factory worker", "shortname": ":man_factory_worker:", "unicode": "1F468 200D 1F3ED", "html": "👨‍🏭", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻🏭", "name": "man factory worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F3ED", "html": "👨🏻‍🏭", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼🏭", "name": "man factory worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F3ED", "html": "👨🏼‍🏭", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽🏭", "name": "man factory worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F3ED", "html": "👨🏽‍🏭", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾🏭", "name": "man factory worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F3ED", "html": "👨🏾‍🏭", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿🏭", "name": "man factory worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F3ED", "html": "👨🏿‍🏭", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏭", "name": "woman factory worker", "shortname": ":woman_factory_worker:", "unicode": "1F469 200D 1F3ED", "html": "👩‍🏭", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻🏭", "name": "woman factory worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F3ED", "html": "👩🏻‍🏭", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼🏭", "name": "woman factory worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F3ED", "html": "👩🏼‍🏭", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽🏭", "name": "woman factory worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F3ED", "html": "👩🏽‍🏭", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾🏭", "name": "woman factory worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F3ED", "html": "👩🏾‍🏭", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿🏭", "name": "woman factory worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F3ED", "html": "👩🏿‍🏭", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑💼", "name": "office worker", "shortname": ":office_worker:", "unicode": "1F9D1 200D 1F4BC", "html": "🧑‍💼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻💼", "name": "office worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F4BC", "html": "🧑🏻‍💼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼💼", "name": "office worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F4BC", "html": "🧑🏼‍💼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽💼", "name": "office worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F4BC", "html": "🧑🏽‍💼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾💼", "name": "office worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F4BC", "html": "🧑🏾‍💼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿💼", "name": "office worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F4BC", "html": "🧑🏿‍💼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨💼", "name": "man office worker", "shortname": ":man_office_worker:", "unicode": "1F468 200D 1F4BC", "html": "👨‍💼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻💼", "name": "man office worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F4BC", "html": "👨🏻‍💼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼💼", "name": "man office worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F4BC", "html": "👨🏼‍💼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽💼", "name": "man office worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F4BC", "html": "👨🏽‍💼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾💼", "name": "man office worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F4BC", "html": "👨🏾‍💼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿💼", "name": "man office worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F4BC", "html": "👨🏿‍💼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩💼", "name": "woman office worker", "shortname": ":woman_office_worker:", "unicode": "1F469 200D 1F4BC", "html": "👩‍💼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻💼", "name": "woman office worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F4BC", "html": "👩🏻‍💼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼💼", "name": "woman office worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F4BC", "html": "👩🏼‍💼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽💼", "name": "woman office worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F4BC", "html": "👩🏽‍💼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾💼", "name": "woman office worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F4BC", "html": "👩🏾‍💼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿💼", "name": "woman office worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F4BC", "html": "👩🏿‍💼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🔬", "name": "scientist", "shortname": ":scientist:", "unicode": "1F9D1 200D 1F52C", "html": "🧑‍🔬", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻🔬", "name": "scientist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F52C", "html": "🧑🏻‍🔬", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼🔬", "name": "scientist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F52C", "html": "🧑🏼‍🔬", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽🔬", "name": "scientist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F52C", "html": "🧑🏽‍🔬", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾🔬", "name": "scientist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F52C", "html": "🧑🏾‍🔬", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿🔬", "name": "scientist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F52C", "html": "🧑🏿‍🔬", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🔬", "name": "man scientist", "shortname": ":man_scientist:", "unicode": "1F468 200D 1F52C", "html": "👨‍🔬", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻🔬", "name": "man scientist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F52C", "html": "👨🏻‍🔬", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼🔬", "name": "man scientist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F52C", "html": "👨🏼‍🔬", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽🔬", "name": "man scientist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F52C", "html": "👨🏽‍🔬", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾🔬", "name": "man scientist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F52C", "html": "👨🏾‍🔬", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿🔬", "name": "man scientist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F52C", "html": "👨🏿‍🔬", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🔬", "name": "woman scientist", "shortname": ":woman_scientist:", "unicode": "1F469 200D 1F52C", "html": "👩‍🔬", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻🔬", "name": "woman scientist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F52C", "html": "👩🏻‍🔬", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼🔬", "name": "woman scientist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F52C", "html": "👩🏼‍🔬", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽🔬", "name": "woman scientist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F52C", "html": "👩🏽‍🔬", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾🔬", "name": "woman scientist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F52C", "html": "👩🏾‍🔬", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿🔬", "name": "woman scientist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F52C", "html": "👩🏿‍🔬", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑💻", "name": "technologist", "shortname": ":technologist:", "unicode": "1F9D1 200D 1F4BB", "html": "🧑‍💻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻💻", "name": "technologist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F4BB", "html": "🧑🏻‍💻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼💻", "name": "technologist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F4BB", "html": "🧑🏼‍💻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽💻", "name": "technologist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F4BB", "html": "🧑🏽‍💻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾💻", "name": "technologist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F4BB", "html": "🧑🏾‍💻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿💻", "name": "technologist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F4BB", "html": "🧑🏿‍💻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨💻", "name": "man technologist", "shortname": ":man_technologist:", "unicode": "1F468 200D 1F4BB", "html": "👨‍💻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻💻", "name": "man technologist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F4BB", "html": "👨🏻‍💻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼💻", "name": "man technologist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F4BB", "html": "👨🏼‍💻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽💻", "name": "man technologist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F4BB", "html": "👨🏽‍💻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾💻", "name": "man technologist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F4BB", "html": "👨🏾‍💻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿💻", "name": "man technologist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F4BB", "html": "👨🏿‍💻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩💻", "name": "woman technologist", "shortname": ":woman_technologist:", "unicode": "1F469 200D 1F4BB", "html": "👩‍💻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻💻", "name": "woman technologist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F4BB", "html": "👩🏻‍💻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼💻", "name": "woman technologist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F4BB", "html": "👩🏼‍💻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽💻", "name": "woman technologist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F4BB", "html": "👩🏽‍💻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾💻", "name": "woman technologist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F4BB", "html": "👩🏾‍💻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿💻", "name": "woman technologist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F4BB", "html": "👩🏿‍💻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🎤", "name": "singer", "shortname": ":singer:", "unicode": "1F9D1 200D 1F3A4", "html": "🧑‍🎤", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻🎤", "name": "singer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F3A4", "html": "🧑🏻‍🎤", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼🎤", "name": "singer: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F3A4", "html": "🧑🏼‍🎤", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽🎤", "name": "singer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F3A4", "html": "🧑🏽‍🎤", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾🎤", "name": "singer: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F3A4", "html": "🧑🏾‍🎤", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿🎤", "name": "singer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F3A4", "html": "🧑🏿‍🎤", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🎤", "name": "man singer", "shortname": ":man_singer:", "unicode": "1F468 200D 1F3A4", "html": "👨‍🎤", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻🎤", "name": "man singer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F3A4", "html": "👨🏻‍🎤", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼🎤", "name": "man singer: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F3A4", "html": "👨🏼‍🎤", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽🎤", "name": "man singer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F3A4", "html": "👨🏽‍🎤", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾🎤", "name": "man singer: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F3A4", "html": "👨🏾‍🎤", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿🎤", "name": "man singer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F3A4", "html": "👨🏿‍🎤", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🎤", "name": "woman singer", "shortname": ":woman_singer:", "unicode": "1F469 200D 1F3A4", "html": "👩‍🎤", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻🎤", "name": "woman singer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F3A4", "html": "👩🏻‍🎤", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼🎤", "name": "woman singer: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F3A4", "html": "👩🏼‍🎤", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽🎤", "name": "woman singer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F3A4", "html": "👩🏽‍🎤", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾🎤", "name": "woman singer: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F3A4", "html": "👩🏾‍🎤", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿🎤", "name": "woman singer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F3A4", "html": "👩🏿‍🎤", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🎨", "name": "artist", "shortname": ":artist:", "unicode": "1F9D1 200D 1F3A8", "html": "🧑‍🎨", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻🎨", "name": "artist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F3A8", "html": "🧑🏻‍🎨", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼🎨", "name": "artist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F3A8", "html": "🧑🏼‍🎨", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽🎨", "name": "artist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F3A8", "html": "🧑🏽‍🎨", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾🎨", "name": "artist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F3A8", "html": "🧑🏾‍🎨", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿🎨", "name": "artist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F3A8", "html": "🧑🏿‍🎨", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🎨", "name": "man artist", "shortname": ":man_artist:", "unicode": "1F468 200D 1F3A8", "html": "👨‍🎨", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻🎨", "name": "man artist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F3A8", "html": "👨🏻‍🎨", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼🎨", "name": "man artist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F3A8", "html": "👨🏼‍🎨", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽🎨", "name": "man artist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F3A8", "html": "👨🏽‍🎨", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾🎨", "name": "man artist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F3A8", "html": "👨🏾‍🎨", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿🎨", "name": "man artist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F3A8", "html": "👨🏿‍🎨", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🎨", "name": "woman artist", "shortname": ":woman_artist:", "unicode": "1F469 200D 1F3A8", "html": "👩‍🎨", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻🎨", "name": "woman artist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F3A8", "html": "👩🏻‍🎨", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼🎨", "name": "woman artist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F3A8", "html": "👩🏼‍🎨", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽🎨", "name": "woman artist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F3A8", "html": "👩🏽‍🎨", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾🎨", "name": "woman artist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F3A8", "html": "👩🏾‍🎨", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿🎨", "name": "woman artist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F3A8", "html": "👩🏿‍🎨", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑✈️", "name": "pilot", "shortname": ":pilot:", "unicode": "1F9D1 200D 2708 FE0F", "html": "🧑‍✈️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑✈", "name": "pilot", "shortname": ":pilot:", "unicode": "1F9D1 200D 2708", "html": "🧑‍✈", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻✈️", "name": "pilot: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 2708 FE0F", "html": "🧑🏻‍✈️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻✈", "name": "pilot: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 2708", "html": "🧑🏻‍✈", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼✈️", "name": "pilot: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 2708 FE0F", "html": "🧑🏼‍✈️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼✈", "name": "pilot: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 2708", "html": "🧑🏼‍✈", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽✈️", "name": "pilot: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 2708 FE0F", "html": "🧑🏽‍✈️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽✈", "name": "pilot: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 2708", "html": "🧑🏽‍✈", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾✈️", "name": "pilot: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 2708 FE0F", "html": "🧑🏾‍✈️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾✈", "name": "pilot: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 2708", "html": "🧑🏾‍✈", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿✈️", "name": "pilot: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 2708 FE0F", "html": "🧑🏿‍✈️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿✈", "name": "pilot: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 2708", "html": "🧑🏿‍✈", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨✈️", "name": "man pilot", "shortname": ":man_pilot:", "unicode": "1F468 200D 2708 FE0F", "html": "👨‍✈️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨✈", "name": "man pilot", "shortname": ":man_pilot:", "unicode": "1F468 200D 2708", "html": "👨‍✈", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻✈️", "name": "man pilot: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 2708 FE0F", "html": "👨🏻‍✈️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻✈", "name": "man pilot: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 2708", "html": "👨🏻‍✈", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼✈️", "name": "man pilot: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 2708 FE0F", "html": "👨🏼‍✈️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼✈", "name": "man pilot: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 2708", "html": "👨🏼‍✈", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽✈️", "name": "man pilot: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 2708 FE0F", "html": "👨🏽‍✈️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽✈", "name": "man pilot: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 2708", "html": "👨🏽‍✈", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾✈️", "name": "man pilot: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 2708 FE0F", "html": "👨🏾‍✈️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾✈", "name": "man pilot: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 2708", "html": "👨🏾‍✈", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿✈️", "name": "man pilot: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 2708 FE0F", "html": "👨🏿‍✈️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿✈", "name": "man pilot: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 2708", "html": "👨🏿‍✈", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩✈️", "name": "woman pilot", "shortname": ":woman_pilot:", "unicode": "1F469 200D 2708 FE0F", "html": "👩‍✈️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩✈", "name": "woman pilot", "shortname": ":woman_pilot:", "unicode": "1F469 200D 2708", "html": "👩‍✈", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻✈️", "name": "woman pilot: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 2708 FE0F", "html": "👩🏻‍✈️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻✈", "name": "woman pilot: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 2708", "html": "👩🏻‍✈", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼✈️", "name": "woman pilot: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 2708 FE0F", "html": "👩🏼‍✈️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼✈", "name": "woman pilot: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 2708", "html": "👩🏼‍✈", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽✈️", "name": "woman pilot: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 2708 FE0F", "html": "👩🏽‍✈️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽✈", "name": "woman pilot: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 2708", "html": "👩🏽‍✈", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾✈️", "name": "woman pilot: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 2708 FE0F", "html": "👩🏾‍✈️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾✈", "name": "woman pilot: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 2708", "html": "👩🏾‍✈", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿✈️", "name": "woman pilot: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 2708 FE0F", "html": "👩🏿‍✈️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿✈", "name": "woman pilot: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 2708", "html": "👩🏿‍✈", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🚀", "name": "astronaut", "shortname": ":astronaut:", "unicode": "1F9D1 200D 1F680", "html": "🧑‍🚀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻🚀", "name": "astronaut: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F680", "html": "🧑🏻‍🚀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼🚀", "name": "astronaut: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F680", "html": "🧑🏼‍🚀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽🚀", "name": "astronaut: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F680", "html": "🧑🏽‍🚀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾🚀", "name": "astronaut: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F680", "html": "🧑🏾‍🚀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿🚀", "name": "astronaut: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F680", "html": "🧑🏿‍🚀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🚀", "name": "man astronaut", "shortname": ":man_astronaut:", "unicode": "1F468 200D 1F680", "html": "👨‍🚀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻🚀", "name": "man astronaut: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F680", "html": "👨🏻‍🚀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼🚀", "name": "man astronaut: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F680", "html": "👨🏼‍🚀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽🚀", "name": "man astronaut: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F680", "html": "👨🏽‍🚀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾🚀", "name": "man astronaut: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F680", "html": "👨🏾‍🚀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿🚀", "name": "man astronaut: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F680", "html": "👨🏿‍🚀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🚀", "name": "woman astronaut", "shortname": ":woman_astronaut:", "unicode": "1F469 200D 1F680", "html": "👩‍🚀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻🚀", "name": "woman astronaut: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F680", "html": "👩🏻‍🚀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼🚀", "name": "woman astronaut: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F680", "html": "👩🏼‍🚀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽🚀", "name": "woman astronaut: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F680", "html": "👩🏽‍🚀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾🚀", "name": "woman astronaut: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F680", "html": "👩🏾‍🚀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿🚀", "name": "woman astronaut: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F680", "html": "👩🏿‍🚀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🚒", "name": "firefighter", "shortname": ":firefighter:", "unicode": "1F9D1 200D 1F692", "html": "🧑‍🚒", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏻🚒", "name": "firefighter: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F692", "html": "🧑🏻‍🚒", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏼🚒", "name": "firefighter: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F692", "html": "🧑🏼‍🚒", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏽🚒", "name": "firefighter: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F692", "html": "🧑🏽‍🚒", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏾🚒", "name": "firefighter: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F692", "html": "🧑🏾‍🚒", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧑🏿🚒", "name": "firefighter: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F692", "html": "🧑🏿‍🚒", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🚒", "name": "man firefighter", "shortname": ":man_firefighter:", "unicode": "1F468 200D 1F692", "html": "👨‍🚒", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏻🚒", "name": "man firefighter: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F692", "html": "👨🏻‍🚒", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏼🚒", "name": "man firefighter: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F692", "html": "👨🏼‍🚒", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏽🚒", "name": "man firefighter: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F692", "html": "👨🏽‍🚒", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏾🚒", "name": "man firefighter: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F692", "html": "👨🏾‍🚒", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👨🏿🚒", "name": "man firefighter: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F692", "html": "👨🏿‍🚒", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🚒", "name": "woman firefighter", "shortname": ":woman_firefighter:", "unicode": "1F469 200D 1F692", "html": "👩‍🚒", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏻🚒", "name": "woman firefighter: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F692", "html": "👩🏻‍🚒", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏼🚒", "name": "woman firefighter: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F692", "html": "👩🏼‍🚒", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏽🚒", "name": "woman firefighter: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F692", "html": "👩🏽‍🚒", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏾🚒", "name": "woman firefighter: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F692", "html": "👩🏾‍🚒", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👩🏿🚒", "name": "woman firefighter: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F692", "html": "👩🏿‍🚒", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮♂️", "name": "man police officer", "shortname": ":man_police_officer:", "unicode": "1F46E 200D 2642 FE0F", "html": "👮‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮♂", "name": "man police officer", "shortname": ":man_police_officer:", "unicode": "1F46E 200D 2642", "html": "👮‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏻♂️", "name": "man police officer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F46E 1F3FB 200D 2642 FE0F", "html": "👮🏻‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏻♂", "name": "man police officer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F46E 1F3FB 200D 2642", "html": "👮🏻‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏼♂️", "name": "man police officer: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F46E 1F3FC 200D 2642 FE0F", "html": "👮🏼‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏼♂", "name": "man police officer: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F46E 1F3FC 200D 2642", "html": "👮🏼‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏽♂️", "name": "man police officer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F46E 1F3FD 200D 2642 FE0F", "html": "👮🏽‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏽♂", "name": "man police officer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F46E 1F3FD 200D 2642", "html": "👮🏽‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏾♂️", "name": "man police officer: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F46E 1F3FE 200D 2642 FE0F", "html": "👮🏾‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏾♂", "name": "man police officer: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F46E 1F3FE 200D 2642", "html": "👮🏾‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏿♂️", "name": "man police officer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F46E 1F3FF 200D 2642 FE0F", "html": "👮🏿‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏿♂", "name": "man police officer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F46E 1F3FF 200D 2642", "html": "👮🏿‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮♀️", "name": "woman police officer", "shortname": ":woman_police_officer:", "unicode": "1F46E 200D 2640 FE0F", "html": "👮‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏻♀️", "name": "woman police officer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F46E 1F3FB 200D 2640 FE0F", "html": "👮🏻‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏼♀️", "name": "woman police officer: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F46E 1F3FC 200D 2640 FE0F", "html": "👮🏼‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏽♀️", "name": "woman police officer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F46E 1F3FD 200D 2640 FE0F", "html": "👮🏽‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏾♀️", "name": "woman police officer: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F46E 1F3FE 200D 2640 FE0F", "html": "👮🏾‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👮🏿♀️", "name": "woman police officer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F46E 1F3FF 200D 2640 FE0F", "html": "👮🏿‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵️", "name": "detective", "shortname": ":detective:", "unicode": "1F575 FE0F", "html": "🕵️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵️♂️", "name": "man detective", "shortname": ":man_detective:", "unicode": "1F575 FE0F 200D 2642 FE0F", "html": "🕵️‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵♂️", "name": "man detective", "shortname": ":man_detective:", "unicode": "1F575 200D 2642 FE0F", "html": "🕵‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵️♂", "name": "man detective", "shortname": ":man_detective:", "unicode": "1F575 FE0F 200D 2642", "html": "🕵️‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵♂", "name": "man detective", "shortname": ":man_detective:", "unicode": "1F575 200D 2642", "html": "🕵‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏻♂️", "name": "man detective: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F575 1F3FB 200D 2642 FE0F", "html": "🕵🏻‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏻♂", "name": "man detective: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F575 1F3FB 200D 2642", "html": "🕵🏻‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏼♂️", "name": "man detective: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F575 1F3FC 200D 2642 FE0F", "html": "🕵🏼‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏼♂", "name": "man detective: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F575 1F3FC 200D 2642", "html": "🕵🏼‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏽♂️", "name": "man detective: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F575 1F3FD 200D 2642 FE0F", "html": "🕵🏽‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏽♂", "name": "man detective: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F575 1F3FD 200D 2642", "html": "🕵🏽‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏾♂️", "name": "man detective: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F575 1F3FE 200D 2642 FE0F", "html": "🕵🏾‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏾♂", "name": "man detective: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F575 1F3FE 200D 2642", "html": "🕵🏾‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏿♂️", "name": "man detective: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F575 1F3FF 200D 2642 FE0F", "html": "🕵🏿‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏿♂", "name": "man detective: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F575 1F3FF 200D 2642", "html": "🕵🏿‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵️♀️", "name": "woman detective", "shortname": ":woman_detective:", "unicode": "1F575 FE0F 200D 2640 FE0F", "html": "🕵️‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵♀️", "name": "woman detective", "shortname": ":woman_detective:", "unicode": "1F575 200D 2640 FE0F", "html": "🕵‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵️♀", "name": "woman detective", "shortname": ":woman_detective:", "unicode": "1F575 FE0F 200D 2640", "html": "🕵️‍♀", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏻♀️", "name": "woman detective: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F575 1F3FB 200D 2640 FE0F", "html": "🕵🏻‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏼♀️", "name": "woman detective: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F575 1F3FC 200D 2640 FE0F", "html": "🕵🏼‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏽♀️", "name": "woman detective: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F575 1F3FD 200D 2640 FE0F", "html": "🕵🏽‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏾♀️", "name": "woman detective: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F575 1F3FE 200D 2640 FE0F", "html": "🕵🏾‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🕵🏿♀️", "name": "woman detective: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F575 1F3FF 200D 2640 FE0F", "html": "🕵🏿‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂♂️", "name": "man guard", "shortname": ":man_guard:", "unicode": "1F482 200D 2642 FE0F", "html": "💂‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂♂", "name": "man guard", "shortname": ":man_guard:", "unicode": "1F482 200D 2642", "html": "💂‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏻♂️", "name": "man guard: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F482 1F3FB 200D 2642 FE0F", "html": "💂🏻‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏻♂", "name": "man guard: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F482 1F3FB 200D 2642", "html": "💂🏻‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏼♂️", "name": "man guard: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F482 1F3FC 200D 2642 FE0F", "html": "💂🏼‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏼♂", "name": "man guard: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F482 1F3FC 200D 2642", "html": "💂🏼‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏽♂️", "name": "man guard: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F482 1F3FD 200D 2642 FE0F", "html": "💂🏽‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏽♂", "name": "man guard: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F482 1F3FD 200D 2642", "html": "💂🏽‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏾♂️", "name": "man guard: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F482 1F3FE 200D 2642 FE0F", "html": "💂🏾‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏾♂", "name": "man guard: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F482 1F3FE 200D 2642", "html": "💂🏾‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏿♂️", "name": "man guard: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F482 1F3FF 200D 2642 FE0F", "html": "💂🏿‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏿♂", "name": "man guard: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F482 1F3FF 200D 2642", "html": "💂🏿‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂♀️", "name": "woman guard", "shortname": ":woman_guard:", "unicode": "1F482 200D 2640 FE0F", "html": "💂‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏻♀️", "name": "woman guard: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F482 1F3FB 200D 2640 FE0F", "html": "💂🏻‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏼♀️", "name": "woman guard: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F482 1F3FC 200D 2640 FE0F", "html": "💂🏼‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏽♀️", "name": "woman guard: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F482 1F3FD 200D 2640 FE0F", "html": "💂🏽‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏾♀️", "name": "woman guard: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F482 1F3FE 200D 2640 FE0F", "html": "💂🏾‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "💂🏿♀️", "name": "woman guard: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F482 1F3FF 200D 2640 FE0F", "html": "💂🏿‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷♂️", "name": "man construction worker", "shortname": ":man_construction_worker:", "unicode": "1F477 200D 2642 FE0F", "html": "👷‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷♂", "name": "man construction worker", "shortname": ":man_construction_worker:", "unicode": "1F477 200D 2642", "html": "👷‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏻♂️", "name": "man construction worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F477 1F3FB 200D 2642 FE0F", "html": "👷🏻‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏻♂", "name": "man construction worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F477 1F3FB 200D 2642", "html": "👷🏻‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏼♂️", "name": "man construction worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F477 1F3FC 200D 2642 FE0F", "html": "👷🏼‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏼♂", "name": "man construction worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F477 1F3FC 200D 2642", "html": "👷🏼‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏽♂️", "name": "man construction worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F477 1F3FD 200D 2642 FE0F", "html": "👷🏽‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏽♂", "name": "man construction worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F477 1F3FD 200D 2642", "html": "👷🏽‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏾♂️", "name": "man construction worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F477 1F3FE 200D 2642 FE0F", "html": "👷🏾‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏾♂", "name": "man construction worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F477 1F3FE 200D 2642", "html": "👷🏾‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏿♂️", "name": "man construction worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F477 1F3FF 200D 2642 FE0F", "html": "👷🏿‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏿♂", "name": "man construction worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F477 1F3FF 200D 2642", "html": "👷🏿‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷♀️", "name": "woman construction worker", "shortname": ":woman_construction_worker:", "unicode": "1F477 200D 2640 FE0F", "html": "👷‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏻♀️", "name": "woman construction worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F477 1F3FB 200D 2640 FE0F", "html": "👷🏻‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏼♀️", "name": "woman construction worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F477 1F3FC 200D 2640 FE0F", "html": "👷🏼‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏽♀️", "name": "woman construction worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F477 1F3FD 200D 2640 FE0F", "html": "👷🏽‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏾♀️", "name": "woman construction worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F477 1F3FE 200D 2640 FE0F", "html": "👷🏾‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👷🏿♀️", "name": "woman construction worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F477 1F3FF 200D 2640 FE0F", "html": "👷🏿‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤴", "name": "prince", "shortname": ":prince:", "unicode": "1F934", "html": "🤴", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤴🏻", "name": "prince: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F934 1F3FB", "html": "🤴🏻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤴🏼", "name": "prince: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F934 1F3FC", "html": "🤴🏼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤴🏽", "name": "prince: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F934 1F3FD", "html": "🤴🏽", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤴🏾", "name": "prince: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F934 1F3FE", "html": "🤴🏾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤴🏿", "name": "prince: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F934 1F3FF", "html": "🤴🏿", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳♂️", "name": "man wearing turban", "shortname": ":man_wearing_turban:", "unicode": "1F473 200D 2642 FE0F", "html": "👳‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳♂", "name": "man wearing turban", "shortname": ":man_wearing_turban:", "unicode": "1F473 200D 2642", "html": "👳‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏻♂️", "name": "man wearing turban: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F473 1F3FB 200D 2642 FE0F", "html": "👳🏻‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏻♂", "name": "man wearing turban: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F473 1F3FB 200D 2642", "html": "👳🏻‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏼♂️", "name": "man wearing turban: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F473 1F3FC 200D 2642 FE0F", "html": "👳🏼‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏼♂", "name": "man wearing turban: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F473 1F3FC 200D 2642", "html": "👳🏼‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏽♂️", "name": "man wearing turban: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F473 1F3FD 200D 2642 FE0F", "html": "👳🏽‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏽♂", "name": "man wearing turban: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F473 1F3FD 200D 2642", "html": "👳🏽‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏾♂️", "name": "man wearing turban: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F473 1F3FE 200D 2642 FE0F", "html": "👳🏾‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏾♂", "name": "man wearing turban: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F473 1F3FE 200D 2642", "html": "👳🏾‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏿♂️", "name": "man wearing turban: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F473 1F3FF 200D 2642 FE0F", "html": "👳🏿‍♂️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏿♂", "name": "man wearing turban: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F473 1F3FF 200D 2642", "html": "👳🏿‍♂", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳♀️", "name": "woman wearing turban", "shortname": ":woman_wearing_turban:", "unicode": "1F473 200D 2640 FE0F", "html": "👳‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏻♀️", "name": "woman wearing turban: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F473 1F3FB 200D 2640 FE0F", "html": "👳🏻‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏼♀️", "name": "woman wearing turban: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F473 1F3FC 200D 2640 FE0F", "html": "👳🏼‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏽♀️", "name": "woman wearing turban: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F473 1F3FD 200D 2640 FE0F", "html": "👳🏽‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏾♀️", "name": "woman wearing turban: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F473 1F3FE 200D 2640 FE0F", "html": "👳🏾‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "👳🏿♀️", "name": "woman wearing turban: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F473 1F3FF 200D 2640 FE0F", "html": "👳🏿‍♀️", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧕", "name": "woman with headscarf", "shortname": ":woman_with_headscarf:", "unicode": "1F9D5", "html": "🧕", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧕🏻", "name": "woman with headscarf: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D5 1F3FB", "html": "🧕🏻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧕🏼", "name": "woman with headscarf: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D5 1F3FC", "html": "🧕🏼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧕🏽", "name": "woman with headscarf: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D5 1F3FD", "html": "🧕🏽", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧕🏾", "name": "woman with headscarf: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D5 1F3FE", "html": "🧕🏾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🧕🏿", "name": "woman with headscarf: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D5 1F3FF", "html": "🧕🏿", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤵", "name": "man in tuxedo", "shortname": ":man_in_tuxedo:", "unicode": "1F935", "html": "🤵", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤵🏻", "name": "man in tuxedo: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F935 1F3FB", "html": "🤵🏻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤵🏼", "name": "man in tuxedo: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F935 1F3FC", "html": "🤵🏼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤵🏽", "name": "man in tuxedo: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F935 1F3FD", "html": "🤵🏽", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤵🏾", "name": "man in tuxedo: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F935 1F3FE", "html": "🤵🏾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤵🏿", "name": "man in tuxedo: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F935 1F3FF", "html": "🤵🏿", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤰", "name": "pregnant woman", "shortname": ":pregnant_woman:", "unicode": "1F930", "html": "🤰", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤰🏻", "name": "pregnant woman: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F930 1F3FB", "html": "🤰🏻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤰🏼", "name": "pregnant woman: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F930 1F3FC", "html": "🤰🏼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤰🏽", "name": "pregnant woman: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F930 1F3FD", "html": "🤰🏽", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤰🏾", "name": "pregnant woman: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F930 1F3FE", "html": "🤰🏾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤰🏿", "name": "pregnant woman: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F930 1F3FF", "html": "🤰🏿", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤱", "name": "breast-feeding", "shortname": ":breastfeeding:", "unicode": "1F931", "html": "🤱", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤱🏻", "name": "breast-feeding: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F931 1F3FB", "html": "🤱🏻", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤱🏼", "name": "breast-feeding: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F931 1F3FC", "html": "🤱🏼", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤱🏽", "name": "breast-feeding: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F931 1F3FD", "html": "🤱🏽", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤱🏾", "name": "breast-feeding: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F931 1F3FE", "html": "🤱🏾", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤱🏿", "name": "breast-feeding: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F931 1F3FF", "html": "🤱🏿", "category": "People & Body (person-role)", "order": ""}, + {"emoji": "🤶", "name": "Mrs. Claus", "shortname": ":Mrs_Claus:", "unicode": "1F936", "html": "🤶", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🤶🏻", "name": "Mrs. Claus: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F936 1F3FB", "html": "🤶🏻", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🤶🏼", "name": "Mrs. Claus: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F936 1F3FC", "html": "🤶🏼", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🤶🏽", "name": "Mrs. Claus: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F936 1F3FD", "html": "🤶🏽", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🤶🏾", "name": "Mrs. Claus: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F936 1F3FE", "html": "🤶🏾", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🤶🏿", "name": "Mrs. Claus: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F936 1F3FF", "html": "🤶🏿", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸", "name": "superhero", "shortname": ":superhero:", "unicode": "1F9B8", "html": "🦸", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏻", "name": "superhero: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B8 1F3FB", "html": "🦸🏻", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏼", "name": "superhero: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B8 1F3FC", "html": "🦸🏼", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏽", "name": "superhero: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B8 1F3FD", "html": "🦸🏽", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏾", "name": "superhero: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B8 1F3FE", "html": "🦸🏾", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏿", "name": "superhero: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B8 1F3FF", "html": "🦸🏿", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸♂️", "name": "man superhero", "shortname": ":man_superhero:", "unicode": "1F9B8 200D 2642 FE0F", "html": "🦸‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸♂", "name": "man superhero", "shortname": ":man_superhero:", "unicode": "1F9B8 200D 2642", "html": "🦸‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏻♂️", "name": "man superhero: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B8 1F3FB 200D 2642 FE0F", "html": "🦸🏻‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏻♂", "name": "man superhero: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B8 1F3FB 200D 2642", "html": "🦸🏻‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏼♂️", "name": "man superhero: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B8 1F3FC 200D 2642 FE0F", "html": "🦸🏼‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏼♂", "name": "man superhero: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B8 1F3FC 200D 2642", "html": "🦸🏼‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏽♂️", "name": "man superhero: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B8 1F3FD 200D 2642 FE0F", "html": "🦸🏽‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏽♂", "name": "man superhero: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B8 1F3FD 200D 2642", "html": "🦸🏽‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏾♂️", "name": "man superhero: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B8 1F3FE 200D 2642 FE0F", "html": "🦸🏾‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏾♂", "name": "man superhero: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B8 1F3FE 200D 2642", "html": "🦸🏾‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏿♂️", "name": "man superhero: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B8 1F3FF 200D 2642 FE0F", "html": "🦸🏿‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏿♂", "name": "man superhero: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B8 1F3FF 200D 2642", "html": "🦸🏿‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸♀️", "name": "woman superhero", "shortname": ":woman_superhero:", "unicode": "1F9B8 200D 2640 FE0F", "html": "🦸‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸♀", "name": "woman superhero", "shortname": ":woman_superhero:", "unicode": "1F9B8 200D 2640", "html": "🦸‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏻♀️", "name": "woman superhero: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B8 1F3FB 200D 2640 FE0F", "html": "🦸🏻‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏻♀", "name": "woman superhero: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B8 1F3FB 200D 2640", "html": "🦸🏻‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏼♀️", "name": "woman superhero: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B8 1F3FC 200D 2640 FE0F", "html": "🦸🏼‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏼♀", "name": "woman superhero: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B8 1F3FC 200D 2640", "html": "🦸🏼‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏽♀️", "name": "woman superhero: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B8 1F3FD 200D 2640 FE0F", "html": "🦸🏽‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏽♀", "name": "woman superhero: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B8 1F3FD 200D 2640", "html": "🦸🏽‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏾♀️", "name": "woman superhero: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B8 1F3FE 200D 2640 FE0F", "html": "🦸🏾‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏾♀", "name": "woman superhero: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B8 1F3FE 200D 2640", "html": "🦸🏾‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏿♀️", "name": "woman superhero: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B8 1F3FF 200D 2640 FE0F", "html": "🦸🏿‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦸🏿♀", "name": "woman superhero: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B8 1F3FF 200D 2640", "html": "🦸🏿‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹", "name": "supervillain", "shortname": ":supervillain:", "unicode": "1F9B9", "html": "🦹", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏻", "name": "supervillain: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B9 1F3FB", "html": "🦹🏻", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏼", "name": "supervillain: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B9 1F3FC", "html": "🦹🏼", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏽", "name": "supervillain: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B9 1F3FD", "html": "🦹🏽", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏾", "name": "supervillain: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B9 1F3FE", "html": "🦹🏾", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏿", "name": "supervillain: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B9 1F3FF", "html": "🦹🏿", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹♂️", "name": "man supervillain", "shortname": ":man_supervillain:", "unicode": "1F9B9 200D 2642 FE0F", "html": "🦹‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹♂", "name": "man supervillain", "shortname": ":man_supervillain:", "unicode": "1F9B9 200D 2642", "html": "🦹‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏻♂️", "name": "man supervillain: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B9 1F3FB 200D 2642 FE0F", "html": "🦹🏻‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏻♂", "name": "man supervillain: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B9 1F3FB 200D 2642", "html": "🦹🏻‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏼♂️", "name": "man supervillain: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B9 1F3FC 200D 2642 FE0F", "html": "🦹🏼‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏼♂", "name": "man supervillain: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B9 1F3FC 200D 2642", "html": "🦹🏼‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏽♂️", "name": "man supervillain: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B9 1F3FD 200D 2642 FE0F", "html": "🦹🏽‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏽♂", "name": "man supervillain: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B9 1F3FD 200D 2642", "html": "🦹🏽‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏾♂️", "name": "man supervillain: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B9 1F3FE 200D 2642 FE0F", "html": "🦹🏾‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏾♂", "name": "man supervillain: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B9 1F3FE 200D 2642", "html": "🦹🏾‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏿♂️", "name": "man supervillain: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B9 1F3FF 200D 2642 FE0F", "html": "🦹🏿‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏿♂", "name": "man supervillain: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B9 1F3FF 200D 2642", "html": "🦹🏿‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹♀️", "name": "woman supervillain", "shortname": ":woman_supervillain:", "unicode": "1F9B9 200D 2640 FE0F", "html": "🦹‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹♀", "name": "woman supervillain", "shortname": ":woman_supervillain:", "unicode": "1F9B9 200D 2640", "html": "🦹‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏻♀️", "name": "woman supervillain: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B9 1F3FB 200D 2640 FE0F", "html": "🦹🏻‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏻♀", "name": "woman supervillain: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B9 1F3FB 200D 2640", "html": "🦹🏻‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏼♀️", "name": "woman supervillain: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B9 1F3FC 200D 2640 FE0F", "html": "🦹🏼‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏼♀", "name": "woman supervillain: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B9 1F3FC 200D 2640", "html": "🦹🏼‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏽♀️", "name": "woman supervillain: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B9 1F3FD 200D 2640 FE0F", "html": "🦹🏽‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏽♀", "name": "woman supervillain: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B9 1F3FD 200D 2640", "html": "🦹🏽‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏾♀️", "name": "woman supervillain: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B9 1F3FE 200D 2640 FE0F", "html": "🦹🏾‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏾♀", "name": "woman supervillain: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B9 1F3FE 200D 2640", "html": "🦹🏾‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏿♀️", "name": "woman supervillain: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B9 1F3FF 200D 2640 FE0F", "html": "🦹🏿‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🦹🏿♀", "name": "woman supervillain: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B9 1F3FF 200D 2640", "html": "🦹🏿‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙", "name": "mage", "shortname": ":mage:", "unicode": "1F9D9", "html": "🧙", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏻", "name": "mage: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D9 1F3FB", "html": "🧙🏻", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏼", "name": "mage: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D9 1F3FC", "html": "🧙🏼", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏽", "name": "mage: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D9 1F3FD", "html": "🧙🏽", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏾", "name": "mage: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D9 1F3FE", "html": "🧙🏾", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏿", "name": "mage: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D9 1F3FF", "html": "🧙🏿", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙♂️", "name": "man mage", "shortname": ":man_mage:", "unicode": "1F9D9 200D 2642 FE0F", "html": "🧙‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙♂", "name": "man mage", "shortname": ":man_mage:", "unicode": "1F9D9 200D 2642", "html": "🧙‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏻♂️", "name": "man mage: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D9 1F3FB 200D 2642 FE0F", "html": "🧙🏻‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏻♂", "name": "man mage: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D9 1F3FB 200D 2642", "html": "🧙🏻‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏼♂️", "name": "man mage: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D9 1F3FC 200D 2642 FE0F", "html": "🧙🏼‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏼♂", "name": "man mage: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D9 1F3FC 200D 2642", "html": "🧙🏼‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏽♂️", "name": "man mage: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D9 1F3FD 200D 2642 FE0F", "html": "🧙🏽‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏽♂", "name": "man mage: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D9 1F3FD 200D 2642", "html": "🧙🏽‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏾♂️", "name": "man mage: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D9 1F3FE 200D 2642 FE0F", "html": "🧙🏾‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏾♂", "name": "man mage: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D9 1F3FE 200D 2642", "html": "🧙🏾‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏿♂️", "name": "man mage: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D9 1F3FF 200D 2642 FE0F", "html": "🧙🏿‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏿♂", "name": "man mage: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D9 1F3FF 200D 2642", "html": "🧙🏿‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙♀️", "name": "woman mage", "shortname": ":woman_mage:", "unicode": "1F9D9 200D 2640 FE0F", "html": "🧙‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙♀", "name": "woman mage", "shortname": ":woman_mage:", "unicode": "1F9D9 200D 2640", "html": "🧙‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏻♀️", "name": "woman mage: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D9 1F3FB 200D 2640 FE0F", "html": "🧙🏻‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏻♀", "name": "woman mage: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D9 1F3FB 200D 2640", "html": "🧙🏻‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏼♀️", "name": "woman mage: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D9 1F3FC 200D 2640 FE0F", "html": "🧙🏼‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏼♀", "name": "woman mage: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D9 1F3FC 200D 2640", "html": "🧙🏼‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏽♀️", "name": "woman mage: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D9 1F3FD 200D 2640 FE0F", "html": "🧙🏽‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏽♀", "name": "woman mage: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D9 1F3FD 200D 2640", "html": "🧙🏽‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏾♀️", "name": "woman mage: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D9 1F3FE 200D 2640 FE0F", "html": "🧙🏾‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏾♀", "name": "woman mage: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D9 1F3FE 200D 2640", "html": "🧙🏾‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏿♀️", "name": "woman mage: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D9 1F3FF 200D 2640 FE0F", "html": "🧙🏿‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧙🏿♀", "name": "woman mage: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D9 1F3FF 200D 2640", "html": "🧙🏿‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚", "name": "fairy", "shortname": ":fairy:", "unicode": "1F9DA", "html": "🧚", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏻", "name": "fairy: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DA 1F3FB", "html": "🧚🏻", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏼", "name": "fairy: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DA 1F3FC", "html": "🧚🏼", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏽", "name": "fairy: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DA 1F3FD", "html": "🧚🏽", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏾", "name": "fairy: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DA 1F3FE", "html": "🧚🏾", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏿", "name": "fairy: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DA 1F3FF", "html": "🧚🏿", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚♂️", "name": "man fairy", "shortname": ":man_fairy:", "unicode": "1F9DA 200D 2642 FE0F", "html": "🧚‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚♂", "name": "man fairy", "shortname": ":man_fairy:", "unicode": "1F9DA 200D 2642", "html": "🧚‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏻♂️", "name": "man fairy: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DA 1F3FB 200D 2642 FE0F", "html": "🧚🏻‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏻♂", "name": "man fairy: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DA 1F3FB 200D 2642", "html": "🧚🏻‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏼♂️", "name": "man fairy: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DA 1F3FC 200D 2642 FE0F", "html": "🧚🏼‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏼♂", "name": "man fairy: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DA 1F3FC 200D 2642", "html": "🧚🏼‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏽♂️", "name": "man fairy: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DA 1F3FD 200D 2642 FE0F", "html": "🧚🏽‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏽♂", "name": "man fairy: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DA 1F3FD 200D 2642", "html": "🧚🏽‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏾♂️", "name": "man fairy: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DA 1F3FE 200D 2642 FE0F", "html": "🧚🏾‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏾♂", "name": "man fairy: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DA 1F3FE 200D 2642", "html": "🧚🏾‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏿♂️", "name": "man fairy: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DA 1F3FF 200D 2642 FE0F", "html": "🧚🏿‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏿♂", "name": "man fairy: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DA 1F3FF 200D 2642", "html": "🧚🏿‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚♀️", "name": "woman fairy", "shortname": ":woman_fairy:", "unicode": "1F9DA 200D 2640 FE0F", "html": "🧚‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚♀", "name": "woman fairy", "shortname": ":woman_fairy:", "unicode": "1F9DA 200D 2640", "html": "🧚‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏻♀️", "name": "woman fairy: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DA 1F3FB 200D 2640 FE0F", "html": "🧚🏻‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏻♀", "name": "woman fairy: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DA 1F3FB 200D 2640", "html": "🧚🏻‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏼♀️", "name": "woman fairy: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DA 1F3FC 200D 2640 FE0F", "html": "🧚🏼‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏼♀", "name": "woman fairy: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DA 1F3FC 200D 2640", "html": "🧚🏼‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏽♀️", "name": "woman fairy: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DA 1F3FD 200D 2640 FE0F", "html": "🧚🏽‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏽♀", "name": "woman fairy: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DA 1F3FD 200D 2640", "html": "🧚🏽‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏾♀️", "name": "woman fairy: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DA 1F3FE 200D 2640 FE0F", "html": "🧚🏾‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏾♀", "name": "woman fairy: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DA 1F3FE 200D 2640", "html": "🧚🏾‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏿♀️", "name": "woman fairy: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DA 1F3FF 200D 2640 FE0F", "html": "🧚🏿‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧚🏿♀", "name": "woman fairy: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DA 1F3FF 200D 2640", "html": "🧚🏿‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛", "name": "vampire", "shortname": ":vampire:", "unicode": "1F9DB", "html": "🧛", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏻", "name": "vampire: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DB 1F3FB", "html": "🧛🏻", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏼", "name": "vampire: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DB 1F3FC", "html": "🧛🏼", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏽", "name": "vampire: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DB 1F3FD", "html": "🧛🏽", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏾", "name": "vampire: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DB 1F3FE", "html": "🧛🏾", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏿", "name": "vampire: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DB 1F3FF", "html": "🧛🏿", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛♂️", "name": "man vampire", "shortname": ":man_vampire:", "unicode": "1F9DB 200D 2642 FE0F", "html": "🧛‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛♂", "name": "man vampire", "shortname": ":man_vampire:", "unicode": "1F9DB 200D 2642", "html": "🧛‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏻♂️", "name": "man vampire: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DB 1F3FB 200D 2642 FE0F", "html": "🧛🏻‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏻♂", "name": "man vampire: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DB 1F3FB 200D 2642", "html": "🧛🏻‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏼♂️", "name": "man vampire: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DB 1F3FC 200D 2642 FE0F", "html": "🧛🏼‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏼♂", "name": "man vampire: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DB 1F3FC 200D 2642", "html": "🧛🏼‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏽♂️", "name": "man vampire: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DB 1F3FD 200D 2642 FE0F", "html": "🧛🏽‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏽♂", "name": "man vampire: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DB 1F3FD 200D 2642", "html": "🧛🏽‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏾♂️", "name": "man vampire: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DB 1F3FE 200D 2642 FE0F", "html": "🧛🏾‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏾♂", "name": "man vampire: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DB 1F3FE 200D 2642", "html": "🧛🏾‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏿♂️", "name": "man vampire: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DB 1F3FF 200D 2642 FE0F", "html": "🧛🏿‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏿♂", "name": "man vampire: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DB 1F3FF 200D 2642", "html": "🧛🏿‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛♀️", "name": "woman vampire", "shortname": ":woman_vampire:", "unicode": "1F9DB 200D 2640 FE0F", "html": "🧛‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛♀", "name": "woman vampire", "shortname": ":woman_vampire:", "unicode": "1F9DB 200D 2640", "html": "🧛‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏻♀️", "name": "woman vampire: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DB 1F3FB 200D 2640 FE0F", "html": "🧛🏻‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏻♀", "name": "woman vampire: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DB 1F3FB 200D 2640", "html": "🧛🏻‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏼♀️", "name": "woman vampire: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DB 1F3FC 200D 2640 FE0F", "html": "🧛🏼‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏼♀", "name": "woman vampire: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DB 1F3FC 200D 2640", "html": "🧛🏼‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏽♀️", "name": "woman vampire: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DB 1F3FD 200D 2640 FE0F", "html": "🧛🏽‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏽♀", "name": "woman vampire: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DB 1F3FD 200D 2640", "html": "🧛🏽‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏾♀️", "name": "woman vampire: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DB 1F3FE 200D 2640 FE0F", "html": "🧛🏾‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏾♀", "name": "woman vampire: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DB 1F3FE 200D 2640", "html": "🧛🏾‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏿♀️", "name": "woman vampire: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DB 1F3FF 200D 2640 FE0F", "html": "🧛🏿‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧛🏿♀", "name": "woman vampire: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DB 1F3FF 200D 2640", "html": "🧛🏿‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜", "name": "merperson", "shortname": ":merperson:", "unicode": "1F9DC", "html": "🧜", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏻", "name": "merperson: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DC 1F3FB", "html": "🧜🏻", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏼", "name": "merperson: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DC 1F3FC", "html": "🧜🏼", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏽", "name": "merperson: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DC 1F3FD", "html": "🧜🏽", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏾", "name": "merperson: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DC 1F3FE", "html": "🧜🏾", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏿", "name": "merperson: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DC 1F3FF", "html": "🧜🏿", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜♂️", "name": "merman", "shortname": ":merman:", "unicode": "1F9DC 200D 2642 FE0F", "html": "🧜‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜♂", "name": "merman", "shortname": ":merman:", "unicode": "1F9DC 200D 2642", "html": "🧜‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏻♂️", "name": "merman: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DC 1F3FB 200D 2642 FE0F", "html": "🧜🏻‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏻♂", "name": "merman: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DC 1F3FB 200D 2642", "html": "🧜🏻‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏼♂️", "name": "merman: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DC 1F3FC 200D 2642 FE0F", "html": "🧜🏼‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏼♂", "name": "merman: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DC 1F3FC 200D 2642", "html": "🧜🏼‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏽♂️", "name": "merman: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DC 1F3FD 200D 2642 FE0F", "html": "🧜🏽‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏽♂", "name": "merman: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DC 1F3FD 200D 2642", "html": "🧜🏽‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏾♂️", "name": "merman: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DC 1F3FE 200D 2642 FE0F", "html": "🧜🏾‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏾♂", "name": "merman: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DC 1F3FE 200D 2642", "html": "🧜🏾‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏿♂️", "name": "merman: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DC 1F3FF 200D 2642 FE0F", "html": "🧜🏿‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏿♂", "name": "merman: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DC 1F3FF 200D 2642", "html": "🧜🏿‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜♀️", "name": "mermaid", "shortname": ":mermaid:", "unicode": "1F9DC 200D 2640 FE0F", "html": "🧜‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜♀", "name": "mermaid", "shortname": ":mermaid:", "unicode": "1F9DC 200D 2640", "html": "🧜‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏻♀️", "name": "mermaid: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DC 1F3FB 200D 2640 FE0F", "html": "🧜🏻‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏻♀", "name": "mermaid: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DC 1F3FB 200D 2640", "html": "🧜🏻‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏼♀️", "name": "mermaid: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DC 1F3FC 200D 2640 FE0F", "html": "🧜🏼‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏼♀", "name": "mermaid: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DC 1F3FC 200D 2640", "html": "🧜🏼‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏽♀️", "name": "mermaid: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DC 1F3FD 200D 2640 FE0F", "html": "🧜🏽‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏽♀", "name": "mermaid: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DC 1F3FD 200D 2640", "html": "🧜🏽‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏾♀️", "name": "mermaid: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DC 1F3FE 200D 2640 FE0F", "html": "🧜🏾‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏾♀", "name": "mermaid: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DC 1F3FE 200D 2640", "html": "🧜🏾‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏿♀️", "name": "mermaid: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DC 1F3FF 200D 2640 FE0F", "html": "🧜🏿‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧜🏿♀", "name": "mermaid: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DC 1F3FF 200D 2640", "html": "🧜🏿‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝", "name": "elf", "shortname": ":elf:", "unicode": "1F9DD", "html": "🧝", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏻", "name": "elf: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DD 1F3FB", "html": "🧝🏻", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏼", "name": "elf: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DD 1F3FC", "html": "🧝🏼", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏽", "name": "elf: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DD 1F3FD", "html": "🧝🏽", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏾", "name": "elf: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DD 1F3FE", "html": "🧝🏾", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏿", "name": "elf: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DD 1F3FF", "html": "🧝🏿", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝♂️", "name": "man elf", "shortname": ":man_elf:", "unicode": "1F9DD 200D 2642 FE0F", "html": "🧝‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝♂", "name": "man elf", "shortname": ":man_elf:", "unicode": "1F9DD 200D 2642", "html": "🧝‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏻♂️", "name": "man elf: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DD 1F3FB 200D 2642 FE0F", "html": "🧝🏻‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏻♂", "name": "man elf: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DD 1F3FB 200D 2642", "html": "🧝🏻‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏼♂️", "name": "man elf: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DD 1F3FC 200D 2642 FE0F", "html": "🧝🏼‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏼♂", "name": "man elf: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DD 1F3FC 200D 2642", "html": "🧝🏼‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏽♂️", "name": "man elf: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DD 1F3FD 200D 2642 FE0F", "html": "🧝🏽‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏽♂", "name": "man elf: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DD 1F3FD 200D 2642", "html": "🧝🏽‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏾♂️", "name": "man elf: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DD 1F3FE 200D 2642 FE0F", "html": "🧝🏾‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏾♂", "name": "man elf: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DD 1F3FE 200D 2642", "html": "🧝🏾‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏿♂️", "name": "man elf: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DD 1F3FF 200D 2642 FE0F", "html": "🧝🏿‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏿♂", "name": "man elf: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DD 1F3FF 200D 2642", "html": "🧝🏿‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝♀️", "name": "woman elf", "shortname": ":woman_elf:", "unicode": "1F9DD 200D 2640 FE0F", "html": "🧝‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝♀", "name": "woman elf", "shortname": ":woman_elf:", "unicode": "1F9DD 200D 2640", "html": "🧝‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏻♀️", "name": "woman elf: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DD 1F3FB 200D 2640 FE0F", "html": "🧝🏻‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏻♀", "name": "woman elf: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DD 1F3FB 200D 2640", "html": "🧝🏻‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏼♀️", "name": "woman elf: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DD 1F3FC 200D 2640 FE0F", "html": "🧝🏼‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏼♀", "name": "woman elf: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DD 1F3FC 200D 2640", "html": "🧝🏼‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏽♀️", "name": "woman elf: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DD 1F3FD 200D 2640 FE0F", "html": "🧝🏽‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏽♀", "name": "woman elf: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DD 1F3FD 200D 2640", "html": "🧝🏽‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏾♀️", "name": "woman elf: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DD 1F3FE 200D 2640 FE0F", "html": "🧝🏾‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏾♀", "name": "woman elf: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DD 1F3FE 200D 2640", "html": "🧝🏾‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏿♀️", "name": "woman elf: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DD 1F3FF 200D 2640 FE0F", "html": "🧝🏿‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧝🏿♀", "name": "woman elf: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DD 1F3FF 200D 2640", "html": "🧝🏿‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧞", "name": "genie", "shortname": ":genie:", "unicode": "1F9DE", "html": "🧞", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧞♂️", "name": "man genie", "shortname": ":man_genie:", "unicode": "1F9DE 200D 2642 FE0F", "html": "🧞‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧞♂", "name": "man genie", "shortname": ":man_genie:", "unicode": "1F9DE 200D 2642", "html": "🧞‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧞♀️", "name": "woman genie", "shortname": ":woman_genie:", "unicode": "1F9DE 200D 2640 FE0F", "html": "🧞‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧞♀", "name": "woman genie", "shortname": ":woman_genie:", "unicode": "1F9DE 200D 2640", "html": "🧞‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧟", "name": "zombie", "shortname": ":zombie:", "unicode": "1F9DF", "html": "🧟", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧟♂️", "name": "man zombie", "shortname": ":man_zombie:", "unicode": "1F9DF 200D 2642 FE0F", "html": "🧟‍♂️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧟♂", "name": "man zombie", "shortname": ":man_zombie:", "unicode": "1F9DF 200D 2642", "html": "🧟‍♂", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧟♀️", "name": "woman zombie", "shortname": ":woman_zombie:", "unicode": "1F9DF 200D 2640 FE0F", "html": "🧟‍♀️", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "🧟♀", "name": "woman zombie", "shortname": ":woman_zombie:", "unicode": "1F9DF 200D 2640", "html": "🧟‍♀", "category": "People & Body (person-fantasy)", "order": ""}, + {"emoji": "💆♂️", "name": "man getting massage", "shortname": ":man_getting_massage:", "unicode": "1F486 200D 2642 FE0F", "html": "💆‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏻♂️", "name": "man getting massage: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F486 1F3FB 200D 2642 FE0F", "html": "💆🏻‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏼♂️", "name": "man getting massage: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F486 1F3FC 200D 2642 FE0F", "html": "💆🏼‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏽♂️", "name": "man getting massage: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F486 1F3FD 200D 2642 FE0F", "html": "💆🏽‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏾♂️", "name": "man getting massage: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F486 1F3FE 200D 2642 FE0F", "html": "💆🏾‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏿♂️", "name": "man getting massage: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F486 1F3FF 200D 2642 FE0F", "html": "💆🏿‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆♀️", "name": "woman getting massage", "shortname": ":woman_getting_massage:", "unicode": "1F486 200D 2640 FE0F", "html": "💆‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆♀", "name": "woman getting massage", "shortname": ":woman_getting_massage:", "unicode": "1F486 200D 2640", "html": "💆‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏻♀️", "name": "woman getting massage: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F486 1F3FB 200D 2640 FE0F", "html": "💆🏻‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏻♀", "name": "woman getting massage: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F486 1F3FB 200D 2640", "html": "💆🏻‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏼♀️", "name": "woman getting massage: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F486 1F3FC 200D 2640 FE0F", "html": "💆🏼‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏼♀", "name": "woman getting massage: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F486 1F3FC 200D 2640", "html": "💆🏼‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏽♀️", "name": "woman getting massage: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F486 1F3FD 200D 2640 FE0F", "html": "💆🏽‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏽♀", "name": "woman getting massage: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F486 1F3FD 200D 2640", "html": "💆🏽‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏾♀️", "name": "woman getting massage: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F486 1F3FE 200D 2640 FE0F", "html": "💆🏾‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏾♀", "name": "woman getting massage: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F486 1F3FE 200D 2640", "html": "💆🏾‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏿♀️", "name": "woman getting massage: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F486 1F3FF 200D 2640 FE0F", "html": "💆🏿‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💆🏿♀", "name": "woman getting massage: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F486 1F3FF 200D 2640", "html": "💆🏿‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇♂️", "name": "man getting haircut", "shortname": ":man_getting_haircut:", "unicode": "1F487 200D 2642 FE0F", "html": "💇‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏻♂️", "name": "man getting haircut: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F487 1F3FB 200D 2642 FE0F", "html": "💇🏻‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏼♂️", "name": "man getting haircut: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F487 1F3FC 200D 2642 FE0F", "html": "💇🏼‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏽♂️", "name": "man getting haircut: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F487 1F3FD 200D 2642 FE0F", "html": "💇🏽‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏾♂️", "name": "man getting haircut: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F487 1F3FE 200D 2642 FE0F", "html": "💇🏾‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏿♂️", "name": "man getting haircut: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F487 1F3FF 200D 2642 FE0F", "html": "💇🏿‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇♀️", "name": "woman getting haircut", "shortname": ":woman_getting_haircut:", "unicode": "1F487 200D 2640 FE0F", "html": "💇‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇♀", "name": "woman getting haircut", "shortname": ":woman_getting_haircut:", "unicode": "1F487 200D 2640", "html": "💇‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏻♀️", "name": "woman getting haircut: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F487 1F3FB 200D 2640 FE0F", "html": "💇🏻‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏻♀", "name": "woman getting haircut: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F487 1F3FB 200D 2640", "html": "💇🏻‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏼♀️", "name": "woman getting haircut: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F487 1F3FC 200D 2640 FE0F", "html": "💇🏼‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏼♀", "name": "woman getting haircut: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F487 1F3FC 200D 2640", "html": "💇🏼‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏽♀️", "name": "woman getting haircut: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F487 1F3FD 200D 2640 FE0F", "html": "💇🏽‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏽♀", "name": "woman getting haircut: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F487 1F3FD 200D 2640", "html": "💇🏽‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏾♀️", "name": "woman getting haircut: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F487 1F3FE 200D 2640 FE0F", "html": "💇🏾‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏾♀", "name": "woman getting haircut: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F487 1F3FE 200D 2640", "html": "💇🏾‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏿♀️", "name": "woman getting haircut: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F487 1F3FF 200D 2640 FE0F", "html": "💇🏿‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "💇🏿♀", "name": "woman getting haircut: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F487 1F3FF 200D 2640", "html": "💇🏿‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶♂️", "name": "man walking", "shortname": ":man_walking:", "unicode": "1F6B6 200D 2642 FE0F", "html": "🚶‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶♂", "name": "man walking", "shortname": ":man_walking:", "unicode": "1F6B6 200D 2642", "html": "🚶‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏻♂️", "name": "man walking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B6 1F3FB 200D 2642 FE0F", "html": "🚶🏻‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏻♂", "name": "man walking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B6 1F3FB 200D 2642", "html": "🚶🏻‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏼♂️", "name": "man walking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B6 1F3FC 200D 2642 FE0F", "html": "🚶🏼‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏼♂", "name": "man walking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B6 1F3FC 200D 2642", "html": "🚶🏼‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏽♂️", "name": "man walking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B6 1F3FD 200D 2642 FE0F", "html": "🚶🏽‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏽♂", "name": "man walking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B6 1F3FD 200D 2642", "html": "🚶🏽‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏾♂️", "name": "man walking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B6 1F3FE 200D 2642 FE0F", "html": "🚶🏾‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏾♂", "name": "man walking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B6 1F3FE 200D 2642", "html": "🚶🏾‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏿♂️", "name": "man walking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B6 1F3FF 200D 2642 FE0F", "html": "🚶🏿‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏿♂", "name": "man walking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B6 1F3FF 200D 2642", "html": "🚶🏿‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶♀️", "name": "woman walking", "shortname": ":woman_walking:", "unicode": "1F6B6 200D 2640 FE0F", "html": "🚶‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏻♀️", "name": "woman walking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B6 1F3FB 200D 2640 FE0F", "html": "🚶🏻‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏼♀️", "name": "woman walking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B6 1F3FC 200D 2640 FE0F", "html": "🚶🏼‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏽♀️", "name": "woman walking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B6 1F3FD 200D 2640 FE0F", "html": "🚶🏽‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏾♀️", "name": "woman walking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B6 1F3FE 200D 2640 FE0F", "html": "🚶🏾‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🚶🏿♀️", "name": "woman walking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B6 1F3FF 200D 2640 FE0F", "html": "🚶🏿‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍", "name": "person standing", "shortname": ":person_standing:", "unicode": "1F9CD", "html": "🧍", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏻", "name": "person standing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CD 1F3FB", "html": "🧍🏻", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏼", "name": "person standing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CD 1F3FC", "html": "🧍🏼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏽", "name": "person standing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CD 1F3FD", "html": "🧍🏽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏾", "name": "person standing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CD 1F3FE", "html": "🧍🏾", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏿", "name": "person standing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CD 1F3FF", "html": "🧍🏿", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍♂️", "name": "man standing", "shortname": ":man_standing:", "unicode": "1F9CD 200D 2642 FE0F", "html": "🧍‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍♂", "name": "man standing", "shortname": ":man_standing:", "unicode": "1F9CD 200D 2642", "html": "🧍‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏻♂️", "name": "man standing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CD 1F3FB 200D 2642 FE0F", "html": "🧍🏻‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏻♂", "name": "man standing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CD 1F3FB 200D 2642", "html": "🧍🏻‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏼♂️", "name": "man standing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CD 1F3FC 200D 2642 FE0F", "html": "🧍🏼‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏼♂", "name": "man standing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CD 1F3FC 200D 2642", "html": "🧍🏼‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏽♂️", "name": "man standing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CD 1F3FD 200D 2642 FE0F", "html": "🧍🏽‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏽♂", "name": "man standing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CD 1F3FD 200D 2642", "html": "🧍🏽‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏾♂️", "name": "man standing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CD 1F3FE 200D 2642 FE0F", "html": "🧍🏾‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏾♂", "name": "man standing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CD 1F3FE 200D 2642", "html": "🧍🏾‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏿♂️", "name": "man standing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CD 1F3FF 200D 2642 FE0F", "html": "🧍🏿‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏿♂", "name": "man standing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CD 1F3FF 200D 2642", "html": "🧍🏿‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍♀️", "name": "woman standing", "shortname": ":woman_standing:", "unicode": "1F9CD 200D 2640 FE0F", "html": "🧍‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍♀", "name": "woman standing", "shortname": ":woman_standing:", "unicode": "1F9CD 200D 2640", "html": "🧍‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏻♀️", "name": "woman standing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CD 1F3FB 200D 2640 FE0F", "html": "🧍🏻‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏻♀", "name": "woman standing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CD 1F3FB 200D 2640", "html": "🧍🏻‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏼♀️", "name": "woman standing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CD 1F3FC 200D 2640 FE0F", "html": "🧍🏼‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏼♀", "name": "woman standing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CD 1F3FC 200D 2640", "html": "🧍🏼‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏽♀️", "name": "woman standing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CD 1F3FD 200D 2640 FE0F", "html": "🧍🏽‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏽♀", "name": "woman standing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CD 1F3FD 200D 2640", "html": "🧍🏽‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏾♀️", "name": "woman standing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CD 1F3FE 200D 2640 FE0F", "html": "🧍🏾‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏾♀", "name": "woman standing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CD 1F3FE 200D 2640", "html": "🧍🏾‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏿♀️", "name": "woman standing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CD 1F3FF 200D 2640 FE0F", "html": "🧍🏿‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧍🏿♀", "name": "woman standing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CD 1F3FF 200D 2640", "html": "🧍🏿‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎", "name": "person kneeling", "shortname": ":person_kneeling:", "unicode": "1F9CE", "html": "🧎", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏻", "name": "person kneeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CE 1F3FB", "html": "🧎🏻", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏼", "name": "person kneeling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CE 1F3FC", "html": "🧎🏼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏽", "name": "person kneeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CE 1F3FD", "html": "🧎🏽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏾", "name": "person kneeling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CE 1F3FE", "html": "🧎🏾", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏿", "name": "person kneeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CE 1F3FF", "html": "🧎🏿", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎♂️", "name": "man kneeling", "shortname": ":man_kneeling:", "unicode": "1F9CE 200D 2642 FE0F", "html": "🧎‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎♂", "name": "man kneeling", "shortname": ":man_kneeling:", "unicode": "1F9CE 200D 2642", "html": "🧎‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏻♂️", "name": "man kneeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CE 1F3FB 200D 2642 FE0F", "html": "🧎🏻‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏻♂", "name": "man kneeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CE 1F3FB 200D 2642", "html": "🧎🏻‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏼♂️", "name": "man kneeling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CE 1F3FC 200D 2642 FE0F", "html": "🧎🏼‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏼♂", "name": "man kneeling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CE 1F3FC 200D 2642", "html": "🧎🏼‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏽♂️", "name": "man kneeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CE 1F3FD 200D 2642 FE0F", "html": "🧎🏽‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏽♂", "name": "man kneeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CE 1F3FD 200D 2642", "html": "🧎🏽‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏾♂️", "name": "man kneeling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CE 1F3FE 200D 2642 FE0F", "html": "🧎🏾‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏾♂", "name": "man kneeling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CE 1F3FE 200D 2642", "html": "🧎🏾‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏿♂️", "name": "man kneeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CE 1F3FF 200D 2642 FE0F", "html": "🧎🏿‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏿♂", "name": "man kneeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CE 1F3FF 200D 2642", "html": "🧎🏿‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎♀️", "name": "woman kneeling", "shortname": ":woman_kneeling:", "unicode": "1F9CE 200D 2640 FE0F", "html": "🧎‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎♀", "name": "woman kneeling", "shortname": ":woman_kneeling:", "unicode": "1F9CE 200D 2640", "html": "🧎‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏻♀️", "name": "woman kneeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CE 1F3FB 200D 2640 FE0F", "html": "🧎🏻‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏻♀", "name": "woman kneeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CE 1F3FB 200D 2640", "html": "🧎🏻‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏼♀️", "name": "woman kneeling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CE 1F3FC 200D 2640 FE0F", "html": "🧎🏼‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏼♀", "name": "woman kneeling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CE 1F3FC 200D 2640", "html": "🧎🏼‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏽♀️", "name": "woman kneeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CE 1F3FD 200D 2640 FE0F", "html": "🧎🏽‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏽♀", "name": "woman kneeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CE 1F3FD 200D 2640", "html": "🧎🏽‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏾♀️", "name": "woman kneeling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CE 1F3FE 200D 2640 FE0F", "html": "🧎🏾‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏾♀", "name": "woman kneeling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CE 1F3FE 200D 2640", "html": "🧎🏾‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏿♀️", "name": "woman kneeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CE 1F3FF 200D 2640 FE0F", "html": "🧎🏿‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧎🏿♀", "name": "woman kneeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CE 1F3FF 200D 2640", "html": "🧎🏿‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧑🦯", "name": "person with probing cane", "shortname": ":person_with_probing_cane:", "unicode": "1F9D1 200D 1F9AF", "html": "🧑‍🦯", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧑🏻🦯", "name": "person with probing cane: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F9AF", "html": "🧑🏻‍🦯", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧑🏼🦯", "name": "person with probing cane: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F9AF", "html": "🧑🏼‍🦯", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧑🏽🦯", "name": "person with probing cane: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F9AF", "html": "🧑🏽‍🦯", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧑🏾🦯", "name": "person with probing cane: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F9AF", "html": "🧑🏾‍🦯", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧑🏿🦯", "name": "person with probing cane: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F9AF", "html": "🧑🏿‍🦯", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👨🦯", "name": "man with probing cane", "shortname": ":man_with_probing_cane:", "unicode": "1F468 200D 1F9AF", "html": "👨‍🦯", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👨🏻🦯", "name": "man with probing cane: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F9AF", "html": "👨🏻‍🦯", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👨🏼🦯", "name": "man with probing cane: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F9AF", "html": "👨🏼‍🦯", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👨🏽🦯", "name": "man with probing cane: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F9AF", "html": "👨🏽‍🦯", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👨🏾🦯", "name": "man with probing cane: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F9AF", "html": "👨🏾‍🦯", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👨🏿🦯", "name": "man with probing cane: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F9AF", "html": "👨🏿‍🦯", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👩🦯", "name": "woman with probing cane", "shortname": ":woman_with_probing_cane:", "unicode": "1F469 200D 1F9AF", "html": "👩‍🦯", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👩🏻🦯", "name": "woman with probing cane: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F9AF", "html": "👩🏻‍🦯", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👩🏼🦯", "name": "woman with probing cane: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F9AF", "html": "👩🏼‍🦯", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👩🏽🦯", "name": "woman with probing cane: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F9AF", "html": "👩🏽‍🦯", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👩🏾🦯", "name": "woman with probing cane: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F9AF", "html": "👩🏾‍🦯", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👩🏿🦯", "name": "woman with probing cane: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F9AF", "html": "👩🏿‍🦯", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧑🦼", "name": "person in motorized wheelchair", "shortname": ":person_in_motorized_wheelchair:", "unicode": "1F9D1 200D 1F9BC", "html": "🧑‍🦼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧑🏻🦼", "name": "person in motorized wheelchair: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F9BC", "html": "🧑🏻‍🦼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧑🏼🦼", "name": "person in motorized wheelchair: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F9BC", "html": "🧑🏼‍🦼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧑🏽🦼", "name": "person in motorized wheelchair: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F9BC", "html": "🧑🏽‍🦼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧑🏾🦼", "name": "person in motorized wheelchair: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F9BC", "html": "🧑🏾‍🦼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧑🏿🦼", "name": "person in motorized wheelchair: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F9BC", "html": "🧑🏿‍🦼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👨🦼", "name": "man in motorized wheelchair", "shortname": ":man_in_motorized_wheelchair:", "unicode": "1F468 200D 1F9BC", "html": "👨‍🦼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👨🏻🦼", "name": "man in motorized wheelchair: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F9BC", "html": "👨🏻‍🦼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👨🏼🦼", "name": "man in motorized wheelchair: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F9BC", "html": "👨🏼‍🦼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👨🏽🦼", "name": "man in motorized wheelchair: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F9BC", "html": "👨🏽‍🦼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👨🏾🦼", "name": "man in motorized wheelchair: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F9BC", "html": "👨🏾‍🦼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👨🏿🦼", "name": "man in motorized wheelchair: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F9BC", "html": "👨🏿‍🦼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👩🦼", "name": "woman in motorized wheelchair", "shortname": ":woman_in_motorized_wheelchair:", "unicode": "1F469 200D 1F9BC", "html": "👩‍🦼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👩🏻🦼", "name": "woman in motorized wheelchair: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F9BC", "html": "👩🏻‍🦼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👩🏼🦼", "name": "woman in motorized wheelchair: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F9BC", "html": "👩🏼‍🦼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👩🏽🦼", "name": "woman in motorized wheelchair: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F9BC", "html": "👩🏽‍🦼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👩🏾🦼", "name": "woman in motorized wheelchair: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F9BC", "html": "👩🏾‍🦼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👩🏿🦼", "name": "woman in motorized wheelchair: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F9BC", "html": "👩🏿‍🦼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧑🦽", "name": "person in manual wheelchair", "shortname": ":person_in_manual_wheelchair:", "unicode": "1F9D1 200D 1F9BD", "html": "🧑‍🦽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧑🏻🦽", "name": "person in manual wheelchair: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F9BD", "html": "🧑🏻‍🦽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧑🏼🦽", "name": "person in manual wheelchair: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F9BD", "html": "🧑🏼‍🦽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧑🏽🦽", "name": "person in manual wheelchair: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F9BD", "html": "🧑🏽‍🦽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧑🏾🦽", "name": "person in manual wheelchair: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F9BD", "html": "🧑🏾‍🦽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧑🏿🦽", "name": "person in manual wheelchair: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F9BD", "html": "🧑🏿‍🦽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👨🦽", "name": "man in manual wheelchair", "shortname": ":man_in_manual_wheelchair:", "unicode": "1F468 200D 1F9BD", "html": "👨‍🦽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👨🏻🦽", "name": "man in manual wheelchair: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F9BD", "html": "👨🏻‍🦽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👨🏼🦽", "name": "man in manual wheelchair: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F9BD", "html": "👨🏼‍🦽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👨🏽🦽", "name": "man in manual wheelchair: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F9BD", "html": "👨🏽‍🦽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👨🏾🦽", "name": "man in manual wheelchair: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F9BD", "html": "👨🏾‍🦽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👨🏿🦽", "name": "man in manual wheelchair: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F9BD", "html": "👨🏿‍🦽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👩🦽", "name": "woman in manual wheelchair", "shortname": ":woman_in_manual_wheelchair:", "unicode": "1F469 200D 1F9BD", "html": "👩‍🦽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👩🏻🦽", "name": "woman in manual wheelchair: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F9BD", "html": "👩🏻‍🦽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👩🏼🦽", "name": "woman in manual wheelchair: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F9BD", "html": "👩🏼‍🦽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👩🏽🦽", "name": "woman in manual wheelchair: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F9BD", "html": "👩🏽‍🦽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👩🏾🦽", "name": "woman in manual wheelchair: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F9BD", "html": "👩🏾‍🦽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👩🏿🦽", "name": "woman in manual wheelchair: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F9BD", "html": "👩🏿‍🦽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃♂️", "name": "man running", "shortname": ":man_running:", "unicode": "1F3C3 200D 2642 FE0F", "html": "🏃‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃♂", "name": "man running", "shortname": ":man_running:", "unicode": "1F3C3 200D 2642", "html": "🏃‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏻♂️", "name": "man running: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C3 1F3FB 200D 2642 FE0F", "html": "🏃🏻‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏻♂", "name": "man running: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C3 1F3FB 200D 2642", "html": "🏃🏻‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏼♂️", "name": "man running: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C3 1F3FC 200D 2642 FE0F", "html": "🏃🏼‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏼♂", "name": "man running: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C3 1F3FC 200D 2642", "html": "🏃🏼‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏽♂️", "name": "man running: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C3 1F3FD 200D 2642 FE0F", "html": "🏃🏽‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏽♂", "name": "man running: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C3 1F3FD 200D 2642", "html": "🏃🏽‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏾♂️", "name": "man running: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C3 1F3FE 200D 2642 FE0F", "html": "🏃🏾‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏾♂", "name": "man running: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C3 1F3FE 200D 2642", "html": "🏃🏾‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏿♂️", "name": "man running: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C3 1F3FF 200D 2642 FE0F", "html": "🏃🏿‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏿♂", "name": "man running: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C3 1F3FF 200D 2642", "html": "🏃🏿‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃♀️", "name": "woman running", "shortname": ":woman_running:", "unicode": "1F3C3 200D 2640 FE0F", "html": "🏃‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏻♀️", "name": "woman running: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C3 1F3FB 200D 2640 FE0F", "html": "🏃🏻‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏼♀️", "name": "woman running: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C3 1F3FC 200D 2640 FE0F", "html": "🏃🏼‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏽♀️", "name": "woman running: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C3 1F3FD 200D 2640 FE0F", "html": "🏃🏽‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏾♀️", "name": "woman running: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C3 1F3FE 200D 2640 FE0F", "html": "🏃🏾‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🏃🏿♀️", "name": "woman running: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C3 1F3FF 200D 2640 FE0F", "html": "🏃🏿‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🕺", "name": "man dancing", "shortname": ":man_dancing:", "unicode": "1F57A", "html": "🕺", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🕺🏻", "name": "man dancing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F57A 1F3FB", "html": "🕺🏻", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🕺🏼", "name": "man dancing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F57A 1F3FC", "html": "🕺🏼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🕺🏽", "name": "man dancing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F57A 1F3FD", "html": "🕺🏽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🕺🏾", "name": "man dancing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F57A 1F3FE", "html": "🕺🏾", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🕺🏿", "name": "man dancing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F57A 1F3FF", "html": "🕺🏿", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🕴️", "name": "man in suit levitating", "shortname": ":man_in_suit_levitating:", "unicode": "1F574 FE0F", "html": "🕴️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🕴🏻", "name": "man in suit levitating: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F574 1F3FB", "html": "🕴🏻", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🕴🏼", "name": "man in suit levitating: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F574 1F3FC", "html": "🕴🏼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🕴🏽", "name": "man in suit levitating: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F574 1F3FD", "html": "🕴🏽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🕴🏾", "name": "man in suit levitating: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F574 1F3FE", "html": "🕴🏾", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🕴🏿", "name": "man in suit levitating: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F574 1F3FF", "html": "🕴🏿", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👯♂️", "name": "men with bunny ears", "shortname": ":men_with_bunny_ears:", "unicode": "1F46F 200D 2642 FE0F", "html": "👯‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👯♀️", "name": "women with bunny ears", "shortname": ":women_with_bunny_ears:", "unicode": "1F46F 200D 2640 FE0F", "html": "👯‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "👯♀", "name": "women with bunny ears", "shortname": ":women_with_bunny_ears:", "unicode": "1F46F 200D 2640", "html": "👯‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖", "name": "person in steamy room", "shortname": ":person_in_steamy_room:", "unicode": "1F9D6", "html": "🧖", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏻", "name": "person in steamy room: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D6 1F3FB", "html": "🧖🏻", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏼", "name": "person in steamy room: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D6 1F3FC", "html": "🧖🏼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏽", "name": "person in steamy room: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D6 1F3FD", "html": "🧖🏽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏾", "name": "person in steamy room: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D6 1F3FE", "html": "🧖🏾", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏿", "name": "person in steamy room: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D6 1F3FF", "html": "🧖🏿", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖♂️", "name": "man in steamy room", "shortname": ":man_in_steamy_room:", "unicode": "1F9D6 200D 2642 FE0F", "html": "🧖‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖♂", "name": "man in steamy room", "shortname": ":man_in_steamy_room:", "unicode": "1F9D6 200D 2642", "html": "🧖‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏻♂️", "name": "man in steamy room: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D6 1F3FB 200D 2642 FE0F", "html": "🧖🏻‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏻♂", "name": "man in steamy room: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D6 1F3FB 200D 2642", "html": "🧖🏻‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏼♂️", "name": "man in steamy room: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D6 1F3FC 200D 2642 FE0F", "html": "🧖🏼‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏼♂", "name": "man in steamy room: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D6 1F3FC 200D 2642", "html": "🧖🏼‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏽♂️", "name": "man in steamy room: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D6 1F3FD 200D 2642 FE0F", "html": "🧖🏽‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏽♂", "name": "man in steamy room: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D6 1F3FD 200D 2642", "html": "🧖🏽‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏾♂️", "name": "man in steamy room: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D6 1F3FE 200D 2642 FE0F", "html": "🧖🏾‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏾♂", "name": "man in steamy room: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D6 1F3FE 200D 2642", "html": "🧖🏾‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏿♂️", "name": "man in steamy room: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D6 1F3FF 200D 2642 FE0F", "html": "🧖🏿‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏿♂", "name": "man in steamy room: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D6 1F3FF 200D 2642", "html": "🧖🏿‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖♀️", "name": "woman in steamy room", "shortname": ":woman_in_steamy_room:", "unicode": "1F9D6 200D 2640 FE0F", "html": "🧖‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖♀", "name": "woman in steamy room", "shortname": ":woman_in_steamy_room:", "unicode": "1F9D6 200D 2640", "html": "🧖‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏻♀️", "name": "woman in steamy room: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D6 1F3FB 200D 2640 FE0F", "html": "🧖🏻‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏻♀", "name": "woman in steamy room: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D6 1F3FB 200D 2640", "html": "🧖🏻‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏼♀️", "name": "woman in steamy room: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D6 1F3FC 200D 2640 FE0F", "html": "🧖🏼‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏼♀", "name": "woman in steamy room: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D6 1F3FC 200D 2640", "html": "🧖🏼‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏽♀️", "name": "woman in steamy room: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D6 1F3FD 200D 2640 FE0F", "html": "🧖🏽‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏽♀", "name": "woman in steamy room: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D6 1F3FD 200D 2640", "html": "🧖🏽‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏾♀️", "name": "woman in steamy room: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D6 1F3FE 200D 2640 FE0F", "html": "🧖🏾‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏾♀", "name": "woman in steamy room: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D6 1F3FE 200D 2640", "html": "🧖🏾‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏿♀️", "name": "woman in steamy room: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D6 1F3FF 200D 2640 FE0F", "html": "🧖🏿‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧖🏿♀", "name": "woman in steamy room: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D6 1F3FF 200D 2640", "html": "🧖🏿‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗", "name": "person climbing", "shortname": ":person_climbing:", "unicode": "1F9D7", "html": "🧗", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏻", "name": "person climbing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D7 1F3FB", "html": "🧗🏻", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏼", "name": "person climbing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D7 1F3FC", "html": "🧗🏼", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏽", "name": "person climbing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D7 1F3FD", "html": "🧗🏽", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏾", "name": "person climbing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D7 1F3FE", "html": "🧗🏾", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏿", "name": "person climbing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D7 1F3FF", "html": "🧗🏿", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗♂️", "name": "man climbing", "shortname": ":man_climbing:", "unicode": "1F9D7 200D 2642 FE0F", "html": "🧗‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗♂", "name": "man climbing", "shortname": ":man_climbing:", "unicode": "1F9D7 200D 2642", "html": "🧗‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏻♂️", "name": "man climbing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D7 1F3FB 200D 2642 FE0F", "html": "🧗🏻‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏻♂", "name": "man climbing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D7 1F3FB 200D 2642", "html": "🧗🏻‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏼♂️", "name": "man climbing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D7 1F3FC 200D 2642 FE0F", "html": "🧗🏼‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏼♂", "name": "man climbing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D7 1F3FC 200D 2642", "html": "🧗🏼‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏽♂️", "name": "man climbing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D7 1F3FD 200D 2642 FE0F", "html": "🧗🏽‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏽♂", "name": "man climbing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D7 1F3FD 200D 2642", "html": "🧗🏽‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏾♂️", "name": "man climbing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D7 1F3FE 200D 2642 FE0F", "html": "🧗🏾‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏾♂", "name": "man climbing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D7 1F3FE 200D 2642", "html": "🧗🏾‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏿♂️", "name": "man climbing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D7 1F3FF 200D 2642 FE0F", "html": "🧗🏿‍♂️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏿♂", "name": "man climbing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D7 1F3FF 200D 2642", "html": "🧗🏿‍♂", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗♀️", "name": "woman climbing", "shortname": ":woman_climbing:", "unicode": "1F9D7 200D 2640 FE0F", "html": "🧗‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗♀", "name": "woman climbing", "shortname": ":woman_climbing:", "unicode": "1F9D7 200D 2640", "html": "🧗‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏻♀️", "name": "woman climbing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D7 1F3FB 200D 2640 FE0F", "html": "🧗🏻‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏻♀", "name": "woman climbing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D7 1F3FB 200D 2640", "html": "🧗🏻‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏼♀️", "name": "woman climbing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D7 1F3FC 200D 2640 FE0F", "html": "🧗🏼‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏼♀", "name": "woman climbing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D7 1F3FC 200D 2640", "html": "🧗🏼‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏽♀️", "name": "woman climbing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D7 1F3FD 200D 2640 FE0F", "html": "🧗🏽‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏽♀", "name": "woman climbing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D7 1F3FD 200D 2640", "html": "🧗🏽‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏾♀️", "name": "woman climbing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D7 1F3FE 200D 2640 FE0F", "html": "🧗🏾‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏾♀", "name": "woman climbing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D7 1F3FE 200D 2640", "html": "🧗🏾‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏿♀️", "name": "woman climbing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D7 1F3FF 200D 2640 FE0F", "html": "🧗🏿‍♀️", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🧗🏿♀", "name": "woman climbing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D7 1F3FF 200D 2640", "html": "🧗🏿‍♀", "category": "People & Body (person-activity)", "order": ""}, + {"emoji": "🤺", "name": "person fencing", "shortname": ":person_fencing:", "unicode": "1F93A", "html": "🤺", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏇🏻", "name": "horse racing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C7 1F3FB", "html": "🏇🏻", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏇🏼", "name": "horse racing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C7 1F3FC", "html": "🏇🏼", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏇🏽", "name": "horse racing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C7 1F3FD", "html": "🏇🏽", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏇🏾", "name": "horse racing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C7 1F3FE", "html": "🏇🏾", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏇🏿", "name": "horse racing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C7 1F3FF", "html": "🏇🏿", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛷️", "name": "skier", "shortname": ":skier:", "unicode": "26F7 FE0F", "html": "⛷️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏂🏻", "name": "snowboarder: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C2 1F3FB", "html": "🏂🏻", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏂🏼", "name": "snowboarder: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C2 1F3FC", "html": "🏂🏼", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏂🏽", "name": "snowboarder: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C2 1F3FD", "html": "🏂🏽", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏂🏾", "name": "snowboarder: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C2 1F3FE", "html": "🏂🏾", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏂🏿", "name": "snowboarder: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C2 1F3FF", "html": "🏂🏿", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌️", "name": "person golfing", "shortname": ":person_golfing:", "unicode": "1F3CC FE0F", "html": "🏌️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏻", "name": "person golfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CC 1F3FB", "html": "🏌🏻", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏼", "name": "person golfing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CC 1F3FC", "html": "🏌🏼", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏽", "name": "person golfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CC 1F3FD", "html": "🏌🏽", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏾", "name": "person golfing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CC 1F3FE", "html": "🏌🏾", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏿", "name": "person golfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CC 1F3FF", "html": "🏌🏿", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌️♂️", "name": "man golfing", "shortname": ":man_golfing:", "unicode": "1F3CC FE0F 200D 2642 FE0F", "html": "🏌️‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌♂️", "name": "man golfing", "shortname": ":man_golfing:", "unicode": "1F3CC 200D 2642 FE0F", "html": "🏌‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌️♂", "name": "man golfing", "shortname": ":man_golfing:", "unicode": "1F3CC FE0F 200D 2642", "html": "🏌️‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌♂", "name": "man golfing", "shortname": ":man_golfing:", "unicode": "1F3CC 200D 2642", "html": "🏌‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏻♂️", "name": "man golfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CC 1F3FB 200D 2642 FE0F", "html": "🏌🏻‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏻♂", "name": "man golfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CC 1F3FB 200D 2642", "html": "🏌🏻‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏼♂️", "name": "man golfing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CC 1F3FC 200D 2642 FE0F", "html": "🏌🏼‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏼♂", "name": "man golfing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CC 1F3FC 200D 2642", "html": "🏌🏼‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏽♂️", "name": "man golfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CC 1F3FD 200D 2642 FE0F", "html": "🏌🏽‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏽♂", "name": "man golfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CC 1F3FD 200D 2642", "html": "🏌🏽‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏾♂️", "name": "man golfing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CC 1F3FE 200D 2642 FE0F", "html": "🏌🏾‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏾♂", "name": "man golfing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CC 1F3FE 200D 2642", "html": "🏌🏾‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏿♂️", "name": "man golfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CC 1F3FF 200D 2642 FE0F", "html": "🏌🏿‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏿♂", "name": "man golfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CC 1F3FF 200D 2642", "html": "🏌🏿‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌️♀️", "name": "woman golfing", "shortname": ":woman_golfing:", "unicode": "1F3CC FE0F 200D 2640 FE0F", "html": "🏌️‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌♀️", "name": "woman golfing", "shortname": ":woman_golfing:", "unicode": "1F3CC 200D 2640 FE0F", "html": "🏌‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌️♀", "name": "woman golfing", "shortname": ":woman_golfing:", "unicode": "1F3CC FE0F 200D 2640", "html": "🏌️‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏻♀️", "name": "woman golfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CC 1F3FB 200D 2640 FE0F", "html": "🏌🏻‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏻♀", "name": "woman golfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CC 1F3FB 200D 2640", "html": "🏌🏻‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏼♀️", "name": "woman golfing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CC 1F3FC 200D 2640 FE0F", "html": "🏌🏼‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏼♀", "name": "woman golfing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CC 1F3FC 200D 2640", "html": "🏌🏼‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏽♀️", "name": "woman golfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CC 1F3FD 200D 2640 FE0F", "html": "🏌🏽‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏽♀", "name": "woman golfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CC 1F3FD 200D 2640", "html": "🏌🏽‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏾♀️", "name": "woman golfing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CC 1F3FE 200D 2640 FE0F", "html": "🏌🏾‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏾♀", "name": "woman golfing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CC 1F3FE 200D 2640", "html": "🏌🏾‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏿♀️", "name": "woman golfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CC 1F3FF 200D 2640 FE0F", "html": "🏌🏿‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏌🏿♀", "name": "woman golfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CC 1F3FF 200D 2640", "html": "🏌🏿‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄♂️", "name": "man surfing", "shortname": ":man_surfing:", "unicode": "1F3C4 200D 2642 FE0F", "html": "🏄‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄♂", "name": "man surfing", "shortname": ":man_surfing:", "unicode": "1F3C4 200D 2642", "html": "🏄‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏻♂️", "name": "man surfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C4 1F3FB 200D 2642 FE0F", "html": "🏄🏻‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏻♂", "name": "man surfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C4 1F3FB 200D 2642", "html": "🏄🏻‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏼♂️", "name": "man surfing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C4 1F3FC 200D 2642 FE0F", "html": "🏄🏼‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏼♂", "name": "man surfing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C4 1F3FC 200D 2642", "html": "🏄🏼‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏽♂️", "name": "man surfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C4 1F3FD 200D 2642 FE0F", "html": "🏄🏽‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏽♂", "name": "man surfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C4 1F3FD 200D 2642", "html": "🏄🏽‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏾♂️", "name": "man surfing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C4 1F3FE 200D 2642 FE0F", "html": "🏄🏾‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏾♂", "name": "man surfing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C4 1F3FE 200D 2642", "html": "🏄🏾‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏿♂️", "name": "man surfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C4 1F3FF 200D 2642 FE0F", "html": "🏄🏿‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏿♂", "name": "man surfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C4 1F3FF 200D 2642", "html": "🏄🏿‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄♀️", "name": "woman surfing", "shortname": ":woman_surfing:", "unicode": "1F3C4 200D 2640 FE0F", "html": "🏄‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏻♀️", "name": "woman surfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C4 1F3FB 200D 2640 FE0F", "html": "🏄🏻‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏼♀️", "name": "woman surfing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C4 1F3FC 200D 2640 FE0F", "html": "🏄🏼‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏽♀️", "name": "woman surfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C4 1F3FD 200D 2640 FE0F", "html": "🏄🏽‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏾♀️", "name": "woman surfing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C4 1F3FE 200D 2640 FE0F", "html": "🏄🏾‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏄🏿♀️", "name": "woman surfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C4 1F3FF 200D 2640 FE0F", "html": "🏄🏿‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣♂️", "name": "man rowing boat", "shortname": ":man_rowing_boat:", "unicode": "1F6A3 200D 2642 FE0F", "html": "🚣‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣♂", "name": "man rowing boat", "shortname": ":man_rowing_boat:", "unicode": "1F6A3 200D 2642", "html": "🚣‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏻♂️", "name": "man rowing boat: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6A3 1F3FB 200D 2642 FE0F", "html": "🚣🏻‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏻♂", "name": "man rowing boat: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6A3 1F3FB 200D 2642", "html": "🚣🏻‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏼♂️", "name": "man rowing boat: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6A3 1F3FC 200D 2642 FE0F", "html": "🚣🏼‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏼♂", "name": "man rowing boat: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6A3 1F3FC 200D 2642", "html": "🚣🏼‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏽♂️", "name": "man rowing boat: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6A3 1F3FD 200D 2642 FE0F", "html": "🚣🏽‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏽♂", "name": "man rowing boat: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6A3 1F3FD 200D 2642", "html": "🚣🏽‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏾♂️", "name": "man rowing boat: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6A3 1F3FE 200D 2642 FE0F", "html": "🚣🏾‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏾♂", "name": "man rowing boat: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6A3 1F3FE 200D 2642", "html": "🚣🏾‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏿♂️", "name": "man rowing boat: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6A3 1F3FF 200D 2642 FE0F", "html": "🚣🏿‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏿♂", "name": "man rowing boat: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6A3 1F3FF 200D 2642", "html": "🚣🏿‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣♀️", "name": "woman rowing boat", "shortname": ":woman_rowing_boat:", "unicode": "1F6A3 200D 2640 FE0F", "html": "🚣‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏻♀️", "name": "woman rowing boat: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6A3 1F3FB 200D 2640 FE0F", "html": "🚣🏻‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏼♀️", "name": "woman rowing boat: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6A3 1F3FC 200D 2640 FE0F", "html": "🚣🏼‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏽♀️", "name": "woman rowing boat: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6A3 1F3FD 200D 2640 FE0F", "html": "🚣🏽‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏾♀️", "name": "woman rowing boat: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6A3 1F3FE 200D 2640 FE0F", "html": "🚣🏾‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚣🏿♀️", "name": "woman rowing boat: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6A3 1F3FF 200D 2640 FE0F", "html": "🚣🏿‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊♂️", "name": "man swimming", "shortname": ":man_swimming:", "unicode": "1F3CA 200D 2642 FE0F", "html": "🏊‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊♂", "name": "man swimming", "shortname": ":man_swimming:", "unicode": "1F3CA 200D 2642", "html": "🏊‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏻♂️", "name": "man swimming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CA 1F3FB 200D 2642 FE0F", "html": "🏊🏻‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏻♂", "name": "man swimming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CA 1F3FB 200D 2642", "html": "🏊🏻‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏼♂️", "name": "man swimming: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CA 1F3FC 200D 2642 FE0F", "html": "🏊🏼‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏼♂", "name": "man swimming: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CA 1F3FC 200D 2642", "html": "🏊🏼‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏽♂️", "name": "man swimming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CA 1F3FD 200D 2642 FE0F", "html": "🏊🏽‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏽♂", "name": "man swimming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CA 1F3FD 200D 2642", "html": "🏊🏽‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏾♂️", "name": "man swimming: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CA 1F3FE 200D 2642 FE0F", "html": "🏊🏾‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏾♂", "name": "man swimming: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CA 1F3FE 200D 2642", "html": "🏊🏾‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏿♂️", "name": "man swimming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CA 1F3FF 200D 2642 FE0F", "html": "🏊🏿‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏿♂", "name": "man swimming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CA 1F3FF 200D 2642", "html": "🏊🏿‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊♀️", "name": "woman swimming", "shortname": ":woman_swimming:", "unicode": "1F3CA 200D 2640 FE0F", "html": "🏊‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏻♀️", "name": "woman swimming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CA 1F3FB 200D 2640 FE0F", "html": "🏊🏻‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏼♀️", "name": "woman swimming: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CA 1F3FC 200D 2640 FE0F", "html": "🏊🏼‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏽♀️", "name": "woman swimming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CA 1F3FD 200D 2640 FE0F", "html": "🏊🏽‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏾♀️", "name": "woman swimming: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CA 1F3FE 200D 2640 FE0F", "html": "🏊🏾‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏊🏿♀️", "name": "woman swimming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CA 1F3FF 200D 2640 FE0F", "html": "🏊🏿‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹️", "name": "person bouncing ball", "shortname": ":person_bouncing_ball:", "unicode": "26F9 FE0F", "html": "⛹️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹️♂️", "name": "man bouncing ball", "shortname": ":man_bouncing_ball:", "unicode": "26F9 FE0F 200D 2642 FE0F", "html": "⛹️‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹♂️", "name": "man bouncing ball", "shortname": ":man_bouncing_ball:", "unicode": "26F9 200D 2642 FE0F", "html": "⛹‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹️♂", "name": "man bouncing ball", "shortname": ":man_bouncing_ball:", "unicode": "26F9 FE0F 200D 2642", "html": "⛹️‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹♂", "name": "man bouncing ball", "shortname": ":man_bouncing_ball:", "unicode": "26F9 200D 2642", "html": "⛹‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏻♂️", "name": "man bouncing ball: light skin tone", "shortname": ":light_skin_tone:", "unicode": "26F9 1F3FB 200D 2642 FE0F", "html": "⛹🏻‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏻♂", "name": "man bouncing ball: light skin tone", "shortname": ":light_skin_tone:", "unicode": "26F9 1F3FB 200D 2642", "html": "⛹🏻‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏼♂️", "name": "man bouncing ball: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "26F9 1F3FC 200D 2642 FE0F", "html": "⛹🏼‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏼♂", "name": "man bouncing ball: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "26F9 1F3FC 200D 2642", "html": "⛹🏼‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏽♂️", "name": "man bouncing ball: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "26F9 1F3FD 200D 2642 FE0F", "html": "⛹🏽‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏽♂", "name": "man bouncing ball: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "26F9 1F3FD 200D 2642", "html": "⛹🏽‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏾♂️", "name": "man bouncing ball: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "26F9 1F3FE 200D 2642 FE0F", "html": "⛹🏾‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏾♂", "name": "man bouncing ball: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "26F9 1F3FE 200D 2642", "html": "⛹🏾‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏿♂️", "name": "man bouncing ball: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "26F9 1F3FF 200D 2642 FE0F", "html": "⛹🏿‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏿♂", "name": "man bouncing ball: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "26F9 1F3FF 200D 2642", "html": "⛹🏿‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹️♀️", "name": "woman bouncing ball", "shortname": ":woman_bouncing_ball:", "unicode": "26F9 FE0F 200D 2640 FE0F", "html": "⛹️‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹♀️", "name": "woman bouncing ball", "shortname": ":woman_bouncing_ball:", "unicode": "26F9 200D 2640 FE0F", "html": "⛹‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹️♀", "name": "woman bouncing ball", "shortname": ":woman_bouncing_ball:", "unicode": "26F9 FE0F 200D 2640", "html": "⛹️‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏻♀️", "name": "woman bouncing ball: light skin tone", "shortname": ":light_skin_tone:", "unicode": "26F9 1F3FB 200D 2640 FE0F", "html": "⛹🏻‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏼♀️", "name": "woman bouncing ball: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "26F9 1F3FC 200D 2640 FE0F", "html": "⛹🏼‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏽♀️", "name": "woman bouncing ball: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "26F9 1F3FD 200D 2640 FE0F", "html": "⛹🏽‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏾♀️", "name": "woman bouncing ball: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "26F9 1F3FE 200D 2640 FE0F", "html": "⛹🏾‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "⛹🏿♀️", "name": "woman bouncing ball: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "26F9 1F3FF 200D 2640 FE0F", "html": "⛹🏿‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋️", "name": "person lifting weights", "shortname": ":person_lifting_weights:", "unicode": "1F3CB FE0F", "html": "🏋️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋️♂️", "name": "man lifting weights", "shortname": ":man_lifting_weights:", "unicode": "1F3CB FE0F 200D 2642 FE0F", "html": "🏋️‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋♂️", "name": "man lifting weights", "shortname": ":man_lifting_weights:", "unicode": "1F3CB 200D 2642 FE0F", "html": "🏋‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋️♂", "name": "man lifting weights", "shortname": ":man_lifting_weights:", "unicode": "1F3CB FE0F 200D 2642", "html": "🏋️‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋♂", "name": "man lifting weights", "shortname": ":man_lifting_weights:", "unicode": "1F3CB 200D 2642", "html": "🏋‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏻♂️", "name": "man lifting weights: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CB 1F3FB 200D 2642 FE0F", "html": "🏋🏻‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏻♂", "name": "man lifting weights: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CB 1F3FB 200D 2642", "html": "🏋🏻‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏼♂️", "name": "man lifting weights: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CB 1F3FC 200D 2642 FE0F", "html": "🏋🏼‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏼♂", "name": "man lifting weights: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CB 1F3FC 200D 2642", "html": "🏋🏼‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏽♂️", "name": "man lifting weights: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CB 1F3FD 200D 2642 FE0F", "html": "🏋🏽‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏽♂", "name": "man lifting weights: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CB 1F3FD 200D 2642", "html": "🏋🏽‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏾♂️", "name": "man lifting weights: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CB 1F3FE 200D 2642 FE0F", "html": "🏋🏾‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏾♂", "name": "man lifting weights: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CB 1F3FE 200D 2642", "html": "🏋🏾‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏿♂️", "name": "man lifting weights: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CB 1F3FF 200D 2642 FE0F", "html": "🏋🏿‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏿♂", "name": "man lifting weights: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CB 1F3FF 200D 2642", "html": "🏋🏿‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋️♀️", "name": "woman lifting weights", "shortname": ":woman_lifting_weights:", "unicode": "1F3CB FE0F 200D 2640 FE0F", "html": "🏋️‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋♀️", "name": "woman lifting weights", "shortname": ":woman_lifting_weights:", "unicode": "1F3CB 200D 2640 FE0F", "html": "🏋‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋️♀", "name": "woman lifting weights", "shortname": ":woman_lifting_weights:", "unicode": "1F3CB FE0F 200D 2640", "html": "🏋️‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏻♀️", "name": "woman lifting weights: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CB 1F3FB 200D 2640 FE0F", "html": "🏋🏻‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏼♀️", "name": "woman lifting weights: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CB 1F3FC 200D 2640 FE0F", "html": "🏋🏼‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏽♀️", "name": "woman lifting weights: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CB 1F3FD 200D 2640 FE0F", "html": "🏋🏽‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏾♀️", "name": "woman lifting weights: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CB 1F3FE 200D 2640 FE0F", "html": "🏋🏾‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🏋🏿♀️", "name": "woman lifting weights: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CB 1F3FF 200D 2640 FE0F", "html": "🏋🏿‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴♂️", "name": "man biking", "shortname": ":man_biking:", "unicode": "1F6B4 200D 2642 FE0F", "html": "🚴‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴♂", "name": "man biking", "shortname": ":man_biking:", "unicode": "1F6B4 200D 2642", "html": "🚴‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏻♂️", "name": "man biking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B4 1F3FB 200D 2642 FE0F", "html": "🚴🏻‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏻♂", "name": "man biking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B4 1F3FB 200D 2642", "html": "🚴🏻‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏼♂️", "name": "man biking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B4 1F3FC 200D 2642 FE0F", "html": "🚴🏼‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏼♂", "name": "man biking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B4 1F3FC 200D 2642", "html": "🚴🏼‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏽♂️", "name": "man biking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B4 1F3FD 200D 2642 FE0F", "html": "🚴🏽‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏽♂", "name": "man biking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B4 1F3FD 200D 2642", "html": "🚴🏽‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏾♂️", "name": "man biking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B4 1F3FE 200D 2642 FE0F", "html": "🚴🏾‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏾♂", "name": "man biking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B4 1F3FE 200D 2642", "html": "🚴🏾‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏿♂️", "name": "man biking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B4 1F3FF 200D 2642 FE0F", "html": "🚴🏿‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏿♂", "name": "man biking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B4 1F3FF 200D 2642", "html": "🚴🏿‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴♀️", "name": "woman biking", "shortname": ":woman_biking:", "unicode": "1F6B4 200D 2640 FE0F", "html": "🚴‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏻♀️", "name": "woman biking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B4 1F3FB 200D 2640 FE0F", "html": "🚴🏻‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏼♀️", "name": "woman biking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B4 1F3FC 200D 2640 FE0F", "html": "🚴🏼‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏽♀️", "name": "woman biking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B4 1F3FD 200D 2640 FE0F", "html": "🚴🏽‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏾♀️", "name": "woman biking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B4 1F3FE 200D 2640 FE0F", "html": "🚴🏾‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚴🏿♀️", "name": "woman biking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B4 1F3FF 200D 2640 FE0F", "html": "🚴🏿‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵♂️", "name": "man mountain biking", "shortname": ":man_mountain_biking:", "unicode": "1F6B5 200D 2642 FE0F", "html": "🚵‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵♂", "name": "man mountain biking", "shortname": ":man_mountain_biking:", "unicode": "1F6B5 200D 2642", "html": "🚵‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏻♂️", "name": "man mountain biking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B5 1F3FB 200D 2642 FE0F", "html": "🚵🏻‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏻♂", "name": "man mountain biking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B5 1F3FB 200D 2642", "html": "🚵🏻‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏼♂️", "name": "man mountain biking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B5 1F3FC 200D 2642 FE0F", "html": "🚵🏼‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏼♂", "name": "man mountain biking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B5 1F3FC 200D 2642", "html": "🚵🏼‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏽♂️", "name": "man mountain biking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B5 1F3FD 200D 2642 FE0F", "html": "🚵🏽‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏽♂", "name": "man mountain biking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B5 1F3FD 200D 2642", "html": "🚵🏽‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏾♂️", "name": "man mountain biking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B5 1F3FE 200D 2642 FE0F", "html": "🚵🏾‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏾♂", "name": "man mountain biking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B5 1F3FE 200D 2642", "html": "🚵🏾‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏿♂️", "name": "man mountain biking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B5 1F3FF 200D 2642 FE0F", "html": "🚵🏿‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏿♂", "name": "man mountain biking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B5 1F3FF 200D 2642", "html": "🚵🏿‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵♀️", "name": "woman mountain biking", "shortname": ":woman_mountain_biking:", "unicode": "1F6B5 200D 2640 FE0F", "html": "🚵‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏻♀️", "name": "woman mountain biking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B5 1F3FB 200D 2640 FE0F", "html": "🚵🏻‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏼♀️", "name": "woman mountain biking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B5 1F3FC 200D 2640 FE0F", "html": "🚵🏼‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏽♀️", "name": "woman mountain biking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B5 1F3FD 200D 2640 FE0F", "html": "🚵🏽‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏾♀️", "name": "woman mountain biking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B5 1F3FE 200D 2640 FE0F", "html": "🚵🏾‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🚵🏿♀️", "name": "woman mountain biking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B5 1F3FF 200D 2640 FE0F", "html": "🚵🏿‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸", "name": "person cartwheeling", "shortname": ":person_cartwheeling:", "unicode": "1F938", "html": "🤸", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏻", "name": "person cartwheeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F938 1F3FB", "html": "🤸🏻", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏼", "name": "person cartwheeling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F938 1F3FC", "html": "🤸🏼", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏽", "name": "person cartwheeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F938 1F3FD", "html": "🤸🏽", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏾", "name": "person cartwheeling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F938 1F3FE", "html": "🤸🏾", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏿", "name": "person cartwheeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F938 1F3FF", "html": "🤸🏿", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸♂️", "name": "man cartwheeling", "shortname": ":man_cartwheeling:", "unicode": "1F938 200D 2642 FE0F", "html": "🤸‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸♂", "name": "man cartwheeling", "shortname": ":man_cartwheeling:", "unicode": "1F938 200D 2642", "html": "🤸‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏻♂️", "name": "man cartwheeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F938 1F3FB 200D 2642 FE0F", "html": "🤸🏻‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏻♂", "name": "man cartwheeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F938 1F3FB 200D 2642", "html": "🤸🏻‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏼♂️", "name": "man cartwheeling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F938 1F3FC 200D 2642 FE0F", "html": "🤸🏼‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏼♂", "name": "man cartwheeling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F938 1F3FC 200D 2642", "html": "🤸🏼‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏽♂️", "name": "man cartwheeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F938 1F3FD 200D 2642 FE0F", "html": "🤸🏽‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏽♂", "name": "man cartwheeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F938 1F3FD 200D 2642", "html": "🤸🏽‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏾♂️", "name": "man cartwheeling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F938 1F3FE 200D 2642 FE0F", "html": "🤸🏾‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏾♂", "name": "man cartwheeling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F938 1F3FE 200D 2642", "html": "🤸🏾‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏿♂️", "name": "man cartwheeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F938 1F3FF 200D 2642 FE0F", "html": "🤸🏿‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏿♂", "name": "man cartwheeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F938 1F3FF 200D 2642", "html": "🤸🏿‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸♀️", "name": "woman cartwheeling", "shortname": ":woman_cartwheeling:", "unicode": "1F938 200D 2640 FE0F", "html": "🤸‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸♀", "name": "woman cartwheeling", "shortname": ":woman_cartwheeling:", "unicode": "1F938 200D 2640", "html": "🤸‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏻♀️", "name": "woman cartwheeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F938 1F3FB 200D 2640 FE0F", "html": "🤸🏻‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏻♀", "name": "woman cartwheeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F938 1F3FB 200D 2640", "html": "🤸🏻‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏼♀️", "name": "woman cartwheeling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F938 1F3FC 200D 2640 FE0F", "html": "🤸🏼‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏼♀", "name": "woman cartwheeling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F938 1F3FC 200D 2640", "html": "🤸🏼‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏽♀️", "name": "woman cartwheeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F938 1F3FD 200D 2640 FE0F", "html": "🤸🏽‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏽♀", "name": "woman cartwheeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F938 1F3FD 200D 2640", "html": "🤸🏽‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏾♀️", "name": "woman cartwheeling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F938 1F3FE 200D 2640 FE0F", "html": "🤸🏾‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏾♀", "name": "woman cartwheeling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F938 1F3FE 200D 2640", "html": "🤸🏾‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏿♀️", "name": "woman cartwheeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F938 1F3FF 200D 2640 FE0F", "html": "🤸🏿‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤸🏿♀", "name": "woman cartwheeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F938 1F3FF 200D 2640", "html": "🤸🏿‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤼", "name": "people wrestling", "shortname": ":people_wrestling:", "unicode": "1F93C", "html": "🤼", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤼♂️", "name": "men wrestling", "shortname": ":men_wrestling:", "unicode": "1F93C 200D 2642 FE0F", "html": "🤼‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤼♂", "name": "men wrestling", "shortname": ":men_wrestling:", "unicode": "1F93C 200D 2642", "html": "🤼‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤼♀️", "name": "women wrestling", "shortname": ":women_wrestling:", "unicode": "1F93C 200D 2640 FE0F", "html": "🤼‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤼♀", "name": "women wrestling", "shortname": ":women_wrestling:", "unicode": "1F93C 200D 2640", "html": "🤼‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽", "name": "person playing water polo", "shortname": ":person_playing_water_polo:", "unicode": "1F93D", "html": "🤽", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏻", "name": "person playing water polo: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F93D 1F3FB", "html": "🤽🏻", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏼", "name": "person playing water polo: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F93D 1F3FC", "html": "🤽🏼", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏽", "name": "person playing water polo: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F93D 1F3FD", "html": "🤽🏽", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏾", "name": "person playing water polo: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F93D 1F3FE", "html": "🤽🏾", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏿", "name": "person playing water polo: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F93D 1F3FF", "html": "🤽🏿", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽♂️", "name": "man playing water polo", "shortname": ":man_playing_water_polo:", "unicode": "1F93D 200D 2642 FE0F", "html": "🤽‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽♂", "name": "man playing water polo", "shortname": ":man_playing_water_polo:", "unicode": "1F93D 200D 2642", "html": "🤽‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏻♂️", "name": "man playing water polo: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F93D 1F3FB 200D 2642 FE0F", "html": "🤽🏻‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏻♂", "name": "man playing water polo: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F93D 1F3FB 200D 2642", "html": "🤽🏻‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏼♂️", "name": "man playing water polo: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F93D 1F3FC 200D 2642 FE0F", "html": "🤽🏼‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏼♂", "name": "man playing water polo: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F93D 1F3FC 200D 2642", "html": "🤽🏼‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏽♂️", "name": "man playing water polo: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F93D 1F3FD 200D 2642 FE0F", "html": "🤽🏽‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏽♂", "name": "man playing water polo: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F93D 1F3FD 200D 2642", "html": "🤽🏽‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏾♂️", "name": "man playing water polo: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F93D 1F3FE 200D 2642 FE0F", "html": "🤽🏾‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏾♂", "name": "man playing water polo: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F93D 1F3FE 200D 2642", "html": "🤽🏾‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏿♂️", "name": "man playing water polo: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F93D 1F3FF 200D 2642 FE0F", "html": "🤽🏿‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏿♂", "name": "man playing water polo: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F93D 1F3FF 200D 2642", "html": "🤽🏿‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽♀️", "name": "woman playing water polo", "shortname": ":woman_playing_water_polo:", "unicode": "1F93D 200D 2640 FE0F", "html": "🤽‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽♀", "name": "woman playing water polo", "shortname": ":woman_playing_water_polo:", "unicode": "1F93D 200D 2640", "html": "🤽‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏻♀️", "name": "woman playing water polo: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F93D 1F3FB 200D 2640 FE0F", "html": "🤽🏻‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏻♀", "name": "woman playing water polo: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F93D 1F3FB 200D 2640", "html": "🤽🏻‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏼♀️", "name": "woman playing water polo: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F93D 1F3FC 200D 2640 FE0F", "html": "🤽🏼‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏼♀", "name": "woman playing water polo: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F93D 1F3FC 200D 2640", "html": "🤽🏼‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏽♀️", "name": "woman playing water polo: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F93D 1F3FD 200D 2640 FE0F", "html": "🤽🏽‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏽♀", "name": "woman playing water polo: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F93D 1F3FD 200D 2640", "html": "🤽🏽‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏾♀️", "name": "woman playing water polo: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F93D 1F3FE 200D 2640 FE0F", "html": "🤽🏾‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏾♀", "name": "woman playing water polo: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F93D 1F3FE 200D 2640", "html": "🤽🏾‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏿♀️", "name": "woman playing water polo: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F93D 1F3FF 200D 2640 FE0F", "html": "🤽🏿‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤽🏿♀", "name": "woman playing water polo: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F93D 1F3FF 200D 2640", "html": "🤽🏿‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾", "name": "person playing handball", "shortname": ":person_playing_handball:", "unicode": "1F93E", "html": "🤾", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏻", "name": "person playing handball: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F93E 1F3FB", "html": "🤾🏻", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏼", "name": "person playing handball: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F93E 1F3FC", "html": "🤾🏼", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏽", "name": "person playing handball: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F93E 1F3FD", "html": "🤾🏽", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏾", "name": "person playing handball: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F93E 1F3FE", "html": "🤾🏾", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏿", "name": "person playing handball: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F93E 1F3FF", "html": "🤾🏿", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾♂️", "name": "man playing handball", "shortname": ":man_playing_handball:", "unicode": "1F93E 200D 2642 FE0F", "html": "🤾‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾♂", "name": "man playing handball", "shortname": ":man_playing_handball:", "unicode": "1F93E 200D 2642", "html": "🤾‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏻♂️", "name": "man playing handball: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F93E 1F3FB 200D 2642 FE0F", "html": "🤾🏻‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏻♂", "name": "man playing handball: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F93E 1F3FB 200D 2642", "html": "🤾🏻‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏼♂️", "name": "man playing handball: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F93E 1F3FC 200D 2642 FE0F", "html": "🤾🏼‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏼♂", "name": "man playing handball: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F93E 1F3FC 200D 2642", "html": "🤾🏼‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏽♂️", "name": "man playing handball: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F93E 1F3FD 200D 2642 FE0F", "html": "🤾🏽‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏽♂", "name": "man playing handball: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F93E 1F3FD 200D 2642", "html": "🤾🏽‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏾♂️", "name": "man playing handball: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F93E 1F3FE 200D 2642 FE0F", "html": "🤾🏾‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏾♂", "name": "man playing handball: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F93E 1F3FE 200D 2642", "html": "🤾🏾‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏿♂️", "name": "man playing handball: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F93E 1F3FF 200D 2642 FE0F", "html": "🤾🏿‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏿♂", "name": "man playing handball: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F93E 1F3FF 200D 2642", "html": "🤾🏿‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾♀️", "name": "woman playing handball", "shortname": ":woman_playing_handball:", "unicode": "1F93E 200D 2640 FE0F", "html": "🤾‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾♀", "name": "woman playing handball", "shortname": ":woman_playing_handball:", "unicode": "1F93E 200D 2640", "html": "🤾‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏻♀️", "name": "woman playing handball: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F93E 1F3FB 200D 2640 FE0F", "html": "🤾🏻‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏻♀", "name": "woman playing handball: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F93E 1F3FB 200D 2640", "html": "🤾🏻‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏼♀️", "name": "woman playing handball: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F93E 1F3FC 200D 2640 FE0F", "html": "🤾🏼‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏼♀", "name": "woman playing handball: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F93E 1F3FC 200D 2640", "html": "🤾🏼‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏽♀️", "name": "woman playing handball: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F93E 1F3FD 200D 2640 FE0F", "html": "🤾🏽‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏽♀", "name": "woman playing handball: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F93E 1F3FD 200D 2640", "html": "🤾🏽‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏾♀️", "name": "woman playing handball: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F93E 1F3FE 200D 2640 FE0F", "html": "🤾🏾‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏾♀", "name": "woman playing handball: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F93E 1F3FE 200D 2640", "html": "🤾🏾‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏿♀️", "name": "woman playing handball: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F93E 1F3FF 200D 2640 FE0F", "html": "🤾🏿‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤾🏿♀", "name": "woman playing handball: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F93E 1F3FF 200D 2640", "html": "🤾🏿‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹", "name": "person juggling", "shortname": ":person_juggling:", "unicode": "1F939", "html": "🤹", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏻", "name": "person juggling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F939 1F3FB", "html": "🤹🏻", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏼", "name": "person juggling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F939 1F3FC", "html": "🤹🏼", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏽", "name": "person juggling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F939 1F3FD", "html": "🤹🏽", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏾", "name": "person juggling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F939 1F3FE", "html": "🤹🏾", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏿", "name": "person juggling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F939 1F3FF", "html": "🤹🏿", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹♂️", "name": "man juggling", "shortname": ":man_juggling:", "unicode": "1F939 200D 2642 FE0F", "html": "🤹‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹♂", "name": "man juggling", "shortname": ":man_juggling:", "unicode": "1F939 200D 2642", "html": "🤹‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏻♂️", "name": "man juggling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F939 1F3FB 200D 2642 FE0F", "html": "🤹🏻‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏻♂", "name": "man juggling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F939 1F3FB 200D 2642", "html": "🤹🏻‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏼♂️", "name": "man juggling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F939 1F3FC 200D 2642 FE0F", "html": "🤹🏼‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏼♂", "name": "man juggling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F939 1F3FC 200D 2642", "html": "🤹🏼‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏽♂️", "name": "man juggling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F939 1F3FD 200D 2642 FE0F", "html": "🤹🏽‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏽♂", "name": "man juggling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F939 1F3FD 200D 2642", "html": "🤹🏽‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏾♂️", "name": "man juggling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F939 1F3FE 200D 2642 FE0F", "html": "🤹🏾‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏾♂", "name": "man juggling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F939 1F3FE 200D 2642", "html": "🤹🏾‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏿♂️", "name": "man juggling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F939 1F3FF 200D 2642 FE0F", "html": "🤹🏿‍♂️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏿♂", "name": "man juggling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F939 1F3FF 200D 2642", "html": "🤹🏿‍♂", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹♀️", "name": "woman juggling", "shortname": ":woman_juggling:", "unicode": "1F939 200D 2640 FE0F", "html": "🤹‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹♀", "name": "woman juggling", "shortname": ":woman_juggling:", "unicode": "1F939 200D 2640", "html": "🤹‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏻♀️", "name": "woman juggling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F939 1F3FB 200D 2640 FE0F", "html": "🤹🏻‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏻♀", "name": "woman juggling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F939 1F3FB 200D 2640", "html": "🤹🏻‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏼♀️", "name": "woman juggling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F939 1F3FC 200D 2640 FE0F", "html": "🤹🏼‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏼♀", "name": "woman juggling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F939 1F3FC 200D 2640", "html": "🤹🏼‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏽♀️", "name": "woman juggling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F939 1F3FD 200D 2640 FE0F", "html": "🤹🏽‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏽♀", "name": "woman juggling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F939 1F3FD 200D 2640", "html": "🤹🏽‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏾♀️", "name": "woman juggling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F939 1F3FE 200D 2640 FE0F", "html": "🤹🏾‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏾♀", "name": "woman juggling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F939 1F3FE 200D 2640", "html": "🤹🏾‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏿♀️", "name": "woman juggling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F939 1F3FF 200D 2640 FE0F", "html": "🤹🏿‍♀️", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🤹🏿♀", "name": "woman juggling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F939 1F3FF 200D 2640", "html": "🤹🏿‍♀", "category": "People & Body (person-sport)", "order": ""}, + {"emoji": "🧘", "name": "person in lotus position", "shortname": ":person_in_lotus_position:", "unicode": "1F9D8", "html": "🧘", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏻", "name": "person in lotus position: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D8 1F3FB", "html": "🧘🏻", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏼", "name": "person in lotus position: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D8 1F3FC", "html": "🧘🏼", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏽", "name": "person in lotus position: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D8 1F3FD", "html": "🧘🏽", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏾", "name": "person in lotus position: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D8 1F3FE", "html": "🧘🏾", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏿", "name": "person in lotus position: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D8 1F3FF", "html": "🧘🏿", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘♂️", "name": "man in lotus position", "shortname": ":man_in_lotus_position:", "unicode": "1F9D8 200D 2642 FE0F", "html": "🧘‍♂️", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘♂", "name": "man in lotus position", "shortname": ":man_in_lotus_position:", "unicode": "1F9D8 200D 2642", "html": "🧘‍♂", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏻♂️", "name": "man in lotus position: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D8 1F3FB 200D 2642 FE0F", "html": "🧘🏻‍♂️", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏻♂", "name": "man in lotus position: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D8 1F3FB 200D 2642", "html": "🧘🏻‍♂", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏼♂️", "name": "man in lotus position: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D8 1F3FC 200D 2642 FE0F", "html": "🧘🏼‍♂️", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏼♂", "name": "man in lotus position: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D8 1F3FC 200D 2642", "html": "🧘🏼‍♂", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏽♂️", "name": "man in lotus position: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D8 1F3FD 200D 2642 FE0F", "html": "🧘🏽‍♂️", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏽♂", "name": "man in lotus position: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D8 1F3FD 200D 2642", "html": "🧘🏽‍♂", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏾♂️", "name": "man in lotus position: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D8 1F3FE 200D 2642 FE0F", "html": "🧘🏾‍♂️", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏾♂", "name": "man in lotus position: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D8 1F3FE 200D 2642", "html": "🧘🏾‍♂", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏿♂️", "name": "man in lotus position: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D8 1F3FF 200D 2642 FE0F", "html": "🧘🏿‍♂️", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏿♂", "name": "man in lotus position: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D8 1F3FF 200D 2642", "html": "🧘🏿‍♂", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘♀️", "name": "woman in lotus position", "shortname": ":woman_in_lotus_position:", "unicode": "1F9D8 200D 2640 FE0F", "html": "🧘‍♀️", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘♀", "name": "woman in lotus position", "shortname": ":woman_in_lotus_position:", "unicode": "1F9D8 200D 2640", "html": "🧘‍♀", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏻♀️", "name": "woman in lotus position: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D8 1F3FB 200D 2640 FE0F", "html": "🧘🏻‍♀️", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏻♀", "name": "woman in lotus position: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D8 1F3FB 200D 2640", "html": "🧘🏻‍♀", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏼♀️", "name": "woman in lotus position: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D8 1F3FC 200D 2640 FE0F", "html": "🧘🏼‍♀️", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏼♀", "name": "woman in lotus position: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D8 1F3FC 200D 2640", "html": "🧘🏼‍♀", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏽♀️", "name": "woman in lotus position: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D8 1F3FD 200D 2640 FE0F", "html": "🧘🏽‍♀️", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏽♀", "name": "woman in lotus position: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D8 1F3FD 200D 2640", "html": "🧘🏽‍♀", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏾♀️", "name": "woman in lotus position: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D8 1F3FE 200D 2640 FE0F", "html": "🧘🏾‍♀️", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏾♀", "name": "woman in lotus position: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D8 1F3FE 200D 2640", "html": "🧘🏾‍♀", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏿♀️", "name": "woman in lotus position: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D8 1F3FF 200D 2640 FE0F", "html": "🧘🏿‍♀️", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧘🏿♀", "name": "woman in lotus position: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D8 1F3FF 200D 2640", "html": "🧘🏿‍♀", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🛌🏻", "name": "person in bed: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6CC 1F3FB", "html": "🛌🏻", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🛌🏼", "name": "person in bed: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6CC 1F3FC", "html": "🛌🏼", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🛌🏽", "name": "person in bed: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6CC 1F3FD", "html": "🛌🏽", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🛌🏾", "name": "person in bed: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6CC 1F3FE", "html": "🛌🏾", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🛌🏿", "name": "person in bed: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6CC 1F3FF", "html": "🛌🏿", "category": "People & Body (person-resting)", "order": ""}, + {"emoji": "🧑🤝🧑", "name": "people holding hands", "shortname": ":people_holding_hands:", "unicode": "1F9D1 200D 1F91D 200D 1F9D1", "html": "🧑‍🤝‍🧑", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏻🤝🧑🏻", "name": "people holding hands: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FB", "html": "🧑🏻‍🤝‍🧑🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏻🤝🧑🏼", "name": "people holding hands: light skin tone, medium-light skin tone", "shortname": ":light_skin_tone_mediumlight_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FC", "html": "🧑🏻‍🤝‍🧑🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏻🤝🧑🏽", "name": "people holding hands: light skin tone, medium skin tone", "shortname": ":light_skin_tone_medium_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FD", "html": "🧑🏻‍🤝‍🧑🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏻🤝🧑🏾", "name": "people holding hands: light skin tone, medium-dark skin tone", "shortname": ":light_skin_tone_mediumdark_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FE", "html": "🧑🏻‍🤝‍🧑🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏻🤝🧑🏿", "name": "people holding hands: light skin tone, dark skin tone", "shortname": ":light_skin_tone_dark_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FF", "html": "🧑🏻‍🤝‍🧑🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏼🤝🧑🏻", "name": "people holding hands: medium-light skin tone, light skin tone", "shortname": ":mediumlight_skin_tone_light_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FB", "html": "🧑🏼‍🤝‍🧑🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏼🤝🧑🏼", "name": "people holding hands: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FC", "html": "🧑🏼‍🤝‍🧑🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏼🤝🧑🏽", "name": "people holding hands: medium-light skin tone, medium skin tone", "shortname": ":mediumlight_skin_tone_medium_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FD", "html": "🧑🏼‍🤝‍🧑🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏼🤝🧑🏾", "name": "people holding hands: medium-light skin tone, medium-dark skin tone", "shortname": ":mediumlight_skin_tone_medium-dark_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FE", "html": "🧑🏼‍🤝‍🧑🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏼🤝🧑🏿", "name": "people holding hands: medium-light skin tone, dark skin tone", "shortname": ":mediumlight_skin_tone_dark_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FF", "html": "🧑🏼‍🤝‍🧑🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏽🤝🧑🏻", "name": "people holding hands: medium skin tone, light skin tone", "shortname": ":medium_skin_tone_light_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FB", "html": "🧑🏽‍🤝‍🧑🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏽🤝🧑🏼", "name": "people holding hands: medium skin tone, medium-light skin tone", "shortname": ":medium_skin_tone_mediumlight_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FC", "html": "🧑🏽‍🤝‍🧑🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏽🤝🧑🏽", "name": "people holding hands: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FD", "html": "🧑🏽‍🤝‍🧑🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏽🤝🧑🏾", "name": "people holding hands: medium skin tone, medium-dark skin tone", "shortname": ":medium_skin_tone_mediumdark_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FE", "html": "🧑🏽‍🤝‍🧑🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏽🤝🧑🏿", "name": "people holding hands: medium skin tone, dark skin tone", "shortname": ":medium_skin_tone_dark_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FF", "html": "🧑🏽‍🤝‍🧑🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏾🤝🧑🏻", "name": "people holding hands: medium-dark skin tone, light skin tone", "shortname": ":mediumdark_skin_tone_light_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FB", "html": "🧑🏾‍🤝‍🧑🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏾🤝🧑🏼", "name": "people holding hands: medium-dark skin tone, medium-light skin tone", "shortname": ":mediumdark_skin_tone_medium-light_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FC", "html": "🧑🏾‍🤝‍🧑🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏾🤝🧑🏽", "name": "people holding hands: medium-dark skin tone, medium skin tone", "shortname": ":mediumdark_skin_tone_medium_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FD", "html": "🧑🏾‍🤝‍🧑🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏾🤝🧑🏾", "name": "people holding hands: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FE", "html": "🧑🏾‍🤝‍🧑🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏾🤝🧑🏿", "name": "people holding hands: medium-dark skin tone, dark skin tone", "shortname": ":mediumdark_skin_tone_dark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FF", "html": "🧑🏾‍🤝‍🧑🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏿🤝🧑🏻", "name": "people holding hands: dark skin tone, light skin tone", "shortname": ":dark_skin_tone_light_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FB", "html": "🧑🏿‍🤝‍🧑🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏿🤝🧑🏼", "name": "people holding hands: dark skin tone, medium-light skin tone", "shortname": ":dark_skin_tone_mediumlight_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FC", "html": "🧑🏿‍🤝‍🧑🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏿🤝🧑🏽", "name": "people holding hands: dark skin tone, medium skin tone", "shortname": ":dark_skin_tone_medium_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FD", "html": "🧑🏿‍🤝‍🧑🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏿🤝🧑🏾", "name": "people holding hands: dark skin tone, medium-dark skin tone", "shortname": ":dark_skin_tone_mediumdark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FE", "html": "🧑🏿‍🤝‍🧑🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "🧑🏿🤝🧑🏿", "name": "people holding hands: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FF", "html": "🧑🏿‍🤝‍🧑🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "👭🏻", "name": "women holding hands: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F46D 1F3FB", "html": "👭🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏻🤝👩🏼", "name": "women holding hands: light skin tone, medium-light skin tone", "shortname": ":light_skin_tone_mediumlight_skin_tone:", "unicode": "1F469 1F3FB 200D 1F91D 200D 1F469 1F3FC", "html": "👩🏻‍🤝‍👩🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏻🤝👩🏽", "name": "women holding hands: light skin tone, medium skin tone", "shortname": ":light_skin_tone_medium_skin_tone:", "unicode": "1F469 1F3FB 200D 1F91D 200D 1F469 1F3FD", "html": "👩🏻‍🤝‍👩🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏻🤝👩🏾", "name": "women holding hands: light skin tone, medium-dark skin tone", "shortname": ":light_skin_tone_mediumdark_skin_tone:", "unicode": "1F469 1F3FB 200D 1F91D 200D 1F469 1F3FE", "html": "👩🏻‍🤝‍👩🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏻🤝👩🏿", "name": "women holding hands: light skin tone, dark skin tone", "shortname": ":light_skin_tone_dark_skin_tone:", "unicode": "1F469 1F3FB 200D 1F91D 200D 1F469 1F3FF", "html": "👩🏻‍🤝‍👩🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏼🤝👩🏻", "name": "women holding hands: medium-light skin tone, light skin tone", "shortname": ":mediumlight_skin_tone_light_skin_tone:", "unicode": "1F469 1F3FC 200D 1F91D 200D 1F469 1F3FB", "html": "👩🏼‍🤝‍👩🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "👭🏼", "name": "women holding hands: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F46D 1F3FC", "html": "👭🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏼🤝👩🏽", "name": "women holding hands: medium-light skin tone, medium skin tone", "shortname": ":mediumlight_skin_tone_medium_skin_tone:", "unicode": "1F469 1F3FC 200D 1F91D 200D 1F469 1F3FD", "html": "👩🏼‍🤝‍👩🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏼🤝👩🏾", "name": "women holding hands: medium-light skin tone, medium-dark skin tone", "shortname": ":mediumlight_skin_tone_medium-dark_skin_tone:", "unicode": "1F469 1F3FC 200D 1F91D 200D 1F469 1F3FE", "html": "👩🏼‍🤝‍👩🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏼🤝👩🏿", "name": "women holding hands: medium-light skin tone, dark skin tone", "shortname": ":mediumlight_skin_tone_dark_skin_tone:", "unicode": "1F469 1F3FC 200D 1F91D 200D 1F469 1F3FF", "html": "👩🏼‍🤝‍👩🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏽🤝👩🏻", "name": "women holding hands: medium skin tone, light skin tone", "shortname": ":medium_skin_tone_light_skin_tone:", "unicode": "1F469 1F3FD 200D 1F91D 200D 1F469 1F3FB", "html": "👩🏽‍🤝‍👩🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏽🤝👩🏼", "name": "women holding hands: medium skin tone, medium-light skin tone", "shortname": ":medium_skin_tone_mediumlight_skin_tone:", "unicode": "1F469 1F3FD 200D 1F91D 200D 1F469 1F3FC", "html": "👩🏽‍🤝‍👩🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "👭🏽", "name": "women holding hands: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F46D 1F3FD", "html": "👭🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏽🤝👩🏾", "name": "women holding hands: medium skin tone, medium-dark skin tone", "shortname": ":medium_skin_tone_mediumdark_skin_tone:", "unicode": "1F469 1F3FD 200D 1F91D 200D 1F469 1F3FE", "html": "👩🏽‍🤝‍👩🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏽🤝👩🏿", "name": "women holding hands: medium skin tone, dark skin tone", "shortname": ":medium_skin_tone_dark_skin_tone:", "unicode": "1F469 1F3FD 200D 1F91D 200D 1F469 1F3FF", "html": "👩🏽‍🤝‍👩🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏾🤝👩🏻", "name": "women holding hands: medium-dark skin tone, light skin tone", "shortname": ":mediumdark_skin_tone_light_skin_tone:", "unicode": "1F469 1F3FE 200D 1F91D 200D 1F469 1F3FB", "html": "👩🏾‍🤝‍👩🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏾🤝👩🏼", "name": "women holding hands: medium-dark skin tone, medium-light skin tone", "shortname": ":mediumdark_skin_tone_medium-light_skin_tone:", "unicode": "1F469 1F3FE 200D 1F91D 200D 1F469 1F3FC", "html": "👩🏾‍🤝‍👩🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏾🤝👩🏽", "name": "women holding hands: medium-dark skin tone, medium skin tone", "shortname": ":mediumdark_skin_tone_medium_skin_tone:", "unicode": "1F469 1F3FE 200D 1F91D 200D 1F469 1F3FD", "html": "👩🏾‍🤝‍👩🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "👭🏾", "name": "women holding hands: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F46D 1F3FE", "html": "👭🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏾🤝👩🏿", "name": "women holding hands: medium-dark skin tone, dark skin tone", "shortname": ":mediumdark_skin_tone_dark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F91D 200D 1F469 1F3FF", "html": "👩🏾‍🤝‍👩🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏿🤝👩🏻", "name": "women holding hands: dark skin tone, light skin tone", "shortname": ":dark_skin_tone_light_skin_tone:", "unicode": "1F469 1F3FF 200D 1F91D 200D 1F469 1F3FB", "html": "👩🏿‍🤝‍👩🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏿🤝👩🏼", "name": "women holding hands: dark skin tone, medium-light skin tone", "shortname": ":dark_skin_tone_mediumlight_skin_tone:", "unicode": "1F469 1F3FF 200D 1F91D 200D 1F469 1F3FC", "html": "👩🏿‍🤝‍👩🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏿🤝👩🏽", "name": "women holding hands: dark skin tone, medium skin tone", "shortname": ":dark_skin_tone_medium_skin_tone:", "unicode": "1F469 1F3FF 200D 1F91D 200D 1F469 1F3FD", "html": "👩🏿‍🤝‍👩🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏿🤝👩🏾", "name": "women holding hands: dark skin tone, medium-dark skin tone", "shortname": ":dark_skin_tone_mediumdark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F91D 200D 1F469 1F3FE", "html": "👩🏿‍🤝‍👩🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "👭🏿", "name": "women holding hands: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F46D 1F3FF", "html": "👭🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "👫🏻", "name": "woman and man holding hands: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F46B 1F3FB", "html": "👫🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏻🤝👨🏼", "name": "woman and man holding hands: light skin tone, medium-light skin tone", "shortname": ":light_skin_tone_mediumlight_skin_tone:", "unicode": "1F469 1F3FB 200D 1F91D 200D 1F468 1F3FC", "html": "👩🏻‍🤝‍👨🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏻🤝👨🏽", "name": "woman and man holding hands: light skin tone, medium skin tone", "shortname": ":light_skin_tone_medium_skin_tone:", "unicode": "1F469 1F3FB 200D 1F91D 200D 1F468 1F3FD", "html": "👩🏻‍🤝‍👨🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏻🤝👨🏾", "name": "woman and man holding hands: light skin tone, medium-dark skin tone", "shortname": ":light_skin_tone_mediumdark_skin_tone:", "unicode": "1F469 1F3FB 200D 1F91D 200D 1F468 1F3FE", "html": "👩🏻‍🤝‍👨🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏻🤝👨🏿", "name": "woman and man holding hands: light skin tone, dark skin tone", "shortname": ":light_skin_tone_dark_skin_tone:", "unicode": "1F469 1F3FB 200D 1F91D 200D 1F468 1F3FF", "html": "👩🏻‍🤝‍👨🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏼🤝👨🏻", "name": "woman and man holding hands: medium-light skin tone, light skin tone", "shortname": ":mediumlight_skin_tone_light_skin_tone:", "unicode": "1F469 1F3FC 200D 1F91D 200D 1F468 1F3FB", "html": "👩🏼‍🤝‍👨🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "👫🏼", "name": "woman and man holding hands: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F46B 1F3FC", "html": "👫🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏼🤝👨🏽", "name": "woman and man holding hands: medium-light skin tone, medium skin tone", "shortname": ":mediumlight_skin_tone_medium_skin_tone:", "unicode": "1F469 1F3FC 200D 1F91D 200D 1F468 1F3FD", "html": "👩🏼‍🤝‍👨🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏼🤝👨🏾", "name": "woman and man holding hands: medium-light skin tone, medium-dark skin tone", "shortname": ":mediumlight_skin_tone_medium-dark_skin_tone:", "unicode": "1F469 1F3FC 200D 1F91D 200D 1F468 1F3FE", "html": "👩🏼‍🤝‍👨🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏼🤝👨🏿", "name": "woman and man holding hands: medium-light skin tone, dark skin tone", "shortname": ":mediumlight_skin_tone_dark_skin_tone:", "unicode": "1F469 1F3FC 200D 1F91D 200D 1F468 1F3FF", "html": "👩🏼‍🤝‍👨🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏽🤝👨🏻", "name": "woman and man holding hands: medium skin tone, light skin tone", "shortname": ":medium_skin_tone_light_skin_tone:", "unicode": "1F469 1F3FD 200D 1F91D 200D 1F468 1F3FB", "html": "👩🏽‍🤝‍👨🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏽🤝👨🏼", "name": "woman and man holding hands: medium skin tone, medium-light skin tone", "shortname": ":medium_skin_tone_mediumlight_skin_tone:", "unicode": "1F469 1F3FD 200D 1F91D 200D 1F468 1F3FC", "html": "👩🏽‍🤝‍👨🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "👫🏽", "name": "woman and man holding hands: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F46B 1F3FD", "html": "👫🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏽🤝👨🏾", "name": "woman and man holding hands: medium skin tone, medium-dark skin tone", "shortname": ":medium_skin_tone_mediumdark_skin_tone:", "unicode": "1F469 1F3FD 200D 1F91D 200D 1F468 1F3FE", "html": "👩🏽‍🤝‍👨🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏽🤝👨🏿", "name": "woman and man holding hands: medium skin tone, dark skin tone", "shortname": ":medium_skin_tone_dark_skin_tone:", "unicode": "1F469 1F3FD 200D 1F91D 200D 1F468 1F3FF", "html": "👩🏽‍🤝‍👨🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏾🤝👨🏻", "name": "woman and man holding hands: medium-dark skin tone, light skin tone", "shortname": ":mediumdark_skin_tone_light_skin_tone:", "unicode": "1F469 1F3FE 200D 1F91D 200D 1F468 1F3FB", "html": "👩🏾‍🤝‍👨🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏾🤝👨🏼", "name": "woman and man holding hands: medium-dark skin tone, medium-light skin tone", "shortname": ":mediumdark_skin_tone_medium-light_skin_tone:", "unicode": "1F469 1F3FE 200D 1F91D 200D 1F468 1F3FC", "html": "👩🏾‍🤝‍👨🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏾🤝👨🏽", "name": "woman and man holding hands: medium-dark skin tone, medium skin tone", "shortname": ":mediumdark_skin_tone_medium_skin_tone:", "unicode": "1F469 1F3FE 200D 1F91D 200D 1F468 1F3FD", "html": "👩🏾‍🤝‍👨🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "👫🏾", "name": "woman and man holding hands: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F46B 1F3FE", "html": "👫🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏾🤝👨🏿", "name": "woman and man holding hands: medium-dark skin tone, dark skin tone", "shortname": ":mediumdark_skin_tone_dark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F91D 200D 1F468 1F3FF", "html": "👩🏾‍🤝‍👨🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏿🤝👨🏻", "name": "woman and man holding hands: dark skin tone, light skin tone", "shortname": ":dark_skin_tone_light_skin_tone:", "unicode": "1F469 1F3FF 200D 1F91D 200D 1F468 1F3FB", "html": "👩🏿‍🤝‍👨🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏿🤝👨🏼", "name": "woman and man holding hands: dark skin tone, medium-light skin tone", "shortname": ":dark_skin_tone_mediumlight_skin_tone:", "unicode": "1F469 1F3FF 200D 1F91D 200D 1F468 1F3FC", "html": "👩🏿‍🤝‍👨🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏿🤝👨🏽", "name": "woman and man holding hands: dark skin tone, medium skin tone", "shortname": ":dark_skin_tone_medium_skin_tone:", "unicode": "1F469 1F3FF 200D 1F91D 200D 1F468 1F3FD", "html": "👩🏿‍🤝‍👨🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩🏿🤝👨🏾", "name": "woman and man holding hands: dark skin tone, medium-dark skin tone", "shortname": ":dark_skin_tone_mediumdark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F91D 200D 1F468 1F3FE", "html": "👩🏿‍🤝‍👨🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "👫🏿", "name": "woman and man holding hands: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F46B 1F3FF", "html": "👫🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "👬🏻", "name": "men holding hands: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F46C 1F3FB", "html": "👬🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏻🤝👨🏼", "name": "men holding hands: light skin tone, medium-light skin tone", "shortname": ":light_skin_tone_mediumlight_skin_tone:", "unicode": "1F468 1F3FB 200D 1F91D 200D 1F468 1F3FC", "html": "👨🏻‍🤝‍👨🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏻🤝👨🏽", "name": "men holding hands: light skin tone, medium skin tone", "shortname": ":light_skin_tone_medium_skin_tone:", "unicode": "1F468 1F3FB 200D 1F91D 200D 1F468 1F3FD", "html": "👨🏻‍🤝‍👨🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏻🤝👨🏾", "name": "men holding hands: light skin tone, medium-dark skin tone", "shortname": ":light_skin_tone_mediumdark_skin_tone:", "unicode": "1F468 1F3FB 200D 1F91D 200D 1F468 1F3FE", "html": "👨🏻‍🤝‍👨🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏻🤝👨🏿", "name": "men holding hands: light skin tone, dark skin tone", "shortname": ":light_skin_tone_dark_skin_tone:", "unicode": "1F468 1F3FB 200D 1F91D 200D 1F468 1F3FF", "html": "👨🏻‍🤝‍👨🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏼🤝👨🏻", "name": "men holding hands: medium-light skin tone, light skin tone", "shortname": ":mediumlight_skin_tone_light_skin_tone:", "unicode": "1F468 1F3FC 200D 1F91D 200D 1F468 1F3FB", "html": "👨🏼‍🤝‍👨🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "👬🏼", "name": "men holding hands: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F46C 1F3FC", "html": "👬🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏼🤝👨🏽", "name": "men holding hands: medium-light skin tone, medium skin tone", "shortname": ":mediumlight_skin_tone_medium_skin_tone:", "unicode": "1F468 1F3FC 200D 1F91D 200D 1F468 1F3FD", "html": "👨🏼‍🤝‍👨🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏼🤝👨🏾", "name": "men holding hands: medium-light skin tone, medium-dark skin tone", "shortname": ":mediumlight_skin_tone_medium-dark_skin_tone:", "unicode": "1F468 1F3FC 200D 1F91D 200D 1F468 1F3FE", "html": "👨🏼‍🤝‍👨🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏼🤝👨🏿", "name": "men holding hands: medium-light skin tone, dark skin tone", "shortname": ":mediumlight_skin_tone_dark_skin_tone:", "unicode": "1F468 1F3FC 200D 1F91D 200D 1F468 1F3FF", "html": "👨🏼‍🤝‍👨🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏽🤝👨🏻", "name": "men holding hands: medium skin tone, light skin tone", "shortname": ":medium_skin_tone_light_skin_tone:", "unicode": "1F468 1F3FD 200D 1F91D 200D 1F468 1F3FB", "html": "👨🏽‍🤝‍👨🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏽🤝👨🏼", "name": "men holding hands: medium skin tone, medium-light skin tone", "shortname": ":medium_skin_tone_mediumlight_skin_tone:", "unicode": "1F468 1F3FD 200D 1F91D 200D 1F468 1F3FC", "html": "👨🏽‍🤝‍👨🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "👬🏽", "name": "men holding hands: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F46C 1F3FD", "html": "👬🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏽🤝👨🏾", "name": "men holding hands: medium skin tone, medium-dark skin tone", "shortname": ":medium_skin_tone_mediumdark_skin_tone:", "unicode": "1F468 1F3FD 200D 1F91D 200D 1F468 1F3FE", "html": "👨🏽‍🤝‍👨🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏽🤝👨🏿", "name": "men holding hands: medium skin tone, dark skin tone", "shortname": ":medium_skin_tone_dark_skin_tone:", "unicode": "1F468 1F3FD 200D 1F91D 200D 1F468 1F3FF", "html": "👨🏽‍🤝‍👨🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏾🤝👨🏻", "name": "men holding hands: medium-dark skin tone, light skin tone", "shortname": ":mediumdark_skin_tone_light_skin_tone:", "unicode": "1F468 1F3FE 200D 1F91D 200D 1F468 1F3FB", "html": "👨🏾‍🤝‍👨🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏾🤝👨🏼", "name": "men holding hands: medium-dark skin tone, medium-light skin tone", "shortname": ":mediumdark_skin_tone_medium-light_skin_tone:", "unicode": "1F468 1F3FE 200D 1F91D 200D 1F468 1F3FC", "html": "👨🏾‍🤝‍👨🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏾🤝👨🏽", "name": "men holding hands: medium-dark skin tone, medium skin tone", "shortname": ":mediumdark_skin_tone_medium_skin_tone:", "unicode": "1F468 1F3FE 200D 1F91D 200D 1F468 1F3FD", "html": "👨🏾‍🤝‍👨🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "👬🏾", "name": "men holding hands: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F46C 1F3FE", "html": "👬🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏾🤝👨🏿", "name": "men holding hands: medium-dark skin tone, dark skin tone", "shortname": ":mediumdark_skin_tone_dark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F91D 200D 1F468 1F3FF", "html": "👨🏾‍🤝‍👨🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏿🤝👨🏻", "name": "men holding hands: dark skin tone, light skin tone", "shortname": ":dark_skin_tone_light_skin_tone:", "unicode": "1F468 1F3FF 200D 1F91D 200D 1F468 1F3FB", "html": "👨🏿‍🤝‍👨🏻", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏿🤝👨🏼", "name": "men holding hands: dark skin tone, medium-light skin tone", "shortname": ":dark_skin_tone_mediumlight_skin_tone:", "unicode": "1F468 1F3FF 200D 1F91D 200D 1F468 1F3FC", "html": "👨🏿‍🤝‍👨🏼", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏿🤝👨🏽", "name": "men holding hands: dark skin tone, medium skin tone", "shortname": ":dark_skin_tone_medium_skin_tone:", "unicode": "1F468 1F3FF 200D 1F91D 200D 1F468 1F3FD", "html": "👨🏿‍🤝‍👨🏽", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨🏿🤝👨🏾", "name": "men holding hands: dark skin tone, medium-dark skin tone", "shortname": ":dark_skin_tone_mediumdark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F91D 200D 1F468 1F3FE", "html": "👨🏿‍🤝‍👨🏾", "category": "People & Body (family)", "order": ""}, + {"emoji": "👬🏿", "name": "men holding hands: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F46C 1F3FF", "html": "👬🏿", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩❤️💋👨", "name": "kiss: woman, man", "shortname": ":woman_man:", "unicode": "1F469 200D 2764 FE0F 200D 1F48B 200D 1F468", "html": "👩‍❤️‍💋‍👨", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩❤💋👨", "name": "kiss: woman, man", "shortname": ":woman_man:", "unicode": "1F469 200D 2764 200D 1F48B 200D 1F468", "html": "👩‍❤‍💋‍👨", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨❤💋👨", "name": "kiss: man, man", "shortname": ":man_man:", "unicode": "1F468 200D 2764 200D 1F48B 200D 1F468", "html": "👨‍❤‍💋‍👨", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩❤💋👩", "name": "kiss: woman, woman", "shortname": ":woman_woman:", "unicode": "1F469 200D 2764 200D 1F48B 200D 1F469", "html": "👩‍❤‍💋‍👩", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩❤️👨", "name": "couple with heart: woman, man", "shortname": ":woman_man:", "unicode": "1F469 200D 2764 FE0F 200D 1F468", "html": "👩‍❤️‍👨", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩❤👨", "name": "couple with heart: woman, man", "shortname": ":woman_man:", "unicode": "1F469 200D 2764 200D 1F468", "html": "👩‍❤‍👨", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨❤👨", "name": "couple with heart: man, man", "shortname": ":man_man:", "unicode": "1F468 200D 2764 200D 1F468", "html": "👨‍❤‍👨", "category": "People & Body (family)", "order": ""}, + {"emoji": "👩❤👩", "name": "couple with heart: woman, woman", "shortname": ":woman_woman:", "unicode": "1F469 200D 2764 200D 1F469", "html": "👩‍❤‍👩", "category": "People & Body (family)", "order": ""}, + {"emoji": "👨👩👦", "name": "family: man, woman, boy", "shortname": ":man_woman_boy:", "unicode": "1F468 200D 1F469 200D 1F466", "html": "👨‍👩‍👦", "category": "People & Body (family)", "order": ""}, + {"emoji": "🗣️", "name": "speaking head", "shortname": ":speaking_head:", "unicode": "1F5E3 FE0F", "html": "🗣️", "category": "People & Body (person-symbol)", "order": ""}, + {"emoji": "🏻", "name": "light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3FB", "html": "🏻", "category": "Component (skin-tone)", "order": ""}, + {"emoji": "🏼", "name": "medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3FC", "html": "🏼", "category": "Component (skin-tone)", "order": ""}, + {"emoji": "🏽", "name": "medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3FD", "html": "🏽", "category": "Component (skin-tone)", "order": ""}, + {"emoji": "🏾", "name": "medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3FE", "html": "🏾", "category": "Component (skin-tone)", "order": ""}, + {"emoji": "🏿", "name": "dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3FF", "html": "🏿", "category": "Component (skin-tone)", "order": ""}, + {"emoji": "🦰", "name": "red hair", "shortname": ":red_hair:", "unicode": "1F9B0", "html": "🦰", "category": "Component (hair-style)", "order": ""}, + {"emoji": "🦱", "name": "curly hair", "shortname": ":curly_hair:", "unicode": "1F9B1", "html": "🦱", "category": "Component (hair-style)", "order": ""}, + {"emoji": "🦳", "name": "white hair", "shortname": ":white_hair:", "unicode": "1F9B3", "html": "🦳", "category": "Component (hair-style)", "order": ""}, + {"emoji": "🦲", "name": "bald", "shortname": ":bald:", "unicode": "1F9B2", "html": "🦲", "category": "Component (hair-style)", "order": ""}, + {"emoji": "🦍", "name": "gorilla", "shortname": ":gorilla:", "unicode": "1F98D", "html": "🦍", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🦧", "name": "orangutan", "shortname": ":orangutan:", "unicode": "1F9A7", "html": "🦧", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🦮", "name": "guide dog", "shortname": ":guide_dog:", "unicode": "1F9AE", "html": "🦮", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🐕🦺", "name": "service dog", "shortname": ":service_dog:", "unicode": "1F415 200D 1F9BA", "html": "🐕‍🦺", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🦊", "name": "fox", "shortname": ":fox:", "unicode": "1F98A", "html": "🦊", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🦝", "name": "raccoon", "shortname": ":raccoon:", "unicode": "1F99D", "html": "🦝", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🦓", "name": "zebra", "shortname": ":zebra:", "unicode": "1F993", "html": "🦓", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🦌", "name": "deer", "shortname": ":deer:", "unicode": "1F98C", "html": "🦌", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🦙", "name": "llama", "shortname": ":llama:", "unicode": "1F999", "html": "🦙", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🦒", "name": "giraffe", "shortname": ":giraffe:", "unicode": "1F992", "html": "🦒", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🦏", "name": "rhinoceros", "shortname": ":rhinoceros:", "unicode": "1F98F", "html": "🦏", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🦛", "name": "hippopotamus", "shortname": ":hippopotamus:", "unicode": "1F99B", "html": "🦛", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🐿️", "name": "chipmunk", "shortname": ":chipmunk:", "unicode": "1F43F FE0F", "html": "🐿️", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🦔", "name": "hedgehog", "shortname": ":hedgehog:", "unicode": "1F994", "html": "🦔", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🦇", "name": "bat", "shortname": ":bat:", "unicode": "1F987", "html": "🦇", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🦥", "name": "sloth", "shortname": ":sloth:", "unicode": "1F9A5", "html": "🦥", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🦦", "name": "otter", "shortname": ":otter:", "unicode": "1F9A6", "html": "🦦", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🦨", "name": "skunk", "shortname": ":skunk:", "unicode": "1F9A8", "html": "🦨", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🦘", "name": "kangaroo", "shortname": ":kangaroo:", "unicode": "1F998", "html": "🦘", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🦡", "name": "badger", "shortname": ":badger:", "unicode": "1F9A1", "html": "🦡", "category": "Animals & Nature (animal-mammal)", "order": ""}, + {"emoji": "🕊️", "name": "dove", "shortname": ":dove:", "unicode": "1F54A FE0F", "html": "🕊️", "category": "Animals & Nature (animal-bird)", "order": ""}, + {"emoji": "🦅", "name": "eagle", "shortname": ":eagle:", "unicode": "1F985", "html": "🦅", "category": "Animals & Nature (animal-bird)", "order": ""}, + {"emoji": "🦆", "name": "duck", "shortname": ":duck:", "unicode": "1F986", "html": "🦆", "category": "Animals & Nature (animal-bird)", "order": ""}, + {"emoji": "🦢", "name": "swan", "shortname": ":swan:", "unicode": "1F9A2", "html": "🦢", "category": "Animals & Nature (animal-bird)", "order": ""}, + {"emoji": "🦉", "name": "owl", "shortname": ":owl:", "unicode": "1F989", "html": "🦉", "category": "Animals & Nature (animal-bird)", "order": ""}, + {"emoji": "🦩", "name": "flamingo", "shortname": ":flamingo:", "unicode": "1F9A9", "html": "🦩", "category": "Animals & Nature (animal-bird)", "order": ""}, + {"emoji": "🦚", "name": "peacock", "shortname": ":peacock:", "unicode": "1F99A", "html": "🦚", "category": "Animals & Nature (animal-bird)", "order": ""}, + {"emoji": "🦜", "name": "parrot", "shortname": ":parrot:", "unicode": "1F99C", "html": "🦜", "category": "Animals & Nature (animal-bird)", "order": ""}, + {"emoji": "🦎", "name": "lizard", "shortname": ":lizard:", "unicode": "1F98E", "html": "🦎", "category": "Animals & Nature (animal-reptile)", "order": ""}, + {"emoji": "🦕", "name": "sauropod", "shortname": ":sauropod:", "unicode": "1F995", "html": "🦕", "category": "Animals & Nature (animal-reptile)", "order": ""}, + {"emoji": "🦖", "name": "T-Rex", "shortname": ":TRex:", "unicode": "1F996", "html": "🦖", "category": "Animals & Nature (animal-reptile)", "order": ""}, + {"emoji": "🦈", "name": "shark", "shortname": ":shark:", "unicode": "1F988", "html": "🦈", "category": "Animals & Nature (animal-marine)", "order": ""}, + {"emoji": "🦋", "name": "butterfly", "shortname": ":butterfly:", "unicode": "1F98B", "html": "🦋", "category": "Animals & Nature (animal-bug)", "order": ""}, + {"emoji": "🦗", "name": "cricket", "shortname": ":cricket:", "unicode": "1F997", "html": "🦗", "category": "Animals & Nature (animal-bug)", "order": ""}, + {"emoji": "🕷️", "name": "spider", "shortname": ":spider:", "unicode": "1F577 FE0F", "html": "🕷️", "category": "Animals & Nature (animal-bug)", "order": ""}, + {"emoji": "🕸️", "name": "spider web", "shortname": ":spider_web:", "unicode": "1F578 FE0F", "html": "🕸️", "category": "Animals & Nature (animal-bug)", "order": ""}, + {"emoji": "🦟", "name": "mosquito", "shortname": ":mosquito:", "unicode": "1F99F", "html": "🦟", "category": "Animals & Nature (animal-bug)", "order": ""}, + {"emoji": "🦠", "name": "microbe", "shortname": ":microbe:", "unicode": "1F9A0", "html": "🦠", "category": "Animals & Nature (animal-bug)", "order": ""}, + {"emoji": "🏵️", "name": "rosette", "shortname": ":rosette:", "unicode": "1F3F5 FE0F", "html": "🏵️", "category": "Animals & Nature (plant-flower)", "order": ""}, + {"emoji": "🥀", "name": "wilted flower", "shortname": ":wilted_flower:", "unicode": "1F940", "html": "🥀", "category": "Animals & Nature (plant-flower)", "order": ""}, + {"emoji": "☘️", "name": "shamrock", "shortname": ":shamrock:", "unicode": "2618 FE0F", "html": "☘️", "category": "Animals & Nature (plant-other)", "order": ""}, + {"emoji": "🥭", "name": "mango", "shortname": ":mango:", "unicode": "1F96D", "html": "🥭", "category": "Food & Drink (food-fruit)", "order": ""}, + {"emoji": "🥝", "name": "kiwi fruit", "shortname": ":kiwi_fruit:", "unicode": "1F95D", "html": "🥝", "category": "Food & Drink (food-fruit)", "order": ""}, + {"emoji": "🥥", "name": "coconut", "shortname": ":coconut:", "unicode": "1F965", "html": "🥥", "category": "Food & Drink (food-fruit)", "order": ""}, + {"emoji": "🥑", "name": "avocado", "shortname": ":avocado:", "unicode": "1F951", "html": "🥑", "category": "Food & Drink (food-vegetable)", "order": ""}, + {"emoji": "🥔", "name": "potato", "shortname": ":potato:", "unicode": "1F954", "html": "🥔", "category": "Food & Drink (food-vegetable)", "order": ""}, + {"emoji": "🥕", "name": "carrot", "shortname": ":carrot:", "unicode": "1F955", "html": "🥕", "category": "Food & Drink (food-vegetable)", "order": ""}, + {"emoji": "🌶️", "name": "hot pepper", "shortname": ":hot_pepper:", "unicode": "1F336 FE0F", "html": "🌶️", "category": "Food & Drink (food-vegetable)", "order": ""}, + {"emoji": "🥒", "name": "cucumber", "shortname": ":cucumber:", "unicode": "1F952", "html": "🥒", "category": "Food & Drink (food-vegetable)", "order": ""}, + {"emoji": "🥬", "name": "leafy green", "shortname": ":leafy_green:", "unicode": "1F96C", "html": "🥬", "category": "Food & Drink (food-vegetable)", "order": ""}, + {"emoji": "🥦", "name": "broccoli", "shortname": ":broccoli:", "unicode": "1F966", "html": "🥦", "category": "Food & Drink (food-vegetable)", "order": ""}, + {"emoji": "🧄", "name": "garlic", "shortname": ":garlic:", "unicode": "1F9C4", "html": "🧄", "category": "Food & Drink (food-vegetable)", "order": ""}, + {"emoji": "🧅", "name": "onion", "shortname": ":onion:", "unicode": "1F9C5", "html": "🧅", "category": "Food & Drink (food-vegetable)", "order": ""}, + {"emoji": "🥜", "name": "peanuts", "shortname": ":peanuts:", "unicode": "1F95C", "html": "🥜", "category": "Food & Drink (food-vegetable)", "order": ""}, + {"emoji": "🥐", "name": "croissant", "shortname": ":croissant:", "unicode": "1F950", "html": "🥐", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🥖", "name": "baguette bread", "shortname": ":baguette_bread:", "unicode": "1F956", "html": "🥖", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🥨", "name": "pretzel", "shortname": ":pretzel:", "unicode": "1F968", "html": "🥨", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🥯", "name": "bagel", "shortname": ":bagel:", "unicode": "1F96F", "html": "🥯", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🥞", "name": "pancakes", "shortname": ":pancakes:", "unicode": "1F95E", "html": "🥞", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🧇", "name": "waffle", "shortname": ":waffle:", "unicode": "1F9C7", "html": "🧇", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🥩", "name": "cut of meat", "shortname": ":cut_of_meat:", "unicode": "1F969", "html": "🥩", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🥓", "name": "bacon", "shortname": ":bacon:", "unicode": "1F953", "html": "🥓", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🥪", "name": "sandwich", "shortname": ":sandwich:", "unicode": "1F96A", "html": "🥪", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🥙", "name": "stuffed flatbread", "shortname": ":stuffed_flatbread:", "unicode": "1F959", "html": "🥙", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🧆", "name": "falafel", "shortname": ":falafel:", "unicode": "1F9C6", "html": "🧆", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🥘", "name": "shallow pan of food", "shortname": ":shallow_pan_of_food:", "unicode": "1F958", "html": "🥘", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🥣", "name": "bowl with spoon", "shortname": ":bowl_with_spoon:", "unicode": "1F963", "html": "🥣", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🥗", "name": "green salad", "shortname": ":green_salad:", "unicode": "1F957", "html": "🥗", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🧈", "name": "butter", "shortname": ":butter:", "unicode": "1F9C8", "html": "🧈", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🧂", "name": "salt", "shortname": ":salt:", "unicode": "1F9C2", "html": "🧂", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🥫", "name": "canned food", "shortname": ":canned_food:", "unicode": "1F96B", "html": "🥫", "category": "Food & Drink (food-prepared)", "order": ""}, + {"emoji": "🥮", "name": "moon cake", "shortname": ":moon_cake:", "unicode": "1F96E", "html": "🥮", "category": "Food & Drink (food-asian)", "order": ""}, + {"emoji": "🥟", "name": "dumpling", "shortname": ":dumpling:", "unicode": "1F95F", "html": "🥟", "category": "Food & Drink (food-asian)", "order": ""}, + {"emoji": "🥠", "name": "fortune cookie", "shortname": ":fortune_cookie:", "unicode": "1F960", "html": "🥠", "category": "Food & Drink (food-asian)", "order": ""}, + {"emoji": "🥡", "name": "takeout box", "shortname": ":takeout_box:", "unicode": "1F961", "html": "🥡", "category": "Food & Drink (food-asian)", "order": ""}, + {"emoji": "🦞", "name": "lobster", "shortname": ":lobster:", "unicode": "1F99E", "html": "🦞", "category": "Food & Drink (food-marine)", "order": ""}, + {"emoji": "🦐", "name": "shrimp", "shortname": ":shrimp:", "unicode": "1F990", "html": "🦐", "category": "Food & Drink (food-marine)", "order": ""}, + {"emoji": "🦑", "name": "squid", "shortname": ":squid:", "unicode": "1F991", "html": "🦑", "category": "Food & Drink (food-marine)", "order": ""}, + {"emoji": "🦪", "name": "oyster", "shortname": ":oyster:", "unicode": "1F9AA", "html": "🦪", "category": "Food & Drink (food-marine)", "order": ""}, + {"emoji": "🧁", "name": "cupcake", "shortname": ":cupcake:", "unicode": "1F9C1", "html": "🧁", "category": "Food & Drink (food-sweet)", "order": ""}, + {"emoji": "🥧", "name": "pie", "shortname": ":pie:", "unicode": "1F967", "html": "🥧", "category": "Food & Drink (food-sweet)", "order": ""}, + {"emoji": "🥛", "name": "glass of milk", "shortname": ":glass_of_milk:", "unicode": "1F95B", "html": "🥛", "category": "Food & Drink (drink)", "order": ""}, + {"emoji": "🥂", "name": "clinking glasses", "shortname": ":clinking_glasses:", "unicode": "1F942", "html": "🥂", "category": "Food & Drink (drink)", "order": ""}, + {"emoji": "🥃", "name": "tumbler glass", "shortname": ":tumbler_glass:", "unicode": "1F943", "html": "🥃", "category": "Food & Drink (drink)", "order": ""}, + {"emoji": "🥤", "name": "cup with straw", "shortname": ":cup_with_straw:", "unicode": "1F964", "html": "🥤", "category": "Food & Drink (drink)", "order": ""}, + {"emoji": "🧃", "name": "beverage box", "shortname": ":beverage_box:", "unicode": "1F9C3", "html": "🧃", "category": "Food & Drink (drink)", "order": ""}, + {"emoji": "🧉", "name": "mate", "shortname": ":mate:", "unicode": "1F9C9", "html": "🧉", "category": "Food & Drink (drink)", "order": ""}, + {"emoji": "🧊", "name": "ice", "shortname": ":ice:", "unicode": "1F9CA", "html": "🧊", "category": "Food & Drink (drink)", "order": ""}, + {"emoji": "🥢", "name": "chopsticks", "shortname": ":chopsticks:", "unicode": "1F962", "html": "🥢", "category": "Food & Drink (dishware)", "order": ""}, + {"emoji": "🍽️", "name": "fork and knife with plate", "shortname": ":fork_and_knife_with_plate:", "unicode": "1F37D FE0F", "html": "🍽️", "category": "Food & Drink (dishware)", "order": ""}, + {"emoji": "🥄", "name": "spoon", "shortname": ":spoon:", "unicode": "1F944", "html": "🥄", "category": "Food & Drink (dishware)", "order": ""}, + {"emoji": "🗺️", "name": "world map", "shortname": ":world_map:", "unicode": "1F5FA FE0F", "html": "🗺️", "category": "Travel & Places (place-map)", "order": ""}, + {"emoji": "🧭", "name": "compass", "shortname": ":compass:", "unicode": "1F9ED", "html": "🧭", "category": "Travel & Places (place-map)", "order": ""}, + {"emoji": "🏔️", "name": "snow-capped mountain", "shortname": ":snowcapped_mountain:", "unicode": "1F3D4 FE0F", "html": "🏔️", "category": "Travel & Places (place-geographic)", "order": ""}, + {"emoji": "⛰️", "name": "mountain", "shortname": ":mountain:", "unicode": "26F0 FE0F", "html": "⛰️", "category": "Travel & Places (place-geographic)", "order": ""}, + {"emoji": "🏕️", "name": "camping", "shortname": ":camping:", "unicode": "1F3D5 FE0F", "html": "🏕️", "category": "Travel & Places (place-geographic)", "order": ""}, + {"emoji": "🏖️", "name": "beach with umbrella", "shortname": ":beach_with_umbrella:", "unicode": "1F3D6 FE0F", "html": "🏖️", "category": "Travel & Places (place-geographic)", "order": ""}, + {"emoji": "🏜️", "name": "desert", "shortname": ":desert:", "unicode": "1F3DC FE0F", "html": "🏜️", "category": "Travel & Places (place-geographic)", "order": ""}, + {"emoji": "🏝️", "name": "desert island", "shortname": ":desert_island:", "unicode": "1F3DD FE0F", "html": "🏝️", "category": "Travel & Places (place-geographic)", "order": ""}, + {"emoji": "🏞️", "name": "national park", "shortname": ":national_park:", "unicode": "1F3DE FE0F", "html": "🏞️", "category": "Travel & Places (place-geographic)", "order": ""}, + {"emoji": "🏟️", "name": "stadium", "shortname": ":stadium:", "unicode": "1F3DF FE0F", "html": "🏟️", "category": "Travel & Places (place-building)", "order": ""}, + {"emoji": "🏛️", "name": "classical building", "shortname": ":classical_building:", "unicode": "1F3DB FE0F", "html": "🏛️", "category": "Travel & Places (place-building)", "order": ""}, + {"emoji": "🏗️", "name": "building construction", "shortname": ":building_construction:", "unicode": "1F3D7 FE0F", "html": "🏗️", "category": "Travel & Places (place-building)", "order": ""}, + {"emoji": "🧱", "name": "brick", "shortname": ":brick:", "unicode": "1F9F1", "html": "🧱", "category": "Travel & Places (place-building)", "order": ""}, + {"emoji": "🏘️", "name": "houses", "shortname": ":houses:", "unicode": "1F3D8 FE0F", "html": "🏘️", "category": "Travel & Places (place-building)", "order": ""}, + {"emoji": "🏚️", "name": "derelict house", "shortname": ":derelict_house:", "unicode": "1F3DA FE0F", "html": "🏚️", "category": "Travel & Places (place-building)", "order": ""}, + {"emoji": "🛕", "name": "hindu temple", "shortname": ":hindu_temple:", "unicode": "1F6D5", "html": "🛕", "category": "Travel & Places (place-religious)", "order": ""}, + {"emoji": "⛩️", "name": "shinto shrine", "shortname": ":shinto_shrine:", "unicode": "26E9 FE0F", "html": "⛩️", "category": "Travel & Places (place-religious)", "order": ""}, + {"emoji": "🏙️", "name": "cityscape", "shortname": ":cityscape:", "unicode": "1F3D9 FE0F", "html": "🏙️", "category": "Travel & Places (place-other)", "order": ""}, + {"emoji": "♨", "name": "hot springs", "shortname": ":hot_springs:", "unicode": "2668", "html": "♨", "category": "Travel & Places (place-other)", "order": ""}, + {"emoji": "🏎️", "name": "racing car", "shortname": ":racing_car:", "unicode": "1F3CE FE0F", "html": "🏎️", "category": "Travel & Places (transport-ground)", "order": ""}, + {"emoji": "🏍️", "name": "motorcycle", "shortname": ":motorcycle:", "unicode": "1F3CD FE0F", "html": "🏍️", "category": "Travel & Places (transport-ground)", "order": ""}, + {"emoji": "🛵", "name": "motor scooter", "shortname": ":motor_scooter:", "unicode": "1F6F5", "html": "🛵", "category": "Travel & Places (transport-ground)", "order": ""}, + {"emoji": "🦽", "name": "manual wheelchair", "shortname": ":manual_wheelchair:", "unicode": "1F9BD", "html": "🦽", "category": "Travel & Places (transport-ground)", "order": ""}, + {"emoji": "🦼", "name": "motorized wheelchair", "shortname": ":motorized_wheelchair:", "unicode": "1F9BC", "html": "🦼", "category": "Travel & Places (transport-ground)", "order": ""}, + {"emoji": "🛺", "name": "auto rickshaw", "shortname": ":auto_rickshaw:", "unicode": "1F6FA", "html": "🛺", "category": "Travel & Places (transport-ground)", "order": ""}, + {"emoji": "🛴", "name": "kick scooter", "shortname": ":kick_scooter:", "unicode": "1F6F4", "html": "🛴", "category": "Travel & Places (transport-ground)", "order": ""}, + {"emoji": "🛹", "name": "skateboard", "shortname": ":skateboard:", "unicode": "1F6F9", "html": "🛹", "category": "Travel & Places (transport-ground)", "order": ""}, + {"emoji": "🛣️", "name": "motorway", "shortname": ":motorway:", "unicode": "1F6E3 FE0F", "html": "🛣️", "category": "Travel & Places (transport-ground)", "order": ""}, + {"emoji": "🛤️", "name": "railway track", "shortname": ":railway_track:", "unicode": "1F6E4 FE0F", "html": "🛤️", "category": "Travel & Places (transport-ground)", "order": ""}, + {"emoji": "🛢️", "name": "oil drum", "shortname": ":oil_drum:", "unicode": "1F6E2 FE0F", "html": "🛢️", "category": "Travel & Places (transport-ground)", "order": ""}, + {"emoji": "🛶", "name": "canoe", "shortname": ":canoe:", "unicode": "1F6F6", "html": "🛶", "category": "Travel & Places (transport-water)", "order": ""}, + {"emoji": "🛳️", "name": "passenger ship", "shortname": ":passenger_ship:", "unicode": "1F6F3 FE0F", "html": "🛳️", "category": "Travel & Places (transport-water)", "order": ""}, + {"emoji": "⛴️", "name": "ferry", "shortname": ":ferry:", "unicode": "26F4 FE0F", "html": "⛴️", "category": "Travel & Places (transport-water)", "order": ""}, + {"emoji": "🛥️", "name": "motor boat", "shortname": ":motor_boat:", "unicode": "1F6E5 FE0F", "html": "🛥️", "category": "Travel & Places (transport-water)", "order": ""}, + {"emoji": "✈", "name": "airplane", "shortname": ":airplane:", "unicode": "2708", "html": "✈", "category": "Travel & Places (transport-air)", "order": ""}, + {"emoji": "🛩️", "name": "small airplane", "shortname": ":small_airplane:", "unicode": "1F6E9 FE0F", "html": "🛩️", "category": "Travel & Places (transport-air)", "order": ""}, + {"emoji": "🪂", "name": "parachute", "shortname": ":parachute:", "unicode": "1FA82", "html": "🪂", "category": "Travel & Places (transport-air)", "order": ""}, + {"emoji": "🛰️", "name": "satellite", "shortname": ":satellite:", "unicode": "1F6F0 FE0F", "html": "🛰️", "category": "Travel & Places (transport-air)", "order": ""}, + {"emoji": "🛸", "name": "flying saucer", "shortname": ":flying_saucer:", "unicode": "1F6F8", "html": "🛸", "category": "Travel & Places (transport-air)", "order": ""}, + {"emoji": "🛎️", "name": "bellhop bell", "shortname": ":bellhop_bell:", "unicode": "1F6CE FE0F", "html": "🛎️", "category": "Travel & Places (hotel)", "order": ""}, + {"emoji": "🧳", "name": "luggage", "shortname": ":luggage:", "unicode": "1F9F3", "html": "🧳", "category": "Travel & Places (hotel)", "order": ""}, + {"emoji": "⏱️", "name": "stopwatch", "shortname": ":stopwatch:", "unicode": "23F1 FE0F", "html": "⏱️", "category": "Travel & Places (time)", "order": ""}, + {"emoji": "⏲️", "name": "timer clock", "shortname": ":timer_clock:", "unicode": "23F2 FE0F", "html": "⏲️", "category": "Travel & Places (time)", "order": ""}, + {"emoji": "🕰️", "name": "mantelpiece clock", "shortname": ":mantelpiece_clock:", "unicode": "1F570 FE0F", "html": "🕰️", "category": "Travel & Places (time)", "order": ""}, + {"emoji": "🌡️", "name": "thermometer", "shortname": ":thermometer:", "unicode": "1F321 FE0F", "html": "🌡️", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "☀", "name": "sun", "shortname": ":sun:", "unicode": "2600", "html": "☀", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🪐", "name": "ringed planet", "shortname": ":ringed_planet:", "unicode": "1FA90", "html": "🪐", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "☁️", "name": "cloud", "shortname": ":cloud:", "unicode": "2601 FE0F", "html": "☁️", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "⛈️", "name": "cloud with lightning and rain", "shortname": ":cloud_with_lightning_and_rain:", "unicode": "26C8 FE0F", "html": "⛈️", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🌤️", "name": "sun behind small cloud", "shortname": ":sun_behind_small_cloud:", "unicode": "1F324 FE0F", "html": "🌤️", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🌥️", "name": "sun behind large cloud", "shortname": ":sun_behind_large_cloud:", "unicode": "1F325 FE0F", "html": "🌥️", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🌦️", "name": "sun behind rain cloud", "shortname": ":sun_behind_rain_cloud:", "unicode": "1F326 FE0F", "html": "🌦️", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🌧️", "name": "cloud with rain", "shortname": ":cloud_with_rain:", "unicode": "1F327 FE0F", "html": "🌧️", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🌨️", "name": "cloud with snow", "shortname": ":cloud_with_snow:", "unicode": "1F328 FE0F", "html": "🌨️", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🌩️", "name": "cloud with lightning", "shortname": ":cloud_with_lightning:", "unicode": "1F329 FE0F", "html": "🌩️", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🌪️", "name": "tornado", "shortname": ":tornado:", "unicode": "1F32A FE0F", "html": "🌪️", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🌫️", "name": "fog", "shortname": ":fog:", "unicode": "1F32B FE0F", "html": "🌫️", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🌬️", "name": "wind face", "shortname": ":wind_face:", "unicode": "1F32C FE0F", "html": "🌬️", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "☂", "name": "umbrella", "shortname": ":umbrella:", "unicode": "2602", "html": "☂", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "⛱️", "name": "umbrella on ground", "shortname": ":umbrella_on_ground:", "unicode": "26F1 FE0F", "html": "⛱️", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "❄", "name": "snowflake", "shortname": ":snowflake:", "unicode": "2744", "html": "❄", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "☃", "name": "snowman", "shortname": ":snowman:", "unicode": "2603", "html": "☃", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "☄️", "name": "comet", "shortname": ":comet:", "unicode": "2604 FE0F", "html": "☄️", "category": "Travel & Places (sky & weather)", "order": ""}, + {"emoji": "🧨", "name": "firecracker", "shortname": ":firecracker:", "unicode": "1F9E8", "html": "🧨", "category": "Activities (event)", "order": ""}, + {"emoji": "🧧", "name": "red envelope", "shortname": ":red_envelope:", "unicode": "1F9E7", "html": "🧧", "category": "Activities (event)", "order": ""}, + {"emoji": "🎗️", "name": "reminder ribbon", "shortname": ":reminder_ribbon:", "unicode": "1F397 FE0F", "html": "🎗️", "category": "Activities (event)", "order": ""}, + {"emoji": "🎟️", "name": "admission tickets", "shortname": ":admission_tickets:", "unicode": "1F39F FE0F", "html": "🎟️", "category": "Activities (event)", "order": ""}, + {"emoji": "🎖️", "name": "military medal", "shortname": ":military_medal:", "unicode": "1F396 FE0F", "html": "🎖️", "category": "Activities (award-medal)", "order": ""}, + {"emoji": "🥇", "name": "1st place medal", "shortname": ":1st_place_medal:", "unicode": "1F947", "html": "🥇", "category": "Activities (award-medal)", "order": ""}, + {"emoji": "🥈", "name": "2nd place medal", "shortname": ":2nd_place_medal:", "unicode": "1F948", "html": "🥈", "category": "Activities (award-medal)", "order": ""}, + {"emoji": "🥉", "name": "3rd place medal", "shortname": ":3rd_place_medal:", "unicode": "1F949", "html": "🥉", "category": "Activities (award-medal)", "order": ""}, + {"emoji": "⚾", "name": "baseball", "shortname": ":baseball:", "unicode": "26BE", "html": "⚾", "category": "Activities (sport)", "order": ""}, + {"emoji": "🥎", "name": "softball", "shortname": ":softball:", "unicode": "1F94E", "html": "🥎", "category": "Activities (sport)", "order": ""}, + {"emoji": "🥏", "name": "flying disc", "shortname": ":flying_disc:", "unicode": "1F94F", "html": "🥏", "category": "Activities (sport)", "order": ""}, + {"emoji": "🥍", "name": "lacrosse", "shortname": ":lacrosse:", "unicode": "1F94D", "html": "🥍", "category": "Activities (sport)", "order": ""}, + {"emoji": "🥊", "name": "boxing glove", "shortname": ":boxing_glove:", "unicode": "1F94A", "html": "🥊", "category": "Activities (sport)", "order": ""}, + {"emoji": "🥋", "name": "martial arts uniform", "shortname": ":martial_arts_uniform:", "unicode": "1F94B", "html": "🥋", "category": "Activities (sport)", "order": ""}, + {"emoji": "🥅", "name": "goal net", "shortname": ":goal_net:", "unicode": "1F945", "html": "🥅", "category": "Activities (sport)", "order": ""}, + {"emoji": "⛸️", "name": "ice skate", "shortname": ":ice_skate:", "unicode": "26F8 FE0F", "html": "⛸️", "category": "Activities (sport)", "order": ""}, + {"emoji": "🤿", "name": "diving mask", "shortname": ":diving_mask:", "unicode": "1F93F", "html": "🤿", "category": "Activities (sport)", "order": ""}, + {"emoji": "🛷", "name": "sled", "shortname": ":sled:", "unicode": "1F6F7", "html": "🛷", "category": "Activities (sport)", "order": ""}, + {"emoji": "🥌", "name": "curling stone", "shortname": ":curling_stone:", "unicode": "1F94C", "html": "🥌", "category": "Activities (sport)", "order": ""}, + {"emoji": "🪀", "name": "yo-yo", "shortname": ":yoyo:", "unicode": "1FA80", "html": "🪀", "category": "Activities (game)", "order": ""}, + {"emoji": "🪁", "name": "kite", "shortname": ":kite:", "unicode": "1FA81", "html": "🪁", "category": "Activities (game)", "order": ""}, + {"emoji": "🧿", "name": "nazar amulet", "shortname": ":nazar_amulet:", "unicode": "1F9FF", "html": "🧿", "category": "Activities (game)", "order": ""}, + {"emoji": "🕹️", "name": "joystick", "shortname": ":joystick:", "unicode": "1F579 FE0F", "html": "🕹️", "category": "Activities (game)", "order": ""}, + {"emoji": "🧩", "name": "puzzle piece", "shortname": ":puzzle_piece:", "unicode": "1F9E9", "html": "🧩", "category": "Activities (game)", "order": ""}, + {"emoji": "🧸", "name": "teddy bear", "shortname": ":teddy_bear:", "unicode": "1F9F8", "html": "🧸", "category": "Activities (game)", "order": ""}, + {"emoji": "♟️", "name": "chess pawn", "shortname": ":chess_pawn:", "unicode": "265F FE0F", "html": "♟️", "category": "Activities (game)", "order": ""}, + {"emoji": "♟", "name": "chess pawn", "shortname": ":chess_pawn:", "unicode": "265F", "html": "♟", "category": "Activities (game)", "order": ""}, + {"emoji": "🖼️", "name": "framed picture", "shortname": ":framed_picture:", "unicode": "1F5BC FE0F", "html": "🖼️", "category": "Activities (arts & crafts)", "order": ""}, + {"emoji": "🧵", "name": "thread", "shortname": ":thread:", "unicode": "1F9F5", "html": "🧵", "category": "Activities (arts & crafts)", "order": ""}, + {"emoji": "🧶", "name": "yarn", "shortname": ":yarn:", "unicode": "1F9F6", "html": "🧶", "category": "Activities (arts & crafts)", "order": ""}, + {"emoji": "🕶️", "name": "sunglasses", "shortname": ":sunglasses:", "unicode": "1F576 FE0F", "html": "🕶️", "category": "Objects (clothing)", "order": ""}, + {"emoji": "🥽", "name": "goggles", "shortname": ":goggles:", "unicode": "1F97D", "html": "🥽", "category": "Objects (clothing)", "order": ""}, + {"emoji": "🥼", "name": "lab coat", "shortname": ":lab_coat:", "unicode": "1F97C", "html": "🥼", "category": "Objects (clothing)", "order": ""}, + {"emoji": "🦺", "name": "safety vest", "shortname": ":safety_vest:", "unicode": "1F9BA", "html": "🦺", "category": "Objects (clothing)", "order": ""}, + {"emoji": "🧣", "name": "scarf", "shortname": ":scarf:", "unicode": "1F9E3", "html": "🧣", "category": "Objects (clothing)", "order": ""}, + {"emoji": "🧤", "name": "gloves", "shortname": ":gloves:", "unicode": "1F9E4", "html": "🧤", "category": "Objects (clothing)", "order": ""}, + {"emoji": "🧥", "name": "coat", "shortname": ":coat:", "unicode": "1F9E5", "html": "🧥", "category": "Objects (clothing)", "order": ""}, + {"emoji": "🧦", "name": "socks", "shortname": ":socks:", "unicode": "1F9E6", "html": "🧦", "category": "Objects (clothing)", "order": ""}, + {"emoji": "🥻", "name": "sari", "shortname": ":sari:", "unicode": "1F97B", "html": "🥻", "category": "Objects (clothing)", "order": ""}, + {"emoji": "🩱", "name": "one-piece swimsuit", "shortname": ":onepiece_swimsuit:", "unicode": "1FA71", "html": "🩱", "category": "Objects (clothing)", "order": ""}, + {"emoji": "🩲", "name": "briefs", "shortname": ":briefs:", "unicode": "1FA72", "html": "🩲", "category": "Objects (clothing)", "order": ""}, + {"emoji": "🩳", "name": "shorts", "shortname": ":shorts:", "unicode": "1FA73", "html": "🩳", "category": "Objects (clothing)", "order": ""}, + {"emoji": "🛍️", "name": "shopping bags", "shortname": ":shopping_bags:", "unicode": "1F6CD FE0F", "html": "🛍️", "category": "Objects (clothing)", "order": ""}, + {"emoji": "🥾", "name": "hiking boot", "shortname": ":hiking_boot:", "unicode": "1F97E", "html": "🥾", "category": "Objects (clothing)", "order": ""}, + {"emoji": "🥿", "name": "flat shoe", "shortname": ":flat_shoe:", "unicode": "1F97F", "html": "🥿", "category": "Objects (clothing)", "order": ""}, + {"emoji": "🩰", "name": "ballet shoes", "shortname": ":ballet_shoes:", "unicode": "1FA70", "html": "🩰", "category": "Objects (clothing)", "order": ""}, + {"emoji": "🧢", "name": "billed cap", "shortname": ":billed_cap:", "unicode": "1F9E2", "html": "🧢", "category": "Objects (clothing)", "order": ""}, + {"emoji": "⛑️", "name": "rescue worker’s helmet", "shortname": ":rescue_worker’s_helmet:", "unicode": "26D1 FE0F", "html": "⛑️", "category": "Objects (clothing)", "order": ""}, + {"emoji": "🎙️", "name": "studio microphone", "shortname": ":studio_microphone:", "unicode": "1F399 FE0F", "html": "🎙️", "category": "Objects (music)", "order": ""}, + {"emoji": "🎚️", "name": "level slider", "shortname": ":level_slider:", "unicode": "1F39A FE0F", "html": "🎚️", "category": "Objects (music)", "order": ""}, + {"emoji": "🎛️", "name": "control knobs", "shortname": ":control_knobs:", "unicode": "1F39B FE0F", "html": "🎛️", "category": "Objects (music)", "order": ""}, + {"emoji": "🪕", "name": "banjo", "shortname": ":banjo:", "unicode": "1FA95", "html": "🪕", "category": "Objects (musical-instrument)", "order": ""}, + {"emoji": "☎", "name": "telephone", "shortname": ":telephone:", "unicode": "260E", "html": "☎", "category": "Objects (phone)", "order": ""}, + {"emoji": "🖥️", "name": "desktop computer", "shortname": ":desktop_computer:", "unicode": "1F5A5 FE0F", "html": "🖥️", "category": "Objects (computer)", "order": ""}, + {"emoji": "🖨️", "name": "printer", "shortname": ":printer:", "unicode": "1F5A8 FE0F", "html": "🖨️", "category": "Objects (computer)", "order": ""}, + {"emoji": "⌨️", "name": "keyboard", "shortname": ":keyboard:", "unicode": "2328 FE0F", "html": "⌨️", "category": "Objects (computer)", "order": ""}, + {"emoji": "🖱️", "name": "computer mouse", "shortname": ":computer_mouse:", "unicode": "1F5B1 FE0F", "html": "🖱️", "category": "Objects (computer)", "order": ""}, + {"emoji": "🖲️", "name": "trackball", "shortname": ":trackball:", "unicode": "1F5B2 FE0F", "html": "🖲️", "category": "Objects (computer)", "order": ""}, + {"emoji": "🧮", "name": "abacus", "shortname": ":abacus:", "unicode": "1F9EE", "html": "🧮", "category": "Objects (computer)", "order": ""}, + {"emoji": "🎞️", "name": "film frames", "shortname": ":film_frames:", "unicode": "1F39E FE0F", "html": "🎞️", "category": "Objects (light & video)", "order": ""}, + {"emoji": "📽️", "name": "film projector", "shortname": ":film_projector:", "unicode": "1F4FD FE0F", "html": "📽️", "category": "Objects (light & video)", "order": ""}, + {"emoji": "🕯️", "name": "candle", "shortname": ":candle:", "unicode": "1F56F FE0F", "html": "🕯️", "category": "Objects (light & video)", "order": ""}, + {"emoji": "🪔", "name": "diya lamp", "shortname": ":diya_lamp:", "unicode": "1FA94", "html": "🪔", "category": "Objects (light & video)", "order": ""}, + {"emoji": "🗞️", "name": "rolled-up newspaper", "shortname": ":rolledup_newspaper:", "unicode": "1F5DE FE0F", "html": "🗞️", "category": "Objects (book-paper)", "order": ""}, + {"emoji": "🏷️", "name": "label", "shortname": ":label:", "unicode": "1F3F7 FE0F", "html": "🏷️", "category": "Objects (book-paper)", "order": ""}, + {"emoji": "🧾", "name": "receipt", "shortname": ":receipt:", "unicode": "1F9FE", "html": "🧾", "category": "Objects (money)", "order": ""}, + {"emoji": "✉", "name": "envelope", "shortname": ":envelope:", "unicode": "2709", "html": "✉", "category": "Objects (mail)", "order": ""}, + {"emoji": "🗳️", "name": "ballot box with ballot", "shortname": ":ballot_box_with_ballot:", "unicode": "1F5F3 FE0F", "html": "🗳️", "category": "Objects (mail)", "order": ""}, + {"emoji": "✏️", "name": "pencil", "shortname": ":pencil:", "unicode": "270F FE0F", "html": "✏️", "category": "Objects (writing)", "order": ""}, + {"emoji": "✒️", "name": "black nib", "shortname": ":black_nib:", "unicode": "2712 FE0F", "html": "✒️", "category": "Objects (writing)", "order": ""}, + {"emoji": "🖋️", "name": "fountain pen", "shortname": ":fountain_pen:", "unicode": "1F58B FE0F", "html": "🖋️", "category": "Objects (writing)", "order": ""}, + {"emoji": "🖊️", "name": "pen", "shortname": ":pen:", "unicode": "1F58A FE0F", "html": "🖊️", "category": "Objects (writing)", "order": ""}, + {"emoji": "🖌️", "name": "paintbrush", "shortname": ":paintbrush:", "unicode": "1F58C FE0F", "html": "🖌️", "category": "Objects (writing)", "order": ""}, + {"emoji": "🖍️", "name": "crayon", "shortname": ":crayon:", "unicode": "1F58D FE0F", "html": "🖍️", "category": "Objects (writing)", "order": ""}, + {"emoji": "🗂️", "name": "card index dividers", "shortname": ":card_index_dividers:", "unicode": "1F5C2 FE0F", "html": "🗂️", "category": "Objects (office)", "order": ""}, + {"emoji": "🗒️", "name": "spiral notepad", "shortname": ":spiral_notepad:", "unicode": "1F5D2 FE0F", "html": "🗒️", "category": "Objects (office)", "order": ""}, + {"emoji": "🗓️", "name": "spiral calendar", "shortname": ":spiral_calendar:", "unicode": "1F5D3 FE0F", "html": "🗓️", "category": "Objects (office)", "order": ""}, + {"emoji": "🖇️", "name": "linked paperclips", "shortname": ":linked_paperclips:", "unicode": "1F587 FE0F", "html": "🖇️", "category": "Objects (office)", "order": ""}, + {"emoji": "✂", "name": "scissors", "shortname": ":scissors:", "unicode": "2702", "html": "✂", "category": "Objects (office)", "order": ""}, + {"emoji": "🗃️", "name": "card file box", "shortname": ":card_file_box:", "unicode": "1F5C3 FE0F", "html": "🗃️", "category": "Objects (office)", "order": ""}, + {"emoji": "🗄️", "name": "file cabinet", "shortname": ":file_cabinet:", "unicode": "1F5C4 FE0F", "html": "🗄️", "category": "Objects (office)", "order": ""}, + {"emoji": "🗑️", "name": "wastebasket", "shortname": ":wastebasket:", "unicode": "1F5D1 FE0F", "html": "🗑️", "category": "Objects (office)", "order": ""}, + {"emoji": "🗝️", "name": "old key", "shortname": ":old_key:", "unicode": "1F5DD FE0F", "html": "🗝️", "category": "Objects (lock)", "order": ""}, + {"emoji": "🪓", "name": "axe", "shortname": ":axe:", "unicode": "1FA93", "html": "🪓", "category": "Objects (tool)", "order": ""}, + {"emoji": "⛏️", "name": "pick", "shortname": ":pick:", "unicode": "26CF FE0F", "html": "⛏️", "category": "Objects (tool)", "order": ""}, + {"emoji": "⚒️", "name": "hammer and pick", "shortname": ":hammer_and_pick:", "unicode": "2692 FE0F", "html": "⚒️", "category": "Objects (tool)", "order": ""}, + {"emoji": "🛠️", "name": "hammer and wrench", "shortname": ":hammer_and_wrench:", "unicode": "1F6E0 FE0F", "html": "🛠️", "category": "Objects (tool)", "order": ""}, + {"emoji": "🗡️", "name": "dagger", "shortname": ":dagger:", "unicode": "1F5E1 FE0F", "html": "🗡️", "category": "Objects (tool)", "order": ""}, + {"emoji": "⚔️", "name": "crossed swords", "shortname": ":crossed_swords:", "unicode": "2694 FE0F", "html": "⚔️", "category": "Objects (tool)", "order": ""}, + {"emoji": "🛡️", "name": "shield", "shortname": ":shield:", "unicode": "1F6E1 FE0F", "html": "🛡️", "category": "Objects (tool)", "order": ""}, + {"emoji": "⚙️", "name": "gear", "shortname": ":gear:", "unicode": "2699 FE0F", "html": "⚙️", "category": "Objects (tool)", "order": ""}, + {"emoji": "🗜️", "name": "clamp", "shortname": ":clamp:", "unicode": "1F5DC FE0F", "html": "🗜️", "category": "Objects (tool)", "order": ""}, + {"emoji": "⚖️", "name": "balance scale", "shortname": ":balance_scale:", "unicode": "2696 FE0F", "html": "⚖️", "category": "Objects (tool)", "order": ""}, + {"emoji": "🦯", "name": "probing cane", "shortname": ":probing_cane:", "unicode": "1F9AF", "html": "🦯", "category": "Objects (tool)", "order": ""}, + {"emoji": "⛓️", "name": "chains", "shortname": ":chains:", "unicode": "26D3 FE0F", "html": "⛓️", "category": "Objects (tool)", "order": ""}, + {"emoji": "🧰", "name": "toolbox", "shortname": ":toolbox:", "unicode": "1F9F0", "html": "🧰", "category": "Objects (tool)", "order": ""}, + {"emoji": "🧲", "name": "magnet", "shortname": ":magnet:", "unicode": "1F9F2", "html": "🧲", "category": "Objects (tool)", "order": ""}, + {"emoji": "⚗️", "name": "alembic", "shortname": ":alembic:", "unicode": "2697 FE0F", "html": "⚗️", "category": "Objects (science)", "order": ""}, + {"emoji": "🧪", "name": "test tube", "shortname": ":test_tube:", "unicode": "1F9EA", "html": "🧪", "category": "Objects (science)", "order": ""}, + {"emoji": "🧫", "name": "petri dish", "shortname": ":petri_dish:", "unicode": "1F9EB", "html": "🧫", "category": "Objects (science)", "order": ""}, + {"emoji": "🧬", "name": "dna", "shortname": ":dna:", "unicode": "1F9EC", "html": "🧬", "category": "Objects (science)", "order": ""}, + {"emoji": "🩸", "name": "drop of blood", "shortname": ":drop_of_blood:", "unicode": "1FA78", "html": "🩸", "category": "Objects (medical)", "order": ""}, + {"emoji": "🩹", "name": "adhesive bandage", "shortname": ":adhesive_bandage:", "unicode": "1FA79", "html": "🩹", "category": "Objects (medical)", "order": ""}, + {"emoji": "🩺", "name": "stethoscope", "shortname": ":stethoscope:", "unicode": "1FA7A", "html": "🩺", "category": "Objects (medical)", "order": ""}, + {"emoji": "🛏️", "name": "bed", "shortname": ":bed:", "unicode": "1F6CF FE0F", "html": "🛏️", "category": "Objects (household)", "order": ""}, + {"emoji": "🛋️", "name": "couch and lamp", "shortname": ":couch_and_lamp:", "unicode": "1F6CB FE0F", "html": "🛋️", "category": "Objects (household)", "order": ""}, + {"emoji": "🪑", "name": "chair", "shortname": ":chair:", "unicode": "1FA91", "html": "🪑", "category": "Objects (household)", "order": ""}, + {"emoji": "🪒", "name": "razor", "shortname": ":razor:", "unicode": "1FA92", "html": "🪒", "category": "Objects (household)", "order": ""}, + {"emoji": "🧴", "name": "lotion bottle", "shortname": ":lotion_bottle:", "unicode": "1F9F4", "html": "🧴", "category": "Objects (household)", "order": ""}, + {"emoji": "🧷", "name": "safety pin", "shortname": ":safety_pin:", "unicode": "1F9F7", "html": "🧷", "category": "Objects (household)", "order": ""}, + {"emoji": "🧹", "name": "broom", "shortname": ":broom:", "unicode": "1F9F9", "html": "🧹", "category": "Objects (household)", "order": ""}, + {"emoji": "🧺", "name": "basket", "shortname": ":basket:", "unicode": "1F9FA", "html": "🧺", "category": "Objects (household)", "order": ""}, + {"emoji": "🧻", "name": "roll of paper", "shortname": ":roll_of_paper:", "unicode": "1F9FB", "html": "🧻", "category": "Objects (household)", "order": ""}, + {"emoji": "🧼", "name": "soap", "shortname": ":soap:", "unicode": "1F9FC", "html": "🧼", "category": "Objects (household)", "order": ""}, + {"emoji": "🧽", "name": "sponge", "shortname": ":sponge:", "unicode": "1F9FD", "html": "🧽", "category": "Objects (household)", "order": ""}, + {"emoji": "🧯", "name": "fire extinguisher", "shortname": ":fire_extinguisher:", "unicode": "1F9EF", "html": "🧯", "category": "Objects (household)", "order": ""}, + {"emoji": "🛒", "name": "shopping cart", "shortname": ":shopping_cart:", "unicode": "1F6D2", "html": "🛒", "category": "Objects (household)", "order": ""}, + {"emoji": "⚰️", "name": "coffin", "shortname": ":coffin:", "unicode": "26B0 FE0F", "html": "⚰️", "category": "Objects (other-object)", "order": ""}, + {"emoji": "⚱️", "name": "funeral urn", "shortname": ":funeral_urn:", "unicode": "26B1 FE0F", "html": "⚱️", "category": "Objects (other-object)", "order": ""}, + {"emoji": "⚠", "name": "warning", "shortname": ":warning:", "unicode": "26A0", "html": "⚠", "category": "Symbols (warning)", "order": ""}, + {"emoji": "☢️", "name": "radioactive", "shortname": ":radioactive:", "unicode": "2622 FE0F", "html": "☢️", "category": "Symbols (warning)", "order": ""}, + {"emoji": "☣️", "name": "biohazard", "shortname": ":biohazard:", "unicode": "2623 FE0F", "html": "☣️", "category": "Symbols (warning)", "order": ""}, + {"emoji": "⬆", "name": "up arrow", "shortname": ":up_arrow:", "unicode": "2B06", "html": "⬆", "category": "Symbols (arrow)", "order": ""}, + {"emoji": "↗", "name": "up-right arrow", "shortname": ":upright_arrow:", "unicode": "2197", "html": "↗", "category": "Symbols (arrow)", "order": ""}, + {"emoji": "➡️", "name": "right arrow", "shortname": ":right_arrow:", "unicode": "27A1 FE0F", "html": "➡️", "category": "Symbols (arrow)", "order": ""}, + {"emoji": "↘", "name": "down-right arrow", "shortname": ":downright_arrow:", "unicode": "2198", "html": "↘", "category": "Symbols (arrow)", "order": ""}, + {"emoji": "⬇", "name": "down arrow", "shortname": ":down_arrow:", "unicode": "2B07", "html": "⬇", "category": "Symbols (arrow)", "order": ""}, + {"emoji": "↙", "name": "down-left arrow", "shortname": ":downleft_arrow:", "unicode": "2199", "html": "↙", "category": "Symbols (arrow)", "order": ""}, + {"emoji": "⬅", "name": "left arrow", "shortname": ":left_arrow:", "unicode": "2B05", "html": "⬅", "category": "Symbols (arrow)", "order": ""}, + {"emoji": "↖️", "name": "up-left arrow", "shortname": ":upleft_arrow:", "unicode": "2196 FE0F", "html": "↖️", "category": "Symbols (arrow)", "order": ""}, + {"emoji": "↕️", "name": "up-down arrow", "shortname": ":updown_arrow:", "unicode": "2195 FE0F", "html": "↕️", "category": "Symbols (arrow)", "order": ""}, + {"emoji": "↩", "name": "right arrow curving left", "shortname": ":right_arrow_curving_left:", "unicode": "21A9", "html": "↩", "category": "Symbols (arrow)", "order": ""}, + {"emoji": "↪", "name": "left arrow curving right", "shortname": ":left_arrow_curving_right:", "unicode": "21AA", "html": "↪", "category": "Symbols (arrow)", "order": ""}, + {"emoji": "⤴", "name": "right arrow curving up", "shortname": ":right_arrow_curving_up:", "unicode": "2934", "html": "⤴", "category": "Symbols (arrow)", "order": ""}, + {"emoji": "⤵", "name": "right arrow curving down", "shortname": ":right_arrow_curving_down:", "unicode": "2935", "html": "⤵", "category": "Symbols (arrow)", "order": ""}, + {"emoji": "⚛️", "name": "atom symbol", "shortname": ":atom_symbol:", "unicode": "269B FE0F", "html": "⚛️", "category": "Symbols (religion)", "order": ""}, + {"emoji": "🕉️", "name": "om", "shortname": ":om:", "unicode": "1F549 FE0F", "html": "🕉️", "category": "Symbols (religion)", "order": ""}, + {"emoji": "✡", "name": "star of David", "shortname": ":star_of_David:", "unicode": "2721", "html": "✡", "category": "Symbols (religion)", "order": ""}, + {"emoji": "☸️", "name": "wheel of dharma", "shortname": ":wheel_of_dharma:", "unicode": "2638 FE0F", "html": "☸️", "category": "Symbols (religion)", "order": ""}, + {"emoji": "☯️", "name": "yin yang", "shortname": ":yin_yang:", "unicode": "262F FE0F", "html": "☯️", "category": "Symbols (religion)", "order": ""}, + {"emoji": "✝", "name": "latin cross", "shortname": ":latin_cross:", "unicode": "271D", "html": "✝", "category": "Symbols (religion)", "order": ""}, + {"emoji": "☦️", "name": "orthodox cross", "shortname": ":orthodox_cross:", "unicode": "2626 FE0F", "html": "☦️", "category": "Symbols (religion)", "order": ""}, + {"emoji": "☪️", "name": "star and crescent", "shortname": ":star_and_crescent:", "unicode": "262A FE0F", "html": "☪️", "category": "Symbols (religion)", "order": ""}, + {"emoji": "☮️", "name": "peace symbol", "shortname": ":peace_symbol:", "unicode": "262E FE0F", "html": "☮️", "category": "Symbols (religion)", "order": ""}, + {"emoji": "▶", "name": "play button", "shortname": ":play_button:", "unicode": "25B6", "html": "▶", "category": "Symbols (av-symbol)", "order": ""}, + {"emoji": "⏭️", "name": "next track button", "shortname": ":next_track_button:", "unicode": "23ED FE0F", "html": "⏭️", "category": "Symbols (av-symbol)", "order": ""}, + {"emoji": "⏯️", "name": "play or pause button", "shortname": ":play_or_pause_button:", "unicode": "23EF FE0F", "html": "⏯️", "category": "Symbols (av-symbol)", "order": ""}, + {"emoji": "◀", "name": "reverse button", "shortname": ":reverse_button:", "unicode": "25C0", "html": "◀", "category": "Symbols (av-symbol)", "order": ""}, + {"emoji": "⏮️", "name": "last track button", "shortname": ":last_track_button:", "unicode": "23EE FE0F", "html": "⏮️", "category": "Symbols (av-symbol)", "order": ""}, + {"emoji": "⏸️", "name": "pause button", "shortname": ":pause_button:", "unicode": "23F8 FE0F", "html": "⏸️", "category": "Symbols (av-symbol)", "order": ""}, + {"emoji": "⏹️", "name": "stop button", "shortname": ":stop_button:", "unicode": "23F9 FE0F", "html": "⏹️", "category": "Symbols (av-symbol)", "order": ""}, + {"emoji": "⏺️", "name": "record button", "shortname": ":record_button:", "unicode": "23FA FE0F", "html": "⏺️", "category": "Symbols (av-symbol)", "order": ""}, + {"emoji": "⏏️", "name": "eject button", "shortname": ":eject_button:", "unicode": "23CF FE0F", "html": "⏏️", "category": "Symbols (av-symbol)", "order": ""}, + {"emoji": "⏏", "name": "eject button", "shortname": ":eject_button:", "unicode": "23CF", "html": "⏏", "category": "Symbols (av-symbol)", "order": ""}, + {"emoji": "♀️", "name": "female sign", "shortname": ":female_sign:", "unicode": "2640 FE0F", "html": "♀️", "category": "Symbols (gender)", "order": ""}, + {"emoji": "♀", "name": "female sign", "shortname": ":female_sign:", "unicode": "2640", "html": "♀", "category": "Symbols (gender)", "order": ""}, + {"emoji": "♂️", "name": "male sign", "shortname": ":male_sign:", "unicode": "2642 FE0F", "html": "♂️", "category": "Symbols (gender)", "order": ""}, + {"emoji": "♂", "name": "male sign", "shortname": ":male_sign:", "unicode": "2642", "html": "♂", "category": "Symbols (gender)", "order": ""}, + {"emoji": "⚕️", "name": "medical symbol", "shortname": ":medical_symbol:", "unicode": "2695 FE0F", "html": "⚕️", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "⚕", "name": "medical symbol", "shortname": ":medical_symbol:", "unicode": "2695", "html": "⚕", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "♾️", "name": "infinity", "shortname": ":infinity:", "unicode": "267E FE0F", "html": "♾️", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "♾", "name": "infinity", "shortname": ":infinity:", "unicode": "267E", "html": "♾", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "♻️", "name": "recycling symbol", "shortname": ":recycling_symbol:", "unicode": "267B FE0F", "html": "♻️", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "⚜️", "name": "fleur-de-lis", "shortname": ":fleurde-lis:", "unicode": "269C FE0F", "html": "⚜️", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "☑", "name": "check box with check", "shortname": ":check_box_with_check:", "unicode": "2611", "html": "☑", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "✔", "name": "check mark", "shortname": ":check_mark:", "unicode": "2714", "html": "✔", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "✖", "name": "multiplication sign", "shortname": ":multiplication_sign:", "unicode": "2716", "html": "✖", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "〽", "name": "part alternation mark", "shortname": ":part_alternation_mark:", "unicode": "303D", "html": "〽", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "✳", "name": "eight-spoked asterisk", "shortname": ":eightspoked_asterisk:", "unicode": "2733", "html": "✳", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "✴", "name": "eight-pointed star", "shortname": ":eightpointed_star:", "unicode": "2734", "html": "✴", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "❇", "name": "sparkle", "shortname": ":sparkle:", "unicode": "2747", "html": "❇", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "‼", "name": "double exclamation mark", "shortname": ":double_exclamation_mark:", "unicode": "203C", "html": "‼", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "⁉", "name": "exclamation question mark", "shortname": ":exclamation_question_mark:", "unicode": "2049", "html": "⁉", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "〰️", "name": "wavy dash", "shortname": ":wavy_dash:", "unicode": "3030 FE0F", "html": "〰️", "category": "Symbols (other-symbol)", "order": ""}, + {"emoji": "#️⃣", "name": "keycap: #", "shortname": ":#:", "unicode": "0023 FE0F 20E3", "html": "#️⃣", "category": "Symbols (keycap)", "order": ""}, + {"emoji": "🅰", "name": "A button (blood type)", "shortname": ":A_button_blood_type:", "unicode": "1F170", "html": "🅰", "category": "Symbols (alphanum)", "order": ""}, + {"emoji": "🅱", "name": "B button (blood type)", "shortname": ":B_button_blood_type:", "unicode": "1F171", "html": "🅱", "category": "Symbols (alphanum)", "order": ""}, + {"emoji": "ℹ️", "name": "information", "shortname": ":information:", "unicode": "2139 FE0F", "html": "ℹ️", "category": "Symbols (alphanum)", "order": ""}, + {"emoji": "Ⓜ", "name": "circled M", "shortname": ":circled_M:", "unicode": "24C2", "html": "Ⓜ", "category": "Symbols (alphanum)", "order": ""}, + {"emoji": "🅾", "name": "O button (blood type)", "shortname": ":O_button_blood_type:", "unicode": "1F17E", "html": "🅾", "category": "Symbols (alphanum)", "order": ""}, + {"emoji": "🅿", "name": "P button", "shortname": ":P_button:", "unicode": "1F17F", "html": "🅿", "category": "Symbols (alphanum)", "order": ""}, + {"emoji": "🈂", "name": "Japanese service charge button", "shortname": ":Japanese_service_charge_button:", "unicode": "1F202", "html": "🈂", "category": "Symbols (alphanum)", "order": ""}, + {"emoji": "🈷️", "name": "Japanese monthly amount button", "shortname": ":Japanese_monthly_amount_button:", "unicode": "1F237 FE0F", "html": "🈷️", "category": "Symbols (alphanum)", "order": ""}, + {"emoji": "🈯", "name": "Japanese reserved button", "shortname": ":Japanese_reserved_button:", "unicode": "1F22F", "html": "🈯", "category": "Symbols (alphanum)", "order": ""}, + {"emoji": "🈚", "name": "Japanese free of charge button", "shortname": ":Japanese_free_of_charge_button:", "unicode": "1F21A", "html": "🈚", "category": "Symbols (alphanum)", "order": ""}, + {"emoji": "㊗️", "name": "Japanese congratulations button", "shortname": ":Japanese_congratulations_button:", "unicode": "3297 FE0F", "html": "㊗️", "category": "Symbols (alphanum)", "order": ""}, + {"emoji": "㊙️", "name": "Japanese secret button", "shortname": ":Japanese_secret_button:", "unicode": "3299 FE0F", "html": "㊙️", "category": "Symbols (alphanum)", "order": ""}, + {"emoji": "🟠", "name": "orange circle", "shortname": ":orange_circle:", "unicode": "1F7E0", "html": "🟠", "category": "Symbols (geometric)", "order": ""}, + {"emoji": "🟡", "name": "yellow circle", "shortname": ":yellow_circle:", "unicode": "1F7E1", "html": "🟡", "category": "Symbols (geometric)", "order": ""}, + {"emoji": "🟢", "name": "green circle", "shortname": ":green_circle:", "unicode": "1F7E2", "html": "🟢", "category": "Symbols (geometric)", "order": ""}, + {"emoji": "🟣", "name": "purple circle", "shortname": ":purple_circle:", "unicode": "1F7E3", "html": "🟣", "category": "Symbols (geometric)", "order": ""}, + {"emoji": "🟤", "name": "brown circle", "shortname": ":brown_circle:", "unicode": "1F7E4", "html": "🟤", "category": "Symbols (geometric)", "order": ""}, + {"emoji": "🟥", "name": "red square", "shortname": ":red_square:", "unicode": "1F7E5", "html": "🟥", "category": "Symbols (geometric)", "order": ""}, + {"emoji": "🟧", "name": "orange square", "shortname": ":orange_square:", "unicode": "1F7E7", "html": "🟧", "category": "Symbols (geometric)", "order": ""}, + {"emoji": "🟨", "name": "yellow square", "shortname": ":yellow_square:", "unicode": "1F7E8", "html": "🟨", "category": "Symbols (geometric)", "order": ""}, + {"emoji": "🟩", "name": "green square", "shortname": ":green_square:", "unicode": "1F7E9", "html": "🟩", "category": "Symbols (geometric)", "order": ""}, + {"emoji": "🟦", "name": "blue square", "shortname": ":blue_square:", "unicode": "1F7E6", "html": "🟦", "category": "Symbols (geometric)", "order": ""}, + {"emoji": "▪", "name": "black small square", "shortname": ":black_small_square:", "unicode": "25AA", "html": "▪", "category": "Symbols (geometric)", "order": ""}, + {"emoji": "▫️", "name": "white small square", "shortname": ":white_small_square:", "unicode": "25AB FE0F", "html": "▫️", "category": "Symbols (geometric)", "order": ""}, + {"emoji": "🏳️", "name": "white flag", "shortname": ":white_flag:", "unicode": "1F3F3 FE0F", "html": "🏳️", "category": "Flags (flag)", "order": ""}, + {"emoji": "🏳️🌈", "name": "rainbow flag", "shortname": ":rainbow_flag:", "unicode": "1F3F3 FE0F 200D 1F308", "html": "🏳️‍🌈", "category": "Flags (flag)", "order": ""}, + {"emoji": "🏴☠️", "name": "pirate flag", "shortname": ":pirate_flag:", "unicode": "1F3F4 200D 2620 FE0F", "html": "🏴‍☠️", "category": "Flags (flag)", "order": ""}, + {"emoji": "🏴☠", "name": "pirate flag", "shortname": ":pirate_flag:", "unicode": "1F3F4 200D 2620", "html": "🏴‍☠", "category": "Flags (flag)", "order": ""}, + {"emoji": "🇺🇳", "name": "flag: United Nations", "shortname": ":United_Nations:", "unicode": "1F1FA 1F1F3", "html": "🇺🇳", "category": "Flags (country-flag)", "order": ""}, + {"emoji": "🏴", "name": "flag: England", "shortname": ":England:", "unicode": "1F3F4 E0067 E0062 E0065 E006E E0067 E007F", "html": "🏴󠁧󠁢󠁥󠁮󠁧󠁿", "category": "Flags (subdivision-flag)", "order": ""}, + {"emoji": "🏴", "name": "flag: Scotland", "shortname": ":Scotland:", "unicode": "1F3F4 E0067 E0062 E0073 E0063 E0074 E007F", "html": "🏴󠁧󠁢󠁳󠁣󠁴󠁿", "category": "Flags (subdivision-flag)", "order": ""}, + {"emoji": "🏴", "name": "Wales", "shortname": ":wales:", "unicode": "1F3F4 E0067 E0062 E0077 E006C E0073 E007F", "html": "🏴󠁧󠁢󠁷󠁬󠁳󠁿", "category": "(subdivision-flag)", "order": ""} + ] +}
\ No newline at end of file @@ -884,6 +884,37 @@ dependencies: qrcode "^1.3.0" +"@fortawesome/fontawesome-common-types@^0.2.32": + version "0.2.32" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.32.tgz#3436795d5684f22742989bfa08f46f50f516f259" + integrity sha512-ux2EDjKMpcdHBVLi/eWZynnPxs0BtFVXJkgHIxXRl+9ZFaHPvYamAfCzeeQFqHRjuJtX90wVnMRaMQAAlctz3w== + +"@fortawesome/fontawesome-svg-core@^1.2.32": + version "1.2.32" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.32.tgz#da092bfc7266aa274be8604de610d7115f9ba6cf" + integrity sha512-XjqyeLCsR/c/usUpdWcOdVtWFVjPbDFBTQkn2fQRrWhhUoxriQohO2RWDxLyUM8XpD+Zzg5xwJ8gqTYGDLeGaQ== + dependencies: + "@fortawesome/fontawesome-common-types" "^0.2.32" + +"@fortawesome/free-regular-svg-icons@^5.15.1": + version "5.15.1" + resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.1.tgz#a8897d0ce325352dbba0e943101323e0175ee2b2" + integrity sha512-eD9NWFy89e7SVVtrLedJUxIpCBGhd4x7s7dhesokjyo1Tw62daqN5UcuAGu1NrepLLq1IeAYUVfWwnOjZ/j3HA== + dependencies: + "@fortawesome/fontawesome-common-types" "^0.2.32" + +"@fortawesome/free-solid-svg-icons@^5.15.1": + version "5.15.1" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.1.tgz#e1432676ddd43108b41197fee9f86d910ad458ef" + integrity sha512-EFMuKtzRMNbvjab/SvJBaOOpaqJfdSap/Nl6hst7CgrJxwfORR1drdTV6q1Ib/JVzq4xObdTDcT6sqTaXMqfdg== + dependencies: + "@fortawesome/fontawesome-common-types" "^0.2.32" + +"@fortawesome/vue-fontawesome@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@fortawesome/vue-fontawesome/-/vue-fontawesome-2.0.0.tgz#63da3e459147cebb0a8d58eed81d6071db9f5973" + integrity sha512-N3VKw7KzRfOm8hShUVldpinlm13HpvLBQgT63QS+aCrIRLwjoEUXY5Rcmttbfb6HkzZaeqjLqd/aZCQ53UjQpg== + "@nodelib/fs.scandir@2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" @@ -920,6 +951,11 @@ remark "^12.0.0" unist-util-find-all-after "^3.0.1" +"@testim/chrome-version@^1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@testim/chrome-version/-/chrome-version-1.0.7.tgz#0cd915785ec4190f08a3a6acc9b61fc38fb5f1a9" + integrity sha512-8UT/J+xqCYfn3fKtOznAibsHpiuDshCb0fwgWxRazTT19Igp9ovoXMPhXyLD6m3CKQGTMHgqoxaFfMWaL40Rnw== + "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" @@ -930,6 +966,11 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= +"@types/node@*": + version "14.14.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.19.tgz#5135176a8330b88ece4e9ab1fdcfc0a545b4bab4" + integrity sha512-4nhBPStMK04rruRVtVc6cDqhu7S9GZai0fpXgPXrFpcPX6Xul8xnrjSdGB4KPBVYG/R5+fXWdCM8qBoiULWGPQ== + "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" @@ -945,6 +986,13 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== +"@types/yauzl@^2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af" + integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA== + dependencies: + "@types/node" "*" + "@ungap/event-target@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@ungap/event-target/-/event-target-0.1.0.tgz#88d527d40de86c4b0c99a060ca241d755999915b" @@ -1151,12 +1199,20 @@ agent-base@2: extend "~3.0.0" semver "~5.0.1" -agent-base@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" - integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: - es6-promisify "^5.0.0" + debug "4" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" ajv-errors@^1.0.0: version "1.0.1" @@ -1185,15 +1241,6 @@ ajv@^6.10.2: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.5.5: - version "6.6.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.2.tgz#caceccf474bf3fc3ce3b147443711a24063cc30d" - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" @@ -1314,21 +1361,11 @@ array-slice@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - dependencies: - array-uniq "^1.0.1" - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" @@ -1359,16 +1396,6 @@ asn1.js@^4.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - assert@^1.1.1: version "1.4.1" resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" @@ -1419,10 +1446,6 @@ async@^2.5.0: dependencies: lodash "^4.17.10" -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -1451,13 +1474,12 @@ autoprefixer@^9.8.0: postcss "^7.0.32" postcss-value-parser "^4.1.0" -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - -aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" +axios@^0.21.0: + version "0.21.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + dependencies: + follow-redirects "^1.10.0" babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" @@ -1651,23 +1673,12 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - dependencies: - tweetnacl "^0.14.3" - better-assert@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" dependencies: callsite "1.0.0" -big-integer@^1.6.17: - version "1.6.48" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" - integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== - big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" @@ -1680,14 +1691,6 @@ binary-extensions@^1.0.0: version "1.12.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" -binary@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" - integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= - dependencies: - buffers "~0.1.1" - chainsaw "~0.1.0" - blob@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" @@ -1700,11 +1703,6 @@ bluebird@^3.5.3: version "3.5.4" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714" -bluebird@~3.4.1: - version "3.4.7" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" - integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= - bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" @@ -1874,6 +1872,11 @@ buffer-alloc@^1.2.0: buffer-alloc-unsafe "^1.1.0" buffer-fill "^1.0.0" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + buffer-fill@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" @@ -1882,11 +1885,6 @@ buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" -buffer-indexof-polyfill@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.1.tgz#a9fb806ce8145d5428510ce72f278bb363a638bf" - integrity sha1-qfuAbOgUXVQoUQznLyeLs2OmOL8= - buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -1899,11 +1897,6 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffers@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" - integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= - builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -2046,10 +2039,6 @@ caniuse-lite@^1.0.30001093, caniuse-lite@^1.0.30001097: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001107.tgz#809360df7a5b3458f627aa46b0f6ed6d5239da9a" integrity sha512-86rCH+G8onCmdN4VZzJet5uPELII59cUzDphko3thQFgAQG1RNa+sVLDoALIhRYmflo5iSIzWY3vu1XTWtNMQQ== -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - ccount@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.5.tgz#ac82a944905a65ce204eb03023157edf29425c17" @@ -2070,13 +2059,6 @@ chai@^3.5.0: deep-eql "^0.1.3" type-detect "^1.0.0" -chainsaw@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" - integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= - dependencies: - traverse ">=0.3.0 <0.4" - chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -2167,14 +2149,18 @@ chrome-trace-event@^1.0.0: dependencies: tslib "^1.9.0" -chromedriver@^2.21.2: - version "2.45.0" - resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-2.45.0.tgz#8c1b158adbbd3e0ca3f7af19d459082245554378" - dependencies: - del "^3.0.0" - extract-zip "^1.6.7" - mkdirp "^0.5.1" - request "^2.88.0" +chromedriver@^87.0.1: + version "87.0.4" + resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-87.0.4.tgz#749f69e9427880abff19c1838258c35238397e50" + integrity sha512-kD4N/L8c0nAzh1eEAiAbEIq6Pn5TvGvckODvP5dPqF90q5tPiAJZCoWWSOUV/mrPxiodjHPfmNeOfGERHugzug== + dependencies: + "@testim/chrome-version" "^1.0.7" + axios "^0.21.0" + del "^6.0.0" + extract-zip "^2.0.1" + https-proxy-agent "^5.0.0" + mkdirp "^1.0.4" + proxy-from-env "^1.1.0" tcp-port-used "^1.0.1" cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: @@ -2209,6 +2195,11 @@ clean-css@4.2.x: dependencies: source-map "~0.6.0" +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + cli-cursor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" @@ -2349,12 +2340,6 @@ combine-lists@^1.0.0: dependencies: lodash "^4.5.0" -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" - dependencies: - delayed-stream "~1.0.0" - commander@2.17.x, commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" @@ -2389,7 +2374,7 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@1.6.2, concat-stream@^1.5.0: +concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" dependencies: @@ -2491,7 +2476,7 @@ core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.0: version "2.6.2" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.2.tgz#267988d7268323b349e20b4588211655f0e83944" -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -2709,12 +2694,6 @@ cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - data-uri-to-buffer@1: version "1.2.0" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz#77163ea9c20d8641b4707e8f18abdf9a78f34835" @@ -2757,6 +2736,13 @@ debug@2.6.8: dependencies: ms "2.0.0" +debug@4: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + debug@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" @@ -2848,20 +2834,19 @@ degenerator@~1.0.2: escodegen "1.x.x" esprima "3.x.x" -del@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" +del@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" + integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== dependencies: - globby "^6.1.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - p-map "^1.1.1" - pify "^3.0.0" - rimraf "^2.2.8" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" delegates@^1.0.0: version "1.0.0" @@ -3012,13 +2997,6 @@ domutils@^1.5.1: dom-serializer "0" domelementtype "1" -duplexer2@~0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= - dependencies: - readable-stream "^2.0.2" - duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" @@ -3028,13 +3006,6 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -3086,13 +3057,6 @@ encodeurl@~1.0.1, encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" -encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= - dependencies: - iconv-lite "~0.4.13" - end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" @@ -3183,18 +3147,6 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" -es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= - dependencies: - es6-promise "^4.0.3" - escalade@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4" @@ -3557,7 +3509,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@3, extend@^3.0.0, extend@~3.0.0, extend@~3.0.2: +extend@3, extend@^3.0.0, extend@~3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -3588,18 +3540,16 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extract-zip@^1.6.7: - version "1.6.7" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== dependencies: - concat-stream "1.6.2" - debug "2.6.9" - mkdirp "0.5.1" - yauzl "2.4.1" - -extsprintf@1.3.0, extsprintf@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" fast-deep-equal@^2.0.1: version "2.0.1" @@ -3641,9 +3591,10 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -fd-slicer@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= dependencies: pend "~1.2.0" @@ -3800,17 +3751,10 @@ follow-redirects@^1.0.0: dependencies: debug "=3.1.0" -"fontello-webpack-plugin@https://github.com/w3geo/fontello-webpack-plugin.git#6149eac8f2672ab6da089e8802fbfcac98487186": - version "0.4.8" - resolved "https://github.com/w3geo/fontello-webpack-plugin.git#6149eac8f2672ab6da089e8802fbfcac98487186" - dependencies: - form-data "^2.1.2" - html-webpack-plugin "^3.2.0" - https-proxy-agent "^2.1.1" - lodash "^4.17.4" - node-fetch "^1.6.3" - unzipper "^0.10.5" - webpack-sources "^0.2.0" +follow-redirects@^1.10.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.1.tgz#5f69b813376cee4fd0474a3aba835df04ab763b7" + integrity sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg== for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" @@ -3822,27 +3766,6 @@ for-own@^0.1.4: dependencies: for-in "^1.0.1" -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@^2.1.2: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - formatio@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb" @@ -3896,16 +3819,6 @@ fsevents@^1.2.7: nan "^2.12.1" node-pre-gyp "^0.12.0" -fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - ftp@~0.3.10: version "0.3.10" resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" @@ -3958,6 +3871,13 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-uri@2: version "2.0.2" resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.2.tgz#5c795e71326f6ca1286f2fc82575cd2bab2af578" @@ -3973,12 +3893,6 @@ get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" - glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -4038,7 +3952,7 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.3: +glob@^7.0.0, glob@^7.1.1, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" dependencies: @@ -4096,16 +4010,6 @@ globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - globjoin@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" @@ -4122,10 +4026,10 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" -graceful-fs@^4.2.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +graceful-fs@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== "graceful-readlink@>= 1.0.0": version "1.0.1" @@ -4145,17 +4049,6 @@ handlebars@^4.0.1: optionalDependencies: uglify-js "^3.1.4" -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - -har-validator@~5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - dependencies: - ajv "^6.5.5" - har-schema "^2.0.0" - hard-rejection@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" @@ -4310,7 +4203,7 @@ html-tags@^3.1.0: resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== -html-webpack-plugin@^3.0.0, html-webpack-plugin@^3.2.0: +html-webpack-plugin@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" dependencies: @@ -4377,14 +4270,6 @@ http-proxy@^1.13.0, http-proxy@^1.16.2: follow-redirects "^1.0.0" requires-port "^1.0.0" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -4397,13 +4282,13 @@ https-proxy-agent@1: debug "2" extend "3" -https-proxy-agent@^2.1.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" - integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== dependencies: - agent-base "^4.3.0" - debug "^3.1.0" + agent-base "6" + debug "4" iconv-lite@0.4.23, iconv-lite@^0.4.4: version "0.4.23" @@ -4411,7 +4296,7 @@ iconv-lite@0.4.23, iconv-lite@^0.4.4: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.4.24, iconv-lite@~0.4.13: +iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" dependencies: @@ -4534,7 +4419,7 @@ inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" -inherits@^2.0.0, inherits@~2.0.0: +inherits@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4798,21 +4683,15 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - -is-path-in-cwd@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - dependencies: - is-path-inside "^1.0.0" +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - dependencies: - path-is-inside "^1.0.1" +is-path-inside@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" + integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" @@ -4852,7 +4731,7 @@ is-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA== -is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -4868,7 +4747,7 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.0" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -4966,10 +4845,6 @@ isparta@4.x.x: source-map "^0.5.0" which "^1.0.9" -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - istanbul@0.4.5, istanbul@^0.4.0: version "0.4.5" resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" @@ -5027,10 +4902,6 @@ js-yaml@~3.7.0: argparse "^1.0.7" esprima "^2.6.0" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -5056,18 +4927,10 @@ json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - json3@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" @@ -5096,15 +4959,6 @@ json5@^2.1.2: dependencies: minimist "^1.2.5" -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - karma-coverage@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-1.1.2.tgz#cc09dceb589a83101aca5fe70c287645ef387689" @@ -5250,11 +5104,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -listenercount@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" - integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= - load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -5860,7 +5709,7 @@ mime-db@~1.37.0: version "1.37.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" -mime-types@^2.1.12, mime-types@~2.1.18, mime-types@~2.1.19: +mime-types@~2.1.18: version "2.1.21" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" dependencies: @@ -5974,12 +5823,17 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mkpath@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mkpath/-/mkpath-1.0.0.tgz#ebb3a977e7af1c683ae6fda12b545a6ba6c5853d" @@ -6036,6 +5890,11 @@ ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" @@ -6121,14 +5980,6 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" -node-fetch@^1.6.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - node-libs-browser@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" @@ -6296,10 +6147,6 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -6493,9 +6340,12 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-map@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" p-try@^1.0.0: version "1.0.0" @@ -6663,7 +6513,7 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-is-inside@^1.0.1, path-is-inside@^1.0.2: +path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" @@ -6718,10 +6568,6 @@ pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - phoenix@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/phoenix/-/phoenix-1.4.0.tgz#9cec8dbd8cbc59ecd2147bc09ca8ceb56b860d75" @@ -6735,10 +6581,6 @@ pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -7241,6 +7083,11 @@ proxy-agent@2.0.0: pac-proxy-agent "1" socks-proxy-agent "2" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -7249,10 +7096,6 @@ pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" -psl@^1.1.24: - version "1.1.31" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" - public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" @@ -7286,11 +7129,16 @@ pumpify@^1.3.3: inherits "^2.0.3" pump "^2.0.0" +punycode.js@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.1.0.tgz#f3937f7a914152c2dc17e9c280a2cf86a26b7cda" + integrity sha512-LvGUJ9QHiESLM4yn8JuJWicstRcJKRmP46psQw1HvCZ9puLFwYMKJWvkAkP3OHBVzNzZGx/D53EYJrIaKd9gZQ== + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" -punycode@^1.2.4, punycode@^1.4.1: +punycode@^1.2.4: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" @@ -7316,7 +7164,7 @@ qrcode@^1.3.0: pngjs "^3.3.0" yargs "^12.0.5" -qs@6.5.2, qs@~6.5.2: +qs@6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -7700,31 +7548,6 @@ replace-ext@1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= -request@^2.88.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -7807,16 +7630,16 @@ rfdc@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2" -rimraf@2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== +rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" dependencies: glob "^7.1.3" -rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" @@ -7865,7 +7688,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -7987,7 +7810,7 @@ set-value@^2.0.0: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.4, setimmediate@~1.0.4: +setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= @@ -8159,11 +7982,6 @@ sort-keys@^1.0.0: dependencies: is-plain-obj "^1.0.0" -source-list-map@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-1.1.2.tgz#9889019d1024cce55cdc069498337ef6186a11a1" - integrity sha1-mIkBnRAkzOVc3AaUmDN+9hhqEaE= - source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" @@ -8203,7 +8021,7 @@ source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" -source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.3: +source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -8254,20 +8072,6 @@ sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" -sshpk@^1.7.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.0.tgz#1d4963a2fbffe58050aa9084ca20be81741c07de" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - ssri@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" @@ -8753,18 +8557,6 @@ toposort@^1.0.0: version "1.0.7" resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - -"traverse@>=0.3.0 <0.4": - version "0.3.9" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" - integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= - trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -8801,16 +8593,6 @@ tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -9003,22 +8785,6 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -unzipper@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.5.tgz#4d189ae6f8af634b26efe1a1817c399e0dd4a1a0" - integrity sha512-i5ufkXNjWZYxU/0nKKf6LkvW8kn9YzRvfwuPWjXP+JTFce/8bqeR0gEfbiN2IDdJa6ZU6/2IzFRLK0z1v0uptw== - dependencies: - big-integer "^1.6.17" - binary "~0.3.0" - bluebird "~3.4.1" - buffer-indexof-polyfill "~1.0.0" - duplexer2 "~0.1.4" - fstream "^1.0.12" - graceful-fs "^4.2.2" - listenercount "~1.0.1" - readable-stream "~2.3.6" - setimmediate "~1.0.4" - upath@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" @@ -9122,14 +8888,6 @@ vendors@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - vfile-location@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.0.1.tgz#d78677c3546de0f7cd977544c367266764d31bb3" @@ -9283,14 +9041,6 @@ webpack-merge@^0.14.1: lodash.isplainobject "^3.2.0" lodash.merge "^3.3.2" -webpack-sources@^0.2.0: - version "0.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0dcdde8380697fb" - integrity sha1-F8Yr+vE8cH+dAsR54Nzd6DgGl/s= - dependencies: - source-list-map "^1.1.1" - source-map "~0.5.3" - webpack-sources@^1.1.0, webpack-sources@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" @@ -9466,11 +9216,13 @@ yargs@^12.0.5: y18n "^3.2.1 || ^4.0.0" yargs-parser "^11.1.1" -yauzl@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= dependencies: - fd-slicer "~1.0.1" + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" yeast@0.1.2: version "0.1.2" |
