Page MenuHomePhorge

No OneTemporary

Size
1 MB
Referenced Files
None
Subscribers
None
This file is larger than 256 KB, so syntax highlighting was skipped.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6e4bf8227f..dd4a28360f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,179 +1,195 @@
# Changelog
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]
+### Added
+- Mouseover titles for emojis in reaction picker
+- Support to input emoji into the search box in reaction picker
+- Added some missing unicode emoji
+
### 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 your latest chat messages disappearing when closing chat view and opening it again during the same session
+
+### 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
## [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
+- Fixed chat messages sometimes getting lost when you receive a message at the same time
## [2.1.1] - 2020-09-08
### Changed
- Polls will be hidden with status content if "Collapse posts with subjects" is enabled and the post is collapsed.
### Fixed
- Network fetches don't pile up anymore but wait for previous ones to finish to reduce throttling.
- Autocomplete won't stop at the second @, so it'll still work with "@lain@l" and not start over.
- Fixed weird autocomplete behavior when you write ":custom_emoji: ?"
## [2.1.0] - 2020-08-28
### Added
- Autocomplete domains from list of known instances
- 'Bot' settings option and badge
- Added profile meta data fields that can be set in profile settings
- Added option to reset avatar/banner in profile settings
- Descriptions can be set on uploaded files before posting
- Added status preview option to preview your statuses before posting
- When a post is a reply to an unavailable post, the 'Reply to'-text has a strike-through style
- Added ability to see all favoriting or repeating users when hovering the number on highlighted statuses
- Bookmarks
### Changed
- Change heart to thumbs up in reaction picker
- Close the media modal on navigation events
- Add colons to the emoji alt text, to make them copyable
- Add better visual indication for drag-and-drop for files
- When disabling attachments, the placeholder links now show an icon and the description instead of just IMAGE or VIDEO etc
- Remove unnecessary options for 'automatic loading when loading older' and 'reply previews'
- Greentext now has separate color slot for it
- Removed the use of with_move parameters when fetching notifications
- Push notifications now are the same as normal notfication, and are localized.
- Updated Notification Settings to match new BE API
### Fixed
- Custom Emoji will display in poll options now.
- Status ellipsis menu closes properly when selecting certain options
- Cropped images look correct in Chrome
- Newlines in the muted words settings work again
- Clicking on non-latin hashtags won't open a new window
- Uploading and drag-dropping multiple files works correctly now.
- Subject field now appears disabled when posting
- Fix status ellipsis menu being cut off in notifications column
- Fixed autocomplete sometimes not returning the right user when there's already some results
- Videos and audio and misc files show description as alt/title properly now
- Clicking on non-image/video files no longer opens an empty modal
- Audio files can now be played back in the frontend with hidden attachments
- Videos are not cropped awkwardly in the uploads section anymore
- Reply filtering options in Settings -> Filtering now work again using filtering on server
- Don't show just blank-screen when cookies are disabled
- Add status idempotency to prevent accidental double posting when posting returns an error
- Weird bug related to post being sent seemingly after pasting with keyboard (hopefully)
- Multiple issues with muted statuses/notifications
## [2.0.5] - 2020-05-12
### Added
- Added private notifications option for push notifications
- 'Copy link' button for statuses (in the ellipsis menu)
### Changed
- Registration page no longer requires email if the server is configured not to require it
### Fixed
- Status ellipsis menu closes properly when selecting certain options
## [2.0.3] - 2020-05-02
### Fixed
- Show more/less works correctly with auto-collapsed subjects and long posts
- RTL characters won't look messed up in notifications
### Changed
- Emoji autocomplete will match any part of the word and not just start, for example :drool will now helpfully suggest :blobcatdrool: and :blobcatdroolreach:
### Added
- Follow request notification support
## [2.0.2] - 2020-04-08
### Fixed
- Favorite/Repeat avatars not showing up on private instances/non-public posts
- Autocorrect getting triggered in the captcha field
- Overflow on long domains in follow/move notifications
### Changed
- Polish translation updated
## [2.0.0] - 2020-02-28
### Added
- Tons of color slots including ones for hover/pressed/toggled buttons
- Experimental `--variable[,mod]` syntax support for color slots in themes. the `mod` makes color brighter/darker depending on background color (makes darker color brighter/darker depending on background color)
- Paper theme by Shpuld
- Icons in nav panel
- Private mode support
- Support for 'Move' type notifications
- Pleroma AMOLED dark theme
- User level domain mutes, under User Settings -> Mutes
- Emoji reactions for statuses
- MRF keyword policy disclosure
### Changed
- Updated Pleroma default themes
- theme engine update to 3 (themes v2.1 introduction)
- massive internal changes in theme engine - slowly away from "generate things separately with spaghetti code" towards "feed all data into single 'generateTheme' function and declare slot inheritance and all in a separate file"
- Breezy theme updates to make it closer to actual Breeze in some aspects
- when using `--variable` in shadows it no longer uses the actual CSS3 variable, instead it generates color from other slots
- theme doesn't get saved to local storage when opening FE anonymously
- Captcha now resets on failed registrations
- Notifications column now cleans itself up to optimize performance when tab is left open for a long time
- 403 messaging
### Fixed
- Fixed loader-spinner not disappearing when a status preview fails to load
- anon viewers won't get theme data saved to local storage, so admin changing default theme will have an effect for users coming back to instance.
- Single notifications left unread when hitting read on another device/tab
- Registration fixed
- Deactivation of remote accounts from frontend
- Fixed NSFW unhiding not working with videos when using one-click unhiding/displaying
- Improved performance of anything that uses popovers (most notably statuses)
## [1.1.7 and earlier] - 2019-12-14
### Added
- Ability to hide/show repeats from user
- User profile button clutter organized into a menu
- Emoji picker
- Started changelog anew
- Ability to change user's email
- About page
- Added remote user redirect
### 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/src/App.scss b/src/App.scss
index ca7d33cd93..cdc3209c91 100644
--- a/src/App.scss
+++ b/src/App.scss
@@ -1,865 +1,896 @@
@import './_variables.scss';
#app {
min-height: 100vh;
max-width: 100%;
overflow: hidden;
}
.app-bg-wrapper {
position: fixed;
z-index: -1;
height: 100%;
left: 0;
right: -20px;
background-size: cover;
background-repeat: no-repeat;
background-position: 0 50%;
}
i[class^='icon-'] {
user-select: none;
}
h4 {
margin: 0;
}
#content {
box-sizing: border-box;
padding-top: 60px;
margin: auto;
min-height: 100vh;
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));
}
.text-center {
text-align: center;
}
html {
font-size: 14px;
}
body {
overscroll-behavior-y: none;
font-family: sans-serif;
font-family: var(--interfaceFont, sans-serif);
margin: 0;
color: $fallback--text;
color: var(--text, $fallback--text);
max-width: 100vw;
overflow-x: hidden;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
&.hidden {
display: none;
}
}
a {
text-decoration: none;
color: $fallback--link;
color: var(--link, $fallback--link);
}
-button {
+.button-default {
user-select: none;
color: $fallback--text;
color: var(--btnText, $fallback--text);
background-color: $fallback--fg;
background-color: var(--btn, $fallback--fg);
border: none;
border-radius: $fallback--btnRadius;
border-radius: var(--btnRadius, $fallback--btnRadius);
cursor: pointer;
box-shadow: $fallback--buttonShadow;
box-shadow: var(--buttonShadow);
font-size: 14px;
font-family: sans-serif;
font-family: var(--interfaceFont, sans-serif);
- i[class*=icon-], .svg-inline--fa {
+ i[class*=icon-],
+ .svg-inline--fa {
color: $fallback--text;
color: var(--btnText, $fallback--text);
}
&::-moz-focus-inner {
border: none;
}
&:hover {
box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.3);
box-shadow: var(--buttonHoverShadow);
}
&:active {
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);
color: $fallback--text;
color: var(--btnPressedText, $fallback--text);
background-color: $fallback--fg;
background-color: var(--btnPressed, $fallback--fg);
- svg, i {
+ svg,
+ i {
color: $fallback--text;
color: var(--btnPressedText, $fallback--text);
}
}
&:disabled {
cursor: not-allowed;
color: $fallback--text;
color: var(--btnDisabledText, $fallback--text);
background-color: $fallback--fg;
background-color: var(--btnDisabled, $fallback--fg);
- svg, i {
+ svg,
+ i {
color: $fallback--text;
color: var(--btnDisabledText, $fallback--text);
}
}
&.toggled {
color: $fallback--text;
color: var(--btnToggledText, $fallback--text);
background-color: $fallback--fg;
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 {
+ svg,
+ i {
color: $fallback--text;
color: var(--btnToggledText, $fallback--text);
}
}
&.danger {
// TODO: add better color variable
color: $fallback--text;
color: var(--alertErrorPanelText, $fallback--text);
background-color: $fallback--alertError;
background-color: var(--alertError, $fallback--alertError);
}
}
+.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%;
+ }
+}
+
input, textarea, .select, .input {
&.unstyled {
border-radius: 0;
background: none;
box-shadow: none;
height: unset;
}
border: none;
border-radius: $fallback--inputRadius;
border-radius: var(--inputRadius, $fallback--inputRadius);
box-shadow: 0px 1px 0px 0px rgba(0, 0, 0, 0.2) inset, 0px -1px 0px 0px rgba(255, 255, 255, 0.2) inset, 0px 0px 2px 0px rgba(0, 0, 0, 1) inset;
box-shadow: var(--inputShadow);
background-color: $fallback--fg;
background-color: var(--input, $fallback--fg);
color: $fallback--lightText;
color: var(--inputText, $fallback--lightText);
font-family: sans-serif;
font-family: var(--inputFont, sans-serif);
font-size: 14px;
margin: 0;
box-sizing: border-box;
display: inline-block;
position: relative;
height: 28px;
line-height: 16px;
hyphens: none;
padding: 8px .5em;
&.select {
padding: 0;
}
&:disabled, &[disabled=disabled] {
cursor: not-allowed;
opacity: 0.5;
}
.select-down-icon {
position: absolute;
top: 0;
bottom: 0;
right: 5px;
height: 100%;
color: $fallback--text;
color: var(--inputText, $fallback--text);
line-height: 28px;
z-index: 0;
pointer-events: none;
}
select {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: transparent;
border: none;
color: $fallback--text;
color: var(--inputText, --text, $fallback--text);
margin: 0;
padding: 0 2em 0 .2em;
font-family: sans-serif;
font-family: var(--inputFont, sans-serif);
font-size: 14px;
width: 100%;
z-index: 1;
height: 28px;
line-height: 16px;
}
&[type=range] {
background: none;
border: none;
margin: 0;
box-shadow: none;
flex: 1;
}
&[type=radio] {
display: none;
&:checked + label::before {
box-shadow: 0px 0px 2px black inset, 0px 0px 0px 4px $fallback--fg inset;
box-shadow: var(--inputShadow), 0px 0px 0px 4px var(--fg, $fallback--fg) inset;
background-color: var(--accent, $fallback--link);
}
&:disabled {
&,
& + label,
& + label::before {
opacity: .5;
}
}
+ label::before {
flex-shrink: 0;
display: inline-block;
content: '';
transition: box-shadow 200ms;
width: 1.1em;
height: 1.1em;
border-radius: 100%; // Radio buttons should always be circle
box-shadow: 0px 0px 2px black inset;
box-shadow: var(--inputShadow);
margin-right: .5em;
background-color: $fallback--fg;
background-color: var(--input, $fallback--fg);
vertical-align: top;
text-align: center;
line-height: 1.1em;
font-size: 1.1em;
box-sizing: border-box;
color: transparent;
overflow: hidden;
box-sizing: border-box;
}
}
&[type=checkbox] {
display: none;
&:checked + label::before {
color: $fallback--text;
color: var(--inputText, $fallback--text);
}
&:disabled {
&,
& + label,
& + label::before {
opacity: .5;
}
}
+ label::before {
flex-shrink: 0;
display: inline-block;
content: '✓';
transition: color 200ms;
width: 1.1em;
height: 1.1em;
border-radius: $fallback--checkboxRadius;
border-radius: var(--checkboxRadius, $fallback--checkboxRadius);
box-shadow: 0px 0px 2px black inset;
box-shadow: var(--inputShadow);
margin-right: .5em;
background-color: $fallback--fg;
background-color: var(--input, $fallback--fg);
vertical-align: top;
text-align: center;
line-height: 1.1em;
font-size: 1.1em;
box-sizing: border-box;
color: transparent;
overflow: hidden;
box-sizing: border-box;
}
}
}
option {
color: $fallback--text;
color: var(--text, $fallback--text);
background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg);
}
.hide-number-spinner {
-moz-appearance: textfield;
&[type=number]::-webkit-inner-spin-button,
&[type=number]::-webkit-outer-spin-button {
opacity: 0;
display: none;
}
}
i[class*=icon-], .svg-inline--fa {
color: $fallback--icon;
color: var(--icon, $fallback--icon);
}
.btn-block {
display: block;
width: 100%;
}
.btn-group {
position: relative;
display: inline-flex;
vertical-align: middle;
button {
position: relative;
flex: 1 1 auto;
&:not(:last-child) {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
&:not(:first-child) {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
}
}
.container {
display: flex;
flex-wrap: wrap;
margin: 0;
padding: 0 10px 0 10px;
}
.auto-size {
flex: 1
}
main-router {
flex: 1;
}
.status.compact {
color: rgba(0, 0, 0, 0.42);
font-weight: 300;
p {
margin: 0;
font-size: 0.8em
}
}
/* Panel */
.panel {
display: flex;
position: relative;
flex-direction: column;
margin: 0.5em;
background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg);
&::after, & {
border-radius: $fallback--panelRadius;
border-radius: var(--panelRadius, $fallback--panelRadius);
}
&::after {
content: '';
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
pointer-events: none;
box-shadow: 1px 1px 4px rgba(0,0,0,.6);
box-shadow: var(--panelShadow);
}
}
.panel-body:empty::before {
content: "¯\\_(ツ)_/¯"; // Could use words but it'd require translations
display: block;
margin: 1em;
text-align: center;
}
.panel-heading {
display: flex;
flex: none;
border-radius: $fallback--panelRadius $fallback--panelRadius 0 0;
border-radius: var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius) 0 0;
background-size: cover;
padding: .6em .6em;
text-align: left;
line-height: 28px;
color: var(--panelText);
background-color: $fallback--fg;
background-color: var(--panel, $fallback--fg);
align-items: baseline;
box-shadow: var(--panelHeaderShadow);
.title {
flex: 1 0 auto;
font-size: 1.3em;
}
.faint {
background-color: transparent;
color: $fallback--faint;
color: var(--panelFaint, $fallback--faint);
}
+
.faint-link {
color: $fallback--faint;
color: var(--faintLink, $fallback--faint);
}
.alert {
white-space: nowrap;
text-overflow: ellipsis;
overflow-x: hidden;
}
- button {
- flex-shrink: 0;
- }
-
- button, .alert {
+ .button-default,
+ .alert {
// height: 100%;
line-height: 21px;
min-height: 0;
box-sizing: border-box;
margin: 0;
margin-left: .5em;
min-width: 1px;
align-self: stretch;
}
- button {
- &, i[class*=icon-] {
+ .button-default {
+ flex-shrink: 0;
+
+ &,
+ i[class*=icon-] {
color: $fallback--text;
color: var(--btnPanelText, $fallback--text);
}
&:active {
background-color: $fallback--fg;
background-color: var(--btnPressedPanel, $fallback--fg);
color: $fallback--text;
color: var(--btnPressedPanelText, $fallback--text);
}
&:disabled {
color: $fallback--text;
color: var(--btnDisabledPanelText, $fallback--text);
}
&.toggled {
color: $fallback--text;
color: var(--btnToggledPanelText, $fallback--text);
}
}
- a {
+ a,
+ .-link {
color: $fallback--link;
color: var(--panelLink, $fallback--link)
}
}
.panel-heading.stub {
border-radius: $fallback--panelRadius;
border-radius: var(--panelRadius, $fallback--panelRadius);
}
.panel-footer {
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);
}
}
.panel-body > p {
line-height: 18px;
padding: 1em;
margin: 0;
}
.container > * {
min-width: 0px;
}
.fa {
color: grey;
}
nav {
z-index: 1000;
color: var(--topBarText);
background-color: $fallback--fg;
background-color: var(--topBar, $fallback--fg);
color: $fallback--faint;
color: var(--faint, $fallback--faint);
box-shadow: 0px 0px 4px rgba(0,0,0,.6);
box-shadow: var(--topBarShadow);
}
.fade-enter-active, .fade-leave-active {
transition: opacity .2s
}
.fade-enter, .fade-leave-active {
opacity: 0
}
.main {
flex-basis: 50%;
flex-grow: 1;
flex-shrink: 1;
}
.sidebar-bounds {
flex: 0;
flex-basis: 35%;
}
.sidebar-flexer {
flex: 1;
flex-basis: 345px;
width: 365px;
}
.mobile-shown {
display: none;
}
@media all and (min-width: 800px) {
body {
overflow-y: scroll;
}
.sidebar-bounds {
overflow: hidden;
max-height: 100vh;
width: 345px;
position: fixed;
margin-top: -10px;
.sidebar-scroller {
height: 96vh;
width: 365px;
padding-top: 10px;
padding-right: 50px;
overflow-x: hidden;
overflow-y: scroll;
}
.sidebar {
width: 345px;
}
}
.sidebar-flexer {
max-height: 96vh;
flex-shrink: 0;
flex-grow: 0;
}
}
.badge {
box-sizing: border-box;
display: inline-block;
border-radius: 99px;
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;
overflow: hidden;
text-overflow: ellipsis;
&.badge-notification {
background-color: $fallback--cRed;
background-color: var(--badgeNotification, $fallback--cRed);
color: white;
color: var(--badgeNotificationText, white);
}
}
.alert {
margin: 0.35em;
padding: 0.25em;
border-radius: $fallback--tooltipRadius;
border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
min-height: 28px;
line-height: 28px;
&.error {
background-color: $fallback--alertError;
background-color: var(--alertError, $fallback--alertError);
color: $fallback--text;
color: var(--alertErrorText, $fallback--text);
.panel-heading & {
color: $fallback--text;
color: var(--alertErrorPanelText, $fallback--text);
}
}
&.warning {
background-color: $fallback--alertWarning;
background-color: var(--alertWarning, $fallback--alertWarning);
color: $fallback--text;
color: var(--alertWarningText, $fallback--text);
.panel-heading & {
color: $fallback--text;
color: var(--alertWarningPanelText, $fallback--text);
}
}
}
.faint {
color: $fallback--faint;
color: var(--faint, $fallback--faint);
}
.faint-link {
color: $fallback--faint;
color: var(--faint, $fallback--faint);
&:hover {
text-decoration: underline;
}
}
.visibility-notice {
padding: .5em;
border: 1px solid $fallback--faint;
border: 1px solid var(--faint, $fallback--faint);
border-radius: $fallback--inputRadius;
border-radius: var(--inputRadius, $fallback--inputRadius);
}
.notice-dismissible {
padding-right: 4rem;
position: relative;
.dismiss {
position: absolute;
top: 0;
right: 0;
padding: .5em;
color: inherit;
}
}
.fa-scale-110 {
&.svg-inline--fa {
font-size: 1.1em;
}
}
.fa-old-padding {
&.svg-inline--fa {
padding: 0 0.3em;
}
}
@keyframes shakeError {
0% {
transform: translateX(0);
}
15% {
transform: translateX(0.375rem);
}
30% {
transform: translateX(-0.375rem);
}
45% {
transform: translateX(0.375rem);
}
60% {
transform: translateX(-0.375rem);
}
75% {
transform: translateX(0.375rem);
}
90% {
transform: translateX(-0.375rem);
}
100% {
transform: translateX(0);
}
}
@media all and (max-width: 800px) {
.mobile-hidden {
display: none;
}
.panel-switcher {
display: flex;
}
.container {
padding: 0;
}
.panel {
margin: 0.5em 0 0.5em 0;
}
.menu-button {
display: block;
margin-right: 0.8em;
}
.main {
margin-bottom: 7em;
}
}
.select-multiple {
display: flex;
.option-list {
margin: 0;
padding-left: .5em;
}
}
.setting-list,
.option-list{
list-style-type: none;
padding-left: 2em;
li {
margin-bottom: 0.5em;
}
.suboptions {
margin-top: 0.3em
}
}
.login-hint {
text-align: center;
@media all and (min-width: 801px) {
display: none;
}
a {
display: inline-block;
padding: 1em 0px;
width: 100%;
}
}
-.btn.btn-default {
+.btn.button-default {
min-height: 28px;
}
.animate-spin {
animation: spin 2s infinite linear;
display: inline-block;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(359deg);
}
}
.new-status-notification {
position:relative;
margin-top: -1px;
font-size: 1.1em;
border-width: 1px 0 0 0;
border-style: solid;
border-color: var(--border, $fallback--border);
padding: 10px;
z-index: 1;
background-color: $fallback--fg;
background-color: var(--panel, $fallback--fg);
}
.chat-layout {
// Needed for smoother chat navigation in the desktop Safari (otherwise the chat layout "jumps" as the chat opens).
overflow: hidden;
height: 100%;
// Ensures the fixed position of the mobile browser bars on scroll up / down events.
// Prevents the mobile browser bars from overlapping or hiding the message posting form.
@media all and (max-width: 800px) {
body {
height: 100%;
}
#app {
height: 100%;
overflow: hidden;
min-height: auto;
}
#app_bg_wrapper {
overflow: hidden;
}
.main {
overflow: hidden;
height: 100%;
}
#content {
padding-top: 0;
height: 100%;
overflow: visible;
}
}
}
diff --git a/src/boot/after_store.js b/src/boot/after_store.js
index 3cbbf020c0..b472fcf64e 100644
--- a/src/boot/after_store.js
+++ b/src/boot/after_store.js
@@ -1,386 +1,389 @@
import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'
import App from '../App.vue'
import { windowWidth } from '../services/window_utils/window_utils'
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
const parsedInitialResults = () => {
if (!document.getElementById('initial-results')) {
return null
}
if (!staticInitialResults) {
staticInitialResults = JSON.parse(document.getElementById('initial-results').textContent)
}
return staticInitialResults
}
const decodeUTF8Base64 = (data) => {
const rawData = atob(data)
const array = Uint8Array.from([...rawData].map((char) => char.charCodeAt(0)))
const text = new TextDecoder().decode(array)
return text
}
const preloadFetch = async (request) => {
const data = parsedInitialResults()
if (!data || !data[request]) {
return window.fetch(request)
}
const decoded = decodeUTF8Base64(data[request])
const requestData = JSON.parse(decoded)
return {
ok: true,
json: () => requestData,
text: () => requestData
}
}
const getInstanceConfig = async ({ store }) => {
try {
const res = await preloadFetch('/api/v1/instance')
if (res.ok) {
const data = await res.json()
const textlimit = data.max_toot_chars
const vapidPublicKey = data.pleroma.vapid_public_key
store.dispatch('setInstanceOption', { name: 'textlimit', value: textlimit })
if (vapidPublicKey) {
store.dispatch('setInstanceOption', { name: 'vapidPublicKey', value: vapidPublicKey })
}
} else {
throw (res)
}
} catch (error) {
console.error('Could not load instance config, potentially fatal')
console.error(error)
}
}
const getBackendProvidedConfig = async ({ store }) => {
try {
const res = await window.fetch('/api/pleroma/frontend_configurations')
if (res.ok) {
const data = await res.json()
return data.pleroma_fe
} else {
throw (res)
}
} catch (error) {
console.error('Could not load backend-provided frontend config, potentially fatal')
console.error(error)
}
}
const getStaticConfig = async () => {
try {
const res = await window.fetch('/static/config.json')
if (res.ok) {
return res.json()
} else {
throw (res)
}
} catch (error) {
console.warn('Failed to load static/config.json, continuing without it.')
console.warn(error)
return {}
}
}
const setSettings = async ({ apiConfig, staticConfig, store }) => {
const overrides = window.___pleromafe_dev_overrides || {}
const env = window.___pleromafe_mode.NODE_ENV
// This takes static config and overrides properties that are present in apiConfig
let config = {}
if (overrides.staticConfigPreference && env === 'development') {
console.warn('OVERRIDING API CONFIG WITH STATIC CONFIG')
config = Object.assign({}, apiConfig, staticConfig)
} else {
config = Object.assign({}, staticConfig, apiConfig)
}
const copyInstanceOption = (name) => {
store.dispatch('setInstanceOption', { name, value: config[name] })
}
copyInstanceOption('nsfwCensorImage')
copyInstanceOption('background')
copyInstanceOption('hidePostStats')
copyInstanceOption('hideUserStats')
copyInstanceOption('hideFilteredStatuses')
copyInstanceOption('logo')
store.dispatch('setInstanceOption', {
name: 'logoMask',
value: typeof config.logoMask === 'undefined'
? true
: config.logoMask
})
store.dispatch('setInstanceOption', {
name: 'logoMargin',
value: typeof config.logoMargin === 'undefined'
? 0
: config.logoMargin
})
copyInstanceOption('logoLeft')
store.commit('authFlow/setInitialStrategy', config.loginMethod)
copyInstanceOption('redirectRootNoLogin')
copyInstanceOption('redirectRootLogin')
copyInstanceOption('showInstanceSpecificPanel')
copyInstanceOption('minimalScopesMode')
copyInstanceOption('hideMutedPosts')
copyInstanceOption('collapseMessageWithSubject')
copyInstanceOption('scopeCopy')
copyInstanceOption('subjectLineBehavior')
copyInstanceOption('postContentType')
copyInstanceOption('alwaysShowSubjectInput')
copyInstanceOption('showFeaturesPanel')
copyInstanceOption('hideSitename')
copyInstanceOption('sidebarRight')
return store.dispatch('setTheme', config['theme'])
}
const getTOS = async ({ store }) => {
try {
const res = await window.fetch('/static/terms-of-service.html')
if (res.ok) {
const html = await res.text()
store.dispatch('setInstanceOption', { name: 'tos', value: html })
} else {
throw (res)
}
} catch (e) {
console.warn("Can't load TOS")
console.warn(e)
}
}
const getInstancePanel = async ({ store }) => {
try {
const res = await preloadFetch('/instance/panel.html')
if (res.ok) {
const html = await res.text()
store.dispatch('setInstanceOption', { name: 'instanceSpecificPanelContent', value: html })
} else {
throw (res)
}
} catch (e) {
console.warn("Can't load instance panel")
console.warn(e)
}
}
const getStickers = async ({ store }) => {
try {
const res = await window.fetch('/static/stickers.json')
if (res.ok) {
const values = await res.json()
const stickers = (await Promise.all(
Object.entries(values).map(async ([name, path]) => {
const resPack = await window.fetch(path + 'pack.json')
var meta = {}
if (resPack.ok) {
meta = await resPack.json()
}
return {
pack: name,
path,
meta
}
})
)).sort((a, b) => {
return a.meta.title.localeCompare(b.meta.title)
})
store.dispatch('setInstanceOption', { name: 'stickers', value: stickers })
} else {
throw (res)
}
} catch (e) {
console.warn("Can't load stickers")
console.warn(e)
}
}
const getAppSecret = async ({ store }) => {
const { state, commit } = store
const { oauth, instance } = state
return getOrCreateApp({ ...oauth, instance: instance.server, commit })
.then((app) => getClientToken({ ...app, instance: instance.server }))
.then((token) => {
commit('setAppToken', token.access_token)
commit('setBackendInteractor', backendInteractorService(store.getters.getToken()))
})
}
const resolveStaffAccounts = ({ store, accounts }) => {
const nicknames = accounts.map(uri => uri.split('/').pop())
store.dispatch('setInstanceOption', { name: 'staffAccounts', value: nicknames })
}
const getNodeInfo = async ({ store }) => {
try {
const res = await preloadFetch('/nodeinfo/2.0.json')
if (res.ok) {
const data = await res.json()
const metadata = data.metadata
const features = metadata.features
store.dispatch('setInstanceOption', { name: 'name', value: metadata.nodeName })
store.dispatch('setInstanceOption', { name: 'registrationOpen', value: data.openRegistrations })
store.dispatch('setInstanceOption', { name: 'mediaProxyAvailable', value: features.includes('media_proxy') })
store.dispatch('setInstanceOption', { name: 'safeDM', value: features.includes('safe_dm_mentions') })
store.dispatch('setInstanceOption', { name: 'chatAvailable', value: features.includes('chat') })
store.dispatch('setInstanceOption', { name: 'pleromaChatMessagesAvailable', value: features.includes('pleroma_chat_messages') })
store.dispatch('setInstanceOption', { name: 'gopherAvailable', value: features.includes('gopher') })
store.dispatch('setInstanceOption', { name: 'pollsAvailable', value: features.includes('polls') })
store.dispatch('setInstanceOption', { name: 'pollLimits', value: metadata.pollLimits })
store.dispatch('setInstanceOption', { name: 'mailerEnabled', value: metadata.mailerEnabled })
const uploadLimits = metadata.uploadLimits
store.dispatch('setInstanceOption', { name: 'uploadlimit', value: parseInt(uploadLimits.general) })
store.dispatch('setInstanceOption', { name: 'avatarlimit', value: parseInt(uploadLimits.avatar) })
store.dispatch('setInstanceOption', { name: 'backgroundlimit', value: parseInt(uploadLimits.background) })
store.dispatch('setInstanceOption', { name: 'bannerlimit', value: parseInt(uploadLimits.banner) })
store.dispatch('setInstanceOption', { name: 'fieldsLimits', value: metadata.fieldsLimits })
store.dispatch('setInstanceOption', { name: 'restrictedNicknames', value: metadata.restrictedNicknames })
store.dispatch('setInstanceOption', { name: 'postFormats', value: metadata.postFormats })
const suggestions = metadata.suggestions
store.dispatch('setInstanceOption', { name: 'suggestionsEnabled', value: suggestions.enabled })
store.dispatch('setInstanceOption', { name: 'suggestionsWeb', value: suggestions.web })
const software = data.software
store.dispatch('setInstanceOption', { name: 'backendVersion', value: software.version })
store.dispatch('setInstanceOption', { name: 'pleromaBackend', value: software.name === 'pleroma' })
const priv = metadata.private
store.dispatch('setInstanceOption', { name: 'private', value: priv })
const frontendVersion = window.___pleromafe_commit_hash
store.dispatch('setInstanceOption', { name: 'frontendVersion', value: frontendVersion })
const federation = metadata.federation
store.dispatch('setInstanceOption', {
name: 'tagPolicyAvailable',
value: typeof federation.mrf_policies === 'undefined'
? false
: metadata.federation.mrf_policies.includes('TagPolicy')
})
store.dispatch('setInstanceOption', { name: 'federationPolicy', value: federation })
store.dispatch('setInstanceOption', {
name: 'federating',
value: typeof federation.enabled === 'undefined'
? true
: federation.enabled
})
const accountActivationRequired = metadata.accountActivationRequired
store.dispatch('setInstanceOption', { name: 'accountActivationRequired', value: accountActivationRequired })
const accounts = metadata.staffAccounts
resolveStaffAccounts({ store, accounts })
} else {
throw (res)
}
} catch (e) {
console.warn('Could not load nodeinfo')
console.warn(e)
}
}
const setConfig = async ({ store }) => {
// apiConfig, staticConfig
const configInfos = await Promise.all([getBackendProvidedConfig({ store }), getStaticConfig()])
const apiConfig = configInfos[0]
const staticConfig = configInfos[1]
await setSettings({ store, apiConfig, staticConfig }).then(getAppSecret({ store }))
}
const checkOAuthToken = async ({ store }) => {
return new Promise(async (resolve, reject) => {
if (store.getters.getUserToken()) {
try {
await store.dispatch('loginUser', store.getters.getUserToken())
} catch (e) {
console.error(e)
}
}
resolve()
})
}
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 })
await setConfig({ store })
const { customTheme, customThemeSource } = store.state.config
const { theme } = store.state.instance
const customThemePresent = customThemeSource || customTheme
if (customThemePresent) {
if (customThemeSource && customThemeSource.themeEngineVersion === CURRENT_VERSION) {
applyTheme(customThemeSource)
} else {
applyTheme(customTheme)
}
} else if (theme) {
// do nothing, it will load asynchronously
} else {
console.error('Failed to load any theme!')
}
// Now we can try getting the server settings and logging in
// Most of these are preloaded into the index.html so blocking is minimized
await Promise.all([
checkOAuthToken({ store }),
getInstancePanel({ store }),
getNodeInfo({ store }),
getInstanceConfig({ store })
])
// Start fetching things that don't need to block the UI
store.dispatch('fetchMutes')
getTOS({ store })
getStickers({ store })
const router = new VueRouter({
mode: 'history',
routes: routes(store),
scrollBehavior: (to, _from, savedPosition) => {
if (to.matched.some(m => m.meta.dontScroll)) {
return false
}
return savedPosition || { x: 0, y: 0 }
}
})
/* eslint-disable no-new */
return new Vue({
router,
store,
i18n,
el: '#app',
render: h => h(App)
})
}
export default afterStoreSetup
diff --git a/src/components/account_actions/account_actions.vue b/src/components/account_actions/account_actions.vue
index e3ae376e26..ab5d1d2982 100644
--- a/src/components/account_actions/account_actions.vue
+++ b/src/components/account_actions/account_actions.vue
@@ -1,97 +1,98 @@
<template>
<div class="AccountActions">
<Popover
trigger="click"
placement="bottom"
:bound-to="{ x: 'container' }"
+ remove-padding
>
<div
slot="content"
class="account-tools-popover"
>
<div class="dropdown-menu">
<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') }}
</button>
<div
role="separator"
class="dropdown-divider"
/>
</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') }}
</button>
</div>
</div>
<div
slot="trigger"
- class="btn btn-default ellipsis-button"
+ class="ellipsis-button"
>
<FAIcon
class="icon"
icon="ellipsis-v"
/>
</div>
</Popover>
</div>
</template>
<script src="./account_actions.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.AccountActions {
button.dropdown-item {
margin-left: 0;
}
.ellipsis-button {
cursor: pointer;
width: 2.5em;
margin: -0.5em 0;
padding: 0.5em 0;
text-align: center;
&: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 b68b98f97f..b1b59638d5 100644
--- a/src/components/async_component_error/async_component_error.vue
+++ b/src/components/async_component_error/async_component_error.vue
@@ -1,41 +1,41 @@
<template>
<div class="async-component-error">
<div>
<h4>
{{ $t('general.generic_error') }}
</h4>
<p>
{{ $t('general.error_retry') }}
</p>
<button
- class="btn"
+ class="btn button-default"
@click="retry"
>
{{ $t('general.retry') }}
</button>
</div>
</div>
</template>
<script>
export default {
methods: {
retry () {
this.$emit('resetAsyncComponent')
}
}
}
</script>
<style lang="scss">
.async-component-error {
display: flex;
height: 100%;
align-items: center;
justify-content: center;
.btn {
margin: .5em;
padding: .5em 2em;
}
}
</style>
diff --git a/src/components/attachment/attachment.js b/src/components/attachment/attachment.js
index e23fcb1b44..5f5779a069 100644
--- a/src/components/attachment/attachment.js
+++ b/src/components/attachment/attachment.js
@@ -1,134 +1,138 @@
import StillImage from '../still-image/still-image.vue'
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
+ faVideo,
+ faPlayCircle,
+ faTimes
} from '@fortawesome/free-solid-svg-icons'
library.add(
faFile,
faMusic,
faImage,
- faVideo
+ faVideo,
+ faPlayCircle,
+ faTimes
)
const Attachment = {
props: [
'attachment',
'nsfw',
'size',
'allowPlay',
'setMedia',
'naturalSizeLoad'
],
data () {
return {
nsfwImage: this.$store.state.instance.nsfwCensorImage || nsfwImage,
hideNsfwLocal: this.$store.getters.mergedConfig.hideNsfw,
preloadImage: this.$store.getters.mergedConfig.preloadImage,
loading: false,
img: fileTypeService.fileType(this.attachment.mimetype) === 'image' && document.createElement('img'),
modalOpen: false,
showHidden: false
}
},
components: {
StillImage,
VideoAttachment
},
computed: {
usePlaceholder () {
return this.size === 'hide' || this.type === 'unknown'
},
placeholderName () {
if (this.attachment.description === '' || !this.attachment.description) {
return this.type.toUpperCase()
}
return this.attachment.description
},
placeholderIconClass () {
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'
},
type () {
return fileTypeService.fileType(this.attachment.mimetype)
},
hidden () {
return this.nsfw && this.hideNsfwLocal && !this.showHidden
},
isEmpty () {
return (this.type === 'html' && !this.attachment.oembed) || this.type === 'unknown'
},
isSmall () {
return this.size === 'small'
},
fullwidth () {
if (this.size === 'hide') return false
return this.type === 'html' || this.type === 'audio' || this.type === 'unknown'
},
useModal () {
const modalTypes = this.size === 'hide' ? ['image', 'video', 'audio']
: this.mergedConfig.playVideosInModal
? ['image', 'video']
: ['image']
return modalTypes.includes(this.type)
},
...mapGetters(['mergedConfig'])
},
methods: {
linkClicked ({ target }) {
if (target.tagName === 'A') {
window.open(target.href, '_blank')
}
},
openModal (event) {
if (this.useModal) {
event.stopPropagation()
event.preventDefault()
this.setMedia()
this.$store.dispatch('setCurrent', this.attachment)
}
},
toggleHidden (event) {
if (
(this.mergedConfig.useOneClickNsfw && !this.showHidden) &&
(this.type !== 'video' || this.mergedConfig.playVideosInModal)
) {
this.openModal(event)
return
}
if (this.img && !this.preloadImage) {
if (this.img.onload) {
this.img.onload()
} else {
this.loading = true
this.img.src = this.attachment.url
this.img.onload = () => {
this.loading = false
this.showHidden = !this.showHidden
}
}
} else {
this.showHidden = !this.showHidden
}
},
onImageLoad (image) {
const width = image.naturalWidth
const height = image.naturalHeight
this.naturalSizeLoad && this.naturalSizeLoad({ width, height })
}
}
}
export default Attachment
diff --git a/src/components/attachment/attachment.vue b/src/components/attachment/attachment.vue
index f1fac2c847..2c1c168210 100644
--- a/src/components/attachment/attachment.vue
+++ b/src/components/attachment/attachment.vue
@@ -1,316 +1,322 @@
<template>
<div
v-if="usePlaceholder"
:class="{ 'fullwidth': fullwidth }"
@click="openModal"
>
<a
v-if="type !== 'html'"
class="placeholder"
target="_blank"
:href="attachment.url"
:alt="attachment.description"
:title="attachment.description"
>
<FAIcon :icon="placeholderIconClass" />
<b>{{ nsfw ? "NSFW / " : "" }}</b>{{ placeholderName }}
</a>
</div>
<div
v-else
v-show="!isEmpty"
class="attachment"
:class="{[type]: true, loading, 'fullwidth': fullwidth, 'nsfw-placeholder': hidden}"
>
<a
v-if="hidden"
class="image-attachment"
:href="attachment.url"
:alt="attachment.description"
:title="attachment.description"
@click.prevent.stop="toggleHidden"
>
<img
:key="nsfwImage"
class="nsfw"
:src="nsfwImage"
:class="{'small': isSmall}"
>
<FAIcon
v-if="type === 'video'"
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)"
class="image-attachment"
:class="{'hidden': hidden && preloadImage }"
:href="attachment.url"
target="_blank"
@click="openModal"
>
<StillImage
class="image"
:referrerpolicy="referrerpolicy"
:mimetype="attachment.mimetype"
:src="attachment.large_thumb_url || attachment.url"
:image-load-handler="onImageLoad"
:alt="attachment.description"
/>
</a>
<a
v-if="type === 'video' && !hidden"
class="video-container"
:class="{'small': isSmall}"
:href="allowPlay ? undefined : attachment.url"
@click="openModal"
>
<VideoAttachment
class="video"
:attachment="attachment"
:controls="allowPlay"
@play="$emit('play')"
@pause="$emit('pause')"
/>
<FAIcon
v-if="!allowPlay"
class="play-icon"
icon="play-circle"
/>
</a>
<audio
v-if="type === 'audio'"
:src="attachment.url"
:alt="attachment.description"
:title="attachment.description"
controls
@play="$emit('play')"
@pause="$emit('pause')"
/>
<div
v-if="type === 'html' && attachment.oembed"
class="oembed"
@click.prevent="linkClicked"
>
<div
v-if="attachment.thumb_url"
class="image"
>
<img :src="attachment.thumb_url">
</div>
<div class="text">
<!-- eslint-disable vue/no-v-html -->
<h1><a :href="attachment.url">{{ attachment.oembed.title }}</a></h1>
<div v-html="attachment.oembed.oembedHTML" />
<!-- eslint-enable vue/no-v-html -->
</div>
</div>
</div>
</template>
<script src="./attachment.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.attachments {
display: flex;
flex-wrap: wrap;
.non-gallery {
max-width: 100%;
}
.placeholder {
display: inline-block;
padding: 0.3em 1em 0.3em 0;
color: $fallback--link;
color: var(--postLink, $fallback--link);
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
max-width: 100%;
svg {
color: inherit;
}
}
.nsfw-placeholder {
cursor: pointer;
&.loading {
cursor: progress;
}
}
.attachment {
position: relative;
margin-top: 0.5em;
align-self: flex-start;
line-height: 0;
border-style: solid;
border-width: 1px;
border-radius: $fallback--attachmentRadius;
border-radius: var(--attachmentRadius, $fallback--attachmentRadius);
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
overflow: hidden;
}
.non-gallery.attachment {
&.video {
flex: 1 0 40%;
}
.nsfw {
height: 260px;
}
.small {
height: 120px;
flex-grow: 0;
}
.video {
height: 260px;
display: flex;
}
video {
max-height: 100%;
object-fit: contain;
}
}
.fullwidth {
flex-basis: 100%;
}
// fixes small gap below video
&.video {
line-height: 0;
}
.video-container {
display: flex;
max-height: 100%;
}
.video {
width: 100%;
height: 100%;
}
.play-icon {
position: absolute;
font-size: 64px;
top: calc(50% - 32px);
left: calc(50% - 32px);
color: rgba(255, 255, 255, 0.75);
text-shadow: 0 0 2px rgba(0, 0, 0, 0.4);
}
.play-icon::before {
margin: 0;
}
&.html {
flex-basis: 90%;
width: 100%;
display: flex;
}
.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 {
z-index: 0;
}
audio {
width: 100%;
}
img.media-upload {
line-height: 0;
max-height: 200px;
max-width: 100%;
}
.oembed {
line-height: 1.2em;
flex: 1 0 100%;
width: 100%;
margin-right: 15px;
display: flex;
img {
width: 100%;
}
.image {
flex: 1;
img {
border: 0px;
border-radius: 5px;
height: 100%;
object-fit: cover;
}
}
.text {
flex: 2;
margin: 8px;
word-break: break-all;
h1 {
font-size: 14px;
margin: 0px;
}
}
}
.image-attachment {
&,
& .image {
width: 100%;
height: 100%;
}
&.hidden {
display: none;
}
.nsfw {
object-fit: cover;
width: 100%;
height: 100%;
}
img {
image-orientation: from-image; // NOTE: only FF supports this
}
}
}
</style>
diff --git a/src/components/block_card/block_card.vue b/src/components/block_card/block_card.vue
index 5b00b738a7..2fe66d4c8e 100644
--- a/src/components/block_card/block_card.vue
+++ b/src/components/block_card/block_card.vue
@@ -1,44 +1,44 @@
<template>
<basic-user-card :user="user">
<div class="block-card-content-container">
<button
v-if="blocked"
- class="btn btn-default"
+ class="btn button-default"
:disabled="progress"
@click="unblockUser"
>
<template v-if="progress">
{{ $t('user_card.unblock_progress') }}
</template>
<template v-else>
{{ $t('user_card.unblock') }}
</template>
</button>
<button
v-else
- class="btn btn-default"
+ class="btn button-default"
:disabled="progress"
@click="blockUser"
>
<template v-if="progress">
{{ $t('user_card.block_progress') }}
</template>
<template v-else>
{{ $t('user_card.block') }}
</template>
</button>
</div>
</basic-user-card>
</template>
<script src="./block_card.js"></script>
<style lang="scss">
.block-card-content-container {
margin-top: 0.5em;
text-align: right;
button {
width: 10em;
}
}
</style>
diff --git a/src/components/chat_list/chat_list.vue b/src/components/chat_list/chat_list.vue
index 17e2f7950e..e23eec135b 100644
--- a/src/components/chat_list/chat_list.vue
+++ b/src/components/chat_list/chat_list.vue
@@ -1,64 +1,67 @@
<template>
<div v-if="isNew">
<ChatNew @cancel="cancelNewChat" />
</div>
<div
v-else
class="chat-list panel panel-default"
>
<div class="panel-heading">
<span class="title">
{{ $t("chats.chats") }}
</span>
- <button @click="newChat">
+ <button
+ class="button-default"
+ @click="newChat"
+ >
{{ $t("chats.new") }}
</button>
</div>
<div class="panel-body">
<div
v-if="sortedChatList.length > 0"
class="timeline"
>
<List :items="sortedChatList">
<template
slot="item"
slot-scope="{item}"
>
<ChatListItem
:key="item.id"
:compact="false"
:chat="item"
/>
</template>
</List>
</div>
<div
v-else
class="emtpy-chat-list-alert"
>
<span>{{ $t('chats.empty_chat_list_placeholder') }}</span>
</div>
</div>
</div>
</template>
<script src="./chat_list.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.chat-list {
min-height: 25em;
margin-bottom: 0;
}
.emtpy-chat-list-alert {
padding: 3em;
font-size: 1.2em;
display: flex;
justify-content: center;
color: $fallback--text;
color: var(--faint, $fallback--text);
}
</style>
diff --git a/src/components/chat_message/chat_message.scss b/src/components/chat_message/chat_message.scss
index 5af744a358..e4351d3b80 100644
--- a/src/components/chat_message/chat_message.scss
+++ b/src/components/chat_message/chat_message.scss
@@ -1,177 +1,174 @@
@import '../../_variables.scss';
.chat-message-wrapper {
&.hovered-message-chain {
.animated.Avatar {
canvas {
display: none;
}
img {
visibility: visible;
}
}
}
.chat-message-menu {
transition: opacity 0.1s;
opacity: 0;
position: absolute;
top: -0.8em;
button {
padding-top: 0.2em;
padding-bottom: 0.2em;
}
}
.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 {
width: 12em;
}
.chat-message {
display: flex;
padding-bottom: 0.5em;
}
.avatar-wrapper {
margin-right: 0.72em;
width: 32px;
}
.link-preview, .attachments {
margin-bottom: 1em;
}
.chat-message-inner {
display: flex;
flex-direction: column;
align-items: flex-start;
max-width: 80%;
min-width: 10em;
width: 100%;
&.with-media {
width: 100%;
.gallery-row {
overflow: hidden;
}
.status {
width: 100%;
}
}
}
.status {
border-radius: $fallback--chatMessageRadius;
border-radius: var(--chatMessageRadius, $fallback--chatMessageRadius);
display: flex;
padding: 0.75em;
}
.created-at {
position: relative;
float: right;
font-size: 0.8em;
margin: -1em 0 -0.5em 0;
font-style: italic;
opacity: 0.8;
}
.without-attachment {
.status-content {
&::after {
margin-right: 5.4em;
content: " ";
display: inline-block;
}
}
}
.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);
}
.status {
color: var(--chatMessageIncomingText, $fallback--text);
background-color: var(--chatMessageIncomingBg, $fallback--bg);
border: 1px solid var(--chatMessageIncomingBorder, --border);
}
.created-at {
a {
color: var(--chatMessageIncomingText, $fallback--text);
}
}
.chat-message-menu {
left: 0.4rem;
}
}
.outgoing {
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-content: end;
justify-content: flex-end;
a {
color: var(--chatMessageOutgoingLink, $fallback--link);
}
.status {
color: var(--chatMessageOutgoingText, $fallback--text);
background-color: var(--chatMessageOutgoingBg, $fallback--lightBg);
border: 1px solid var(--chatMessageOutgoingBorder, --lightBg);
}
.chat-message-inner {
align-items: flex-end;
}
.chat-message-menu {
right: 0.4rem;
}
}
.visible {
opacity: 1;
}
}
.chat-message-date-separator {
text-align: center;
margin: 1.4em 0;
font-size: 0.9em;
user-select: none;
color: $fallback--text;
color: var(--faintedText, $fallback--text);
}
diff --git a/src/components/chat_message/chat_message.vue b/src/components/chat_message/chat_message.vue
index 3849ab6e7a..0777f8809f 100644
--- a/src/components/chat_message/chat_message.vue
+++ b/src/components/chat_message/chat_message.vue
@@ -1,100 +1,100 @@
<template>
<div
v-if="isMessage"
class="chat-message-wrapper"
:class="{ 'hovered-message-chain': hoveredMessageChain }"
@mouseover="onHover(true)"
@mouseleave="onHover(false)"
>
<div
class="chat-message"
:class="[{ 'outgoing': isCurrentUser, 'incoming': !isCurrentUser }]"
>
<div
v-if="!isCurrentUser"
class="avatar-wrapper"
>
<router-link
v-if="chatViewItem.isHead"
:to="userProfileLink"
>
<UserAvatar
:compact="true"
:better-shadow="betterShadow"
:user="author"
/>
</router-link>
</div>
<div class="chat-message-inner">
<div
class="status-body"
:style="{ 'min-width': message.attachment ? '80%' : '' }"
>
<div
class="media status"
:class="{ 'without-attachment': !hasAttachment, 'pending': chatViewItem.data.pending, 'error': chatViewItem.data.error }"
style="position: relative"
@mouseenter="hovered = true"
@mouseleave="hovered = false"
>
<div
class="chat-message-menu"
:class="{ 'visible': hovered || menuOpened }"
>
<Popover
trigger="click"
placement="top"
:bound-to-selector="isCurrentUser ? '' : '.scrollable-message-list'"
:bound-to="{ x: 'container' }"
:margin="popoverMarginStyle"
@show="menuOpened = true"
@close="menuOpened = false"
>
<div slot="content">
<div class="dropdown-menu">
<button
- class="dropdown-item dropdown-item-icon"
+ class="button-default dropdown-item dropdown-item-icon"
@click="deleteMessage"
>
<FAIcon icon="times" /> {{ $t("chats.delete") }}
</button>
</div>
</div>
<button
slot="trigger"
- class="menu-icon"
+ class="button-default menu-icon"
:title="$t('chats.more')"
>
<FAIcon icon="ellipsis-h" />
</button>
</Popover>
</div>
<StatusContent
:status="messageForStatusContent"
:full-content="true"
>
<span
slot="footer"
class="created-at"
>
{{ createdAt }}
</span>
</StatusContent>
</div>
</div>
</div>
</div>
</div>
<div
v-else
class="chat-message-date-separator"
>
<ChatMessageDate :date="chatViewItem.date" />
</div>
</template>
<script src="./chat_message.js" ></script>
<style lang="scss">
@import './chat_message.scss';
</style>
diff --git a/src/components/conversation/conversation.vue b/src/components/conversation/conversation.vue
index e0b9fcc5d1..353859b8e2 100644
--- a/src/components/conversation/conversation.vue
+++ b/src/components/conversation/conversation.vue
@@ -1,74 +1,68 @@
<template>
<div
v-if="!hideStatus"
:style="hiddenStyle"
class="Conversation"
:class="{ '-expanded' : isExpanded, 'panel' : isExpanded }"
>
<div
v-if="isExpanded"
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"
:key="status.id"
ref="statusComponent"
:inline-expanded="collapsable && isExpanded"
:statusoid="status"
:expandable="!isExpanded"
:show-pinned="pinnedStatusIdsObject && pinnedStatusIdsObject[status.id]"
:focused="focused(status.id)"
:in-conversation="isExpanded"
:highlight="getHighlight()"
:replies="getReplies(status.id)"
:in-profile="inProfile"
:profile-user-id="profileUserId"
class="conversation-status status-fadein panel-body"
@goto="setHighlight"
@toggleExpanded="toggleExpanded"
/>
</div>
<div
v-else
:style="hiddenStyle"
/>
</template>
<script src="./conversation.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.Conversation {
.conversation-status {
border-left: none;
border-bottom-width: 1px;
border-bottom-style: solid;
border-bottom-color: var(--border, $fallback--border);
border-radius: 0;
}
&.-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;
border-radius: 0 0 var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius);
}
}
}
</style>
diff --git a/src/components/desktop_nav/desktop_nav.scss b/src/components/desktop_nav/desktop_nav.scss
index 028692a937..8fd8e6202e 100644
--- a/src/components/desktop_nav/desktop_nav.scss
+++ b/src/components/desktop_nav/desktop_nav.scss
@@ -1,112 +1,113 @@
@import '../../_variables.scss';
.DesktopNav {
height: 50px;
width: 100%;
position: fixed;
.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 {
+ .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;
- }
- a, a svg {
- color: $fallback--link;
- color: var(--topBarLink, $fallback--link);
+ .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
index 3a6e403332..762aa610a9 100644
--- a/src/components/desktop_nav/desktop_nav.vue
+++ b/src/components/desktop_nav/desktop_nav.vue
@@ -1,79 +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
/>
- <a
- href="#"
- class="nav-icon"
+ <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')"
/>
- </a>
+ </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>
- <a
+ >
+ <FAIcon
+ fixed-width
+ class="fa-scale-110 fa-old-padding"
+ icon="tachometer-alt"
+ :title="$t('nav.administration')"
+ />
+ </a>
+ <button
v-if="currentUser"
- href="#"
- class="nav-icon"
+ 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')"
- /></a>
+ >
+ <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 97aee2431a..3b5aec141b 100644
--- a/src/components/domain_mute_card/domain_mute_card.vue
+++ b/src/components/domain_mute_card/domain_mute_card.vue
@@ -1,53 +1,53 @@
<template>
<div class="domain-mute-card">
<div class="domain-mute-card-domain">
{{ domain }}
</div>
<ProgressButton
v-if="muted"
:click="unmuteDomain"
- class="btn btn-default"
+ class="btn button-default"
>
{{ $t('domain_mute_card.unmute') }}
<template slot="progress">
{{ $t('domain_mute_card.unmute_progress') }}
</template>
</ProgressButton>
<ProgressButton
v-else
:click="muteDomain"
- class="btn btn-default"
+ class="btn button-default"
>
{{ $t('domain_mute_card.mute') }}
<template slot="progress">
{{ $t('domain_mute_card.mute_progress') }}
</template>
</ProgressButton>
</div>
</template>
<script src="./domain_mute_card.js"></script>
<style lang="scss">
.domain-mute-card {
flex: 1 0;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.6em 1em 0.6em 0;
&-domain {
margin-right: 1em;
overflow: hidden;
text-overflow: ellipsis;
}
button {
width: 10em;
}
.autosuggest-results & {
padding-left: 1em;
}
}
</style>
diff --git a/src/components/emoji_input/emoji_input.js b/src/components/emoji_input/emoji_input.js
index 87303d0874..2068a598c7 100644
--- a/src/components/emoji_input/emoji_input.js
+++ b/src/components/emoji_input/emoji_input.js
@@ -1,495 +1,498 @@
import Completion from '../../services/completion/completion.js'
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
*
* Intended usage is:
* <EmojiInput v-model="something">
* <input v-model="something"/>
* </EmojiInput>
*
* Works only with <input> and <textarea>. Intended to use with only one nested
* input. It will find first input or textarea and work with that, multiple
* nested children not tested. You HAVE TO duplicate v-model for both
* <emoji-input> and <input>/<textarea> otherwise it will not work.
*
* Be prepared for CSS troubles though because it still wraps component in a div
* while TRYING to make it look like nothing happened, but it could break stuff.
*/
const EmojiInput = {
props: {
suggest: {
/**
* suggest: function (input: String) => Suggestion[]
*
* Function that takes input string which takes string (textAtCaret)
* and returns an array of Suggestions
*
* Suggestion is an object containing following properties:
* displayText: string. Main display text, what actual suggestion
* represents (user's screen name/emoji shortcode)
* replacement: string. Text that should replace the textAtCaret
* detailText: string, optional. Subtitle text, providing additional info
* if present (user's nickname)
* imageUrl: string, optional. Image to display alongside with suggestion,
* currently if no image is provided, replacement will be used (for
* unicode emojis)
*
* TODO: make it asynchronous when adding proper server-provided user
* suggestions
*
* For commonly used suggestors (emoji, users, both) use suggestor.js
*/
required: true,
type: Function
},
value: {
/**
* Used for v-model
*/
required: true,
type: String
},
enableEmojiPicker: {
/**
* Enables emoji picker support, this implies that custom emoji are supported
*/
required: false,
type: Boolean,
default: false
},
hideEmojiButton: {
/**
* intended to use with external picker trigger, i.e. you have a button outside
* input that will open up the picker, see triggerShowPicker()
*/
required: false,
type: Boolean,
default: false
},
enableStickerPicker: {
/**
* Enables sticker picker support, only makes sense when enableEmojiPicker=true
*/
required: false,
type: Boolean,
default: false
},
placement: {
/**
* Forces the panel to take a specific position relative to the input element.
* The 'auto' placement chooses either bottom or top depending on which has the available space (when both have available space, bottom is preferred).
*/
required: false,
type: String, // 'auto', 'top', 'bottom'
default: 'auto'
},
newlineOnCtrlEnter: {
required: false,
type: Boolean,
default: false
}
},
data () {
return {
input: undefined,
highlighted: 0,
caret: 0,
focused: false,
blurTimeout: null,
showPicker: false,
temporarilyHideSuggestions: false,
keepOpen: false,
- disableClickOutside: false
+ disableClickOutside: false,
+ suggestions: []
}
},
components: {
EmojiPicker
},
computed: {
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 &&
this.suggestions.length > 0 &&
!this.showPicker &&
!this.temporarilyHideSuggestions
},
textAtCaret () {
return (this.wordAtCaret || {}).word || ''
},
wordAtCaret () {
if (this.value && this.caret) {
const word = Completion.wordAtPosition(this.value, this.caret - 1) || {}
return word
}
}
},
mounted () {
const slots = this.$slots.default
if (!slots || slots.length === 0) return
const input = slots.find(slot => ['input', 'textarea'].includes(slot.tag))
if (!input) return
this.input = input
this.resize()
input.elm.addEventListener('blur', this.onBlur)
input.elm.addEventListener('focus', this.onFocus)
input.elm.addEventListener('paste', this.onPaste)
input.elm.addEventListener('keyup', this.onKeyUp)
input.elm.addEventListener('keydown', this.onKeyDown)
input.elm.addEventListener('click', this.onClickInput)
input.elm.addEventListener('transitionend', this.onTransition)
input.elm.addEventListener('input', this.onInput)
},
unmounted () {
const { input } = this
if (input) {
input.elm.removeEventListener('blur', this.onBlur)
input.elm.removeEventListener('focus', this.onFocus)
input.elm.removeEventListener('paste', this.onPaste)
input.elm.removeEventListener('keyup', this.onKeyUp)
input.elm.removeEventListener('keydown', this.onKeyDown)
input.elm.removeEventListener('click', this.onClickInput)
input.elm.removeEventListener('transitionend', this.onTransition)
input.elm.removeEventListener('input', this.onInput)
}
},
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: {
triggerShowPicker () {
this.showPicker = true
this.$refs.picker.startEmojiLoad()
this.$nextTick(() => {
this.scrollIntoView()
})
// This temporarily disables "click outside" handler
// since external trigger also means click originates
// from outside, thus preventing picker from opening
this.disableClickOutside = true
setTimeout(() => {
this.disableClickOutside = false
}, 0)
},
togglePicker () {
this.input.elm.focus()
this.showPicker = !this.showPicker
if (this.showPicker) {
this.scrollIntoView()
this.$refs.picker.startEmojiLoad()
}
},
replace (replacement) {
const newValue = Completion.replaceWord(this.value, this.wordAtCaret, replacement)
this.$emit('input', newValue)
this.caret = 0
},
insert ({ insertion, keepOpen, surroundingSpace = true }) {
const before = this.value.substring(0, this.caret) || ''
const after = this.value.substring(this.caret) || ''
/* Using a bit more smart approach to padding emojis with spaces:
* - put a space before cursor if there isn't one already, unless we
* are at the beginning of post or in spam mode
* - put a space after emoji if there isn't one already unless we are
* in spam mode
*
* The idea is that when you put a cursor somewhere in between sentence
* inserting just ' :emoji: ' will add more spaces to post which might
* break the flow/spacing, as well as the case where user ends sentence
* with a space before adding emoji.
*
* Spam mode is intended for creating multi-part emojis and overall spamming
* them, masto seem to be rendering :emoji::emoji: correctly now so why not
*/
const isSpaceRegex = /\s/
const spaceBefore = (surroundingSpace && !isSpaceRegex.exec(before.slice(-1)) && before.length && this.padEmoji > 0) ? ' ' : ''
const spaceAfter = (surroundingSpace && !isSpaceRegex.exec(after[0]) && this.padEmoji) ? ' ' : ''
const newValue = [
before,
spaceBefore,
insertion,
spaceAfter,
after
].join('')
this.keepOpen = keepOpen
this.$emit('input', newValue)
const position = this.caret + (insertion + spaceAfter + spaceBefore).length
if (!keepOpen) {
this.input.elm.focus()
}
this.$nextTick(function () {
// Re-focus inputbox after clicking suggestion
// Set selection right after the replacement instead of the very end
this.input.elm.setSelectionRange(position, position)
this.caret = position
})
},
replaceText (e, suggestion) {
const len = this.suggestions.length || 0
if (this.textAtCaret.length === 1) { return }
if (len > 0 || suggestion) {
const chosenSuggestion = suggestion || this.suggestions[this.highlighted]
const replacement = chosenSuggestion.replacement
const newValue = Completion.replaceWord(this.value, this.wordAtCaret, replacement)
this.$emit('input', newValue)
this.highlighted = 0
const position = this.wordAtCaret.start + replacement.length
this.$nextTick(function () {
// Re-focus inputbox after clicking suggestion
this.input.elm.focus()
// Set selection right after the replacement instead of the very end
this.input.elm.setSelectionRange(position, position)
this.caret = position
})
e.preventDefault()
}
},
cycleBackward (e) {
const len = this.suggestions.length || 0
if (len > 1) {
this.highlighted -= 1
if (this.highlighted < 0) {
this.highlighted = this.suggestions.length - 1
}
e.preventDefault()
} else {
this.highlighted = 0
}
},
cycleForward (e) {
const len = this.suggestions.length || 0
if (len > 1) {
this.highlighted += 1
if (this.highlighted >= len) {
this.highlighted = 0
}
e.preventDefault()
} else {
this.highlighted = 0
}
},
scrollIntoView () {
const rootRef = this.$refs['picker'].$el
/* Scroller is either `window` (replies in TL), sidebar (main post form,
* replies in notifs) or mobile post form. Note that getting and setting
* scroll is different for `Window` and `Element`s
*/
const scrollerRef = this.$el.closest('.sidebar-scroller') ||
this.$el.closest('.post-form-modal-view') ||
window
const currentScroll = scrollerRef === window
? scrollerRef.scrollY
: scrollerRef.scrollTop
const scrollerHeight = scrollerRef === window
? scrollerRef.innerHeight
: scrollerRef.offsetHeight
const scrollerBottomBorder = currentScroll + scrollerHeight
// We check where the bottom border of root element is, this uses findOffset
// to find offset relative to scrollable container (scroller)
const rootBottomBorder = rootRef.offsetHeight + findOffset(rootRef, scrollerRef).top
const bottomDelta = Math.max(0, rootBottomBorder - scrollerBottomBorder)
// could also check top delta but there's no case for it
const targetScroll = currentScroll + bottomDelta
if (scrollerRef === window) {
scrollerRef.scroll(0, targetScroll)
} else {
scrollerRef.scrollTop = targetScroll
}
this.$nextTick(() => {
const { offsetHeight } = this.input.elm
const { picker } = this.$refs
const pickerBottom = picker.$el.getBoundingClientRect().bottom
if (pickerBottom > window.innerHeight) {
picker.$el.style.top = 'auto'
picker.$el.style.bottom = offsetHeight + 'px'
}
})
},
onTransition (e) {
this.resize()
},
onBlur (e) {
// Clicking on any suggestion removes focus from autocomplete,
// preventing click handler ever executing.
this.blurTimeout = setTimeout(() => {
this.focused = false
this.setCaret(e)
this.resize()
}, 200)
},
onClick (e, suggestion) {
this.replaceText(e, suggestion)
},
onFocus (e) {
if (this.blurTimeout) {
clearTimeout(this.blurTimeout)
this.blurTimeout = null
}
if (!this.keepOpen) {
this.showPicker = false
}
this.focused = true
this.setCaret(e)
this.resize()
this.temporarilyHideSuggestions = false
},
onKeyUp (e) {
const { key } = e
this.setCaret(e)
this.resize()
// Setting hider in keyUp to prevent suggestions from blinking
// when moving away from suggested spot
if (key === 'Escape') {
this.temporarilyHideSuggestions = true
} else {
this.temporarilyHideSuggestions = false
}
},
onPaste (e) {
this.setCaret(e)
this.resize()
},
onKeyDown (e) {
const { ctrlKey, shiftKey, key } = e
if (this.newlineOnCtrlEnter && ctrlKey && key === 'Enter') {
this.insert({ insertion: '\n', surroundingSpace: false })
// Ensure only one new line is added on macos
e.stopPropagation()
e.preventDefault()
// Scroll the input element to the position of the cursor
this.$nextTick(() => {
this.input.elm.blur()
this.input.elm.focus()
})
}
// Disable suggestions hotkeys if suggestions are hidden
if (!this.temporarilyHideSuggestions) {
if (key === 'Tab') {
if (shiftKey) {
this.cycleBackward(e)
} else {
this.cycleForward(e)
}
}
if (key === 'ArrowUp') {
this.cycleBackward(e)
} else if (key === 'ArrowDown') {
this.cycleForward(e)
}
if (key === 'Enter') {
if (!ctrlKey) {
this.replaceText(e)
}
}
}
// Probably add optional keyboard controls for emoji picker?
// Escape hides suggestions, if suggestions are hidden it
// de-focuses the element (i.e. default browser behavior)
if (key === 'Escape') {
if (!this.temporarilyHideSuggestions) {
this.input.elm.focus()
}
}
this.showPicker = false
this.resize()
},
onInput (e) {
this.showPicker = false
this.setCaret(e)
this.resize()
this.$emit('input', e.target.value)
},
onClickInput (e) {
this.showPicker = false
},
onClickOutside (e) {
if (this.disableClickOutside) return
this.showPicker = false
},
onStickerUploaded (e) {
this.showPicker = false
this.$emit('sticker-uploaded', e)
},
onStickerUploadFailed (e) {
this.showPicker = false
this.$emit('sticker-upload-Failed', e)
},
setCaret ({ target: { selectionStart } }) {
this.caret = selectionStart
},
resize () {
const panel = this.$refs.panel
if (!panel) return
const picker = this.$refs.picker.$el
const panelBody = this.$refs['panel-body']
const { offsetHeight, offsetTop } = this.input.elm
const offsetBottom = offsetTop + offsetHeight
this.setPlacement(panelBody, panel, offsetBottom)
this.setPlacement(picker, picker, offsetBottom)
},
setPlacement (container, target, offsetBottom) {
if (!container || !target) return
target.style.top = offsetBottom + 'px'
target.style.bottom = 'auto'
if (this.placement === 'top' || (this.placement === 'auto' && this.overflowsBottom(container))) {
target.style.top = 'auto'
target.style.bottom = this.input.elm.offsetHeight + 'px'
}
},
overflowsBottom (el) {
return el.getBoundingClientRect().bottom > window.innerHeight
}
}
}
export default EmojiInput
diff --git a/src/components/emoji_input/emoji_input.vue b/src/components/emoji_input/emoji_input.vue
index 224e72cf68..4becdc4199 100644
--- a/src/components/emoji_input/emoji_input.vue
+++ b/src/components/emoji_input/emoji_input.vue
@@ -1,183 +1,183 @@
<template>
<div
v-click-outside="onClickOutside"
class="emoji-input"
:class="{ 'with-picker': !hideEmojiButton }"
>
<slot />
<template v-if="enableEmojiPicker">
- <div
+ <button
v-if="!hideEmojiButton"
- class="emoji-picker-icon"
+ class="button-unstyled emoji-picker-icon"
@click.prevent="togglePicker"
>
<FAIcon :icon="['far', 'smile-beam']" />
- </div>
+ </button>
<EmojiPicker
v-if="enableEmojiPicker"
ref="picker"
:class="{ hide: !showPicker }"
:enable-sticker-picker="enableStickerPicker"
class="emoji-picker-panel"
@emoji="insert"
@sticker-uploaded="onStickerUploaded"
@sticker-upload-failed="onStickerUploadFailed"
/>
</template>
<div
ref="panel"
class="autocomplete-panel"
:class="{ hide: !showSuggestions }"
>
<div
ref="panel-body"
class="autocomplete-panel-body"
>
<div
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">
<img
v-if="suggestion.img"
:src="suggestion.img"
>
<span v-else>{{ suggestion.replacement }}</span>
</span>
<div class="label">
<span class="displayText">{{ suggestion.displayText }}</span>
<span class="detailText">{{ suggestion.detailText }}</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script src="./emoji_input.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.emoji-input {
display: flex;
flex-direction: column;
position: relative;
&.with-picker input {
padding-right: 30px;
}
.emoji-picker-icon {
position: absolute;
top: 0;
right: 0;
margin: .2em .25em;
font-size: 16px;
cursor: pointer;
line-height: 24px;
&:hover i {
color: $fallback--text;
color: var(--text, $fallback--text);
}
}
.emoji-picker-panel {
position: absolute;
z-index: 20;
margin-top: 2px;
&.hide {
display: none
}
}
.autocomplete {
&-panel {
position: absolute;
z-index: 20;
margin-top: 2px;
&.hide {
display: none
}
&-body {
margin: 0 0.5em 0 0.5em;
border-radius: $fallback--tooltipRadius;
border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.5);
box-shadow: var(--popupShadow);
min-width: 75%;
background-color: $fallback--bg;
background-color: var(--popover, $fallback--bg);
color: $fallback--link;
color: var(--popoverText, $fallback--link);
--faint: var(--popoverFaintText, $fallback--faint);
--faintLink: var(--popoverFaintLink, $fallback--faint);
--lightText: var(--popoverLightText, $fallback--lightText);
--postLink: var(--popoverPostLink, $fallback--link);
--postFaintLink: var(--popoverPostFaintLink, $fallback--link);
--icon: var(--popoverIcon, $fallback--icon);
}
}
&-item {
display: flex;
cursor: pointer;
padding: 0.2em 0.4em;
border-bottom: 1px solid rgba(0, 0, 0, 0.4);
height: 32px;
.image {
width: 32px;
height: 32px;
line-height: 32px;
text-align: center;
font-size: 32px;
margin-right: 4px;
img {
width: 32px;
height: 32px;
object-fit: contain;
}
}
.label {
display: flex;
flex-direction: column;
justify-content: center;
margin: 0 0.1em 0 0.2em;
.displayText {
line-height: 1.5;
}
.detailText {
font-size: 9px;
line-height: 9px;
}
}
&.highlighted {
background-color: $fallback--fg;
background-color: var(--selectedMenuPopover, $fallback--fg);
color: var(--selectedMenuPopoverText, $fallback--text);
--faint: var(--selectedMenuPopoverFaintText, $fallback--faint);
--faintLink: var(--selectedMenuPopoverFaintLink, $fallback--faint);
--lightText: var(--selectedMenuPopoverLightText, $fallback--lightText);
--icon: var(--selectedMenuPopoverIcon, $fallback--icon);
}
}
}
input, textarea {
flex: 1 0 auto;
}
}
</style>
diff --git a/src/components/emoji_input/suggestor.js b/src/components/emoji_input/suggestor.js
index 8330345bb0..14a2b41edf 100644
--- a/src/components/emoji_input/suggestor.js
+++ b/src/components/emoji_input/suggestor.js
@@ -1,106 +1,130 @@
-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:
* data.emoji - optional, an array of all emoji available i.e.
* (state.instance.emoji + state.instance.customEmoji)
* data.users - optional, an array of all known users
* updateUsersList - optional, a function to search and append to users
*
* Depending on data present one or both (or none) can be present, so if field
* 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 => {
const noPrefix = input.toLowerCase().substr(1)
return emojis
.filter(({ displayText }) => displayText.toLowerCase().match(noPrefix))
.sort((a, b) => {
let aScore = 0
let bScore = 0
// An exact match always wins
aScore += a.displayText.toLowerCase() === noPrefix ? 200 : 0
bScore += b.displayText.toLowerCase() === noPrefix ? 200 : 0
// Prioritize custom emoji a lot
aScore += a.imageUrl ? 100 : 0
bScore += b.imageUrl ? 100 : 0
// Prioritize prefix matches somewhat
aScore += a.displayText.toLowerCase().startsWith(noPrefix) ? 10 : 0
bScore += b.displayText.toLowerCase().startsWith(noPrefix) ? 10 : 0
// Sort by length
aScore -= a.displayText.length
bScore -= b.displayText.length
// Break ties alphabetically
const alphabetically = a.displayText > b.displayText ? 0.5 : -0.5
return bScore - aScore + alphabetically
})
}
-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_reactions/emoji_reactions.vue b/src/components/emoji_reactions/emoji_reactions.vue
index 2f14b5b2e2..51d5035989 100644
--- a/src/components/emoji_reactions/emoji_reactions.vue
+++ b/src/components/emoji_reactions/emoji_reactions.vue
@@ -1,82 +1,82 @@
<template>
<div class="emoji-reactions">
<UserListPopover
v-for="(reaction) in emojiReactions"
:key="reaction.name"
: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()"
>
<span class="reaction-emoji">{{ reaction.name }}</span>
<span>{{ reaction.count }}</span>
</button>
</UserListPopover>
<a
v-if="tooManyReactions"
class="emoji-reaction-expand faint"
href="javascript:void(0)"
@click="toggleShowAll"
>
{{ showAll ? $t('general.show_less') : showMoreString }}
</a>
</div>
</template>
<script src="./emoji_reactions.js" ></script>
<style lang="scss">
@import '../../_variables.scss';
.emoji-reactions {
display: flex;
margin-top: 0.25em;
flex-wrap: wrap;
}
.emoji-reaction {
padding: 0 0.5em;
margin-right: 0.5em;
margin-top: 0.5em;
display: flex;
align-items: center;
justify-content: center;
box-sizing: border-box;
.reaction-emoji {
width: 1.25em;
margin-right: 0.25em;
}
&:focus {
outline: none;
}
&.not-clickable {
cursor: default;
&:hover {
box-shadow: $fallback--buttonShadow;
box-shadow: var(--buttonShadow);
}
}
}
.emoji-reaction-expand {
padding: 0 0.5em;
margin-right: 0.5em;
margin-top: 0.5em;
display: flex;
align-items: center;
justify-content: center;
&:hover {
text-decoration: underline;
}
}
.picked-reaction {
border: 1px solid var(--accent, $fallback--link);
margin-left: -1px; // offset the border, can't use inset shadows either
margin-right: calc(0.5em - 1px);
}
</style>
diff --git a/src/components/export_import/export_import.vue b/src/components/export_import/export_import.vue
index ae00487f28..8ffe34f8fb 100644
--- a/src/components/export_import/export_import.vue
+++ b/src/components/export_import/export_import.vue
@@ -1,102 +1,102 @@
<template>
<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 }}
</button>
<slot name="afterButtons" />
<p
v-if="importFailed"
class="alert error"
>
{{ importFailedText }}
</p>
<slot name="afterError" />
</div>
</template>
<script>
export default {
props: [
'exportObject',
'importLabel',
'exportLabel',
'importFailedText',
'validator',
'onImport',
'onImportFailure'
],
data () {
return {
importFailed: false
}
},
methods: {
exportData () {
const stringified = JSON.stringify(this.exportObject, null, 2) // Pretty-print and indent with 2 spaces
// Create an invisible link with a data url and simulate a click
const e = document.createElement('a')
e.setAttribute('download', 'pleroma_theme.json')
e.setAttribute('href', 'data:application/json;base64,' + window.btoa(stringified))
e.style.display = 'none'
document.body.appendChild(e)
e.click()
document.body.removeChild(e)
},
importData () {
this.importFailed = false
const filePicker = document.createElement('input')
filePicker.setAttribute('type', 'file')
filePicker.setAttribute('accept', '.json')
filePicker.addEventListener('change', event => {
if (event.target.files[0]) {
// eslint-disable-next-line no-undef
const reader = new FileReader()
reader.onload = ({ target }) => {
try {
const parsed = JSON.parse(target.result)
const valid = this.validator(parsed)
if (valid) {
this.onImport(parsed)
} else {
this.importFailed = true
// this.onImportFailure(valid)
}
} catch (e) {
// This will happen both if there is a JSON syntax error or the theme is missing components
this.importFailed = true
// this.onImportFailure(e)
}
}
reader.readAsText(event.target.files[0])
}
})
document.body.appendChild(filePicker)
filePicker.click()
document.body.removeChild(filePicker)
}
}
}
</script>
<style lang="scss">
.import-export-container {
display: flex;
flex-wrap: wrap;
align-items: baseline;
justify-content: center;
}
</style>
diff --git a/src/components/exporter/exporter.vue b/src/components/exporter/exporter.vue
index ecd71bf1f6..d6a030880e 100644
--- a/src/components/exporter/exporter.vue
+++ b/src/components/exporter/exporter.vue
@@ -1,30 +1,30 @@
<template>
<div class="exporter">
<div v-if="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 }}
</button>
</div>
</template>
<script src="./exporter.js"></script>
<style lang="scss">
.exporter {
&-processing {
margin: 0.25em;
}
}
</style>
diff --git a/src/components/extra_buttons/extra_buttons.vue b/src/components/extra_buttons/extra_buttons.vue
index a33f6e87ab..e687d48735 100644
--- a/src/components/extra_buttons/extra_buttons.vue
+++ b/src/components/extra_buttons/extra_buttons.vue
@@ -1,124 +1,128 @@
<template>
<Popover
trigger="click"
placement="top"
- class="extra-button-popover"
+ :offset="{ y: 5 }"
:bound-to="{ x: 'container' }"
+ remove-padding
>
<div
slot="content"
slot-scope="{close}"
>
<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"
>
<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"
>
<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"
>
<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"
>
<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"
>
<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"
>
<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"
>
<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"
>
<FAIcon
fixed-width
icon="share-alt"
/><span>{{ $t("status.copy_link") }}</span>
</button>
</div>
</div>
- <span slot="trigger">
+ <span
+ slot="trigger"
+ class="ExtraButtons"
+ >
<FAIcon
- class="ExtraButtons fa-scale-110 fa-old-padding"
+ class="fa-scale-110 fa-old-padding"
icon="ellipsis-h"
/>
</span>
</Popover>
</template>
<script src="./extra_buttons.js" ></script>
<style lang="scss">
@import '../../_variables.scss';
.ExtraButtons {
- cursor: pointer;
position: static;
+ padding: 10px;
+ margin: -10px;
- &:hover,
- .extra-button-popover.open & {
+ &: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 2a2ee84ab8..5cd05f73eb 100644
--- a/src/components/favorite_button/favorite_button.js
+++ b/src/components/favorite_button/favorite_button.js
@@ -1,43 +1,38 @@
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'],
data () {
return {
animated: false
}
},
methods: {
favorite () {
if (!this.status.favorited) {
this.$store.dispatch('favorite', { id: this.status.id })
} else {
this.$store.dispatch('unfavorite', { id: this.status.id })
}
this.animated = true
setTimeout(() => {
this.animated = false
}, 500)
}
},
computed: {
- classes () {
- return {
- '-favorited': this.status.favorited
- }
- },
...mapGetters(['mergedConfig'])
}
}
export default FavoriteButton
diff --git a/src/components/favorite_button/favorite_button.vue b/src/components/favorite_button/favorite_button.vue
index dfe12f8673..dce25e2484 100644
--- a/src/components/favorite_button/favorite_button.vue
+++ b/src/components/favorite_button/favorite_button.vue
@@ -1,45 +1,62 @@
<template>
- <div v-if="loggedIn">
- <FAIcon
- :class="classes"
- class="FavoriteButton fa-scale-110 fa-old-padding -interactive"
+ <div class="FavoriteButton">
+ <button
+ v-if="loggedIn"
+ class="button-unstyled interactive"
+ :class="status.favorited && '-favorited'"
:title="$t('tool_tip.favorite')"
- :icon="[status.favorited ? 'fas' : 'far', 'star']"
- :spin="animated"
@click.prevent="favorite()"
- />
- <span v-if="!mergedConfig.hidePostStats && status.fave_num > 0">{{ status.fave_num }}</span>
- </div>
- <div v-else>
- <FAIcon
- :class="classes"
- class="FavoriteButton fa-scale-110 fa-old-padding"
- :title="$t('tool_tip.favorite')"
- :icon="['far', 'star']"
- />
- <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>
<script src="./favorite_button.js" ></script>
<style lang="scss">
@import '../../_variables.scss';
.FavoriteButton {
- &.-interactive {
- cursor: pointer;
- animation-duration: 0.6s;
+ 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 {
+ &:hover .svg-inline--fa,
+ &.-favorited .svg-inline--fa {
color: $fallback--cOrange;
color: var(--cOrange, $fallback--cOrange);
}
}
-
- &.-favorited {
- color: $fallback--cOrange;
- color: var(--cOrange, $fallback--cOrange);
- }
}
</style>
diff --git a/src/components/follow_button/follow_button.vue b/src/components/follow_button/follow_button.vue
index bfdc137b74..7f85f1d76f 100644
--- a/src/components/follow_button/follow_button.vue
+++ b/src/components/follow_button/follow_button.vue
@@ -1,13 +1,13 @@
<template>
<button
- class="btn btn-default follow-button"
+ class="btn button-default follow-button"
:class="{ toggled: isPressed }"
:disabled="inProgress"
:title="title"
@click="onClick"
>
{{ label }}
</button>
</template>
<script src="./follow_button.js"></script>
diff --git a/src/components/follow_request_card/follow_request_card.vue b/src/components/follow_request_card/follow_request_card.vue
index b217b8ed83..1b12ba4b23 100644
--- a/src/components/follow_request_card/follow_request_card.vue
+++ b/src/components/follow_request_card/follow_request_card.vue
@@ -1,39 +1,39 @@
<template>
<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') }}
</button>
</div>
</basic-user-card>
</template>
<script src="./follow_request_card.js"></script>
<style lang="scss">
.follow-request-card-content-container {
display: flex;
flex-direction: row;
flex-wrap: wrap;
button {
margin-top: 0.5em;
margin-right: 0.5em;
flex: 1 1;
max-width: 12em;
min-width: 8em;
&:last-child {
margin-right: 0;
}
}
}
</style>
diff --git a/src/components/image_cropper/image_cropper.vue b/src/components/image_cropper/image_cropper.vue
index 75def6125e..448461b4d4 100644
--- a/src/components/image_cropper/image_cropper.vue
+++ b/src/components/image_cropper/image_cropper.vue
@@ -1,86 +1,86 @@
<template>
<div class="image-cropper">
<div v-if="dataUrl">
<div class="image-cropper-image-container">
<img
ref="img"
:src="dataUrl"
alt=""
@load.stop="createCropper"
>
</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"
/>
<FAIcon
v-if="submitting"
spin
icon="circle-notch"
/>
</div>
<div
v-if="submitError"
class="alert error"
>
{{ submitErrorMsg }}
<FAIcon
class="fa-scale-110 fa-old-padding"
icon="times"
@click="clearError"
/>
</div>
</div>
<input
ref="input"
type="file"
class="image-cropper-img-input"
:accept="mimes"
>
</div>
</template>
<script src="./image_cropper.js"></script>
<style lang="scss">
.image-cropper {
&-img-input {
display: none;
}
&-image-container {
position: relative;
img {
display: block;
max-width: 100%;
}
}
&-buttons-wrapper {
margin-top: 10px;
button {
margin-top: 5px;
}
}
}
</style>
diff --git a/src/components/importer/importer.vue b/src/components/importer/importer.vue
index c4fe5b002d..210823f513 100644
--- a/src/components/importer/importer.vue
+++ b/src/components/importer/importer.vue
@@ -1,49 +1,49 @@
<template>
<div class="importer">
<form>
<input
ref="input"
type="file"
@change="change"
>
</form>
<FAIcon
v-if="submitting"
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">
<FAIcon
icon="times"
@click="dismiss"
/>
<p>{{ successMessage }}</p>
</div>
<div v-else-if="error">
<FAIcon
icon="times"
@click="dismiss"
/>
<p>{{ errorMessage }}</p>
</div>
</div>
</template>
<script src="./importer.js"></script>
<style lang="scss">
.importer {
&-uploading {
font-size: 1.5em;
margin: 0.25em;
}
}
</style>
diff --git a/src/components/link-preview/link-preview.js b/src/components/link-preview/link-preview.js
index 444aafbe87..add7c56313 100644
--- a/src/components/link-preview/link-preview.js
+++ b/src/components/link-preview/link-preview.js
@@ -1,35 +1,46 @@
+import { mapGetters } from 'vuex'
+
const LinkPreview = {
name: 'LinkPreview',
props: [
'card',
'size',
'nsfw'
],
data () {
return {
imageLoaded: false
}
},
computed: {
useImage () {
// 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) {
const newImg = new Image()
newImg.onload = () => {
this.imageLoaded = true
}
newImg.src = this.card.image
}
}
}
export default LinkPreview
diff --git a/src/components/link-preview/link-preview.vue b/src/components/link-preview/link-preview.vue
index 6917197754..d3ca39b85b 100644
--- a/src/components/link-preview/link-preview.vue
+++ b/src/components/link-preview/link-preview.vue
@@ -1,88 +1,93 @@
<template>
<div>
<a
class="link-preview-card"
:href="card.url"
target="_blank"
rel="noopener"
>
<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"
class="card-description"
>{{ card.description }}</p>
</div>
</a>
</div>
</template>
<script src="./link-preview.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.link-preview-card {
display: flex;
flex-direction: row;
cursor: pointer;
overflow: hidden;
margin-top: 0.5em;
.card-image {
flex-shrink: 0;
width: 120px;
max-width: 25%;
img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: $fallback--attachmentRadius;
border-radius: var(--attachmentRadius, $fallback--attachmentRadius);
}
}
- .small-image {
- width: 80px;
- }
-
.card-content {
max-height: 100%;
margin: 0.5em;
display: flex;
flex-direction: column;
}
.card-host {
font-size: 12px;
}
.card-description {
margin: 0.5em 0 0 0;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-word;
line-height: 1.2em;
// cap description at 3 lines, the 1px is to clean up some stray pixels
// TODO: fancier fade-out at the bottom to show off that it's too long?
max-height: calc(1.2em * 3 - 1px);
}
+ .nsfw-alert {
+ margin: 2em 0;
+ }
+
color: $fallback--text;
color: var(--text, $fallback--text);
border-style: solid;
border-width: 1px;
border-radius: $fallback--attachmentRadius;
border-radius: var(--attachmentRadius, $fallback--attachmentRadius);
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
}
</style>
diff --git a/src/components/login_form/login_form.vue b/src/components/login_form/login_form.vue
index a1f77210d6..bfabb9460b 100644
--- a/src/components/login_form/login_form.vue
+++ b/src/components/login_form/login_form.vue
@@ -1,147 +1,147 @@
<template>
<div class="login panel panel-default">
<!-- Default panel contents -->
<div class="panel-heading">
{{ $t('login.login') }}
</div>
<div class="panel-body">
<form
class="login-form"
@submit.prevent="submit"
>
<template v-if="isPasswordAuth">
<div class="form-group">
<label for="username">{{ $t('login.username') }}</label>
<input
id="username"
v-model="user.username"
:disabled="loggingIn"
class="form-control"
:placeholder="$t('login.placeholder')"
>
</div>
<div class="form-group">
<label for="password">{{ $t('login.password') }}</label>
<input
id="password"
ref="passwordInput"
v-model="user.password"
:disabled="loggingIn"
class="form-control"
type="password"
>
</div>
<div class="form-group">
<router-link :to="{name: 'password-reset'}">
{{ $t('password_reset.forgot_password') }}
</router-link>
</div>
</template>
<div
v-if="isTokenAuth"
class="form-group"
>
<p>{{ $t('login.description') }}</p>
</div>
<div class="form-group">
<div class="login-bottom">
<div>
<router-link
v-if="registrationOpen"
:to="{name: 'registration'}"
class="register"
>
{{ $t('login.register') }}
</router-link>
</div>
<button
:disabled="loggingIn"
type="submit"
- class="btn btn-default"
+ class="btn button-default"
>
{{ $t('login.login') }}
</button>
</div>
</div>
</form>
</div>
<div
v-if="error"
class="form-group"
>
<div class="alert error">
{{ error }}
<FAIcon
class="fa-scale-110 fa-old-padding"
icon="times"
@click="clearError"
/>
</div>
</div>
</div>
</template>
<script src="./login_form.js" ></script>
<style lang="scss">
@import '../../_variables.scss';
.login-form {
display: flex;
flex-direction: column;
padding: 0.6em;
.btn {
min-height: 28px;
width: 10em;
}
.register {
flex: 1 1;
}
.login-bottom {
margin-top: 1.0em;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
}
.form-group {
display: flex;
flex-direction: column;
padding: 0.3em 0.5em 0.6em;
line-height:24px;
}
.form-bottom {
display: flex;
padding: 0.5em;
height: 32px;
button {
width: 10em;
}
p {
margin: 0.35em;
padding: 0.35em;
display: flex;
}
}
.error {
text-align: center;
animation-name: shakeError;
animation-duration: 0.4s;
animation-timing-function: ease-in-out;
}
}
</style>
diff --git a/src/components/media_upload/media_upload.vue b/src/components/media_upload/media_upload.vue
index 88251a265a..e955aa7246 100644
--- a/src/components/media_upload/media_upload.vue
+++ b/src/components/media_upload/media_upload.vue
@@ -1,47 +1,37 @@
<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"
>
- <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"
- >
- </label>
- </div>
+ </label>
</template>
<script src="./media_upload.js" ></script>
<style lang="scss">
@import '../../_variables.scss';
.media-upload {
- .label {
- display: inline-block;
- }
-
- .new-icon {
- cursor: pointer;
- }
+ cursor: pointer;
}
</style>
diff --git a/src/components/mfa_form/recovery_form.vue b/src/components/mfa_form/recovery_form.vue
index 789536494b..0bf68e27cb 100644
--- a/src/components/mfa_form/recovery_form.vue
+++ b/src/components/mfa_form/recovery_form.vue
@@ -1,66 +1,66 @@
<template>
<div class="login panel panel-default">
<!-- Default panel contents -->
<div class="panel-heading">
{{ $t('login.heading.recovery') }}
</div>
<div class="panel-body">
<form
class="login-form"
@submit.prevent="submit"
>
<div class="form-group">
<label for="code">{{ $t('login.recovery_code') }}</label>
<input
id="code"
v-model="code"
class="form-control"
>
</div>
<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>
</div>
</div>
</form>
</div>
<div
v-if="error"
class="form-group"
>
<div class="alert error">
{{ error }}
<FAIcon
class="fa-scale-110 fa-old-padding"
icon="times"
@click="clearError"
/>
</div>
</div>
</div>
</template>
<script src="./recovery_form.js" ></script>
diff --git a/src/components/mfa_form/totp_form.vue b/src/components/mfa_form/totp_form.vue
index 9401cad554..79230148ee 100644
--- a/src/components/mfa_form/totp_form.vue
+++ b/src/components/mfa_form/totp_form.vue
@@ -1,69 +1,69 @@
<template>
<div class="login panel panel-default">
<!-- Default panel contents -->
<div class="panel-heading">
{{ $t('login.heading.totp') }}
</div>
<div class="panel-body">
<form
class="login-form"
@submit.prevent="submit"
>
<div class="form-group">
<label for="code">
{{ $t('login.authentication_code') }}
</label>
<input
id="code"
v-model="code"
class="form-control"
>
</div>
<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>
</div>
</div>
</form>
</div>
<div
v-if="error"
class="form-group"
>
<div class="alert error">
{{ error }}
<FAIcon
size="lg"
class="fa-scale-110 fa-old-padding"
icon="times"
@click="clearError"
/>
</div>
</div>
</div>
</template>
<script src="./totp_form.js"></script>
diff --git a/src/components/mobile_nav/mobile_nav.vue b/src/components/mobile_nav/mobile_nav.vue
index 5304a5006f..0f0ea45745 100644
--- a/src/components/mobile_nav/mobile_nav.vue
+++ b/src/components/mobile_nav/mobile_nav.vue
@@ -1,216 +1,214 @@
<template>
<div
class="MobileNav"
>
<nav
id="nav"
class="mobile-nav"
:class="{ 'mobile-hidden': isChat }"
@click="scrollToTop()"
>
<div class="item">
- <a
- href="#"
- class="mobile-nav-button"
+ <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"
/>
- </a>
+ </button>
<router-link
v-if="!hideSitename"
class="site-name"
:to="{ name: 'root' }"
active-class="home"
>
{{ sitename }}
</router-link>
</div>
<div class="item right">
- <a
+ <button
v-if="currentUser"
- class="mobile-nav-button"
- href="#"
+ 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"
/>
- </a>
+ </button>
</div>
</nav>
<div
v-if="currentUser"
class="mobile-notifications-drawer"
:class="{ 'closed': !notificationsOpen }"
@touchstart.stop="notificationsTouchStart"
@touchmove.stop="notificationsTouchMove"
>
<div class="mobile-notifications-header">
<span class="title">{{ $t('notifications.notifications') }}</span>
<a
class="mobile-nav-button"
@click.stop.prevent="closeMobileNotifications()"
>
<FAIcon
class="fa-scale-110 fa-old-padding"
icon="times"
/>
</a>
</div>
<div
class="mobile-notifications"
@scroll="onScroll"
>
<Notifications
ref="notifications"
:no-heading="true"
/>
</div>
</div>
<SideDrawer
ref="sideDrawer"
:logout="logout"
/>
</div>
</template>
<script src="./mobile_nav.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.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-inner-nav {
width: 100%;
display: flex;
align-items: center;
}
.mobile-nav-button {
display: inline-block;
text-align: center;
padding: 0 1em;
position: relative;
cursor: pointer;
}
.site-name {
padding: 0 .3em;
display: inline-block;
}
.item {
/* moslty just to get rid of extra whitespaces */
display: flex;
}
.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%);
}
}
.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;
}
}
.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;
}
}
}
}
</style>
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 50529878d1..767f82446b 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,55 +1,55 @@
<template>
<div v-if="isLoggedIn">
<button
- class="new-status-button"
+ class="button-default new-status-button"
:class="{ 'hidden': isHidden }"
@click="openPostForm"
>
<FAIcon icon="pen" />
</button>
</div>
</template>
<script src="./mobile_post_status_button.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.new-status-button {
width: 5em;
height: 5em;
border-radius: 100%;
position: fixed;
bottom: 1.5em;
right: 1.5em;
// TODO: this needs its own color, it has to stand out enough and link color
// is not very optimal for this particular use.
background-color: $fallback--fg;
background-color: var(--btn, $fallback--fg);
display: flex;
justify-content: center;
align-items: center;
box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3), 0px 4px 6px rgba(0, 0, 0, 0.3);
z-index: 10;
transition: 0.35s transform;
transition-timing-function: cubic-bezier(0, 1, 0.5, 1);
&.hidden {
transform: translateY(150%);
}
svg {
font-size: 1.5em;
color: $fallback--text;
color: var(--text, $fallback--text);
}
}
@media all and (min-width: 801px) {
.new-status-button {
display: none;
}
}
</style>
diff --git a/src/components/moderation_tools/moderation_tools.vue b/src/components/moderation_tools/moderation_tools.vue
index 60fa6cebcb..5c7b82ecfa 100644
--- a/src/components/moderation_tools/moderation_tools.vue
+++ b/src/components/moderation_tools/moderation_tools.vue
@@ -1,192 +1,192 @@
<template>
<div>
<Popover
trigger="click"
class="moderation-tools-popover"
placement="bottom"
:offset="{ y: 5 }"
@show="setToggled(true)"
@close="setToggled(false)"
>
<div slot="content">
<div class="dropdown-menu">
<span v-if="user.is_local">
<button
- class="dropdown-item"
+ class="button-default dropdown-item"
@click="toggleRight(&quot;admin&quot;)"
>
{{ $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(&quot;moderator&quot;)"
>
{{ $t(!!user.rights.moderator ? 'user_card.admin_menu.revoke_moderator' : 'user_card.admin_menu.grant_moderator') }}
</button>
<div
role="separator"
class="dropdown-divider"
/>
</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') }}
</button>
<div
v-if="hasTagPolicy"
role="separator"
class="dropdown-divider"
/>
<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') }}
<span
class="menu-checkbox"
:class="{ 'menu-checkbox-checked': hasTag(tags.FORCE_NSFW) }"
/>
</button>
<button
- class="dropdown-item"
+ class="button-default dropdown-item"
@click="toggleTag(tags.STRIP_MEDIA)"
>
{{ $t('user_card.admin_menu.strip_media') }}
<span
class="menu-checkbox"
:class="{ 'menu-checkbox-checked': hasTag(tags.STRIP_MEDIA) }"
/>
</button>
<button
- class="dropdown-item"
+ class="button-default dropdown-item"
@click="toggleTag(tags.FORCE_UNLISTED)"
>
{{ $t('user_card.admin_menu.force_unlisted') }}
<span
class="menu-checkbox"
:class="{ 'menu-checkbox-checked': hasTag(tags.FORCE_UNLISTED) }"
/>
</button>
<button
- class="dropdown-item"
+ class="button-default dropdown-item"
@click="toggleTag(tags.SANDBOX)"
>
{{ $t('user_card.admin_menu.sandbox') }}
<span
class="menu-checkbox"
:class="{ 'menu-checkbox-checked': hasTag(tags.SANDBOX) }"
/>
</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') }}
<span
class="menu-checkbox"
:class="{ 'menu-checkbox-checked': hasTag(tags.DISABLE_REMOTE_SUBSCRIPTION) }"
/>
</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') }}
<span
class="menu-checkbox"
:class="{ 'menu-checkbox-checked': hasTag(tags.DISABLE_ANY_SUBSCRIPTION) }"
/>
</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') }}
<span
class="menu-checkbox"
:class="{ 'menu-checkbox-checked': hasTag(tags.QUARANTINE) }"
/>
</button>
</span>
</div>
</div>
<button
slot="trigger"
- class="btn btn-default btn-block"
+ class="btn button-default btn-block"
:class="{ toggled }"
>
{{ $t('user_card.admin_menu.moderation') }}
</button>
</Popover>
<portal to="modal">
<DialogModal
v-if="showDeleteUserDialog"
:on-cancel="deleteUserDialog.bind(this, false)"
>
<template slot="header">
{{ $t('user_card.admin_menu.delete_user') }}
</template>
<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') }}
</button>
</template>
</DialogModal>
</portal>
</div>
</template>
<script src="./moderation_tools.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.menu-checkbox {
float: right;
min-width: 22px;
max-width: 22px;
min-height: 22px;
max-height: 22px;
line-height: 22px;
text-align: center;
border-radius: 0px;
background-color: $fallback--fg;
background-color: var(--input, $fallback--fg);
box-shadow: 0px 0px 2px black inset;
box-shadow: var(--inputShadow);
&.menu-checkbox-checked::after {
content: '✓';
}
}
.moderation-tools-popover {
height: 100%;
.trigger {
display: flex !important;
height: 100%;
}
}
</style>
diff --git a/src/components/mute_card/mute_card.vue b/src/components/mute_card/mute_card.vue
index 9611fb8290..ca33c6c53b 100644
--- a/src/components/mute_card/mute_card.vue
+++ b/src/components/mute_card/mute_card.vue
@@ -1,44 +1,44 @@
<template>
<basic-user-card :user="user">
<div class="mute-card-content-container">
<button
v-if="muted"
- class="btn btn-default"
+ class="btn button-default"
:disabled="progress"
@click="unmuteUser"
>
<template v-if="progress">
{{ $t('user_card.unmute_progress') }}
</template>
<template v-else>
{{ $t('user_card.unmute') }}
</template>
</button>
<button
v-else
- class="btn btn-default"
+ class="btn button-default"
:disabled="progress"
@click="muteUser"
>
<template v-if="progress">
{{ $t('user_card.mute_progress') }}
</template>
<template v-else>
{{ $t('user_card.mute') }}
</template>
</button>
</div>
</basic-user-card>
</template>
<script src="./mute_card.js"></script>
<style lang="scss">
.mute-card-content-container {
margin-top: 0.5em;
text-align: right;
button {
width: 10em;
}
}
</style>
diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue
index 2bbde10898..f56aa977da 100644
--- a/src/components/notification/notification.vue
+++ b/src/components/notification/notification.vue
@@ -1,192 +1,195 @@
<template>
<Status
v-if="notification.type === 'mention'"
:compact="true"
:statusoid="notification.status"
/>
<div v-else>
<div
v-if="needMute && !unmuted"
class="Notification container -muted"
>
<small>
<router-link :to="userProfileLink">
{{ notification.from_profile.screen_name }}
</router-link>
</small>
- <a
- href="#"
- class="unmute"
+ <button
+ class="button-unstyled unmute"
@click.prevent="toggleMute"
- ><FAIcon
- class="fa-scale-110 fa-old-padding"
- icon="eye-slash"
- /></a>
+ >
+ <FAIcon
+ class="fa-scale-110 fa-old-padding"
+ icon="eye-slash"
+ />
+ </button>
</div>
<div
v-else
class="Notification non-mention"
:class="[userClass, { highlighted: userStyle }, '-type--' + notification.type]"
:style="[ userStyle ]"
>
<a
class="avatar-container"
:href="notification.from_profile.statusnet_profile_url"
@click.stop.prevent.capture="toggleUserExpanded"
>
<UserAvatar
:compact="true"
:better-shadow="betterShadow"
:user="notification.from_profile"
/>
</a>
<div class="notification-right">
<UserCard
v-if="userExpanded"
:user-id="getUser(notification).id"
:rounded="true"
:bordered="true"
/>
<span class="notification-details">
<div class="name-and-action">
<!-- eslint-disable vue/no-v-html -->
<bdi
v-if="!!notification.from_profile.name_html"
class="username"
:title="'@'+notification.from_profile.screen_name"
v-html="notification.from_profile.name_html"
/>
<!-- eslint-enable vue/no-v-html -->
<span
v-else
class="username"
:title="'@'+notification.from_profile.screen_name"
>{{ notification.from_profile.name }}</span>
<span v-if="notification.type === 'like'">
<FAIcon
class="type-icon"
icon="star"
/>
<small>{{ $t('notifications.favorited_you') }}</small>
</span>
<span v-if="notification.type === 'repeat'">
<FAIcon
class="type-icon"
icon="retweet"
:title="$t('tool_tip.repeat')"
/>
<small>{{ $t('notifications.repeated_you') }}</small>
</span>
<span v-if="notification.type === 'follow'">
<FAIcon
class="type-icon"
icon="user-plus"
/>
<small>{{ $t('notifications.followed_you') }}</small>
</span>
<span v-if="notification.type === 'follow_request'">
<FAIcon
class="type-icon"
icon="user"
/>
<small>{{ $t('notifications.follow_request') }}</small>
</span>
<span v-if="notification.type === 'move'">
<FAIcon
class="type-icon"
icon="suitcase-rolling"
/>
<small>{{ $t('notifications.migrated_to') }}</small>
</span>
<span v-if="notification.type === 'pleroma:emoji_reaction'">
<small>
<i18n path="notifications.reacted_with">
<span class="emoji-reaction-emoji">{{ notification.emoji }}</span>
</i18n>
</small>
</span>
</div>
<div
v-if="isStatusNotification"
class="timeago"
>
<router-link
v-if="notification.status"
:to="{ name: 'conversation', params: { id: notification.status.id } }"
class="faint-link"
>
<Timeago
:time="notification.created_at"
:auto-update="240"
/>
</router-link>
</div>
<div
v-else
class="timeago"
>
<span class="faint">
<Timeago
:time="notification.created_at"
:auto-update="240"
/>
</span>
</div>
- <a
+ <button
v-if="needMute"
- href="#"
+ class="button-unstyled"
@click.prevent="toggleMute"
- ><FAIcon
- class="fa-scale-110 fa-old-padding"
- icon="eye-slash"
- /></a>
+ >
+ <FAIcon
+ class="fa-scale-110 fa-old-padding"
+ icon="eye-slash"
+ />
+ </button>
</span>
<div
v-if="notification.type === 'follow' || notification.type === 'follow_request'"
class="follow-text"
>
<router-link
:to="userProfileLink"
class="follow-name"
>
@{{ notification.from_profile.screen_name }}
</router-link>
<div
v-if="notification.type === 'follow_request'"
style="white-space: nowrap;"
>
<FAIcon
icon="check"
class="fa-scale-110 fa-old-padding follow-request-accept"
:title="$t('tool_tip.accept_follow_request')"
@click="approveUser()"
/>
<FAIcon
icon="times"
class="fa-scale-110 fa-old-padding follow-request-reject"
:title="$t('tool_tip.reject_follow_request')"
@click="denyUser()"
/>
</div>
</div>
<div
v-else-if="notification.type === 'move'"
class="move-text"
>
<router-link :to="targetUserProfileLink">
@{{ notification.target.screen_name }}
</router-link>
</div>
<template v-else>
<status-content
class="faint"
:status="notification.action"
/>
</template>
</div>
</div>
</div>
</template>
<script src="./notification.js"></script>
<style src="./notification.scss" lang="scss"></style>
diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js
index 4b479e1354..492585631d 100644
--- a/src/components/notifications/notifications.js
+++ b/src/components/notifications/notifications.js
@@ -1,120 +1,123 @@
import { mapGetters } from 'vuex'
import Notification from '../notification/notification.vue'
import notificationsFetcher from '../../services/notifications_fetcher/notifications_fetcher.service.js'
import {
notificationsFromStore,
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
const Notifications = {
props: {
// Disables display of panel header
noHeading: Boolean,
// Disables panel styles, unread mark, potentially other notification-related actions
// meant for "Interactions" timeline
minimalMode: Boolean,
// Custom filter mode, an array of strings, possible values 'mention', 'repeat', 'like', 'follow', used to override global filter for use in "Interactions" timeline
filterMode: Array
},
data () {
return {
bottomedOut: false,
// How many seen notifications to display in the list. The more there are,
// the heavier the page becomes. This count is increased when loading
// older notifications, and cut back to default whenever hitting "Read!".
seenToDisplayCount: DEFAULT_SEEN_TO_DISPLAY_COUNT
}
},
created () {
const store = this.$store
const credentials = store.state.users.currentUser.credentials
notificationsFetcher.fetchAndUpdate({ store, credentials })
},
computed: {
mainClass () {
return this.minimalMode ? '' : 'panel panel-default'
},
notifications () {
return notificationsFromStore(this.$store)
},
error () {
return this.$store.state.statuses.notifications.error
},
unseenNotifications () {
return unseenNotificationsFromStore(this.$store)
},
filteredNotifications () {
return filteredNotificationsFromStore(this.$store, this.filterMode)
},
unseenCount () {
return this.unseenNotifications.length
},
unseenCountTitle () {
return this.unseenCount + (this.unreadChatCount)
},
loading () {
return this.$store.state.statuses.notifications.loading
},
notificationsToDisplay () {
return this.filteredNotifications.slice(0, this.unseenCount + this.seenToDisplayCount)
},
...mapGetters(['unreadChatCount'])
},
components: {
Notification
},
watch: {
unseenCountTitle (count) {
if (count > 0) {
+ FaviconService.drawFaviconBadge()
this.$store.dispatch('setPageTitle', `(${count})`)
} else {
+ FaviconService.clearFaviconBadge()
this.$store.dispatch('setPageTitle', '')
}
}
},
methods: {
markAsSeen () {
this.$store.dispatch('markNotificationsAsSeen')
this.seenToDisplayCount = DEFAULT_SEEN_TO_DISPLAY_COUNT
},
fetchOlderNotifications () {
if (this.loading) {
return
}
const seenCount = this.filteredNotifications.length - this.unseenCount
if (this.seenToDisplayCount < seenCount) {
this.seenToDisplayCount = Math.min(this.seenToDisplayCount + 20, seenCount)
return
} else if (this.seenToDisplayCount > seenCount) {
this.seenToDisplayCount = seenCount
}
const store = this.$store
const credentials = store.state.users.currentUser.credentials
store.commit('setNotificationsLoading', { value: true })
notificationsFetcher.fetchAndUpdate({
store,
credentials,
older: true
}).then(notifs => {
store.commit('setNotificationsLoading', { value: false })
if (notifs.length === 0) {
this.bottomedOut = true
}
this.seenToDisplayCount += notifs.length
})
}
}
}
export default Notifications
diff --git a/src/components/notifications/notifications.vue b/src/components/notifications/notifications.vue
index bd875cca6e..725d1ad4ed 100644
--- a/src/components/notifications/notifications.vue
+++ b/src/components/notifications/notifications.vue
@@ -1,76 +1,69 @@
<template>
<div
:class="{ minimal: minimalMode }"
class="notifications"
>
<div :class="mainClass">
<div
v-if="!noHeading"
class="panel-heading"
>
<div class="title">
{{ $t('notifications.notifications') }}
<span
v-if="unseenCount"
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') }}
</button>
</div>
<div class="panel-body">
<div
v-for="notification in notificationsToDisplay"
:key="notification.id"
class="notification"
:class="{&quot;unseen&quot;: !minimalMode && !notification.seen}"
>
<div class="notification-overlay" />
<notification :notification="notification" />
</div>
</div>
<div class="panel-footer">
<div
v-if="bottomedOut"
class="new-status-notification text-center panel-footer faint"
>
{{ $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"
>
<FAIcon
icon="circle-notch"
spin
size="lg"
/>
</div>
</div>
</div>
</div>
</template>
<script src="./notifications.js"></script>
<style lang="scss" src="./notifications.scss"></style>
diff --git a/src/components/password_reset/password_reset.vue b/src/components/password_reset/password_reset.vue
index 0deb9ccf4c..a931cb5aed 100644
--- a/src/components/password_reset/password_reset.vue
+++ b/src/components/password_reset/password_reset.vue
@@ -1,130 +1,130 @@
<template>
<div class="settings panel panel-default">
<div class="panel-heading">
{{ $t('password_reset.password_reset') }}
</div>
<div class="panel-body">
<form
class="password-reset-form"
@submit.prevent="submit"
>
<div class="container">
<div v-if="!mailerEnabled">
<p v-if="passwordResetRequested">
{{ $t('password_reset.password_reset_required_but_mailer_is_disabled') }}
</p>
<p v-else>
{{ $t('password_reset.password_reset_disabled') }}
</p>
</div>
<div v-else-if="success || throttled">
<p v-if="success">
{{ $t('password_reset.check_email') }}
</p>
<div class="form-group text-center">
<router-link :to="{name: 'root'}">
{{ $t('password_reset.return_home') }}
</router-link>
</div>
</div>
<div v-else>
<p
v-if="passwordResetRequested"
class="password-reset-required error"
>
{{ $t('password_reset.password_reset_required') }}
</p>
<p>
{{ $t('password_reset.instruction') }}
</p>
<div class="form-group">
<input
ref="email"
v-model="user.email"
:disabled="isPending"
:placeholder="$t('password_reset.placeholder')"
class="form-control"
type="input"
>
</div>
<div class="form-group">
<button
:disabled="isPending"
type="submit"
- class="btn btn-default btn-block"
+ class="btn button-default btn-block"
>
{{ $t('general.submit') }}
</button>
</div>
</div>
<p
v-if="error"
class="alert error notice-dismissible"
>
<span>{{ error }}</span>
<a
class="fa-scale-110 fa-old-padding dismiss"
@click.prevent="dismissError()"
>
<FAIcon icon="times" />
</a>
</p>
</div>
</form>
</div>
</div>
</template>
<script src="./password_reset.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.password-reset-form {
display: flex;
flex-direction: column;
align-items: center;
margin: 0.6em;
.container {
display: flex;
flex: 1 0;
flex-direction: column;
margin-top: 0.6em;
max-width: 18rem;
}
.form-group {
display: flex;
flex-direction: column;
margin-bottom: 1em;
padding: 0.3em 0.0em 0.3em;
line-height: 24px;
}
.error {
text-align: center;
animation-name: shakeError;
animation-duration: 0.4s;
animation-timing-function: ease-in-out;
}
.alert {
padding: 0.5em;
margin: 0.3em 0.0em 1em;
}
.password-reset-required {
background-color: var(--alertError, $fallback--alertError);
padding: 10px 0;
}
.notice-dismissible {
padding-right: 2rem;
}
.dismiss {
cursor: pointer;
}
}
</style>
diff --git a/src/components/poll/poll.vue b/src/components/poll/poll.vue
index 5f54b41616..264a5f03ea 100644
--- a/src/components/poll/poll.vue
+++ b/src/components/poll/poll.vue
@@ -1,138 +1,138 @@
<template>
<div
class="poll"
:class="containerClass"
>
<div
v-for="(option, index) in options"
:key="index"
class="poll-option"
>
<div
v-if="showResults"
:title="resultTitle(option)"
class="option-result"
>
<div class="option-result-label">
<span class="result-percentage">
{{ percentageForOption(option.votes_count) }}%
</span>
<!-- eslint-disable-next-line vue/no-v-html -->
<span v-html="option.title_html" />
</div>
<div
class="result-fill"
:style="{ 'width': `${percentageForOption(option.votes_count)}%` }"
/>
</div>
<div
v-else
@click="activateOption(index)"
>
<input
v-if="poll.multiple"
type="checkbox"
:disabled="loading"
:value="index"
>
<input
v-else
type="radio"
:disabled="loading"
:value="index"
>
<label class="option-vote">
<div>{{ option.title }}</div>
</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"
>
{{ $t('polls.vote') }}
</button>
<div class="total">
{{ totalVotesCount }} {{ $t("polls.votes") }}&nbsp;¡&nbsp;
</div>
<i18n :path="expired ? 'polls.expired' : 'polls.expires_in'">
<Timeago
:time="expiresAt"
:auto-update="60"
:now-threshold="0"
/>
</i18n>
</div>
</div>
</template>
<script src="./poll.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.poll {
.votes {
display: flex;
flex-direction: column;
margin: 0 0 0.5em;
}
.poll-option {
margin: 0.75em 0.5em;
}
.option-result {
height: 100%;
display: flex;
flex-direction: row;
position: relative;
color: $fallback--lightText;
color: var(--lightText, $fallback--lightText);
}
.option-result-label {
display: flex;
align-items: center;
padding: 0.1em 0.25em;
z-index: 1;
word-break: break-word;
}
.result-percentage {
width: 3.5em;
flex-shrink: 0;
}
.result-fill {
height: 100%;
position: absolute;
color: $fallback--text;
color: var(--pollText, $fallback--text);
background-color: $fallback--lightBg;
background-color: var(--poll, $fallback--lightBg);
border-radius: $fallback--panelRadius;
border-radius: var(--panelRadius, $fallback--panelRadius);
top: 0;
left: 0;
transition: width 0.5s;
}
.option-vote {
display: flex;
align-items: center;
}
input {
width: 3.5em;
}
.footer {
display: flex;
align-items: center;
}
&.loading * {
cursor: progress;
}
.poll-vote-button {
padding: 0 0.5em;
margin-right: 0.5em;
}
}
</style>
diff --git a/src/components/popover/popover.js b/src/components/popover/popover.js
index 695f73b9c3..5e417fa0ed 100644
--- a/src/components/popover/popover.js
+++ b/src/components/popover/popover.js
@@ -1,165 +1,174 @@
const Popover = {
name: 'Popover',
props: {
// Action to trigger popover: either 'hover' or 'click'
trigger: String,
// Either 'top' or 'bottom'
placement: String,
// Takes object with properties 'x' and 'y', values of these can be
// 'container' for using offsetParent as boundaries for either axis
// or 'viewport'
boundTo: Object,
// Takes a selector to use as a replacement for the parent container
// for getting boundaries for x an y axis
boundToSelector: String,
// Takes a top/bottom/left/right object, how much space to leave
// between boundary and popover element
margin: Object,
// Takes a x/y object and tells how many pixels to offset from
// anchor point on either axis
offset: Object,
// 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 {
hidden: true,
styles: { opacity: 0 },
oldSize: { width: 0, height: 0 }
}
},
methods: {
containerBoundingClientRect () {
const container = this.boundToSelector ? this.$el.closest(this.boundToSelector) : this.$el.offsetParent
return container.getBoundingClientRect()
},
updateStyles () {
if (this.hidden) {
this.styles = {
opacity: 0
}
return
}
// Popover will be anchored around this element, trigger ref is the container, so
// its children are what are inside the slot. Expect only one slot="trigger".
const anchorEl = (this.$refs.trigger && this.$refs.trigger.children[0]) || this.$el
const screenBox = anchorEl.getBoundingClientRect()
// Screen position of the origin point for popover
const origin = { x: screenBox.left + screenBox.width * 0.5, y: screenBox.top }
const content = this.$refs.content
// Minor optimization, don't call a slow reflow call if we don't have to
const parentBounds = this.boundTo &&
(this.boundTo.x === 'container' || this.boundTo.y === 'container') &&
this.containerBoundingClientRect()
const margin = this.margin || {}
// What are the screen bounds for the popover? Viewport vs container
// when using viewport, using default margin values to dodge the navbar
const xBounds = this.boundTo && this.boundTo.x === 'container' ? {
min: parentBounds.left + (margin.left || 0),
max: parentBounds.right - (margin.right || 0)
} : {
min: 0 + (margin.left || 10),
max: window.innerWidth - (margin.right || 10)
}
const yBounds = this.boundTo && this.boundTo.y === 'container' ? {
min: parentBounds.top + (margin.top || 0),
max: parentBounds.bottom - (margin.bottom || 0)
} : {
min: 0 + (margin.top || 50),
max: window.innerHeight - (margin.bottom || 5)
}
let horizOffset = 0
// If overflowing from left, move it so that it doesn't
if ((origin.x - content.offsetWidth * 0.5) < xBounds.min) {
horizOffset += -(origin.x - content.offsetWidth * 0.5) + xBounds.min
}
// If overflowing from right, move it so that it doesn't
if ((origin.x + horizOffset + content.offsetWidth * 0.5) > xBounds.max) {
horizOffset -= (origin.x + horizOffset + content.offsetWidth * 0.5) - xBounds.max
}
// Default to whatever user wished with placement prop
let usingTop = this.placement !== 'bottom'
// Handle special cases, first force to displaying on top if there's not space on bottom,
// regardless of what placement value was. Then check if there's not space on top, and
// force to bottom, again regardless of what placement value was.
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
const translateX = (anchorEl.offsetWidth * 0.5) - content.offsetWidth * 0.5 + horizOffset + xOffset
// Note, separate translateX and translateY avoids blurry text on chromium,
// single translate or translate3d resulted in blurry text.
this.styles = {
opacity: 1,
transform: `translateX(${Math.round(translateX)}px) translateY(${Math.round(translateY)}px)`
}
},
showPopover () {
if (this.hidden) this.$emit('show')
this.hidden = false
this.$nextTick(this.updateStyles)
},
hidePopover () {
if (!this.hidden) this.$emit('close')
this.hidden = true
this.styles = { opacity: 0 }
},
onMouseenter (e) {
if (this.trigger === 'hover') this.showPopover()
},
onMouseleave (e) {
if (this.trigger === 'hover') this.hidePopover()
},
onClick (e) {
if (this.trigger === 'click') {
if (this.hidden) {
this.showPopover()
} else {
this.hidePopover()
}
}
},
onClickOutside (e) {
if (this.hidden) return
if (this.$el.contains(e.target)) return
this.hidePopover()
}
},
updated () {
// Monitor changes to content size, update styles only when content sizes have changed,
// that should be the only time we need to move the popover box if we don't care about scroll
// or resize
const content = this.$refs.content
if (!content) return
if (this.oldSize.width !== content.offsetWidth || this.oldSize.height !== content.offsetHeight) {
this.updateStyles()
this.oldSize = { width: content.offsetWidth, height: content.offsetHeight }
}
},
created () {
document.addEventListener('click', this.onClickOutside)
},
destroyed () {
document.removeEventListener('click', this.onClickOutside)
this.hidePopover()
}
}
export default Popover
diff --git a/src/components/popover/popover.vue b/src/components/popover/popover.vue
index 9b8680e577..020eab0557 100644
--- a/src/components/popover/popover.vue
+++ b/src/components/popover/popover.vue
@@ -1,121 +1,126 @@
<template>
<div
@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"
:style="styles"
class="popover"
:class="popoverClass || 'popover-default'"
>
<slot
name="content"
class="popover-inner"
:close="hidePopover"
/>
</div>
</div>
</template>
<script src="./popover.js" />
<style lang="scss">
@import '../../_variables.scss';
+.popover-trigger-button {
+ display: block;
+}
+
.popover {
z-index: 8;
position: absolute;
min-width: 0;
}
.popover-default {
transition: opacity 0.3s;
box-shadow: 1px 1px 4px rgba(0,0,0,.6);
box-shadow: var(--panelShadow);
border-radius: $fallback--btnRadius;
border-radius: var(--btnRadius, $fallback--btnRadius);
background-color: $fallback--bg;
background-color: var(--popover, $fallback--bg);
color: $fallback--text;
color: var(--popoverText, $fallback--text);
--faint: var(--popoverFaintText, $fallback--faint);
--faintLink: var(--popoverFaintLink, $fallback--faint);
--lightText: var(--popoverLightText, $fallback--lightText);
--postLink: var(--popoverPostLink, $fallback--link);
--postFaintLink: var(--popoverPostFaintLink, $fallback--link);
--icon: var(--popoverIcon, $fallback--icon);
}
.dropdown-menu {
display: block;
padding: .5rem 0;
font-size: 1rem;
text-align: left;
list-style: none;
max-width: 100vw;
z-index: 10;
white-space: nowrap;
.dropdown-divider {
height: 0;
margin: .5rem 0;
overflow: hidden;
border-top: 1px solid $fallback--border;
border-top: 1px solid var(--border, $fallback--border);
}
.dropdown-item {
line-height: 21px;
margin-right: 5px;
overflow: auto;
display: block;
padding: .25rem 1.0rem .25rem 1.5rem;
clear: both;
font-weight: 400;
text-align: inherit;
white-space: nowrap;
border: none;
border-radius: 0px;
background-color: transparent;
box-shadow: none;
width: 100%;
height: 100%;
--btnText: var(--popoverText, $fallback--text);
&-icon {
padding-left: 0.5rem;
svg {
margin-right: 0.25rem;
color: var(--menuPopoverIcon, $fallback--icon)
}
}
&:active, &:hover {
background-color: $fallback--lightBg;
background-color: var(--selectedMenuPopover, $fallback--lightBg);
color: $fallback--link;
color: var(--selectedMenuPopoverText, $fallback--link);
--faint: var(--selectedMenuPopoverFaintText, $fallback--faint);
--faintLink: var(--selectedMenuPopoverFaintLink, $fallback--faint);
--lightText: var(--selectedMenuPopoverLightText, $fallback--lightText);
--icon: var(--selectedMenuPopoverIcon, $fallback--icon);
svg {
color: var(--selectedMenuPopoverIcon, $fallback--icon);
}
}
}
}
</style>
diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js
index 3ff4a3c8e2..4148381c83 100644
--- a/src/components/post_status_form/post_status_form.js
+++ b/src/components/post_status_form/post_status_form.js
@@ -1,589 +1,588 @@
import statusPoster from '../../services/status_poster/status_poster.service.js'
import MediaUpload from '../media_upload/media_upload.vue'
import ScopeSelector from '../scope_selector/scope_selector.vue'
import EmojiInput from '../emoji_input/emoji_input.vue'
import PollForm from '../poll/poll_form.vue'
import Attachment from '../attachment/attachment.vue'
import StatusContent from '../status_content/status_content.vue'
import fileTypeService from '../../services/file_type/file_type.service.js'
import { findOffset } from '../../services/offset_finder/offset_finder.service.js'
import { reject, map, uniqBy, debounce } from 'lodash'
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]
allAttentions.unshift(user)
allAttentions = uniqBy(allAttentions, 'id')
allAttentions = reject(allAttentions, { id: currentUser.id })
let mentions = map(allAttentions, (attention) => {
return `@${attention.screen_name}`
})
return mentions.length > 0 ? mentions.join(' ') + ' ' : ''
}
// Converts a string with px to a number like '2px' -> 2
const pxStringToNumber = (str) => {
return Number(str.substring(0, str.length - 2))
}
const PostStatusForm = {
props: [
'replyTo',
'repliedUser',
'attentions',
'copyMessageScope',
'subject',
'disableSubject',
'disableScopeSelector',
'disableNotice',
'disableLockWarning',
'disablePolls',
'disableSensitivityCheckbox',
'disableSubmit',
'disablePreview',
'placeholder',
'maxHeight',
'postHandler',
'preserveFocus',
'autoFocus',
'fileLimit',
'submitOnEnter',
'emojiPickerPlacement',
'optimisticPosting'
],
components: {
MediaUpload,
EmojiInput,
PollForm,
ScopeSelector,
Checkbox,
Attachment,
StatusContent
},
mounted () {
this.updateIdempotencyKey()
this.resize(this.$refs.textarea)
if (this.replyTo) {
const textLength = this.$refs.textarea.value.length
this.$refs.textarea.setSelectionRange(textLength, textLength)
}
if (this.replyTo || this.autoFocus) {
this.$refs.textarea.focus()
}
},
data () {
const preset = this.$route.query.message
let statusText = preset || ''
const { scopeCopy } = this.$store.getters.mergedConfig
if (this.replyTo) {
const currentUser = this.$store.state.users.currentUser
statusText = buildMentionsString({ user: this.repliedUser, attentions: this.attentions }, currentUser)
}
const scope = ((this.copyMessageScope && scopeCopy) || this.copyMessageScope === 'direct')
? this.copyMessageScope
: this.$store.state.users.currentUser.default_scope
const { postContentType: contentType } = this.$store.getters.mergedConfig
return {
dropFiles: [],
uploadingFiles: false,
error: null,
posting: false,
highlighted: 0,
newStatus: {
spoilerText: this.subject || '',
status: statusText,
nsfw: false,
files: [],
poll: {},
mediaDescriptions: {},
visibility: scope,
contentType
},
caret: 0,
pollFormVisible: false,
showDropIcon: 'hide',
dropStopTimeout: null,
preview: null,
previewLoading: false,
emojiInputShown: false,
idempotencyKey: ''
}
},
computed: {
users () {
return this.$store.state.users.users
},
userDefaultScope () {
return this.$store.state.users.currentUser.default_scope
},
showAllScopes () {
return !this.mergedConfig.minimalScopesMode
},
emojiUserSuggestor () {
return suggestor({
emoji: [
...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 () {
return suggestor({
emoji: [
...this.$store.state.instance.emoji,
...this.$store.state.instance.customEmoji
]
})
},
emoji () {
return this.$store.state.instance.emoji || []
},
customEmoji () {
return this.$store.state.instance.customEmoji || []
},
statusLength () {
return this.newStatus.status.length
},
spoilerTextLength () {
return this.newStatus.spoilerText.length
},
statusLengthLimit () {
return this.$store.state.instance.textlimit
},
hasStatusLengthLimit () {
return this.statusLengthLimit > 0
},
charactersLeft () {
return this.statusLengthLimit - (this.statusLength + this.spoilerTextLength)
},
isOverLengthLimit () {
return this.hasStatusLengthLimit && (this.charactersLeft < 0)
},
minimalScopesMode () {
return this.$store.state.instance.minimalScopesMode
},
alwaysShowSubject () {
return this.mergedConfig.alwaysShowSubjectInput
},
postFormats () {
return this.$store.state.instance.postFormats || []
},
safeDMEnabled () {
return this.$store.state.instance.safeDM
},
pollsAvailable () {
return this.$store.state.instance.pollsAvailable &&
this.$store.state.instance.pollLimits.max_options >= 2 &&
this.disablePolls !== true
},
hideScopeNotice () {
return this.disableNotice || this.$store.getters.mergedConfig.hideScopeNotice
},
pollContentError () {
return this.pollFormVisible &&
this.newStatus.poll &&
this.newStatus.poll.error
},
showPreview () {
return !this.disablePreview && (!!this.preview || this.previewLoading)
},
emptyStatus () {
return this.newStatus.status.trim() === '' && this.newStatus.files.length === 0
},
uploadFileLimitReached () {
return this.newStatus.files.length >= this.fileLimit
},
...mapGetters(['mergedConfig']),
...mapState({
mobileLayout: state => state.interface.mobileLayout
})
},
watch: {
'newStatus': {
deep: true,
handler () {
this.statusChanged()
}
}
},
methods: {
statusChanged () {
this.autoPreview()
this.updateIdempotencyKey()
},
clearStatus () {
const newStatus = this.newStatus
this.newStatus = {
status: '',
spoilerText: '',
files: [],
visibility: newStatus.visibility,
contentType: newStatus.contentType,
poll: {},
mediaDescriptions: {}
}
this.pollFormVisible = false
this.$refs.mediaUpload && this.$refs.mediaUpload.clearFile()
this.clearPollForm()
if (this.preserveFocus) {
this.$nextTick(() => {
this.$refs.textarea.focus()
})
}
let el = this.$el.querySelector('textarea')
el.style.height = 'auto'
el.style.height = undefined
this.error = null
if (this.preview) this.previewStatus()
},
async postStatus (event, newStatus, opts = {}) {
if (this.posting && !this.optimisticPosting) { return }
if (this.disableSubmit) { return }
if (this.emojiInputShown) { return }
if (this.submitOnEnter) {
event.stopPropagation()
event.preventDefault()
}
if (this.optimisticPosting && (this.emptyStatus || this.isOverLengthLimit)) { return }
if (this.emptyStatus) {
this.error = this.$t('post_status.empty_status_error')
return
}
const poll = this.pollFormVisible ? this.newStatus.poll : {}
if (this.pollContentError) {
this.error = this.pollContentError
return
}
this.posting = true
try {
await this.setAllMediaDescriptions()
} catch (e) {
this.error = this.$t('post_status.media_description_error')
this.posting = false
return
}
const postingOptions = {
status: newStatus.status,
spoilerText: newStatus.spoilerText || null,
visibility: newStatus.visibility,
sensitive: newStatus.nsfw,
media: newStatus.files,
store: this.$store,
inReplyToStatusId: this.replyTo,
contentType: newStatus.contentType,
poll,
idempotencyKey: this.idempotencyKey
}
const postHandler = this.postHandler ? this.postHandler : statusPoster.postStatus
postHandler(postingOptions).then((data) => {
if (!data.error) {
this.clearStatus()
this.$emit('posted', data)
} else {
this.error = data.error
}
this.posting = false
})
},
previewStatus () {
if (this.emptyStatus && this.newStatus.spoilerText.trim() === '') {
this.preview = { error: this.$t('post_status.preview_empty') }
this.previewLoading = false
return
}
const newStatus = this.newStatus
this.previewLoading = true
statusPoster.postStatus({
status: newStatus.status,
spoilerText: newStatus.spoilerText || null,
visibility: newStatus.visibility,
sensitive: newStatus.nsfw,
media: [],
store: this.$store,
inReplyToStatusId: this.replyTo,
contentType: newStatus.contentType,
poll: {},
preview: true
}).then((data) => {
// Don't apply preview if not loading, because it means
// user has closed the preview manually.
if (!this.previewLoading) return
if (!data.error) {
this.preview = data
} else {
this.preview = { error: data.error }
}
}).catch((error) => {
this.preview = { error }
}).finally(() => {
this.previewLoading = false
})
},
debouncePreviewStatus: debounce(function () { this.previewStatus() }, 500),
autoPreview () {
if (!this.preview) return
this.previewLoading = true
this.debouncePreviewStatus()
},
closePreview () {
this.preview = null
this.previewLoading = false
},
togglePreview () {
if (this.showPreview) {
this.closePreview()
} else {
this.previewStatus()
}
},
addMediaFile (fileInfo) {
this.newStatus.files.push(fileInfo)
this.$emit('resize', { delayed: true })
},
removeMediaFile (fileInfo) {
let index = this.newStatus.files.indexOf(fileInfo)
this.newStatus.files.splice(index, 1)
this.$emit('resize')
},
uploadFailed (errString, templateArgs) {
templateArgs = templateArgs || {}
this.error = this.$t('upload.error.base') + ' ' + this.$t('upload.error.' + errString, templateArgs)
},
startedUploadingFiles () {
this.uploadingFiles = true
},
finishedUploadingFiles () {
this.$emit('resize')
this.uploadingFiles = false
},
type (fileInfo) {
return fileTypeService.fileType(fileInfo.mimetype)
},
paste (e) {
this.autoPreview()
this.resize(e)
if (e.clipboardData.files.length > 0) {
// prevent pasting of file as text
e.preventDefault()
// Strangely, files property gets emptied after event propagation
// Trying to wrap it in array doesn't work. Plus I doubt it's possible
// to hold more than one file in clipboard.
this.dropFiles = [e.clipboardData.files[0]]
}
},
fileDrop (e) {
if (e.dataTransfer && e.dataTransfer.types.includes('Files')) {
e.preventDefault() // allow dropping text like before
this.dropFiles = e.dataTransfer.files
clearTimeout(this.dropStopTimeout)
this.showDropIcon = 'hide'
}
},
fileDragStop (e) {
// The false-setting is done with delay because just using leave-events
// directly caused unwanted flickering, this is not perfect either but
// much less noticable.
clearTimeout(this.dropStopTimeout)
this.showDropIcon = 'fade'
this.dropStopTimeout = setTimeout(() => (this.showDropIcon = 'hide'), 500)
},
fileDrag (e) {
e.dataTransfer.dropEffect = this.uploadFileLimitReached ? 'none' : 'copy'
if (e.dataTransfer && e.dataTransfer.types.includes('Files')) {
clearTimeout(this.dropStopTimeout)
this.showDropIcon = 'show'
}
},
onEmojiInputInput (e) {
this.$nextTick(() => {
this.resize(this.$refs['textarea'])
})
},
resize (e) {
const target = e.target || e
if (!(target instanceof window.Element)) { return }
// Reset to default height for empty form, nothing else to do here.
if (target.value === '') {
target.style.height = null
this.$emit('resize')
this.$refs['emoji-input'].resize()
return
}
const formRef = this.$refs['form']
const bottomRef = this.$refs['bottom']
/* Scroller is either `window` (replies in TL), sidebar (main post form,
* replies in notifs) or mobile post form. Note that getting and setting
* scroll is different for `Window` and `Element`s
*/
const bottomBottomPaddingStr = window.getComputedStyle(bottomRef)['padding-bottom']
const bottomBottomPadding = pxStringToNumber(bottomBottomPaddingStr)
const scrollerRef = this.$el.closest('.sidebar-scroller') ||
this.$el.closest('.post-form-modal-view') ||
window
// Getting info about padding we have to account for, removing 'px' part
const topPaddingStr = window.getComputedStyle(target)['padding-top']
const bottomPaddingStr = window.getComputedStyle(target)['padding-bottom']
const topPadding = pxStringToNumber(topPaddingStr)
const bottomPadding = pxStringToNumber(bottomPaddingStr)
const vertPadding = topPadding + bottomPadding
const oldHeight = pxStringToNumber(target.style.height)
/* Explanation:
*
* https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight
* scrollHeight returns element's scrollable content height, i.e. visible
* element + overscrolled parts of it. We use it to determine when text
* inside the textarea exceeded its height, so we can set height to prevent
* overscroll, i.e. make textarea grow with the text. HOWEVER, since we
* explicitly set new height, scrollHeight won't go below that, so we can't
* SHRINK the textarea when there's extra space. To workaround that we set
* height to 'auto' which makes textarea tiny again, so that scrollHeight
* will match text height again. HOWEVER, shrinking textarea can screw with
* the scroll since there might be not enough padding around form-bottom to even
* warrant a scroll, so it will jump to 0 and refuse to move anywhere,
* so we check current scroll position before shrinking and then restore it
* with needed delta.
*/
// this part has to be BEFORE the content size update
const currentScroll = scrollerRef === window
? scrollerRef.scrollY
: scrollerRef.scrollTop
const scrollerHeight = scrollerRef === window
? scrollerRef.innerHeight
: scrollerRef.offsetHeight
const scrollerBottomBorder = currentScroll + scrollerHeight
// BEGIN content size update
target.style.height = 'auto'
const heightWithoutPadding = Math.floor(target.scrollHeight - vertPadding)
let newHeight = this.maxHeight ? Math.min(heightWithoutPadding, this.maxHeight) : heightWithoutPadding
// This is a bit of a hack to combat target.scrollHeight being different on every other input
// on some browsers for whatever reason. Don't change the height if difference is 1px or less.
if (Math.abs(newHeight - oldHeight) <= 1) {
newHeight = oldHeight
}
target.style.height = `${newHeight}px`
this.$emit('resize', newHeight)
// END content size update
// We check where the bottom border of form-bottom element is, this uses findOffset
// to find offset relative to scrollable container (scroller)
const bottomBottomBorder = bottomRef.offsetHeight + findOffset(bottomRef, scrollerRef).top + bottomBottomPadding
const isBottomObstructed = scrollerBottomBorder < bottomBottomBorder
const isFormBiggerThanScroller = scrollerHeight < formRef.offsetHeight
const bottomChangeDelta = bottomBottomBorder - scrollerBottomBorder
// The intention is basically this;
// Keep form-bottom always visible so that submit button is in view EXCEPT
// if form element bigger than scroller and caret isn't at the end, so that
// if you scroll up and edit middle of text you won't get scrolled back to bottom
const shouldScrollToBottom = isBottomObstructed &&
!(isFormBiggerThanScroller &&
this.$refs.textarea.selectionStart !== this.$refs.textarea.value.length)
const totalDelta = shouldScrollToBottom ? bottomChangeDelta : 0
const targetScroll = Math.round(currentScroll + totalDelta)
if (scrollerRef === window) {
scrollerRef.scroll(0, targetScroll)
} else {
scrollerRef.scrollTop = targetScroll
}
this.$refs['emoji-input'].resize()
},
showEmojiPicker () {
this.$refs['textarea'].focus()
this.$refs['emoji-input'].triggerShowPicker()
},
clearError () {
this.error = null
},
changeVis (visibility) {
this.newStatus.visibility = visibility
},
togglePollForm () {
this.pollFormVisible = !this.pollFormVisible
},
setPoll (poll) {
this.newStatus.poll = poll
},
clearPollForm () {
if (this.$refs.pollForm) {
this.$refs.pollForm.clear()
}
},
dismissScopeNotice () {
this.$store.dispatch('setOption', { name: 'hideScopeNotice', value: true })
},
setMediaDescription (id) {
const description = this.newStatus.mediaDescriptions[id]
if (!description || description.trim() === '') return
return statusPoster.setMediaDescription({ store: this.$store, id, description })
},
setAllMediaDescriptions () {
const ids = this.newStatus.files.map(file => file.id)
return Promise.all(ids.map(id => this.setMediaDescription(id)))
},
handleEmojiInputShow (value) {
this.emojiInputShown = value
},
updateIdempotencyKey () {
this.idempotencyKey = Date.now().toString()
},
openProfileTab () {
this.$store.dispatch('openSettingsModalTab', 'profile')
}
}
}
export default PostStatusForm
diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue
index 42d3152b59..ed830f573f 100644
--- a/src/components/post_status_form/post_status_form.vue
+++ b/src/components/post_status_form/post_status_form.vue
@@ -1,653 +1,649 @@
<template>
<div
ref="form"
class="post-status-form"
>
<form
autocomplete="off"
@submit.prevent
@dragover.prevent="fileDrag"
>
<div
v-show="showDropIcon !== 'hide'"
:style="{ animation: showDropIcon === 'show' ? 'fade-in 0.25s' : 'fade-out 0.5s' }"
class="drop-indicator"
@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"
path="post_status.account_not_locked_warning"
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'"
class="visibility-notice notice-dismissible"
>
<span>{{ $t('post_status.scope_notice.public') }}</span>
<a
class="fa-scale-110 fa-old-padding dismiss"
@click.prevent="dismissScopeNotice()"
>
<FAIcon icon="times" />
</a>
</p>
<p
v-else-if="!hideScopeNotice && newStatus.visibility === 'unlisted'"
class="visibility-notice notice-dismissible"
>
<span>{{ $t('post_status.scope_notice.unlisted') }}</span>
<a
class="fa-scale-110 fa-old-padding dismiss"
@click.prevent="dismissScopeNotice()"
>
<FAIcon icon="times" />
</a>
</p>
<p
v-else-if="!hideScopeNotice && newStatus.visibility === 'private' && $store.state.users.currentUser.locked"
class="visibility-notice notice-dismissible"
>
<span>{{ $t('post_status.scope_notice.private') }}</span>
<a
class="fa-scale-110 fa-old-padding dismiss"
@click.prevent="dismissScopeNotice()"
>
<FAIcon icon="times" />
</a>
</p>
<p
v-else-if="newStatus.visibility === 'direct'"
class="visibility-notice"
>
<span v-if="safeDMEnabled">{{ $t('post_status.direct_warning_to_first_only') }}</span>
<span v-else>{{ $t('post_status.direct_warning_to_all') }}</span>
</p>
<div
v-if="!disablePreview"
class="preview-heading faint"
>
<a
class="preview-toggle faint"
@click.stop.prevent="togglePreview"
>
{{ $t('post_status.preview') }}
<FAIcon :icon="showPreview ? 'chevron-left' : 'chevron-right'" />
</a>
<div
v-show="previewLoading"
class="preview-spinner"
>
<FAIcon
class="fa-old-padding"
spin
icon="circle-notch"
/>
</div>
</div>
<div
v-if="showPreview"
class="preview-container"
>
<div
v-if="!preview"
class="preview-status"
>
{{ $t('general.loading') }}
</div>
<div
v-else-if="preview.error"
class="preview-status preview-error"
>
{{ preview.error }}
</div>
<StatusContent
v-else
:status="preview"
class="preview-status"
/>
</div>
<EmojiInput
v-if="!disableSubject && (newStatus.spoilerText || alwaysShowSubject)"
v-model="newStatus.spoilerText"
enable-emoji-picker
:suggest="emojiSuggestor"
class="form-control"
>
<input
v-model="newStatus.spoilerText"
type="text"
:placeholder="$t('post_status.content_warning')"
:disabled="posting && !optimisticPosting"
size="1"
class="form-post-subject"
>
</EmojiInput>
<EmojiInput
ref="emoji-input"
v-model="newStatus.status"
:suggest="emojiUserSuggestor"
:placement="emojiPickerPlacement"
class="form-control main-input"
enable-emoji-picker
hide-emoji-button
:newline-on-ctrl-enter="submitOnEnter"
enable-sticker-picker
@input="onEmojiInputInput"
@sticker-uploaded="addMediaFile"
@sticker-upload-failed="uploadFailed"
@shown="handleEmojiInputShow"
>
<textarea
ref="textarea"
v-model="newStatus.status"
:placeholder="placeholder || $t('post_status.default')"
rows="1"
cols="1"
:disabled="posting && !optimisticPosting"
class="form-post-body"
:class="{ 'scrollable-form': !!maxHeight }"
@keydown.exact.enter="submitOnEnter && postStatus($event, newStatus)"
@keydown.meta.enter="postStatus($event, newStatus)"
@keydown.ctrl.enter="!submitOnEnter && postStatus($event, newStatus)"
@input="resize"
@compositionupdate="resize"
@paste="paste"
/>
<p
v-if="hasStatusLengthLimit"
class="character-counter faint"
:class="{ error: isOverLengthLimit }"
>
{{ charactersLeft }}
</p>
</EmojiInput>
<div
v-if="!disableScopeSelector"
class="visibility-tray"
>
<scope-selector
:show-all="showAllScopes"
:user-default="userDefaultScope"
:original-scope="copyMessageScope"
:initial-scope="newStatus.visibility"
:on-scope-change="changeVis"
/>
<div
v-if="postFormats.length > 1"
class="text-format"
>
<label
for="post-content-type"
class="select"
>
<select
id="post-content-type"
v-model="newStatus.contentType"
class="form-control"
>
<option
v-for="postFormat in postFormats"
:key="postFormat"
:value="postFormat"
>
{{ $t(`post_status.content_type["${postFormat}"]`) }}
</option>
</select>
<FAIcon
class="select-down-icon"
icon="chevron-down"
/>
</label>
</div>
<div
v-if="postFormats.length === 1 && postFormats[0] !== 'text/plain'"
class="text-format"
>
<span class="only-format">
{{ $t(`post_status.content_type["${postFormats[0]}"]`) }}
</span>
</div>
</div>
</div>
<poll-form
v-if="pollsAvailable"
ref="pollForm"
:visible="pollFormVisible"
@update-poll="setPoll"
/>
<div
ref="bottom"
class="form-bottom"
>
<div class="form-bottom-left">
<media-upload
ref="mediaUpload"
class="media-upload-icon"
:drop-files="dropFiles"
:disabled="uploadFileLimitReached"
@uploading="startedUploadingFiles"
@uploaded="addMediaFile"
@upload-failed="uploadFailed"
@all-uploaded="finishedUploadingFiles"
/>
- <div
- class="emoji-icon"
+ <button
+ class="emoji-icon button-unstyled"
+ :title="$t('emoji.add_emoji')"
+ @click="showEmojiPicker"
>
- <div
- :title="$t('emoji.add_emoji')"
- class="btn btn-default"
- @click="showEmojiPicker"
- >
- <FAIcon icon="smile-beam" />
- </div>
- </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"
>
<FAIcon icon="poll-h" />
- </div>
+ </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>
<!-- touchstart is used to keep the OSK at the same position after a message send -->
<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)"
>
{{ $t('general.submit') }}
</button>
</div>
<div
v-if="error"
class="alert error"
>
Error: {{ error }}
<FAIcon
class="fa-scale-110 fa-old-padding"
icon="times"
@click="clearError"
/>
</div>
<div class="attachments">
<div
v-for="file in newStatus.files"
:key="file.url"
class="media-upload-wrapper"
>
<FAIcon
class="fa-scale-110 fa-old-padding"
icon="times"
@click="removeMediaFile(file)"
/>
<attachment
:attachment="file"
:set-media="() => $store.dispatch('setMedia', newStatus.files)"
size="small"
allow-play="false"
/>
<input
v-model="newStatus.mediaDescriptions[file.id]"
type="text"
:placeholder="$t('post_status.media_description')"
@keydown.enter.prevent=""
>
</div>
</div>
<div
v-if="newStatus.files.length > 0 && !disableSensitivityCheckbox"
class="upload_settings"
>
<Checkbox v-model="newStatus.nsfw">
{{ $t('post_status.attachments_sensitive') }}
</Checkbox>
</div>
</form>
</div>
</template>
<script src="./post_status_form.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.tribute-container {
ul {
padding: 0px;
li {
display: flex;
align-items: center;
}
}
img {
padding: 3px;
width: 16px;
height: 16px;
border-radius: $fallback--avatarAltRadius;
border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius);
}
}
.post-status-form {
position: relative;
.form-bottom {
display: flex;
justify-content: space-between;
padding: 0.5em;
height: 32px;
button {
width: 10em;
}
p {
margin: 0.35em;
padding: 0.35em;
display: flex;
}
}
.form-bottom-left {
display: flex;
flex: 1;
padding-right: 7px;
margin-right: 7px;
max-width: 10em;
}
.preview-heading {
display: flex;
padding-left: 0.5em;
}
.preview-toggle {
flex: 1;
cursor: pointer;
user-select: none;
&:hover {
text-decoration: underline;
}
svg, i {
margin-left: 0.2em;
font-size: 0.8em;
transform: rotate(90deg);
}
}
.preview-container {
margin-bottom: 1em;
}
.preview-error {
font-style: italic;
color: $fallback--faint;
color: var(--faint, $fallback--faint);
}
.preview-status {
border: 1px solid $fallback--border;
border: 1px solid var(--border, $fallback--border);
border-radius: $fallback--tooltipRadius;
border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
padding: 0.5em;
margin: 0;
line-height: 1.4em;
}
.text-format {
.only-format {
color: $fallback--faint;
color: var(--faint, $fallback--faint);
}
}
.visibility-tray {
display: flex;
justify-content: space-between;
padding-top: 5px;
}
.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
svg, i, label {
color: $fallback--lightText;
color: var(--lightText, $fallback--lightText);
}
}
&.disabled {
svg, i {
cursor: not-allowed;
color: $fallback--icon;
color: var(--btnDisabledText, $fallback--icon);
&:hover {
color: $fallback--icon;
color: var(--btnDisabledText, $fallback--icon);
}
}
}
}
// Order is not necessary but a good indicator
.media-upload-icon {
order: 1;
text-align: left;
}
.emoji-icon {
order: 2;
text-align: center;
}
.poll-icon {
order: 3;
text-align: right;
}
.poll-icon {
cursor: pointer;
}
.error {
text-align: center;
}
.media-upload-wrapper {
margin-right: .2em;
margin-bottom: .5em;
width: 18em;
img, video {
object-fit: contain;
max-height: 10em;
}
.video {
max-height: 10em;
}
input {
flex: 1;
width: 100%;
}
}
.status-input-wrapper {
display: flex;
position: relative;
width: 100%;
flex-direction: column;
}
.attachments .media-upload-wrapper {
padding: 0 0.5em;
.attachment {
margin: 0;
padding: 0;
position: relative;
}
.fa-scale-110 fa-old-padding {
position: absolute;
margin: 10px;
margin: .75em;
padding: .5em;
background: rgba(230,230,230,0.6);
z-index: 2;
color: black;
border-radius: $fallback--attachmentRadius;
border-radius: var(--attachmentRadius, $fallback--attachmentRadius);
font-weight: bold;
cursor: pointer;
}
}
.btn {
cursor: pointer;
}
.btn[disabled] {
cursor: not-allowed;
}
form {
display: flex;
flex-direction: column;
margin: 0.6em;
position: relative;
}
.form-group {
display: flex;
flex-direction: column;
padding: 0.25em 0.5em 0.5em;
line-height:24px;
}
form textarea.form-cw {
line-height:16px;
resize: none;
overflow: hidden;
transition: min-height 200ms 100ms;
min-height: 1px;
}
.form-post-body {
height: 16px; // Only affects the empty-height
line-height: 16px;
resize: none;
overflow: hidden;
transition: min-height 200ms 100ms;
padding-bottom: 1.75em;
min-height: 1px;
box-sizing: content-box;
&.scrollable-form {
overflow-y: auto;
}
}
.main-input {
position: relative;
}
.character-counter {
position: absolute;
bottom: 0;
right: 0;
padding: 0;
margin: 0 0.5em;
&.error {
color: $fallback--cRed;
color: var(--cRed, $fallback--cRed);
}
}
.btn {
cursor: pointer;
}
.btn[disabled] {
cursor: not-allowed;
}
@keyframes fade-in {
from { opacity: 0; }
to { opacity: 0.6; }
}
@keyframes fade-out {
from { opacity: 0.6; }
to { opacity: 0; }
}
.drop-indicator {
position: absolute;
z-index: 1;
width: 100%;
height: 100%;
font-size: 5em;
display: flex;
align-items: center;
justify-content: center;
opacity: 0.6;
color: $fallback--text;
color: var(--text, $fallback--text);
background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg);
border-radius: $fallback--tooltipRadius;
border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
border: 2px dashed $fallback--text;
border: 2px dashed var(--text, $fallback--text);
}
}
// todo: unify with attachment.vue (otherwise the uploaded images are not minified unless a status with an attachment was displayed before)
img.media-upload, .media-upload-container > video {
line-height: 0;
max-height: 200px;
max-width: 100%;
}
</style>
diff --git a/src/components/react_button/react_button.js b/src/components/react_button/react_button.js
index de0df70ce8..5e7b7580b1 100644
--- a/src/components/react_button/react_button.js
+++ b/src/components/react_button/react_button.js
@@ -1,55 +1,63 @@
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'],
data () {
return {
filterWord: ''
}
},
components: {
Popover
},
methods: {
addReaction (event, emoji, close) {
const existingReaction = this.status.emoji_reactions.find(r => r.name === emoji)
if (existingReaction && existingReaction.me) {
this.$store.dispatch('unreactWithEmoji', { id: this.status.id, emoji })
} else {
this.$store.dispatch('reactWithEmoji', { id: this.status.id, emoji })
}
close()
}
},
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])) {
orderedEmojiList[indexOfFilterWord] = []
}
orderedEmojiList[indexOfFilterWord].push(emoji)
}
}
return orderedEmojiList.flat()
}
return this.$store.state.instance.emoji || []
},
mergedConfig () {
return this.$store.getters.mergedConfig
}
}
}
export default ReactButton
diff --git a/src/components/react_button/react_button.vue b/src/components/react_button/react_button.vue
index e508a3e9c4..dde67d214f 100644
--- a/src/components/react_button/react_button.vue
+++ b/src/components/react_button/react_button.vue
@@ -1,114 +1,120 @@
<template>
<Popover
trigger="click"
placement="top"
:offset="{ y: 5 }"
- class="react-button-popover"
:bound-to="{ x: 'container' }"
+ remove-padding
>
<div
slot="content"
slot-scope="{close}"
>
<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"
class="emoji-button"
+ :title="emoji.displayText"
@click="addReaction($event, emoji, 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 }}
</span>
<div class="reaction-bottom-fader" />
</div>
</div>
- <span slot="trigger">
+ <span
+ slot="trigger"
+ class="ReactButton"
+ :title="$t('tool_tip.add_reaction')"
+ >
<FAIcon
- class="fa-scale-110 fa-old-padding add-reaction-button"
+ class="fa-scale-110 fa-old-padding"
:icon="['far', 'smile-beam']"
- :title="$t('tool_tip.add_reaction')"
/>
</span>
</Popover>
</template>
<script src="./react_button.js" ></script>
<style lang="scss">
@import '../../_variables.scss';
.reaction-picker-filter {
padding: 0.5em;
display: flex;
input {
flex: 1;
}
}
.reaction-picker-divider {
height: 1px;
width: 100%;
margin: 0.5em;
background-color: var(--border, $fallback--border);
}
.reaction-picker {
width: 10em;
height: 9em;
font-size: 1.5em;
overflow-y: scroll;
display: flex;
flex-wrap: wrap;
padding: 0.5em;
text-align: center;
align-content: flex-start;
user-select: none;
mask: linear-gradient(to top, white 0, transparent 100%) bottom no-repeat,
linear-gradient(to bottom, white 0, transparent 100%) top no-repeat,
linear-gradient(to top, white, white);
transition: mask-size 150ms;
mask-size: 100% 20px, 100% 20px, auto;
// Autoprefixed seem to ignore this one, and also syntax is different
-webkit-mask-composite: xor;
mask-composite: exclude;
.emoji-button {
cursor: pointer;
flex-basis: 20%;
line-height: 1.5em;
align-content: center;
&:hover {
transform: scale(1.25);
}
}
}
-.add-reaction-button {
- cursor: pointer;
+.ReactButton {
+ padding: 10px;
+ margin: -10px;
- &:hover {
+ &:hover .svg-inline--fa {
color: $fallback--text;
color: var(--text, $fallback--text);
}
}
</style>
diff --git a/src/components/registration/registration.vue b/src/components/registration/registration.vue
index a83ca1e527..100df0d6e5 100644
--- a/src/components/registration/registration.vue
+++ b/src/components/registration/registration.vue
@@ -1,340 +1,340 @@
<template>
<div class="settings panel panel-default">
<div class="panel-heading">
{{ $t('registration.registration') }}
</div>
<div class="panel-body">
<form
class="registration-form"
@submit.prevent="submit(user)"
>
<div class="container">
<div class="text-fields">
<div
class="form-group"
:class="{ 'form-group--error': $v.user.username.$error }"
>
<label
class="form--label"
for="sign-up-username"
>{{ $t('login.username') }}</label>
<input
id="sign-up-username"
v-model.trim="$v.user.username.$model"
:disabled="isPending"
class="form-control"
:placeholder="$t('registration.username_placeholder')"
>
</div>
<div
v-if="$v.user.username.$dirty"
class="form-error"
>
<ul>
<li v-if="!$v.user.username.required">
<span>{{ $t('registration.validations.username_required') }}</span>
</li>
</ul>
</div>
<div
class="form-group"
:class="{ 'form-group--error': $v.user.fullname.$error }"
>
<label
class="form--label"
for="sign-up-fullname"
>{{ $t('registration.fullname') }}</label>
<input
id="sign-up-fullname"
v-model.trim="$v.user.fullname.$model"
:disabled="isPending"
class="form-control"
:placeholder="$t('registration.fullname_placeholder')"
>
</div>
<div
v-if="$v.user.fullname.$dirty"
class="form-error"
>
<ul>
<li v-if="!$v.user.fullname.required">
<span>{{ $t('registration.validations.fullname_required') }}</span>
</li>
</ul>
</div>
<div
class="form-group"
:class="{ 'form-group--error': $v.user.email.$error }"
>
<label
class="form--label"
for="email"
>{{ $t('registration.email') }}</label>
<input
id="email"
v-model="$v.user.email.$model"
:disabled="isPending"
class="form-control"
type="email"
>
</div>
<div
v-if="$v.user.email.$dirty"
class="form-error"
>
<ul>
<li v-if="!$v.user.email.required">
<span>{{ $t('registration.validations.email_required') }}</span>
</li>
</ul>
</div>
<div class="form-group">
<label
class="form--label"
for="bio"
>{{ $t('registration.bio') }} ({{ $t('general.optional') }})</label>
<textarea
id="bio"
v-model="user.bio"
:disabled="isPending"
class="form-control"
:placeholder="bioPlaceholder"
/>
</div>
<div
class="form-group"
:class="{ 'form-group--error': $v.user.password.$error }"
>
<label
class="form--label"
for="sign-up-password"
>{{ $t('login.password') }}</label>
<input
id="sign-up-password"
v-model="user.password"
:disabled="isPending"
class="form-control"
type="password"
>
</div>
<div
v-if="$v.user.password.$dirty"
class="form-error"
>
<ul>
<li v-if="!$v.user.password.required">
<span>{{ $t('registration.validations.password_required') }}</span>
</li>
</ul>
</div>
<div
class="form-group"
:class="{ 'form-group--error': $v.user.confirm.$error }"
>
<label
class="form--label"
for="sign-up-password-confirmation"
>{{ $t('registration.password_confirm') }}</label>
<input
id="sign-up-password-confirmation"
v-model="user.confirm"
:disabled="isPending"
class="form-control"
type="password"
>
</div>
<div
v-if="$v.user.confirm.$dirty"
class="form-error"
>
<ul>
<li v-if="!$v.user.confirm.required">
<span>{{ $t('registration.validations.password_confirmation_required') }}</span>
</li>
<li v-if="!$v.user.confirm.sameAsPassword">
<span>{{ $t('registration.validations.password_confirmation_match') }}</span>
</li>
</ul>
</div>
<div
v-if="captcha.type != 'none'"
id="captcha-group"
class="form-group"
>
<label
class="form--label"
for="captcha-label"
>{{ $t('registration.captcha') }}</label>
<template v-if="['kocaptcha', 'native'].includes(captcha.type)">
<img
:src="captcha.url"
@click="setCaptcha"
>
<sub>{{ $t('registration.new_captcha') }}</sub>
<input
id="captcha-answer"
v-model="captcha.solution"
:disabled="isPending"
class="form-control"
type="text"
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"
>
</template>
</div>
<div
v-if="token"
class="form-group"
>
<label for="token">{{ $t('registration.token') }}</label>
<input
id="token"
v-model="token"
disabled="true"
class="form-control"
type="text"
>
</div>
<div class="form-group">
<button
:disabled="isPending"
type="submit"
- class="btn btn-default"
+ class="btn button-default"
>
{{ $t('general.submit') }}
</button>
</div>
</div>
<!-- eslint-disable vue/no-v-html -->
<div
class="terms-of-service"
v-html="termsOfService"
/>
<!-- eslint-enable vue/no-v-html -->
</div>
<div
v-if="serverValidationErrors.length"
class="form-group"
>
<div class="alert error">
<span
v-for="error in serverValidationErrors"
:key="error"
>{{ error }}</span>
</div>
</div>
</form>
</div>
</div>
</template>
<script src="./registration.js"></script>
<style lang="scss">
@import '../../_variables.scss';
$validations-cRed: #f04124;
.registration-form {
display: flex;
flex-direction: column;
margin: 0.6em;
.container {
display: flex;
flex-direction: row;
//margin-bottom: 1em;
}
.terms-of-service {
flex: 0 1 50%;
margin: 0.8em;
}
.text-fields {
margin-top: 0.6em;
flex: 1 0;
display: flex;
flex-direction: column;
}
textarea {
min-height: 100px;
resize: vertical;
}
.form-group {
display: flex;
flex-direction: column;
padding: 0.3em 0.0em 0.3em;
line-height:24px;
margin-bottom: 1em;
}
.form-group--error {
animation-name: shakeError;
animation-duration: .6s;
animation-timing-function: ease-in-out;
}
.form-group--error .form--label {
color: $validations-cRed;
color: var(--cRed, $validations-cRed);
}
.form-error {
margin-top: -0.7em;
text-align: left;
span {
font-size: 12px;
}
}
.form-error ul {
list-style: none;
padding: 0 0 0 5px;
margin-top: 0;
li::before {
content: "â€ĸ ";
}
}
form textarea {
line-height:16px;
resize: vertical;
}
.captcha {
max-width: 350px;
margin-bottom: 0.4em;
}
.btn {
margin-top: 0.6em;
height: 28px;
}
.error {
text-align: center;
}
}
@media all and (max-width: 800px) {
.registration-form .container {
flex-direction: column-reverse;
}
}
</style>
diff --git a/src/components/reply_button/reply_button.vue b/src/components/reply_button/reply_button.vue
index a0ac89416b..c17041dacf 100644
--- a/src/components/reply_button/reply_button.vue
+++ b/src/components/reply_button/reply_button.vue
@@ -1,39 +1,58 @@
<template>
- <div>
- <FAIcon
+ <div class="ReplyButton">
+ <button
v-if="loggedIn"
- class="ReplyButton fa-scale-110 fa-old-padding -interactive"
- icon="reply"
- :title="$t('tool_tip.reply')"
+ class="button-unstyled interactive"
:class="{'-active': replying}"
- @click.prevent="$emit('toggle')"
- />
- <FAIcon
- v-else
- icon="reply"
- class="ReplyButton fa-scale-110 fa-old-padding"
: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 {
- &.-interactive {
- cursor: pointer;
+ display: flex;
- &:hover,
- &.-active {
+ > :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 5ee4179a6b..2103fd0b9b 100644
--- a/src/components/retweet_button/retweet_button.js
+++ b/src/components/retweet_button/retweet_button.js
@@ -1,38 +1,33 @@
import { library } from '@fortawesome/fontawesome-svg-core'
import { faRetweet } from '@fortawesome/free-solid-svg-icons'
library.add(faRetweet)
const RetweetButton = {
props: ['status', 'loggedIn', 'visibility'],
data () {
return {
animated: false
}
},
methods: {
retweet () {
if (!this.status.repeated) {
this.$store.dispatch('retweet', { id: this.status.id })
} else {
this.$store.dispatch('unretweet', { id: this.status.id })
}
this.animated = true
setTimeout(() => {
this.animated = false
}, 500)
}
},
computed: {
- classes () {
- return {
- '-repeated': this.status.repeated
- }
- },
mergedConfig () {
return this.$store.getters.mergedConfig
}
}
}
export default RetweetButton
diff --git a/src/components/retweet_button/retweet_button.vue b/src/components/retweet_button/retweet_button.vue
index b234f3d914..859ce49904 100644
--- a/src/components/retweet_button/retweet_button.vue
+++ b/src/components/retweet_button/retweet_button.vue
@@ -1,55 +1,69 @@
<template>
- <div v-if="loggedIn">
- <template v-if="visibility !== 'private' && visibility !== 'direct'">
+ <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="classes"
- class="RetweetButton fa-scale-110 fa-old-padding -interactive"
+ class="fa-scale-110 fa-old-padding"
icon="retweet"
:spin="animated"
- :title="$t('tool_tip.repeat')"
- @click.prevent="retweet()"
/>
- <span v-if="!mergedConfig.hidePostStats && status.repeat_num > 0">{{ status.repeat_num }}</span>
- </template>
- <template v-else>
+ </button>
+ <span v-else-if="loggedIn">
<FAIcon
- :class="classes"
- class="RetweetButton fa-scale-110 fa-old-padding"
+ class="fa-scale-110 fa-old-padding"
icon="lock"
:title="$t('timeline.no_retweet_hint')"
/>
- </template>
- </div>
- <div v-else-if="!loggedIn">
- <FAIcon
- :class="classes"
- class="fa-scale-110 fa-old-padding"
- 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>
<script src="./retweet_button.js" ></script>
<style lang="scss">
@import '../../_variables.scss';
.RetweetButton {
- &.-interactive {
- cursor: pointer;
- animation-duration: 0.6s;
+ display: flex;
- &:hover {
+ > :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);
}
}
-
- &.-repeated {
- color: $fallback--cGreen;
- color: var(--cGreen, $fallback--cGreen);
- }
}
</style>
diff --git a/src/components/scope_selector/scope_selector.vue b/src/components/scope_selector/scope_selector.vue
index a22a4fda94..66ac612ea7 100644
--- a/src/components/scope_selector/scope_selector.vue
+++ b/src/components/scope_selector/scope_selector.vue
@@ -1,77 +1,77 @@
<template>
<div
v-if="!showNothing"
class="ScopeSelector"
>
- <span
+ <button
v-if="showDirect"
- class="scope"
+ class="button-unstyled scope"
:class="css.direct"
:title="$t('post_status.scope.direct')"
@click="changeVis('direct')"
>
<FAIcon
icon="envelope"
class="fa-scale-110 fa-old-padding"
/>
- </span>
- <span
+ </button>
+ <button
v-if="showPrivate"
- class="scope"
+ class="button-unstyled scope"
:class="css.private"
:title="$t('post_status.scope.private')"
@click="changeVis('private')"
>
<FAIcon
icon="lock"
class="fa-scale-110 fa-old-padding"
/>
- </span>
- <span
+ </button>
+ <button
v-if="showUnlisted"
- class="scope"
+ class="button-unstyled scope"
:class="css.unlisted"
:title="$t('post_status.scope.unlisted')"
@click="changeVis('unlisted')"
>
<FAIcon
icon="lock-open"
class="fa-scale-110 fa-old-padding"
/>
- </span>
- <span
+ </button>
+ <button
v-if="showPublic"
- class="scope"
+ 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"
/>
- </span>
+ </button>
</div>
</template>
<script src="./scope_selector.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.ScopeSelector {
.scope {
display: inline-block;
cursor: pointer;
min-width: 1.3em;
min-height: 1.3em;
text-align: center;
&.selected svg {
color: $fallback--lightText;
color: var(--lightText, $fallback--lightText);
}
}
}
</style>
diff --git a/src/components/search/search.vue b/src/components/search/search.vue
index 665390f9e1..a6503c9f74 100644
--- a/src/components/search/search.vue
+++ b/src/components/search/search.vue
@@ -1,212 +1,212 @@
<template>
<div class="panel panel-default">
<div class="panel-heading">
<div class="title">
{{ $t('nav.search') }}
</div>
</div>
<div class="search-input-container">
<input
ref="searchInput"
v-model="searchTerm"
class="search-input"
:placeholder="$t('nav.search')"
@keyup.enter="newQuery(searchTerm)"
>
<button
- class="btn search-button"
+ class="btn button-default search-button"
@click="newQuery(searchTerm)"
>
<FAIcon icon="search" />
</button>
</div>
<div
v-if="loading"
class="text-center loading-icon"
>
<FAIcon
icon="circle-notch"
spin
size="lg"
/>
</div>
<div v-else-if="loaded">
<div class="search-nav-heading">
<tab-switcher
ref="tabSwitcher"
:on-switch="onResultTabSwitch"
:active-tab="currenResultTab"
>
<span
key="statuses"
:label="$t('user_card.statuses') + resultCount('visibleStatuses')"
/>
<span
key="people"
:label="$t('search.people') + resultCount('users')"
/>
<span
key="hashtags"
:label="$t('search.hashtags') + resultCount('hashtags')"
/>
</tab-switcher>
</div>
</div>
<div class="panel-body">
<div v-if="currenResultTab === 'statuses'">
<div
v-if="visibleStatuses.length === 0 && !loading && loaded"
class="search-result-heading"
>
<h4>{{ $t('search.no_results') }}</h4>
</div>
<Status
v-for="status in visibleStatuses"
:key="status.id"
:collapsable="false"
:expandable="false"
:compact="false"
class="search-result"
:statusoid="status"
:no-heading="false"
/>
</div>
<div v-else-if="currenResultTab === 'people'">
<div
v-if="users.length === 0 && !loading && loaded"
class="search-result-heading"
>
<h4>{{ $t('search.no_results') }}</h4>
</div>
<FollowCard
v-for="user in users"
:key="user.id"
:user="user"
class="list-item search-result"
/>
</div>
<div v-else-if="currenResultTab === 'hashtags'">
<div
v-if="hashtags.length === 0 && !loading && loaded"
class="search-result-heading"
>
<h4>{{ $t('search.no_results') }}</h4>
</div>
<div
v-for="hashtag in hashtags"
:key="hashtag.url"
class="status trend search-result"
>
<div class="hashtag">
<router-link :to="{ name: 'tag-timeline', params: { tag: hashtag.name } }">
#{{ hashtag.name }}
</router-link>
<div v-if="lastHistoryRecord(hashtag)">
<span v-if="lastHistoryRecord(hashtag).accounts == 1">
{{ $t('search.person_talking', { count: lastHistoryRecord(hashtag).accounts }) }}
</span>
<span v-else>
{{ $t('search.people_talking', { count: lastHistoryRecord(hashtag).accounts }) }}
</span>
</div>
</div>
<div
v-if="lastHistoryRecord(hashtag)"
class="count"
>
{{ lastHistoryRecord(hashtag).uses }}
</div>
</div>
</div>
</div>
<div class="search-result-footer text-center panel-footer faint" />
</div>
</template>
<script src="./search.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.search-result-heading {
color: $fallback--faint;
color: var(--faint, $fallback--faint);
padding: 0.75rem;
text-align: center;
}
@media all and (max-width: 800px) {
.search-nav-heading {
.tab-switcher .tabs .tab-wrapper {
display: block;
justify-content: center;
flex: 1 1 auto;
text-align: center;
}
}
}
.search-result {
box-sizing: border-box;
border-bottom: 1px solid;
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
}
.search-result-footer {
border-width: 1px 0 0 0;
border-style: solid;
border-color: var(--border, $fallback--border);
padding: 10px;
background-color: $fallback--fg;
background-color: var(--panel, $fallback--fg);
}
.search-input-container {
padding: 0.8rem;
display: flex;
justify-content: center;
.search-input {
width: 100%;
line-height: 1.125rem;
font-size: 1rem;
padding: 0.5rem;
box-sizing: border-box;
}
.search-button {
margin-left: 0.5em;
}
}
.loading-icon {
padding: 1em;
}
.trend {
display: flex;
align-items: center;
.hashtag {
flex: 1 1 auto;
color: $fallback--text;
color: var(--text, $fallback--text);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.count {
flex: 0 0 auto;
width: 2rem;
font-size: 1.5rem;
line-height: 2.25rem;
font-weight: 500;
text-align: center;
color: $fallback--text;
color: var(--text, $fallback--text);
}
}
</style>
diff --git a/src/components/search_bar/search_bar.vue b/src/components/search_bar/search_bar.vue
index 89a601c8a1..6cf9179e05 100644
--- a/src/components/search_bar/search_bar.vue
+++ b/src/components/search_bar/search_bar.vue
@@ -1,79 +1,85 @@
<template>
<div
class="SearchBar"
:class="{ '-expanded': !hidden }"
>
- <a
+ <button
v-if="hidden"
- href="#"
- class="nav-icon"
+ class="button-unstyled nav-icon"
:title="$t('nav.search')"
- ><FAIcon
- fixed-width
- class="fa-scale-110 fa-old-padding"
- icon="search"
@click.prevent.stop="toggleHidden"
- /></a>
+ >
+ <FAIcon
+ fixed-width
+ class="fa-scale-110 fa-old-padding"
+ 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="btn search-button"
+ class="button-default search-button"
@click="find(searchTerm)"
>
<FAIcon
fixed-width
icon="search"
/>
</button>
- <span>
+ <button
+ class="button-unstyled cancel-search"
+ @click.prevent.stop="toggleHidden"
+ >
<FAIcon
fixed-width
icon="times"
class="cancel-icon fa-scale-110 fa-old-padding"
- @click.prevent.stop="toggleHidden"
/>
- </span>
+ </button>
</template>
</div>
</template>
<script src="./search_bar.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.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 {
flex: 1 0 auto;
}
+ .cancel-search {
+ height: 50px;
+ }
+
.cancel-icon {
- cursor: pointer;
color: $fallback--text;
color: var(--btnTopBarText, $fallback--text);
}
}
</style>
diff --git a/src/components/settings_modal/settings_modal.vue b/src/components/settings_modal/settings_modal.vue
index 6bc64ed0ed..552ca41f94 100644
--- a/src/components/settings_modal/settings_modal.vue
+++ b/src/components/settings_modal/settings_modal.vue
@@ -1,54 +1,54 @@
<template>
<Modal
:is-open="modalActivated"
class="settings-modal"
:class="{ peek: modalPeeked }"
:no-background="modalPeeked"
>
<div class="settings-modal-panel panel">
<div class="panel-heading">
<span class="title">
{{ $t('settings.settings') }}
</span>
<transition name="fade">
<template v-if="currentSaveStateNotice">
<div
v-if="currentSaveStateNotice.error"
class="alert error"
@click.prevent
>
{{ $t('settings.saving_err') }}
</div>
<div
v-if="!currentSaveStateNotice.error"
class="alert transparent"
@click.prevent
>
{{ $t('settings.saving_ok') }}
</div>
</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') }}
</button>
</div>
<div class="panel-body">
<SettingsModalContent v-if="modalOpenedOnce" />
</div>
</div>
</Modal>
</template>
<script src="./settings_modal.js"></script>
<style src="./settings_modal.scss" lang="scss"></style>
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 5a1cf2c063..63d36bf9a2 100644
--- a/src/components/settings_modal/tabs/mutes_and_blocks_tab.vue
+++ b/src/components/settings_modal/tabs/mutes_and_blocks_tab.vue
@@ -1,171 +1,171 @@
<template>
<tab-switcher
:scrollable-tabs="true"
class="mutes-and-blocks-tab"
>
<div :label="$t('settings.blocks_tab')">
<div class="usersearch-wrapper">
<Autosuggest
:filter="filterUnblockedUsers"
:query="queryUserIds"
:placeholder="$t('settings.search_user_to_block')"
>
<BlockCard
slot-scope="row"
:user-id="row.item"
/>
</Autosuggest>
</div>
<BlockList
:refresh="true"
:get-key="i => i"
>
<template
slot="header"
slot-scope="{selected}"
>
<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') }}
<template slot="progress">
{{ $t('user_card.block_progress') }}
</template>
</ProgressButton>
<ProgressButton
v-if="selected.length > 0"
- class="btn btn-default"
+ class="btn button-default"
:click="() => unblockUsers(selected)"
>
{{ $t('user_card.unblock') }}
<template slot="progress">
{{ $t('user_card.unblock_progress') }}
</template>
</ProgressButton>
</div>
</template>
<template
slot="item"
slot-scope="{item}"
>
<BlockCard :user-id="item" />
</template>
<template slot="empty">
{{ $t('settings.no_blocks') }}
</template>
</BlockList>
</div>
<div :label="$t('settings.mutes_tab')">
<tab-switcher>
<div label="Users">
<div class="usersearch-wrapper">
<Autosuggest
:filter="filterUnMutedUsers"
:query="queryUserIds"
:placeholder="$t('settings.search_user_to_mute')"
>
<MuteCard
slot-scope="row"
:user-id="row.item"
/>
</Autosuggest>
</div>
<MuteList
:refresh="true"
:get-key="i => i"
>
<template
slot="header"
slot-scope="{selected}"
>
<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') }}
<template slot="progress">
{{ $t('user_card.mute_progress') }}
</template>
</ProgressButton>
<ProgressButton
v-if="selected.length > 0"
- class="btn btn-default"
+ class="btn button-default"
:click="() => unmuteUsers(selected)"
>
{{ $t('user_card.unmute') }}
<template slot="progress">
{{ $t('user_card.unmute_progress') }}
</template>
</ProgressButton>
</div>
</template>
<template
slot="item"
slot-scope="{item}"
>
<MuteCard :user-id="item" />
</template>
<template slot="empty">
{{ $t('settings.no_mutes') }}
</template>
</MuteList>
</div>
<div :label="$t('settings.domain_mutes')">
<div class="domain-mute-form">
<Autosuggest
:filter="filterUnMutedDomains"
:query="queryKnownDomains"
:placeholder="$t('settings.type_domains_to_mute')"
>
<DomainMuteCard
slot-scope="row"
:domain="row.item"
/>
</Autosuggest>
</div>
<DomainMuteList
:refresh="true"
:get-key="i => i"
>
<template
slot="header"
slot-scope="{selected}"
>
<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') }}
<template slot="progress">
{{ $t('domain_mute_card.unmute_progress') }}
</template>
</ProgressButton>
</div>
</template>
<template
slot="item"
slot-scope="{item}"
>
<DomainMuteCard :domain="item" />
</template>
<template slot="empty">
{{ $t('settings.no_mutes') }}
</template>
</DomainMuteList>
</div>
</tab-switcher>
</div>
</tab-switcher>
</template>
<script src="./mutes_and_blocks_tab.js"></script>
<style lang="scss" src="./mutes_and_blocks_tab.scss"></style>
diff --git a/src/components/settings_modal/tabs/notifications_tab.vue b/src/components/settings_modal/tabs/notifications_tab.vue
index 86eed3f5df..8f8fe48e1a 100644
--- a/src/components/settings_modal/tabs/notifications_tab.vue
+++ b/src/components/settings_modal/tabs/notifications_tab.vue
@@ -1,34 +1,34 @@
<template>
<div :label="$t('settings.notifications')">
<div class="setting-item">
<h2>{{ $t('settings.notification_setting_filters') }}</h2>
<p>
<Checkbox v-model="notificationSettings.block_from_strangers">
{{ $t('settings.notification_setting_block_from_strangers') }}
</Checkbox>
</p>
</div>
<div class="setting-item">
<h2>{{ $t('settings.notification_setting_privacy') }}</h2>
<p>
<Checkbox v-model="notificationSettings.hide_notification_contents">
{{ $t('settings.notification_setting_hide_notification_contents') }}
</Checkbox>
</p>
</div>
<div class="setting-item">
<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') }}
</button>
</div>
</div>
</template>
<script src="./notifications_tab.js"></script>
<!-- <style lang="scss" src="./profile.scss"></style> -->
diff --git a/src/components/settings_modal/tabs/profile_tab.js b/src/components/settings_modal/tabs/profile_tab.js
index a3e4feafcb..a4fed6294f 100644
--- a/src/components/settings_modal/tabs/profile_tab.js
+++ b/src/components/settings_modal/tabs/profile_tab.js
@@ -1,265 +1,261 @@
import unescape from 'lodash/unescape'
import merge from 'lodash/merge'
import ImageCropper from 'src/components/image_cropper/image_cropper.vue'
import ScopeSelector from 'src/components/scope_selector/scope_selector.vue'
import fileSizeFormatService from 'src/components/../services/file_size_format/file_size_format.js'
import ProgressButton from 'src/components/progress_button/progress_button.vue'
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 () {
return {
newName: this.$store.state.users.currentUser.name,
newBio: unescape(this.$store.state.users.currentUser.description),
newLocked: this.$store.state.users.currentUser.locked,
newNoRichText: this.$store.state.users.currentUser.no_rich_text,
newDefaultScope: this.$store.state.users.currentUser.default_scope,
newFields: this.$store.state.users.currentUser.fields.map(field => ({ name: field.name, value: field.value })),
hideFollows: this.$store.state.users.currentUser.hide_follows,
hideFollowers: this.$store.state.users.currentUser.hide_followers,
hideFollowsCount: this.$store.state.users.currentUser.hide_follows_count,
hideFollowersCount: this.$store.state.users.currentUser.hide_followers_count,
showRole: this.$store.state.users.currentUser.show_role,
role: this.$store.state.users.currentUser.role,
discoverable: this.$store.state.users.currentUser.discoverable,
bot: this.$store.state.users.currentUser.bot,
allowFollowingMove: this.$store.state.users.currentUser.allow_following_move,
pickAvatarBtnVisible: true,
bannerUploading: false,
backgroundUploading: false,
banner: null,
bannerPreview: null,
background: null,
backgroundPreview: null,
bannerUploadError: null,
backgroundUploadError: null
}
},
components: {
ScopeSelector,
ImageCropper,
EmojiInput,
Autosuggest,
ProgressButton,
Checkbox
},
computed: {
user () {
return this.$store.state.users.currentUser
},
emojiUserSuggestor () {
return suggestor({
emoji: [
...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 () {
return suggestor({ emoji: [
...this.$store.state.instance.emoji,
...this.$store.state.instance.customEmoji
] })
},
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
},
maxFields () {
return this.fieldsLimits ? this.fieldsLimits.maxFields : 0
},
defaultAvatar () {
return this.$store.state.instance.server + this.$store.state.instance.defaultAvatar
},
defaultBanner () {
return this.$store.state.instance.server + this.$store.state.instance.defaultBanner
},
isDefaultAvatar () {
const baseAvatar = this.$store.state.instance.defaultAvatar
return !(this.$store.state.users.currentUser.profile_image_url) ||
this.$store.state.users.currentUser.profile_image_url.includes(baseAvatar)
},
isDefaultBanner () {
const baseBanner = this.$store.state.instance.defaultBanner
return !(this.$store.state.users.currentUser.cover_photo) ||
this.$store.state.users.currentUser.cover_photo.includes(baseBanner)
},
isDefaultBackground () {
return !(this.$store.state.users.currentUser.background_image)
},
avatarImgSrc () {
const src = this.$store.state.users.currentUser.profile_image_url_original
return (!src) ? this.defaultAvatar : src
},
bannerImgSrc () {
const src = this.$store.state.users.currentUser.cover_photo
return (!src) ? this.defaultBanner : src
}
},
methods: {
updateProfile () {
this.$store.state.api.backendInteractor
.updateProfile({
params: {
note: this.newBio,
locked: this.newLocked,
// Backend notation.
/* eslint-disable camelcase */
display_name: this.newName,
fields_attributes: this.newFields.filter(el => el != null),
default_scope: this.newDefaultScope,
no_rich_text: this.newNoRichText,
hide_follows: this.hideFollows,
hide_followers: this.hideFollowers,
discoverable: this.discoverable,
bot: this.bot,
allow_following_move: this.allowFollowingMove,
hide_follows_count: this.hideFollowsCount,
hide_followers_count: this.hideFollowersCount,
show_role: this.showRole
/* eslint-enable camelcase */
} }).then((user) => {
this.newFields.splice(user.fields.length)
merge(this.newFields, user.fields)
this.$store.commit('addNewUsers', [user])
this.$store.commit('setCurrentUser', user)
})
},
changeVis (visibility) {
this.newDefaultScope = visibility
},
addField () {
if (this.newFields.length < this.maxFields) {
this.newFields.push({ name: '', value: '' })
return true
}
return false
},
deleteField (index, event) {
this.$delete(this.newFields, index)
},
uploadFile (slot, e) {
const file = e.target.files[0]
if (!file) { return }
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',
{
filesize: filesize.num,
filesizeunit: filesize.unit,
allowedsize: allowedsize.num,
allowedsizeunit: allowedsize.unit
}
)
].join(' ')
return
}
// eslint-disable-next-line no-undef
const reader = new FileReader()
reader.onload = ({ target }) => {
const img = target.result
this[slot + 'Preview'] = img
this[slot] = file
}
reader.readAsDataURL(file)
},
resetAvatar () {
const confirmed = window.confirm(this.$t('settings.reset_avatar_confirm'))
if (confirmed) {
this.submitAvatar(undefined, '')
}
},
resetBanner () {
const confirmed = window.confirm(this.$t('settings.reset_banner_confirm'))
if (confirmed) {
this.submitBanner('')
}
},
resetBackground () {
const confirmed = window.confirm(this.$t('settings.reset_background_confirm'))
if (confirmed) {
this.submitBackground('')
}
},
submitAvatar (cropper, file) {
const that = this
return new Promise((resolve, reject) => {
function updateAvatar (avatar) {
that.$store.state.api.backendInteractor.updateProfileImages({ avatar })
.then((user) => {
that.$store.commit('addNewUsers', [user])
that.$store.commit('setCurrentUser', user)
resolve()
})
.catch((err) => {
reject(new Error(that.$t('upload.error.base') + ' ' + err.message))
})
}
if (cropper) {
cropper.getCroppedCanvas().toBlob(updateAvatar, file.type)
} else {
updateAvatar(file)
}
})
},
submitBanner (banner) {
if (!this.bannerPreview && banner !== '') { return }
this.bannerUploading = true
this.$store.state.api.backendInteractor.updateProfileImages({ banner })
.then((user) => {
this.$store.commit('addNewUsers', [user])
this.$store.commit('setCurrentUser', user)
this.bannerPreview = null
})
.catch((err) => {
this.bannerUploadError = this.$t('upload.error.base') + ' ' + err.message
})
.then(() => { 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.commit('addNewUsers', [data])
this.$store.commit('setCurrentUser', data)
this.backgroundPreview = null
} else {
this.backgroundUploadError = this.$t('upload.error.base') + data.error
}
this.backgroundUploading = false
})
}
}
}
export default ProfileTab
diff --git a/src/components/settings_modal/tabs/profile_tab.vue b/src/components/settings_modal/tabs/profile_tab.vue
index d62bc39253..50d3ee6301 100644
--- a/src/components/settings_modal/tabs/profile_tab.vue
+++ b/src/components/settings_modal/tabs/profile_tab.vue
@@ -1,299 +1,299 @@
<template>
<div class="profile-tab">
<div class="setting-item">
<h2>{{ $t('settings.name_bio') }}</h2>
<p>{{ $t('settings.name') }}</p>
<EmojiInput
v-model="newName"
enable-emoji-picker
:suggest="emojiSuggestor"
>
<input
id="username"
v-model="newName"
classname="name-changer"
>
</EmojiInput>
<p>{{ $t('settings.bio') }}</p>
<EmojiInput
v-model="newBio"
enable-emoji-picker
:suggest="emojiUserSuggestor"
>
<textarea
v-model="newBio"
classname="bio"
/>
</EmojiInput>
<p>
<Checkbox v-model="newLocked">
{{ $t('settings.lock_account_description') }}
</Checkbox>
</p>
<div>
<label for="default-vis">{{ $t('settings.default_vis') }}</label>
<div
id="default-vis"
class="visibility-tray"
>
<scope-selector
:show-all="true"
:user-default="newDefaultScope"
:initial-scope="newDefaultScope"
:on-scope-change="changeVis"
/>
</div>
</div>
<p>
<Checkbox v-model="newNoRichText">
{{ $t('settings.no_rich_text_description') }}
</Checkbox>
</p>
<p>
<Checkbox v-model="hideFollows">
{{ $t('settings.hide_follows_description') }}
</Checkbox>
</p>
<p class="setting-subitem">
<Checkbox
v-model="hideFollowsCount"
:disabled="!hideFollows"
>
{{ $t('settings.hide_follows_count_description') }}
</Checkbox>
</p>
<p>
<Checkbox v-model="hideFollowers">
{{ $t('settings.hide_followers_description') }}
</Checkbox>
</p>
<p class="setting-subitem">
<Checkbox
v-model="hideFollowersCount"
:disabled="!hideFollowers"
>
{{ $t('settings.hide_followers_count_description') }}
</Checkbox>
</p>
<p>
<Checkbox v-model="allowFollowingMove">
{{ $t('settings.allow_following_move') }}
</Checkbox>
</p>
<p v-if="role === 'admin' || role === 'moderator'">
<Checkbox v-model="showRole">
<template v-if="role === 'admin'">
{{ $t('settings.show_admin_badge') }}
</template>
<template v-if="role === 'moderator'">
{{ $t('settings.show_moderator_badge') }}
</template>
</Checkbox>
</p>
<p>
<Checkbox v-model="discoverable">
{{ $t('settings.discoverable') }}
</Checkbox>
</p>
<div v-if="maxFields > 0">
<p>{{ $t('settings.profile_fields.label') }}</p>
<div
v-for="(_, i) in newFields"
:key="i"
class="profile-fields"
>
<EmojiInput
v-model="newFields[i].name"
enable-emoji-picker
hide-emoji-button
:suggest="userSuggestor"
>
<input
v-model="newFields[i].name"
:placeholder="$t('settings.profile_fields.name')"
>
</EmojiInput>
<EmojiInput
v-model="newFields[i].value"
enable-emoji-picker
hide-emoji-button
:suggest="userSuggestor"
>
<input
v-model="newFields[i].value"
:placeholder="$t('settings.profile_fields.value')"
>
</EmojiInput>
<div
class="icon-container"
>
<FAIcon
v-show="newFields.length > 1"
icon="times"
@click="deleteField(i)"
/>
</div>
</div>
<a
v-if="newFields.length < maxFields"
class="add-field faint"
@click="addField"
>
<FAIcon icon="plus" />
{{ $t("settings.profile_fields.add_field") }}
</a>
</div>
<p>
<Checkbox v-model="bot">
{{ $t('settings.bot') }}
</Checkbox>
</p>
<button
:disabled="newName && newName.length === 0"
- class="btn btn-default"
+ class="btn button-default"
@click="updateProfile"
>
{{ $t('general.submit') }}
</button>
</div>
<div class="setting-item">
<h2>{{ $t('settings.avatar') }}</h2>
<p class="visibility-notice">
{{ $t('settings.avatar_size_instruction') }}
</p>
<div class="current-avatar-container">
<img
:src="user.profile_image_url_original"
class="current-avatar"
>
<FAIcon
v-if="!isDefaultAvatar && pickAvatarBtnVisible"
:title="$t('settings.reset_avatar')"
class="reset-button"
icon="times"
type="button"
@click="resetAvatar"
/>
</div>
<p>{{ $t('settings.set_new_avatar') }}</p>
<button
v-show="pickAvatarBtnVisible"
id="pick-avatar"
- class="btn"
+ class="button-default btn"
type="button"
>
{{ $t('settings.upload_a_photo') }}
</button>
<image-cropper
trigger="#pick-avatar"
:submit-handler="submitAvatar"
@open="pickAvatarBtnVisible=false"
@close="pickAvatarBtnVisible=true"
/>
</div>
<div class="setting-item">
<h2>{{ $t('settings.profile_banner') }}</h2>
<div class="banner-background-preview">
<img :src="user.cover_photo">
<FAIcon
v-if="!isDefaultBanner"
:title="$t('settings.reset_profile_banner')"
class="reset-button"
icon="times"
type="button"
@click="resetBanner"
/>
</div>
<p>{{ $t('settings.set_new_profile_banner') }}</p>
<img
v-if="bannerPreview"
class="banner-background-preview"
:src="bannerPreview"
>
<div>
<input
type="file"
@change="uploadFile('banner', $event)"
>
</div>
<FAIcon
v-if="bannerUploading"
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 }}
<FAIcon
class="fa-scale-110 fa-old-padding"
icon="times"
@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">
<FAIcon
v-if="!isDefaultBackground"
:title="$t('settings.reset_profile_background')"
class="reset-button"
icon="times"
type="button"
@click="resetBackground"
/>
</div>
<p>{{ $t('settings.set_new_profile_background') }}</p>
<img
v-if="backgroundPreview"
class="banner-background-preview"
:src="backgroundPreview"
>
<div>
<input
type="file"
@change="uploadFile('background', $event)"
>
</div>
<FAIcon
v-if="backgroundUploading"
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 }}
<FAIcon
size="lg"
class="fa-scale-110 fa-old-padding"
icon="times"
@click="clearUploadError('background')"
/>
</div>
</div>
</div>
</template>
<script src="./profile_tab.js"></script>
<style lang="scss" src="./profile_tab.scss"></style>
diff --git a/src/components/settings_modal/tabs/security_tab/confirm.vue b/src/components/settings_modal/tabs/security_tab/confirm.vue
index 69b3811b33..38c2a6101f 100644
--- a/src/components/settings_modal/tabs/security_tab/confirm.vue
+++ b/src/components/settings_modal/tabs/security_tab/confirm.vue
@@ -1,22 +1,22 @@
<template>
<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"
>
{{ $t('general.cancel') }}
</button>
</div>
</template>
<script src="./confirm.js">
</script>
diff --git a/src/components/settings_modal/tabs/security_tab/mfa.vue b/src/components/settings_modal/tabs/security_tab/mfa.vue
index 7aca3c8de3..455d17b6a7 100644
--- a/src/components/settings_modal/tabs/security_tab/mfa.vue
+++ b/src/components/settings_modal/tabs/security_tab/mfa.vue
@@ -1,173 +1,173 @@
<template>
<div
v-if="readyInit && settings.available"
class="setting-item mfa-settings"
>
<div class="mfa-heading">
<h2>{{ $t('settings.mfa.title') }}</h2>
</div>
<div>
<div
v-if="!setupInProgress"
class="setting-item"
>
<!-- Enabled methods -->
<h3>{{ $t('settings.mfa.authentication_methods') }}</h3>
<totp-item
:settings="settings"
@deactivate="fetchSettings"
@activate="activateOTP"
/>
<br>
<div v-if="settings.enabled">
<!-- backup codes block-->
<recovery-codes
v-if="!confirmNewBackupCodes"
:backup-codes="backupCodes"
/>
<button
v-if="!confirmNewBackupCodes"
- class="btn btn-default"
+ class="btn button-default"
@click="getBackupCodes"
>
{{ $t('settings.mfa.generate_new_recovery_codes') }}
</button>
<div v-if="confirmNewBackupCodes">
<confirm
:disabled="backupCodes.inProgress"
@confirm="confirmBackupCodes"
@cancel="cancelBackupCodes"
>
<p class="warning">
{{ $t('settings.mfa.warning_of_generate_new_codes') }}
</p>
</confirm>
</div>
</div>
</div>
<div v-if="setupInProgress">
<!-- setup block-->
<h3>{{ $t('settings.mfa.setup_otp') }}</h3>
<recovery-codes
v-if="!setupOTPInProgress"
:backup-codes="backupCodes"
/>
<button
v-if="canSetupOTP"
- class="btn btn-default"
+ class="btn button-default"
@click="cancelSetup"
>
{{ $t('general.cancel') }}
</button>
<button
v-if="canSetupOTP"
- class="btn btn-default"
+ class="btn button-default"
@click="setupOTP"
>
{{ $t('settings.mfa.setup_otp') }}
</button>
<template v-if="setupOTPInProgress">
<i v-if="prepareOTP">{{ $t('settings.mfa.wait_pre_setup_otp') }}</i>
<div v-if="confirmOTP">
<div class="setup-otp">
<div class="qr-code">
<h4>{{ $t('settings.mfa.scan.title') }}</h4>
<p>{{ $t('settings.mfa.scan.desc') }}</p>
<qrcode
:value="otpSettings.provisioning_uri"
:options="{ width: 200 }"
/>
<p>
{{ $t('settings.mfa.scan.secret_code') }}:
{{ otpSettings.key }}
</p>
</div>
<div class="verify">
<h4>{{ $t('general.verify') }}</h4>
<p>{{ $t('settings.mfa.verify.desc') }}</p>
<input
v-model="otpConfirmToken"
type="text"
>
<p>{{ $t('settings.enter_current_password_to_confirm') }}:</p>
<input
v-model="currentPassword"
type="password"
>
<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') }}
</button>
</div>
<div
v-if="error"
class="alert error"
>
{{ error }}
</div>
</div>
</div>
</div>
</template>
</div>
</div>
</div>
</template>
<script src="./mfa.js"></script>
<style lang="scss">
@import '../../../../_variables.scss';
.mfa-settings {
.mfa-heading, .method-item {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: baseline;
}
.warning {
color: $fallback--cOrange;
color: var(--cOrange, $fallback--cOrange);
}
.setup-otp {
display: flex;
justify-content: center;
flex-wrap: wrap;
.qr-code {
flex: 1;
padding-right: 10px;
}
.verify { flex: 1; }
.error { margin: 4px 0 0 0; }
.confirm-otp-actions {
button {
width: 15em;
margin-top: 5px;
}
}
}
}
</style>
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 c6f2cc7b84..8e767bd027 100644
--- a/src/components/settings_modal/tabs/security_tab/mfa_totp.vue
+++ b/src/components/settings_modal/tabs/security_tab/mfa_totp.vue
@@ -1,43 +1,43 @@
<template>
<div>
<div class="method-item">
<strong>{{ $t('settings.mfa.otp') }}</strong>
<button
v-if="!isActivated"
- class="btn btn-default"
+ class="btn button-default"
@click="doActivate"
>
{{ $t('general.enable') }}
</button>
<button
v-if="isActivated"
- class="btn btn-default"
+ class="btn button-default"
:disabled="deactivate"
@click="doDeactivate"
>
{{ $t('general.disable') }}
</button>
</div>
<confirm
v-if="deactivate"
:disabled="inProgress"
@confirm="confirmDeactivate"
@cancel="cancelDeactivate"
>
{{ $t('settings.enter_current_password_to_confirm') }}:
<input
v-model="currentPassword"
type="password"
>
</confirm>
<div
v-if="error"
class="alert error"
>
{{ error }}
</div>
</div>
</template>
<script src="./mfa_totp.js"></script>
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 3d32d73d96..56bea1f466 100644
--- a/src/components/settings_modal/tabs/security_tab/security_tab.vue
+++ b/src/components/settings_modal/tabs/security_tab/security_tab.vue
@@ -1,143 +1,143 @@
<template>
<div :label="$t('settings.security_tab')">
<div class="setting-item">
<h2>{{ $t('settings.change_email') }}</h2>
<div>
<p>{{ $t('settings.new_email') }}</p>
<input
v-model="newEmail"
type="email"
autocomplete="email"
>
</div>
<div>
<p>{{ $t('settings.current_password') }}</p>
<input
v-model="changeEmailPassword"
type="password"
autocomplete="current-password"
>
</div>
<button
- class="btn btn-default"
+ class="btn button-default"
@click="changeEmail"
>
{{ $t('general.submit') }}
</button>
<p v-if="changedEmail">
{{ $t('settings.changed_email') }}
</p>
<template v-if="changeEmailError !== false">
<p>{{ $t('settings.change_email_error') }}</p>
<p>{{ changeEmailError }}</p>
</template>
</div>
<div class="setting-item">
<h2>{{ $t('settings.change_password') }}</h2>
<div>
<p>{{ $t('settings.current_password') }}</p>
<input
v-model="changePasswordInputs[0]"
type="password"
>
</div>
<div>
<p>{{ $t('settings.new_password') }}</p>
<input
v-model="changePasswordInputs[1]"
type="password"
>
</div>
<div>
<p>{{ $t('settings.confirm_new_password') }}</p>
<input
v-model="changePasswordInputs[2]"
type="password"
>
</div>
<button
- class="btn btn-default"
+ class="btn button-default"
@click="changePassword"
>
{{ $t('general.submit') }}
</button>
<p v-if="changedPassword">
{{ $t('settings.changed_password') }}
</p>
<p v-else-if="changePasswordError !== false">
{{ $t('settings.change_password_error') }}
</p>
<p v-if="changePasswordError">
{{ changePasswordError }}
</p>
</div>
<div class="setting-item">
<h2>{{ $t('settings.oauth_tokens') }}</h2>
<table class="oauth-tokens">
<thead>
<tr>
<th>{{ $t('settings.app_name') }}</th>
<th>{{ $t('settings.valid_until') }}</th>
<th />
</tr>
</thead>
<tbody>
<tr
v-for="oauthToken in oauthTokens"
:key="oauthToken.id"
>
<td>{{ oauthToken.appName }}</td>
<td>{{ oauthToken.validUntil }}</td>
<td class="actions">
<button
- class="btn btn-default"
+ class="btn button-default"
@click="revokeToken(oauthToken.id)"
>
{{ $t('settings.revoke_token') }}
</button>
</td>
</tr>
</tbody>
</table>
</div>
<mfa />
<div class="setting-item">
<h2>{{ $t('settings.delete_account') }}</h2>
<p v-if="!deletingAccount">
{{ $t('settings.delete_account_description') }}
</p>
<div v-if="deletingAccount">
<p>{{ $t('settings.delete_account_instructions') }}</p>
<p>{{ $t('login.password') }}</p>
<input
v-model="deleteAccountConfirmPasswordInput"
type="password"
>
<button
- class="btn btn-default"
+ class="btn button-default"
@click="deleteAccount"
>
{{ $t('settings.delete_account') }}
</button>
</div>
<p v-if="deleteAccountError !== false">
{{ $t('settings.delete_account_error') }}
</p>
<p v-if="deleteAccountError">
{{ deleteAccountError }}
</p>
<button
v-if="!deletingAccount"
- class="btn btn-default"
+ class="btn button-default"
@click="confirmDelete"
>
{{ $t('general.submit') }}
</button>
</div>
</div>
</template>
<script src="./security_tab.js"></script>
<!-- <style lang="scss" src="./profile.scss"></style> -->
diff --git a/src/components/settings_modal/tabs/theme_tab/preview.vue b/src/components/settings_modal/tabs/theme_tab/preview.vue
index 02fea0b6aa..7ac7b9d3ff 100644
--- a/src/components/settings_modal/tabs/theme_tab/preview.vue
+++ b/src/components/settings_modal/tabs/theme_tab/preview.vue
@@ -1,144 +1,144 @@
<template>
<div class="preview-container">
<div class="underlay underlay-preview" />
<div class="panel dummy">
<div class="panel-heading">
<div class="title">
{{ $t('settings.style.preview.header') }}
<span class="badge badge-notification">
99
</span>
</div>
<span class="faint">
{{ $t('settings.style.preview.header_faint') }}
</span>
<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>
<div class="panel-body theme-preview-content">
<div class="post">
<div class="avatar still-image">
( ͡° ͜ʖ ͡°)
</div>
<div class="content">
<h4>
{{ $t('settings.style.preview.content') }}
</h4>
<i18n path="settings.style.preview.text">
<code style="font-family: var(--postCodeFont)">
{{ $t('settings.style.preview.mono') }}
</code>
<a style="color: var(--link)">
{{ $t('settings.style.preview.link') }}
</a>
</i18n>
<div class="icons">
<FAIcon
fixed-width
style="color: var(--cBlue)"
class="fa-scale-110 fa-old-padding"
icon="reply"
/>
<FAIcon
fixed-width
style="color: var(--cGreen)"
class="fa-scale-110 fa-old-padding"
icon="retweet"
/>
<FAIcon
fixed-width
style="color: var(--cOrange)"
class="fa-scale-110 fa-old-padding"
icon="star"
/>
<FAIcon
fixed-width
style="color: var(--cRed)"
class="fa-scale-110 fa-old-padding"
icon="times"
/>
</div>
</div>
</div>
<div class="after-post">
<div class="avatar-alt">
:^)
</div>
<div class="content">
<i18n
path="settings.style.preview.fine_print"
tag="span"
class="faint"
>
<a style="color: var(--faintLink)">
{{ $t('settings.style.preview.faint_link') }}
</a>
</i18n>
</div>
</div>
<div class="separator" />
<span class="alert error">
{{ $t('settings.style.preview.error') }}
</span>
<input
:value="$t('settings.style.preview.input')"
type="text"
>
<div class="actions">
<span class="checkbox">
<input
id="preview_checkbox"
checked="very yes"
type="checkbox"
>
<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>
</div>
</div>
</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;
}
.underlay-preview {
position: absolute;
top: 0;
bottom: 0;
left: 10px;
right: 10px;
}
</style>
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 280e195577..4ab793d66c 100644
--- a/src/components/settings_modal/tabs/theme_tab/theme_tab.vue
+++ b/src/components/settings_modal/tabs/theme_tab/theme_tab.vue
@@ -1,1038 +1,1038 @@
<template>
<div class="theme-tab">
<div class="presets-container">
<div class="save-load">
<div
v-if="themeWarning"
class="theme-warning"
>
<div class="alert warning">
{{ themeWarningHelp }}
</div>
<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') }}
</button>
</template>
<template v-else-if="themeWarning.noActionsPossible">
<button
- class="btn"
+ class="btn button-default"
@click="dismissWarning"
>
{{ $t('general.dismiss') }}
</button>
</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') }}
</button>
</template>
</div>
</div>
<ExportImport
:export-object="exportedTheme"
:export-label="$t(&quot;settings.export_theme&quot;)"
:import-label="$t(&quot;settings.import_theme&quot;)"
:import-failed-text="$t(&quot;settings.invalid_theme_imported&quot;)"
:on-import="onImport"
:validator="importValidator"
>
<template slot="before">
<div class="presets">
{{ $t('settings.presets') }}
<label
for="preset-switcher"
class="select"
>
<select
id="preset-switcher"
v-model="selected"
class="preset-switcher"
>
<option
v-for="style in availableStyles"
:key="style.name"
:value="style"
:style="{
backgroundColor: style[1] || (style.theme || style.source).colors.bg,
color: style[3] || (style.theme || style.source).colors.text
}"
>
{{ style[0] || style.name }}
</option>
</select>
<FAIcon
class="select-down-icon"
icon="chevron-down"
/>
</label>
</div>
</template>
</ExportImport>
</div>
<div class="save-load-options">
<span class="keep-option">
<Checkbox v-model="keepColor">
{{ $t('settings.style.switcher.keep_color') }}
</Checkbox>
</span>
<span class="keep-option">
<Checkbox v-model="keepShadows">
{{ $t('settings.style.switcher.keep_shadows') }}
</Checkbox>
</span>
<span class="keep-option">
<Checkbox v-model="keepOpacity">
{{ $t('settings.style.switcher.keep_opacity') }}
</Checkbox>
</span>
<span class="keep-option">
<Checkbox v-model="keepRoundness">
{{ $t('settings.style.switcher.keep_roundness') }}
</Checkbox>
</span>
<span class="keep-option">
<Checkbox v-model="keepFonts">
{{ $t('settings.style.switcher.keep_fonts') }}
</Checkbox>
</span>
<p>{{ $t('settings.style.switcher.save_load_hint') }}</p>
</div>
</div>
<preview :style="previewRules" />
<keep-alive>
<tab-switcher key="style-tweak">
<div
:label="$t('settings.style.common_colors._tab_label')"
class="color-container"
>
<div class="tab-header">
<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') }}
</button>
</div>
</div>
<p>{{ $t('settings.theme_help_v2_1') }}</p>
<h4>{{ $t('settings.style.common_colors.main') }}</h4>
<div class="color-item">
<ColorInput
v-model="bgColorLocal"
name="bgColor"
:label="$t('settings.background')"
/>
<OpacityInput
v-model="bgOpacityLocal"
name="bgOpacity"
:fallback="previewTheme.opacity.bg"
/>
<ColorInput
v-model="textColorLocal"
name="textColor"
:label="$t('settings.text')"
/>
<ContrastRatio :contrast="previewContrast.bgText" />
<ColorInput
v-model="accentColorLocal"
name="accentColor"
:fallback="previewTheme.colors.link"
:label="$t('settings.accent')"
:show-optional-tickbox="typeof linkColorLocal !== 'undefined'"
/>
<ColorInput
v-model="linkColorLocal"
name="linkColor"
:fallback="previewTheme.colors.accent"
:label="$t('settings.links')"
:show-optional-tickbox="typeof accentColorLocal !== 'undefined'"
/>
<ContrastRatio :contrast="previewContrast.bgLink" />
</div>
<div class="color-item">
<ColorInput
v-model="fgColorLocal"
name="fgColor"
:label="$t('settings.foreground')"
/>
<ColorInput
v-model="fgTextColorLocal"
name="fgTextColor"
:label="$t('settings.text')"
:fallback="previewTheme.colors.fgText"
/>
<ColorInput
v-model="fgLinkColorLocal"
name="fgLinkColor"
:label="$t('settings.links')"
:fallback="previewTheme.colors.fgLink"
/>
<p>{{ $t('settings.style.common_colors.foreground_hint') }}</p>
</div>
<h4>{{ $t('settings.style.common_colors.rgbo') }}</h4>
<div class="color-item">
<ColorInput
v-model="cRedColorLocal"
name="cRedColor"
:label="$t('settings.cRed')"
/>
<ContrastRatio :contrast="previewContrast.bgCRed" />
<ColorInput
v-model="cBlueColorLocal"
name="cBlueColor"
:label="$t('settings.cBlue')"
/>
<ContrastRatio :contrast="previewContrast.bgCBlue" />
</div>
<div class="color-item">
<ColorInput
v-model="cGreenColorLocal"
name="cGreenColor"
:label="$t('settings.cGreen')"
/>
<ContrastRatio :contrast="previewContrast.bgCGreen" />
<ColorInput
v-model="cOrangeColorLocal"
name="cOrangeColor"
:label="$t('settings.cOrange')"
/>
<ContrastRatio :contrast="previewContrast.bgCOrange" />
</div>
<p>{{ $t('settings.theme_help_v2_2') }}</p>
</div>
<div
:label="$t('settings.style.advanced_colors._tab_label')"
class="color-container"
>
<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') }}
</button>
</div>
<div class="color-item">
<h4>{{ $t('settings.style.advanced_colors.post') }}</h4>
<ColorInput
v-model="postLinkColorLocal"
name="postLinkColor"
:fallback="previewTheme.colors.accent"
:label="$t('settings.links')"
/>
<ContrastRatio :contrast="previewContrast.postLink" />
<ColorInput
v-model="postGreentextColorLocal"
name="postGreentextColor"
:fallback="previewTheme.colors.cGreen"
:label="$t('settings.greentext')"
/>
<ContrastRatio :contrast="previewContrast.postGreentext" />
<h4>{{ $t('settings.style.advanced_colors.alert') }}</h4>
<ColorInput
v-model="alertErrorColorLocal"
name="alertError"
:label="$t('settings.style.advanced_colors.alert_error')"
:fallback="previewTheme.colors.alertError"
/>
<ColorInput
v-model="alertErrorTextColorLocal"
name="alertErrorText"
:label="$t('settings.text')"
:fallback="previewTheme.colors.alertErrorText"
/>
<ContrastRatio
:contrast="previewContrast.alertErrorText"
large
/>
<ColorInput
v-model="alertWarningColorLocal"
name="alertWarning"
:label="$t('settings.style.advanced_colors.alert_warning')"
:fallback="previewTheme.colors.alertWarning"
/>
<ColorInput
v-model="alertWarningTextColorLocal"
name="alertWarningText"
:label="$t('settings.text')"
:fallback="previewTheme.colors.alertWarningText"
/>
<ContrastRatio
:contrast="previewContrast.alertWarningText"
large
/>
<ColorInput
v-model="alertNeutralColorLocal"
name="alertNeutral"
:label="$t('settings.style.advanced_colors.alert_neutral')"
:fallback="previewTheme.colors.alertNeutral"
/>
<ColorInput
v-model="alertNeutralTextColorLocal"
name="alertNeutralText"
:label="$t('settings.text')"
:fallback="previewTheme.colors.alertNeutralText"
/>
<ContrastRatio
:contrast="previewContrast.alertNeutralText"
large
/>
<OpacityInput
v-model="alertOpacityLocal"
name="alertOpacity"
:fallback="previewTheme.opacity.alert"
/>
</div>
<div class="color-item">
<h4>{{ $t('settings.style.advanced_colors.badge') }}</h4>
<ColorInput
v-model="badgeNotificationColorLocal"
name="badgeNotification"
:label="$t('settings.style.advanced_colors.badge_notification')"
:fallback="previewTheme.colors.badgeNotification"
/>
<ColorInput
v-model="badgeNotificationTextColorLocal"
name="badgeNotificationText"
:label="$t('settings.text')"
:fallback="previewTheme.colors.badgeNotificationText"
/>
<ContrastRatio
:contrast="previewContrast.badgeNotificationText"
large
/>
</div>
<div class="color-item">
<h4>{{ $t('settings.style.advanced_colors.panel_header') }}</h4>
<ColorInput
v-model="panelColorLocal"
name="panelColor"
:fallback="previewTheme.colors.panel"
:label="$t('settings.background')"
/>
<OpacityInput
v-model="panelOpacityLocal"
name="panelOpacity"
:fallback="previewTheme.opacity.panel"
:disabled="panelColorLocal === 'transparent'"
/>
<ColorInput
v-model="panelTextColorLocal"
name="panelTextColor"
:fallback="previewTheme.colors.panelText"
:label="$t('settings.text')"
/>
<ContrastRatio
:contrast="previewContrast.panelText"
large
/>
<ColorInput
v-model="panelLinkColorLocal"
name="panelLinkColor"
:fallback="previewTheme.colors.panelLink"
:label="$t('settings.links')"
/>
<ContrastRatio
:contrast="previewContrast.panelLink"
large
/>
</div>
<div class="color-item">
<h4>{{ $t('settings.style.advanced_colors.top_bar') }}</h4>
<ColorInput
v-model="topBarColorLocal"
name="topBarColor"
:fallback="previewTheme.colors.topBar"
:label="$t('settings.background')"
/>
<ColorInput
v-model="topBarTextColorLocal"
name="topBarTextColor"
:fallback="previewTheme.colors.topBarText"
:label="$t('settings.text')"
/>
<ContrastRatio :contrast="previewContrast.topBarText" />
<ColorInput
v-model="topBarLinkColorLocal"
name="topBarLinkColor"
:fallback="previewTheme.colors.topBarLink"
:label="$t('settings.links')"
/>
<ContrastRatio :contrast="previewContrast.topBarLink" />
</div>
<div class="color-item">
<h4>{{ $t('settings.style.advanced_colors.inputs') }}</h4>
<ColorInput
v-model="inputColorLocal"
name="inputColor"
:fallback="previewTheme.colors.input"
:label="$t('settings.background')"
/>
<OpacityInput
v-model="inputOpacityLocal"
name="inputOpacity"
:fallback="previewTheme.opacity.input"
:disabled="inputColorLocal === 'transparent'"
/>
<ColorInput
v-model="inputTextColorLocal"
name="inputTextColor"
:fallback="previewTheme.colors.inputText"
:label="$t('settings.text')"
/>
<ContrastRatio :contrast="previewContrast.inputText" />
</div>
<div class="color-item">
<h4>{{ $t('settings.style.advanced_colors.buttons') }}</h4>
<ColorInput
v-model="btnColorLocal"
name="btnColor"
:fallback="previewTheme.colors.btn"
:label="$t('settings.background')"
/>
<OpacityInput
v-model="btnOpacityLocal"
name="btnOpacity"
:fallback="previewTheme.opacity.btn"
:disabled="btnColorLocal === 'transparent'"
/>
<ColorInput
v-model="btnTextColorLocal"
name="btnTextColor"
:fallback="previewTheme.colors.btnText"
:label="$t('settings.text')"
/>
<ContrastRatio :contrast="previewContrast.btnText" />
<ColorInput
v-model="btnPanelTextColorLocal"
name="btnPanelTextColor"
:fallback="previewTheme.colors.btnPanelText"
:label="$t('settings.style.advanced_colors.panel_header')"
/>
<ContrastRatio :contrast="previewContrast.btnPanelText" />
<ColorInput
v-model="btnTopBarTextColorLocal"
name="btnTopBarTextColor"
:fallback="previewTheme.colors.btnTopBarText"
:label="$t('settings.style.advanced_colors.top_bar')"
/>
<ContrastRatio :contrast="previewContrast.btnTopBarText" />
<h5>{{ $t('settings.style.advanced_colors.pressed') }}</h5>
<ColorInput
v-model="btnPressedColorLocal"
name="btnPressedColor"
:fallback="previewTheme.colors.btnPressed"
:label="$t('settings.background')"
/>
<ColorInput
v-model="btnPressedTextColorLocal"
name="btnPressedTextColor"
:fallback="previewTheme.colors.btnPressedText"
:label="$t('settings.text')"
/>
<ContrastRatio :contrast="previewContrast.btnPressedText" />
<ColorInput
v-model="btnPressedPanelTextColorLocal"
name="btnPressedPanelTextColor"
:fallback="previewTheme.colors.btnPressedPanelText"
:label="$t('settings.style.advanced_colors.panel_header')"
/>
<ContrastRatio :contrast="previewContrast.btnPressedPanelText" />
<ColorInput
v-model="btnPressedTopBarTextColorLocal"
name="btnPressedTopBarTextColor"
:fallback="previewTheme.colors.btnPressedTopBarText"
:label="$t('settings.style.advanced_colors.top_bar')"
/>
<ContrastRatio :contrast="previewContrast.btnPressedTopBarText" />
<h5>{{ $t('settings.style.advanced_colors.disabled') }}</h5>
<ColorInput
v-model="btnDisabledColorLocal"
name="btnDisabledColor"
:fallback="previewTheme.colors.btnDisabled"
:label="$t('settings.background')"
/>
<ColorInput
v-model="btnDisabledTextColorLocal"
name="btnDisabledTextColor"
:fallback="previewTheme.colors.btnDisabledText"
:label="$t('settings.text')"
/>
<ColorInput
v-model="btnDisabledPanelTextColorLocal"
name="btnDisabledPanelTextColor"
:fallback="previewTheme.colors.btnDisabledPanelText"
:label="$t('settings.style.advanced_colors.panel_header')"
/>
<ColorInput
v-model="btnDisabledTopBarTextColorLocal"
name="btnDisabledTopBarTextColor"
:fallback="previewTheme.colors.btnDisabledTopBarText"
:label="$t('settings.style.advanced_colors.top_bar')"
/>
<h5>{{ $t('settings.style.advanced_colors.toggled') }}</h5>
<ColorInput
v-model="btnToggledColorLocal"
name="btnToggledColor"
:fallback="previewTheme.colors.btnToggled"
:label="$t('settings.background')"
/>
<ColorInput
v-model="btnToggledTextColorLocal"
name="btnToggledTextColor"
:fallback="previewTheme.colors.btnToggledText"
:label="$t('settings.text')"
/>
<ContrastRatio :contrast="previewContrast.btnToggledText" />
<ColorInput
v-model="btnToggledPanelTextColorLocal"
name="btnToggledPanelTextColor"
:fallback="previewTheme.colors.btnToggledPanelText"
:label="$t('settings.style.advanced_colors.panel_header')"
/>
<ContrastRatio :contrast="previewContrast.btnToggledPanelText" />
<ColorInput
v-model="btnToggledTopBarTextColorLocal"
name="btnToggledTopBarTextColor"
:fallback="previewTheme.colors.btnToggledTopBarText"
:label="$t('settings.style.advanced_colors.top_bar')"
/>
<ContrastRatio :contrast="previewContrast.btnToggledTopBarText" />
</div>
<div class="color-item">
<h4>{{ $t('settings.style.advanced_colors.tabs') }}</h4>
<ColorInput
v-model="tabColorLocal"
name="tabColor"
:fallback="previewTheme.colors.tab"
:label="$t('settings.background')"
/>
<ColorInput
v-model="tabTextColorLocal"
name="tabTextColor"
:fallback="previewTheme.colors.tabText"
:label="$t('settings.text')"
/>
<ContrastRatio :contrast="previewContrast.tabText" />
<ColorInput
v-model="tabActiveTextColorLocal"
name="tabActiveTextColor"
:fallback="previewTheme.colors.tabActiveText"
:label="$t('settings.text')"
/>
<ContrastRatio :contrast="previewContrast.tabActiveText" />
</div>
<div class="color-item">
<h4>{{ $t('settings.style.advanced_colors.borders') }}</h4>
<ColorInput
v-model="borderColorLocal"
name="borderColor"
:fallback="previewTheme.colors.border"
:label="$t('settings.style.common.color')"
/>
<OpacityInput
v-model="borderOpacityLocal"
name="borderOpacity"
:fallback="previewTheme.opacity.border"
:disabled="borderColorLocal === 'transparent'"
/>
</div>
<div class="color-item">
<h4>{{ $t('settings.style.advanced_colors.faint_text') }}</h4>
<ColorInput
v-model="faintColorLocal"
name="faintColor"
:fallback="previewTheme.colors.faint"
:label="$t('settings.text')"
/>
<ColorInput
v-model="faintLinkColorLocal"
name="faintLinkColor"
:fallback="previewTheme.colors.faintLink"
:label="$t('settings.links')"
/>
<ColorInput
v-model="panelFaintColorLocal"
name="panelFaintColor"
:fallback="previewTheme.colors.panelFaint"
:label="$t('settings.style.advanced_colors.panel_header')"
/>
<OpacityInput
v-model="faintOpacityLocal"
name="faintOpacity"
:fallback="previewTheme.opacity.faint"
/>
</div>
<div class="color-item">
<h4>{{ $t('settings.style.advanced_colors.underlay') }}</h4>
<ColorInput
v-model="underlayColorLocal"
name="underlay"
:label="$t('settings.style.advanced_colors.underlay')"
:fallback="previewTheme.colors.underlay"
/>
<OpacityInput
v-model="underlayOpacityLocal"
name="underlayOpacity"
:fallback="previewTheme.opacity.underlay"
:disabled="underlayOpacityLocal === 'transparent'"
/>
</div>
<div class="color-item">
<h4>{{ $t('settings.style.advanced_colors.poll') }}</h4>
<ColorInput
v-model="pollColorLocal"
name="poll"
:label="$t('settings.background')"
:fallback="previewTheme.colors.poll"
/>
<ColorInput
v-model="pollTextColorLocal"
name="pollText"
:label="$t('settings.text')"
:fallback="previewTheme.colors.pollText"
/>
</div>
<div class="color-item">
<h4>{{ $t('settings.style.advanced_colors.icons') }}</h4>
<ColorInput
v-model="iconColorLocal"
name="icon"
:label="$t('settings.style.advanced_colors.icons')"
:fallback="previewTheme.colors.icon"
/>
</div>
<div class="color-item">
<h4>{{ $t('settings.style.advanced_colors.highlight') }}</h4>
<ColorInput
v-model="highlightColorLocal"
name="highlight"
:label="$t('settings.background')"
:fallback="previewTheme.colors.highlight"
/>
<ColorInput
v-model="highlightTextColorLocal"
name="highlightText"
:label="$t('settings.text')"
:fallback="previewTheme.colors.highlightText"
/>
<ContrastRatio :contrast="previewContrast.highlightText" />
<ColorInput
v-model="highlightLinkColorLocal"
name="highlightLink"
:label="$t('settings.links')"
:fallback="previewTheme.colors.highlightLink"
/>
<ContrastRatio :contrast="previewContrast.highlightLink" />
</div>
<div class="color-item">
<h4>{{ $t('settings.style.advanced_colors.popover') }}</h4>
<ColorInput
v-model="popoverColorLocal"
name="popover"
:label="$t('settings.background')"
:fallback="previewTheme.colors.popover"
/>
<OpacityInput
v-model="popoverOpacityLocal"
name="popoverOpacity"
:fallback="previewTheme.opacity.popover"
:disabled="popoverOpacityLocal === 'transparent'"
/>
<ColorInput
v-model="popoverTextColorLocal"
name="popoverText"
:label="$t('settings.text')"
:fallback="previewTheme.colors.popoverText"
/>
<ContrastRatio :contrast="previewContrast.popoverText" />
<ColorInput
v-model="popoverLinkColorLocal"
name="popoverLink"
:label="$t('settings.links')"
:fallback="previewTheme.colors.popoverLink"
/>
<ContrastRatio :contrast="previewContrast.popoverLink" />
</div>
<div class="color-item">
<h4>{{ $t('settings.style.advanced_colors.selectedPost') }}</h4>
<ColorInput
v-model="selectedPostColorLocal"
name="selectedPost"
:label="$t('settings.background')"
:fallback="previewTheme.colors.selectedPost"
/>
<ColorInput
v-model="selectedPostTextColorLocal"
name="selectedPostText"
:label="$t('settings.text')"
:fallback="previewTheme.colors.selectedPostText"
/>
<ContrastRatio :contrast="previewContrast.selectedPostText" />
<ColorInput
v-model="selectedPostLinkColorLocal"
name="selectedPostLink"
:label="$t('settings.links')"
:fallback="previewTheme.colors.selectedPostLink"
/>
<ContrastRatio :contrast="previewContrast.selectedPostLink" />
</div>
<div class="color-item">
<h4>{{ $t('settings.style.advanced_colors.selectedMenu') }}</h4>
<ColorInput
v-model="selectedMenuColorLocal"
name="selectedMenu"
:label="$t('settings.background')"
:fallback="previewTheme.colors.selectedMenu"
/>
<ColorInput
v-model="selectedMenuTextColorLocal"
name="selectedMenuText"
:label="$t('settings.text')"
:fallback="previewTheme.colors.selectedMenuText"
/>
<ContrastRatio :contrast="previewContrast.selectedMenuText" />
<ColorInput
v-model="selectedMenuLinkColorLocal"
name="selectedMenuLink"
:label="$t('settings.links')"
:fallback="previewTheme.colors.selectedMenuLink"
/>
<ContrastRatio :contrast="previewContrast.selectedMenuLink" />
</div>
<div class="color-item">
<h4>{{ $t('chats.chats') }}</h4>
<ColorInput
v-model="chatBgColorLocal"
name="chatBgColor"
:fallback="previewTheme.colors.bg"
:label="$t('settings.background')"
/>
<h5>{{ $t('settings.style.advanced_colors.chat.incoming') }}</h5>
<ColorInput
v-model="chatMessageIncomingBgColorLocal"
name="chatMessageIncomingBgColor"
:fallback="previewTheme.colors.bg"
:label="$t('settings.background')"
/>
<ColorInput
v-model="chatMessageIncomingTextColorLocal"
name="chatMessageIncomingTextColor"
:fallback="previewTheme.colors.text"
:label="$t('settings.text')"
/>
<ColorInput
v-model="chatMessageIncomingLinkColorLocal"
name="chatMessageIncomingLinkColor"
:fallback="previewTheme.colors.link"
:label="$t('settings.links')"
/>
<ColorInput
v-model="chatMessageIncomingBorderColorLocal"
name="chatMessageIncomingBorderLinkColor"
:fallback="previewTheme.colors.fg"
:label="$t('settings.style.advanced_colors.chat.border')"
/>
<h5>{{ $t('settings.style.advanced_colors.chat.outgoing') }}</h5>
<ColorInput
v-model="chatMessageOutgoingBgColorLocal"
name="chatMessageOutgoingBgColor"
:fallback="previewTheme.colors.bg"
:label="$t('settings.background')"
/>
<ColorInput
v-model="chatMessageOutgoingTextColorLocal"
name="chatMessageOutgoingTextColor"
:fallback="previewTheme.colors.text"
:label="$t('settings.text')"
/>
<ColorInput
v-model="chatMessageOutgoingLinkColorLocal"
name="chatMessageOutgoingLinkColor"
:fallback="previewTheme.colors.link"
:label="$t('settings.links')"
/>
<ColorInput
v-model="chatMessageOutgoingBorderColorLocal"
name="chatMessageOutgoingBorderLinkColor"
:fallback="previewTheme.colors.bg"
:label="$t('settings.style.advanced_colors.chat.border')"
/>
</div>
</div>
<div
:label="$t('settings.style.radii._tab_label')"
class="radius-container"
>
<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') }}
</button>
</div>
<RangeInput
v-model="btnRadiusLocal"
name="btnRadius"
:label="$t('settings.btnRadius')"
:fallback="previewTheme.radii.btn"
max="16"
hard-min="0"
/>
<RangeInput
v-model="inputRadiusLocal"
name="inputRadius"
:label="$t('settings.inputRadius')"
:fallback="previewTheme.radii.input"
max="9"
hard-min="0"
/>
<RangeInput
v-model="checkboxRadiusLocal"
name="checkboxRadius"
:label="$t('settings.checkboxRadius')"
:fallback="previewTheme.radii.checkbox"
max="16"
hard-min="0"
/>
<RangeInput
v-model="panelRadiusLocal"
name="panelRadius"
:label="$t('settings.panelRadius')"
:fallback="previewTheme.radii.panel"
max="50"
hard-min="0"
/>
<RangeInput
v-model="avatarRadiusLocal"
name="avatarRadius"
:label="$t('settings.avatarRadius')"
:fallback="previewTheme.radii.avatar"
max="28"
hard-min="0"
/>
<RangeInput
v-model="avatarAltRadiusLocal"
name="avatarAltRadius"
:label="$t('settings.avatarAltRadius')"
:fallback="previewTheme.radii.avatarAlt"
max="28"
hard-min="0"
/>
<RangeInput
v-model="attachmentRadiusLocal"
name="attachmentRadius"
:label="$t('settings.attachmentRadius')"
:fallback="previewTheme.radii.attachment"
max="50"
hard-min="0"
/>
<RangeInput
v-model="tooltipRadiusLocal"
name="tooltipRadius"
:label="$t('settings.tooltipRadius')"
:fallback="previewTheme.radii.tooltip"
max="50"
hard-min="0"
/>
<RangeInput
v-model="chatMessageRadiusLocal"
name="chatMessageRadius"
:label="$t('settings.chatMessageRadius')"
:fallback="previewTheme.radii.chatMessage || 2"
max="50"
hard-min="0"
/>
</div>
<div
:label="$t('settings.style.shadows._tab_label')"
class="shadow-container"
>
<div class="tab-header shadow-selector">
<div class="select-container">
{{ $t('settings.style.shadows.component') }}
<label
for="shadow-switcher"
class="select"
>
<select
id="shadow-switcher"
v-model="shadowSelected"
class="shadow-switcher"
>
<option
v-for="shadow in shadowsAvailable"
:key="shadow"
:value="shadow"
>
{{ $t('settings.style.shadows.components.' + shadow) }}
</option>
</select>
<FAIcon
class="select-down-icon"
icon="chevron-down"
/>
</label>
</div>
<div class="override">
<label
for="override"
class="label"
>
{{ $t('settings.style.shadows.override') }}
</label>
<input
id="override"
v-model="currentShadowOverriden"
name="override"
class="input-override"
type="checkbox"
>
<label
class="checkbox-label"
for="override"
/>
</div>
<button
- class="btn"
+ class="btn button-default"
@click="clearShadows"
>
{{ $t('settings.style.switcher.clear_all') }}
</button>
</div>
<ShadowControl
v-model="currentShadow"
:ready="!!currentShadowFallback"
:fallback="currentShadowFallback"
/>
<div v-if="shadowSelected === 'avatar' || shadowSelected === 'avatarStatus'">
<i18n
path="settings.style.shadows.filter_hint.always_drop_shadow"
tag="p"
>
<code>filter: drop-shadow()</code>
</i18n>
<p>{{ $t('settings.style.shadows.filter_hint.avatar_inset') }}</p>
<i18n
path="settings.style.shadows.filter_hint.drop_shadow_syntax"
tag="p"
>
<code>drop-shadow</code>
<code>spread-radius</code>
<code>inset</code>
</i18n>
<i18n
path="settings.style.shadows.filter_hint.inset_classic"
tag="p"
>
<code>box-shadow</code>
</i18n>
<p>{{ $t('settings.style.shadows.filter_hint.spread_zero') }}</p>
</div>
</div>
<div
:label="$t('settings.style.fonts._tab_label')"
class="fonts-container"
>
<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') }}
</button>
</div>
<FontControl
v-model="fontsLocal.interface"
name="ui"
:label="$t('settings.style.fonts.components.interface')"
:fallback="previewTheme.fonts.interface"
no-inherit="1"
/>
<FontControl
v-model="fontsLocal.input"
name="input"
:label="$t('settings.style.fonts.components.input')"
:fallback="previewTheme.fonts.input"
/>
<FontControl
v-model="fontsLocal.post"
name="post"
:label="$t('settings.style.fonts.components.post')"
:fallback="previewTheme.fonts.post"
/>
<FontControl
v-model="fontsLocal.postCode"
name="postCode"
:label="$t('settings.style.fonts.components.postCode')"
:fallback="previewTheme.fonts.postCode"
/>
</div>
</tab-switcher>
</keep-alive>
<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') }}
</button>
</div>
</div>
</template>
<script src="./theme_tab.js"></script>
<style src="./theme_tab.scss" lang="scss"></style>
diff --git a/src/components/shadow_control/shadow_control.vue b/src/components/shadow_control/shadow_control.vue
index 78f0e544dd..37d491f046 100644
--- a/src/components/shadow_control/shadow_control.vue
+++ b/src/components/shadow_control/shadow_control.vue
@@ -1,336 +1,336 @@
<template>
<div
class="shadow-control"
:class="{ disabled: !present }"
>
<div class="shadow-preview-container">
<div
:disabled="!present"
class="y-shift-control"
>
<input
v-model="selected.y"
:disabled="!present"
class="input-number"
type="number"
>
<div class="wrap">
<input
v-model="selected.y"
:disabled="!present"
class="input-range"
type="range"
max="20"
min="-20"
>
</div>
</div>
<div class="preview-window">
<div
class="preview-block"
:style="style"
/>
</div>
<div
:disabled="!present"
class="x-shift-control"
>
<input
v-model="selected.x"
:disabled="!present"
class="input-number"
type="number"
>
<div class="wrap">
<input
v-model="selected.x"
:disabled="!present"
class="input-range"
type="range"
max="20"
min="-20"
>
</div>
</div>
</div>
<div class="shadow-tweak">
<div
:disabled="usingFallback"
class="id-control style-control"
>
<label
for="shadow-switcher"
class="select"
:disabled="!ready || usingFallback"
>
<select
id="shadow-switcher"
v-model="selectedId"
class="shadow-switcher"
:disabled="!ready || usingFallback"
>
<option
v-for="(shadow, index) in cValue"
:key="index"
:value="index"
>
{{ $t('settings.style.shadows.shadow_id', { value: index }) }}
</option>
</select>
<FAIcon
icon="chevron-down"
class="select-down-icon"
/>
</label>
<button
- class="btn btn-default"
+ class="btn button-default"
:disabled="!ready || !present"
@click="del"
>
<FAIcon
fixed-width
icon="times"
/>
</button>
<button
- class="btn btn-default"
+ class="btn button-default"
:disabled="!moveUpValid"
@click="moveUp"
>
<FAIcon
fixed-width
icon="chevron-up"
/>
</button>
<button
- class="btn btn-default"
+ class="btn button-default"
:disabled="!moveDnValid"
@click="moveDn"
>
<FAIcon
fixed-width
icon="chevron-down"
/>
</button>
<button
- class="btn btn-default"
+ class="btn button-default"
:disabled="usingFallback"
@click="add"
>
<FAIcon
fixed-width
icon="plus"
/>
</button>
</div>
<div
:disabled="!present"
class="inset-control style-control"
>
<label
for="inset"
class="label"
>
{{ $t('settings.style.shadows.inset') }}
</label>
<input
id="inset"
v-model="selected.inset"
:disabled="!present"
name="inset"
class="input-inset"
type="checkbox"
>
<label
class="checkbox-label"
for="inset"
/>
</div>
<div
:disabled="!present"
class="blur-control style-control"
>
<label
for="spread"
class="label"
>
{{ $t('settings.style.shadows.blur') }}
</label>
<input
id="blur"
v-model="selected.blur"
:disabled="!present"
name="blur"
class="input-range"
type="range"
max="20"
min="0"
>
<input
v-model="selected.blur"
:disabled="!present"
class="input-number"
type="number"
min="0"
>
</div>
<div
:disabled="!present"
class="spread-control style-control"
>
<label
for="spread"
class="label"
>
{{ $t('settings.style.shadows.spread') }}
</label>
<input
id="spread"
v-model="selected.spread"
:disabled="!present"
name="spread"
class="input-range"
type="range"
max="20"
min="-20"
>
<input
v-model="selected.spread"
:disabled="!present"
class="input-number"
type="number"
>
</div>
<ColorInput
v-model="selected.color"
:disabled="!present"
:label="$t('settings.style.common.color')"
:fallback="currentFallback.color"
:show-optional-tickbox="false"
name="shadow"
/>
<OpacityInput
v-model="selected.alpha"
:disabled="!present"
/>
<i18n
path="settings.style.shadows.hintV3"
tag="p"
>
<code>--variable,mod</code>
</i18n>
</div>
</div>
</template>
<script src="./shadow_control.js" ></script>
<style lang="scss">
@import '../../_variables.scss';
.shadow-control {
display: flex;
flex-wrap: wrap;
justify-content: center;
margin-bottom: 1em;
.shadow-preview-container,
.shadow-tweak {
margin: 5px 6px 0 0;
}
.shadow-preview-container {
flex: 0;
display: flex;
flex-wrap: wrap;
$side: 15em;
input[type=number] {
width: 5em;
min-width: 2em;
}
.x-shift-control,
.y-shift-control {
display: flex;
flex: 0;
&[disabled=disabled] *{
opacity: .5
}
}
.x-shift-control {
align-items: flex-start;
}
.x-shift-control .wrap,
input[type=range] {
margin: 0;
width: $side;
height: 2em;
}
.y-shift-control {
flex-direction: column;
align-items: flex-end;
.wrap {
width: 2em;
height: $side;
}
input[type=range] {
transform-origin: 1em 1em;
transform: rotate(90deg);
}
}
.preview-window {
flex: 1;
background-color: #999999;
display: flex;
align-items: center;
justify-content: center;
background-image:
linear-gradient(45deg, #666666 25%, transparent 25%),
linear-gradient(-45deg, #666666 25%, transparent 25%),
linear-gradient(45deg, transparent 75%, #666666 75%),
linear-gradient(-45deg, transparent 75%, #666666 75%);
background-size: 20px 20px;
background-position:0 0, 0 10px, 10px -10px, -10px 0;
border-radius: $fallback--inputRadius;
border-radius: var(--inputRadius, $fallback--inputRadius);
.preview-block {
width: 33%;
height: 33%;
background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg);
border-radius: $fallback--panelRadius;
border-radius: var(--panelRadius, $fallback--panelRadius);
}
}
}
.shadow-tweak {
flex: 1;
min-width: 280px;
.id-control {
align-items: stretch;
.select, .btn {
min-width: 1px;
margin-right: 5px;
}
.btn {
padding: 0 .4em;
margin: 0 .1em;
}
.select {
flex: 1;
select {
align-self: initial;
}
}
}
}
}
</style>
diff --git a/src/components/side_drawer/side_drawer.vue b/src/components/side_drawer/side_drawer.vue
index 28c888fe03..695ae03b0a 100644
--- a/src/components/side_drawer/side_drawer.vue
+++ b/src/components/side_drawer/side_drawer.vue
@@ -1,353 +1,353 @@
<template>
<div
class="side-drawer-container"
:class="{ 'side-drawer-container-closed': closed, 'side-drawer-container-open': !closed }"
>
<div
class="side-drawer-darken"
:class="{ 'side-drawer-darken-closed': closed}"
/>
<div
class="side-drawer"
:class="{'side-drawer-closed': closed}"
@touchstart="touchStart"
@touchmove="touchMove"
>
<div
class="side-drawer-heading"
@click="toggleDrawer"
>
<UserCard
v-if="currentUser"
:user-id="currentUser.id"
:hide-bio="true"
/>
<div
v-else
class="side-drawer-logo-wrapper"
>
<img :src="logo">
<span v-if="!hideSitename">{{ sitename }}</span>
</div>
</div>
<ul>
<li
v-if="!currentUser"
@click="toggleDrawer"
>
<router-link :to="{ name: 'login' }">
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding"
icon="sign-in-alt"
/> {{ $t("login.login") }}
</router-link>
</li>
<li
v-if="currentUser || !privateMode"
@click="toggleDrawer"
>
<router-link :to="{ name: timelinesRoute }">
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding"
icon="home"
/> {{ $t("nav.timelines") }}
</router-link>
</li>
<li
v-if="currentUser && pleromaChatMessagesAvailable"
@click="toggleDrawer"
>
<router-link
:to="{ name: 'chats', params: { username: currentUser.screen_name } }"
style="position: relative"
>
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding"
icon="comments"
/> {{ $t("nav.chats") }}
<span
v-if="unreadChatCount"
class="badge badge-notification"
>
{{ unreadChatCount }}
</span>
</router-link>
</li>
</ul>
<ul v-if="currentUser">
<li @click="toggleDrawer">
<router-link :to="{ name: 'interactions', params: { username: currentUser.screen_name } }">
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding"
icon="bell"
/> {{ $t("nav.interactions") }}
</router-link>
</li>
<li
v-if="currentUser.locked"
@click="toggleDrawer"
>
<router-link to="/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 badge-notification"
>
{{ followRequestCount }}
</span>
</router-link>
</li>
<li
v-if="chat"
@click="toggleDrawer"
>
<router-link :to="{ name: 'chat' }">
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding"
icon="bullhorn"
/> {{ $t("shoutbox.title") }}
</router-link>
</li>
</ul>
<ul>
<li
v-if="currentUser || !privateMode"
@click="toggleDrawer"
>
<router-link :to="{ name: 'search' }">
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding"
icon="search"
/> {{ $t("nav.search") }}
</router-link>
</li>
<li
v-if="currentUser && suggestionsEnabled"
@click="toggleDrawer"
>
<router-link :to="{ name: '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"
>
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding"
icon="cog"
/> {{ $t("settings.settings") }}
- </a>
+ </button>
</li>
<li @click="toggleDrawer">
<router-link :to="{ name: 'about'}">
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding"
icon="info-circle"
/> {{ $t("nav.about") }}
</router-link>
</li>
<li
v-if="currentUser && currentUser.role === 'admin'"
@click="toggleDrawer"
>
<a
href="/pleroma/admin/#/login-pleroma"
target="_blank"
>
<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"
>
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding"
icon="sign-out-alt"
/> {{ $t("login.logout") }}
- </a>
+ </button>
</li>
</ul>
</div>
<div
class="side-drawer-click-outside"
:class="{'side-drawer-click-outside-closed': closed}"
@click.stop.prevent="toggleDrawer"
/>
</div>
</template>
<script src="./side_drawer.js" ></script>
<style lang="scss">
@import '../../_variables.scss';
.side-drawer-container {
position: fixed;
z-index: 1000;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
align-items: stretch;
transition-duration: 0s;
transition-property: transform;
}
.side-drawer-container-open {
transform: translate(0%);
}
.side-drawer-container-closed {
transition-delay: 0.35s;
transform: translate(-100%);
}
.side-drawer-darken {
top: 0;
left: 0;
width: 100vw;
height: 100vh;
position: fixed;
z-index: -1;
transition: 0.35s;
transition-property: background-color;
background-color: rgba(0, 0, 0, 0.5);
}
.side-drawer-darken-closed {
background-color: rgba(0, 0, 0, 0);
}
.side-drawer-click-outside {
flex: 1 1 100%;
}
.side-drawer {
overflow-x: hidden;
transition-timing-function: cubic-bezier(0, 1, 0.5, 1);
transition: 0.35s;
transition-property: transform;
margin: 0 0 0 -100px;
padding: 0 0 1em 100px;
width: 80%;
max-width: 20em;
flex: 0 0 80%;
box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.6);
box-shadow: var(--panelShadow);
background-color: $fallback--bg;
background-color: var(--popover, $fallback--bg);
color: $fallback--link;
color: var(--popoverText, $fallback--link);
--faint: var(--popoverFaintText, $fallback--faint);
--faintLink: var(--popoverFaintLink, $fallback--faint);
--lightText: var(--popoverLightText, $fallback--lightText);
--icon: var(--popoverIcon, $fallback--icon);
.badge {
position: absolute;
right: 0.7rem;
top: 1em;
}
}
.side-drawer-logo-wrapper {
display: flex;
align-items: center;
padding: 0.85em;
img {
flex: none;
height: 50px;
margin-right: 0.85em;
}
span {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.side-drawer-click-outside-closed {
flex: 0 0 0;
}
.side-drawer-closed {
transform: translate(-100%);
}
.side-drawer-heading {
background: transparent;
flex-direction: column;
align-items: stretch;
display: flex;
padding: 0;
margin: 0;
}
.side-drawer ul {
list-style: none;
margin: 0;
padding: 0;
border-bottom: 1px solid;
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
}
.side-drawer ul:last-child {
border: 0;
}
.side-drawer li {
padding: 0;
- a {
+ a, button {
box-sizing: border-box;
display: block;
height: 3em;
line-height: 3em;
padding: 0 0.7em;
&:hover {
background-color: $fallback--lightBg;
background-color: var(--selectedMenuPopover, $fallback--lightBg);
color: $fallback--text;
color: var(--selectedMenuPopoverText, $fallback--text);
--faint: var(--selectedMenuPopoverFaintText, $fallback--faint);
--faintLink: var(--selectedMenuPopoverFaintLink, $fallback--faint);
--lightText: var(--selectedMenuPopoverLightText, $fallback--lightText);
--icon: var(--selectedMenuPopoverIcon, $fallback--icon);
}
}
}
</style>
diff --git a/src/components/status/status.scss b/src/components/status/status.scss
index 0a94de32cb..70c6d03d6a 100644
--- a/src/components/status/status.scss
+++ b/src/components/status/status.scss
@@ -1,416 +1,418 @@
@import '../../_variables.scss';
$status-margin: 0.75em;
.Status {
min-width: 0;
&:hover {
--_still-image-img-visibility: visible;
--_still-image-canvas-visibility: hidden;
--_still-image-label-visibility: hidden;
}
&.-focused {
background-color: $fallback--lightBg;
background-color: var(--selectedPost, $fallback--lightBg);
color: $fallback--text;
color: var(--selectedPostText, $fallback--text);
--lightText: var(--selectedPostLightText, $fallback--light);
--faint: var(--selectedPostFaintText, $fallback--faint);
--faintLink: var(--selectedPostFaintLink, $fallback--faint);
--postLink: var(--selectedPostPostLink, $fallback--faint);
--postFaintLink: var(--selectedPostFaintPostLink, $fallback--faint);
--icon: var(--selectedPostIcon, $fallback--icon);
}
&.-conversation {
border-left-width: 4px;
border-left-style: solid;
+ border-left-color: $fallback--cRed;
+ border-left-color: var(--cRed, $fallback--cRed);
}
.gravestone {
padding: $status-margin;
color: $fallback--faint;
color: var(--faint, $fallback--faint);
display: flex;
.deleted-text {
margin: 0.5em 0;
align-items: center;
}
}
.status-container {
display: flex;
padding: $status-margin;
&.-repeat {
padding-top: 0;
}
}
.pin {
padding: $status-margin $status-margin 0;
display: flex;
align-items: center;
justify-content: flex-end;
}
._misclick-prevention & {
pointer-events: none;
.attachments {
pointer-events: initial;
cursor: initial;
}
}
.left-side {
margin-right: $status-margin;
}
.right-side {
flex: 1;
min-width: 0;
}
.usercard {
margin-bottom: $status-margin;
}
.status-username {
white-space: nowrap;
font-size: 14px;
overflow: hidden;
max-width: 85%;
font-weight: bold;
flex-shrink: 1;
margin-right: 0.4em;
text-overflow: ellipsis;
.emoji {
width: 14px;
height: 14px;
vertical-align: middle;
object-fit: contain;
}
}
.status-favicon {
height: 18px;
width: 18px;
margin-right: 0.4em;
}
.status-heading {
margin-bottom: 0.5em;
}
.heading-name-row {
display: flex;
justify-content: space-between;
line-height: 18px;
a {
display: inline-block;
word-break: break-all;
}
}
.account-name {
min-width: 1.6em;
margin-right: 0.4em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1 1 0;
}
.heading-left {
display: flex;
min-width: 0;
}
.heading-right {
display: flex;
flex-shrink: 0;
}
.timeago {
margin-right: 0.2em;
}
.heading-reply-row {
position: relative;
align-content: baseline;
font-size: 12px;
line-height: 18px;
max-width: 100%;
display: flex;
flex-wrap: wrap;
align-items: stretch;
}
.reply-to-and-accountname {
display: flex;
height: 18px;
margin-right: 0.5em;
max-width: 100%;
.reply-to-link {
white-space: nowrap;
word-break: break-word;
text-overflow: ellipsis;
overflow-x: hidden;
}
}
& .reply-to-popover,
& .reply-to-no-popover {
min-width: 0;
margin-right: 0.4em;
flex-shrink: 0;
}
.reply-to-popover {
.reply-to:hover::before {
content: '';
display: block;
position: absolute;
bottom: 0;
width: 100%;
border-bottom: 1px solid var(--faint);
pointer-events: none;
}
.faint-link:hover {
// override default
text-decoration: none;
}
&.-strikethrough {
.reply-to::after {
content: '';
display: block;
position: absolute;
top: 50%;
width: 100%;
border-bottom: 1px solid var(--faint);
pointer-events: none;
}
}
}
.reply-to {
position: relative;
}
.reply-to-text {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.replies-separator {
margin-left: 0.4em;
}
.replies {
line-height: 18px;
font-size: 12px;
display: flex;
flex-wrap: wrap;
& > * {
margin-right: 0.4em;
}
}
.reply-link {
height: 17px;
}
.repeat-info {
padding: 0.4em $status-margin;
.repeat-icon {
color: $fallback--cGreen;
color: var(--cGreen, $fallback--cGreen);
}
}
.repeater-avatar {
border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius);
margin-left: 28px;
width: 20px;
height: 20px;
}
.repeater-name {
text-overflow: ellipsis;
margin-right: 0;
.emoji {
width: 14px;
height: 14px;
vertical-align: middle;
object-fit: contain;
}
}
.status-fadein {
animation-duration: 0.4s;
animation-name: fadein;
}
@keyframes fadein {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.status-actions {
position: relative;
width: 100%;
display: flex;
margin-top: $status-margin;
> * {
max-width: 4em;
flex: 1;
}
}
.muted {
padding: 0.25em 0.6em;
height: 1.2em;
line-height: 1.2em;
text-overflow: ellipsis;
overflow: hidden;
display: flex;
flex-wrap: nowrap;
& .status-username,
& .mute-thread,
& .mute-words {
word-wrap: normal;
word-break: normal;
white-space: nowrap;
}
& .status-username,
& .mute-words {
text-overflow: ellipsis;
overflow: hidden;
}
.status-username {
font-weight: normal;
flex: 0 1 auto;
margin-right: 0.2em;
font-size: smaller;
}
.mute-thread {
flex: 0 0 auto;
}
.mute-words {
flex: 1 0 5em;
margin-left: 0.2em;
&::before {
content: ' ';
}
}
.unmute {
flex: 0 0 auto;
margin-left: auto;
display: block;
}
}
.reply-form {
padding-top: 0;
padding-bottom: 0;
}
.reply-body {
flex: 1;
}
.favs-repeated-users {
margin-top: $status-margin;
}
.stats {
width: 100%;
display: flex;
line-height: 1em;
}
.avatar-row {
flex: 1;
overflow: hidden;
position: relative;
display: flex;
align-items: center;
&::before {
content: '';
position: absolute;
height: 100%;
width: 1px;
left: 0;
background-color: var(--faint, $fallback--faint);
}
}
.stat-count {
margin-right: $status-margin;
user-select: none;
.stat-title {
color: var(--faint, $fallback--faint);
font-size: 12px;
text-transform: uppercase;
position: relative;
}
.stat-number {
font-weight: bolder;
font-size: 16px;
line-height: 1em;
}
&:hover .stat-title {
text-decoration: underline;
}
}
@media all and (max-width: 800px) {
.repeater-avatar {
margin-left: 20px;
}
.avatar:not(.repeater-avatar) {
width: 40px;
height: 40px;
// TODO define those other way somehow?
// stylelint-disable rscss/class-format
&.avatar-compact {
width: 32px;
height: 32px;
}
}
}
}
diff --git a/src/components/status/status.vue b/src/components/status/status.vue
index 21412faa6d..896635ee08 100644
--- a/src/components/status/status.vue
+++ b/src/components/status/status.vue
@@ -1,420 +1,419 @@
<template>
<!-- eslint-disable vue/no-v-html -->
<div
v-if="!hideStatus"
class="Status"
:class="[{ '-focused': isFocused }, { '-conversation': inlineExpanded }]"
>
<div
v-if="error"
class="alert error"
>
{{ error }}
<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">
<FAIcon
v-if="muted && retweet"
class="fa-scale-110 fa-old-padding repeat-icon"
icon="retweet"
/>
<router-link :to="userProfileLink">
{{ status.user.screen_name }}
</router-link>
</small>
<small
v-if="showReasonMutedThread"
class="mute-thread"
>
{{ $t('status.thread_muted') }}
</small>
<small
v-if="showReasonMutedThread && muteWordHits.length > 0"
class="mute-thread"
>
{{ $t('status.thread_muted_and_words') }}
</small>
<small
class="mute-words"
:title="muteWordHits.join(', ')"
>
{{ muteWordHits.join(', ') }}
</small>
- <a
- href="#"
- class="unmute fa-scale-110 fa-old-padding"
+ <button
+ class="unmute button-unstyled"
@click.prevent="toggleMute"
>
<FAIcon
icon="eye-slash"
class="fa-scale-110 fa-old-padding"
/>
- </a>
+ </button>
</div>
</template>
<template v-else>
<div
v-if="showPinned"
class="pin"
>
<FAIcon
icon="thumbtack"
class="faint"
/>
<span class="faint">{{ $t('status.pinned') }}</span>
</div>
<div
v-if="retweet && !noHeading && !inConversation"
:class="[repeaterClass, { highlighted: repeaterStyle }]"
:style="[repeaterStyle]"
class="status-container repeat-info"
>
<UserAvatar
v-if="retweet"
class="left-side repeater-avatar"
:better-shadow="betterShadow"
:user="statusoid.user"
/>
<div class="right-side faint">
<span
class="status-username repeater-name"
:title="retweeter"
>
<router-link
v-if="retweeterHtml"
:to="retweeterProfileLink"
v-html="retweeterHtml"
/>
<router-link
v-else
:to="retweeterProfileLink"
>{{ retweeter }}</router-link>
</span>
<FAIcon
icon="retweet"
class="repeat-icon"
:title="$t('tool_tip.repeat')"
/>
{{ $t('timeline.repeated') }}
</div>
</div>
<div
v-if="!deleted"
:class="[userClass, { highlighted: userStyle, '-repeat': retweet && !inConversation }]"
:style="[ userStyle ]"
class="status-container"
:data-tags="tags"
>
<div
v-if="!noHeading"
class="left-side"
>
<router-link
:to="userProfileLink"
@click.stop.prevent.capture.native="toggleUserExpanded"
>
<UserAvatar
:compact="compact"
:better-shadow="betterShadow"
:user="status.user"
/>
</router-link>
</div>
<div class="right-side">
<UserCard
v-if="userExpanded"
:user-id="status.user.id"
:rounded="true"
:bordered="true"
class="usercard"
/>
<div
v-if="!noHeading"
class="status-heading"
>
<div class="heading-name-row">
<div class="heading-left">
<h4
v-if="status.user.name_html"
class="status-username"
:title="status.user.name"
v-html="status.user.name_html"
/>
<h4
v-else
class="status-username"
:title="status.user.name"
>
{{ status.user.name }}
</h4>
<router-link
class="account-name"
:title="status.user.screen_name"
:to="userProfileLink"
>
{{ status.user.screen_name }}
</router-link>
<img
v-if="!!(status.user && status.user.favicon)"
class="status-favicon"
:src="status.user.favicon"
>
</div>
<span class="heading-right">
<router-link
class="timeago faint-link"
:to="{ name: 'conversation', params: { id: status.id } }"
>
<Timeago
:time="status.created_at"
:auto-update="60"
/>
</router-link>
<span
v-if="status.visibility"
class="visibility-icon"
:title="status.visibility | capitalize"
>
<FAIcon
class="fa-scale-110 fa-old-padding"
:icon="visibilityIcon(status.visibility)"
/>
</span>
<a
v-if="!status.is_local && !isPreview"
:href="status.external_url"
target="_blank"
class="source_url"
title="Source"
>
<FAIcon
class="fa-scale-110 fa-old-padding"
icon="external-link-square-alt"
/>
</a>
- <a
+ <button
v-if="expandable && !isPreview"
- href="#"
+ class="button-unstyled"
title="Expand"
@click.prevent="toggleExpanded"
>
<FAIcon
class="fa-scale-110 fa-old-padding"
icon="plus-square"
/>
- </a>
- <a
+ </button>
+ <button
v-if="unmuted"
- href="#"
+ class="button-unstyled"
@click.prevent="toggleMute"
>
<FAIcon
icon="eye-slash"
class="fa-scale-110 fa-old-padding"
/>
- </a>
+ </button>
</span>
</div>
<div class="heading-reply-row">
<div
v-if="isReply"
class="reply-to-and-accountname"
>
<StatusPopover
v-if="!isPreview"
:status-id="status.parent_visible && status.in_reply_to_status_id"
class="reply-to-popover"
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)"
>
<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
v-else
class="reply-to-no-popover"
>
<span class="reply-to-text">{{ $t('status.reply_to') }}</span>
</span>
<router-link
class="reply-to-link"
:title="replyToName"
:to="replyProfileLink"
>
{{ replyToName }}
</router-link>
<span
v-if="replies && replies.length"
class="faint replies-separator"
>
-
</span>
</div>
<div
v-if="inConversation && !isPreview && replies && replies.length"
class="replies"
>
<span class="faint">{{ $t('status.replies_list') }}</span>
<StatusPopover
v-for="reply in replies"
: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>
</div>
<StatusContent
:status="status"
:no-heading="noHeading"
:highlight="highlight"
:focused="isFocused"
@mediaplay="addMediaPlaying($event)"
@mediapause="removeMediaPlaying($event)"
/>
<transition name="fade">
<div
v-if="!hidePostStats && isFocused && combinedFavsAndRepeatsUsers.length > 0"
class="favs-repeated-users"
>
<div class="stats">
<UserListPopover
v-if="statusFromGlobalRepository.rebloggedBy && statusFromGlobalRepository.rebloggedBy.length > 0"
:users="statusFromGlobalRepository.rebloggedBy"
>
<div class="stat-count">
<a class="stat-title">{{ $t('status.repeats') }}</a>
<div class="stat-number">
{{ statusFromGlobalRepository.rebloggedBy.length }}
</div>
</div>
</UserListPopover>
<UserListPopover
v-if="statusFromGlobalRepository.favoritedBy && statusFromGlobalRepository.favoritedBy.length > 0"
:users="statusFromGlobalRepository.favoritedBy"
>
<div
class="stat-count"
>
<a class="stat-title">{{ $t('status.favorites') }}</a>
<div class="stat-number">
{{ statusFromGlobalRepository.favoritedBy.length }}
</div>
</div>
</UserListPopover>
<div class="avatar-row">
<AvatarList :users="combinedFavsAndRepeatsUsers" />
</div>
</div>
</div>
</transition>
<EmojiReactions
v-if="(mergedConfig.emojiReactionsOnTimeline || isFocused) && (!noHeading && !isPreview)"
:status="status"
/>
<div
v-if="!noHeading && !isPreview"
class="status-actions"
>
<reply-button
:replying="replying"
:status="status"
@toggle="toggleReplying"
/>
<retweet-button
:visibility="status.visibility"
:logged-in="loggedIn"
:status="status"
/>
<favorite-button
:logged-in="loggedIn"
:status="status"
/>
<ReactButton
v-if="loggedIn"
:status="status"
/>
<extra-buttons
:status="status"
@onError="showError"
@onSuccess="clearError"
/>
</div>
</div>
</div>
<div
v-else
class="gravestone"
>
<div class="left-side">
<UserAvatar :compact="compact" />
</div>
<div class="right-side">
<div class="deleted-text">
{{ $t('status.status_deleted') }}
</div>
<reply-button
v-if="replying"
:replying="replying"
:status="status"
@toggle="toggleReplying"
/>
</div>
</div>
<div
v-if="replying"
class="status-container reply-form"
>
<PostStatusForm
class="reply-body"
:reply-to="status.id"
:attentions="status.attentions"
:replied-user="status.user"
:copy-message-scope="status.visibility"
:subject="replySubject"
@posted="toggleReplying"
/>
</div>
</template>
</div>
<!-- eslint-enable vue/no-v-html -->
</template>
<script src="./status.js" ></script>
<style src="./status.scss" lang="scss"></style>
diff --git a/src/components/status_content/status_content.vue b/src/components/status_content/status_content.vue
index 321cd4772c..90bfaf40ce 100644
--- a/src/components/status_content/status_content.vue
+++ b/src/components/status_content/status_content.vue
@@ -1,297 +1,294 @@
<template>
<!-- eslint-disable vue/no-v-html -->
<div class="StatusContent">
<slot name="header" />
<div
v-if="status.summary_html"
class="summary-wrapper"
:class="{ 'tall-subject': (longSubject && !showingLongSubject) }"
>
<div
class="media-body summary"
@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 }"
class="status-content media-body"
@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") }}
<FAIcon
v-if="attachmentTypes.includes('image')"
icon="image"
/>
<FAIcon
v-if="attachmentTypes.includes('video')"
icon="video"
/>
<FAIcon
v-if="attachmentTypes.includes('audio')"
icon="music"
/>
<FAIcon
v-if="attachmentTypes.includes('unknown')"
icon="file"
/>
<FAIcon
v-if="status.poll && status.poll.options"
icon="poll-h"
/>
<FAIcon
v-if="status.card"
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">
<poll :base-poll="status.poll" />
</div>
<div
v-if="status.attachments.length !== 0 && (!hideSubjectStatus || showingLongSubject)"
class="attachments media-body"
>
<attachment
v-for="attachment in nonGalleryAttachments"
:key="attachment.id"
class="non-gallery"
:size="attachmentSize"
:nsfw="nsfwClickthrough"
:attachment="attachment"
:allow-play="true"
:set-media="setMedia()"
@play="$emit('mediaplay', attachment.id)"
@pause="$emit('mediapause', attachment.id)"
/>
<gallery
v-if="galleryAttachments.length > 0"
:nsfw="nsfwClickthrough"
:attachments="galleryAttachments"
:set-media="setMedia()"
/>
</div>
<div
v-if="status.card && !hideSubjectStatus && !noHeading"
class="link-preview media-body"
>
<link-preview
:card="status.card"
:size="attachmentSize"
:nsfw="nsfwClickthrough"
/>
</div>
<slot name="footer" />
</div>
<!-- eslint-enable vue/no-v-html -->
</template>
<script src="./status_content.js" ></script>
<style lang="scss">
@import '../../_variables.scss';
$status-margin: 0.75em;
.StatusContent {
flex: 1;
min-width: 0;
.status-content-wrapper {
display: flex;
flex-direction: column;
flex-wrap: nowrap;
}
.tall-status {
position: relative;
height: 220px;
overflow-x: hidden;
overflow-y: hidden;
z-index: 1;
.status-content {
min-height: 0;
mask: linear-gradient(to top, white, transparent) bottom/100% 70px no-repeat,
linear-gradient(to top, white, white);
/* Autoprefixed seem to ignore this one, and also syntax is different */
-webkit-mask-composite: xor;
mask-composite: exclude;
}
}
.tall-status-hider {
display: inline-block;
word-break: break-all;
position: absolute;
height: 70px;
margin-top: 150px;
width: 100%;
text-align: center;
line-height: 110px;
z-index: 2;
}
.status-unhider, .cw-status-hider {
width: 100%;
text-align: center;
display: inline-block;
word-break: break-all;
svg {
color: inherit;
}
}
img, video {
max-width: 100%;
max-height: 400px;
vertical-align: middle;
object-fit: contain;
&.emoji {
width: 32px;
height: 32px;
}
}
.summary-wrapper {
margin-bottom: 0.5em;
border-style: solid;
border-width: 0 0 1px 0;
border-color: var(--border, $fallback--border);
flex-grow: 0;
}
.summary {
font-style: italic;
padding-bottom: 0.5em;
}
.tall-subject {
position: relative;
.summary {
max-height: 2em;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
.tall-subject-hider {
display: inline-block;
word-break: break-all;
// position: absolute;
width: 100%;
text-align: center;
padding-bottom: 0.5em;
}
.status-content {
font-family: var(--postFont, sans-serif);
line-height: 1.4em;
white-space: pre-wrap;
overflow-wrap: break-word;
word-wrap: break-word;
word-break: break-word;
blockquote {
margin: 0.2em 0 0.2em 2em;
font-style: italic;
}
pre {
overflow: auto;
}
code, samp, kbd, var, pre {
font-family: var(--postCodeFont, monospace);
}
p {
margin: 0 0 1em 0;
}
p:last-child {
margin: 0 0 0 0;
}
h1 {
font-size: 1.1em;
line-height: 1.2em;
margin: 1.4em 0;
}
h2 {
font-size: 1.1em;
margin: 1.0em 0;
}
h3 {
font-size: 1em;
margin: 1.2em 0;
}
h4 {
margin: 1.1em 0;
}
&.single-line {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
height: 1.4em;
}
}
}
.greentext {
color: $fallback--cGreen;
color: var(--postGreentext, $fallback--cGreen);
}
</style>
diff --git a/src/components/tab_switcher/tab_switcher.js b/src/components/tab_switcher/tab_switcher.js
index 6e6e819302..76e7ef03d8 100644
--- a/src/components/tab_switcher/tab_switcher.js
+++ b/src/components/tab_switcher/tab_switcher.js
@@ -1,154 +1,154 @@
import Vue from 'vue'
import { mapState } from 'vuex'
import { FontAwesomeIcon as FAIcon } from '@fortawesome/vue-fontawesome'
import './tab_switcher.scss'
export default Vue.component('tab-switcher', {
name: 'TabSwitcher',
props: {
renderOnlyFocused: {
required: false,
type: Boolean,
default: false
},
onSwitch: {
required: false,
type: Function,
default: undefined
},
activeTab: {
required: false,
type: String,
default: undefined
},
scrollableTabs: {
required: false,
type: Boolean,
default: false
},
sideTabBar: {
required: false,
type: Boolean,
default: false
}
},
data () {
return {
active: this.$slots.default.findIndex(_ => _.tag)
}
},
computed: {
activeIndex () {
// In case of controlled component
if (this.activeTab) {
return this.$slots.default.findIndex(slot => this.activeTab === slot.key)
} else {
return this.active
}
},
settingsModalVisible () {
return this.settingsModalState === 'visible'
},
...mapState({
settingsModalState: state => state.interface.settingsModalState
})
},
beforeUpdate () {
const currentSlot = this.$slots.default[this.active]
if (!currentSlot.tag) {
this.active = this.$slots.default.findIndex(_ => _.tag)
}
},
methods: {
clickTab (index) {
return (e) => {
e.preventDefault()
this.setTab(index)
}
},
setTab (index) {
if (typeof this.onSwitch === 'function') {
this.onSwitch.call(null, this.$slots.default[index].key)
}
this.active = index
if (this.scrollableTabs) {
this.$refs.contents.scrollTop = 0
}
}
},
render (h) {
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')
classesWrapper.push('active')
}
if (slot.data.attrs.image) {
return (
<div class={classesWrapper.join(' ')}>
<button
disabled={slot.data.attrs.disabled}
onClick={this.clickTab(index)}
class={classesTab.join(' ')}>
<img src={slot.data.attrs.image} title={slot.data.attrs['image-tooltip']}/>
{slot.data.attrs.label ? '' : slot.data.attrs.label}
</button>
</div>
)
}
return (
<div class={classesWrapper.join(' ')}>
<button
disabled={slot.data.attrs.disabled}
onClick={this.clickTab(index)}
class={classesTab.join(' ')}
type="button"
>
{!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>
</button>
</div>
)
})
const contents = this.$slots.default.map((slot, index) => {
if (!slot.tag) return
const active = this.activeIndex === index
const classes = [ active ? 'active' : 'hidden' ]
if (slot.data.attrs.fullHeight) {
classes.push('full-height')
}
const renderSlot = (!this.renderOnlyFocused || active)
? slot
: ''
return (
<div class={classes}>
{
this.sideTabBar
? <h1 class="mobile-label">{slot.data.attrs.label}</h1>
: ''
}
{renderSlot}
</div>
)
})
return (
<div class={'tab-switcher ' + (this.sideTabBar ? 'side-tabs' : 'top-tabs')}>
<div class="tabs">
{tabs}
</div>
<div ref="contents" class={'contents' + (this.scrollableTabs ? ' scrollable-tabs' : '')} v-body-scroll-lock={this.settingsModalVisible}>
{contents}
</div>
</div>
)
}
})
diff --git a/src/components/timeline/timeline.js b/src/components/timeline/timeline.js
index cba46daf65..665d195ea1 100644
--- a/src/components/timeline/timeline.js
+++ b/src/components/timeline/timeline.js
@@ -1,261 +1,255 @@
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 { 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 = []
if (pinnedStatusIds && pinnedStatusIds.length > 0) {
for (let status of statuses) {
if (!pinnedStatusIds.includes(status.id)) {
break
}
ids.push(status.id)
}
}
return ids
}
const Timeline = {
props: [
'timeline',
'timelineName',
'title',
'userId',
'tag',
'embedded',
'count',
'pinnedStatusIds',
'inProfile'
],
data () {
return {
paused: false,
unfocused: false,
bottomedOut: false,
virtualScrollIndex: 0,
blockingClicks: false
}
},
components: {
Status,
Conversation,
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 () {
if (this.timeline.flushMarker !== 0) {
return this.$t('timeline.reload')
} else {
return `${this.$t('timeline.show_new')} (${this.newStatusCount})`
}
},
classes () {
let rootClasses = !this.embedded ? ['panel', 'panel-default'] : []
if (this.blockingClicks) rootClasses = rootClasses.concat(['-blocked', '_misclick-prevention'])
return {
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'] : [])
}
},
// id map of statuses which need to be hidden in the main list due to pinning logic
excludedStatusIdsObject () {
const ids = getExcludedStatusIdsByPinning(this.timeline.visibleStatuses, this.pinnedStatusIds)
// Convert id array to object
return keyBy(ids)
},
pinnedStatusIdsObject () {
return keyBy(this.pinnedStatusIds)
},
statusesToDisplay () {
const amount = this.timeline.visibleStatuses.length
const statusesPerSide = Math.ceil(Math.max(3, window.innerHeight / 80))
const min = Math.max(0, this.virtualScrollIndex - statusesPerSide)
const max = Math.min(amount, this.virtualScrollIndex + statusesPerSide)
return this.timeline.visibleStatuses.slice(min, max).map(_ => _.id)
},
virtualScrollingEnabled () {
return this.$store.getters.mergedConfig.virtualScrolling
}
},
created () {
const store = this.$store
const credentials = store.state.users.currentUser.credentials
const showImmediately = this.timeline.visibleStatuses.length === 0
window.addEventListener('scroll', this.handleScroll)
if (store.state.api.fetchers[this.timelineName]) { return false }
timelineFetcher.fetchAndUpdate({
store,
credentials,
timeline: this.timelineName,
showImmediately,
userId: this.userId,
tag: this.tag
})
},
mounted () {
if (typeof document.hidden !== 'undefined') {
document.addEventListener('visibilitychange', this.handleVisibilityChange, false)
this.unfocused = document.hidden
}
window.addEventListener('keydown', this.handleShortKey)
setTimeout(this.determineVisibleStatuses, 250)
},
destroyed () {
window.removeEventListener('scroll', this.handleScroll)
window.removeEventListener('keydown', this.handleShortKey)
if (typeof document.hidden !== 'undefined') document.removeEventListener('visibilitychange', this.handleVisibilityChange, false)
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
if (e.key === '.') this.showNewStatuses()
},
showNewStatuses () {
if (this.timeline.flushMarker !== 0) {
this.$store.commit('clearTimeline', { timeline: this.timelineName, excludeUserId: true })
this.$store.commit('queueFlush', { timeline: this.timelineName, id: 0 })
this.fetchOlderStatuses()
} else {
this.blockClicksTemporarily()
this.$store.commit('showNewStatuses', { timeline: this.timelineName })
this.paused = false
}
},
fetchOlderStatuses: throttle(function () {
const store = this.$store
const credentials = store.state.users.currentUser.credentials
store.commit('setLoading', { timeline: this.timelineName, value: true })
timelineFetcher.fetchAndUpdate({
store,
credentials,
timeline: this.timelineName,
older: true,
showImmediately: true,
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
if (!this.virtualScrollingEnabled) return
const statuses = this.$refs.timeline.children
const cappedScrollIndex = Math.max(0, Math.min(this.virtualScrollIndex, statuses.length - 1))
if (statuses.length === 0) return
const height = Math.max(document.body.offsetHeight, window.pageYOffset)
const centerOfScreen = window.pageYOffset + (window.innerHeight * 0.5)
// Start from approximating the index of some visible status by using the
// the center of the screen on the timeline.
let approxIndex = Math.floor(statuses.length * (centerOfScreen / height))
let err = statuses[approxIndex].getBoundingClientRect().y
// if we have a previous scroll index that can be used, test if it's
// closer than the previous approximation, use it if so
const virtualScrollIndexY = statuses[cappedScrollIndex].getBoundingClientRect().y
if (Math.abs(err) > virtualScrollIndexY) {
approxIndex = cappedScrollIndex
err = virtualScrollIndexY
}
// if the status is too far from viewport, check the next/previous ones if
// they happen to be better
while (err < -20 && approxIndex < statuses.length - 1) {
err += statuses[approxIndex].offsetHeight
approxIndex++
}
while (err > window.innerHeight + 100 && approxIndex > 0) {
approxIndex--
err -= statuses[approxIndex].offsetHeight
}
// this status is now the center point for virtual scrolling and visible
// statuses will be nearby statuses before and after it
this.virtualScrollIndex = approxIndex
},
scrollLoad (e) {
const bodyBRect = document.body.getBoundingClientRect()
const height = Math.max(bodyBRect.height, -(bodyBRect.y))
if (this.timeline.loading === false &&
this.$el.offsetHeight > 0 &&
(window.innerHeight + window.pageYOffset) >= (height - 750)) {
this.fetchOlderStatuses()
}
},
handleScroll: throttle(function (e) {
this.determineVisibleStatuses()
this.scrollLoad(e)
}, 200),
handleVisibilityChange () {
this.unfocused = document.hidden
}
},
watch: {
newStatusCount (count) {
if (!this.$store.getters.mergedConfig.streaming) {
return
}
if (count > 0) {
// only 'stream' them when you're scrolled to the top
const doc = document.documentElement
const top = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0)
if (top < 15 &&
!this.paused &&
!(this.unfocused && this.$store.getters.mergedConfig.pauseOnUnfocused)
) {
this.showNewStatuses()
} else {
this.paused = true
}
}
}
}
}
export default Timeline
diff --git a/src/components/timeline/timeline.vue b/src/components/timeline/timeline.vue
index 04859852b5..0326342be4 100644
--- a/src/components/timeline/timeline.vue
+++ b/src/components/timeline/timeline.vue
@@ -1,131 +1,113 @@
<template>
<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 }}
</button>
<div
v-else
class="loadmore-text faint"
@click.prevent
>
{{ $t('timeline.up_to_date') }}
</div>
</div>
<div :class="classes.body">
<div
ref="timeline"
class="timeline"
>
<template v-for="statusId in pinnedStatusIds">
<conversation
v-if="timeline.statusesObject[statusId]"
:key="statusId + '-pinned'"
class="status-fadein"
:status-id="statusId"
:collapsable="true"
:pinned-status-ids-object="pinnedStatusIdsObject"
:in-profile="inProfile"
:profile-user-id="userId"
/>
</template>
<template v-for="status in timeline.visibleStatuses">
<conversation
v-if="!excludedStatusIdsObject[status.id]"
:key="status.id"
class="status-fadein"
:status-id="status.id"
:collapsable="true"
:in-profile="inProfile"
:profile-user-id="userId"
:virtual-hidden="virtualScrollingEnabled && !statusesToDisplay.includes(status.id)"
/>
</template>
</div>
</div>
<div :class="classes.footer">
<div
v-if="count===0"
class="new-status-notification text-center panel-footer faint"
>
{{ $t('timeline.no_statuses') }}
</div>
<div
v-else-if="bottomedOut"
class="new-status-notification text-center panel-footer faint"
>
{{ $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"
>
<FAIcon
icon="circle-notch"
spin
size="lg"
/>
</div>
</div>
</div>
</template>
<script src="./timeline.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.Timeline {
.loadmore-text {
opacity: 1;
}
&.-blocked {
cursor: progress;
}
}
.timeline-heading {
max-width: 100%;
flex-wrap: nowrap;
.loadmore-button {
flex-shrink: 0;
}
.loadmore-text {
flex-shrink: 0;
line-height: 1em;
}
}
</style>
diff --git a/src/components/timeline_menu/timeline_menu.js b/src/components/timeline_menu/timeline_menu.js
index 4ccd52b4c7..ef8a581379 100644
--- a/src/components/timeline_menu/timeline_menu.js
+++ b/src/components/timeline_menu/timeline_menu.js
@@ -1,81 +1,80 @@
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'
library.add(
faUsers,
faGlobe,
faBookmark,
faEnvelope,
faHome,
faChevronDown
)
-// Route -> i18n key mapping, exported andnot in the computed
+// Route -> i18n key mapping, exported and not in the computed
// because nav panel benefits from the same information.
export const timelineNames = () => {
return {
'friends': 'nav.timeline',
'bookmarks': 'nav.bookmarks',
'dms': 'nav.dms',
'public-timeline': 'nav.public_tl',
- 'public-external-timeline': 'nav.twkn',
- 'tag-timeline': 'tag'
+ 'public-external-timeline': 'nav.twkn'
}
}
const TimelineMenu = {
components: {
Popover
},
data () {
return {
isOpen: false
}
},
created () {
if (this.currentUser && this.currentUser.locked) {
this.$store.dispatch('startFetchingFollowRequests')
}
if (timelineNames()[this.$route.name]) {
this.$store.dispatch('setLastTimeline', this.$route.name)
}
},
methods: {
openMenu () {
// $nextTick is too fast, animation won't play back but
// instead starts in fully open position. Low values
// like 1-5 work on fast machines but not on mobile, 25
// seems like a good compromise that plays without significant
// added lag.
setTimeout(() => {
this.isOpen = true
}, 25)
},
timelineName () {
const route = this.$route.name
if (route === 'tag-timeline') {
return '#' + this.$route.params.tag
}
const i18nkey = timelineNames()[this.$route.name]
return i18nkey ? this.$t(i18nkey) : route
}
},
computed: {
...mapState({
currentUser: state => state.users.currentUser,
privateMode: state => state.instance.private,
federating: state => state.instance.federating
})
}
}
export default TimelineMenu
diff --git a/src/components/user_card/user_card.vue b/src/components/user_card/user_card.vue
index f916af9db5..16dd524954 100644
--- a/src/components/user_card/user_card.vue
+++ b/src/components/user_card/user_card.vue
@@ -1,614 +1,614 @@
<template>
<div
class="user-card"
:class="classes"
>
<div
:class="{ 'hide-bio': hideBio }"
:style="style"
class="background-image"
/>
<div class="panel-heading">
<div class="user-info">
<div class="container">
<a
v-if="allowZoomingAvatar"
class="user-info-avatar-link"
@click="zoomAvatar"
>
<UserAvatar
:better-shadow="betterShadow"
:user="user"
/>
<div class="user-info-avatar-link-overlay">
<FAIcon
class="fa-scale-110 fa-old-padding"
icon="search-plus"
/>
</div>
</a>
<router-link
v-else
:to="userProfileLink(user)"
>
<UserAvatar
:better-shadow="betterShadow"
:user="user"
/>
</router-link>
<div class="user-summary">
<div class="top-line">
<!-- eslint-disable vue/no-v-html -->
<div
v-if="user.name_html"
:title="user.name"
class="user-name"
v-html="user.name_html"
/>
<!-- eslint-enable vue/no-v-html -->
<div
v-else
:title="user.name"
class="user-name"
>
{{ user.name }}
</div>
<a
v-if="isOtherUser && !user.is_local"
:href="user.statusnet_profile_url"
target="_blank"
class="external-link-button"
>
<FAIcon
class="icon"
icon="external-link-alt"
/>
</a>
<AccountActions
v-if="isOtherUser && loggedIn"
:user="user"
:relationship="relationship"
/>
</div>
<div class="bottom-line">
<router-link
class="user-screen-name"
:title="user.screen_name"
:to="userProfileLink(user)"
>
@{{ user.screen_name }}
</router-link>
<template v-if="!hideBio">
<span
v-if="!!visibleRole"
class="alert user-role"
>
{{ visibleRole }}
</span>
<span
v-if="user.bot"
class="alert user-role"
>
bot
</span>
</template>
<span v-if="user.locked">
<FAIcon
class="lock-icon"
icon="lock"
size="sm"
/>
</span>
<span
v-if="!mergedConfig.hideUserStats && !hideBio"
class="dailyAvg"
>{{ dailyAvg }} {{ $t('user_card.per_day') }}</span>
</div>
</div>
</div>
<div class="user-meta">
<div
v-if="relationship.followed_by && loggedIn && isOtherUser"
class="following"
>
{{ $t('user_card.follows_you') }}
</div>
<div
v-if="isOtherUser && (loggedIn || !switcher)"
class="highlighter"
>
<!-- id's need to be unique, otherwise vue confuses which user-card checkbox belongs to -->
<input
v-if="userHighlightType !== 'disabled'"
:id="'userHighlightColorTx'+user.id"
v-model="userHighlightColor"
class="userHighlightText"
type="text"
>
<input
v-if="userHighlightType !== 'disabled'"
:id="'userHighlightColor'+user.id"
v-model="userHighlightColor"
class="userHighlightCl"
type="color"
>
<label
for="theme_tab"
class="userHighlightSel select"
>
<select
:id="'userHighlightSel'+user.id"
v-model="userHighlightType"
class="userHighlightSel"
>
<option value="disabled">No highlight</option>
<option value="solid">Solid bg</option>
<option value="striped">Striped bg</option>
<option value="side">Side stripe</option>
</select>
<FAIcon
class="select-down-icon"
icon="chevron-down"
/>
</label>
</div>
</div>
<div
v-if="loggedIn && isOtherUser"
class="user-interactions"
>
<div class="btn-group">
<FollowButton :relationship="relationship" />
<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')"
>
<FAIcon icon="bell" />
</ProgressButton>
<ProgressButton
v-else
- class="btn btn-default toggled"
+ class="btn button-default toggled"
:click="unsubscribeUser"
:title="$t('user_card.unsubscribe')"
>
<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') }}
</button>
</div>
<div>
<button
- class="btn btn-default btn-block"
+ class="btn button-default btn-block"
@click="mentionUser"
>
{{ $t('user_card.mention') }}
</button>
</div>
<ModerationTools
v-if="loggedIn.role === &quot;admin&quot;"
:user="user"
/>
</div>
<div
v-if="!loggedIn && user.is_local"
class="user-interactions"
>
<RemoteFollow :user="user" />
</div>
</div>
</div>
<div
v-if="!hideBio"
class="panel-body"
>
<div
v-if="!mergedConfig.hideUserStats && switcher"
class="user-counts"
>
<div
class="user-count"
@click.prevent="setProfileView('statuses')"
>
<h5>{{ $t('user_card.statuses') }}</h5>
<span>{{ user.statuses_count }} <br></span>
</div>
<div
class="user-count"
@click.prevent="setProfileView('friends')"
>
<h5>{{ $t('user_card.followees') }}</h5>
<span>{{ hideFollowsCount ? $t('user_card.hidden') : user.friends_count }}</span>
</div>
<div
class="user-count"
@click.prevent="setProfileView('followers')"
>
<h5>{{ $t('user_card.followers') }}</h5>
<span>{{ hideFollowersCount ? $t('user_card.hidden') : user.followers_count }}</span>
</div>
</div>
<!-- eslint-disable vue/no-v-html -->
<p
v-if="!hideBio && user.description_html"
class="user-card-bio"
@click.prevent="linkClicked"
v-html="user.description_html"
/>
<!-- eslint-enable vue/no-v-html -->
<p
v-else-if="!hideBio"
class="user-card-bio"
>
{{ user.description }}
</p>
</div>
</div>
</template>
<script src="./user_card.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.user-card {
position: relative;
&:hover .Avatar {
--_still-image-img-visibility: visible;
--_still-image-canvas-visibility: hidden;
}
.panel-heading {
padding: .5em 0;
text-align: center;
box-shadow: none;
background: transparent;
flex-direction: column;
align-items: stretch;
// create new stacking context
position: relative;
}
.panel-body {
word-wrap: break-word;
border-bottom-right-radius: inherit;
border-bottom-left-radius: inherit;
// create new stacking context
position: relative;
}
.background-image {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
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;
mask-composite: exclude;
background-size: cover;
mask-size: 100% 60%;
border-top-left-radius: calc(var(--panelRadius) - 1px);
border-top-right-radius: calc(var(--panelRadius) - 1px);
background-color: var(--profileBg);
&.hide-bio {
mask-size: 100% 40px;
}
}
p {
margin-bottom: 0;
}
&-bio {
text-align: center;
a {
color: $fallback--link;
color: var(--postLink, $fallback--link);
}
img {
object-fit: contain;
vertical-align: middle;
max-width: 100%;
max-height: 400px;
&.emoji {
width: 32px;
height: 32px;
}
}
}
// Modifiers
&-rounded-t {
border-top-left-radius: $fallback--panelRadius;
border-top-left-radius: var(--panelRadius, $fallback--panelRadius);
border-top-right-radius: $fallback--panelRadius;
border-top-right-radius: var(--panelRadius, $fallback--panelRadius);
}
&-rounded {
border-radius: $fallback--panelRadius;
border-radius: var(--panelRadius, $fallback--panelRadius);
}
&-bordered {
border-width: 1px;
border-style: solid;
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
}
}
.user-info {
color: $fallback--lightText;
color: var(--lightText, $fallback--lightText);
padding: 0 26px;
.container {
padding: 16px 0 6px;
display: flex;
align-items: flex-start;
max-height: 56px;
.Avatar {
--_avatarShadowBox: var(--avatarShadow);
--_avatarShadowFilter: var(--avatarShadowFilter);
--_avatarShadowInset: var(--avatarShadowInset);
flex: 1 0 100%;
width: 56px;
height: 56px;
object-fit: cover;
}
}
&-avatar-link {
position: relative;
cursor: pointer;
&-overlay {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.3);
display: flex;
justify-content: center;
align-items: center;
border-radius: $fallback--avatarRadius;
border-radius: var(--avatarRadius, $fallback--avatarRadius);
opacity: 0;
transition: opacity .2s ease;
svg {
color: #FFF;
}
}
&:hover &-overlay {
opacity: 1;
}
}
.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 {
display: block;
margin-left: 0.6em;
text-align: left;
text-overflow: ellipsis;
white-space: nowrap;
flex: 1 1 0;
// This is so that text doesn't get overlapped by avatar's shadow if it has
// big one
z-index: 1;
img {
width: 26px;
height: 26px;
vertical-align: middle;
object-fit: contain
}
.top-line {
display: flex;
}
}
.user-name {
text-overflow: ellipsis;
overflow: hidden;
flex: 1 1 auto;
margin-right: 1em;
font-size: 15px;
img {
object-fit: contain;
height: 16px;
width: 16px;
vertical-align: middle;
}
}
.bottom-line {
display: flex;
font-weight: light;
font-size: 15px;
.lock-icon {
margin-left: 0.5em;
}
.user-screen-name {
min-width: 1px;
flex: 0 1 auto;
text-overflow: ellipsis;
overflow: hidden;
color: $fallback--lightText;
color: var(--lightText, $fallback--lightText);
}
.dailyAvg {
min-width: 1px;
flex: 0 0 auto;
margin-left: 1em;
font-size: 0.7em;
color: $fallback--text;
color: var(--text, $fallback--text);
}
.user-role {
flex: none;
text-transform: capitalize;
color: $fallback--text;
color: var(--alertNeutralText, $fallback--text);
background-color: $fallback--fg;
background-color: var(--alertNeutral, $fallback--fg);
}
}
.user-meta {
margin-bottom: .15em;
display: flex;
align-items: baseline;
font-size: 14px;
line-height: 22px;
flex-wrap: wrap;
.following {
flex: 1 0 auto;
margin: 0;
margin-bottom: .25em;
text-align: left;
}
.highlighter {
flex: 0 1 auto;
display: flex;
flex-wrap: wrap;
margin-right: -.5em;
align-self: start;
.userHighlightCl {
padding: 2px 10px;
flex: 1 0 auto;
}
.userHighlightSel,
.userHighlightSel.select {
padding-top: 0;
padding-bottom: 0;
flex: 1 0 auto;
}
.userHighlightSel.select svg {
line-height: 22px;
}
.userHighlightText {
width: 70px;
flex: 1 0 auto;
}
.userHighlightCl,
.userHighlightText,
.userHighlightSel,
.userHighlightSel.select {
height: 22px;
vertical-align: top;
margin-right: .5em;
margin-bottom: .25em;
}
}
}
.user-interactions {
position: relative;
display: flex;
flex-flow: row wrap;
margin-right: -.75em;
> * {
margin: 0 .75em .6em 0;
white-space: nowrap;
min-width: 95px;
}
button {
margin: 0;
}
}
}
.user-counts {
display: flex;
line-height:16px;
padding: .5em 1.5em 0em 1.5em;
text-align: center;
justify-content: space-between;
color: $fallback--lightText;
color: var(--lightText, $fallback--lightText);
flex-wrap: wrap;
}
.user-count {
flex: 1 0 auto;
padding: .5em 0 .5em 0;
margin: 0 .5em;
h5 {
font-size:1em;
font-weight: bolder;
margin: 0 0 0.25em;
}
a {
text-decoration: none;
}
}
</style>
diff --git a/src/components/user_reporting_modal/user_reporting_modal.vue b/src/components/user_reporting_modal/user_reporting_modal.vue
index 2a8d8d48e3..fb43094f18 100644
--- a/src/components/user_reporting_modal/user_reporting_modal.vue
+++ b/src/components/user_reporting_modal/user_reporting_modal.vue
@@ -1,184 +1,184 @@
<template>
<Modal
v-if="isOpen"
@backdropClicked="closeModal"
>
<div class="user-reporting-panel panel">
<div class="panel-heading">
<div class="title">
{{ $t('user_reporting.title', [user.screen_name]) }}
</div>
</div>
<div class="panel-body">
<div class="user-reporting-panel-left">
<div>
<p>{{ $t('user_reporting.add_comment_description') }}</p>
<textarea
v-model="comment"
class="form-control"
:placeholder="$t('user_reporting.additional_comments')"
rows="1"
@input="resize"
/>
</div>
<div v-if="!user.is_local">
<p>{{ $t('user_reporting.forward_description') }}</p>
<Checkbox v-model="forward">
{{ $t('user_reporting.forward_to', [remoteInstance]) }}
</Checkbox>
</div>
<div>
<button
- class="btn btn-default"
+ class="btn button-default"
:disabled="processing"
@click="reportUser"
>
{{ $t('user_reporting.submit') }}
</button>
<div
v-if="error"
class="alert error"
>
{{ $t('user_reporting.generic_error') }}
</div>
</div>
</div>
<div class="user-reporting-panel-right">
<List :items="statuses">
<template
slot="item"
slot-scope="{item}"
>
<div class="status-fadein user-reporting-panel-sitem">
<Status
:in-conversation="false"
:focused="false"
:statusoid="item"
/>
<Checkbox
:checked="isChecked(item.id)"
@change="checked => toggleStatus(checked, item.id)"
/>
</div>
</template>
</List>
</div>
</div>
</div>
</Modal>
</template>
<script src="./user_reporting_modal.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.user-reporting-panel {
width: 90vw;
max-width: 700px;
min-height: 20vh;
max-height: 80vh;
.panel-heading {
.title {
text-align: center;
// TODO: Consider making these as default of panel
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.panel-body {
display: flex;
flex-direction: column-reverse;
border-top: 1px solid;
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
overflow: hidden;
}
&-left {
padding: 1.1em 0.7em 0.7em;
line-height: 1.4em;
box-sizing: border-box;
> div {
margin-bottom: 1em;
&:last-child {
margin-bottom: 0;
}
}
p {
margin-top: 0;
}
textarea.form-control {
line-height: 16px;
resize: none;
overflow: hidden;
transition: min-height 200ms 100ms;
min-height: 44px;
width: 100%;
}
.btn {
min-width: 10em;
padding: 0 2em;
}
.alert {
margin: 1em 0 0 0;
line-height: 1.3em;
}
}
&-right {
display: flex;
flex-direction: column;
overflow-y: auto;
}
&-sitem {
display: flex;
justify-content: space-between;
/* TODO cleanup this */
> .Status {
flex: 1;
}
> .checkbox {
margin: 0.75em;
}
}
@media all and (min-width: 801px) {
.panel-body {
flex-direction: row;
}
&-left {
width: 50%;
max-width: 320px;
border-right: 1px solid;
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
padding: 1.1em;
> div {
margin-bottom: 2em;
}
}
&-right {
width: 50%;
flex: 1 1 auto;
margin-bottom: 12px;
}
}
}
</style>
diff --git a/src/components/video_attachment/video_attachment.vue b/src/components/video_attachment/video_attachment.vue
index a4bf01e8e2..8a3ea1e3a7 100644
--- a/src/components/video_attachment/video_attachment.vue
+++ b/src/components/video_attachment/video_attachment.vue
@@ -1,15 +1,16 @@
<template>
<video
class="video"
+ preload="metadata"
:src="attachment.url"
:loop="loopVideo"
:controls="controls"
:alt="attachment.description"
:title="attachment.description"
playsinline
@playing="onPlaying"
@pause="onPaused"
/>
</template>
<script src="./video_attachment.js"></script>
diff --git a/src/hocs/with_load_more/with_load_more.js b/src/hocs/with_load_more/with_load_more.js
index afb51a0f6d..7df9dbb2f2 100644
--- a/src/hocs/with_load_more/with_load_more.js
+++ b/src/hocs/with_load_more/with_load_more.js
@@ -1,104 +1,108 @@
import Vue from 'vue'
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
destroy, // function called at "destroyed" lifecycle
childPropName = 'entries', // name of the prop to be passed into the wrapped component
additionalPropNames = [] // additional prop name list of the wrapper component
}) => (WrappedComponent) => {
const originalProps = Object.keys(getComponentProps(WrappedComponent))
const props = originalProps.filter(v => v !== childPropName).concat(additionalPropNames)
return Vue.component('withLoadMore', {
props,
data () {
return {
loading: false,
bottomedOut: false,
error: false
}
},
computed: {
entries () {
return select(this.$props, this.$store) || []
}
},
created () {
window.addEventListener('scroll', this.scrollLoad)
if (this.entries.length === 0) {
this.fetchEntries()
}
},
destroyed () {
window.removeEventListener('scroll', this.scrollLoad)
destroy && destroy(this.$props, this.$store)
},
methods: {
fetchEntries () {
if (!this.loading) {
this.loading = true
this.error = false
fetch(this.$props, this.$store)
.then((newEntries) => {
this.loading = false
this.bottomedOut = isEmpty(newEntries)
})
.catch(() => {
this.loading = false
this.error = true
})
}
},
scrollLoad (e) {
const bodyBRect = document.body.getBoundingClientRect()
const height = Math.max(bodyBRect.height, -(bodyBRect.y))
if (this.loading === false &&
this.bottomedOut === false &&
this.$el.offsetHeight > 0 &&
(window.innerHeight + window.pageYOffset) >= (height - 750)
) {
this.fetchEntries()
}
}
},
render (h) {
const props = {
props: {
...this.$props,
[childPropName]: this.entries
},
on: this.$listeners,
scopedSlots: this.$scopedSlots
}
const children = Object.entries(this.$slots).map(([key, value]) => h('template', { slot: key }, value))
return (
<div class="with-load-more">
<WrappedComponent {...props}>
{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 &&
+ <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>
)
}
})
}
export default withLoadMore
diff --git a/src/i18n/en.json b/src/i18n/en.json
index d3d575624e..ef23efd60c 100644
--- a/src/i18n/en.json
+++ b/src/i18n/en.json
@@ -1,811 +1,813 @@
{
"about": {
"mrf": {
"federation": "Federation",
"keyword": {
"keyword_policies": "Keyword Policies",
"ftl_removal": "Removal from \"The Whole Known Network\" Timeline",
"reject": "Reject",
"replace": "Replace",
"is_replaced_by": "→"
},
"mrf_policies": "Enabled MRF Policies",
"mrf_policies_desc": "MRF policies manipulate the federation behaviour of the instance. The following policies are enabled:",
"simple": {
"simple_policies": "Instance-specific Policies",
"accept": "Accept",
"accept_desc": "This instance only accepts messages from the following instances:",
"reject": "Reject",
"reject_desc": "This instance will not accept messages from the following instances:",
"quarantine": "Quarantine",
"quarantine_desc": "This instance will send only public posts to the following instances:",
"ftl_removal": "Removal from \"The Whole Known Network\" Timeline",
"ftl_removal_desc": "This instance removes these instances from \"The Whole Known Network\" timeline:",
"media_removal": "Media Removal",
"media_removal_desc": "This instance removes media from posts on the following instances:",
"media_nsfw": "Media Force-set As Sensitive",
"media_nsfw_desc": "This instance forces media to be set sensitive in posts on the following instances:"
}
},
"staff": "Staff"
},
"shoutbox": {
"title": "Shoutbox"
},
"domain_mute_card": {
"mute": "Mute",
"mute_progress": "Mutingâ€Ļ",
"unmute": "Unmute",
"unmute_progress": "Unmutingâ€Ļ"
},
"exporter": {
"export": "Export",
"processing": "Processing, you'll soon be asked to download your file"
},
"features_panel": {
"chat": "Chat",
"pleroma_chat_messages": "Pleroma Chat",
"gopher": "Gopher",
"media_proxy": "Media proxy",
"scope_options": "Scope options",
"text_limit": "Text limit",
"title": "Features",
"who_to_follow": "Who to follow"
},
"finder": {
"error_fetching_user": "Error fetching user",
"find_user": "Find user"
},
"general": {
"apply": "Apply",
"submit": "Submit",
"more": "More",
"loading": "Loadingâ€Ļ",
"generic_error": "An error occured",
"error_retry": "Please try again",
"retry": "Try again",
"optional": "optional",
"show_more": "Show more",
"show_less": "Show less",
"dismiss": "Dismiss",
"cancel": "Cancel",
"disable": "Disable",
"enable": "Enable",
"confirm": "Confirm",
"verify": "Verify",
"close": "Close",
"peek": "Peek"
},
"image_cropper": {
"crop_picture": "Crop picture",
"save": "Save",
"save_without_cropping": "Save without cropping",
"cancel": "Cancel"
},
"importer": {
"submit": "Submit",
"success": "Imported successfully.",
"error": "An error occured while importing this file."
},
"login": {
"login": "Log in",
"description": "Log in with OAuth",
"logout": "Log out",
"password": "Password",
"placeholder": "e.g. lain",
"register": "Register",
"username": "Username",
"hint": "Log in to join the discussion",
"authentication_code": "Authentication code",
"enter_recovery_code": "Enter a recovery code",
"enter_two_factor_code": "Enter a two-factor code",
"recovery_code": "Recovery code",
"heading": {
"totp": "Two-factor authentication",
"recovery": "Two-factor recovery"
}
},
"media_modal": {
"previous": "Previous",
"next": "Next"
},
"nav": {
"about": "About",
"administration": "Administration",
"back": "Back",
"friend_requests": "Follow Requests",
"mentions": "Mentions",
"interactions": "Interactions",
"dms": "Direct Messages",
"public_tl": "Public Timeline",
"timeline": "Timeline",
"twkn": "Known Network",
"bookmarks": "Bookmarks",
"user_search": "User Search",
"search": "Search",
"who_to_follow": "Who to follow",
"preferences": "Preferences",
"timelines": "Timelines",
"chats": "Chats"
},
"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",
"load_older": "Load older notifications",
"notifications": "Notifications",
"read": "Read!",
"repeated_you": "repeated your status",
"no_more_notifications": "No more notifications",
"migrated_to": "migrated to",
"reacted_with": "reacted with {0}"
},
"polls": {
"add_poll": "Add Poll",
"add_option": "Add Option",
"option": "Option",
"votes": "votes",
"vote": "Vote",
"type": "Poll type",
"single_choice": "Single choice",
"multiple_choices": "Multiple choices",
"expiry": "Poll age",
"expires_in": "Poll ends in {0}",
"expired": "Poll ended {0} ago",
"not_enough_options": "Too few unique options in poll"
},
"emoji": {
"stickers": "Stickers",
"emoji": "Emoji",
"keep_open": "Keep picker open",
"search_emoji": "Search for an emoji",
"add_emoji": "Insert emoji",
"custom": "Custom emoji",
"unicode": "Unicode emoji",
"load_all_hint": "Loaded first {saneAmount} emoji, loading all emoji may cause performance issues.",
"load_all": "Loading all {emojiAmount} emoji"
},
"errors": {
"storage_unavailable": "Pleroma could not access browser storage. Your login or your local settings won't be saved and you might encounter unexpected issues. Try enabling cookies."
},
"interactions": {
"favs_repeats": "Repeats and Favorites",
"follows": "New follows",
"moves": "User migrates",
"load_older": "Load older interactions"
},
"post_status": {
"new_status": "Post new status",
"account_not_locked_warning": "Your account is not {0}. Anyone can follow you to view your follower-only posts.",
"account_not_locked_warning_link": "locked",
"attachments_sensitive": "Mark attachments as sensitive",
"media_description": "Media description",
"content_type": {
"text/plain": "Plain text",
"text/html": "HTML",
"text/markdown": "Markdown",
"text/bbcode": "BBCode"
},
"content_warning": "Subject (optional)",
"default": "Just landed in L.A.",
"direct_warning_to_all": "This post will be visible to all the mentioned users.",
"direct_warning_to_first_only": "This post will only be visible to the mentioned users at the beginning of the message.",
"posting": "Posting",
"preview": "Preview",
"preview_empty": "Empty",
"empty_status_error": "Can't post an empty status with no files",
"media_description_error": "Failed to update media, try again",
"scope_notice": {
"public": "This post will be visible to everyone",
"private": "This post will be visible to your followers only",
"unlisted": "This post will not be visible in Public Timeline and The Whole Known Network"
},
"scope": {
"direct": "Direct - Post to mentioned users only",
"private": "Followers-only - Post to followers only",
"public": "Public - Post to public timelines",
"unlisted": "Unlisted - Do not post to public timelines"
}
},
"registration": {
"bio": "Bio",
"email": "Email",
"fullname": "Display name",
"password_confirm": "Password confirmation",
"registration": "Registration",
"token": "Invite token",
"captcha": "CAPTCHA",
"new_captcha": "Click the image to get a new captcha",
"username_placeholder": "e.g. lain",
"fullname_placeholder": "e.g. Lain Iwakura",
"bio_placeholder": "e.g.\nHi, I'm Lain.\nI’m an anime girl living in suburban Japan. You may know me from the Wired.",
"validations": {
"username_required": "cannot be left blank",
"fullname_required": "cannot be left blank",
"email_required": "cannot be left blank",
"password_required": "cannot be left blank",
"password_confirmation_required": "cannot be left blank",
"password_confirmation_match": "should be the same as password"
}
},
"remote_user_resolver": {
"remote_user_resolver": "Remote user resolver",
"searching_for": "Searching for",
"error": "Not found."
},
"selectable_list": {
"select_all": "Select all"
},
"settings": {
"app_name": "App name",
"security": "Security",
"enter_current_password_to_confirm": "Enter your current password to confirm your identity",
"mfa": {
"otp": "OTP",
"setup_otp": "Setup OTP",
"wait_pre_setup_otp": "presetting OTP",
"confirm_and_enable": "Confirm & enable OTP",
"title": "Two-factor Authentication",
"generate_new_recovery_codes": "Generate new recovery codes",
"warning_of_generate_new_codes": "When you generate new recovery codes, your old codes won’t work anymore.",
"recovery_codes": "Recovery codes.",
"waiting_a_recovery_codes": "Receiving backup codesâ€Ļ",
"recovery_codes_warning": "Write the codes down or save them somewhere secure - otherwise you won't see them again. If you lose access to your 2FA app and recovery codes you'll be locked out of your account.",
"authentication_methods": "Authentication methods",
"scan": {
"title": "Scan",
"desc": "Using your two-factor app, scan this QR code or enter text key:",
"secret_code": "Key"
},
"verify": {
"desc": "To enable two-factor authentication, enter the code from your two-factor app:"
}
},
"allow_following_move": "Allow auto-follow when following account moves",
"attachmentRadius": "Attachments",
"attachments": "Attachments",
"avatar": "Avatar",
"avatarAltRadius": "Avatars (Notifications)",
"avatarRadius": "Avatars",
"background": "Background",
"bio": "Bio",
"block_export": "Block export",
"block_export_button": "Export your blocks to a csv file",
"block_import": "Block import",
"block_import_error": "Error importing blocks",
"blocks_imported": "Blocks imported! Processing them will take a while.",
"mute_export": "Mute export",
"mute_export_button": "Export your mutes to a csv file",
"mute_import": "Mute import",
"mute_import_error": "Error importing mutes",
"mutes_imported": "Mutes imported! Processing them will take a while.",
"import_mutes_from_a_csv_file": "Import mutes from a csv file",
"blocks_tab": "Blocks",
"bot": "This is a bot account",
"btnRadius": "Buttons",
"cBlue": "Blue (Reply, follow)",
"cGreen": "Green (Retweet)",
"cOrange": "Orange (Favorite)",
"cRed": "Red (Cancel)",
"change_email": "Change Email",
"change_email_error": "There was an issue changing your email.",
"changed_email": "Email changed successfully!",
"change_password": "Change Password",
"change_password_error": "There was an issue changing your password.",
"changed_password": "Password changed successfully!",
"chatMessageRadius": "Chat message",
"collapse_subject": "Collapse posts with subjects",
"composing": "Composing",
"confirm_new_password": "Confirm new password",
"current_password": "Current password",
"mutes_and_blocks": "Mutes and Blocks",
"data_import_export_tab": "Data Import / Export",
"default_vis": "Default visibility scope",
"delete_account": "Delete Account",
"delete_account_description": "Permanently delete your data and deactivate your account.",
"delete_account_error": "There was an issue deleting your account. If this persists please contact your instance administrator.",
"delete_account_instructions": "Type your password in the input below to confirm account deletion.",
"discoverable": "Allow discovery of this account in search results and other services",
"domain_mutes": "Domains",
"avatar_size_instruction": "The recommended minimum size for avatar images is 150x150 pixels.",
"pad_emoji": "Pad emoji with spaces when adding from picker",
"emoji_reactions_on_timeline": "Show emoji reactions on timeline",
"export_theme": "Save preset",
"filtering": "Filtering",
"filtering_explanation": "All statuses containing these words will be muted, one per line",
"follow_export": "Follow export",
"follow_export_button": "Export your follows to a csv file",
"follow_import": "Follow import",
"follow_import_error": "Error importing followers",
"follows_imported": "Follows imported! Processing them will take a while.",
"accent": "Accent",
"foreground": "Foreground",
"general": "General",
"hide_attachments_in_convo": "Hide attachments in conversations",
"hide_attachments_in_tl": "Hide attachments in timeline",
"hide_muted_posts": "Hide posts of muted users",
"max_thumbnails": "Maximum amount of thumbnails per post",
"hide_isp": "Hide instance-specific panel",
"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)",
"hide_user_stats": "Hide user statistics (e.g. the number of followers)",
"hide_filtered_statuses": "Hide filtered statuses",
"import_blocks_from_a_csv_file": "Import blocks from a csv file",
"import_followers_from_a_csv_file": "Import follows from a csv file",
"import_theme": "Load preset",
"inputRadius": "Input fields",
"checkboxRadius": "Checkboxes",
"instance_default": "(default: {value})",
"instance_default_simple": "(default)",
"interface": "Interface",
"interfaceLanguage": "Interface language",
"invalid_theme_imported": "The selected file is not a supported Pleroma theme. No changes to your theme were made.",
"limited_availability": "Unavailable in your browser",
"links": "Links",
"lock_account_description": "Restrict your account to approved followers only",
"loop_video": "Loop videos",
"loop_video_silent_only": "Loop only videos without sound (i.e. Mastodon's \"gifs\")",
"mutes_tab": "Mutes",
"play_videos_in_modal": "Play videos in a popup frame",
"profile_fields": {
"label": "Profile metadata",
"add_field": "Add Field",
"name": "Label",
"value": "Content"
},
"use_contain_fit": "Don't crop the attachment in thumbnails",
"name": "Name",
"name_bio": "Name & Bio",
"new_email": "New Email",
"new_password": "New password",
"notification_visibility": "Types of notifications to show",
"notification_visibility_follows": "Follows",
"notification_visibility_likes": "Likes",
"notification_visibility_mentions": "Mentions",
"notification_visibility_repeats": "Repeats",
"notification_visibility_moves": "User Migrates",
"notification_visibility_emoji_reactions": "Reactions",
"no_rich_text_description": "Strip rich text formatting from all posts",
"no_blocks": "No blocks",
"no_mutes": "No mutes",
"hide_follows_description": "Don't show who I'm following",
"hide_followers_description": "Don't show who's following me",
"hide_follows_count_description": "Don't show follow count",
"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",
"valid_until": "Valid Until",
"revoke_token": "Revoke",
"panelRadius": "Panels",
"pause_on_unfocused": "Pause streaming when tab is not focused",
"presets": "Presets",
"profile_background": "Profile Background",
"profile_banner": "Profile Banner",
"profile_tab": "Profile",
"radii_help": "Set up interface edge rounding (in pixels)",
"replies_in_timeline": "Replies in timeline",
"reply_visibility_all": "Show all replies",
"reply_visibility_following": "Only show replies directed at me or users I'm following",
"reply_visibility_self": "Only show replies directed at me",
"autohide_floating_post_button": "Automatically hide New Post button (mobile)",
"saving_err": "Error saving settings",
"saving_ok": "Settings saved",
"search_user_to_block": "Search whom you want to block",
"search_user_to_mute": "Search whom you want to mute",
"security_tab": "Security",
"scope_copy": "Copy scope when replying (DMs are always copied)",
"minimal_scopes_mode": "Minimize post scope selection options",
"set_new_avatar": "Set new avatar",
"set_new_profile_background": "Set new profile background",
"set_new_profile_banner": "Set new profile banner",
"reset_avatar": "Reset avatar",
"reset_profile_background": "Reset profile background",
"reset_profile_banner": "Reset profile banner",
"reset_avatar_confirm": "Do you really want to reset the avatar?",
"reset_banner_confirm": "Do you really want to reset the banner?",
"reset_background_confirm": "Do you really want to reset the background?",
"settings": "Settings",
"subject_input_always_show": "Always show subject field",
"subject_line_behavior": "Copy subject when replying",
"subject_line_email": "Like email: \"re: subject\"",
"subject_line_mastodon": "Like mastodon: copy as is",
"subject_line_noop": "Do not copy",
"post_status_content_type": "Post status content type",
"stop_gifs": "Play-on-hover GIFs",
"streaming": "Enable automatic streaming of new posts when scrolled to the top",
"user_mutes": "Users",
"useStreamingApi": "Receive posts and notifications real-time",
"useStreamingApiWarning": "(Not recommended, experimental, known to skip posts)",
"text": "Text",
"theme": "Theme",
"theme_help": "Use hex color codes (#rrggbb) to customize your color theme.",
"theme_help_v2_1": "You can also override certain component's colors and opacity by toggling the checkbox, use \"Clear all\" button to clear all overrides.",
"theme_help_v2_2": "Icons underneath some entries are background/text contrast indicators, hover over for detailed info. Please keep in mind that when using transparency contrast indicators show the worst possible case.",
"tooltipRadius": "Tooltips/alerts",
"type_domains_to_mute": "Search domains to mute",
"upload_a_photo": "Upload a photo",
"user_settings": "User Settings",
"values": {
"false": "no",
"true": "yes"
},
"virtual_scrolling": "Optimize timeline rendering",
"fun": "Fun",
"greentext": "Meme arrows",
"notifications": "Notifications",
"notification_setting_filters": "Filters",
"notification_setting_block_from_strangers": "Block notifications from users who you do not follow",
"notification_setting_privacy": "Privacy",
"notification_setting_hide_notification_contents": "Hide the sender and contents of push notifications",
"notification_mutes": "To stop receiving notifications from a specific user, use a mute.",
"notification_blocks": "Blocking a user stops all notifications as well as unsubscribes them.",
"enable_web_push_notifications": "Enable web push notifications",
"style": {
"switcher": {
"keep_color": "Keep colors",
"keep_shadows": "Keep shadows",
"keep_opacity": "Keep opacity",
"keep_roundness": "Keep roundness",
"keep_fonts": "Keep fonts",
"save_load_hint": "\"Keep\" options preserve currently set options when selecting or loading themes, it also stores said options when exporting a theme. When all checkboxes unset, exporting theme will save everything.",
"reset": "Reset",
"clear_all": "Clear all",
"clear_opacity": "Clear opacity",
"load_theme": "Load theme",
"keep_as_is": "Keep as is",
"use_snapshot": "Old version",
"use_source": "New version",
"help": {
"upgraded_from_v2": "PleromaFE has been upgraded, theme could look a little bit different than you remember.",
"v2_imported": "File you imported was made for older FE. We try to maximize compatibility but there still could be inconsistencies.",
"future_version_imported": "File you imported was made in newer version of FE.",
"older_version_imported": "File you imported was made in older version of FE.",
"snapshot_present": "Theme snapshot is loaded, so all values are overriden. You can load theme's actual data instead.",
"snapshot_missing": "No theme snapshot was in the file so it could look different than originally envisioned.",
"fe_upgraded": "PleromaFE's theme engine upgraded after version update.",
"fe_downgraded": "PleromaFE's version rolled back.",
"migration_snapshot_ok": "Just to be safe, theme snapshot loaded. You can try loading theme data.",
"migration_napshot_gone": "For whatever reason snapshot was missing, some stuff could look different than you remember.",
"snapshot_source_mismatch": "Versions conflict: most likely FE was rolled back and updated again, if you changed theme using older version of FE you most likely want to use old version, otherwise use new version."
}
},
"common": {
"color": "Color",
"opacity": "Opacity",
"contrast": {
"hint": "Contrast ratio is {ratio}, it {level} {context}",
"level": {
"aa": "meets Level AA guideline (minimal)",
"aaa": "meets Level AAA guideline (recommended)",
"bad": "doesn't meet any accessibility guidelines"
},
"context": {
"18pt": "for large (18pt+) text",
"text": "for text"
}
}
},
"common_colors": {
"_tab_label": "Common",
"main": "Common colors",
"foreground_hint": "See \"Advanced\" tab for more detailed control",
"rgbo": "Icons, accents, badges"
},
"advanced_colors": {
"_tab_label": "Advanced",
"alert": "Alert background",
"alert_error": "Error",
"alert_warning": "Warning",
"alert_neutral": "Neutral",
"post": "Posts/User bios",
"badge": "Badge background",
"popover": "Tooltips, menus, popovers",
"badge_notification": "Notification",
"panel_header": "Panel header",
"top_bar": "Top bar",
"borders": "Borders",
"buttons": "Buttons",
"inputs": "Input fields",
"faint_text": "Faded text",
"underlay": "Underlay",
"poll": "Poll graph",
"icons": "Icons",
"highlight": "Highlighted elements",
"pressed": "Pressed",
"selectedPost": "Selected post",
"selectedMenu": "Selected menu item",
"disabled": "Disabled",
"toggled": "Toggled",
"tabs": "Tabs",
"chat": {
"incoming": "Incoming",
"outgoing": "Outgoing",
"border": "Border"
}
},
"radii": {
"_tab_label": "Roundness"
},
"shadows": {
"_tab_label": "Shadow and lighting",
"component": "Component",
"override": "Override",
"shadow_id": "Shadow #{value}",
"blur": "Blur",
"spread": "Spread",
"inset": "Inset",
"hintV3": "For shadows you can also use the {0} notation to use other color slot.",
"filter_hint": {
"always_drop_shadow": "Warning, this shadow always uses {0} when browser supports it.",
"drop_shadow_syntax": "{0} does not support {1} parameter and {2} keyword.",
"avatar_inset": "Please note that combining both inset and non-inset shadows on avatars might give unexpected results with transparent avatars.",
"spread_zero": "Shadows with spread > 0 will appear as if it was set to zero",
"inset_classic": "Inset shadows will be using {0}"
},
"components": {
"panel": "Panel",
"panelHeader": "Panel header",
"topBar": "Top bar",
"avatar": "User avatar (in profile view)",
"avatarStatus": "User avatar (in post display)",
"popup": "Popups and tooltips",
"button": "Button",
"buttonHover": "Button (hover)",
"buttonPressed": "Button (pressed)",
"buttonPressedHover": "Button (pressed+hover)",
"input": "Input field"
}
},
"fonts": {
"_tab_label": "Fonts",
"help": "Select font to use for elements of UI. For \"custom\" you have to enter exact font name as it appears in system.",
"components": {
"interface": "Interface",
"input": "Input fields",
"post": "Post text",
"postCode": "Monospaced text in a post (rich text)"
},
"family": "Font name",
"size": "Size (in px)",
"weight": "Weight (boldness)",
"custom": "Custom"
},
"preview": {
"header": "Preview",
"content": "Content",
"error": "Example error",
"button": "Button",
"text": "A bunch of more {0} and {1}",
"mono": "content",
"input": "Just landed in L.A.",
"faint_link": "helpful manual",
"fine_print": "Read our {0} to learn nothing useful!",
"header_faint": "This is fine",
"checkbox": "I have skimmed over terms and conditions",
"link": "a nice lil' link"
}
},
"version": {
"title": "Version",
"backend_version": "Backend Version",
"frontend_version": "Frontend Version"
}
},
"time": {
"day": "{0} day",
"days": "{0} days",
"day_short": "{0}d",
"days_short": "{0}d",
"hour": "{0} hour",
"hours": "{0} hours",
"hour_short": "{0}h",
"hours_short": "{0}h",
"in_future": "in {0}",
"in_past": "{0} ago",
"minute": "{0} minute",
"minutes": "{0} minutes",
"minute_short": "{0}min",
"minutes_short": "{0}min",
"month": "{0} month",
"months": "{0} months",
"month_short": "{0}mo",
"months_short": "{0}mo",
"now": "just now",
"now_short": "now",
"second": "{0} second",
"seconds": "{0} seconds",
"second_short": "{0}s",
"seconds_short": "{0}s",
"week": "{0} week",
"weeks": "{0} weeks",
"week_short": "{0}w",
"weeks_short": "{0}w",
"year": "{0} year",
"years": "{0} years",
"year_short": "{0}y",
"years_short": "{0}y"
},
"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",
"show_new": "Show new",
"reload": "Reload",
"up_to_date": "Up-to-date",
"no_more_statuses": "No more statuses",
"no_statuses": "No statuses"
},
"status": {
"favorites": "Favorites",
"repeats": "Repeats",
"delete": "Delete status",
"pin": "Pin on profile",
"unpin": "Unpin from profile",
"pinned": "Pinned",
"bookmark": "Bookmark",
"unbookmark": "Unbookmark",
"delete_confirm": "Do you really want to delete this status?",
"reply_to": "Reply to",
"replies_list": "Replies:",
"mute_conversation": "Mute conversation",
"unmute_conversation": "Unmute conversation",
"status_unavailable": "Status unavailable",
"copy_link": "Copy link to status",
"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"
},
"user_card": {
"approve": "Approve",
"block": "Block",
"blocked": "Blocked!",
"deny": "Deny",
"favorites": "Favorites",
"follow": "Follow",
"follow_sent": "Request sent!",
"follow_progress": "Requestingâ€Ļ",
"follow_again": "Send request again?",
"follow_unfollow": "Unfollow",
"followees": "Following",
"followers": "Followers",
"following": "Following!",
"follows_you": "Follows you!",
"hidden": "Hidden",
"its_you": "It's you!",
"media": "Media",
"mention": "Mention",
"message": "Message",
"mute": "Mute",
"muted": "Muted",
"per_day": "per day",
"remote_follow": "Remote follow",
"report": "Report",
"statuses": "Statuses",
"subscribe": "Subscribe",
"unsubscribe": "Unsubscribe",
"unblock": "Unblock",
"unblock_progress": "Unblockingâ€Ļ",
"block_progress": "Blockingâ€Ļ",
"unmute": "Unmute",
"unmute_progress": "Unmutingâ€Ļ",
"mute_progress": "Mutingâ€Ļ",
"hide_repeats": "Hide repeats",
"show_repeats": "Show repeats",
"admin_menu": {
"moderation": "Moderation",
"grant_admin": "Grant Admin",
"revoke_admin": "Revoke Admin",
"grant_moderator": "Grant Moderator",
"revoke_moderator": "Revoke Moderator",
"activate_account": "Activate account",
"deactivate_account": "Deactivate account",
"delete_account": "Delete account",
"force_nsfw": "Mark all posts as NSFW",
"strip_media": "Remove media from posts",
"force_unlisted": "Force posts to be unlisted",
"sandbox": "Force posts to be followers-only",
"disable_remote_subscription": "Disallow following user from remote instances",
"disable_any_subscription": "Disallow following user at all",
"quarantine": "Disallow user posts from federating",
"delete_user": "Delete user",
"delete_user_confirmation": "Are you absolutely sure? This action cannot be undone."
}
},
"user_profile": {
"timeline_title": "User Timeline",
"profile_does_not_exist": "Sorry, this profile does not exist.",
"profile_loading_error": "Sorry, there was an error loading this profile."
},
"user_reporting": {
"title": "Reporting {0}",
"add_comment_description": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
"additional_comments": "Additional comments",
"forward_description": "The account is from another server. Send a copy of the report there as well?",
"forward_to": "Forward to {0}",
"submit": "Submit",
"generic_error": "An error occurred while processing your request."
},
"who_to_follow": {
"more": "More",
"who_to_follow": "Who to follow"
},
"tool_tip": {
"media_upload": "Upload Media",
"repeat": "Repeat",
"reply": "Reply",
"favorite": "Favorite",
"add_reaction": "Add Reaction",
"user_settings": "User Settings",
"accept_follow_request": "Accept follow request",
"reject_follow_request": "Reject follow request",
"bookmark": "Bookmark"
},
"upload": {
"error": {
"base": "Upload failed.",
"file_too_big": "File too big [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",
"default": "Try again later"
},
"file_size_units": {
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB"
}
},
"search": {
"people": "People",
"hashtags": "Hashtags",
"person_talking": "{count} person talking",
"people_talking": "{count} people talking",
"no_results": "No results"
},
"password_reset": {
"forgot_password": "Forgot password?",
"password_reset": "Password reset",
"instruction": "Enter your email address or username. We will send you a link to reset your password.",
"placeholder": "Your email or username",
"check_email": "Check your email for a link to reset your password.",
"return_home": "Return to the home page",
"too_many_requests": "You have reached the limit of attempts, try again later.",
"password_reset_disabled": "Password reset is disabled. Please contact your instance administrator.",
"password_reset_required": "You must reset your password to log in.",
"password_reset_required_but_mailer_is_disabled": "You must reset your password, but password reset is disabled. Please contact your instance administrator."
},
"chats": {
"you": "You:",
"message_user": "Message {nickname}",
"delete": "Delete",
"chats": "Chats",
"new": "New Chat",
"empty_message_error": "Cannot post empty message",
"more": "More",
"delete_confirm": "Do you really want to delete this message?",
"error_loading_chat": "Something went wrong when loading the chat.",
"error_sending_message": "Something went wrong when sending the message.",
"empty_chat_list_placeholder": "You don't have any chats yet. Start a new chat!"
},
"file_type": {
"audio": "Audio",
"video": "Video",
"image": "Image",
"file": "File"
},
"display_date": {
"today": "Today"
}
}
diff --git a/src/i18n/eo.json b/src/i18n/eo.json
index 1247d50dfb..b0a15cfe3d 100644
--- a/src/i18n/eo.json
+++ b/src/i18n/eo.json
@@ -1,820 +1,820 @@
{
"chat": {
"title": "Babilejo"
},
"features_panel": {
"chat": "Babilejo",
"gopher": "Gopher",
"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"
},
"finder": {
"error_fetching_user": "Eraris alporto de uzanto",
"find_user": "Trovi uzanton"
},
"general": {
"apply": "Apliki",
"submit": "Sendi",
"more": "Pli",
"generic_error": "Eraro okazis",
"optional": "malnepra",
"close": "Fermi",
"verify": "Kontroli",
"confirm": "Konfirmi",
"enable": "Ŝalti",
"disable": "Malŝalti",
"cancel": "Nuligi",
"dismiss": "Forlasi",
"show_less": "Montri malplion",
"show_more": "Montri plion",
"retry": "Reprovi",
"error_retry": "Bonvolu reprovi",
"loading": "Enleganteâ€Ļ",
"peek": "AntaÅ­montri"
},
"image_cropper": {
"crop_picture": "Tondi bildon",
"save": "Konservi",
"cancel": "Nuligi",
"save_without_cropping": "Konservi sen tondado"
},
"login": {
"login": "Saluti",
"description": "Saluti per OAuth",
"logout": "AdiaÅ­i",
"password": "Pasvorto",
"placeholder": "ekz. lain",
"register": "Registriĝi",
"username": "Uzantonomo",
"hint": "Salutu por partopreni la diskutadon",
"heading": {
"recovery": "Rehavo de duobla aÅ­tentikigo",
"totp": "Duobla aÅ­tentikigo"
},
"recovery_code": "Rehava kodo",
"enter_two_factor_code": "Enigu kodon de duobla aÅ­tentikigo",
"enter_recovery_code": "Enigu rehavan kodon",
"authentication_code": "AÅ­tentikiga kodo"
},
"media_modal": {
"previous": "AntaÅ­a",
"next": "Sekva"
},
"nav": {
"about": "Pri",
"back": "Reen",
"chat": "Loka babilejo",
"friend_requests": "Petoj pri abono",
"mentions": "Mencioj",
"dms": "Rektaj mesaĝoj",
"public_tl": "Publika historio",
"timeline": "Historio",
"twkn": "Konata reto",
"user_search": "Serĉi uzantojn",
"who_to_follow": "Kiun aboni",
"preferences": "Agordoj",
"chats": "Babiloj",
"search": "Serĉi",
"interactions": "Interagoj",
"administration": "Administrado",
"bookmarks": "Legosignoj",
"timelines": "Historioj"
},
"notifications": {
"broken_favorite": "Nekonata stato, serĉante ĝinâ€Ļ",
"favorited_you": "ŝatis vian staton",
"followed_you": "ekabonis vin",
"load_older": "Enlegi pli malnovajn sciigojn",
"notifications": "Sciigoj",
"read": "Legite!",
"repeated_you": "ripetis vian staton",
"no_more_notifications": "Neniuj pliaj sciigoj",
"reacted_with": "reagis per {0}",
"migrated_to": "migris al",
"follow_request": "volas vin aboni"
},
"post_status": {
"new_status": "Afiŝi novan staton",
"account_not_locked_warning": "Via konto ne estas {0}. Iu ajn povas vin aboni por vidi eĉ viajn afiŝoj nur por abonantoj.",
"account_not_locked_warning_link": "ŝlosita",
"attachments_sensitive": "Marki kunsendaÄĩojn konsternaj",
"content_type": {
"text/plain": "Plata teksto",
"text/bbcode": "BBCode",
"text/markdown": "Markdown",
"text/html": "HTML"
},
"content_warning": "Temo (malnepra)",
"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 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",
"private": "Ĉi tiu afiŝo estos videbla nur al viaj abonantoj",
"public": "Ĉi tiu afiŝo estos videbla al ĉiuj"
},
"media_description_error": "Malsukcesis afiŝo de vidaÅ­daÄĩoj; reprovu",
"empty_status_error": "Ne povas afiŝi malplenan staton sen dosieroj",
"preview_empty": "Malplena",
"preview": "AntaÅ­rigardo",
"direct_warning_to_first_only": "Ĉi tiu afiŝo estas nur videbla al uzantoj menciitaj je la komenco de la mesaĝo.",
"direct_warning_to_all": "Ĉi tiu afiŝo estos videbla al ĉiuj menciitaj uzantoj.",
"media_description": "Priskribo de vidaÅ­daÄĩo"
},
"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",
"fullname_required": "ne povas resti malplena",
"email_required": "ne povas resti malplena",
"password_required": "ne povas resti malplena",
"password_confirmation_required": "ne povas resti malplena",
"password_confirmation_match": "samu la pasvorton"
}
},
"settings": {
"app_name": "Nomo de aplikaÄĩo",
"attachmentRadius": "KunsendaÄĩoj",
"attachments": "KunsendaÄĩoj",
"avatar": "Profilbildo",
"avatarAltRadius": "Profilbildoj (sciigoj)",
"avatarRadius": "Profilbildoj",
"background": "Fono",
"bio": "Priskribo",
"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",
"change_password_error": "Eraris ŝanĝo de via pasvorto.",
"changed_password": "Pasvorto sukcese ŝanĝiĝis!",
"collapse_subject": "Maletendi afiŝojn kun temoj",
"composing": "Verkado",
"confirm_new_password": "Konfirmu novan pasvorton",
"current_avatar": "Via nuna profilbildo",
"current_password": "Nuna pasvorto",
"current_profile_banner": "Via nuna profila rubando",
"data_import_export_tab": "Enporto / Elporto de datumoj",
"default_vis": "Implicita amplekso de vidibleco",
"delete_account": "Forigi konton",
"delete_account_description": "Por ĉiam forigi viajn datumojn kaj malaktivigi vian konton.",
"delete_account_error": "Eraris forigo de via kanto. Se tio daŭre ripetiĝos, bonvolu kontakti la administranton de via nodo.",
"delete_account_instructions": "Entajpu sube vian pasvorton por konfirmi forigon de konto.",
"avatar_size_instruction": "La rekomendata minimuma grando de profilbildoj estas 150×150 bilderoj.",
"export_theme": "Konservi antaÅ­agordon",
"filtering": "Filtrado",
"filtering_explanation": "Ĉiuj statoj kun tiuj ĉi vortoj silentiĝos; skribu po unu linie",
"follow_export": "Elporto de abonoj",
"follow_export_button": "Elporti viajn abonojn al CSV-dosiero",
"follow_export_processing": "Traktante; baldaŭ vi ricevos peton elŝuti la dosieron",
"follow_import": "Enporto de abonoj",
"follow_import_error": "Eraro enportante abonojn",
"follows_imported": "Abonoj enportiĝis! Traktado daŭros iom da tempo.",
"foreground": "Malfono",
"general": "Ĝenerala",
"hide_attachments_in_convo": "Kaŝi kunsendaÄĩojn en interparoloj",
"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",
"use_one_click_nsfw": "Malfermi konsternajn kunsendaÄĩojn per nur unu klako",
"hide_post_stats": "Kaŝi statistikon de afiŝoj (ekz. nombron de ŝatoj)",
"hide_user_stats": "Kaŝi statistikon de uzantoj (ekz. nombron de abonantoj)",
"hide_filtered_statuses": "Kaŝi filtritajn statojn",
"import_followers_from_a_csv_file": "Enporti abonojn el CSV-dosiero",
"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.",
"limited_availability": "Nehavebla en via foliumilo",
"links": "Ligiloj",
"lock_account_description": "Limigi vian konton al nur abonantoj aprobitaj",
"loop_video": "Ripetadi filmojn",
"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",
"notification_visibility": "Montrotaj specoj de sciigoj",
"notification_visibility_follows": "Abonoj",
"notification_visibility_likes": "Ŝatoj",
"notification_visibility_mentions": "Mencioj",
"notification_visibility_repeats": "Ripetoj",
"no_rich_text_description": "Forigi riĉtekstajn formojn de ĉiuj afiŝoj",
"no_blocks": "Neniuj blokitoj",
"no_mutes": "Neniuj silentigoj",
"hide_follows_description": "Ne montri kiun mi sekvas",
"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",
"oauth_tokens": "Ä´etonoj de OAuth",
"token": "Ä´etono",
"refresh_token": "Ä´etono de aktualigo",
"valid_until": "Valida ĝis",
"revoke_token": "Senvalidigi",
"panelRadius": "Bretoj",
"pause_on_unfocused": "PaÅ­zigi elsendfluon kiam langeto ne estas fokusata",
"presets": "AntaÅ­agordoj",
"profile_background": "Fono de profilo",
"profile_banner": "Rubando de profilo",
"profile_tab": "Profilo",
"radii_help": "Agordi fasadan rondigon de randoj (bildere)",
"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",
"saving_err": "Eraris konservado de agordoj",
"saving_ok": "Agordoj konserviĝis",
"security_tab": "Sekureco",
"scope_copy": "Kopii amplekson por respondo (rektaj mesaĝoj ĉiam kopiiĝas)",
"set_new_avatar": "Agordi novan profilbildon",
"set_new_profile_background": "Agordi novan fonon de profilo",
"set_new_profile_banner": "Agordi novan rubandon de profilo",
"settings": "Agordoj",
"subject_input_always_show": "Ĉiam montri kampon de temo",
"subject_line_behavior": "Kopii temon dum respondado",
"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",
"theme": "HaÅ­to",
"theme_help": "Uzu deksesumajn kolorkodojn (#rrvvbb) por adapti vian koloran haÅ­ton.",
"theme_help_v2_1": "Vi ankaÅ­ povas superagordi la kolorojn kaj travideblecon de kelkaj eroj per marko de la markbutono; uzu la butonon ÂĢVakigi ĉionÂģ por forigi ĉÎujn superagordojn.",
"theme_help_v2_2": "Bildsimboloj sub kelkaj eroj estas indikiloj de kontrasto inter fono kaj teksto; ŝvebigu muson por detalaj informoj. Bonvolu memori, ke la indikilo montras la plej malbonan okazeblon dum sia uzo.",
"tooltipRadius": "Ŝpruchelpiloj/avertoj",
"upload_a_photo": "Alŝuti foton",
"user_settings": "Agordoj de uzanto",
"values": {
"false": "ne",
"true": "jes"
},
"notifications": "Sciigoj",
"enable_web_push_notifications": "Ŝalti retajn pasivajn sciigojn",
"style": {
"switcher": {
"keep_color": "Konservi kolorojn",
"keep_shadows": "Konservi ombrojn",
"keep_opacity": "Konservi maltravideblecon",
"keep_roundness": "Konservi rondecon",
"keep_fonts": "Konservi tiparojn",
"save_load_hint": "Elektebloj de ÂĢkonserviÂģ konservas la nuntempajn agordojn dum elektado aÅ­ enlegado de haÅ­toj. Ĝi ankaÅ­ konservas tiujn agordojn dum elportado de haÅ­to. Kun ĉiuj markbutonoj nemarkitaj, elporto de la haÅ­to ĉion konservos.",
"reset": "Restarigi",
"clear_all": "Vakigi ĉion",
"clear_opacity": "Vakigi maltravideblecon",
"help": {
"fe_downgraded": "Versio de PleromaFE reen iris.",
"fe_upgraded": "La motoro de haŭtoj de PleromaFE ĝisdatiĝis post ĝisdatigo de la versio.",
"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.",
"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",
"keep_as_is": "Teni senŝanĝa",
"load_theme": "Enlegi haÅ­ton"
},
"common": {
"color": "Koloro",
"opacity": "Maltravidebleco",
"contrast": {
"hint": "Proporcio de kontrasto estas {ratio}, ĝi {level} {context}",
"level": {
"aa": "plenumas la gvidilon je nivelo AA (minimuma)",
"aaa": "plenumas la gvidilon je nivela AAA (rekomendita)",
"bad": "plenumas neniujn faciluzajn gvidilojn"
},
"context": {
"18pt": "por granda (18pt+) teksto",
"text": "por teksto"
}
}
},
"common_colors": {
"_tab_label": "Komunaj",
"main": "Komunaj koloroj",
"foreground_hint": "Vidu langeton ÂĢSpecialajÂģ por pli detalaj agordoj",
"rgbo": "Bildsimboloj, emfazoj, insignoj"
},
"advanced_colors": {
"_tab_label": "Specialaj",
"alert": "Fono de averto",
"alert_error": "Eraro",
"badge": "Fono de insigno",
"badge_notification": "Sciigo",
"panel_header": "Kapo de breto",
"top_bar": "Supra breto",
"borders": "Limoj",
"buttons": "Butonoj",
"inputs": "Enigaj kampoj",
"faint_text": "Malvigla teksto",
"chat": {
"border": "Limo",
"outgoing": "Eliraj",
"incoming": "Envenaj"
},
"tabs": "Langetoj",
"disabled": "Malŝaltita",
"selectedMenu": "Elektita menuero",
"selectedPost": "Elektita afiŝo",
"pressed": "Premita",
"highlight": "Emfazitaj eroj",
"icons": "Bildsimboloj",
"poll": "Grafo de enketo",
"underlay": "Subtavolo",
"popover": "ŜprucaÄĩoj, menuoj",
"post": "Afiŝoj/Priskriboj de uzantoj",
"alert_neutral": "NeÅ­trala",
"alert_warning": "Averto",
"toggled": "Ŝaltita"
},
"radii": {
"_tab_label": "Rondeco"
},
"shadows": {
"_tab_label": "Ombro kaj lumo",
"component": "Ero",
"override": "Transpasi",
"shadow_id": "Ombro #{value}",
"blur": "Malklarigo",
"spread": "Vastigo",
"inset": "Internigo",
"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}"
},
"components": {
"panel": "Breto",
"panelHeader": "Kapo de breto",
"topBar": "Supra breto",
"avatar": "Profilbildo de uzanto (en profila vido)",
"avatarStatus": "Profilbildo de uzanto (en afiŝa vido)",
"popup": "ŜprucaÄĩoj",
"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",
"help": "Elektu tiparon uzotan por eroj de la fasado. Por ÂĢpropraÂģ vi devas enigi la precizan nomon de tiparo tiel, kiel ĝi aperas en la sistemo.",
"components": {
"interface": "Fasado",
"input": "Enigaj kampoj",
"post": "Teksto de afiŝo",
"postCode": "Egallarĝa teksto en afiŝo (riĉteksto)"
},
"family": "Nomo de tiparo",
"size": "Grando (en bilderoj)",
"weight": "Pezo (graseco)",
"custom": "Propra"
},
"preview": {
"header": "AntaÅ­rigardo",
"content": "Enhavo",
"error": "Ekzempla eraro",
"button": "Butono",
"text": "Kelko da pliaj {0} kaj {1}",
"mono": "enhavo",
"input": "Ä´us alvenis Esperantujon!",
"faint_link": "helpan manlibron",
"fine_print": "Legu nian {0} por nenion utilan ekscii!",
"header_faint": "Tio estas en ordo",
"checkbox": "Mi legetis la kondiĉojn de uzado",
"link": "bela eta ligil’"
}
},
"discoverable": "Permesi trovon de ĉi tiu konto en serĉrezultoj kaj aliaj servoj",
"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.",
"change_email": "Ŝanĝi retpoŝtadreson",
"bot": "Ĉi tio estas robota konto",
"blocks_imported": "Blokitoj enportiĝis! Traktado daŭros iom da tempo.",
"block_import_error": "Eraris enporto de blokitoj",
"block_export": "Elporto de blokitoj",
"block_import": "Enporto de blokitoj",
"block_export_button": "Elporti viajn blokitojn al CSV-dosiero",
"allow_following_move": "Permesi memagan abonadon kiam abonata konto migras",
"mfa": {
"verify": {
"desc": "Por ŝalti duoblan aÅ­tentikigon, enigu la kodon el via aplikaÄĩo por duobla aÅ­tentikigo:"
},
"scan": {
"secret_code": "Ŝlosilo",
"desc": "Uzante vian aplikaÄĩon por duobla aÅ­tentikigo, skanu ĉi tiun rapidrespondan kodon aÅ­ enigu tekstan ŝlosilon:",
"title": "Skani"
},
"authentication_methods": "Metodoj de aÅ­tentikigo",
"recovery_codes_warning": "Notu la kodojn aÅ­ konservu ilin en sekura loko – alie vi ne revidos ilin. Se vi perdos aliron al via aplikaÄĩo por duobla aÅ­tentikigo kaj al la rehavaj kodoj, vi ne povos aliri vian konton.",
"waiting_a_recovery_codes": "Ricevante savkopiajn kodojnâ€Ļ",
"recovery_codes": "Rehavaj kodoj.",
"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",
"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",
"fun": "Amuzo",
"type_domains_to_mute": "Serĉu silentigotajn retnomojn",
"useStreamingApiWarning": "(Nerekomendate, eksperimente, povas preterpasi afiŝojn)",
"useStreamingApi": "Ricevi afiŝojn kaj sciigojn realtempe",
"user_mutes": "Uzantoj",
"reset_background_confirm": "Ĉu vi certe volas restarigi la fonon?",
"reset_banner_confirm": "Ĉu vi certe volas restarigi la rubandon?",
"reset_avatar_confirm": "Ĉu vi certe volas restarigi la profilbildon?",
"reset_profile_banner": "Restarigi rubandon de profilo",
"reset_profile_background": "Restarigi fonon de profilo",
"reset_avatar": "Restarigi profilbildon",
"minimal_scopes_mode": "Minimumigi elekteblojn pri amplekso de afiŝoj",
"search_user_to_block": "Serĉu, kiun vi volas bloki",
"search_user_to_mute": "Serĉu, kiun vi volas silentigi",
"autohide_floating_post_button": "Memage kaŝi la butonon por Nova afiŝo (poŝtelefone)",
"hide_followers_count_description": "Ne montri nombron de abonantoj",
"hide_follows_count_description": "Ne montri nombron de abonoj",
"notification_visibility_emoji_reactions": "Reagoj",
"notification_visibility_moves": "Migroj",
"new_email": "Nova retpoŝtadreso",
"profile_fields": {
"value": "Enhavo",
"name": "Etikedo",
"add_field": "Aldoni kampon",
"label": "Pridatumoj de profilo"
},
"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 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 ĝ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",
"notification_setting_filters": "Filtriloj",
"greentext": "MemecitaÄĩoj",
"version": {
"frontend_version": "Versio de fasado",
"backend_version": "Versio de internaÄĩo",
"title": "Versio"
},
"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",
"conversation": "Interparolo",
"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": "ripetis",
"show_new": "Montri novajn",
"up_to_date": "Ĝisdata",
"no_more_statuses": "Neniuj pliaj statoj",
"no_statuses": "Neniuj statoj",
"reload": "Enlegi ree"
},
"user_card": {
"approve": "Aprobi",
"block": "Bloki",
"blocked": "Blokita!",
"deny": "Rifuzi",
"favorites": "Ŝatataj",
"follow": "Aboni",
"follow_sent": "Peto sendiĝis!",
"follow_progress": "Petanteâ€Ļ",
"follow_again": "Ĉu sendi peton ree?",
"follow_unfollow": "Malaboni",
"followees": "Abonatoj",
"followers": "Abonantoj",
"following": "Abonata!",
"follows_you": "Abonas vin!",
"its_you": "Tio estas vi!",
"media": "VidaÅ­daÄĩoj",
"mute": "Silentigi",
"muted": "Silentigita",
"per_day": "tage",
"remote_follow": "Fore aboni",
"statuses": "Statoj",
"unblock": "Malbloki",
"unblock_progress": "Malblokanteâ€Ļ",
"block_progress": "Blokanteâ€Ļ",
"unmute": "Malsilentigi",
"unmute_progress": "Malsilentiganteâ€Ļ",
"mute_progress": "Silentiganteâ€Ļ",
"report": "Raporti",
"message": "Mesaĝo",
"mention": "Mencio",
"hidden": "Kaŝita",
"admin_menu": {
"delete_user_confirmation": "Ĉu vi tute certas? Ĉi tiu ago ne estas malfarebla.",
"delete_user": "Forigi uzanton",
"quarantine": "Malpermesi federadon de afiŝoj de uzanto",
"disable_any_subscription": "Malpermesi ĉian abonadon al uzanto",
"disable_remote_subscription": "Malpermesi abonadon al uzanto el foraj nodoj",
"sandbox": "Devigi afiŝojn esti nur por abonantoj",
"force_unlisted": "Devigi afiŝojn nelistiĝi",
"strip_media": "Forigi vidaÅ­daÄĩojn de afiŝoj",
"force_nsfw": "Marki ĉiujn afiŝojn konsternaj",
"delete_account": "Forigi konton",
"deactivate_account": "Malaktivigi konton",
"activate_account": "Aktivigi konton",
"revoke_moderator": "Malnomumi reguligiston",
"grant_moderator": "Nomumi reguligiston",
"revoke_admin": "Malnomumi administranton",
"grant_admin": "Nomumi administranton",
"moderation": "Reguligado"
},
"show_repeats": "Montri ripetojn",
"hide_repeats": "Kaŝi ripetojn",
"unsubscribe": "Ne ricevi sciigojn",
"subscribe": "Ricevi sciigojn"
},
"user_profile": {
"timeline_title": "Historio de uzanto",
"profile_does_not_exist": "Pardonu, ĉi tiu profilo ne ekzistas.",
"profile_loading_error": "Pardonu, eraris enlego de ĉi tiu profilo."
},
"who_to_follow": {
"more": "Pli",
"who_to_follow": "Kiun aboni"
},
"tool_tip": {
"media_upload": "Alŝuti vidaÅ­daÄĩon",
"repeat": "Ripeti",
"reply": "Respondi",
"favorite": "Ŝati",
"user_settings": "Agordoj de uzanto",
"bookmark": "Legosigno",
"reject_follow_request": "Rifuzi abonpeton",
"accept_follow_request": "Akcepti abonpeton",
"add_reaction": "Aldoni reagon"
},
"upload": {
"error": {
"base": "Alŝuto malsukcesis.",
"file_too_big": "Dosiero estas tro granda [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",
"default": "Reprovu pli poste"
},
"file_size_units": {
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB"
}
},
"emoji": {
"search_emoji": "Serĉi bildosignon",
"keep_open": "Teni elektilon malfermita",
"emoji": "Bildsignoj",
"stickers": "Glumarkoj",
"add_emoji": "Enigi bildosignon",
"load_all": "Enlegante ĉiujn {emojiAmount} bildosignojn",
"load_all_hint": "Enlegis la {saneAmount} unuajn bildosignojn; enlego de ĉiuj povus kaŭzi problemojn pri efikeco.",
"unicode": "Unikoda bildosigno",
"custom": "Propra bildosigno"
},
"polls": {
"not_enough_options": "Tro malmultaj unikaj elektebloj en la enketo",
"expired": "Enketo finiĝis antaŭ {0}",
"expires_in": "Enketo finiĝas je {0}",
"expiry": "Aĝo de enketo",
"multiple_choices": "Pluraj elektoj",
"single_choice": "Unu elekto",
"type": "Speco de enketo",
"vote": "Voĉi",
"votes": "voĉoj",
"option": "Elekteblo",
"add_option": "Aldoni elekteblon",
"add_poll": "Aldoni enketon"
},
"importer": {
"error": "Eraris enporto de ĉi tiu dosiero.",
"success": "Enportita sukcese.",
"submit": "Sendi"
},
"exporter": {
"processing": "Traktante; baldaŭ vi ricevos peton elŝuti vian dosieron",
"export": "Elporti"
},
"domain_mute_card": {
"unmute_progress": "Malsilentiganteâ€Ļ",
"unmute": "Malsilentigi",
"mute_progress": "Silentiganteâ€Ļ",
"mute": "Silentigi"
},
"about": {
"staff": "Skipo",
"mrf": {
"simple": {
"media_nsfw_desc": "Ĉi tiu nodo devigas vidaÅ­daÄĩojn esti markitaj kiel konsternaj en afiŝoj el la jenaj nodoj:",
"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 el la historio de ÂĢLa tuta konata retoÂģ",
"quarantine_desc": "Ĉi tiu nodo sendos nur publikajn aīŦÅ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",
"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 el la historio de ÂĢLa tuta konata retoÂģ",
- "keyword_policies": "Politiko pri ŝlosilvortoj"
+ "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:"
}
},
"selectable_list": {
"select_all": "Elekti ĉion"
},
"remote_user_resolver": {
"error": "Netrovinte.",
"searching_for": "Serĉante",
"remote_user_resolver": "Trovilo de foraj uzantoj"
},
"interactions": {
"load_older": "Enlegi pli malnovajn interagojn",
"moves": "Migrado de uzantoj",
"follows": "Novaj abonoj",
"favs_repeats": "Ripetoj kaj ŝatoj"
},
"errors": {
"storage_unavailable": "Pleroma ne povis aliri deponejon de la foliumilo. Via saluto kaj viaj lokaj agordoj ne estos konservitaj, kaj vi eble renkontos neatenditajn problemojn. Provu permesi kuketojn."
},
"status": {
"hide_content": "Kaŝi enhavon",
"show_content": "Montri enhavon",
"hide_full_subject": "Kaŝi plenan temon",
"show_full_subject": "Montri plenan temon",
"thread_muted_and_words": ", enhavas vortojn:",
"thread_muted": "Fadeno silentigita",
"copy_link": "Kopii ligilon al stato",
"status_unavailable": "Stato ne estas disponebla",
"unmute_conversation": "Malsilentigi interparolon",
"mute_conversation": "Silentigi interparolon",
"replies_list": "Respondoj:",
"reply_to": "Responde al",
"delete_confirm": "Ĉu vi certe volas forigi ĉi tiun staton?",
"unbookmark": "Senlegosigni",
"bookmark": "Legosigni",
"pinned": "Fiksita",
"unpin": "Malfiksi de profilo",
"pin": "Fiksi al profilo",
"delete": "Forigi staton",
"repeats": "Ripetoj",
"favorites": "Ŝatoj",
"status_deleted": "Ĉi tiu afiŝo foriĝis"
},
"time": {
"years_short": "{0}j",
"year_short": "{0}j",
"years": "{0} jaroj",
"year": "{0} jaro",
"weeks_short": "{0}s",
"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",
"now": "Äĩus",
"months_short": "{0}m",
"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",
"day_short": "{0}t",
"days": "{0} tagoj",
"day": "{0} tago"
},
"search": {
"people": "Personoj",
"no_results": "Neniuj rezultoj",
"people_talking": "{count} personoj parolas",
"person_talking": "{count} persono parolas",
"hashtags": "Kradvortoj"
},
"display_date": {
"today": "HodiaÅ­"
},
"file_type": {
"file": "Dosiero",
"image": "Bildo",
"video": "Filmo",
"audio": "Sono"
},
"chats": {
"empty_chat_list_placeholder": "Vi ankoraÅ­ havas neniun babilon. Komencu novan babilon!",
"error_sending_message": "Io misokazis dum sendado de la mesaĝo.",
"error_loading_chat": "Io misokazis dum enlego de la babilo.",
"delete_confirm": "Ĉu vi certe volas forigi ĉi tiun mesaĝon?",
"more": "Pli",
"empty_message_error": "Ne povas sendi malplenan mesaĝon",
"new": "Nova babilo",
"chats": "Babiloj",
"delete": "Forigi",
"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.",
"password_reset_required": "Vi devas restarigi vian pasvorton por saluti.",
"password_reset_disabled": "Restarigado de pasvortoj estas malŝaltita. Bonvolu kontakti la administranton de via nodo.",
"too_many_requests": "Vi atingis la limon de provoj, reprovu pli poste.",
"return_home": "Reiri al la hejmpaĝo",
"check_email": "Kontrolu vian retpoŝton pro ligilo por restarigi vian pasvorton.",
"placeholder": "Via retpoŝtadreso aŭ uzantonomo",
"instruction": "Enigu vian retpoŝtadreson aŭ uzantonomon. Ni sendos al vi ligilon por restarigi vian pasvorton.",
"password_reset": "Restarigi pasvorton",
"forgot_password": "Ĉu vi forgesis pasvorton?"
},
"user_reporting": {
"generic_error": "Eraris traktado de via peto.",
"submit": "Sendi",
"forward_to": "Plusendi al {0}",
"forward_description": "La konto venas de alia servilo. Ĉu kopio de la raporto sendiĝu ankaŭ tien?",
"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 6889df9a59..0c2cc3e932 100644
--- a/src/i18n/es.json
+++ b/src/i18n/es.json
@@ -1,820 +1,824 @@
{
"chat": {
"title": "Chat"
},
"exporter": {
"export": "Exportar",
"processing": "Procesando. Pronto se te pedirÃĄ que descargues tu archivo"
},
"features_panel": {
"chat": "Chat",
"gopher": "Gopher",
"media_proxy": "Proxy de medios",
"scope_options": "Opciones del alcance de la visibilidad",
"text_limit": "Límite de caracteres",
"title": "Características",
"who_to_follow": "A quiÊn seguir",
"pleroma_chat_messages": "Chat de Pleroma"
},
"finder": {
"error_fetching_user": "Error al buscar usuario",
"find_user": "Encontrar usuario"
},
"general": {
"apply": "Aplicar",
"submit": "Enviar",
"more": "MÃĄs",
"generic_error": "Ha ocurrido un error",
"optional": "opcional",
"show_more": "Mostrar mÃĄs",
"show_less": "Mostrar menos",
"cancel": "Cancelar",
"disable": "Inhabilitar",
"enable": "Habilitar",
"confirm": "Confirmar",
"verify": "Verificar",
"peek": "Ojear",
"close": "Cerrar",
"dismiss": "Descartar",
"retry": "IntÊntalo de nuevo",
"error_retry": "Por favor, intÊntalo de nuevo",
"loading": "Cargandoâ€Ļ"
},
"image_cropper": {
"crop_picture": "Recortar la foto",
"save": "Guardar",
"save_without_cropping": "Guardar sin recortar",
"cancel": "Cancelar"
},
"importer": {
"submit": "Enviar",
"success": "Importado con Êxito.",
"error": "Se ha producido un error al importar el archivo."
},
"login": {
"login": "Identificarse",
"description": "Identificarse con OAuth",
"logout": "Cerrar sesiÃŗn",
"password": "ContraseÃąa",
"placeholder": "p.ej. lain",
"register": "Registrarse",
"username": "Usuario",
"hint": "Inicia sesiÃŗn para unirte a la discusiÃŗn",
"authentication_code": "CÃŗdigo de autenticaciÃŗn",
"enter_recovery_code": "Inserta el cÃŗdigo de recuperaciÃŗn",
"enter_two_factor_code": "Inserta el cÃŗdigo de dos factores",
"recovery_code": "CÃŗdigo de recuperaciÃŗn",
"heading": {
"totp": "AutenticaciÃŗn de dos factores",
"recovery": "RecuperaciÃŗn de dos factores"
}
},
"media_modal": {
"previous": "Anterior",
"next": "Siguiente"
},
"nav": {
"about": "Acerca de",
"administration": "AdministraciÃŗn",
"back": "Volver",
"chat": "Chat Local",
"friend_requests": "Solicitudes de seguimiento",
"mentions": "Menciones",
"interactions": "Interacciones",
"dms": "Mensajes Directos",
"public_tl": "Línea Temporal PÃēblica",
"timeline": "Línea Temporal",
"twkn": "Red Conocida",
"user_search": "BÃēsqueda de Usuarios",
"search": "Buscar",
"who_to_follow": "A quiÊn seguir",
"preferences": "Preferencias",
"chats": "Chats",
"timelines": "Líneas de Tiempo",
"bookmarks": "Marcadores"
},
"notifications": {
"broken_favorite": "Estado desconocido, buscÃĄndoloâ€Ļ",
"favorited_you": "le gusta tu estado",
"followed_you": "empezÃŗ a seguirte",
"load_older": "Cargar notificaciones antiguas",
"notifications": "Notificaciones",
"read": "ÂĄLeído!",
"repeated_you": "repitiÃŗ tu estado",
"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",
"add_option": "AÃąadir opciÃŗn",
"option": "OpciÃŗn",
"votes": "votos",
"vote": "Votar",
"type": "Tipo de encuesta",
"single_choice": "ElecciÃŗn Ãēnica",
"multiple_choices": "ElecciÃŗn mÃēltiple",
"expiry": "Tiempo de vida de la encuesta",
"expires_in": "La encuesta termina en {0}",
"expired": "La encuesta terminÃŗ hace {0}",
"not_enough_options": "Muy pocas opciones Ãēnicas en la encuesta"
},
"emoji": {
"stickers": "Pegatinas",
"emoji": "Emoji",
"keep_open": "Mantener el selector abierto",
"search_emoji": "Buscar un emoji",
"add_emoji": "Insertar un emoji",
"custom": "Emojis personalizados",
"unicode": "Emojis unicode",
"load_all": "Cargando todos los {emojiAmount} emoji",
"load_all_hint": "Cargado el primer emoji {saneAmount}, cargar todos los emoji puede causar problemas de rendimiento."
},
"stickers": {
"add_sticker": "AÃąadir Pegatina"
},
"interactions": {
"favs_repeats": "Favoritos y Repetidos",
"follows": "Nuevos seguidores",
"load_older": "Cargar interacciones mÃĄs antiguas",
"moves": "Usuario Migrado"
},
"post_status": {
"new_status": "Publicar un nuevo estado",
"account_not_locked_warning": "Tu cuenta no estÃĄ {0}. Cualquiera puede seguirte y leer las entradas para Solo-Seguidores.",
"account_not_locked_warning_link": "bloqueada",
"attachments_sensitive": "Contenido sensible",
"content_type": {
"text/plain": "Texto Plano",
"text/html": "HTML",
"text/markdown": "Markdown",
"text/bbcode": "BBCode"
},
"content_warning": "Tema (opcional)",
"default": "Acabo de aterrizar en L.A.",
"direct_warning_to_all": "Esta publicaciÃŗn serÃĄ visible para todos los usuarios mencionados.",
"direct_warning_to_first_only": "Esta publicaciÃŗn solo serÃĄ visible para los usuarios mencionados al comienzo del mensaje.",
"posting": "Publicando",
"scope_notice": {
"public": "Esta publicaciÃŗn serÃĄ visible para todo el mundo",
"private": "Esta publicaciÃŗn solo serÃĄ visible para tus seguidores",
"unlisted": "Esta publicaciÃŗn no serÃĄ visible en la Línea Temporal PÃēblica ni en Toda La Red Conocida"
},
"scope": {
"direct": "Directo - Solo para los usuarios mencionados",
"private": "Solo-seguidores - Solo tus seguidores leerÃĄn la publicaciÃŗn",
"public": "PÃēblico - Entradas visibles en las Líneas Temporales PÃēblicas",
"unlisted": "Sin listar - Entradas no visibles en las Líneas Temporales PÃēblicas"
},
"media_description_error": "Error al actualizar el archivo, intÊntalo de nuevo",
"empty_status_error": "No se puede publicar un estado vacío y sin archivos adjuntos",
"preview_empty": "Vacío",
"preview": "Vista previa",
"media_description": "DescripciÃŗn multimedia"
},
"registration": {
"bio": "Biografía",
"email": "Correo electrÃŗnico",
"fullname": "Nombre a mostrar",
"password_confirm": "Confirmar contraseÃąa",
"registration": "Registro",
"token": "Token de invitaciÃŗn",
"captcha": "CAPTCHA",
"new_captcha": "Haz click en la imagen para obtener un nuevo captcha",
"username_placeholder": "p.ej. lain",
"fullname_placeholder": "p.ej. Lain Iwakura",
"bio_placeholder": "e.g.\nHola, soy un ejemplo.\nAquí puedes poner algo representativo tuyo... o no.",
"validations": {
"username_required": "no puede estar vacío",
"fullname_required": "no puede estar vacío",
"email_required": "no puede estar vacío",
"password_required": "no puede estar vacío",
"password_confirmation_required": "no puede estar vacío",
"password_confirmation_match": "la contraseÃąa no coincide"
}
},
"selectable_list": {
"select_all": "Seleccionar todo"
},
"settings": {
"app_name": "Nombre de la aplicaciÃŗn",
"security": "Seguridad",
"enter_current_password_to_confirm": "Introduce la contraseÃąa actual para confirmar tu identidad",
"mfa": {
"otp": "OTP",
"setup_otp": "Configurar OTP",
"wait_pre_setup_otp": "preconfiguraciÃŗn OTP",
"confirm_and_enable": "Confirmar y habilitar OTP",
"title": "AutentificaciÃŗn de dos factores",
"generate_new_recovery_codes": "Generar cÃŗdigos de recuperaciÃŗn nuevos",
"warning_of_generate_new_codes": "Cuando generas nuevos cÃŗdigos de recuperaciÃŗn, los antiguos dejarÃĄn de funcionar.",
"recovery_codes": "CÃŗdigos de recuperaciÃŗn.",
"waiting_a_recovery_codes": "Recibiendo cÃŗdigos de respaldoâ€Ļ",
"recovery_codes_warning": "Anote los cÃŗdigos o guÃĄrdelos en un lugar seguro, de lo contrario no los volverÃĄ a ver. Si pierde el acceso a su aplicaciÃŗn 2FA y los cÃŗdigos de recuperaciÃŗn, su cuenta quedarÃĄ bloqueada.",
"authentication_methods": "MÊtodos de autentificaciÃŗn",
"scan": {
"title": "Escanear",
"desc": "Usando su aplicaciÃŗn de dos factores, escanee este cÃŗdigo QR o ingrese la clave de texto:",
"secret_code": "Clave"
},
"verify": {
"desc": "Para habilitar la autenticaciÃŗn de dos factores, ingrese el cÃŗdigo de su aplicaciÃŗn 2FA:"
}
},
"attachmentRadius": "Adjuntos",
"attachments": "Adjuntos",
"avatar": "Avatar",
"avatarAltRadius": "Avatares (Notificaciones)",
"avatarRadius": "Avatares",
"background": "Fondo",
"bio": "Biografía",
"block_export": "Exportar usuarios bloqueados",
"block_export_button": "Exporta la lista de tus usuarios bloqueados a un archivo csv",
"block_import": "Importar usuarios bloqueados",
"block_import_error": "Error importando la lista de usuarios bloqueados",
"blocks_imported": "ÂĄLista de usuarios bloqueados importada! El procesado puede tardar un poco.",
"blocks_tab": "Bloqueados",
"btnRadius": "Botones",
"cBlue": "Azul (Responder, seguir)",
"cGreen": "Verde (Retweet)",
"cOrange": "Naranja (Favorito)",
"cRed": "Rojo (Cancelar)",
"change_password": "Cambiar contraseÃąa",
"change_password_error": "Hubo un problema cambiando la contraseÃąa.",
"changed_password": "ÂĄContraseÃąa cambiada correctamente!",
"collapse_subject": "Colapsar entradas con tema",
"composing": "Redactando",
"confirm_new_password": "Confirmar la nueva contraseÃąa",
"current_avatar": "Tu avatar actual",
"current_password": "ContraseÃąa actual",
"current_profile_banner": "Tu cabecera actual",
"data_import_export_tab": "Importar / Exportar Datos",
"default_vis": "Alcance de visibilidad por defecto",
"delete_account": "Eliminar la cuenta",
"discoverable": "Permitir la apariciÃŗn de esta cuenta en los resultados de bÃēsqueda y otros servicios",
"delete_account_description": "Eliminar para siempre los datos y desactivar la cuenta.",
"pad_emoji": "Rellenar con espacios al agregar emojis desde el selector",
"delete_account_error": "Hubo un error al eliminar tu cuenta. Si el fallo persiste, ponte en contacto con el administrador de tu instancia.",
"delete_account_instructions": "Escribe tu contraseÃąa para confirmar la eliminaciÃŗn de tu cuenta.",
"avatar_size_instruction": "El tamaÃąo mínimo recomendado para el avatar es de 150X150 píxeles.",
"export_theme": "Exportar tema",
"filtering": "Filtrado",
"filtering_explanation": "Todos los estados que contengan estas palabras serÃĄn silenciados, una por línea",
"follow_export": "Exportar personas que tÃē sigues",
"follow_export_button": "Exporta tus seguidores a un fichero csv",
"follow_import": "Importar personas que tÃē sigues",
"follow_import_error": "Error al importar el fichero",
"follows_imported": "ÂĄImportado! Procesarlos llevarÃĄ tiempo.",
"foreground": "Primer plano",
"general": "General",
"hide_attachments_in_convo": "Ocultar adjuntos en las conversaciones",
"hide_attachments_in_tl": "Ocultar adjuntos en la línea temporal",
"hide_muted_posts": "Ocultar las publicaciones de los usuarios silenciados",
"max_thumbnails": "Cantidad mÃĄxima de miniaturas por publicaciÃŗn",
"hide_isp": "Ocultar el panel específico de la instancia",
"preload_images": "Precargar las imÃĄgenes",
"use_one_click_nsfw": "Abrir los adjuntos NSFW con un solo click",
"hide_post_stats": "Ocultar las estadísticas de las entradas (p.ej. el nÃēmero de favoritos)",
"hide_user_stats": "Ocultar las estadísticas del usuario (p.ej. el nÃēmero de seguidores)",
"hide_filtered_statuses": "Ocultar estados filtrados",
"import_blocks_from_a_csv_file": "Importar lista de usuarios bloqueados dese un archivo csv",
"import_followers_from_a_csv_file": "Importar personas que tÃē sigues a partir de un archivo csv",
"import_theme": "Importar tema",
"inputRadius": "Campos de entrada",
"checkboxRadius": "Casillas de verificaciÃŗn",
"instance_default": "(por defecto: {value})",
"instance_default_simple": "(por defecto)",
"interface": "Interfaz",
"interfaceLanguage": "Idioma",
"invalid_theme_imported": "El archivo importado no es un tema vÃĄlido de Pleroma. No se han realizado cambios.",
"limited_availability": "No disponible en tu navegador",
"links": "Enlaces",
"lock_account_description": "Restringir el acceso a tu cuenta solo a seguidores admitidos",
"loop_video": "Vídeos en bucle",
"loop_video_silent_only": "Bucle solo en vídeos sin sonido (p.ej. \"gifs\" de Mastodon)",
"mutes_tab": "Silenciados",
"play_videos_in_modal": "Reproducir los vídeos en un marco emergente",
"use_contain_fit": "No recortar los adjuntos en miniaturas",
"name": "Nombre",
"name_bio": "Nombre y Biografía",
"new_password": "Nueva contraseÃąa",
"notification_visibility": "Tipos de notificaciones a mostrar",
"notification_visibility_follows": "Nuevos seguidores",
"notification_visibility_likes": "Me gustan (Likes)",
"notification_visibility_mentions": "Menciones",
"notification_visibility_repeats": "Repeticiones (Repeats)",
"no_rich_text_description": "Eliminar el formato de texto enriquecido de todas las entradas",
"no_blocks": "No hay usuarios bloqueados",
"no_mutes": "No hay usuarios silenciados",
"hide_follows_description": "No mostrar a quiÊn sigo",
"hide_followers_description": "No mostrar quiÊn me sigue",
"hide_follows_count_description": "No mostrar el nÃēmero de cuentas que sigo",
"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",
"valid_until": "VÃĄlido hasta",
"revoke_token": "Revocar",
"panelRadius": "Paneles",
"pause_on_unfocused": "Parar la transmisiÃŗn cuando no estÊs en foco",
"presets": "Por defecto",
"profile_background": "Fondo del Perfil",
"profile_banner": "Cabecera del Perfil",
"profile_tab": "Perfil",
"radii_help": "Establezca el redondeo de las esquinas de la interfaz (en píxeles)",
"replies_in_timeline": "RÊplicas en la línea temporal",
"reply_visibility_all": "Mostrar todas las rÊplicas",
"reply_visibility_following": "Solo mostrar rÊplicas para mí o usuarios a los que sigo",
"reply_visibility_self": "Solo mostrar rÊplicas para mí",
"autohide_floating_post_button": "Ocultar automÃĄticamente el botÃŗn 'Nueva PublicaciÃŗn' (para mÃŗviles)",
"saving_err": "Error al guardar los ajustes",
"saving_ok": "Ajustes guardados",
"search_user_to_block": "Buscar usuarios a bloquear",
"search_user_to_mute": "Buscar usuarios a silenciar",
"security_tab": "Seguridad",
"scope_copy": "Copiar la visibilidad de la publicaciÃŗn cuando contestamos (En los mensajes directos (MDs) siempre se copia)",
"minimal_scopes_mode": "Minimizar las opciones de publicaciÃŗn",
"set_new_avatar": "Cambiar avatar",
"set_new_profile_background": "Cambiar el fondo del perfil",
"set_new_profile_banner": "Cambiar la cabecera del perfil",
"settings": "Ajustes",
"subject_input_always_show": "Mostrar siempre el campo del tema",
"subject_line_behavior": "Copiar el tema en las respuestas",
"subject_line_email": "Como email: \"re: tema\"",
"subject_line_mastodon": "Como mastodon: copiar como es",
"subject_line_noop": "No copiar",
"post_status_content_type": "Formato de publicaciÃŗn",
"stop_gifs": "Iniciar GIFs al pasar el ratÃŗn",
"streaming": "Habilitar la transmisiÃŗn automÃĄtica de nuevas publicaciones cuando se desplaza hacia la parte superior",
"text": "Texto",
"theme": "Tema",
"theme_help": "Use cÃŗdigos de color hexadecimales (#rrggbb) para personalizar su tema de colores.",
"theme_help_v2_1": "TambiÊn puede invalidar los colores y la opacidad de ciertos componentes si activa la casilla de verificaciÃŗn. Use el botÃŗn \"Borrar todo\" para deshacer los cambios.",
"theme_help_v2_2": "Los iconos debajo de algunas entradas son indicadores de contraste de fondo/texto, desplace el ratÃŗn por encima para obtener informaciÃŗn mÃĄs detallada. Tenga en cuenta que cuando se utilizan indicadores de contraste de transparencia se muestra el peor caso posible.",
"tooltipRadius": "InformaciÃŗn/alertas",
"upload_a_photo": "Subir una foto",
"user_settings": "Ajustes del Usuario",
"values": {
"false": "no",
"true": "sí"
},
"notifications": "Notificaciones",
"notification_mutes": "Para dejar de recibir notificaciones de un usuario específico, silÊncialo.",
"notification_blocks": "El bloqueo de un usuario detiene todas las notificaciones y tambiÊn las cancela.",
"enable_web_push_notifications": "Habilitar las notificiaciones en el navegador",
"style": {
"switcher": {
"keep_color": "Mantener colores",
"keep_shadows": "Mantener sombras",
"keep_opacity": "Mantener opacidad",
"keep_roundness": "Mantener redondeces",
"keep_fonts": "Mantener fuentes",
"save_load_hint": "Las opciones \"Mantener\" conservan las opciones configuradas actualmente al seleccionar o cargar temas, tambiÊn almacena dichas opciones al exportar un tema. Cuando se desactiven todas las casillas de verificaciÃŗn, el tema de exportaciÃŗn lo guardarÃĄ todo.",
"reset": "Reiniciar",
"clear_all": "Limpiar todo",
"clear_opacity": "Limpiar opacidad",
"help": {
"snapshot_source_mismatch": "Conflicto de versiones: lo mÃĄs probable es que el frontend se haya revertido y actualizado nuevamente, si cambiÃŗ el tema con una versiÃŗn anterior del frontend, lo mÃĄs probable es que desee usar la versiÃŗn anterior; de lo contrario, use la nueva versiÃŗn.",
"migration_napshot_gone": "Por alguna razÃŗn, faltaba la instantÃĄnea, algunas cosas podrían verse diferentes de lo que recuerdas.",
"migration_snapshot_ok": "Solo para estar seguro, se cargÃŗ la instantÃĄnea del tema. Puede intentar cargar los datos del tema.",
"fe_downgraded": "VersiÃŗn de PleromaFE revertida.",
"fe_upgraded": "El creador de temas de PleromaFE se actualizÃŗ despuÊs de la actualizaciÃŗn de la versiÃŗn.",
"snapshot_missing": "No había ninguna instantÃĄnea del tema en el archivo, por lo que podría verse diferente de lo previsto originalmente.",
"snapshot_present": "Se ha cargado una instantÃĄnea del tema, por lo que todos los valores se sobrescriben. De lo contrario, puede cargar el tema por completo.",
"older_version_imported": "El archivo que ha importado se creÃŗ en una versiÃŗn anterior del frontend actual.",
"v2_imported": "El archivo que ha importado fue creado para un frontend mÃĄs antiguo. Intentamos maximizar la compatibilidad, pero aÃēn podría haber inconsistencias.",
"future_version_imported": "El archivo que ha importado se creÃŗ para una versiÃŗn mÃĄs reciente del frontend.",
"upgraded_from_v2": "PleromaFE se ha actualizado, el tema podría verse un poco diferente de lo que recuerdas."
},
"use_source": "Nueva versiÃŗn",
"use_snapshot": "VersiÃŗn antigua",
"keep_as_is": "Mantener como estÃĄ",
"load_theme": "Cargar tema"
},
"common": {
"color": "Color",
"opacity": "Opacidad",
"contrast": {
"hint": "El ratio de contraste es {ratio}. {level} {context}",
"level": {
"aa": "Cumple con la pauta de nivel AA (mínimo)",
"aaa": "Cumple con la pauta de nivel AAA (recomendado)",
"bad": "No cumple con las pautas de accesibilidad"
},
"context": {
"18pt": "para textos grandes (+18pt)",
"text": "para textos"
}
}
},
"common_colors": {
"_tab_label": "ComÃēn",
"main": "Colores comunes",
"foreground_hint": "Vea la pestaÃąa \"Avanzado\" para un control mÃĄs detallado",
"rgbo": "Iconos, acentos, insignias"
},
"advanced_colors": {
"_tab_label": "Avanzado",
"alert": "Fondo de Alertas",
"alert_error": "Error",
"badge": "Fondo de Insignias",
"badge_notification": "Notificaciones",
"panel_header": "Cabecera del panel",
"top_bar": "Barra superior",
"borders": "Bordes",
"buttons": "Botones",
"inputs": "Campos de entrada",
"faint_text": "Texto desvanecido",
"alert_neutral": "Neutral",
"chat": {
"border": "Borde",
"outgoing": "Salientes",
"incoming": "Entrantes"
},
"tabs": "PestaÃąas",
"toggled": "Intercambiado",
"disabled": "Deshabilitado",
"selectedMenu": "Elemento del menÃē seleccionado",
"selectedPost": "PublicaciÃŗn seleccionada",
"pressed": "Presionado",
"highlight": "Elementos destacados",
"icons": "Iconos",
"poll": "GrÃĄfico de la encuesta",
"underlay": "Subrayado",
"popover": "Sugerencias, menÃēs, superposiciones",
"post": "Publicaciones/Biografías de Usuarios",
"alert_warning": "PrecauciÃŗn"
},
"radii": {
"_tab_label": "Redondez"
},
"shadows": {
"_tab_label": "Sombra e iluminaciÃŗn",
"component": "Componente",
"override": "Sobreescribir",
"shadow_id": "Sombra #{value}",
"blur": "Difuminar",
"spread": "Cantidad",
"inset": "Sombra interior",
"hint": "Para las sombras, tambiÊn puede usar --variable como un valor de color para usar las variables CSS3. Tenga en cuenta que establecer la opacidad no funcionarÃĄ en este caso.",
"filter_hint": {
"always_drop_shadow": "Advertencia, esta sombra siempre usa {0} cuando el navegador lo soporta.",
"drop_shadow_syntax": "{0} no soporta el parÃĄmetro {1} y la palabra clave {2}.",
"avatar_inset": "Tenga en cuenta que la combinaciÃŗn de sombras interiores como no-interiores en los avatares, puede dar resultados inesperados con los avatares transparentes.",
"spread_zero": "Sombras con una cantidad > 0 aparecerÃĄ como si estuviera puesto a cero",
"inset_classic": "Las sombras interiores estarÃĄn usando {0}"
},
"components": {
"panel": "Panel",
"panelHeader": "Cabecera del panel",
"topBar": "Barra superior",
"avatar": "Avatar del usuario (en la vista del perfil)",
"avatarStatus": "Avatar del usuario (en la vista de la entrada)",
"popup": "Ventanas y textos emergentes (popups & tooltips)",
"button": "Botones",
"buttonHover": "BotÃŗn (encima)",
"buttonPressed": "BotÃŗn (presionado)",
"buttonPressedHover": "BotÃŗn (presionado+encima)",
"input": "Campo de entrada"
},
"hintV3": "Para las sombras, tambiÊn puede usar la notaciÃŗn {0} para usar otro espacio de color."
},
"fonts": {
"_tab_label": "Fuentes",
"help": "Seleccione la fuente a utilizar para los elementos de la interfaz de usuario. Para \"personalizar\", debe ingresar el nombre exacto de la fuente tal como aparece en el sistema.",
"components": {
"interface": "Interfaz",
"input": "Campos de entrada",
"post": "Texto de publicaciones",
"postCode": "Texto monoespaciado en publicaciÃŗn (texto enriquecido)"
},
"family": "Nombre de la fuente",
"size": "TamaÃąo (en px)",
"weight": "Peso (negrita)",
"custom": "Personalizado"
},
"preview": {
"header": "Vista previa",
"content": "Contenido",
"error": "Ejemplo de error",
"button": "BotÃŗn",
"text": "Un montÃŗn de {0} y {1}",
"mono": "contenido",
"input": "Acaba de aterrizar en L.A.",
"faint_link": "manual Ãētil",
"fine_print": "ÂĄLea nuestro {0} para aprender nada Ãētil!",
"header_faint": "Esto estÃĄ bien",
"checkbox": "He revisado los tÊrminos y condiciones",
"link": "un bonito enlace"
}
},
"version": {
"title": "VersiÃŗn",
"backend_version": "VersiÃŗn del Backend",
"frontend_version": "VersiÃŗn del Frontend"
},
"notification_visibility_moves": "Usuario Migrado",
"greentext": "Texto verde (meme arrows)",
"notification_setting_hide_notification_contents": "Ocultar el remitente y el contenido de las notificaciones push",
"notification_setting_privacy": "Privacidad",
"notification_setting_block_from_strangers": "Bloquea las notificaciones de los usuarios que no sigues",
"notification_setting_filters": "Filtros",
"fun": "Divertido",
"type_domains_to_mute": "Buscar dominios para silenciar",
"useStreamingApiWarning": "(no recomendado, experimental, puede omitir publicaciones)",
"useStreamingApi": "Recibir entradas y notificaciones en tiempo real",
"user_mutes": "Usuarios",
"reset_profile_background": "Restablecer el fondo de pantalla",
"reset_background_confirm": "ÂŋEstÃĄs seguro de restablecer el fondo de pantalla?",
"reset_banner_confirm": "ÂŋEstÃĄs seguro de restablecer la imagen del banner?",
"reset_avatar_confirm": "ÂŋEstÃĄs seguro de restablecer la imagen de avatar?",
"reset_profile_banner": "Restabler imagen del banner del perfil",
"reset_avatar": "Restablecer avatar",
"notification_visibility_emoji_reactions": "Reacciones",
"new_email": "Nuevo correo electrÃŗnico",
"profile_fields": {
"value": "Contenido",
"name": "Etiqueta",
"add_field": "AÃąadir un campo",
"label": "Metadatos del perfil"
},
"accent": "Acento",
"emoji_reactions_on_timeline": "Mostrar las reacciones de emoji en la línea de tiempo",
"domain_mutes": "Dominios",
"mutes_and_blocks": "Silenciado y Bloqueados",
"chatMessageRadius": "Mensaje de chat",
"changed_email": "ÂĄCorreo electrÃŗnico modificado correctamente!",
"change_email_error": "Ha ocurrido un error al intentar modificar tu correo electrÃŗnico.",
"change_email": "Modificar el correo electrÃŗnico",
"bot": "Esta cuenta es un bot",
"allow_following_move": "Permitir el seguimiento automÃĄtico, cuando la cuenta que sigues se traslada a otra instancia",
"virtual_scrolling": "Optimizar la representaciÃŗn de la linea temporal",
"import_mutes_from_a_csv_file": "Importar silenciados desde un archivo csv",
"mutes_imported": "ÂĄSilenciados importados! Procesarlos llevarÃĄ un tiempo.",
"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"
},
"time": {
"day": "{0} día",
"days": "{0} días",
"day_short": "{0}d",
"days_short": "{0}d",
"hour": "{0} hora",
"hours": "{0} horas",
"hour_short": "{0}h",
"hours_short": "{0}h",
"in_future": "en {0}",
"in_past": "hace {0}",
"minute": "{0} minuto",
"minutes": "{0} minutos",
"minute_short": "{0}min",
"minutes_short": "{0}min",
"month": "{0} mes",
"months": "{0} meses",
"month_short": "{0}m",
"months_short": "{0}m",
"now": "justo ahora",
"now_short": "ahora",
"second": "{0} segundo",
"seconds": "{0} segundos",
"second_short": "{0}s",
"seconds_short": "{0}s",
"week": "{0} semana",
"weeks": "{0} semanas",
"week_short": "{0}sem",
"weeks_short": "{0}sem",
"year": "{0} aÃąo",
"years": "{0} aÃąos",
"year_short": "{0}a",
"years_short": "{0}a"
},
"timeline": {
"collapse": "Colapsar",
"conversation": "ConversaciÃŗn",
"error_fetching": "Error al cargar las actualizaciones",
"load_older": "Cargar actualizaciones anteriores",
"no_retweet_hint": "La publicaciÃŗn estÃĄ marcada como solo para seguidores o directa y no se puede repetir",
"repeated": "repetida",
"show_new": "Mostrar lo nuevo",
"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",
"repeats": "Repetidos",
"delete": "Eliminar publicaciÃŗn",
"pin": "Fijar en tu perfil",
"unpin": "Desclavar de tu perfil",
"pinned": "Fijado",
"delete_confirm": "ÂŋRealmente quieres borrar la publicaciÃŗn?",
"reply_to": "Respondiendo a",
"replies_list": "Respuestas:",
"mute_conversation": "Silenciar la conversaciÃŗn",
"unmute_conversation": "Mostrar la conversaciÃŗn",
"hide_content": "Ocultar el contenido",
"show_content": "Mostrar el contenido",
"hide_full_subject": "Ocultar el tema completo",
"show_full_subject": "Mostrar el tema completo",
"thread_muted_and_words": ", contiene:",
"thread_muted": "ConversaciÃŗn silenciada",
"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)"
},
"user_card": {
"approve": "Aprobar",
"block": "Bloquear",
"blocked": "ÂĄBloqueado!",
"deny": "Denegar",
"favorites": "Favoritos",
"follow": "Seguir",
"follow_sent": "ÂĄSolicitud enviada!",
"follow_progress": "Solicitandoâ€Ļ",
"follow_again": "ÂŋEnviar solicitud de nuevo?",
"follow_unfollow": "Dejar de seguir",
"followees": "Siguiendo",
"followers": "Seguidores",
"following": "ÂĄSiguiendo!",
"follows_you": "ÂĄTe sigue!",
"its_you": "ÂĄEres tÃē!",
"media": "Media",
"mention": "Mencionar",
"mute": "Silenciar",
"muted": "Silenciado",
"per_day": "por día",
"remote_follow": "Seguir",
"report": "Reportar",
"statuses": "Estados",
"subscribe": "Suscribirse",
"unsubscribe": "Desuscribirse",
"unblock": "Desbloquear",
"unblock_progress": "Desbloqueandoâ€Ļ",
"block_progress": "Bloqueandoâ€Ļ",
"unmute": "Dejar de silenciar",
"unmute_progress": "Quitando silencioâ€Ļ",
"mute_progress": "Silenciandoâ€Ļ",
"admin_menu": {
"moderation": "ModeraciÃŗn",
"grant_admin": "Conceder permisos de Administrador",
"revoke_admin": "Revocar permisos de Administrador",
"grant_moderator": "Conceder permisos de Moderador",
"revoke_moderator": "Revocar permisos de Moderador",
"activate_account": "Activar cuenta",
"deactivate_account": "Desactivar cuenta",
"delete_account": "Eliminar cuenta",
"force_nsfw": "Marcar todas las publicaciones como NSFW (no es seguro/apropiado para el trabajo)",
"strip_media": "Eliminar archivos multimedia de las publicaciones",
"force_unlisted": "Forzar que se publique en el modo -Sin Listar-",
"sandbox": "Forzar que se publique solo para tus seguidores",
"disable_remote_subscription": "No permitir que usuarios de instancias remotas te siga",
"disable_any_subscription": "No permitir que ningÃēn usuario te siga",
"quarantine": "No permitir publicaciones de usuarios de instancias remotas",
"delete_user": "Eliminar usuario",
"delete_user_confirmation": "ÂŋEstÃĄs completamente seguro? Esta acciÃŗn no se puede deshacer."
},
"show_repeats": "Mostrar repetidos",
"hide_repeats": "Ocultar repetidos",
"message": "Mensaje",
"hidden": "Oculto"
},
"user_profile": {
"timeline_title": "Linea Temporal del Usuario",
"profile_does_not_exist": "Lo sentimos, este perfil no existe.",
"profile_loading_error": "Lo sentimos, hubo un error al cargar este perfil."
},
"user_reporting": {
"title": "Reportando a {0}",
"add_comment_description": "El informe serÃĄ enviado a los moderadores de su instancia. Puedes proporcionar una explicaciÃŗn de por quÊ estÃĄs reportando esta cuenta a continuaciÃŗn:",
"additional_comments": "Comentarios adicionales",
"forward_description": "La cuenta es de otro servidor. ÂŋEnviar una copia del informe allí tambiÊn?",
"forward_to": "Reenviar a {0}",
"submit": "Enviar",
"generic_error": "Se produjo un error al procesar la solicitud."
},
"who_to_follow": {
"more": "MÃĄs",
"who_to_follow": "A quiÊn seguir"
},
"tool_tip": {
"media_upload": "Subir Medios",
"repeat": "Repetir",
"reply": "Contestar",
"favorite": "Favorito",
"user_settings": "Ajustes de usuario",
"bookmark": "Marcador",
"reject_follow_request": "Rechazar la solicitud de seguimiento",
"accept_follow_request": "Aceptar la solicitud de seguimiento",
"add_reaction": "AÃąadir ReacciÃŗn"
},
"upload": {
"error": {
"base": "Subida fallida.",
"file_too_big": "Archivo demasiado grande [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",
"default": "IntÊntalo mÃĄs tarde"
},
"file_size_units": {
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB"
}
},
"search": {
"people": "Personas",
"hashtags": "Etiquetas",
"person_talking": "{count} personas hablando",
"people_talking": "{count} gente hablando",
"no_results": "Sin resultados"
},
"password_reset": {
"forgot_password": "ÂŋContraseÃąa olvidada?",
"password_reset": "Restablecer la contraseÃąa",
"instruction": "Ingrese su direcciÃŗn de correo electrÃŗnico o nombre de usuario. Le enviaremos un enlace para restablecer su contraseÃąa.",
"placeholder": "Su correo electrÃŗnico o nombre de usuario",
"check_email": "Revise su correo electrÃŗnico para obtener un enlace para restablecer su contraseÃąa.",
"return_home": "Volver a la pÃĄgina de inicio",
"too_many_requests": "Has alcanzado el límite de intentos, vuelve a intentarlo mÃĄs tarde.",
"password_reset_disabled": "El restablecimiento de contraseÃąas estÃĄ deshabilitado. PÃŗngase en contacto con el administrador de su instancia.",
"password_reset_required_but_mailer_is_disabled": "Debes restablecer la contraseÃąa, pero el restablecimiento de contraseÃąas estÃĄ deshabilitado. Por favor contacta con el administrador de la instancia.",
"password_reset_required": "Debes restablecer la contraseÃąa para iniciar sesiÃŗn."
},
"errors": {
"storage_unavailable": "Pleroma no pudo acceder al almacenamiento del navegador. Su inicio de sesiÃŗn o su configuraciÃŗn local no se guardarÃĄn y puede encontrar problemas inesperados. Intente habilitar las cookies."
},
"domain_mute_card": {
"unmute_progress": "Quitando silencioâ€Ļ",
"unmute": "Dejar de silenciar",
"mute_progress": "Silenciandoâ€Ļ",
"mute": "Silenciar"
},
"about": {
"mrf": {
"simple": {
"accept_desc": "Esta instancia solo acepta mensajes de las siguientes instancias:",
"media_nsfw_desc": "Esta instancia obliga a que los archivos multimedia se establezcan como sensibles en las publicaciones de las siguientes instancias:",
"media_nsfw": "Forzar Multimedia Como Sensible",
"media_removal_desc": "Esta instancia elimina los archivos multimedia de las publicaciones de las siguientes instancias:",
"media_removal": "Eliminar Multimedia",
"quarantine": "Cuarentena",
"ftl_removal_desc": "Esta instancia elimina las siguientes instancias de la línea de tiempo \"Toda la red conocida\":",
"ftl_removal": "Eliminar de la línea de tiempo \"Toda La Red Conocida\"",
"quarantine_desc": "Esta instancia enviarÃĄ solo publicaciones pÃēblicas a las siguientes instancias:",
"simple_policies": "Políticas específicas de la instancia",
"reject_desc": "Esta instancia no aceptarÃĄ mensajes de las siguientes instancias:",
"reject": "Rechazar",
"accept": "Aceptar"
},
"mrf_policies_desc": "Las políticas MRF manipulan la federaciÃŗn de esta instancia con el resto del fediverso. Las siguientes políticas estÃĄn habilitadas:",
"mrf_policies": "Habilitar políticas MRF",
"keyword": {
"ftl_removal": "Eliminar de la línea de tiempo \"Toda La Red Conocida\"",
"keyword_policies": "Política de Palabras Clave",
"is_replaced_by": "→",
"replace": "Reemplazar",
"reject": "Rechazar"
},
"federation": "FederaciÃŗn"
},
"staff": "Equipo"
},
"shoutbox": {
"title": "Jaula de Grillos"
},
"remote_user_resolver": {
"remote_user_resolver": "ResoluciÃŗn de usuario remoto",
"error": "No encontrado.",
"searching_for": "Buscando"
},
"chats": {
"chats": "Chats",
"empty_chat_list_placeholder": "AÃēn no tienes ninguna conversaciÃŗn. ÂĄInicia una nueva conversaciÃŗn!",
"error_sending_message": "Algo saliÃŗ mal al enviar el mensaje.",
"error_loading_chat": "Algo saliÃŗ mal al cargar el chat.",
"delete_confirm": "ÂŋRealmente quieres borrar este mensaje?",
"more": "MÃĄs",
"empty_message_error": "No puedes publicar un mensaje vacío",
"new": "Nueva conversaciÃŗn",
"delete": "Borrar",
"message_user": "Mensaje de {nickname}",
"you": "TÃē:"
},
"display_date": {
"today": "Hoy"
},
"file_type": {
"file": "Archivo",
"image": "Imagen",
"video": "Vídeo",
"audio": "Audio"
}
}
diff --git a/src/i18n/he.json b/src/i18n/he.json
index 7f2bf58fcb..4b920536a6 100644
--- a/src/i18n/he.json
+++ b/src/i18n/he.json
@@ -1,394 +1,402 @@
{
"chat": {
"title": "×Ļ'אט"
},
"exporter": {
"export": "יי×Ļוא",
"processing": "מ×ĸבד, בקרוב ×Ēופי×ĸ אפשרו×Ē ×œ×”×•×¨×™×“ א×Ē ×”×§×•×‘×Ĩ"
},
"features_panel": {
"chat": "×Ļ'אט",
"gopher": "גופר",
"media_proxy": "מדיה פרוקסי",
"scope_options": "אפשרויו×Ē ×˜×•×•×—",
"text_limit": "מגבל×Ē ×˜×§×Ą×˜",
"title": "מאפיינים",
"who_to_follow": "אחרי מי ל×ĸקוב"
},
"finder": {
"error_fetching_user": "שגיאה במ×Ļיא×Ē ×ž×Š×Ēמ׊",
"find_user": "מ×Ļיא×Ē ×ž×Š×Ēמ׊"
},
"general": {
"apply": "החל",
"submit": "שלח",
"more": "×ĸוד",
"generic_error": "קר×Ēה שגיאה",
"optional": "לבחירה",
"show_more": "הראה ×ĸוד",
"show_less": "הראה פחו×Ē",
"cancel": "בטל"
},
"image_cropper": {
"crop_picture": "ח×Ēוך ×Ēמונה",
"save": "שמור",
"save_without_cropping": "שמור בלי לח×Ēוך",
"cancel": "בטל"
},
"importer": {
"submit": "שלח",
"success": "ייובא בה×Ļלחה.",
"error": "איר×ĸ×Ēה שגיאה בזמן ייבוא קוב×Ĩ זה."
},
"login": {
"login": "ה×Ēחבר",
"description": "היכנס ×ĸם OAuth",
"logout": "ה×Ē× ×Ē×§",
"password": "סיסמה",
"placeholder": "למשל lain",
"register": "הירשם",
"username": "׊ם המש×Ēמ׊",
"hint": "הירשם ×ĸל מנ×Ē ×œ×”×Ļט׍ת לדיון"
},
"media_modal": {
"previous": "הקודם",
"next": "הבא"
},
"nav": {
"about": "×ĸל-אודו×Ē",
"back": "חזור",
"chat": "×Ļ'אט מקומי",
"friend_requests": "בקשו×Ē ×ĸקיבה",
"mentions": "אזכורים",
"interactions": "אינטרק×Ļיו×Ē",
"dms": "הוד×ĸו×Ē ×™×Š×™×¨×•×Ē",
"public_tl": "×Ļיר הזמן ה×Ļיבורי",
"timeline": "×Ļיר הזמן",
"twkn": "כל הרש×Ē ×”×™×“×•×ĸה",
"user_search": "חיפוש מ׊×Ēמ׊",
"who_to_follow": "אחרי מי ל×ĸקוב",
"preferences": "ה×ĸדפו×Ē"
},
"notifications": {
"broken_favorite": "סטאטוס לא ידו×ĸ, מחפשâ€Ļ",
"favorited_you": "אהב א×Ē ×”×Ą×˜×˜×•×Ą שלך",
"followed_you": "×ĸקב אחריך",
"load_older": "ט×ĸן ה×Ēראו×Ē ×™×Š× ×•×Ē",
"notifications": "ה×Ēראו×Ē",
"read": "קרא!",
"repeated_you": "חזר ×ĸל הסטטוס שלך",
"no_more_notifications": "לא ×ĸוד ה×Ēראו×Ē"
},
"interactions": {
"favs_repeats": "חזרו×Ē ×•×ž×•×ĸדפים",
"follows": "×ĸוקבים חדשים",
"load_older": "ט×ĸן אינטרק×Ļיו×Ē ×™×Š× ×•×Ē"
},
"post_status": {
"new_status": "פרסם סטאטוס חדש",
"account_not_locked_warning": "המש×Ēמ׊ שלך אינו {0}. כל אחד יכול ל×ĸקוב אחריך ולראו×Ē ××Ē ×”×”×•×“×ĸו×Ē ×œ×ĸוקבים-בלבד שלך.",
"account_not_locked_warning_link": "× ×ĸול",
"attachments_sensitive": "סמן מסמכים מ×Ļורפים כלא בטוחים ל×Ļפייה",
"content_type": {
"text/plain": "טקסט פשוט",
"text/html": "HTML",
"text/markdown": "Markdown",
"text/bbcode": "BBCode"
},
"content_warning": "נושא (× ×Ēון לבחירה)",
"default": "הרג×ĸ נח×Ē ×‘-ל.א.",
"direct_warning_to_all": "הוד×ĸה זו ×Ēהיה נראי×Ē ×œ×›×œ המש×Ēמשים המוזכרים.",
"direct_warning_to_first_only": "הוד×ĸה זו ×Ēהיה נראי×Ē ×œ×›×œ המש×Ēמשים במוזכרים ב×Ēחיל×Ē ×”×”×•×“×ĸה בלבד.",
"posting": "מפרסם",
"scope_notice": {
"public": "הוד×ĸה זו ×Ēהיה נראי×Ē ×œ×›×•×œ×",
"private": "הוד×ĸה זו ×Ēהיה נראי×Ē ×œ×ĸוקבים שלך בלבד",
"unlisted": "הוד×ĸה זו לא ×Ēהיה נראי×Ē ×‘×Ļיר זמן ה×Ļיבורי או בכל הרש×Ē ×”×™×“×•×ĸה"
},
"scope": {
"direct": "ישיר - שלח לאנשים המוזכרים בלבד",
"private": "×ĸוקבים-בלבד - שלח ל×ĸוקבים בלבד",
"public": "×Ļיבורי - שלח ל×Ļיר הזמן ה×Ļיבורי",
"unlisted": "מחו×Ĩ לרשימה - אל ×Ēשלח ל×Ļיר הזמן ה×Ļיבורי"
}
},
"registration": {
"bio": "אודו×Ē",
"email": "אימייל",
"fullname": "׊ם ×Ē×Ļוגה",
"password_confirm": "אישור סיסמה",
"registration": "הרשמה",
"token": "טוקן הזמנה",
"captcha": "אימו×Ē ×× ×•×Š",
"new_captcha": "לח×Ĩ ×ĸל ה×Ēמונה ×ĸל מנ×Ē ×œ×§×‘×œ אימו×Ē ×× ×•×Š חדש",
"username_placeholder": "למשל lain",
"fullname_placeholder": "למשל Lain Iwakura",
"bio_placeholder": "למשל\nהיי, אני ליין.\nאני ילד×Ē ×× ×™×ž×” שגרה בפרוורי יפן. אולי א×Ēם מכירים או×Ēי מהWired.",
"validations": {
"username_required": "לא יכול להישאר ריק",
"fullname_required": "לא יכול להישאר ריק",
"email_required": "לא יכול להישאר ריק",
"password_required": "לא יכול להישאר ריק",
"password_confirmation_required": "לא יכול להישאר ריק",
"password_confirmation_match": "×Ļריך להיו×Ē ×“×•×ž×” לסיסמה"
}
},
"selectable_list": {
"select_all": "בחר הכל"
},
"settings": {
"app_name": "׊ם האפליק×Ļיה",
"attachmentRadius": "×Ļירופים",
"attachments": "×Ļירופים",
"avatar": "×Ēמונ×Ē ×¤×¨×•×¤×™×œ",
"avatarAltRadius": "×Ēמונו×Ē ×¤×¨×•×¤×™×œ (ה×Ēראו×Ē)",
"avatarRadius": "×Ēמונו×Ē ×¤×¨×•×¤×™×œ",
"background": "רק×ĸ",
"bio": "אודו×Ē",
"block_export": "יי×Ļוא חסימו×Ē",
"block_export_button": "יי×Ļוא חסימו×Ē ××œ קוב×Ĩ csv",
"block_import": "ייבוא חסימו×Ē",
"block_import_error": "שגיאה בייבוא החסימו×Ē",
"blocks_imported": "החסימו×Ē ×™×•×‘××•! ייקח מ×ĸט זמן ל×ĸבד או×Ēן.",
"blocks_tab": "חסימו×Ē",
"btnRadius": "כפ×Ēורים",
"cBlue": "כחול (×Ēגובה, ×ĸקיבה)",
"cGreen": "ירוק (חזרה)",
"cOrange": "כ×Ēום (לייק)",
"cRed": "אדום (ביטול)",
"change_password": "שנה סיסמה",
"change_password_error": "היי×Ēה ב×ĸיה בשינוי סיסמ×Ēך.",
"changed_password": "סיסמה שונ×Ēה בה×Ļלחה!",
"collapse_subject": "מז×ĸר הוד×ĸו×Ē ×ĸם נושאים",
"composing": "מרכיב",
"confirm_new_password": "אשר סיסמה",
"current_avatar": "×Ēמונ×Ē ×”×¤×¨×•×¤×™×œ הנוכחי×Ē ×Š×œ×š",
"current_password": "סיסמה נוכחי×Ē",
"current_profile_banner": "כרז×Ē ×”×¤×¨×•×¤×™×œ הנוכחי×Ē ×Š×œ×š",
"data_import_export_tab": "ייבוא או יי×Ļוא מיד×ĸ",
"default_vis": "בריר×Ē ×ž×—×“×œ לטווח הנראו×Ē",
"delete_account": "מחק מ׊×Ēמ׊",
"delete_account_description": "מחק ל×Ļמי×Ēו×Ē ××Ē ×”×ž×Š×Ēמ׊ שלך וא×Ē ×›×œ הוד×ĸו×Ēיך.",
"delete_account_error": "היי×Ēה ב×ĸיה במחיק×Ē ×”×ž×Š×Ēמ׊. אם זה ממשיך, אנא ×ĸדכן א×Ē ×ž× ×”×œ השר×Ē ×Š×œ×š.",
"delete_account_instructions": "הכנס א×Ē ×Ą×™×Ą×ž×Ēך בקלט למטה ×ĸל מנ×Ē ×œ××Š×¨ מחיק×Ē ×ž×Š×Ēמ׊.",
"avatar_size_instruction": "הגודל המינימלי המומל×Ĩ ל×Ēמונו×Ē ×¤×¨×•×¤×™×œ הוא 150x150 פיקסלים.",
"export_theme": "שמור ×ĸרכים",
"filtering": "סינון",
"filtering_explanation": "כל הסטטוסים הכוללים א×Ē ×”×ž×™×œ×™× הללו יוש×Ēקו, אחד לשורה",
"follow_export": "י×Ļוא ×ĸקיבו×Ē",
"follow_export_button": "יי×Ļא א×Ē ×”× ×ĸקבים שלך לקוב×Ĩ csv",
"follow_import": "יבוא ×ĸקיבו×Ē",
"follow_import_error": "שגיאה בייבוא × ×ĸקבים",
"follows_imported": "× ×ĸקבים יובאו! ייקח זמן מה ל×ĸבד או×Ēם.",
"foreground": "חזי×Ē",
"general": "כללי",
"hide_attachments_in_convo": "החבא ×Ļירופים בשיחו×Ē",
"hide_attachments_in_tl": "החבא ×Ļירופים ב×Ļיר הזמן",
"hide_muted_posts": "הס×Ēר הוד×ĸו×Ē ×Š×œ מ׊×Ēמשים מוש×Ēקים",
"max_thumbnails": "מספר מירבי של ×Ēמונו×Ē ×ž×ž×•×–×ĸרו×Ē ×œ×”×•×“×ĸה",
"hide_isp": "הס×Ēר פאנל-×Ļד",
"preload_images": "ט×ĸן ×Ēמונו×Ē ×ž×¨××Š",
"use_one_click_nsfw": "פ×Ēח ×Ēמונו×Ē ×œ×-בטוחו×Ē-ל×ĸבודה ×ĸם לחי×Ļה אח×Ē ×‘×œ×‘×“",
"hide_post_stats": "הס×Ēר × ×Ēוני הוד×ĸה (למשל, מספר החזרו×Ē)",
"hide_user_stats": "הס×Ēר × ×Ēוני מ׊×Ēמ׊ (למשל, מספר ה×ĸוקבים)",
"hide_filtered_statuses": "מס×Ēר סטטוסים מסוננים",
"import_blocks_from_a_csv_file": "ייבא חסימו×Ē ×ž×§×•×‘×Ĩ csv",
"import_followers_from_a_csv_file": "ייבא א×Ē ×”× ×ĸקבים שלך מקוב×Ĩ csv",
"import_theme": "ט×ĸן ×ĸרכים",
"inputRadius": "שדו×Ē ×§×œ×˜",
"checkboxRadius": "×Ēיבו×Ē ×Ą×™×ž×•×Ÿ",
"instance_default": "(default: {value})",
"instance_default_simple": "(default)",
"interface": "ממ׊ק",
"interfaceLanguage": "׊פ×Ē ×”×ž×ž×Š×§",
"invalid_theme_imported": "הקוב×Ĩ הנבחר אינו ×Ēמה הנ×Ēמכ×Ē ×ĸ\"י פלרומה. שום שינויים לא × ×ĸשו ל×Ēמה שלך.",
"limited_availability": "לא זמין בדפדפן שלך",
"links": "לינקים",
"lock_account_description": "הגבל א×Ē ×”×ž×Š×Ēמ׊ ל×ĸוקבים מאושרים בלבד",
"loop_video": "נגן סרטונים ללא הפסקה",
"loop_video_silent_only": "נגן רק סרטונים חסרי קול ללא הפסקה",
"mutes_tab": "הש×Ēקו×Ē",
"play_videos_in_modal": "נגן סרטונים ישירו×Ē ×‘× ×’×Ÿ המדיה",
"use_contain_fit": "אל ×Ēח×Ēוך א×Ē ×”×Ļי׍ות ב×Ēמונו×Ē ×”×ž×ž×•×–×ĸרו×Ē",
"name": "׊ם",
"name_bio": "׊ם ואודו×Ē",
"new_password": "סיסמה חדשה",
"notification_visibility": "סוג הה×Ēראו×Ē ×Š×Ēר×Ļו לראו×Ē",
"notification_visibility_follows": "×ĸקיבו×Ē",
"notification_visibility_likes": "לייקים",
"notification_visibility_mentions": "אזכורים",
"notification_visibility_repeats": "חזרו×Ē",
"no_rich_text_description": "הסר פורמט טקץט ×ĸשיר מכל ההוד×ĸו×Ē",
"no_blocks": "ללא חסימו×Ē",
"no_mutes": "ללא הש×Ēקו×Ē",
"hide_follows_description": "אל ×Ēראה אחרי מי אני ×ĸוקב",
"hide_followers_description": "אל ×Ēראה מי ×ĸוקב אחרי",
"show_admin_badge": "הראה סמל מנהל בפרופיל שלי",
"show_moderator_badge": "הראה סמל ×Ļוו×Ē ×‘×¤×¨×•×¤×™×œ שלי",
"nsfw_clickthrough": "החל החבא×Ē ×Ļירופים לא בטוחים ל×Ļפיה ב×ĸ×Ē ×ĸבודה ב×ĸזר×Ē ×œ×—×™×Ļ×Ē ×ĸכבר",
"oauth_tokens": "אסימוני OAuth",
"token": "אסימון",
"refresh_token": "ר×ĸנון האסימון",
"valid_until": "ב×Ēוקת ×ĸד",
"revoke_token": "בטל",
"panelRadius": "פאנלים",
"pause_on_unfocused": "השהה זרימ×Ē ×”×•×“×ĸו×Ē ×›×Š×”×—×œ×•×Ÿ לא בפוקוס",
"presets": "×ĸרכים קבו×ĸים מרא׊",
"profile_background": "רק×ĸ הפרופיל",
"profile_banner": "כרז×Ē ×”×¤×¨×•×¤×™×œ",
"profile_tab": "פרופיל",
"radii_help": "קב×ĸ מרא׊ ×ĸיגול פינו×Ē ×œ×ž×ž×Š×§ (בפיקסלים)",
"replies_in_timeline": "×Ēגובו×Ē ×‘×Ļיר הזמן",
"reply_visibility_all": "הראה א×Ē ×›×œ ה×Ēגובו×Ē",
"reply_visibility_following": "הראה ×Ēגובו×Ē ×Š×ž×•×¤× ×•×Ē ××œ×™×™ או ל×ĸקובים שלי בלבד",
"reply_visibility_self": "הראה ×Ēגובו×Ē ×Š×ž×•×¤× ×•×Ē ××œ×™×™ בלבד",
"autohide_floating_post_button": "החבא אוטומטי×Ē ××Ē ×”×›×¤×Ēור הוד×ĸה חדשה (נייד)",
"saving_err": "שגיאה בשמיר×Ē ×”×’×“×¨×•×Ē",
"saving_ok": "הגדרו×Ē × ×Š×ž×¨×•",
"search_user_to_block": "חפש מ׊×Ēמ׊ לחסימה",
"search_user_to_mute": "חפש מ׊×Ēמ׊ להש×Ēקה",
"security_tab": "ביטחון",
"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": "כמו מסטודון: ה×ĸ×Ē×§ כפי שזה",
"subject_line_noop": "אל ×Ē×ĸ×Ēיק",
"post_status_content_type": "שלח א×Ē ×Ą×•×’ ×Ēוכן ההוד×ĸה",
"stop_gifs": "נגן-ב×ĸ×Ē-׍יחות GIFs",
"streaming": "החל זרימ×Ē ×”×•×“×ĸו×Ē ××•×˜×•×ž×˜×™×Ē ×‘×ĸ×Ē ×’×œ×™×œ×” למ×ĸלה הדת",
"text": "טקץט",
"theme": "×Ēמה",
"theme_help": "הש×Ēמ׊ בקודי ×Ļב×ĸ הקס (#אדום-אדום-ירוק-ירוק-כחול-כחול) ×ĸל מנ×Ē ×œ×”×Ēאים אישי×Ē ××Ē ×Ēמ×Ē ×”×Ļב×ĸ שלך.",
"tooltipRadius": "טולטיפ \\ ה×Ēראו×Ē",
"upload_a_photo": "ה×ĸלה ×Ēמונה",
"user_settings": "הגדרו×Ē ×ž×Š×Ēמ׊",
"values": {
"false": "לא",
"true": "כן"
},
"notifications": "ה×Ēראו×Ē",
"enable_web_push_notifications": "אפ׊ר ה×Ēראו×Ē web push",
"version": {
"title": "גרסה",
"backend_version": "גרס×Ē ×§×Ļה אחורי",
"frontend_version": "גרס×Ē ×§×Ļה קדמי"
}
},
"timeline": {
"collapse": "מוטט",
"conversation": "שיחה",
"error_fetching": "שגיאה בהבא×Ē ×”×•×“×ĸו×Ē",
"load_older": "ט×ĸן סטטוסים חדשים",
"no_retweet_hint": "ההוד×ĸה מסומנ×Ē ×›\"ל×ĸוקבים-בלבד\" ולא ני×Ēן לחזור ×ĸליה",
"repeated": "חזר",
"show_new": "הראה חדש",
"up_to_date": "×ĸדכני",
"no_more_statuses": "אין ×ĸוד סטטוסים",
"no_statuses": "אין סטטוסים"
},
"status": {
"favorites": "מו×ĸדפים",
"repeats": "חזרו×Ē",
"delete": "מחק סטטוס",
"pin": "ה×Ļמד לפרופיל",
"unpin": "הסר ה×Ļמדה מהפרופיל",
"pinned": "מו×Ļמד",
"delete_confirm": "האם באמ×Ē ×œ×ž×—×•×§ סטטוס זה?",
"reply_to": "הגב ל",
"replies_list": "×Ēגובו×Ē:"
},
"user_card": {
"approve": "א׊ר",
"block": "חסימה",
"blocked": "חסום!",
"deny": "דחה",
"favorites": "מו×ĸדפים",
"follow": "×ĸקוב",
"follow_sent": "בקשה נשלחה!",
"follow_progress": "מבקשâ€Ļ",
"follow_again": "שלח בקשה שוב?",
"follow_unfollow": "בטל ×ĸקיבה",
"followees": "× ×ĸקבים",
"followers": "×ĸוקבים",
"following": "×ĸוקב!",
"follows_you": "×ĸוקב אחריך!",
"its_you": "זה א×Ēה!",
"media": "מדיה",
"mute": "הש×Ē×§",
"muted": "מוש×Ē×§",
"per_day": "ליום",
"remote_follow": "×ĸקיבה מרחוק",
"report": "דווח",
"statuses": "סטטוסים",
"unblock": "הסר חסימה",
"unblock_progress": "מסיר חסימהâ€Ļ",
"block_progress": "חוסםâ€Ļ",
"unmute": "הסר הש×Ēקה",
"unmute_progress": "מסיר הש×Ēקהâ€Ļ",
"mute_progress": "מ׊×Ēיקâ€Ļ",
"admin_menu": {
"moderation": "ניהול (×Ļוו×Ē)",
"grant_admin": "הפוך למנהל",
"revoke_admin": "הסר מנהל",
"grant_moderator": "הפוך ל×Ļוו×Ē",
"revoke_moderator": "הסר ×Ļוו×Ē",
"activate_account": "הפ×ĸל מ׊×Ēמ׊",
"deactivate_account": "השב×Ē ×ž×Š×Ēמ׊",
"delete_account": "מחק מ׊×Ēמ׊",
"force_nsfw": "סמן א×Ē ×›×œ ההוד×ĸו×Ē ×‘×Ēור לא-מ×Ēאימו×Ē-ל×ĸבודה",
"strip_media": "הסר מדיה מההוד×ĸו×Ē",
"force_unlisted": "הפוך הוד×ĸו×Ē ×œ×œ× רשומו×Ē",
"sandbox": "הפוך הוד×ĸו×Ē ×œ× ×¨××•×Ē ×œ×ĸוקבים-בלבד",
"disable_remote_subscription": "אל ×Ēאפ׊ר ×ĸקיבה של המש×Ēמ׊ מאינסטנס אחר",
"disable_any_subscription": "אל ×Ēאפ׊ר ×ĸקיבה של המש×Ēמ׊ בכלל",
"quarantine": "אל ×Ēאפ׊ר פדר×Ļיה של ההוד×ĸו×Ē ×Š×œ המש×Ēמ׊",
"delete_user": "מחק מ׊×Ēמ׊",
"delete_user_confirmation": "בטוח? פ×ĸולה זו הינה בל×Ēי הפיכה."
}
},
"user_profile": {
"timeline_title": "×Ļיר זמן המש×Ēמ׊",
"profile_does_not_exist": "סליחה, פרופיל זה אינו קיים.",
"profile_loading_error": "סליחה, היי×Ēה שגיאה בט×ĸינ×Ē ×”×¤×¨×•×¤×™×œ."
},
"user_reporting": {
"title": "מדווח ×ĸל {0}",
"add_comment_description": "הדיווח ישלח ל×Ļוו×Ē ×”××™× ×Ą×˜× ×Ą. אפ׊ר להסביר למה הנך מדווחים ×ĸל מ׊×Ēמ׊ זה למטה:",
"additional_comments": "×Ēגובו×Ē × ×•×Ą×¤×•×Ē",
"forward_description": "המש×Ēמ׊ מ׊ר×Ē ××—×¨. לשלוח לשם ×ĸו×Ē×§ של הדיווח?",
"forward_to": "ה×ĸבר ל {0}",
"submit": "הגש",
"generic_error": "קר×Ēה שגיאה ב×ĸ×Ē ×ĸיבוד הבקשה."
},
"who_to_follow": {
"more": "×ĸוד",
"who_to_follow": "אחרי מי ל×ĸקוב"
},
"tool_tip": {
"media_upload": "ה×ĸלה מדיה",
"repeat": "חזור",
"reply": "הגב",
"favorite": "מו×ĸדת",
"user_settings": "הגדרו×Ē ×ž×Š×Ēמ׊"
},
"upload": {
"error": {
"base": "ה×ĸלאה נכשלה.",
"file_too_big": "קוב×Ĩ גדול מדי [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",
"default": "נסה שוב אחר כך"
},
"file_size_units": {
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB"
}
+ },
+ "about": {
+ "mrf": {
+ "keyword": {
+ "keyword_policies": "פוליס×Ē ×ž×™×œ×•×Ē ×ž×¤×Ēח"
+ },
+ "federation": "פדר×Ļיה"
+ }
}
}
diff --git a/src/i18n/it.json b/src/i18n/it.json
index 67e92b3265..58dafca59e 100644
--- a/src/i18n/it.json
+++ b/src/i18n/it.json
@@ -1,820 +1,823 @@
{
"general": {
"submit": "Invia",
"apply": "Applica",
"more": "Altro",
"generic_error": "Errore",
"optional": "facoltativo",
"show_more": "Mostra tutto",
"show_less": "Ripiega",
"dismiss": "Chiudi",
"cancel": "Annulla",
"disable": "Disabilita",
"enable": "Abilita",
"confirm": "Conferma",
"verify": "Verifica",
"peek": "Anteprima",
"close": "Chiudi",
"retry": "Riprova",
"error_retry": "Per favore, riprova",
"loading": "Caricoâ€Ļ"
},
"nav": {
"mentions": "Menzioni",
"public_tl": "Sequenza pubblica",
"timeline": "Sequenza personale",
"twkn": "Sequenza globale",
"chat": "Chat della stanza",
"friend_requests": "Vogliono seguirti",
"about": "Informazioni",
"administration": "Amministrazione",
"back": "Indietro",
"interactions": "Interazioni",
"dms": "Messaggi diretti",
"user_search": "Ricerca utenti",
"search": "Ricerca",
"who_to_follow": "Chi seguire",
"preferences": "Preferenze",
"bookmarks": "Segnalibri",
"chats": "Conversazioni",
"timelines": "Sequenze"
},
"notifications": {
"followed_you": "ti segue",
"notifications": "Notifiche",
"read": "Letto!",
"broken_favorite": "Stato sconosciuto, lo sto cercandoâ€Ļ",
"favorited_you": "ha gradito 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",
"avatar": "Icona utente",
"bio": "Introduzione",
"current_avatar": "La tua icona attuale",
"current_profile_banner": "Il tuo stendardo attuale",
"filtering": "Filtri",
"filtering_explanation": "Tutti i post contenenti queste parole saranno silenziati, una per riga",
"hide_attachments_in_convo": "Nascondi gli allegati presenti nelle conversazioni",
"hide_attachments_in_tl": "Nascondi gli allegati presenti nelle sequenze",
"name": "Nome",
"name_bio": "Nome ed introduzione",
"nsfw_clickthrough": "Fai click per visualizzare gli allegati offuscati",
"profile_background": "Sfondo della tua pagina",
"profile_banner": "Stendardo del tuo profilo",
"set_new_avatar": "Scegli una nuova icona",
"set_new_profile_background": "Scegli un nuovo sfondo per la tua pagina",
"set_new_profile_banner": "Scegli un nuovo stendardo per il tuo profilo",
"settings": "Impostazioni",
"theme": "Tema",
"user_settings": "Impostazioni Utente",
"attachmentRadius": "Allegati",
"avatarAltRadius": "Icone utente (Notifiche)",
"avatarRadius": "Icone utente",
"background": "Sfondo",
"btnRadius": "Pulsanti",
"cBlue": "Blu (risposte, seguire)",
"cGreen": "Verde (ripeti)",
"cOrange": "Arancione (gradire)",
"cRed": "Rosso (annulla)",
"change_password": "Cambia password",
"change_password_error": "C'è stato un problema durante il cambiamento della password.",
"changed_password": "Password cambiata correttamente!",
"collapse_subject": "Ripiega messaggi con oggetto",
"confirm_new_password": "Conferma la nuova password",
"current_password": "La tua password attuale",
"data_import_export_tab": "Importa o esporta dati",
"default_vis": "Visibilità predefinita dei messaggi",
"delete_account": "Elimina profilo",
"delete_account_description": "Elimina definitivamente i tuoi dati e disattiva il tuo profilo.",
"delete_account_error": "C'è stato un problema durante l'eliminazione del tuo profilo. Se il problema persiste contatta l'amministratore della tua stanza.",
"delete_account_instructions": "Digita la tua password nel campo sottostante per confermare l'eliminazione del tuo profilo.",
"export_theme": "Salva impostazioni",
"follow_export": "Esporta la lista di chi segui",
"follow_export_button": "Esporta la lista di chi segui in un file CSV",
"follow_export_processing": "Sto elaborando, presto ti sarà chiesto di scaricare il tuo file",
"follow_import": "Importa la lista di chi segui",
"follow_import_error": "Errore nell'importazione della lista di chi segui",
"follows_imported": "Importazione riuscita! L'elaborazione richiederà un po' di tempo.",
"foreground": "Primo piano",
"general": "Generale",
"hide_post_stats": "Nascondi statistiche dei messaggi (es. il numero di preferenze)",
"hide_user_stats": "Nascondi statistiche dell'utente (es. il numero dei tuoi seguaci)",
"import_followers_from_a_csv_file": "Importa una lista di chi segui da un file CSV",
"import_theme": "Carica impostazioni",
"inputRadius": "Campi di testo",
"instance_default": "(predefinito: {value})",
"interfaceLanguage": "Lingua dell'interfaccia",
"invalid_theme_imported": "Il file selezionato non è un tema supportato da Pleroma. Il tuo tema non è stato modificato.",
"limited_availability": "Non disponibile nel tuo browser",
"links": "Collegamenti",
"lock_account_description": "Limita il tuo account solo a seguaci approvati",
"loop_video": "Riproduci video in ciclo continuo",
"loop_video_silent_only": "Riproduci solo video senza audio in ciclo continuo (es. le \"gif\" di Mastodon)",
"new_password": "Nuova password",
"notification_visibility": "Tipi di notifiche da mostrare",
"notification_visibility_follows": "Nuove persone ti seguono",
"notification_visibility_likes": "Preferiti",
"notification_visibility_mentions": "Menzioni",
"notification_visibility_repeats": "Condivisioni",
"no_rich_text_description": "Togli la formattazione del testo da tutti i messaggi",
"oauth_tokens": "Token OAuth",
"token": "Token",
"refresh_token": "Aggiorna token",
"valid_until": "Valido fino a",
"revoke_token": "Revoca",
"panelRadius": "Pannelli",
"pause_on_unfocused": "Interrompi l'aggiornamento continuo mentre la scheda è in secondo piano",
"presets": "Valori predefiniti",
"profile_tab": "Profilo",
"radii_help": "Imposta il raggio degli angoli (in pixel)",
"replies_in_timeline": "Risposte nella sequenza personale",
"reply_visibility_all": "Mostra tutte le risposte",
"reply_visibility_following": "Mostra solo le risposte rivolte a me o agli utenti che seguo",
"reply_visibility_self": "Mostra solo risposte rivolte a me",
"saving_err": "Errore nel salvataggio delle impostazioni",
"saving_ok": "Impostazioni salvate",
"security_tab": "Sicurezza",
"stop_gifs": "Riproduci GIF al passaggio del cursore",
"streaming": "Mostra automaticamente i nuovi messaggi quando sei in cima alla pagina",
"text": "Testo",
"theme_help": "Usa codici colore esadecimali (#rrggbb) per personalizzare il tuo schema di colori.",
"tooltipRadius": "Suggerimenti/avvisi",
"values": {
"false": "no",
"true": "sÃŦ"
},
"avatar_size_instruction": "La taglia minima per l'icona personale è 150x150 pixel.",
"domain_mutes": "Domini",
"discoverable": "Permetti la scoperta di questo profilo da servizi di ricerca ed altro",
"composing": "Composizione",
"changed_email": "Email cambiata con successo!",
"change_email_error": "C'è stato un problema nel cambiare la tua email.",
"change_email": "Cambia email",
"blocks_tab": "Bloccati",
"blocks_imported": "Blocchi importati! Saranno elaborati a breve.",
"block_import_error": "Errore nell'importazione",
"block_import": "Importa blocchi",
"block_export_button": "Esporta i tuoi blocchi in un file CSV",
"block_export": "Esporta blocchi",
"allow_following_move": "Consenti",
"mfa": {
"verify": {
"desc": "Per abilitare l'autenticazione bifattoriale, inserisci il codice fornito dalla tua applicazione:"
},
"scan": {
"secret_code": "Codice",
"desc": "Con la tua applicazione bifattoriale, acquisisci questo QR o inserisci il codice manualmente:",
"title": "Acquisisci"
},
"authentication_methods": "Metodi di accesso",
"recovery_codes_warning": "Appuntati i codici o salvali in un posto sicuro, altrimenti rischi di non rivederli mai piÚ. Se perderai l'accesso sia alla tua applicazione bifattoriale che ai codici di recupero non potrai piÚ accedere al tuo profilo.",
"waiting_a_recovery_codes": "Ricevo codici di recuperoâ€Ļ",
"recovery_codes": "Codici di recupero.",
"warning_of_generate_new_codes": "Alla generazione di nuovi codici di recupero, quelli vecchi saranno disattivati.",
"generate_new_recovery_codes": "Genera nuovi codici di recupero",
"title": "Accesso bifattoriale",
"confirm_and_enable": "Conferma ed abilita OTP",
"wait_pre_setup_otp": "preimposto OTP",
"setup_otp": "Imposta OTP",
"otp": "OTP"
},
"enter_current_password_to_confirm": "Inserisci la tua password per identificarti",
"security": "Sicurezza",
"app_name": "Nome applicazione",
"style": {
"switcher": {
"help": {
"older_version_imported": "Il tema importato è stato creato per una versione precedente dell'interfaccia.",
"future_version_imported": "Il tema importato è stato creato per una versione piÚ recente dell'interfaccia.",
"v2_imported": "Il tema importato è stato creato per una vecchia interfaccia. Non tutto potrebbe essere come prima.",
"upgraded_from_v2": "L'interfaccia è stata aggiornata, il tema potrebbe essere diverso da come lo intendevi.",
"migration_snapshot_ok": "Ho caricato l'anteprima del tema. Puoi provare a caricarne i contenuti.",
"fe_downgraded": "L'interfaccia è stata portata ad una versione precedente.",
"fe_upgraded": "Lo schema dei temi è stato aggiornato insieme all'interfaccia.",
"snapshot_missing": "Il tema non è provvisto di anteprima, quindi potrebbe essere diverso da come appare.",
"snapshot_present": "Tutti i valori sono sostituiti dall'anteprima del tema. Puoi invece caricare i suoi contenuti.",
"snapshot_source_mismatch": "Conflitto di versione: probabilmente l'interfaccia è stata portata ad una versione precedente e poi aggiornata di nuovo. Se hai modificato il tema con una versione precedente dell'interfaccia, usa la vecchia versione del tema, altrimenti puoi usare la nuova.",
"migration_napshot_gone": "Anteprima del tema non trovata, non tutto potrebbe essere come ricordi."
},
"use_source": "Nuova versione",
"use_snapshot": "Versione precedente",
"keep_as_is": "Mantieni tal quale",
"load_theme": "Carica tema",
"clear_opacity": "Rimuovi opacità",
"clear_all": "Azzera tutto",
"reset": "Reimposta",
"save_load_hint": "Le opzioni \"mantieni\" conservano le impostazioni correnti quando selezioni o carichi un tema, e le salvano quando ne esporti uno. Quando nessuna casella è selezionata, tutte le impostazioni correnti saranno salvate nel tema.",
"keep_fonts": "Mantieni font",
"keep_roundness": "Mantieni vertici",
"keep_opacity": "Mantieni opacità",
"keep_shadows": "Mantieni ombre",
"keep_color": "Mantieni colori"
},
"common": {
"opacity": "Opacità",
"color": "Colore",
"contrast": {
"context": {
"text": "per il testo",
"18pt": "per il testo grande (oltre 17pt)"
},
"level": {
"bad": "non soddisfa le linee guida di alcun livello",
"aaa": "soddisfa le linee guida di livello AAA (ottimo)",
"aa": "soddisfa le linee guida di livello AA (sufficiente)"
},
"hint": "Il rapporto di contrasto è {ratio}, e {level} {context}"
}
},
"advanced_colors": {
"badge": "Sfondo medaglie",
"post": "Messaggi / Biografie",
"alert_neutral": "Neutro",
"alert_warning": "Attenzione",
"alert_error": "Errore",
"alert": "Sfondo degli avvertimenti",
"_tab_label": "Avanzate",
"tabs": "Etichette",
"disabled": "Disabilitato",
"selectedMenu": "Voce menÚ selezionata",
"selectedPost": "Messaggio selezionato",
"pressed": "Premuto",
"highlight": "Elementi evidenziati",
"icons": "Icone",
"poll": "Grafico sondaggi",
"underlay": "Sottostante",
"faint_text": "Testo sbiadito",
"inputs": "Campi d'immissione",
"buttons": "Pulsanti",
"borders": "Bordi",
"top_bar": "Barra superiore",
"panel_header": "Titolo pannello",
"badge_notification": "Notifica",
"popover": "Suggerimenti, menÚ, sbalzi",
"toggled": "Scambiato",
"chat": {
"border": "Bordo",
"outgoing": "Inviati",
"incoming": "Ricevuti"
}
},
"common_colors": {
"rgbo": "Icone, accenti, medaglie",
"foreground_hint": "Seleziona l'etichetta \"Avanzate\" per controlli piÚ fini",
"main": "Colori comuni",
"_tab_label": "Comuni"
},
"shadows": {
"inset": "Includi",
"spread": "Spandi",
"blur": "Sfoca",
"shadow_id": "Ombra numero {value}",
"override": "Sostituisci",
"component": "Componente",
"_tab_label": "Luci ed ombre",
"components": {
"avatarStatus": "Icona utente (vista messaggio)",
"avatar": "Icona utente (vista profilo)",
"topBar": "Barra superiore",
"panelHeader": "Intestazione pannello",
"panel": "Pannello",
"input": "Campo d'immissione",
"buttonPressedHover": "Pulsante (puntato e premuto)",
"buttonPressed": "Pulsante (premuto)",
"buttonHover": "Pulsante (puntato)",
"button": "Pulsante",
"popup": "Sbalzi e suggerimenti"
},
"filter_hint": {
"inset_classic": "Le ombre incluse usano {0}",
"spread_zero": "Lo spandimento maggiore di zero si azzera sulle ombre",
"avatar_inset": "Tieni presente che combinare ombre (sia incluse che non) sulle icone utente potrebbe dare risultati strani con quelle trasparenti.",
"drop_shadow_syntax": "{0} non supporta il parametro {1} nÊ la keyword {2}.",
"always_drop_shadow": "Attenzione: quest'ombra usa sempre {0} se il tuo browser lo supporta."
},
"hintV3": "Per le ombre puoi anche usare la sintassi {0} per sfruttare il secondo colore."
},
"radii": {
"_tab_label": "Raggio"
},
"fonts": {
"_tab_label": "Font",
"custom": "Personalizzato",
"weight": "Peso (grassettatura)",
"size": "Dimensione (in pixel)",
"family": "Nome font",
"components": {
"postCode": "Font a spaziatura fissa incluso in un messaggio",
"post": "Testo del messaggio",
"input": "Campi d'immissione",
"interface": "Interfaccia"
},
"help": "Seleziona il font da usare per gli elementi dell'interfaccia. Se scegli \"personalizzato\" devi inserire il suo nome di sistema."
},
"preview": {
"link": "un bel collegamentino",
"checkbox": "Ho dato uno sguardo a termini e condizioni",
"header_faint": "Tutto bene",
"fine_print": "Leggi il nostro {0} per imparare un bel niente!",
"faint_link": "utilissimo manuale",
"input": "Sono appena atterrato a Fiumicino.",
"mono": "contenuto",
"text": "Altro {0} e {1}",
"content": "Contenuto",
"button": "Pulsante",
"error": "Errore d'esempio",
"header": "Anteprima"
}
},
"enable_web_push_notifications": "Abilita notifiche web push",
"fun": "Divertimento",
"notification_mutes": "Per non ricevere notifiche da uno specifico utente, zittiscilo.",
"notification_setting_privacy_option": "Nascondi mittente e contenuti delle notifiche push",
"notification_setting_privacy": "Privacy",
"notification_setting_filters": "Filtri",
"notifications": "Notifiche",
"greentext": "Frecce da meme",
"upload_a_photo": "Carica un'immagine",
"type_domains_to_mute": "Cerca domini da zittire",
"theme_help_v2_2": "Le icone dietro alcuni elementi sono indicatori del contrasto fra testo e sfondo, passaci sopra col puntatore per ulteriori informazioni. Se si usano delle trasparenze, questi indicatori mostrano il peggior caso possibile.",
"theme_help_v2_1": "Puoi anche forzare colore ed opacità di alcuni elementi selezionando la casella. Usa il pulsante \"Azzera\" per azzerare tutte le forzature.",
"useStreamingApiWarning": "(Sconsigliato, sperimentale, puÃ˛ saltare messaggi)",
"useStreamingApi": "Ricevi messaggi e notifiche in tempo reale",
"user_mutes": "Utenti",
"post_status_content_type": "Tipo di contenuto dei messaggi",
"subject_line_noop": "Non copiare",
"subject_line_mastodon": "Come in Mastodon: copia tal quale",
"subject_line_email": "Come nelle email: \"re: oggetto\"",
"subject_line_behavior": "Copia oggetto quando rispondi",
"subject_input_always_show": "Mostra sempre il campo Oggetto",
"minimal_scopes_mode": "Riduci opzioni di visibilità",
"scope_copy": "Risposte ereditano la visibilità (messaggi privati lo fanno sempre)",
"search_user_to_mute": "Cerca utente da zittire",
"search_user_to_block": "Cerca utente da bloccare",
"autohide_floating_post_button": "Nascondi automaticamente il pulsante di composizione (mobile)",
"show_moderator_badge": "Mostra l'insegna di moderatore sulla mia pagina",
"show_admin_badge": "Mostra l'insegna di amministratore sulla mia pagina",
"hide_followers_count_description": "Non mostrare quanti seguaci ho",
"hide_follows_count_description": "Non mostrare quanti utenti seguo",
"hide_followers_description": "Non mostrare i miei seguaci",
"hide_follows_description": "Non mostrare chi seguo",
"no_mutes": "Nessun utente zittito",
"no_blocks": "Nessun utente bloccato",
"notification_visibility_emoji_reactions": "Reazioni",
"notification_visibility_moves": "Migrazioni utenti",
"new_email": "Nuova email",
"use_contain_fit": "Non ritagliare le anteprime degli allegati",
"play_videos_in_modal": "Riproduci video in un riquadro a sbalzo",
"mutes_tab": "Zittiti",
"interface": "Interfaccia",
"instance_default_simple": "(predefinito)",
"checkboxRadius": "Caselle di selezione",
"import_blocks_from_a_csv_file": "Importa blocchi da un file CSV",
"hide_filtered_statuses": "Nascondi messaggi filtrati",
"use_one_click_nsfw": "Apri media offuscati con un solo click",
"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",
"accent": "Accento",
"emoji_reactions_on_timeline": "Mostra emoji di reazione sulle sequenze",
"pad_emoji": "Affianca spazi agli emoji inseriti tramite selettore",
"notification_blocks": "Bloccando un utente non riceverai piÚ le sue notifiche nÊ lo seguirai piÚ.",
"mutes_and_blocks": "Zittiti e bloccati",
"profile_fields": {
"value": "Contenuto",
"name": "Etichetta",
"add_field": "Aggiungi campo",
"label": "Metadati profilo"
},
"bot": "Questo profilo è di un robot",
"version": {
"frontend_version": "Versione interfaccia",
"backend_version": "Versione backend",
"title": "Versione"
},
"reset_avatar": "Azzera icona",
"reset_profile_background": "Azzera sfondo profilo",
"reset_profile_banner": "Azzera stendardo profilo",
"reset_avatar_confirm": "Vuoi veramente azzerare l'icona?",
"reset_banner_confirm": "Vuoi veramente azzerare lo stendardo?",
"reset_background_confirm": "Vuoi veramente azzerare lo sfondo?",
"chatMessageRadius": "Messaggi istantanei",
"notification_setting_hide_notification_contents": "Nascondi mittente e contenuti delle notifiche push",
"notification_setting_block_from_strangers": "Blocca notifiche da utenti che non segui",
"virtual_scrolling": "Velocizza l'elaborazione delle sequenze",
"import_mutes_from_a_csv_file": "Importa silenziati da un file CSV",
"mutes_imported": "Silenziati importati! Saranno elaborati a breve.",
"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"
},
"timeline": {
"error_fetching": "Errore nell'aggiornamento",
"load_older": "Carica messaggi piÚ vecchi",
"show_new": "Mostra nuovi",
"up_to_date": "Aggiornato",
"collapse": "Riduci",
"conversation": "Conversazione",
"no_retweet_hint": "Il messaggio è diretto o solo per seguaci e non puÃ˛ essere condiviso",
"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",
"followees": "Chi stai seguendo",
"followers": "Seguaci",
"following": "SeguÃŦto!",
"follows_you": "Ti segue!",
"mute": "Silenzia",
"muted": "Silenziato",
"per_day": "al giorno",
"statuses": "Messaggi",
"approve": "Approva",
"block": "Blocca",
"blocked": "Bloccato!",
"deny": "Nega",
"remote_follow": "Segui da remoto",
"admin_menu": {
"delete_user_confirmation": "Ne sei completamente sicuro? Quest'azione non puÃ˛ essere annullata.",
"delete_user": "Elimina utente",
"quarantine": "I messaggi non arriveranno alle altre stanze",
"disable_any_subscription": "Rendi utente non seguibile",
"disable_remote_subscription": "Blocca i tentativi di seguirlo da altre stanze",
"sandbox": "Rendi tutti i messaggi solo per seguaci",
"force_unlisted": "Rendi tutti i messaggi invisibili",
"strip_media": "Rimuovi ogni allegato ai messaggi",
"force_nsfw": "Oscura tutti i messaggi",
"delete_account": "Elimina profilo",
"deactivate_account": "Disattiva profilo",
"activate_account": "Attiva profilo",
"revoke_moderator": "Divesti Moderatore",
"grant_moderator": "Crea Moderatore",
"revoke_admin": "Divesti Amministratore",
"grant_admin": "Crea Amministratore",
"moderation": "Moderazione"
},
"show_repeats": "Mostra condivisioni",
"hide_repeats": "Nascondi condivisioni",
"mute_progress": "Zittiscoâ€Ļ",
"unmute_progress": "Riabilitoâ€Ļ",
"unmute": "Riabilita",
"block_progress": "Bloccoâ€Ļ",
"unblock_progress": "Sbloccoâ€Ļ",
"unblock": "Sblocca",
"unsubscribe": "Disdici",
"subscribe": "AbbÃ˛nati",
"report": "Segnala",
"mention": "Menzioni",
"media": "Media",
"its_you": "Sei tu!",
"hidden": "Nascosto",
"follow_unfollow": "Disconosci",
"follow_again": "Reinvio richiesta?",
"follow_progress": "Richiedoâ€Ļ",
"follow_sent": "Richiesta inviata!",
"favorites": "Preferiti",
"message": "Contatta"
},
"chat": {
"title": "Chat"
},
"features_panel": {
"chat": "Chat",
"gopher": "Gopher",
"media_proxy": "Proxy multimedia",
"scope_options": "Opzioni visibilità",
"text_limit": "Lunghezza massima",
"title": "Caratteristiche",
"who_to_follow": "Chi seguire",
"pleroma_chat_messages": "Chiacchiere"
},
"finder": {
"error_fetching_user": "Errore nel recupero dell'utente",
"find_user": "Trova utente"
},
"login": {
"login": "Accedi",
"logout": "Disconnettiti",
"password": "Password",
"placeholder": "es. Lupo Lucio",
"register": "Registrati",
"username": "Nome utente",
"description": "Accedi con OAuth",
"hint": "Accedi per partecipare alla discussione",
"authentication_code": "Codice di autenticazione",
"enter_recovery_code": "Inserisci un codice di recupero",
"enter_two_factor_code": "Inserisci un codice two-factor",
"recovery_code": "Codice di recupero",
"heading": {
"totp": "Autenticazione two-factor",
"recovery": "Recupero two-factor"
}
},
"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_link": "protetto",
"attachments_sensitive": "Nascondi gli allegati",
"content_type": {
"text/plain": "Testo normale",
"text/bbcode": "BBCode",
"text/markdown": "Markdown",
"text/html": "HTML"
},
"content_warning": "Oggetto (facoltativo)",
"default": "Sono appena atterrato a Fiumicino.",
"direct_warning": "Questo post sarà visibile solo dagli utenti menzionati.",
"posting": "Sto pubblicando",
"scope": {
"direct": "Diretto - Visibile solo agli utenti menzionati",
"private": "Solo per seguaci - Visibile solo dai tuoi seguaci",
"public": "Pubblico - Visibile sulla sequenza pubblica",
"unlisted": "Non elencato - Non visibile sulla sequenza pubblica"
},
"scope_notice": {
"unlisted": "Questo messaggio non sarà visibile sulla sequenza locale nÊ su quella pubblica",
"private": "Questo messaggio sarà visibile solo ai tuoi seguaci",
"public": "Questo messaggio sarà visibile a tutti"
},
"direct_warning_to_first_only": "Questo messaggio sarà visibile solo agli utenti menzionati all'inizio.",
"direct_warning_to_all": "Questo messaggio sarà visibile a tutti i menzionati.",
"new_status": "Nuovo messaggio",
"empty_status_error": "Non puoi pubblicare messaggi vuoti senza allegati",
"preview_empty": "Vuoto",
"preview": "Anteprima",
"media_description_error": "Allegati non caricati, riprova",
"media_description": "Descrizione allegati"
},
"registration": {
"bio": "Introduzione",
"email": "Email",
"fullname": "Nome visualizzato",
"password_confirm": "Conferma password",
"registration": "Registrazione",
"token": "Codice d'invito",
"validations": {
"password_confirmation_match": "dovrebbe essere uguale alla password",
"password_confirmation_required": "non puÃ˛ essere vuoto",
"password_required": "non puÃ˛ essere vuoto",
"email_required": "non puÃ˛ essere vuoto",
"fullname_required": "non puÃ˛ essere vuoto",
"username_required": "non puÃ˛ essere vuoto"
},
"bio_placeholder": "es.\nCiao, sono Lupo Lucio.\nSono un lupo fantastico che vive nel Fantabosco. Forse mi hai visto alla Melevisione.",
"fullname_placeholder": "es. Lupo Lucio",
"username_placeholder": "es. mister_wolf",
"new_captcha": "Clicca l'immagine per avere un altro captcha",
"captcha": "CAPTCHA"
},
"user_profile": {
"timeline_title": "Sequenza dell'Utente",
"profile_loading_error": "Spiacente, c'è stato un errore nel caricamento del profilo.",
"profile_does_not_exist": "Spiacente, questo profilo non esiste."
},
"who_to_follow": {
"more": "Altro",
"who_to_follow": "Chi seguire"
},
"about": {
"mrf": {
"federation": "Federazione",
"keyword": {
"reject": "Rifiuta",
"replace": "Sostituisci",
"is_replaced_by": "→",
"keyword_policies": "Regole per parole chiave",
"ftl_removal": "Rimozione dalla sequenza globale"
},
"simple": {
"reject": "Rifiuta",
"accept": "Accetta",
"simple_policies": "Regole specifiche alla stanza",
"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:",
"ftl_removal": "Rimozione 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_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"
},
"domain_mute_card": {
"mute": "Zittisci",
"mute_progress": "Zittiscoâ€Ļ",
"unmute": "Ascolta",
"unmute_progress": "Procedoâ€Ļ"
},
"exporter": {
"export": "Esporta",
"processing": "In elaborazione, il tuo file sarà scaricabile a breve"
},
"image_cropper": {
"crop_picture": "Ritaglia immagine",
"save": "Salva",
"save_without_cropping": "Salva senza ritagliare",
"cancel": "Annulla"
},
"importer": {
"submit": "Invia",
"success": "Importato.",
"error": "L'importazione non è andata a buon fine."
},
"media_modal": {
"previous": "Precedente",
"next": "Prossimo"
},
"polls": {
"add_poll": "Sondaggio",
"add_option": "Alternativa",
"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",
"not_enough_options": "Aggiungi altre risposte"
},
"interactions": {
"favs_repeats": "Condivisi e preferiti",
"load_older": "Carica vecchie interazioni",
"moves": "Utenti migrati",
"follows": "Nuovi seguÃŦti"
},
"emoji": {
"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",
"search_emoji": "Cerca un emoji",
"keep_open": "Tieni aperto il menÚ",
"emoji": "Emoji",
"stickers": "Adesivi"
},
"selectable_list": {
"select_all": "Seleziona tutto"
},
"remote_user_resolver": {
"error": "Non trovato.",
"searching_for": "Cerco",
"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."
},
"status": {
"pinned": "Intestato",
"unpin": "De-intesta",
"pin": "Intesta al profilo",
"delete": "Elimina messaggio",
"repeats": "Condivisi",
"favorites": "Preferiti",
"hide_content": "Nascondi contenuti",
"show_content": "Mostra contenuti",
"hide_full_subject": "Nascondi intero oggetto",
"show_full_subject": "Mostra intero oggetto",
"thread_muted_and_words": ", contiene:",
"thread_muted": "Discussione zittita",
"copy_link": "Copia collegamento",
"status_unavailable": "Messaggio non disponibile",
"unmute_conversation": "Riabilita conversazione",
"mute_conversation": "Zittisci 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"
},
"time": {
"years_short": "{0}a",
"year_short": "{0}a",
"years": "{0} anni",
"year": "{0} anno",
"weeks_short": "{0}set",
"week_short": "{0}set",
"seconds_short": "{0}sec",
"second_short": "{0}sec",
"weeks": "{0} settimane",
"week": "{0} settimana",
"seconds": "{0} secondi",
"second": "{0} secondo",
"now_short": "ora",
"now": "adesso",
"months_short": "{0}me",
"month_short": "{0}me",
"months": "{0} mesi",
"month": "{0} mese",
"minutes_short": "{0}min",
"minute_short": "{0}min",
"minutes": "{0} minuti",
"minute": "{0} minuto",
"in_past": "{0} fa",
"in_future": "fra {0}",
"hours_short": "{0}h",
"days_short": "{0}g",
"hour_short": "{0}h",
"hours": "{0} ore",
"hour": "{0} ora",
"day_short": "{0}g",
"days": "{0} giorni",
"day": "{0} giorno"
},
"user_reporting": {
"title": "Segnalo {0}",
"additional_comments": "Osservazioni accessorie",
"generic_error": "C'è stato un errore nell'elaborazione della tua richiesta.",
"submit": "Invia",
"forward_to": "Inoltra a {0}",
"forward_description": "Il profilo appartiene ad un'altra stanza. Inviare la segnalazione anche a quella?",
"add_comment_description": "La segnalazione sarà inviata ai moderatori della tua stanza. Puoi motivarla qui sotto:"
},
"password_reset": {
"password_reset_required_but_mailer_is_disabled": "Devi reimpostare la tua password, ma non puoi farlo. Contatta il tuo amministratore.",
"password_reset_required": "Devi reimpostare la tua password per poter continuare.",
"password_reset_disabled": "Non puoi azzerare la tua password. Contatta il tuo amministratore.",
"too_many_requests": "Hai raggiunto il numero massimo di tentativi, riprova piÚ tardi.",
"return_home": "Torna alla pagina principale",
"check_email": "Controlla la tua posta elettronica.",
"placeholder": "La tua email o nome utente",
"instruction": "Inserisci il tuo indirizzo email o il tuo nome utente. Ti invieremo un collegamento per reimpostare la tua password.",
"password_reset": "Azzera password",
"forgot_password": "Password dimenticata?"
},
"search": {
"no_results": "Nessun risultato",
"people_talking": "{count} partecipanti",
"person_talking": "{count} partecipante",
"hashtags": "Etichette",
"people": "Utenti"
},
"upload": {
"file_size_units": {
"TiB": "TiB",
"GiB": "GiB",
"MiB": "MiB",
"KiB": "KiB",
"B": "B"
},
"error": {
"default": "Riprova in seguito",
"file_too_big": "File troppo pesante [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",
"base": "Caricamento fallito."
}
},
"tool_tip": {
"bookmark": "Aggiungi segnalibro",
"reject_follow_request": "Rifiuta seguace",
"accept_follow_request": "Accetta seguace",
"user_settings": "Impostazioni utente",
"add_reaction": "Reagisci",
"favorite": "Gradisci",
"reply": "Rispondi",
"repeat": "Ripeti",
"media_upload": "Carica allegati"
},
"display_date": {
"today": "Oggi"
},
"file_type": {
"file": "File",
"image": "Immagine",
"video": "Video",
"audio": "Audio"
},
"chats": {
"empty_chat_list_placeholder": "Non hai conversazioni. Contatta qualcuno!",
"error_sending_message": "Errore. Il messaggio non è stato inviato.",
"error_loading_chat": "Errore. La conversazione non è stata caricata.",
"delete_confirm": "Vuoi veramente eliminare questo messaggio?",
"more": "Altro",
"empty_message_error": "Non puoi inviare messaggi vuoti",
"new": "Nuova conversazione",
"chats": "Conversazioni",
"delete": "Elimina",
"message_user": "Contatta {nickname}",
"you": "Tu:"
},
"shoutbox": {
"title": "Graffiti"
}
}
diff --git a/src/i18n/ru.json b/src/i18n/ru.json
index 8f421b50de..f636bdf8f5 100644
--- a/src/i18n/ru.json
+++ b/src/i18n/ru.json
@@ -1,482 +1,491 @@
{
"chat": {
"title": "Đ§Đ°Ņ‚"
},
"finder": {
"error_fetching_user": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌ ĐŊĐĩ ĐŊаКдĐĩĐŊ",
"find_user": "ĐĐ°ĐšŅ‚Đ¸ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ"
},
"general": {
"apply": "ĐŸŅ€Đ¸ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ",
"submit": "ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ",
"cancel": "ĐžŅ‚ĐŧĐĩĐŊа",
"disable": "ОĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ",
"enable": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ",
"confirm": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ",
"verify": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ",
"more": "БоĐģҌ҈Đĩ",
"generic_error": "ĐŸŅ€ĐžĐ¸ĐˇĐžŅˆĐģа ĐžŅˆĐ¸ĐąĐēа",
"optional": "ĐŊĐĩ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž",
"show_less": "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŧĐĩĐŊҌ҈Đĩ",
- "show_more": "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ йОĐģҌ҈Đĩ"
+ "show_more": "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ йОĐģҌ҈Đĩ",
+ "peek": "Đ’ĐˇĐŗĐģŅĐŊŅƒŅ‚ŅŒ",
+ "dismiss": "ЗаĐēŅ€Ņ‹Ņ‚ŅŒ",
+ "retry": "ПоĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ Đĩ҉Đĩ Ņ€Đ°Đˇ",
+ "error_retry": "ПоĐļаĐģŅƒĐšŅŅ‚Đ° ĐŋĐžĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ Đĩ҉Đĩ Ņ€Đ°Đˇ",
+ "close": "ЗаĐēŅ€Ņ‹Ņ‚ŅŒ",
+ "loading": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐēаâ€Ļ"
},
"login": {
"login": "Đ’ĐžĐšŅ‚Đ¸",
"logout": "Đ’Ņ‹ĐšŅ‚Đ¸",
"password": "ĐŸĐ°Ņ€ĐžĐģҌ",
"placeholder": "e.c. lain",
"register": "Đ—Đ°Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒŅŅ",
"username": "ИĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ",
"authentication_code": "Код Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸",
"enter_recovery_code": "ВвĐĩŅŅ‚Đ¸ ĐēОд Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ",
"enter_two_factor_code": "ВвĐĩŅŅ‚Đ¸ ĐēОд Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸",
"recovery_code": "Код Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ",
"heading": {
"TotpForm": "Đ”Đ˛ŅƒŅ…Ņ„Đ°ĐēŅ‚ĐžŅ€ĐŊĐ°Ņ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ",
"RecoveryForm": "Two-factor recovery"
}
},
"nav": {
"back": "Назад",
"chat": "ЛоĐēаĐģҌĐŊŅ‹Đš Ņ‡Đ°Ņ‚",
"mentions": "ĐŖĐŋĐžĐŧиĐŊаĐŊĐ¸Ņ",
"interactions": "ВзаиĐŧОдĐĩĐšŅŅ‚Đ˛Đ¸Ņ",
"public_tl": "ĐŸŅƒĐąĐģĐ¸Ņ‡ĐŊĐ°Ņ ĐģĐĩĐŊŅ‚Đ°",
"timeline": "ЛĐĩĐŊŅ‚Đ°",
"twkn": "ФĐĩĐ´ĐĩŅ€Đ°Ņ‚Đ¸Đ˛ĐŊĐ°Ņ ĐģĐĩĐŊŅ‚Đ°",
"search": "ĐŸĐžĐ¸ŅĐē",
"friend_requests": "ЗаĐŋŅ€ĐžŅŅ‹ ĐŊа ҇҂ĐĩĐŊиĐĩ",
"bookmarks": "ЗаĐēĐģадĐēи"
},
"notifications": {
"broken_favorite": "НĐĩиСвĐĩҁ҂ĐŊŅ‹Đš ŅŅ‚Đ°Ņ‚ŅƒŅ, Đ¸Ņ‰ĐĩĐŧ...",
"favorited_you": "ĐŊŅ€Đ°Đ˛Đ¸Ņ‚ŅŅ Đ˛Đ°Ņˆ ŅŅ‚Đ°Ņ‚ŅƒŅ",
"followed_you": "ĐŊĐ°Ņ‡Đ°Đģ(а) Ņ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ Đ˛Đ°Ņ",
"load_older": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ ŅŅ‚Đ°Ņ€Ņ‹Đĩ ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ",
"notifications": "ĐŖĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ",
"read": "ĐŸŅ€ĐžŅ‡ĐĩŅŅ‚ŅŒ",
"repeated_you": "ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Đģ(а) Đ˛Đ°Ņˆ ŅŅ‚Đ°Ņ‚ŅƒŅ",
"follow_request": "Ņ…ĐžŅ‡ĐĩŅ‚ Ņ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ Đ˛Đ°Ņ"
},
"interactions": {
"favs_repeats": "ĐŸĐžĐ˛Ņ‚ĐžŅ€Ņ‹ и Ņ„Đ°Đ˛ĐžŅ€Đ¸Ņ‚Ņ‹",
"follows": "ĐĐžĐ˛Ņ‹Đĩ ĐŋОдĐŋĐ¸ŅĐēи",
"load_older": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ ŅŅ‚Đ°Ņ€Ņ‹Đĩ вСаиĐŧОдĐĩĐšŅŅ‚Đ˛Đ¸Ņ"
},
"post_status": {
"account_not_locked_warning": "Đ’Đ°Ņˆ аĐēĐēĐ°ŅƒĐŊŅ‚ ĐŊĐĩ {0}. ĐšŅ‚Đž ŅƒĐŗĐžĐ´ĐŊĐž ĐŧĐžĐļĐĩŅ‚ ĐŊĐ°Ņ‡Đ°Ņ‚ŅŒ Ņ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ Đ˛Đ°Ņ Ņ‡Ņ‚ĐžĐąŅ‹ видĐĩŅ‚ŅŒ ĐŋĐžŅŅ‚Ņ‹ Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ĐŋОдĐŋĐ¸ŅŅ‡Đ¸ĐēОв.",
"account_not_locked_warning_link": "СаĐģĐžŅ‡ĐĩĐŊ",
"attachments_sensitive": "ВĐģĐžĐļĐĩĐŊĐ¸Ņ ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‚ Ņ‡ŅƒĐ˛ŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš ĐēĐžĐŊŅ‚ĐĩĐŊŅ‚",
"content_warning": "ĐĸĐĩĐŧа (ĐŊĐĩ ĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž)",
"default": "Đ§Ņ‚Đž ĐŊĐžĐ˛ĐžĐŗĐž?",
"direct_warning": "Đ­Ņ‚ĐžŅ‚ ĐŋĐžŅŅ‚ ĐąŅƒĐ´ĐĩŅ‚ видĐĩĐŊ Ņ‚ĐžĐģҌĐēĐž ҃ĐŋĐžĐŧŅĐŊŅƒŅ‚Ņ‹Đŧ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅĐŧ",
"posting": "ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅĐĩŅ‚ŅŅ",
"scope_notice": {
"public": "Đ­Ņ‚ĐžŅ‚ ĐŋĐžŅŅ‚ ĐąŅƒĐ´ĐĩŅ‚ видĐĩĐŊ Đ˛ŅĐĩĐŧ",
"private": "Đ­Ņ‚ĐžŅ‚ ĐŋĐžŅŅ‚ ĐąŅƒĐ´ĐĩŅ‚ видĐĩĐŊ Ņ‚ĐžĐģҌĐēĐž Đ˛Đ°ŅˆĐ¸Đŧ ĐŋОдĐŋĐ¸ŅŅ‡Đ¸ĐēаĐŧ",
"unlisted": "Đ­Ņ‚ĐžŅ‚ ĐŋĐžŅŅ‚ ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚ видĐĩĐŊ в ĐŋŅƒĐąĐģĐ¸Ņ‡ĐŊОК и Ņ„ĐĩĐ´ĐĩŅ€Đ°Ņ‚Đ¸Đ˛ĐŊОК ĐģĐĩĐŊŅ‚Đĩ"
},
"scope": {
"direct": "Đ›Đ¸Ņ‡ĐŊĐžĐĩ - ŅŅ‚ĐžŅ‚ ĐŋĐžŅŅ‚ Đ˛Đ¸Đ´ŅŅ‚ Ņ‚ĐžĐģҌĐēĐž Ņ‚Đĩ ĐēŅ‚Đž в ĐŊŅ‘Đŧ ҃ĐŋĐžĐŧŅĐŊŅƒŅ‚",
"private": "ДĐģŅ ĐŋОдĐŋĐ¸ŅŅ‡Đ¸ĐēОв - ŅŅ‚ĐžŅ‚ ĐŋĐžŅŅ‚ Đ˛Đ¸Đ´ŅŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐŋОдĐŋĐ¸ŅŅ‡Đ¸Đēи",
"public": "ĐŸŅƒĐąĐģĐ¸Ņ‡ĐŊŅ‹Đš - ŅŅ‚ĐžŅ‚ ĐŋĐžŅŅ‚ видĐĩĐŊ Đ˛ŅĐĩĐŧ",
"unlisted": "НĐĩĐŋŅƒĐąĐģĐ¸Ņ‡ĐŊŅ‹Đš - ŅŅ‚ĐžŅ‚ ĐŋĐžŅŅ‚ ĐŊĐĩ видĐĩĐŊ ĐŊа ĐŋŅƒĐąĐģĐ¸Ņ‡ĐŊҋ҅ ĐģĐĩĐŊŅ‚Đ°Ņ…"
}
},
"registration": {
"bio": "ОĐŋĐ¸ŅĐ°ĐŊиĐĩ",
"email": "Email",
"fullname": "ĐžŅ‚ĐžĐąŅ€Đ°ĐļаĐĩĐŧĐžĐĩ иĐŧŅ",
"password_confirm": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ ĐŋĐ°Ņ€ĐžĐģŅ",
"registration": "Đ ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ",
"token": "Код ĐŋŅ€Đ¸ĐŗĐģĐ°ŅˆĐĩĐŊĐ¸Ņ",
"validations": {
"username_required": "ĐŊĐĩ Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ ĐŋŅƒŅŅ‚Ņ‹Đŧ",
"fullname_required": "ĐŊĐĩ Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ ĐŋŅƒŅŅ‚Ņ‹Đŧ",
"email_required": "ĐŊĐĩ Đ´ĐžĐģĐļĐĩĐŊ ĐąŅ‹Ņ‚ŅŒ ĐŋŅƒŅŅ‚Ņ‹Đŧ",
"password_required": "ĐŊĐĩ Đ´ĐžĐģĐļĐĩĐŊ ĐąŅ‹Ņ‚ŅŒ ĐŋŅƒŅŅ‚Ņ‹Đŧ",
"password_confirmation_required": "ĐŊĐĩ Đ´ĐžĐģĐļĐŊĐž ĐąŅ‹Ņ‚ŅŒ ĐŋŅƒŅŅ‚Ņ‹Đŧ",
"password_confirmation_match": "Đ´ĐžĐģĐļĐŊĐž ŅĐžĐ˛ĐŋĐ°Đ´Đ°Ņ‚ŅŒ ҁ ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ"
}
},
"settings": {
"enter_current_password_to_confirm": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ŅĐ˛ĐžĐš Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đš ĐŋĐ°Ņ€ĐžĐģҌ",
"mfa": {
"otp": "OTP",
"setup_otp": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēа OTP",
"wait_pre_setup_otp": "ĐŋŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģҌĐŊĐ°Ņ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēа OTP",
"confirm_and_enable": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ и вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ OTP",
"title": "Đ”Đ˛ŅƒŅ…Ņ„Đ°ĐēŅ‚ĐžŅ€ĐŊĐ°Ņ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ",
"generate_new_recovery_codes": "ПоĐģŅƒŅ‡Đ¸Ņ‚ŅŒ ĐŊĐžĐ˛Ņ‹Đĩ ĐēĐžĐ´Ņ‹ Đ˛ĐžŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ",
"warning_of_generate_new_codes": "ĐŸĐžŅĐģĐĩ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐ¸Ņ ĐŊĐžĐ˛Ņ‹Ņ… ĐēОдОв Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ, ŅŅ‚Đ°Ņ€Ņ‹Đĩ йОĐģҌ҈Đĩ ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ Ņ€Đ°ĐąĐžŅ‚Đ°Ņ‚ŅŒ.",
"recovery_codes": "ĐšĐžĐ´Ņ‹ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ.",
"waiting_a_recovery_codes": "ПоĐģŅƒŅ‡ĐĩĐŊиĐĩ ĐēОдОв Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ ...",
"recovery_codes_warning": "ЗаĐŋĐ¸ŅˆĐ¸Ņ‚Đĩ ŅŅ‚Đ¸ ĐēĐžĐ´Ņ‹ и Đ´ĐĩŅ€ĐļĐ¸Ņ‚Đĩ в ĐąĐĩСОĐŋĐ°ŅĐŊĐžĐŧ ĐŧĐĩҁ҂Đĩ - иĐŊĐ°Ņ‡Đĩ Đ˛Ņ‹ Đ¸Ņ… йОĐģҌ҈Đĩ ĐŊĐĩ ŅƒĐ˛Đ¸Đ´Đ¸Ņ‚Đĩ. Đ•ŅĐģи Đ˛Ņ‹ ĐŋĐžŅ‚ĐĩŅ€ŅĐĩŅ‚Đĩ Đ´ĐžŅŅ‚ŅƒĐŋ Đē OTP ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸ŅŽ - ĐąĐĩС Ņ€ĐĩСĐĩŅ€Đ˛ĐŊҋ҅ ĐēОдОв Đ˛Ņ‹ йОĐģҌ҈Đĩ ĐŊĐĩ ҁĐŧĐžĐļĐĩŅ‚Đĩ СаĐģĐžĐŗĐ¸ĐŊĐ¸Ņ‚ŅŒŅŅ.",
"authentication_methods": "МĐĩŅ‚ĐžĐ´Ņ‹ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸",
"scan": {
"title": "ĐĄĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ",
"desc": "Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ Đ´ĐģŅ Đ´Đ˛ŅƒŅ…ŅŅ‚Đ°ĐŋĐŊОК Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸ Đ´ĐģŅ ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ ŅŅ‚ĐžĐŗĐž QR-ĐēОд иĐģи ввĐĩĐ´Đ¸Ņ‚Đĩ Ņ‚ĐĩĐēŅŅ‚ĐžĐ˛Ņ‹Đš ĐēĐģŅŽŅ‡:",
"secret_code": "КĐģŅŽŅ‡"
},
"verify": {
"desc": "Đ§Ņ‚ĐžĐąŅ‹ вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Đ´Đ˛ŅƒŅ…ŅŅ‚Đ°ĐŋĐŊŅƒŅŽ Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸, ввĐĩĐ´Đ¸Ņ‚Đĩ ĐēОд иС Đ˛Đ°ŅˆĐĩĐŗĐž ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ Đ´ĐģŅ Đ´Đ˛ŅƒŅ…ŅŅ‚Đ°ĐŋĐŊОК Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Đ¸:"
}
},
"attachmentRadius": "ĐŸŅ€Đ¸ĐēŅ€ĐĩĐŋĐģŅ‘ĐŊĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹",
"attachments": "ВĐģĐžĐļĐĩĐŊĐ¸Ņ",
"avatar": "ĐĐ˛Đ°Ņ‚Đ°Ņ€",
"avatarAltRadius": "ĐĐ˛Đ°Ņ‚Đ°Ņ€Ņ‹ в ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸ŅŅ…",
"avatarRadius": "ĐĐ˛Đ°Ņ‚Đ°Ņ€Ņ‹",
"background": "ФОĐŊ",
"bio": "ОĐŋĐ¸ŅĐ°ĐŊиĐĩ",
"btnRadius": "КĐŊĐžĐŋĐēи",
"bot": "Đ­Ņ‚Đž аĐēĐēĐ°ŅƒĐŊŅ‚ ĐąĐžŅ‚Đ°",
"cBlue": "ĐžŅ‚Đ˛ĐĩŅ‚Đ¸Ņ‚ŅŒ, Ņ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ",
"cGreen": "ĐŸĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚ŅŒ",
"cOrange": "ĐŅ€Đ°Đ˛Đ¸Ņ‚ŅŅ",
"cRed": "ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ",
"change_email": "ĐĄĐŧĐĩĐŊĐ¸Ņ‚ŅŒ email",
"change_email_error": "ĐŸŅ€ĐžĐ¸ĐˇĐžŅˆĐģа ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ ĐŋĐžĐŋҋ҂ĐēĐĩ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ email.",
"changed_email": "Email иСĐŧĐĩĐŊŅ‘ĐŊ ҃ҁĐŋĐĩ҈ĐŊĐž!",
"change_password": "ĐĄĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ",
"change_password_error": "ĐŸŅ€ĐžĐ¸ĐˇĐžŅˆĐģа ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ ĐŋĐžĐŋҋ҂ĐēĐĩ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ.",
"changed_password": "ĐŸĐ°Ņ€ĐžĐģҌ иСĐŧĐĩĐŊŅ‘ĐŊ ҃ҁĐŋĐĩ҈ĐŊĐž!",
"collapse_subject": "ĐĄĐ˛ĐžŅ€Đ°Ņ‡Đ¸Đ˛Đ°Ņ‚ŅŒ ĐŋĐžŅŅ‚Ņ‹ ҁ Ņ‚ĐĩĐŧОК",
"confirm_new_password": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ ĐŊĐžĐ˛ĐžĐŗĐž ĐŋĐ°Ņ€ĐžĐģŅ",
"current_avatar": "ĐĸĐĩĐēŅƒŅ‰Đ¸Đš Đ°Đ˛Đ°Ņ‚Đ°Ņ€",
"current_password": "ĐĸĐĩĐēŅƒŅ‰Đ¸Đš ĐŋĐ°Ņ€ĐžĐģҌ",
"current_profile_banner": "ĐĸĐĩĐēŅƒŅ‰Đ¸Đš йаĐŊĐŊĐĩŅ€ ĐŋŅ€ĐžŅ„Đ¸ĐģŅ",
"data_import_export_tab": "ИĐŧĐŋĐžŅ€Ņ‚ / Đ­ĐēҁĐŋĐžŅ€Ņ‚ даĐŊĐŊҋ҅",
"delete_account": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ аĐēĐēĐ°ŅƒĐŊŅ‚",
"delete_account_description": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ˛Đ°Ņˆ аĐēĐēĐ°ŅƒĐŊŅ‚ и Đ˛ŅĐĩ Đ˛Đ°ŅˆĐ¸ ŅĐžĐžĐąŅ‰ĐĩĐŊĐ¸Ņ.",
"delete_account_error": "ВозĐŊиĐēĐģа ĐžŅˆĐ¸ĐąĐēа в ĐŋŅ€ĐžŅ†ĐĩҁҁĐĩ ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ Đ˛Đ°ŅˆĐĩĐŗĐž аĐēĐēĐ°ŅƒĐŊŅ‚Đ°. Đ•ŅĐģи ŅŅ‚Đž ĐŋĐžĐ˛Ņ‚ĐžŅ€ŅĐĩŅ‚ŅŅ, ŅĐ˛ŅĐļĐ¸Ņ‚ĐĩҁҌ ҁ адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€ĐžĐŧ Đ˛Đ°ŅˆĐĩĐŗĐž ҁĐĩŅ€Đ˛ĐĩŅ€Đ°.",
"delete_account_instructions": "ВвĐĩĐ´Đ¸Ņ‚Đĩ Đ˛Đ°Ņˆ ĐŋĐ°Ņ€ĐžĐģҌ в ĐŋĐžĐģĐĩ ĐŊиĐļĐĩ Đ´ĐģŅ ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊĐ¸Ņ ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ.",
"export_theme": "ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ ĐĸĐĩĐŧ҃",
"filtering": "ФиĐģŅŒŅ‚Ņ€Đ°Ņ†Đ¸Ņ",
"filtering_explanation": "Đ’ŅĐĩ ŅŅ‚Đ°Ņ‚ŅƒŅŅ‹, ŅĐžĐ´ĐĩŅ€ĐļĐ°Ņ‰Đ¸Đĩ даĐŊĐŊŅ‹Đĩ ҁĐģОва, ĐąŅƒĐ´ŅƒŅ‚ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒŅŅ, ĐŋĐž ОдĐŊĐžĐŧ҃ в ŅŅ‚Ņ€ĐžĐēĐĩ",
"follow_export": "Đ­ĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Ņ‡Đ¸Ņ‚Đ°ĐĩĐŧҋ҅",
"follow_export_button": "Đ­ĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Ņ‡Đ¸Ņ‚Đ°ĐĩĐŧҋ҅ в Ņ„Đ°ĐšĐģ .csv",
"follow_export_processing": "ВĐĩĐ´Ņ‘Ņ‚ŅŅ ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēа, ҁĐēĐžŅ€Đž ваĐŧ ĐąŅƒĐ´ĐĩŅ‚ ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐž ĐˇĐ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ Ņ„Đ°ĐšĐģ",
"follow_import": "ИĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Ņ‡Đ¸Ņ‚Đ°ĐĩĐŧҋ҅",
"follow_import_error": "ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊии Ņ‡Đ¸Ņ‚Đ°ĐĩĐŧҋ҅",
"follows_imported": "ĐĄĐŋĐ¸ŅĐžĐē Ņ‡Đ¸Ņ‚Đ°ĐĩĐŧҋ҅ иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊ. ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēа СаКĐŧґ҂ ĐŊĐĩĐēĐžŅ‚ĐžŅ€ĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ..",
"foreground": "ПĐĩŅ€ĐĩĐ´ĐŊиК ĐŋĐģаĐŊ",
"general": "ĐžĐąŅ‰Đ¸Đĩ",
"hide_attachments_in_convo": "ĐŸŅ€ŅŅ‚Đ°Ņ‚ŅŒ вĐģĐžĐļĐĩĐŊĐ¸Ņ в Ņ€Đ°ĐˇĐŗĐžĐ˛ĐžŅ€Đ°Ņ…",
"hide_attachments_in_tl": "ĐŸŅ€ŅŅ‚Đ°Ņ‚ŅŒ вĐģĐžĐļĐĩĐŊĐ¸Ņ в ĐģĐĩĐŊŅ‚Đĩ",
"hide_isp": "ĐĄĐēŅ€Ņ‹Ņ‚ŅŒ ҁĐĩŅ€Đ˛ĐĩŅ€ĐŊŅƒŅŽ ĐŋаĐŊĐĩĐģҌ",
"import_followers_from_a_csv_file": "ИĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Ņ‡Đ¸Ņ‚Đ°ĐĩĐŧҋ҅ иС Ņ„Đ°ĐšĐģа .csv",
"import_theme": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ ĐĸĐĩĐŧ҃",
"inputRadius": "ПоĐģŅ ввОда",
"checkboxRadius": "ЧĐĩĐēйОĐēҁҋ",
"instance_default": "(ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ: {value})",
"instance_default_simple": "(ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ)",
"interface": "ИĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ",
"interfaceLanguage": "Đ¯ĐˇŅ‹Đē иĐŊŅ‚ĐĩҀ҄ĐĩĐšŅĐ°",
"limited_availability": "НĐĩ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐž в Đ˛Đ°ŅˆĐĩĐŧ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đĩ",
"links": "ĐĄŅŅ‹ĐģĐēи",
"lock_account_description": "АĐēĐēĐ°ŅƒĐŊŅ‚ Đ´ĐžŅŅ‚ŅƒĐŋĐĩĐŊ Ņ‚ĐžĐģҌĐēĐž ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´Ņ‘ĐŊĐŊŅ‹Đŧ ĐŋОдĐŋĐ¸ŅŅ‡Đ¸ĐēаĐŧ",
"loop_video": "Đ—Đ°Ņ†Đ¸ĐģĐ¸Đ˛Đ°Ņ‚ŅŒ видĐĩĐž",
"loop_video_silent_only": "Đ—Đ°Ņ†Đ¸ĐēĐģĐ¸Đ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ĐąĐĩĐˇĐˇĐ˛ŅƒŅ‡ĐŊŅ‹Đĩ видĐĩĐž (Ņ‚.Đĩ. \"ĐŗĐ¸Ņ„Đēи\" ҁ Mastodon)",
"name": "ИĐŧŅ",
"name_bio": "ИĐŧŅ и ĐžĐŋĐ¸ŅĐ°ĐŊиĐĩ",
"new_email": "ĐĐžĐ˛Ņ‹Đš email",
"new_password": "ĐĐžĐ˛Ņ‹Đš ĐŋĐ°Ņ€ĐžĐģҌ",
"fun": "ĐŸĐžŅ‚Đĩ҈ĐŊĐžĐĩ",
"greentext": "МĐĩĐŧĐŊŅ‹Đĩ ҁ҂ҀĐĩĐģĐžŅ‡Đēи",
"notification_visibility": "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ",
"notification_visibility_follows": "ПодĐŋĐ¸ŅĐēи",
"notification_visibility_likes": "ЛайĐēи",
"notification_visibility_mentions": "ĐŖĐŋĐžĐŧиĐŊаĐŊĐ¸Ņ",
"notification_visibility_repeats": "ĐŸĐžĐ˛Ņ‚ĐžŅ€Ņ‹",
"no_rich_text_description": "ĐŖĐąŅ€Đ°Ņ‚ŅŒ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ иС Đ˛ŅĐĩŅ… ĐŋĐžŅŅ‚ĐžĐ˛",
"hide_follows_description": "НĐĩ ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ ĐēĐžĐŗĐž Ņ Ņ‡Đ¸Ņ‚Đ°ŅŽ",
"hide_followers_description": "НĐĩ ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ ĐēŅ‚Đž Ņ‡Đ¸Ņ‚Đ°ĐĩŅ‚ ĐŧĐĩĐŊŅ",
"hide_follows_count_description": "НĐĩ ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ Ņ‡Đ¸ŅĐģĐž Ņ‡Đ¸Ņ‚Đ°ĐĩĐŧҋ҅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš",
"hide_followers_count_description": "НĐĩ ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ Ņ‡Đ¸ŅĐģĐž ĐŧĐžĐ¸Ņ… ĐŋОдĐŋĐ¸ŅŅ‡Đ¸ĐēОв",
"show_admin_badge": "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ СĐŊĐ°Ņ‡ĐžĐē адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Đ° в ĐŧĐžĐĩĐŧ ĐŋŅ€ĐžŅ„Đ¸ĐģĐĩ",
"show_moderator_badge": "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ СĐŊĐ°Ņ‡ĐžĐē ĐŧОдĐĩŅ€Đ°Ņ‚ĐžŅ€Đ° в ĐŧĐžĐĩĐŧ ĐŋŅ€ĐžŅ„Đ¸ĐģĐĩ",
"nsfw_clickthrough": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ҁĐēŅ€Ņ‹Ņ‚Đ¸Đĩ NSFW вĐģĐžĐļĐĩĐŊиК",
"oauth_tokens": "OAuth Ņ‚ĐžĐēĐĩĐŊŅ‹",
"token": "ĐĸĐžĐēĐĩĐŊ",
"refresh_token": "Đ Đĩ҄ҀĐĩ҈ Ņ‚ĐžĐēĐĩĐŊ",
"valid_until": "ГодĐĩĐŊ Đ´Đž",
"revoke_token": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ",
"panelRadius": "ПаĐŊĐĩĐģи",
"pause_on_unfocused": "ĐŸŅ€Đ¸ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐē҃ ĐēĐžĐŗĐ´Đ° вĐēĐģадĐēа ĐŊĐĩ в Ņ„ĐžĐē҃ҁĐĩ",
"presets": "ĐŸŅ€ĐĩҁĐĩ҂ҋ",
"profile_background": "ФОĐŊ ĐŋŅ€ĐžŅ„Đ¸ĐģŅ",
"profile_banner": "БаĐŊĐŊĐĩŅ€ ĐŋŅ€ĐžŅ„Đ¸ĐģŅ",
"profile_tab": "ĐŸŅ€ĐžŅ„Đ¸ĐģҌ",
"radii_help": "ĐĄĐēŅ€ŅƒĐŗĐģĐĩĐŊиĐĩ ŅƒĐŗĐģОв ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛ иĐŊŅ‚ĐĩҀ҄ĐĩĐšŅĐ° (в ĐŋиĐēҁĐĩĐģŅŅ…)",
"replies_in_timeline": "ĐžŅ‚Đ˛Đĩ҂ҋ в ĐģĐĩĐŊŅ‚Đĩ",
"reply_visibility_all": "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ Đ˛ŅĐĩ ĐžŅ‚Đ˛Đĩ҂ҋ",
"reply_visibility_following": "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ĐžŅ‚Đ˛Đĩ҂ҋ ĐŧĐŊĐĩ иĐģи Ņ‚ĐĩŅ… ĐŊа ĐēĐžĐŗĐž Ņ ĐŋОдĐŋĐ¸ŅĐ°ĐŊ",
"reply_visibility_self": "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ĐžŅ‚Đ˛Đĩ҂ҋ ĐŧĐŊĐĩ",
"autohide_floating_post_button": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ҁĐēŅ€Ņ‹Đ˛Đ°Ņ‚ŅŒ ĐēĐŊĐžĐŋĐē҃ ĐŋĐžŅŅ‚Đ¸ĐŊĐŗĐ° (в ĐŧОйиĐģҌĐŊОК вĐĩŅ€ŅĐ¸Đ¸)",
"saving_err": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ŅĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи",
"saving_ok": "ĐĄĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐž",
"security_tab": "БĐĩСОĐŋĐ°ŅĐŊĐžŅŅ‚ŅŒ",
"scope_copy": "КоĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ видиĐŧĐžŅŅ‚ŅŒ ĐŋĐžŅŅ‚Đ° ĐŋŅ€Đ¸ ĐžŅ‚Đ˛ĐĩŅ‚Đĩ (Đ˛ŅĐĩĐŗĐ´Đ° вĐēĐģŅŽŅ‡ĐĩĐŊĐž Đ´ĐģŅ Đ›Đ¸Ņ‡ĐŊҋ҅ ĐĄĐžĐžĐąŅ‰ĐĩĐŊиК)",
"minimal_scopes_mode": "МиĐŊиĐŧĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŊĐ°ĐąĐžŅ€ ĐžĐŋŅ†Đ¸Đš видиĐŧĐžŅŅ‚Đ¸ ĐŋĐžŅŅ‚Đ°",
"set_new_avatar": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ ĐŊĐžĐ˛Ņ‹Đš Đ°Đ˛Đ°Ņ‚Đ°Ņ€",
"set_new_profile_background": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ ĐŊĐžĐ˛Ņ‹Đš Ņ„ĐžĐŊ ĐŋŅ€ĐžŅ„Đ¸ĐģŅ",
"set_new_profile_banner": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ ĐŊĐžĐ˛Ņ‹Đš йаĐŊĐŊĐĩŅ€ ĐŋŅ€ĐžŅ„Đ¸ĐģŅ",
"settings": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи",
"subject_input_always_show": "Đ’ŅĐĩĐŗĐ´Đ° ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ ĐŋĐžĐģĐĩ ввОда Ņ‚ĐĩĐŧŅ‹",
"stop_gifs": "ĐŸŅ€ĐžĐ¸ĐŗŅ€Ņ‹Đ˛Đ°Ņ‚ŅŒ GIF аĐŊиĐŧĐ°Ņ†Đ¸Đ¸ Ņ‚ĐžĐģҌĐēĐž ĐŋŅ€Đ¸ ĐŊавĐĩĐ´ĐĩĐŊии",
"streaming": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēŅƒŅŽ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐē҃ ĐŊĐžĐ˛Ņ‹Ņ… ŅĐžĐžĐąŅ‰ĐĩĐŊиК ĐŋŅ€Đ¸ ĐŋŅ€ĐžĐēŅ€ŅƒŅ‚ĐēĐĩ ввĐĩҀ҅",
"useStreamingApi": "ПоĐģŅƒŅ‡Đ°Ņ‚ŅŒ ŅĐžĐžĐąŅ‰ĐĩĐŊĐ¸Ņ и ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ в Ņ€ĐĩаĐģҌĐŊĐžĐŧ Đ˛Ņ€ĐĩĐŧĐĩĐŊи",
"useStreamingApiWarning": "(НĐĩ Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩŅ‚ŅŅ, ŅĐēҁĐŋĐĩŅ€Đ¸ĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊĐž, ŅĐžĐžĐąŅ‰ĐĩĐŊĐ¸Ņ ĐŧĐžĐŗŅƒŅ‚ ĐŋŅ€ĐžĐŋĐ°Đ´Đ°Ņ‚ŅŒ)",
"text": "ĐĸĐĩĐēҁ҂",
"theme": "ĐĸĐĩĐŧа",
"theme_help": "Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ҈Đĩҁ҂ĐŊĐ°Đ´Ņ†Đ°Ņ‚ĐĩŅ€Đ¸Ņ‡ĐŊŅ‹Đĩ ĐēĐžĐ´Ņ‹ Ņ†Đ˛ĐĩŅ‚ĐžĐ˛ (#rrggbb) Đ´ĐģŅ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи Ņ‚ĐĩĐŧŅ‹.",
"theme_help_v2_1": "Đ’Ņ‹ Ņ‚Đ°Đē ĐļĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩĐŋĐžŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ Ņ†Đ˛ĐĩŅ‚Đ° ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊҋ҅ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ‚ĐžĐ˛ ĐŊаĐļав ŅĐžĐžŅ‚Đ˛. ĐŗĐ°ĐģĐžŅ‡Đē҃. Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ĐēĐŊĐžĐŋĐē҃ \"ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ŅŒ Đ˛ŅŅ‘\" Ņ‡Ņ‚ĐžĐąŅ‹ ҁĐŊŅŅ‚ŅŒ Đ˛ŅĐĩ ĐŋĐĩŅ€ĐĩĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐ¸Ņ.",
"theme_help_v2_2": "Под ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đŧи ĐŋĐžĐģŅĐŧи ввОда ŅŅ‚Đž идиĐēĐ°Ņ‚ĐžŅ€Ņ‹ ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚ĐŊĐžŅŅ‚Đ¸, ĐŊавĐĩĐ´Đ¸Ņ‚Đĩ ĐŊа ĐŊĐ¸Ņ… ĐŧŅ‹ŅˆŅŒŅŽ Ņ‡Ņ‚ĐžĐąŅ‹ ŅƒĐˇĐŊĐ°Ņ‚ŅŒ йОĐģҌ҈Đĩ. ĐŸŅ€Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊии ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐžŅŅ‚Đ¸ ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚ Ņ€Đ°ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ Đ´ĐģŅ ĐŊĐ°Đ¸Ņ…ŅƒĐ´ŅˆĐĩĐŗĐž Đ˛Đ°Ņ€Đ¸Đ°ĐŊŅ‚Đ°.",
"tooltipRadius": "Đ’ŅĐŋĐģŅ‹Đ˛Đ°ŅŽŅ‰Đ¸Đĩ ĐŋĐžĐ´ŅĐēаСĐēи/ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ",
"user_settings": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ",
"values": {
"false": "ĐŊĐĩŅ‚",
"true": "да"
},
"style": {
"switcher": {
"keep_color": "ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ Ņ†Đ˛ĐĩŅ‚Đ°",
"keep_shadows": "ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ Ņ‚ĐĩĐŊи",
"keep_opacity": "ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐžŅŅ‚ŅŒ",
"keep_roundness": "ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ ҁĐēŅ€ŅƒĐŗĐģĐĩĐŊиĐĩ",
"keep_fonts": "ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ ŅˆŅ€Đ¸Ņ„Ņ‚Ņ‹",
"save_load_hint": "ОĐŋŅ†Đ¸Đ¸ \"ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ...\" ĐŋОСвОĐģŅŅŽŅ‚ ŅĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи ĐŋŅ€Đ¸ Đ˛Ņ‹ĐąĐžŅ€Đĩ Đ´Ņ€ŅƒĐŗĐžĐš Ņ‚ĐĩĐŧŅ‹ иĐģи иĐŧĐŋĐžŅ€Ņ‚Đ° ĐĩŅ‘ иС Ņ„Đ°ĐšĐģа. ĐĸаĐē ĐļĐĩ ĐžĐŊи вĐģĐ¸ŅŅŽŅ‚ ĐŊа Ņ‚Đž ĐēаĐēиĐĩ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊ҂ҋ ĐąŅƒĐ´ŅƒŅ‚ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊŅ‹ ĐŋŅ€Đ¸ ŅĐēҁĐŋĐžŅ€Ņ‚Đĩ Ņ‚ĐĩĐŧŅ‹. ĐšĐžĐŗĐ´Đ° Đ˛ŅĐĩ ĐŗĐ°ĐģĐžŅ‡Đēи ҁĐŊŅŅ‚Ņ‹ Đ˛ŅĐĩ ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊ҂ҋ ĐąŅƒĐ´ŅƒŅ‚ ŅĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊŅ‹.",
"reset": "ĐĄĐąŅ€ĐžŅĐ¸Ņ‚ŅŒ",
"clear_all": "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ŅŒ Đ˛ŅŅ‘",
"clear_opacity": "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ŅŒ ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐžŅŅ‚ŅŒ"
},
"common": {
"color": "ĐĻвĐĩŅ‚",
"opacity": "ĐŸŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐžŅŅ‚ŅŒ",
"contrast": {
"hint": "ĐŖŅ€ĐžĐ˛ĐĩĐŊҌ ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚Đ°: {ratio}, Ņ‡Ņ‚Đž {level} {context}",
"level": {
"aa": "ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐŗĐ°ĐšĐ´ĐģаКĐŊ҃ Level AA (ĐŧиĐŊиĐŧаĐģҌĐŊŅ‹Đš)",
"aaa": "ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐŗĐ°ĐšĐ´ĐģаКĐŊ҃ Level AAA (Ņ€ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒĐĩĐŧŅ‹Đš)",
"bad": "ĐŊĐĩ ŅĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ ĐēаĐēиĐŧ ĐģийО ĐŗĐ°ĐšĐ´ĐģаКĐŊаĐŧ"
},
"context": {
"18pt": "Đ´ĐģŅ ĐēŅ€ŅƒĐŋĐŊĐžĐŗĐž (18pt+) Ņ‚ĐĩĐēŅŅ‚Đ°",
"text": "Đ´ĐģŅ Ņ‚ĐĩĐēŅŅ‚Đ°"
}
}
},
"common_colors": {
"_tab_label": "ĐžĐąŅ‰Đ¸Đĩ",
"main": "ĐžĐąŅ‰Đ¸Đĩ Ņ†Đ˛ĐĩŅ‚Đ°",
"foreground_hint": "ĐĄĐŧ. вĐēĐģадĐē҃ \"ДоĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊĐž\" Đ´ĐģŅ йОĐģĐĩĐĩ Đ´ĐĩŅ‚Đ°ĐģҌĐŊĐžĐŗĐž ĐēĐžĐŊŅ‚Ņ€ĐžĐģŅ",
"rgbo": "ИĐēĐžĐŊĐēи, аĐē҆ĐĩĐŊ҂ҋ, ŅŅ€Ņ‹ĐģĐēи"
},
"advanced_colors": {
"_tab_label": "ДоĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊĐž",
"alert": "ФОĐŊ ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊиК",
"alert_error": "ĐžŅˆĐ¸ĐąĐēи",
"badge": "ФОĐŊ СĐŊĐ°Ņ‡ĐēОв",
"badge_notification": "ĐŖĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ",
"panel_header": "Đ—Đ°ĐŗĐžĐģОвОĐē ĐŋаĐŊĐĩĐģи",
"top_bar": "ВĐĩŅ€ĐŊŅŅ ĐŋĐžĐģĐžŅĐēа",
"borders": "Đ“Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹",
"buttons": "КĐŊĐžĐŋĐēи",
"inputs": "ПоĐģŅ ввОда",
"faint_text": "МаĐģОваĐļĐŊŅ‹Đš Ņ‚ĐĩĐēҁ҂"
},
"radii": {
"_tab_label": "ĐĄĐēŅ€ŅƒĐŗĐģĐĩĐŊиĐĩ"
},
"shadows": {
"_tab_label": "ХвĐĩŅ‚ĐžŅ‚ĐĩĐŊҌ",
"component": "КоĐŧĐŋĐžĐŊĐĩĐŊŅ‚",
"override": "ПĐĩŅ€ĐĩĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ",
"shadow_id": "ĐĸĐĩĐŊҌ №{value}",
"blur": "РаСĐŧŅ‹Ņ‚Đ¸Đĩ",
"spread": "Đ Đ°ĐˇĐąŅ€ĐžŅ",
"inset": "ВĐŊŅƒŅ‚Ņ€ĐĩĐŊĐŊŅŅ",
"hint": "ДĐģŅ Ņ‚ĐĩĐŊĐĩĐš Đ˛Ņ‹ Ņ‚Đ°Đē ĐļĐĩ ĐŧĐžĐļĐĩŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ --variable в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ Ņ†Đ˛ĐĩŅ‚Đ° Ņ‡Ņ‚ĐžĐąŅ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ CSS3-ĐŋĐĩŅ€ĐĩĐŧĐĩĐŊĐŊŅ‹Đĩ. В Ņ‚Đ°ĐēĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐžŅŅ‚ŅŒ Ņ€Đ°ĐąĐžŅ‚Đ°Ņ‚ŅŒ ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚.",
"filter_hint": {
"always_drop_shadow": "ВĐŊиĐŧаĐŊиĐĩ, ŅŅ‚Đ° Ņ‚ĐĩĐŊҌ Đ˛ŅĐĩĐŗĐ´Đ° Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ {0} ĐēĐžĐŗĐ´Đ° ĐąŅ€Đ°ŅƒĐˇĐĩŅ€ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ ŅŅ‚Đž.",
"drop_shadow_syntax": "{0} ĐŊĐĩ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ {1} и ĐēĐģŅŽŅ‡ĐĩвОĐĩ ҁĐģОвО {2}.",
"avatar_inset": "ОдĐŊĐžĐ˛Ņ€ĐĩĐŧĐĩĐŊĐŊĐžĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ вĐŊŅƒŅ‚Ņ€ĐĩĐŊĐŊĐ¸Ņ… и вĐŊĐĩ҈ĐŊĐ¸Ņ… Ņ‚ĐĩĐŊĐĩĐš ĐŊа (ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊҋ҅) Đ°Đ˛Đ°Ņ‚Đ°Ņ€ĐēĐ°Ņ… ĐŧĐžĐļĐĩŅ‚ Đ´Đ°Ņ‚ŅŒ ĐŊĐĩ Ņ‚Đĩ Ņ€ĐĩĐˇŅƒĐģŅŒŅ‚Đ°Ņ‚Ņ‹ Ņ‡Ņ‚Đž Đ˛Ņ‹ ĐžĐļидаĐĩŅ‚Đĩ.",
"spread_zero": "ĐĸĐĩĐŊи ҁ Ņ€Đ°ĐˇĐąŅ€ĐžŅĐžĐŧ > 0 ĐąŅƒĐ´ŅƒŅ‚ Đ˛Ņ‹ĐŗĐģŅĐ´ĐĩŅ‚ŅŒ ĐēаĐē ĐĩҁĐģи ĐąŅ‹ Ņ€Đ°ĐˇĐąŅ€ĐžŅ ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊ в 0",
"inset_classic": "ВĐŊŅƒŅ‚Ņ€ĐĩĐŊĐŊиĐĩ Ņ‚ĐĩĐŊи ĐąŅƒĐ´ŅƒŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ {0}"
},
"components": {
"panel": "ПаĐŊĐĩĐģҌ",
"panelHeader": "Đ—Đ°ĐŗĐžĐģОвОĐē ĐŋаĐŊĐĩĐģи",
"topBar": "ВĐĩҀ҅ĐŊŅŅ ĐŋĐžĐģĐžŅĐēа",
"avatar": "ĐĐ˛Đ°Ņ‚Đ°Ņ€Đēа (ĐŋŅ€ĐžŅ„Đ¸ĐģҌ)",
"avatarStatus": "ĐĐ˛Đ°Ņ‚Đ°Ņ€Đēа (в ĐģĐĩĐŊŅ‚Đĩ)",
"popup": "Đ’ŅĐŋĐģŅ‹Đ˛Đ°ŅŽŅ‰Đ¸Đĩ ĐŋĐžĐ´ŅĐēаСĐēи",
"button": "КĐŊĐžĐŋĐēи",
"buttonHover": "КĐŊĐžĐŋĐēи (ĐŊавĐĩĐ´ĐĩĐŊ ĐēŅƒŅ€ŅĐžŅ€)",
"buttonPressed": "КĐŊĐžĐŋĐēи (ĐŊаĐļĐ°Ņ‚Đ°)",
"buttonPressedHover": "КĐŊĐžĐŋĐēи (ĐŊаĐļĐ°Ņ‚Đ°+ĐŊавĐĩĐ´ĐĩĐŊ ĐēŅƒŅ€ŅĐžŅ€)",
"input": "ПоĐģŅ ввОда"
}
},
"fonts": {
"_tab_label": "Đ¨Ņ€Đ¸Ņ„Ņ‚Ņ‹",
"help": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ Ņ‚Đ¸Đŋ ŅˆŅ€Đ¸Ņ„Ņ‚Đ° Đ´ĐģŅ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ в иĐŊŅ‚ĐĩҀ҄ĐĩĐšŅĐĩ. ĐŸŅ€Đ¸ Đ˛Ņ‹ĐąĐžŅ€Đĩ Đ˛Đ°Ņ€Đ¸Đ°ĐŊŅ‚Đ° \"Đ´Ņ€ŅƒĐŗĐžĐš\" ĐŊадО ввĐĩŅŅ‚Đ¸ ĐŊаСваĐŊиĐĩ ŅˆŅ€Đ¸Ņ„Ņ‚Đ° в Ņ‚ĐžŅ‡ĐŊĐžŅŅ‚Đ¸ ĐēаĐē ĐžĐŊ ĐŊĐ°ĐˇŅ‹Đ˛Đ°ĐĩŅ‚ŅŅ в ŅĐ¸ŅŅ‚ĐĩĐŧĐĩ.",
"components": {
"interface": "ИĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ",
"input": "ПоĐģŅ ввОда",
"post": "ĐĸĐĩĐēҁ҂ ĐŋĐžŅŅ‚ĐžĐ˛",
"postCode": "МоĐŊĐžŅˆĐ¸Ņ€Đ¸ĐŊĐŊŅ‹Đš Ņ‚ĐĩĐēҁ҂ в ĐŋĐžŅŅ‚Đĩ (Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ)"
},
"family": "Đ¨Ņ€Đ¸Ņ„Ņ‚",
"size": "РаСĐŧĐĩŅ€ (в ĐŋиĐēҁĐĩĐģŅŅ…)",
"weight": "Đ¨Đ¸Ņ€Đ¸ĐŊа",
"custom": "Đ”Ņ€ŅƒĐŗĐžĐš"
},
"preview": {
"header": "ĐŸŅ€Đ¸ĐŧĐĩŅ€",
"content": "КоĐŊŅ‚ĐĩĐŊŅ‚",
"error": "ĐžŅˆĐ¸ĐąĐēа ŅŅ‚ĐžĐŋ 000",
"button": "КĐŊĐžĐŋĐēа",
"text": "Đ•Ņ‰Đĩ ĐŊĐĩĐŧĐŊĐžĐŗĐž {0} и ĐŧĐ°ŅĐĩĐŊҌĐēĐ°Ņ {1}",
"mono": "ĐēĐžĐŊŅ‚ĐĩĐŊŅ‚Đ°",
"input": "Đ§Ņ‚Đž ĐŊĐžĐ˛ĐžĐŗĐž?",
"faint_link": "Đ•ĐŗĐž ĐŋŅ€Đ¸Đ´ĐĩŅ‚ŅŅ ŅƒĐąŅ€Đ°Ņ‚ŅŒ",
"fine_print": "Đ•ŅĐģи ĐŋŅ€ĐžĐąĐģĐĩĐŧŅ‹ ĐžŅŅ‚Đ°ĐģĐ¸ŅŅŒ — Đ˛Đ°Ņˆ ĐŗŅƒŅ€Ņ‚ĐžĐ˛Ņ‰Đ¸Đē ĐŧŅ‹ŅˆĐ¸ ĐŋĐģĐžŅ…Đž ŅŅ‚ĐžĐ¸Ņ‚. {0}.",
"header_faint": "Đ’ŅĐĩ идĐĩŅ‚ ĐŋĐž ĐŋĐģаĐŊ҃",
"checkbox": "Đ¯ ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€ĐļĐ´Đ°ŅŽ Ņ‡Ņ‚Đž ĐŊĐĩ ĐąŅ‹ĐģĐž ĐŊи ĐĩдиĐŊĐžĐŗĐž Ņ€Đ°ĐˇŅ€Ņ‹Đ˛Đ°",
"link": "ҁҁҋĐģĐēа"
}
},
"allow_following_move": "Đ Đ°ĐˇŅ€ĐĩŅˆĐ¸Ņ‚ŅŒ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи Ņ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ ĐŊĐžĐ˛Ņ‹Đš аĐēĐēĐ°ŅƒĐŊŅ‚ ĐŋŅ€Đ¸ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊии ĐŊа Đ´Ņ€ŅƒĐŗĐžĐš ҁĐĩŅ€Đ˛ĐĩŅ€",
"hide_user_stats": "НĐĩ ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Đē҃ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš (ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž Ņ‡Đ¸Ņ‚Đ°Ņ‚ĐĩĐģĐĩĐš)"
},
"timeline": {
"collapse": "ХвĐĩŅ€ĐŊŅƒŅ‚ŅŒ",
"conversation": "Đ Đ°ĐˇĐŗĐžĐ˛ĐžŅ€",
"error_fetching": "ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ ОйĐŊОвĐģĐĩĐŊии",
"load_older": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ ŅŅ‚Đ°Ņ€Ņ‹Đĩ ŅŅ‚Đ°Ņ‚ŅƒŅŅ‹",
"no_retweet_hint": "ĐŸĐžŅŅ‚ ĐŋĐžĐŧĐĩ҇ĐĩĐŊ ĐēаĐē \"Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ĐŋОдĐŋĐ¸ŅŅ‡Đ¸ĐēОв\" иĐģи \"ĐģĐ¸Ņ‡ĐŊĐžĐĩ\" и ĐŋĐžŅŅ‚ĐžĐŧ҃ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ ĐŋĐžĐ˛Ņ‚ĐžŅ€Ņ‘ĐŊ",
"repeated": "ĐŋĐžĐ˛Ņ‚ĐžŅ€Đ¸Đģ(а)",
"show_new": "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŊĐžĐ˛Ņ‹Đĩ",
"up_to_date": "ОбĐŊОвĐģĐĩĐŊĐž"
},
"status": {
"bookmark": "В СаĐēĐģадĐēи",
"unbookmark": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ иС СаĐēĐģадОĐē"
},
"user_card": {
"block": "ЗабĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ",
"blocked": "ЗабĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°ĐŊ",
"favorites": "ПоĐŊŅ€Đ°Đ˛Đ¸Đ˛ŅˆĐ¸ĐĩŅŅ",
"follow": "Đ§Đ¸Ņ‚Đ°Ņ‚ŅŒ",
"follow_sent": "ЗаĐŋŅ€ĐžŅ ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊ!",
"follow_progress": "ЗаĐŋŅ€Đ°ŅˆĐ¸Đ˛Đ°ĐĩĐŧâ€Ļ",
"follow_again": "ЗаĐŋŅ€ĐžŅĐ¸Ņ‚ŅŒ Đĩ҉Đĩ Ņ€Đ°Đˇ?",
"follow_unfollow": "ПĐĩŅ€ĐĩŅŅ‚Đ°Ņ‚ŅŒ Ņ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ",
"followees": "Đ§Đ¸Ņ‚Đ°ĐĩĐŧŅ‹Đĩ",
"followers": "Đ§Đ¸Ņ‚Đ°Ņ‚ĐĩĐģи",
"following": "Đ§Đ¸Ņ‚Đ°ŅŽ!",
"follows_you": "Đ§Đ¸Ņ‚Đ°ĐĩŅ‚ Đ˛Đ°Ņ!",
"mute": "Đ˜ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ",
"muted": "Đ˜ĐŗĐŊĐžŅ€Đ¸Ņ€ŅƒŅŽ",
"per_day": "в Đ´ĐĩĐŊҌ",
"remote_follow": "Đ§Đ¸Ņ‚Đ°Ņ‚ŅŒ ŅƒĐ´Đ°ĐģŅ‘ĐŊĐŊĐž",
"statuses": "ĐĄŅ‚Đ°Ņ‚ŅƒŅŅ‹",
"admin_menu": {
"moderation": "ОĐŋŅ†Đ¸Đ¸ ĐŧОдĐĩŅ€Đ°Ņ‚ĐžŅ€Đ°",
"grant_admin": "ĐĄĐ´ĐĩĐģĐ°Ņ‚ŅŒ адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€ĐžĐŧ",
"revoke_admin": "Đ—Đ°ĐąŅ€Đ°Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ° адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Đ°",
"grant_moderator": "ĐĄĐ´ĐĩĐģĐ°Ņ‚ŅŒ ĐŧОдĐĩŅ€Đ°Ņ‚ĐžŅ€ĐžĐŧ",
"revoke_moderator": "Đ—Đ°ĐąŅ€Đ°Ņ‚ŅŒ ĐŋŅ€Đ°Đ˛Đ° ĐŧОдĐĩŅ€Đ°Ņ‚ĐžŅ€Đ°",
"activate_account": "АĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ аĐēĐēĐ°ŅƒĐŊŅ‚",
"deactivate_account": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ аĐēĐēĐ°ŅƒĐŊŅ‚",
"delete_account": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ аĐēĐēĐ°ŅƒĐŊŅ‚",
"force_nsfw": "ĐžŅ‚ĐŧĐĩŅ‡Đ°Ņ‚ŅŒ ĐŋĐžŅŅ‚Ņ‹ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ ĐēаĐē NSFW",
"strip_media": "ĐŖĐąĐ¸Ņ€Đ°Ņ‚ŅŒ вĐģĐžĐļĐĩĐŊĐ¸Ņ иС ĐŋĐžŅŅ‚ĐžĐ˛ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ",
"force_unlisted": "НĐĩ дОйавĐģŅŅ‚ŅŒ ĐŋĐžŅŅ‚Ņ‹ в ĐŋŅƒĐąĐģĐ¸Ņ‡ĐŊŅ‹Đĩ ĐģĐĩĐŊ҂ҋ",
"sandbox": "ĐŸŅ€Đ¸ĐŊŅƒĐ´Đ¸Ņ‚ŅŒ видиĐŧĐžŅŅ‚ŅŒ ĐŋĐžŅŅ‚ĐžĐ˛ Ņ‚ĐžĐģҌĐēĐž Ņ‡Đ¸Ņ‚Đ°Ņ‚ĐĩĐģŅĐŧ",
"disable_remote_subscription": "ЗаĐŋŅ€ĐĩŅ‚Đ¸Ņ‚ŅŒ Ņ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ ҁ ŅƒĐ´Đ°ĐģĐĩĐŊĐŊҋ҅ ҁĐĩŅ€Đ˛ĐĩŅ€ĐžĐ˛",
"disable_any_subscription": "ЗаĐŋŅ€ĐĩŅ‚Đ¸Ņ‚ŅŒ Ņ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ",
"quarantine": "НĐĩ Ņ„ĐĩĐ´ĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐžŅŅ‚Ņ‹ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ",
"delete_user": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ",
"delete_user_confirmation": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹? Đ­Ņ‚Đž Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ ĐŊĐĩĐģŅŒĐˇŅ ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ."
}
},
"user_profile": {
"timeline_title": "ЛĐĩĐŊŅ‚Đ° ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ"
},
"search": {
"people": "Đ›ŅŽĐ´Đ¸",
"hashtags": "ĐĨŅŅˆŅ‚ŅĐŗĐ¸",
"person_talking": "ПоĐŋ҃ĐģŅŅ€ĐŊĐž ҃ {count} ҇ĐĩĐģОвĐĩĐēа",
"people_talking": "ПоĐŋ҃ĐģŅŅ€ĐŊĐž ҃ {count} ҇ĐĩĐģОвĐĩĐē",
"no_results": "ĐĐ¸Ņ‡ĐĩĐŗĐž ĐŊĐĩ ĐŊаКдĐĩĐŊĐž"
},
"password_reset": {
"forgot_password": "Đ—Đ°ĐąŅ‹Đģи ĐŋĐ°Ņ€ĐžĐģҌ?",
"password_reset": "ĐĄĐąŅ€ĐžŅ ĐŋĐ°Ņ€ĐžĐģŅ",
"instruction": "ВвĐĩĐ´Đ¸Ņ‚Đĩ Đ˛Đ°Ņˆ email иĐģи иĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ, и ĐŧŅ‹ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Đŧ ваĐŧ ҁҁҋĐģĐē҃ Đ´ĐģŅ ŅĐąŅ€ĐžŅĐ° ĐŋĐ°Ņ€ĐžĐģŅ.",
"placeholder": "Đ’Đ°Ņˆ email иĐģи иĐŧŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ",
"check_email": "ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅŒŅ‚Đĩ Đ˛Đ°Ņˆ email и ĐŋĐĩŅ€ĐĩĐšĐ´Đ¸Ņ‚Đĩ ĐŋĐž ҁҁҋĐģĐēĐĩ Đ´ĐģŅ ŅĐąŅ€ĐžŅĐ° ĐŋĐ°Ņ€ĐžĐģŅ.",
"return_home": "ВĐĩŅ€ĐŊŅƒŅ‚ŅŒŅŅ ĐŊа ĐŗĐģавĐŊŅƒŅŽ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ",
"too_many_requests": "Đ’Ņ‹ Đ¸ŅŅ‡ĐĩŅ€ĐŋаĐģи Đ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧĐžĐĩ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐŋĐžĐŋŅ‹Ņ‚ĐžĐē, ĐŋĐžĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ ĐŋОСĐļĐĩ.",
"password_reset_disabled": "ĐĄĐąŅ€ĐžŅ ĐŋĐ°Ņ€ĐžĐģŅ ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊ. CĐ˛ŅĐļĐ¸Ņ‚ĐĩҁҌ ҁ адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€ĐžĐŧ Đ˛Đ°ŅˆĐĩĐŗĐž ҁĐĩŅ€Đ˛ĐĩŅ€Đ°."
},
"about": {
"mrf": {
"federation": "ФĐĩĐ´ĐĩŅ€Đ°Ņ†Đ¸Ņ",
"simple": {
"accept_desc": "ДаĐŊĐŊŅ‹Đš ҁĐĩŅ€Đ˛ĐĩŅ€ ĐŋŅ€Đ¸ĐŊиĐŧаĐĩŅ‚ ŅĐžĐžĐąŅ‰ĐĩĐŊĐ¸Ņ Ņ‚ĐžĐģҌĐēĐž ŅĐž ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Ņ… ҁĐĩŅ€Đ˛ĐĩŅ€ĐžĐ˛:",
"ftl_removal_desc": "ДаĐŊĐŊŅ‹Đš ҁĐĩŅ€Đ˛ĐĩŅ€ ҁĐēŅ€Ņ‹Đ˛Đ°ĐĩŅ‚ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ ҁĐĩŅ€Đ˛ĐĩŅ€Đ° ҁ Ņ„ĐĩĐ´ĐĩŅ€Đ°Ņ‚Đ¸Đ˛ĐŊОК ĐģĐĩĐŊ҂ҋ:",
"media_nsfw_desc": "ДаĐŊĐŊŅ‹Đš ҁĐĩŅ€Đ˛ĐĩŅ€ ĐŋŅ€Đ¸ĐŊ҃ĐļĐ´ĐĩĐŊĐŊĐž ĐŋĐžĐŧĐĩŅ‡Đ°ĐĩŅ‚ вĐģĐžĐļĐĩĐŊĐ¸Ņ ŅĐž ҁĐģĐĩĐ´ŅƒŅ‰Đ¸Ņ… ҁĐĩŅ€Đ˛ĐĩŅ€ĐžĐ˛ ĐēаĐē NSFW:",
"simple_policies": "ĐŸŅ€Đ°Đ˛Đ¸Đģа Đ´ĐģŅ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐŊҋ҅ ҁĐĩŅ€Đ˛ĐĩŅ€ĐžĐ˛",
"accept": "ĐŸŅ€Đ¸ĐŊиĐŧаĐĩĐŧŅ‹Đĩ ŅĐžĐžĐąŅ‰ĐĩĐŊĐ¸Ņ",
"reject": "ĐžŅ‚ĐēĐģĐžĐŊŅĐĩĐŧŅ‹Đĩ ŅĐžĐžĐąŅ‰ĐĩĐŊĐ¸Ņ",
"reject_desc": "ДаĐŊĐŊŅ‹Đš ҁĐĩŅ€Đ˛ĐĩŅ€ ĐŊĐĩ ĐŋŅ€Đ¸ĐŊиĐŧаĐĩŅ‚ ŅĐžĐžĐąŅ‰ĐĩĐŊĐ¸Ņ ŅĐž ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Ņ… ҁĐĩŅ€Đ˛ĐĩŅ€ĐžĐ˛:",
"quarantine": "ЗоĐŊа ĐēĐ°Ņ€Đ°ĐŊŅ‚Đ¸ĐŊа",
"quarantine_desc": "ДаĐŊĐŊŅ‹Đš ҁĐĩŅ€Đ˛ĐĩŅ€ ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅĐĩŅ‚ Ņ‚ĐžĐģҌĐēĐž ĐŋŅƒĐąĐģĐ¸Ņ‡ĐŊŅ‹Đĩ ĐŋĐžŅŅ‚Ņ‹ ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đŧ ҁĐĩŅ€Đ˛ĐĩŅ€Đ°Đŧ:",
"ftl_removal": "ĐĄĐēŅ€Ņ‹Ņ‚Đ¸Đĩ ҁ Ņ„ĐĩĐ´ĐĩŅ€Đ°Ņ‚Đ¸Đ˛ĐŊОК ĐģĐĩĐŊ҂ҋ",
"media_removal": "ĐŖĐ´Đ°ĐģĐĩĐŊиĐĩ вĐģĐžĐļĐĩĐŊиК",
"media_removal_desc": "ДаĐŊĐŊŅ‹Đš ҁĐĩŅ€Đ˛ĐĩŅ€ ŅƒĐ´Đ°ĐģŅĐĩŅ‚ вĐģĐžĐļĐĩĐŊĐ¸Ņ ŅĐž ҁĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Ņ… ҁĐĩŅ€Đ˛ĐĩŅ€ĐžĐ˛:",
"media_nsfw": "ĐŸŅ€Đ¸ĐŊ҃ĐļĐ´ĐĩĐŊĐŊĐž ĐŋĐžĐŧĐĩ҇ĐĩĐŊĐŊĐž ĐēаĐē NSFW"
},
"keyword": {
"ftl_removal": "ĐŖĐąŅ€Đ°Ņ‚ŅŒ иС Ņ„ĐĩĐ´ĐĩŅ€Đ°Ņ‚Đ¸Đ˛ĐŊОК ĐģĐĩĐŊ҂ҋ",
"reject": "ĐžŅ‚ĐēĐģĐžĐŊĐ¸Ņ‚ŅŒ",
"keyword_policies": "ДĐĩĐšŅŅ‚Đ˛Đ¸Ņ ĐŊа ĐēĐģŅŽŅ‡ĐĩĐ˛Ņ‹Đĩ ҁĐģОва",
"replace": "ЗаĐŧĐĩĐŊĐ¸Ņ‚ŅŒ",
"is_replaced_by": "→"
},
"mrf_policies": "АĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа MRF (ĐŧĐžĐ´ŅƒĐģҌ ĐŋĐĩŅ€ĐĩĐŋĐ¸ŅŅ‹Đ˛Đ°ĐŊĐ¸Ņ ŅĐžĐžĐąŅ‰ĐĩĐŊиК)",
"mrf_policies_desc": "ĐŸŅ€Đ°Đ˛Đ¸Đģа MRF (ĐŧĐžĐ´ŅƒĐģҌ ĐŋĐĩŅ€ĐĩĐŋĐ¸ŅŅ‹Đ˛Đ°ĐŊĐ¸Ņ ŅĐžĐžĐąŅ‰ĐĩĐŊиК) вĐģĐ¸ŅŅŽŅ‚ ĐŊа Ņ„ĐĩĐ´ĐĩŅ€Đ°Ņ†Đ¸ŅŽ даĐŊĐŊĐžĐŗĐž ҁĐĩŅ€Đ˛ĐĩŅ€Đ°. ĐĄĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа аĐēŅ‚Đ¸Đ˛ĐŊŅ‹:"
},
"staff": "АдĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ"
},
"domain_mute_card": {
"mute": "Đ˜ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ",
"mute_progress": "В ĐŋŅ€ĐžŅ†ĐĩҁҁĐĩâ€Ļ",
"unmute": "ĐŸŅ€ĐĩĐēŅ€Đ°Ņ‚Đ¸Ņ‚ŅŒ Đ¸ĐŗĐŊĐžŅ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ",
"unmute_progress": "В ĐŋŅ€ĐžŅ†ĐĩҁҁĐĩâ€Ļ"
},
"exporter": {
"export": "Đ­ĐēҁĐŋĐžŅ€Ņ‚",
"processing": "ЗаĐŋŅ€ĐžŅ в ĐžĐąŅ€Đ°ĐąĐžŅ‚ĐēĐĩ, ваĐŧ ҁĐēĐžŅ€Đž ĐąŅƒĐ´ĐĩŅ‚ ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐž ĐˇĐ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ Ņ„Đ°ĐšĐģ"
},
"features_panel": {
"chat": "Đ§Đ°Ņ‚",
"media_proxy": "ĐŸŅ€ĐžĐēŅĐ¸ Đ´ĐģŅ вĐŊĐĩ҈ĐŊĐ¸Ņ… вĐģĐžĐļĐĩĐŊиК",
"text_limit": "ЛиĐŧĐ¸Ņ‚ ŅĐ¸ĐŧвОĐģОв",
"title": "ĐžŅĐžĐąĐĩĐŊĐŊĐžŅŅ‚Đ¸",
- "gopher": "Gopher"
+ "gopher": "Gopher",
+ "who_to_follow": "ĐŸŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸Ņ ĐēĐžĐŗĐž Ņ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ",
+ "pleroma_chat_messages": "Pleroma Đ§Đ°Ņ‚"
},
"tool_tip": {
"accept_follow_request": "ĐŸŅ€Đ¸ĐŊŅŅ‚ŅŒ СаĐŋŅ€ĐžŅ ĐŊа ҇҂ĐĩĐŊиĐĩ",
"reject_follow_request": "ĐžŅ‚ĐēĐģĐžĐŊĐ¸Ņ‚ŅŒ СаĐŋŅ€ĐžŅ ĐŊа ҇҂ĐĩĐŊиĐĩ"
},
"image_cropper": {
"save_without_cropping": "ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ ĐŊĐĩ ĐžĐąŅ€ĐĩĐˇĐ°Ņ",
"save": "ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ",
- "crop_picture": "ĐžĐąŅ€ĐĩĐˇĐ°Ņ‚ŅŒ ĐēĐ°Ņ€Ņ‚Đ¸ĐŊĐē҃"
+ "crop_picture": "ĐžĐąŅ€ĐĩĐˇĐ°Ņ‚ŅŒ ĐēĐ°Ņ€Ņ‚Đ¸ĐŊĐē҃",
+ "cancel": "ĐžŅ‚ĐŧĐĩĐŊа"
}
}
diff --git a/src/i18n/uk.json b/src/i18n/uk.json
new file mode 100644
index 0000000000..73006e6e89
--- /dev/null
+++ b/src/i18n/uk.json
@@ -0,0 +1,99 @@
+{
+ "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": "Đ§Đ°Ņ‚ Pleroma",
+ "chat": "Đ§Đ°Ņ‚",
+ "who_to_follow": "ĐšĐžĐŗĐž Đ˛Ņ–Đ´ŅŅ‚ĐĩĐļŅƒĐ˛Đ°Ņ‚Đ¸",
+ "title": "ĐžŅĐžĐąĐģĐ¸Đ˛ĐžŅŅ‚Ņ–",
+ "scope_options": "ĐŸĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ ĐžŅŅĐŗŅƒ",
+ "media_proxy": "ĐŸĐžŅĐĩŅ€ĐĩĐ´ĐŊиĐē ĐŧĐĩĐ´Ņ–Đ°-даĐŊĐ¸Ņ…",
+ "text_limit": "Đ›Ņ–ĐŧŅ–Ņ‚ ŅĐ¸ĐŧвОĐģŅ–Đ˛"
+ },
+ "exporter": {
+ "processing": "ОĐŋŅ€Đ°Ņ†ŅŒĐžĐ˛ŅƒŅŽ, ҁĐēĐžŅ€Đž ви СĐŧĐžĐļĐĩŅ‚Đĩ СаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸ Ņ„Đ°ĐšĐģ",
+ "export": "ЕĐēҁĐŋĐžŅ€Ņ‚"
+ },
+ "domain_mute_card": {
+ "unmute_progress": "ВиĐŧиĐēĐ°ŅŽâ€Ļ",
+ "unmute": "ВиĐŧĐēĐŊŅƒŅ‚Đ¸ Ņ–ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ",
+ "mute_progress": "ВĐŧиĐēĐ°ŅŽâ€Ļ",
+ "mute": "Đ†ĐŗĐŊĐžŅ€ŅƒĐ˛Đ°Ņ‚Đ¸"
+ },
+ "shoutbox": {
+ "title": "ДĐģŅ вОĐŋĐģŅ–Đ˛"
+ },
+ "about": {
+ "staff": "АдĐŧŅ–ĐŊŅ–ŅŅ‚Ņ€Đ°Ņ†Ņ–Ņ",
+ "mrf": {
+ "simple": {
+ "media_nsfw_desc": "ДаĐŊиК Ņ–ĐŊŅŅ‚Đ°ĐŊҁ ĐŋŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đž ĐŋОСĐŊĐ°Ņ‡Đ°Ņ” вĐēĐģадĐĩĐŊĐŊŅ С ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐ¸Ņ… Ņ–ĐŊŅŅ‚Đ°ĐŊŅŅ–Đ˛ ŅĐē NSFW:",
+ "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": "ĐŖĐ˛Ņ–ĐšŅ‚Đ¸"
+ },
+ "importer": {
+ "error": "ĐŸŅ–Đ´ Ņ‡Đ°Ņ Ņ–ĐŧĐŋĐžŅ€Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Ņ„Đ°ĐšĐģ҃ ŅŅ‚Đ°ĐģĐ°ŅŅ ĐŋĐžĐŧиĐģĐēа.",
+ "success": "ІĐŧĐŋĐžŅ€Ņ‚ĐžĐ˛Đ°ĐŊĐž ҃ҁĐŋŅ–ŅˆĐŊĐž.",
+ "submit": "Đ’Ņ–Đ´ĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸"
+ },
+ "image_cropper": {
+ "cancel": "Đ’Ņ–Đ´ĐŧŅ–ĐŊĐ¸Ņ‚Đ¸",
+ "save_without_cropping": "ЗбĐĩŅ€ĐĩĐŗŅ‚Đ¸ ĐŊĐĩ ĐžĐąŅ€Ņ–ĐˇĐ°ŅŽŅ‡Đ¸",
+ "crop_picture": "ĐžĐąŅ€Ņ–ĐˇĐ°Ņ‚Đ¸ ĐŧаĐģŅŽĐŊĐžĐē",
+ "save": "ЗбĐĩŅ€ĐĩĐŗŅ‚Đ¸"
+ }
+}
diff --git a/src/i18n/zh.json b/src/i18n/zh.json
index 09e2ab0d85..7f8e5593c7 100644
--- a/src/i18n/zh.json
+++ b/src/i18n/zh.json
@@ -1,821 +1,821 @@
{
"chat": {
"title": "čŠå¤Š"
},
"exporter": {
"export": "å¯ŧå‡ē",
"processing": "æ­Ŗåœ¨å¤„į†īŧŒį¨åŽäŧšæį¤ē您下čŊŊ文äģļ"
},
"features_panel": {
"chat": "čŠå¤Š",
"gopher": "Gopher",
"media_proxy": "åĒ’äŊ“äģŖį†",
"scope_options": "å¯č§čŒƒå›´čŽžįŊŽ",
"text_limit": "文字数量限åˆļ",
"title": "功čƒŊ",
"who_to_follow": "æŽ¨čå…ŗæŗ¨",
"pleroma_chat_messages": "Pleroma čŠå¤Š"
},
"finder": {
"error_fetching_user": "čŽˇå–į”¨æˆˇæ—ļå‘į”Ÿé”™č¯¯",
"find_user": "å¯ģæ‰žį”¨æˆˇ"
},
"general": {
"apply": "åē”ᔍ",
- "submit": "提äē¤",
+ "submit": "发送",
"more": "更多",
"generic_error": "å‘į”Ÿäē†ä¸€ä¸Ē错蝝",
"optional": "可选",
"show_more": "åą•åŧ€",
"show_less": "æ”ļčĩˇ",
"cancel": "取æļˆ",
"disable": "įρᔍ",
"enable": "吝ᔍ",
"confirm": "įĄŽčŽ¤",
"verify": "énj蝁",
"dismiss": "åŋŊį•Ĩ",
"peek": "įĒĨæŽĸ",
"close": "å…ŗé—­",
"retry": "é‡č¯•",
"error_retry": "č¯ˇé‡č¯•",
"loading": "čŊŊå…Ĩ中â€Ļ"
},
"image_cropper": {
"crop_picture": "誁å‰Ēå›žį‰‡",
"save": "äŋå­˜",
"save_without_cropping": "äŋå­˜æœĒįģčŖå‰Ēįš„å›žį‰‡",
"cancel": "取æļˆ"
},
"importer": {
"submit": "提äē¤",
"success": "å¯ŧå…Ĩ成功。",
"error": "å¯ŧå…Ĩ此文äģļæ—ļå‡ēįŽ°ä¸€ä¸Ēé”™č¯¯ã€‚"
},
"login": {
"login": "į™ģåŊ•",
"description": "ᔍ OAuth į™ģåŊ•",
"logout": "į™ģå‡ē",
"password": "坆᠁",
"placeholder": "例åĻ‚īŧšlain",
"register": "æŗ¨å†Œ",
"username": "į”¨æˆˇå",
"hint": "į™ģåŊ•后加å…Ĩ莨čŽē",
"authentication_code": "énj蝁᠁",
"enter_recovery_code": "输å…Ĩ一ä¸Ēæĸå¤į ",
"enter_two_factor_code": "输å…Ĩ一ä¸ĒåŒé‡å› į´ énj蝁᠁",
"recovery_code": "æĸå¤į ",
"heading": {
"totp": "åŒé‡å› į´ énj蝁",
"recovery": "åŒé‡å› į´ æĸ复"
}
},
"media_modal": {
"previous": "垀前",
"next": "垀后"
},
"nav": {
"about": "å…ŗäēŽ",
"back": "后退",
"chat": "æœŦįĢ™čŠå¤Š",
"friend_requests": "å…ŗæŗ¨č¯ˇæą‚",
"mentions": "提及",
"interactions": "äē’动",
"dms": "ᧁäŋĄ",
"public_tl": "å…Ŧå…ąæ—ļ间įēŋ",
"timeline": "æ—ļ间įēŋ",
"twkn": "厞įŸĨįŊ‘įģœ",
"user_search": "į”¨æˆˇæœį´ĸ",
"search": "搜į´ĸ",
"who_to_follow": "æŽ¨čå…ŗæŗ¨",
"preferences": "偏åĨŊ莞įŊŽ",
"administration": "įŽĄį†å‘˜",
"chats": "čŠå¤Š",
"timelines": "æ—ļ间įēŋ",
"bookmarks": "äšĻį­ž"
},
"notifications": {
"broken_favorite": "æœĒįŸĨįš„įŠļ态īŧŒæ­Ŗåœ¨æœį´ĸ中â€Ļ",
"favorited_you": "喜æŦĸäē†äŊ įš„įŠļ态",
"followed_you": "å…ŗæŗ¨äē†äŊ ",
"load_older": "加čŊŊæ›´æ—Šįš„é€šįŸĨ",
"notifications": "通įŸĨ",
"read": "åˇ˛é˜…īŧ",
"repeated_you": "čŊŦ发äē†äŊ įš„įŠļ态",
"no_more_notifications": "æ˛Ąæœ‰æ›´å¤šįš„é€šįŸĨ",
"reacted_with": "äŊœå‡ēäē† {0} įš„ååē”",
"migrated_to": "čŋį§ģ到äē†",
"follow_request": "æƒŗčĻå…ŗæŗ¨äŊ "
},
"polls": {
"add_poll": "åĸžåŠ æŠ•įĨ¨",
"add_option": "åĸžåŠ é€‰éĄš",
"option": "选项",
"votes": "投įĨ¨",
"vote": "投įĨ¨",
"type": "投įĨ¨įąģ型",
"single_choice": "单选",
"multiple_choices": "多选",
"expiry": "投įĨ¨æœŸé™",
"expires_in": "投įĨ¨äēŽ {0} 后į쓿Ÿ",
"expired": "投įĨ¨ {0} å‰åˇ˛į쓿Ÿ",
"not_enough_options": "投įĨ¨įš„选饚å¤Ē少"
},
"stickers": {
"add_sticker": "æˇģ加贴įē¸"
},
"interactions": {
"favs_repeats": "čŊŦ发和æ”ļ藏",
"follows": "æ–°įš„å…ŗæŗ¨č€…",
"load_older": "加čŊŊæ›´æ—Šįš„äē’动",
"moves": "į”¨æˆˇčŋį§ģ"
},
"post_status": {
"new_status": "发布新įŠļ态",
"account_not_locked_warning": "äŊ įš„å¸åˇæ˛Ąæœ‰ {0}。äģģäŊ•äēēéƒŊ可äģĨå…ŗæŗ¨äŊ åšļæĩč§ˆäŊ įš„上锁内厚。",
"account_not_locked_warning_link": "上锁",
"attachments_sensitive": "æ ‡čŽ°é™„äģļä¸ē敏感内厚",
"content_type": {
"text/plain": "į睿–‡æœŦ",
"text/html": "HTML",
"text/markdown": "Markdown",
"text/bbcode": "BBCode"
},
"content_warning": "ä¸ģéĸ˜īŧˆå¯é€‰īŧ‰",
"default": "刚刚æŠĩčžžæ´›æ‰įŸļ",
"direct_warning_to_all": "æœŦæĄå†…åŽšåĒ有čĸĢæåŠįš„į”¨æˆˇčƒŊå¤Ÿįœ‹åˆ°ã€‚",
"direct_warning_to_first_only": "æœŦæĄå†…åŽšåĒ有čĸĢ在æļˆæ¯åŧ€å§‹å¤„æåŠįš„į”¨æˆˇčƒŊå¤Ÿįœ‹åˆ°ã€‚",
"posting": "发送",
"scope_notice": {
"public": "æœŦæĄå†…åŽšå¯äģĨčĸĢæ‰€æœ‰äēēįœ‹åˆ°",
"private": "å…ŗæŗ¨äŊ įš„äē翉čƒŊįœ‹åˆ°æœŦæĄå†…åŽš",
"unlisted": "æœŦæĄå†…åŽšæ—ĸ不在å…Ŧå…ąæ—ļ间įēŋīŧŒäšŸä¸äŧšåœ¨æ‰€æœ‰åˇ˛įŸĨįŊ‘įģœä¸Šå¯č§"
},
"scope": {
"direct": "ᧁäŋĄ - åĒ发送įģ™čĸĢæåŠįš„į”¨æˆˇ",
"private": "äģ…å…ŗæŗ¨č€… - åĒæœ‰å…ŗæŗ¨äē†äŊ įš„äēēčƒŊįœ‹åˆ°",
"public": "å…Ŧå…ą - 发送到å…Ŧå…ąæ—ļ间čŊ´",
"unlisted": "不å…Ŧåŧ€ - 不äŧšå‘送到å…Ŧå…ąæ—ļ间čŊ´"
},
"preview_empty": "įŠēįš„",
"preview": "éĸ„č§ˆ",
"media_description": "åĒ’äŊ“描čŋ°",
"media_description_error": "更新åĒ’äŊ“å¤ąč´ĨīŧŒč¯ˇé‡č¯•",
"empty_status_error": "不čƒŊå‘å¸ƒæ˛Ąæœ‰å†…åŽšã€æ˛Ąæœ‰é™„äģļįš„å‘æ–‡"
},
"registration": {
"bio": "įŽ€äģ‹",
"email": "į”ĩå­é‚ŽįŽą",
"fullname": "昞į¤ēåį§°",
"password_confirm": "įĄŽčŽ¤å¯†į ",
"registration": "æŗ¨å†Œ",
"token": "邀蝎᠁",
"captcha": "CAPTCHA",
"new_captcha": "į‚šå‡ģå›žį‰‡čŽˇå–æ–°įš„énj蝁᠁",
"username_placeholder": "例åĻ‚īŧšlain",
"fullname_placeholder": "例åĻ‚īŧšå˛Šäģ“įŽ˛éŸŗ",
"bio_placeholder": "例åĻ‚īŧš\näŊ åĨŊīŧŒæˆ‘æ˜¯įŽ˛éŸŗã€‚\n我是一ä¸ĒäŊåœ¨æ—ĨæœŦ郊åŒēįš„åŠ¨į”ģ少åĨŗã€‚äŊ å¯čƒŊ在 Wired 见čŋ‡æˆ‘。",
"validations": {
"username_required": "不čƒŊį•™įŠē",
"fullname_required": "不čƒŊį•™įŠē",
"email_required": "不čƒŊį•™įŠē",
"password_required": "不čƒŊį•™įŠē",
"password_confirmation_required": "不čƒŊį•™įŠē",
"password_confirmation_match": "å¯†į ä¸ä¸€č‡´"
}
},
"selectable_list": {
"select_all": "选拊全部"
},
"settings": {
"app_name": "App åį§°",
"security": "厉全",
"enter_current_password_to_confirm": "输å…Ĩ您åŊ“å‰įš„å¯†į æĨįĄŽčŽ¤æ‚¨įš„čēĢäģŊ",
"mfa": {
"otp": "OTP",
"setup_otp": "莞įŊŽ OTP",
"wait_pre_setup_otp": "éĸ„莞 OTP",
"confirm_and_enable": "įĄŽčŽ¤åšļ吝ᔍ OTP",
"title": "åŒå› į´ énj蝁",
"generate_new_recovery_codes": "į”Ÿæˆæ–°įš„æĸå¤į ",
"warning_of_generate_new_codes": "åŊ“æ‚¨į”Ÿæˆæ–°įš„æĸå¤į æ—ļīŧŒæ‚¨æ—§įš„æĸå¤į å°†äŧšå¤ąæ•ˆã€‚",
"recovery_codes": "æĸå¤į ã€‚",
"waiting_a_recovery_codes": "æ­Ŗåœ¨æŽĨæ”ļ备äģŊ᠁â€Ļ",
"recovery_codes_warning": "抄写čŋ™äē›åˇį īŧŒæˆ–者将å…ļäŋå­˜åœ¨åŽ‰å…¨įš„åœ°æ–šã€‚čŋ™äē›åˇį ä¸äŧšå†æŦĄæ˜žį¤ē。åĻ‚æžœæ‚¨æ— æŗ•čŽŋé—Žæ‚¨įš„ 2FA appīŧŒäšŸä¸ĸå¤ąä熿‚¨įš„æĸå¤į īŧŒæ‚¨å°ąå†äšŸæ— æŗ•į™ģåŊ•æ‚¨įš„č´Ļåˇäē†ã€‚",
"authentication_methods": "čēĢäģŊéĒŒč¯æ–šæŗ•",
"scan": {
"title": "æ‰Ģ一下",
"desc": "äŊŋį”¨æ‚¨įš„åŒå› į´ énj蝁 appīŧŒæ‰Ģ描čŋ™ä¸ĒäēŒįģ´į īŧŒæˆ–者螓å…Ĩčŋ™ä盿–‡å­—密é’Ĩīŧš",
"secret_code": "密é’Ĩ"
},
"verify": {
"desc": "čĻå¯į”¨åŒå› į´ énj蝁īŧŒč¯ˇčž“å…Ĩæ‚¨įš„åŒå› į´ énj蝁 app é‡Œįš„æ•°å­—īŧš"
}
},
"attachmentRadius": "附äģļ",
"attachments": "附äģļ",
"avatar": "头像",
"avatarAltRadius": "头像īŧˆé€šįŸĨīŧ‰",
"avatarRadius": "头像",
"background": "čƒŒæ™¯",
"bio": "įŽ€äģ‹",
"block_export": "åąč”Ŋ名单å¯ŧå‡ē",
"block_export_button": "å¯ŧå‡ēäŊ įš„åąč”Ŋ名单到一ä¸Ē csv 文äģļ",
"block_import": "åąč”Ŋ名单å¯ŧå…Ĩ",
"block_import_error": "å¯ŧå…Ĩåąč”Ŋ名单å‡ē错",
"blocks_imported": "åąč”Ŋ名单å¯ŧå…Ĩ成功īŧéœ€čĻä¸€į‚šæ—ļ间æĨå¤„į†ã€‚",
"blocks_tab": "åąč”Ŋ",
"btnRadius": "按钎",
"cBlue": "蓝色īŧˆå›žå¤īŧŒå…ŗæŗ¨īŧ‰",
"cGreen": "įģŋ色īŧˆčŊŦ发īŧ‰",
"cOrange": "æŠ™č‰˛īŧˆæ”ļ藏īŧ‰",
"cRed": "įēĸ色īŧˆå–æļˆīŧ‰",
"change_password": "äŋŽæ”šå¯†į ",
"change_password_error": "äŋŽæ”šå¯†į įš„æ—ļ候å‡ēäē†į‚šé—Žéĸ˜ã€‚",
"changed_password": "成功äŋŽæ”šäē†å¯†į īŧ",
"collapse_subject": "折叠å¸Ļä¸ģéĸ˜įš„内厚",
"composing": "æ­Ŗåœ¨äšĻ写",
"confirm_new_password": "įĄŽčŽ¤æ–°å¯†į ",
"current_avatar": "åŊ“前头像",
"current_password": "åŊ“å‰å¯†į ",
"current_profile_banner": "您åŊ“å‰įš„æ¨Ēåš…å›žį‰‡",
"data_import_export_tab": "数捎å¯ŧå…Ĩ/å¯ŧå‡ē",
"default_vis": "éģ˜čŽ¤å¯č§čŒƒå›´",
"delete_account": "删除č´Ļæˆˇ",
"delete_account_description": "永䚅删除äŊ įš„å¸åˇå’Œæ‰€æœ‰æ•°æŽã€‚",
"delete_account_error": "删除č´Ļæˆˇæ—ļå‘į”Ÿé”™č¯¯īŧŒåĻ‚æžœä¸€į›´åˆ é™¤ä¸äē†īŧŒč¯ˇč”įŗģåŽžäž‹įŽĄį†å‘˜ã€‚",
"delete_account_instructions": "在下éĸ输å…Ĩæ‚¨įš„å¯†į æĨįĄŽčŽ¤åˆ é™¤č´Ļæˆˇã€‚",
"avatar_size_instruction": "æŽ¨čįš„å¤´åƒå›žį‰‡æœ€å°įš„å°ē寸是 150x150 åƒį´ ã€‚",
"export_theme": "å¯ŧå‡ēéĸ„įŊŽä¸ģéĸ˜",
"filtering": "čŋ‡æģ¤å™¨",
"filtering_explanation": "所有包åĢäģĨä¸‹č¯æą‡įš„å†…åŽšéƒŊäŧščĸĢ隐藏īŧŒä¸€čĄŒä¸€ä¸Ē",
"follow_export": "å¯ŧå‡ēå…ŗæŗ¨",
"follow_export_button": "å°†å…ŗæŗ¨å¯ŧå‡ē成 csv 文äģļ",
"follow_import": "å¯ŧå…Ĩå…ŗæŗ¨",
"follow_import_error": "å¯ŧå…Ĩå…ŗæŗ¨æ—ļ错蝝",
"follows_imported": "å…ŗæŗ¨åˇ˛å¯ŧå…Ĩīŧå°šéœ€čρ䏀ä盿—ļ间æĨå¤„į†ã€‚",
"foreground": "前景",
"general": "é€šį”¨",
"hide_attachments_in_convo": "åœ¨å¯šč¯ä¸­éšč—é™„äģļ",
"hide_attachments_in_tl": "在æ—ļ间įēŋ上隐藏附äģļ",
"hide_muted_posts": "不昞į¤ēčĸĢéšč—įš„į”¨æˆˇįš„å¸–å­",
"max_thumbnails": "最多再每ä¸Ē帖子所čƒŊ昞į¤ēįš„įŧŠį•Ĩ回数量",
"hide_isp": "éšč—åŽžäž‹į‹Ŧæœ‰įš„éĸæŋ",
"preload_images": "éĸ„čŊŊå›žį‰‡",
"use_one_click_nsfw": "į‚šå‡ģ一æŦĄäģĨ打åŧ€åˇĨäŊœåœēæ‰€ä¸é€‚åŽœįš„é™„äģļ",
"hide_post_stats": "éšč—æŽ¨æ–‡į›¸å…ŗįš„įģŸčŽĄæ•°æŽ(例åĻ‚īŧšæ”ļč—įš„æŦĄæ•°)",
"hide_user_stats": "éšč—į”¨æˆˇįš„įģŸčŽĄæ•°æŽīŧˆäž‹åĻ‚īŧšå…ŗæŗ¨č€…įš„æ•°é‡īŧ‰",
"hide_filtered_statuses": "隐藏čŋ‡æģ¤įš„įŠļ态",
"import_blocks_from_a_csv_file": "äģŽ csv 文äģļ中å¯ŧå…Ĩ拉éģ‘名单",
"import_followers_from_a_csv_file": "äģŽ csv 文äģļ中å¯ŧå…Ĩå…ŗæŗ¨",
"import_theme": "å¯ŧå…Ĩéĸ„įŊŽä¸ģéĸ˜",
"inputRadius": "输å…ĨæĄ†",
"checkboxRadius": "å¤é€‰æĄ†",
"instance_default": "(éģ˜čޤīŧš{value})",
"instance_default_simple": "(éģ˜čޤ)",
"interface": "į•Œéĸ",
"interfaceLanguage": "į•Œéĸ蝭荀",
"invalid_theme_imported": "æ‚¨æ‰€é€‰æ‹Šįš„ä¸ģéĸ˜æ–‡äģļ不čĸĢ Pleroma 支持īŧŒå› æ­¤ä¸ģéĸ˜æœĒčĸĢäŋŽæ”šã€‚",
"limited_availability": "åœ¨æ‚¨įš„æĩč§ˆå™¨ä¸­æ— æŗ•äŊŋᔍ",
"links": "链æŽĨ",
"lock_account_description": "您需čĻæ‰‹åŠ¨åŽĄæ ¸å…ŗæŗ¨č¯ˇæą‚",
"loop_video": "åžĒįŽ¯č§†éĸ‘",
"loop_video_silent_only": "åĒåžĒįŽ¯æ˛Ąæœ‰åŖ°éŸŗįš„č§†éĸ‘īŧˆäž‹åĻ‚īŧšMastodon é‡Œįš„â€œGIF”īŧ‰",
"mutes_tab": "隐藏",
"play_videos_in_modal": "在åŧšå‡ēæĄ†å†…æ’­æ”žč§†éĸ‘",
"use_contain_fit": "į”ŸæˆįŧŠį•Ĩ回æ—ļ不čρ誁å‰Ē附äģļ",
"name": "名字",
"name_bio": "åå­—åŠįŽ€äģ‹",
"new_password": "æ–°å¯†į ",
"notification_visibility": "čĻæ˜žį¤ēįš„é€šįŸĨįąģ型",
"notification_visibility_follows": "å…ŗæŗ¨",
"notification_visibility_likes": "į‚ščĩž",
"notification_visibility_mentions": "提及",
"notification_visibility_repeats": "čŊŦ发",
"no_rich_text_description": "不昞į¤ē富文æœŦæ ŧåŧ",
"no_blocks": "æ˛Ąæœ‰åąč”Ŋ",
"no_mutes": "æ˛Ąæœ‰éšč—",
"hide_follows_description": "不čĻæ˜žį¤ēæˆ‘æ‰€å…ŗæŗ¨įš„äēē",
"hide_followers_description": "不čĻæ˜žį¤ēå…ŗæŗ¨æˆ‘įš„äēē",
"show_admin_badge": "昞į¤ēįŽĄį†åžŊįĢ ",
- "show_moderator_badge": "昞į¤ēį‰ˆä¸ģåžŊįĢ ",
+ "show_moderator_badge": "åœ¨æˆ‘įš„ä¸Ēäēēčĩ„料中昞į¤ēį›‘å¯Ÿå‘˜æ ‡åŋ—",
"nsfw_clickthrough": "å°†ä¸å’Œč°é™„äģļ隐藏īŧŒį‚šå‡ģ才čƒŊ打åŧ€",
"oauth_tokens": "OAuthäģ¤į‰Œ",
"token": "äģ¤į‰Œ",
"refresh_token": "åˆˇæ–°äģ¤į‰Œ",
"valid_until": "æœ‰æ•ˆæœŸč‡ŗ",
"revoke_token": "撤æļˆ",
"panelRadius": "éĸæŋ",
"pause_on_unfocused": "在įĻģåŧ€éĄĩéĸæ—ļ暂停æ—ļ间įēŋ推送",
"presets": "éĸ„įŊŽ",
"profile_background": "ä¸Ēäēēčĩ„æ–™čƒŒæ™¯å›ž",
"profile_banner": "æ¨Ēåš…å›žį‰‡",
"profile_tab": "ä¸Ēäēēčĩ„æ–™",
"radii_help": "莞įŊŽį•Œéĸčžšįŧ˜įš„åœ†č§’ (单äŊīŧšåƒį´ )",
"replies_in_timeline": "æ—ļ间įēŋä¸­įš„å›žå¤",
"reply_visibility_all": "昞į¤ē所有回复",
"reply_visibility_following": "åĒ昞į¤ē发送į왿ˆ‘įš„å›žå¤/发送į왿ˆ‘å…ŗæŗ¨įš„į”¨æˆˇįš„å›žå¤",
"reply_visibility_self": "åĒ昞į¤ē发送į왿ˆ‘įš„å›žå¤",
"autohide_floating_post_button": "č‡ĒåŠ¨éšč—æ–°å¸–å­įš„æŒ‰é’Žīŧˆį§ģåŠ¨čŽžå¤‡īŧ‰",
"saving_err": "äŋå­˜čŽžįŊŽæ—ļå‘į”Ÿé”™č¯¯",
"saving_ok": "莞įŊŽåˇ˛äŋå­˜",
"search_user_to_block": "搜į´ĸäŊ æƒŗåąč”Ŋįš„į”¨æˆˇ",
"search_user_to_mute": "搜į´ĸäŊ æƒŗčĻéšč—įš„į”¨æˆˇ",
"security_tab": "厉全",
"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_noop": "不čĻå¤åˆļ",
"post_status_content_type": "发文įŠļ态内厚įąģ型",
"stop_gifs": "éŧ æ ‡æ‚Ŧ停æ—ļ播攞GIF",
"streaming": "åŧ€å¯æģšåŠ¨åˆ°éĄļ部æ—ļįš„č‡Ē动推送",
"text": "文æœŦ",
"theme": "ä¸ģéĸ˜",
"theme_help": "äŊŋį”¨åå…­čŋ›åˆļäģŖį īŧˆ#rrggbbīŧ‰æĨ莞įŊŽä¸ģéĸ˜éĸœč‰˛ã€‚",
"theme_help_v2_1": "您䚟可äģĨ通čŋ‡é€‰ä¸­å¤é€‰æĄ†æĨčĻ†į›–æŸäē›įģ„äģļįš„éĸœč‰˛å’Œé€æ˜ŽåēĻ。äŊŋį”¨â€œæ¸…é™¤æ‰€æœ‰â€æŒ‰é’ŽæĨ清除所有čĻ†į›–čŽžįŊŽã€‚",
"theme_help_v2_2": "某ä盿Ąį›Žä¸‹įš„å›žæ ‡æ˜¯čƒŒæ™¯æˆ–æ–‡æœŦ寚比指į¤ē器īŧŒéŧ æ ‡æ‚Ŧ停可äģĨčŽˇå–č¯Ļįģ†äŋĄæ¯ã€‚蝎čްäŊīŧŒäŊŋį”¨é€æ˜ŽåēĻæĨ昞į¤ēæœ€åˇŽįš„æƒ…å†ĩ。",
"tooltipRadius": "提醒",
"upload_a_photo": "上äŧ į…§į‰‡",
"user_settings": "į”¨æˆˇčŽžįŊŽ",
"values": {
"false": "åĻ",
"true": "是"
},
"notifications": "通įŸĨ",
"notification_mutes": "čρ停æ­ĸæ”ļ到某ä¸ĒæŒ‡åŽšįš„į”¨æˆˇįš„é€šįŸĨīŧŒč¯ˇäŊŋį”¨éšč—åŠŸčƒŊ。",
"notification_blocks": "åąč”Ŋ一ä¸Ēį”¨æˆˇäŧšåœæ­ĸæŽĨæ”ļæĨč‡Ēč¯Ĩį”¨æˆˇįš„æ‰€æœ‰é€šįŸĨīŧŒåšļ且äŧšå–æļˆå¯šč¯Ĩį”¨æˆˇįš„å…ŗæŗ¨ã€‚",
"enable_web_push_notifications": "吝ᔍ web 推送通įŸĨ",
"style": {
"switcher": {
"keep_color": "äŋį•™éĸœč‰˛",
"keep_shadows": "äŋį•™é˜´åŊą",
"keep_opacity": "äŋį•™é€æ˜ŽåēĻ",
"keep_roundness": "äŋį•™åœ†č§’",
"keep_fonts": "äŋį•™å­—äŊ“",
"save_load_hint": "\"äŋį•™\" é€‰éĄšåœ¨é€‰æ‹Šæˆ–åŠ čŊŊä¸ģéĸ˜æ—ļäŋį•™åŊ“å‰čŽžįŊŽįš„选饚īŧŒåœ¨å¯ŧå‡ēä¸ģéĸ˜æ—ļčŋ˜äŧšå­˜å‚¨ä¸Ščŋ°é€‰éĄšã€‚åŊ“æ‰€æœ‰å¤é€‰æĄ†æœĒ莞įŊŽæ—ļīŧŒå¯ŧå‡ēä¸ģéĸ˜å°†äŋå­˜æ‰€æœ‰å†…厚。",
"reset": "重įŊŽ",
"clear_all": "清除全部",
"clear_opacity": "清除透明åēĻ",
"load_theme": "加čŊŊä¸ģéĸ˜",
"help": {
"upgraded_from_v2": "PleromaFE åˇ˛å‡įē§īŧŒä¸ģéĸ˜äŧšä¸Žæ‚¨čްåŋ†ä¸­įš„不å¤Ēä¸€æ ˇã€‚",
"older_version_imported": "您å¯ŧå…Ĩįš„æ–‡äģļæĨč‡Ēæ—§į‰ˆæœŦįš„ FE。",
"future_version_imported": "您å¯ŧå…Ĩįš„æ–‡äģļæĨč‡Ē更éĢ˜į‰ˆæœŦįš„ FE。",
"v2_imported": "您å¯ŧå…Ĩįš„æ–‡äģ￘¯æ—§į‰ˆ FE įš„ã€‚æˆ‘äģŦå°Ŋ可čƒŊäŋæŒå…ŧ厚性īŧŒäŊ†čŋ˜æ˜¯å¯čƒŊå‡ēįŽ°ä¸ä¸€č‡´įš„æƒ…å†ĩ。",
"snapshot_source_mismatch": "į‰ˆæœŦ冞įǁīŧšåžˆæœ‰å¯čƒŊ是 FE į‰ˆæœŦ回æģšåŽå†æŦĄå‡įē§äē†īŧŒåĻ‚æžœæ‚¨äŊŋį”¨æ—§į‰ˆæœŦįš„ FE 更攚äē†ä¸ģéĸ˜é‚Ŗäšˆæ‚¨å¯čƒŊ需čρäŊŋį”¨æ—§į‰ˆæœŦīŧŒåĻåˆ™č¯ˇäŊŋį”¨æ–°į‰ˆæœŦ。",
"migration_napshot_gone": "不įŸĨå‡ēäēŽäŊ•į§åŽŸå› īŧŒä¸ģéĸ˜åŋĢį…§įŧēå¤ąäē†īŧŒä¸€äē›åœ°æ–šå¯čƒŊä¸Žæ‚¨å°čąĄä¸­įš„ä¸įŦĻ。",
"migration_snapshot_ok": "ä¸ēäŋä¸‡æ— ä¸€å¤ąīŧŒåŠ čŊŊäē†ä¸ģéĸ˜åŋĢį…§ã€‚æ‚¨å¯äģĨč¯•į€åŠ čŊŊä¸ģéĸ˜æ•°æŽã€‚",
"fe_downgraded": "PleromaFE įš„į‰ˆæœŦ回æģšäē†ã€‚",
"fe_upgraded": "PleromaFE įš„ä¸ģéĸ˜åŧ•æ“Žéšį€į‰ˆæœŦ更新升įē§äē†ã€‚",
"snapshot_missing": "在文äģļä¸­æ˛Ąæœ‰ä¸ģéĸ˜åŋĢį…§īŧŒæ‰€äģĨįŊ‘įĢ™å¤–č§‚å¯čƒŊäŧšä¸ŽåŽŸæĨéĸ„æƒŗįš„ä¸åŒã€‚",
"snapshot_present": "ä¸ģéĸ˜åŋĢį…§åˇ˛åŠ čŊŊīŧŒå› æ­¤æ‰€æœ‰įš„å€ŧ均čĸĢčĻ†į›–ã€‚æ‚¨å¯äģĨ攚ä¸ē加čŊŊä¸ģéĸ˜įš„厞际数捎。"
},
"use_source": "æ–°į‰ˆæœŦ",
"use_snapshot": "č€į‰ˆæœŦ",
"keep_as_is": "äŋæŒåŽŸįŠļ"
},
"common": {
"color": "éĸœč‰˛",
"opacity": "透明åēĻ",
"contrast": {
"hint": "寚比åēĻæ˜¯ {ratio}īŧŒ 厃 {level} {context}",
"level": {
"aa": "įŦĻ合 AA į­‰įē§å‡†åˆ™īŧˆæœ€äŊŽīŧ‰",
"aaa": "įŦĻ合 AAA į­‰įē§å‡†åˆ™īŧˆæŽ¨čīŧ‰",
"bad": "不įŦĻ合äģģäŊ•čž…åŠŠåŠŸčƒŊ指南"
},
"context": {
"18pt": "大字文æœŦ (18pt+)",
"text": "文æœŦ"
}
}
},
"common_colors": {
"_tab_label": "叏规",
"main": "叏ᔍéĸœč‰˛",
"foreground_hint": "į‚šå‡ģ”é̘įē§â€œ æ ‡į­žčŋ›čĄŒįģ†č‡´įš„æŽ§åˆļ",
"rgbo": "回标īŧŒåŖéŸŗīŧŒåžŊįĢ "
},
"advanced_colors": {
"_tab_label": "é̘įē§",
"alert": "提醒或č­Ļå‘ŠčƒŒæ™¯č‰˛",
"alert_error": "错蝝",
"badge": "åžŊįĢ čƒŒæ™¯",
"badge_notification": "通įŸĨ",
"panel_header": "éĸæŋ标éĸ˜",
"top_bar": "éĄļ栏",
"borders": "čžšæĄ†",
"buttons": "按钎",
"inputs": "输å…ĨæĄ†",
"faint_text": "ၰåēĻæ–‡å­—",
"chat": {
"border": "čžšæĄ†",
"outgoing": "发å‡ēįš„",
"incoming": "æ”ļåˆ°įš„"
},
"disabled": "įĻį”¨įš„",
"pressed": "æŒ‰ä¸‹įš„",
"highlight": "åŧēč°ƒå…ƒį´ ",
"selectedMenu": "é€‰ä¸­įš„čœå•éĄš",
"selectedPost": "é€‰ä¸­įš„å‘å¸ƒå†…åŽš",
"icons": "回标",
"poll": "投įĨ¨įģŸčŽĄå›ž",
"popover": "提į¤ēæĄ†īŧŒčœå•īŧŒåŧšå‡ēæĄ†",
"post": "发布内厚/į”¨æˆˇįŽ€äģ‹",
"alert_neutral": "中性",
"alert_warning": "č­Ļ告",
"tabs": "æ ‡į­žéĄĩ",
"underlay": "åē•čĄŦ",
"toggled": "å‹žé€‰įš„"
},
"radii": {
"_tab_label": "åœ†č§’"
},
"shadows": {
"_tab_label": "阴åŊąå’Œį…§æ˜Ž",
"component": "įģ„äģļ",
"override": "čφᛖ",
"shadow_id": "阴åŊą #{value}",
"blur": "æ¨ĄįŗŠ",
"spread": "æ‰Šæ•Ŗ",
"inset": "插å…Ĩ内部",
"hint": "寚äēŽé˜´åŊąäŊ čŋ˜å¯äģĨäŊŋᔍ --variable äŊœä¸ēéĸœč‰˛å€ŧæĨäŊŋᔍ CSS3 å˜é‡ã€‚č¯ˇæŗ¨æ„īŧŒčŋ™į§æƒ…å†ĩ下īŧŒé€æ˜ŽčŽžįŊŽå°†ä¸čĩˇäŊœį”¨ã€‚",
"filter_hint": {
"always_drop_shadow": "č­Ļ告īŧŒæ­¤é˜´åŊąčŽžįŊŽäŧšæ€ģ是äŊŋᔍ {0} īŧŒåĻ‚æžœæĩč§ˆå™¨æ”¯æŒįš„č¯ã€‚",
"drop_shadow_syntax": "{0} 不支持参数 {1} å’Œå…ŗé”Žč¯ {2} 。",
"avatar_inset": "č¯ˇæŗ¨æ„įģ„合两ä¸Ēå†…éƒ¨å’Œéžå†…éƒ¨įš„é˜´åŊąåˆ°å¤´åƒä¸ŠīŧŒåœ¨é€æ˜Žå¤´åƒä¸Šå¯čƒŊäŧšæœ‰æ„æ–™äš‹å¤–įš„æ•ˆæžœã€‚",
"spread_zero": "阴åŊąįš„æ‰Šæ•Ŗ > 0 äŧšåŒčŽžįŊŽæˆé›ļä¸€æ ˇ",
"inset_classic": "插å…Ĩå†…éƒ¨įš„é˜´åŊąäŧšäŊŋᔍ {0}"
},
"components": {
"panel": "éĸæŋ",
"panelHeader": "éĸæŋ标éĸ˜",
"topBar": "éĄļ栏",
"avatar": "į”¨æˆˇå¤´åƒīŧˆåœ¨ä¸Ēäēēčĩ„料栏īŧ‰",
"avatarStatus": "į”¨æˆˇå¤´åƒīŧˆåœ¨å¸–子昞į¤ē栏īŧ‰",
"popup": "åŧšįĒ—å’ŒåˇĨå…ˇæį¤ē",
"button": "按钎",
"buttonHover": "按钎īŧˆæ‚Ŧ停īŧ‰",
"buttonPressed": "按钎īŧˆæŒ‰ä¸‹īŧ‰",
"buttonPressedHover": "按钎īŧˆæŒ‰ä¸‹å’Œæ‚Ŧ停īŧ‰",
"input": "输å…ĨæĄ†"
}
},
"fonts": {
"_tab_label": "字äŊ“",
"help": "ä¸ēį”¨æˆˇį•Œéĸįš„å…ƒį´ é€‰æ‹Šå­—äŊ“。č‹Ĩ选拊 “č‡Ē选”īŧŒæ‚¨åŋ…éĄģ输å…Ĩ与įŗģį쟿˜žį¤ēåŽŒå…¨ä¸€č‡´įš„å­—äŊ“åį§°ã€‚",
"components": {
"interface": "į•Œéĸ",
"input": "输å…ĨæĄ†",
"post": "发帖文字",
"postCode": "帖子中äŊŋį”¨į­‰é—´čˇæ–‡å­—īŧˆå¯Œæ–‡æœŦīŧ‰"
},
"family": "字äŊ“åį§°",
"size": "大小 (in px)",
"weight": "字重 īŧˆį˛—äŊ“īŧ‰)",
"custom": "č‡Ē选"
},
"preview": {
"header": "éĸ„č§ˆ",
"content": "内厚",
"error": "äž‹å­é”™č¯¯",
"button": "按钎",
"text": "有堆 {0} 和 {1}",
"mono": "内厚",
"input": "刚刚æŠĩ达上æĩˇ",
"faint_link": "å¸ŽåŠŠčœå•",
"fine_print": "阅č¯ģ我äģŦįš„ {0} īŧŒį„ļ而äģ€äšˆäšŸå­Ļ不到īŧ",
"header_faint": "čŋ™åžˆæ­Ŗå¸¸",
"checkbox": "æˆ‘åˇ˛įģæĩč§ˆäē† TOC",
"link": "一ä¸ĒåžˆæŖ’įš„æ‘‡æģšé“žæŽĨ"
}
},
"version": {
"title": "į‰ˆæœŦ",
"backend_version": "后įĢ¯į‰ˆæœŦ",
"frontend_version": "前įĢ¯į‰ˆæœŦ"
},
"notification_setting_filters": "čŋ‡æģ¤å™¨",
"domain_mutes": "域名",
"changed_email": "é‚ŽįŽąäŋŽæ”šæˆåŠŸīŧ",
"change_email_error": "äŋŽæ”šæ‚¨įš„į”ĩå­é‚ŽįŽąæ—ļå‘į”Ÿé”™č¯¯ã€‚",
"change_email": "äŋŽæ”šį”ĩå­é‚ŽįŽą",
"allow_following_move": "æ­Ŗåœ¨å…ŗæŗ¨įš„č´Ļåˇčŋį§ģæ—ļč‡ĒåŠ¨é‡æ–°å…ŗæŗ¨",
"notification_setting_privacy_option": "在通įŸĨæŽ¨é€ä¸­éšč—å‘é€č€…å’Œå†…åŽš",
"notification_setting_privacy": "隐ᧁ",
"hide_follows_count_description": "不昞į¤ēå…ŗæŗ¨æ•°",
"notification_visibility_emoji_reactions": "äē’动",
"notification_visibility_moves": "į”¨æˆˇčŋį§ģ",
"new_email": "æ–°é‚ŽįŽą",
"emoji_reactions_on_timeline": "在æ—ļ间įēŋ上昞į¤ēčĄ¨æƒ…įŦĻåˇäē’动",
"notification_setting_hide_notification_contents": "éšč—æŽ¨é€é€šįŸĨä¸­įš„å‘é€č€…ä¸Žå†…åŽšäŋĄæ¯",
"notification_setting_block_from_strangers": "åąč”ŊæĨč‡ĒäŊ æ˛Ąæœ‰å…ŗæŗ¨įš„į”¨æˆˇįš„é€šįŸĨ",
"type_domains_to_mute": "搜į´ĸ需čĻéšč—įš„åŸŸå",
"useStreamingApi": "厞æ—ļæŽĨæ”ļ帖子和通įŸĨ",
"user_mutes": "į”¨æˆˇ",
"reset_background_confirm": "æ‚¨įĄŽåŽščĻé‡įŊŽä¸Ēäēēčĩ„æ–™čƒŒæ™¯å›žå—īŧŸ",
"reset_banner_confirm": "æ‚¨įĄŽåŽščĻé‡įŊŽæ¨Ēåš…å›žį‰‡å—īŧŸ",
"reset_avatar_confirm": "æ‚¨įĄŽåŽščĻé‡įŊŽå¤´åƒå—īŧŸ",
"reset_profile_banner": "重įŊŽæ¨Ēåš…å›žį‰‡",
"reset_profile_background": "重įŊŽä¸Ēäēēčĩ„æ–™čƒŒæ™¯å›ž",
"reset_avatar": "重įŊŽå¤´åƒ",
"hide_followers_count_description": "不昞į¤ēå…ŗæŗ¨č€…æ•°é‡",
"profile_fields": {
"value": "内厚",
"name": "æ ‡į­ž",
"add_field": "æˇģ加字æŽĩ",
"label": "ä¸Ēäēēčĩ„料元数捎"
},
"accent": "åŧē调色",
"pad_emoji": "äģŽčĄ¨æƒ…įŦĻåˇé€‰æ‹Šå™¨æ’å…ĨčĄ¨æƒ…įŦĻåˇæ—ļīŧŒåœ¨čĄ¨æƒ…两䞧插å…ĨįŠēæ ŧ",
"discoverable": "å…čŽ¸é€ščŋ‡æœį´ĸæŖ€į´ĸį­‰æœåŠĄæ‰žåˆ°æ­¤č´Ļåˇ",
"mutes_and_blocks": "éšč—ä¸Žåąč”Ŋ",
"bot": "čŋ™æ˜¯ä¸€ä¸Ēæœē器äēēč´Ļåˇ",
"fun": "čļŖå‘ŗ",
"useStreamingApiWarning": "īŧˆä¸æŽ¨čäŊŋᔍīŧŒč¯•éĒŒæ€§īŧŒåˇ˛įŸĨäŧščˇŗčŋ‡ä¸€äē›å¸–子īŧ‰",
"chatMessageRadius": "čŠå¤Šæļˆæ¯",
"greentext": "Meme įŽ­å¤´",
"virtual_scrolling": "äŧ˜åŒ–æ—ļ间įēŋæ¸˛æŸ“",
"import_mutes_from_a_csv_file": "äģŽ csv 文äģļå¯ŧå…Ĩéšč—åå•",
"mutes_imported": "éšč—åå•å¯ŧå…Ĩ成功īŧå¤„ᐆåރäģŦ将需čρ䏀æŽĩæ—ļ间。",
"mute_import_error": "å¯ŧå…Ĩéšč—åå•å‡ē错",
"mute_import": "éšč—åå•å¯ŧå…Ĩ",
"mute_export_button": "å¯ŧå‡ēäŊ įš„éšč—åå•åˆ°ä¸€ä¸Ē csv 文äģļ",
"mute_export": "éšč—åå•å¯ŧå‡ē"
},
"time": {
"day": "{0} 夊",
"days": "{0} 夊",
"day_short": "{0}d",
"days_short": "{0}d",
"hour": "{0} 小æ—ļ",
"hours": "{0} 小æ—ļ",
"hour_short": "{0}h",
"hours_short": "{0}h",
"in_future": "čŋ˜æœ‰ {0}",
"in_past": "{0} 䚋前",
"minute": "{0} 分钟",
"minutes": "{0} 分钟",
"minute_short": "{0}min",
"minutes_short": "{0}min",
"month": "{0} 月",
"months": "{0} 月",
"month_short": "{0}mo",
"months_short": "{0}mo",
"now": "刚刚",
"now_short": "刚刚",
"second": "{0} į§’",
"seconds": "{0} į§’",
"second_short": "{0}s",
"seconds_short": "{0}s",
"week": "{0} 周",
"weeks": "{0} 周",
"week_short": "{0}w",
"weeks_short": "{0}w",
"year": "{0} åš´",
"years": "{0} åš´",
"year_short": "{0}y",
"years_short": "{0}y"
},
"timeline": {
"collapse": "折叠",
"conversation": "å¯šč¯",
"error_fetching": "čŽˇå–æ›´æ–°æ—ļå‘į”Ÿé”™č¯¯",
"load_older": "加čŊŊæ›´æ—Šįš„įŠļ态",
"no_retweet_hint": "čŋ™æĄå†…厚äģ…å…ŗæŗ¨č€…å¯č§īŧŒæˆ–č€…æ˜¯į§äŋĄīŧŒå› æ­¤ä¸čƒŊčŊŦ发。",
"repeated": "厞čŊŦ发",
"show_new": "昞į¤ē新内厚",
"up_to_date": "åˇ˛æ˜¯æœ€æ–°",
"no_more_statuses": "æ˛Ąæœ‰æ›´å¤šįš„įŠļ态",
"no_statuses": "æ˛Ąæœ‰įŠļ态更新",
"reload": "重新čŊŊå…Ĩ"
},
"status": {
"favorites": "æ”ļ藏",
"repeats": "čŊŦ发",
"delete": "删除įŠļ态",
"pin": "在ä¸Ēäēēčĩ„æ–™įŊŽéĄļ",
"unpin": "取æļˆåœ¨ä¸Ēäēēčĩ„æ–™įŊŽéĄļ",
"pinned": "įŊŽéĄļ",
"delete_confirm": "äŊ įœŸįš„æƒŗčĻåˆ é™¤čŋ™æĄįŠļ态吗īŧŸ",
"reply_to": "回复",
"replies_list": "回复īŧš",
"mute_conversation": "éšč—å¯šč¯",
"unmute_conversation": "å¯šč¯å–æļˆéšč—",
"hide_content": "éšč—å†…åŽš",
"show_content": "昞į¤ē内厚",
"hide_full_subject": "éšč—æ­¤éƒ¨åˆ†æ ‡éĸ˜",
"show_full_subject": "昞į¤ē全部标éĸ˜",
"thread_muted": "æ­¤įŗģ列æļˆæ¯åˇ˛čĸĢ隐藏",
"copy_link": "复åˆļįŠļ态铞æŽĨ",
"status_unavailable": "įŠļ态不可取垗",
"unbookmark": "取æļˆäšĻį­ž",
"bookmark": "äšĻį­ž",
"thread_muted_and_words": "īŧŒåĢ有čŋ‡æģ¤č¯īŧš",
"status_deleted": "č¯ĨįŠļæ€åˇ˛čĸĢ删除"
},
"user_card": {
"approve": "å…čŽ¸",
"block": "åąč”Ŋ",
"blocked": "åˇ˛åąč”Ŋīŧ",
"deny": "拒įģ",
"favorites": "æ”ļ藏",
"follow": "å…ŗæŗ¨",
"follow_sent": "č¯ˇæą‚åˇ˛å‘é€īŧ",
"follow_progress": "č¯ˇæą‚ä¸­",
"follow_again": "再æŦĄå‘é€č¯ˇæą‚īŧŸ",
"follow_unfollow": "取æļˆå…ŗæŗ¨",
"followees": "æ­Ŗåœ¨å…ŗæŗ¨",
"followers": "å…ŗæŗ¨č€…",
"following": "æ­Ŗåœ¨å…ŗæŗ¨īŧ",
"follows_you": "å…ŗæŗ¨äē†äŊ īŧ",
"its_you": "å°ąæ˜¯äŊ īŧ!",
"media": "åĒ’äŊ“",
"mute": "隐藏",
"muted": "åˇ˛éšč—",
"per_day": "每夊",
"remote_follow": "表įĢ™å…ŗæŗ¨",
"report": "æŠĨ告",
"statuses": "įŠļ态",
"subscribe": "čŽĸ阅",
"unsubscribe": "退čŽĸ",
"unblock": "取æļˆåąč”Ŋ",
"unblock_progress": "æ­Ŗåœ¨å–æļˆåąč”Ŋâ€Ļ",
"block_progress": "æ­Ŗåœ¨åąč”Ŋâ€Ļ",
"unmute": "取æļˆéšč—",
"unmute_progress": "取æļˆéšč—ä¸­â€Ļ",
"mute_progress": "隐藏中â€Ļ",
"admin_menu": {
"moderation": "权限",
"grant_admin": "čĩ‹äēˆįŽĄį†æƒé™",
"revoke_admin": "æ’¤é”€įŽĄį†æƒé™",
- "grant_moderator": "čĩ‹äēˆį‰ˆä¸ģ权限",
- "revoke_moderator": "æ’¤é”€į‰ˆä¸ģ权限",
+ "grant_moderator": "čĩ‹äēˆį›‘察员权限",
+ "revoke_moderator": "æ’¤é”€į›‘å¯Ÿå‘˜æƒé™",
"activate_account": "æŋ€æ´ģč´Ļåˇ",
"deactivate_account": "å…ŗé—­č´Ļåˇ",
"delete_account": "删除č´Ļåˇ",
"force_nsfw": "æ ‡čŽ°æ‰€æœ‰įš„å¸–å­éƒŊ是 - åˇĨäŊœåœē合不适",
"strip_media": "äģŽå¸–子里删除åĒ’äŊ“æ–‡äģļ",
"force_unlisted": "åŧēåˆļ帖子ä¸ē不å…Ŧåŧ€",
"sandbox": "åŧēåˆļ帖子ä¸ēåĒæœ‰å…ŗæŗ¨č€…å¯įœ‹",
"disable_remote_subscription": "įρæ­ĸäģŽčŋœį¨‹åŽžäž‹å…ŗæŗ¨į”¨æˆˇ",
"disable_any_subscription": "厌全įρæ­ĸå…ŗæŗ¨į”¨æˆˇ",
"quarantine": "äģŽč”合厞䞋中įρæ­ĸį”¨æˆˇå¸–å­",
"delete_user": "åˆ é™¤į”¨æˆˇ",
"delete_user_confirmation": "äŊ įĄŽåŽšå—īŧŸæ­¤æ“äŊœæ— æŗ•撤销。"
},
"hidden": "åˇ˛éšč—",
"show_repeats": "昞į¤ēčŊŦ发",
"hide_repeats": "隐藏čŊŦ发",
"message": "æļˆæ¯",
"mention": "提及"
},
"user_profile": {
"timeline_title": "į”¨æˆˇæ—ļ间įēŋ",
"profile_does_not_exist": "æŠąæ­‰īŧŒæ­¤ä¸Ēäēēčĩ„料不存在。",
"profile_loading_error": "æŠąæ­‰īŧŒčŊŊå…Ĩä¸Ēäēēčĩ„æ–™æ—ļå‡ē错。"
},
"user_reporting": {
"title": "æŠĨ告 {0}",
- "add_comment_description": "æ­¤æŠĨ告äŧšå‘送į왿‚¨įš„åŽžäž‹įŽĄį†å‘˜ã€‚æ‚¨å¯äģĨ在下éĸ提䞛更多č¯Ļįģ†äŋĄæ¯č§Ŗé‡ŠæŠĨå‘Šįš„įŧ˜į”ąīŧš",
+ "add_comment_description": "æ­¤æŠĨ告äŧšå‘送į왿‚¨įš„åŽžäž‹į›‘å¯Ÿå‘˜ã€‚æ‚¨å¯äģĨ在下éĸ提䞛更多č¯Ļįģ†äŋĄæ¯č§Ŗé‡ŠæŠĨå‘Šįš„įŧ˜į”ąīŧš",
"additional_comments": "å…ļ厃äŋĄæ¯",
"forward_description": "čŋ™ä¸Ēč´Ļåˇæ˜¯äģŽåĻ外一ä¸ĒæœåŠĄå™¨ã€‚åŒæ—ļ发送一ä¸Ē副æœŦåˆ°é‚Ŗé‡ŒīŧŸ",
"forward_to": "čŊŦ发 {0}",
"submit": "提äē¤",
"generic_error": "åŊ“å¤„į†æ‚¨įš„č¯ˇæą‚æ—ļīŧŒå‘į”Ÿäē†ä¸€ä¸Ēé”™č¯¯ã€‚"
},
"who_to_follow": {
"more": "更多",
"who_to_follow": "æŽ¨čå…ŗæŗ¨"
},
"tool_tip": {
"media_upload": "上äŧ å¤šåĒ’äŊ“",
"repeat": "čŊŦ发",
"reply": "回复",
"favorite": "æ”ļ藏",
"user_settings": "į”¨æˆˇčŽžįŊŽ",
"reject_follow_request": "拒įģå…ŗæŗ¨č¯ˇæą‚",
"add_reaction": "æˇģ加äē’动",
"bookmark": "äšĻį­ž",
"accept_follow_request": "æŽĨå—å…ŗæŗ¨č¯ˇæą‚"
},
"upload": {
"error": {
"base": "上äŧ ä¸æˆåŠŸã€‚",
"file_too_big": "文äģļå¤Ē大äē† [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",
"default": "čŋŸäē›å†č¯•"
},
"file_size_units": {
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB"
}
},
"search": {
"people": "äēē",
"hashtags": "č¯éĸ˜æ ‡į­ž",
"person_talking": "{count} äēēæ­Ŗåœ¨čލčŽē",
"people_talking": "{count} äēēæ­Ŗåœ¨čލčŽē",
"no_results": "æ˛Ąæœ‰æœį´ĸį쓿žœ"
},
"password_reset": {
"forgot_password": "åŋ˜čް坆᠁äē†īŧŸ",
"password_reset": "重įŊŽå¯†į ",
"instruction": "输å…Ĩæ‚¨įš„į”ĩé‚Žåœ°å€æˆ–č€…į”¨æˆˇåīŧŒæˆ‘äģŦ将发送一ä¸Ē链æŽĨåˆ°æ‚¨įš„é‚ŽįŽąīŧŒį”¨äēŽé‡įŊŽå¯†į ã€‚",
"placeholder": "æ‚¨įš„į”ĩé‚Žåœ°å€æˆ–č€…į”¨æˆˇå",
"check_email": "æŖ€æŸĨæ‚¨įš„é‚ŽįŽąīŧŒäŧšæœ‰ä¸€ä¸Ē链æŽĨᔍäēŽé‡įŊŽå¯†į ã€‚",
"return_home": "回到éĻ–éĄĩ",
"too_many_requests": "æ‚¨čžžåˆ°äē†å°č¯•æŦĄæ•°įš„上限īŧŒč¯ˇį¨åŽå†č¯•。",
"password_reset_disabled": "å¯†į é‡įŊŽåˇ˛čĸĢįĻį”¨ã€‚č¯ˇč”įŗģæ‚¨įš„åŽžäž‹įŽĄį†å‘˜ã€‚",
"password_reset_required_but_mailer_is_disabled": "您åŋ…éĄģ重įŊŽå¯†į īŧŒäŊ†æ˜¯å¯†į é‡įŊŽčĸĢįρᔍäē†ã€‚蝎联įŗģæ‚¨æ‰€åœ¨åŽžäž‹įš„įŽĄį†å‘˜ã€‚",
"password_reset_required": "您åŋ…éĄģ重įŊŽå¯†į æ‰čƒŊį™ģ陆。"
},
"remote_user_resolver": {
"error": "æœĒ扞到。",
"searching_for": "搜į´ĸ",
"remote_user_resolver": "čŋœį¨‹į”¨æˆˇč§Ŗæžå™¨"
},
"emoji": {
"keep_open": "选拊器äŋæŒæ‰“åŧ€",
"stickers": "č´´įē¸",
"unicode": "Unicode čĄ¨æƒ…įŦĻåˇ",
"custom": "č‡ĒåŽšäš‰čĄ¨æƒ…įŦĻåˇ",
"add_emoji": "插å…ĨčĄ¨æƒ…įŦĻåˇ",
"search_emoji": "搜į´ĸčĄ¨æƒ…įŦĻåˇ",
"emoji": "čĄ¨æƒ…įŦĻåˇ",
"load_all": "加čŊŊæ‰€æœ‰čĄ¨æƒ…įŦĻåˇīŧˆå…ą {emojiAmount} ä¸Ēīŧ‰",
"load_all_hint": "最先加čŊŊįš„ {saneAmount} čĄ¨æƒ…įŦĻåˇīŧŒåŠ čŊŊå…¨éƒ¨čĄ¨æƒ…įŦĻåˇå¯čƒŊäŧšå¸ĻæĨ性čƒŊ问éĸ˜ã€‚"
},
"about": {
"mrf": {
"simple": {
"quarantine_desc": "æœŦ厞䞋向äģĨ下厞䞋äģ…发送å…Ŧåŧ€įš„帖子īŧš",
"quarantine": "隔įĻģ",
"reject_desc": "æœŦ厞䞋不äŧšæŽĨæ”ļæĨč‡Ēä¸‹åˆ—åŽžäž‹įš„æļˆæ¯īŧš",
"reject": "拒įģ",
"accept_desc": "æœŦ厞䞋åĒæŽĨæ”ļæĨč‡Ēä¸‹åˆ—åŽžäž‹įš„æļˆæ¯īŧš",
"simple_policies": "寚äēŽį‰šåŽšåŽžäž‹įš„į­–į•Ĩ",
"accept": "æŽĨ受",
"media_removal": "į§ģ除åĒ’äŊ“",
"media_nsfw_desc": "æœŦ厞䞋将æĨč‡ĒäģĨä¸‹åŽžäž‹įš„åĒ’äŊ“内厚åŧēåˆļ莞įŊŽä¸ē敏感内厚īŧš",
"media_nsfw": "åŧēåˆļ莞įŊŽåĒ’äŊ“ä¸ē敏感内厚",
"media_removal_desc": "æœŦ厞䞋į§ģ除æĨč‡ĒäģĨä¸‹åŽžäž‹įš„åĒ’äŊ“内厚īŧš",
"ftl_removal_desc": "č¯Ĩ厞䞋在äģŽâ€œå…¨éƒ¨åˇ˛įŸĨįŊ‘įģœâ€æ—ļ间įēŋ上į§ģ除äē†ä¸‹åˆ—厞䞋īŧš",
"ftl_removal": "äģŽâ€œå…¨éƒ¨åˇ˛įŸĨįŊ‘įģœâ€æ—ļ间įēŋ上į§ģ除"
},
"mrf_policies_desc": "MRF į­–į•ĨäŧšåŊąå“æœŦåŽžäž‹įš„äē’é€ščĄŒä¸ē。äģĨ䏋᭖į•Ĩ厞吝ᔍīŧš",
"mrf_policies": "åˇ˛å¯åŠ¨įš„ MRF į­–į•Ĩ",
"keyword": {
"ftl_removal": "äģŽâ€œå…¨éƒ¨åˇ˛įŸĨįŊ‘įģœâ€æ—ļ间įēŋ上į§ģ除",
"keyword_policies": "å…ŗé”Žč¯į­–į•Ĩ",
"is_replaced_by": "→",
"replace": "æ›ŋæĸ",
"reject": "拒įģ"
},
"federation": "联é‚Ļäē’通"
},
"staff": "įŽĄį†äēē员"
},
"domain_mute_card": {
"unmute_progress": "æ­Ŗåœ¨å–æļˆéšč—â€Ļ",
"unmute": "取æļˆéšč—",
"mute_progress": "隐藏中â€Ļ",
"mute": "隐藏"
},
"errors": {
"storage_unavailable": "Pleroma æ— æŗ•čŽŋ问æĩč§ˆå™¨å‚¨å­˜ã€‚æ‚¨įš„į™ģ陆名äģĨ及æœŦåœ°čŽžįŊŽå°†ä¸äŧščĸĢäŋå­˜īŧŒæ‚¨å¯čƒŊ遇到意外闎éĸ˜ã€‚č¯ˇå°č¯•å¯į”¨ cookies。"
},
"shoutbox": {
"title": "ᕙ荀æŋ"
},
"display_date": {
"today": "äģŠå¤Š"
},
"file_type": {
"file": "文äģļ",
"image": "å›žį‰‡",
"video": "视éĸ‘",
"audio": "韺éĸ‘"
},
"chats": {
"empty_chat_list_placeholder": "您čŋ˜æ˛Ąæœ‰äģģäŊ•čŠå¤ŠčްåŊ•。åŧ€å§‹čŠå¤Šå§īŧ",
"error_sending_message": "发送æļˆæ¯æ—ļå‡ēäē†į‚šé—Žéĸ˜ã€‚",
"error_loading_chat": "加čŊŊčŠå¤Šæ—ļå‡ēäē†į‚šé—Žéĸ˜ã€‚",
"delete_confirm": "æ‚¨įĄŽåŽžčĻåˆ é™¤æ­¤æļˆæ¯å—īŧŸ",
"more": "更多",
"empty_message_error": "æ— æŗ•å‘å¸ƒįŠēæļˆæ¯",
"new": "æ–°čŠå¤Š",
"chats": "čŠå¤Š",
"delete": "删除",
"message_user": "发æļˆæ¯įģ™ {nickname}",
"you": "äŊ īŧš"
}
}
diff --git a/src/modules/statuses.js b/src/modules/statuses.js
index e673141d48..33c68c57c1 100644
--- a/src/modules/statuses.js
+++ b/src/modules/statuses.js
@@ -1,771 +1,750 @@
import {
remove,
slice,
each,
findIndex,
find,
maxBy,
minBy,
merge,
first,
last,
isArray,
omitBy
} from 'lodash'
import { set } from 'vue'
import { isStatusNotification, maybeShowNotification } from '../services/notification_utils/notification_utils.js'
import apiService from '../services/api/api.service.js'
const emptyTl = (userId = 0) => ({
statuses: [],
statusesObject: {},
faves: [],
visibleStatuses: [],
visibleStatusesObject: {},
newStatusCount: 0,
maxId: 0,
minId: 0,
minVisibleId: 0,
loading: false,
followers: [],
friends: [],
userId,
flushMarker: 0
})
const emptyNotifications = () => ({
desktopNotificationSilence: true,
maxId: 0,
minId: Number.POSITIVE_INFINITY,
data: [],
idStore: {},
- loading: false,
- error: false
+ loading: false
})
export const defaultState = () => ({
allStatuses: [],
allStatusesObject: {},
conversationsObject: {},
maxId: 0,
notifications: emptyNotifications(),
favorites: new Set(),
- error: false,
- errorData: null,
timelines: {
mentions: emptyTl(),
public: emptyTl(),
user: emptyTl(),
favorites: emptyTl(),
media: emptyTl(),
publicAndExternal: emptyTl(),
friends: emptyTl(),
tag: emptyTl(),
dms: emptyTl(),
bookmarks: emptyTl()
}
})
export const prepareStatus = (status) => {
// Set deleted flag
status.deleted = false
// To make the array reactive
status.attachments = status.attachments || []
return status
}
const mergeOrAdd = (arr, obj, item) => {
const oldItem = obj[item.id]
if (oldItem) {
// We already have this, so only merge the new info.
// We ignore null values to avoid overwriting existing properties with missing data
// we also skip 'user' because that is handled by users module
merge(oldItem, omitBy(item, (v, k) => v === null || k === 'user'))
// Reactivity fix.
oldItem.attachments.splice(oldItem.attachments.length)
return { item: oldItem, new: false }
} else {
// This is a new item, prepare it
prepareStatus(item)
arr.push(item)
set(obj, item.id, item)
return { item, new: true }
}
}
const sortById = (a, b) => {
const seqA = Number(a.id)
const seqB = Number(b.id)
const isSeqA = !Number.isNaN(seqA)
const isSeqB = !Number.isNaN(seqB)
if (isSeqA && isSeqB) {
return seqA > seqB ? -1 : 1
} else if (isSeqA && !isSeqB) {
return 1
} else if (!isSeqA && isSeqB) {
return -1
} else {
return a.id > b.id ? -1 : 1
}
}
const sortTimeline = (timeline) => {
timeline.visibleStatuses = timeline.visibleStatuses.sort(sortById)
timeline.statuses = timeline.statuses.sort(sortById)
timeline.minVisibleId = (last(timeline.visibleStatuses) || {}).id
return timeline
}
// Add status to the global storages (arrays and objects maintaining statuses) except timelines
const addStatusToGlobalStorage = (state, data) => {
const result = mergeOrAdd(state.allStatuses, state.allStatusesObject, data)
if (result.new) {
// Add to conversation
const status = result.item
const conversationsObject = state.conversationsObject
const conversationId = status.statusnet_conversation_id
if (conversationsObject[conversationId]) {
conversationsObject[conversationId].push(status)
} else {
set(conversationsObject, conversationId, [status])
}
}
return result
}
// Remove status from the global storages (arrays and objects maintaining statuses) except timelines
const removeStatusFromGlobalStorage = (state, status) => {
remove(state.allStatuses, { id: status.id })
// TODO: Need to remove from allStatusesObject?
// Remove possible notification
remove(state.notifications.data, ({ action: { id } }) => id === status.id)
// Remove from conversation
const conversationId = status.statusnet_conversation_id
if (state.conversationsObject[conversationId]) {
remove(state.conversationsObject[conversationId], { id: status.id })
}
}
const addNewStatuses = (state, { statuses, showImmediately = false, timeline, user = {}, noIdUpdate = false, userId, pagination = {} }) => {
// Sanity check
if (!isArray(statuses)) {
return false
}
const allStatuses = state.allStatuses
const timelineObject = state.timelines[timeline]
// Mismatch between API pagination and our internal minId/maxId tracking systems:
// pagination.maxId is the oldest of the returned statuses when fetching older,
// and pagination.minId is the newest when fetching newer. The names come directly
// from the arguments they're supposed to be passed as for the next fetch.
const minNew = pagination.maxId || (statuses.length > 0 ? minBy(statuses, 'id').id : 0)
const maxNew = pagination.minId || (statuses.length > 0 ? maxBy(statuses, 'id').id : 0)
const newer = timeline && (maxNew > timelineObject.maxId || timelineObject.maxId === 0) && statuses.length > 0
const older = timeline && (minNew < timelineObject.minId || timelineObject.minId === 0) && statuses.length > 0
if (!noIdUpdate && newer) {
timelineObject.maxId = maxNew
}
if (!noIdUpdate && older) {
timelineObject.minId = minNew
}
// This makes sure that user timeline won't get data meant for other
// user. I.e. opening different user profiles makes request which could
// return data late after user already viewing different user profile
if ((timeline === 'user' || timeline === 'media') && timelineObject.userId !== userId) {
return
}
const addStatus = (data, showImmediately, addToTimeline = true) => {
const result = addStatusToGlobalStorage(state, data)
const status = result.item
if (result.new) {
// We are mentioned in a post
if (status.type === 'status' && find(status.attentions, { id: user.id })) {
const mentions = state.timelines.mentions
// Add the mention to the mentions timeline
if (timelineObject !== mentions) {
mergeOrAdd(mentions.statuses, mentions.statusesObject, status)
mentions.newStatusCount += 1
sortTimeline(mentions)
}
}
if (status.visibility === 'direct') {
const dms = state.timelines.dms
mergeOrAdd(dms.statuses, dms.statusesObject, status)
dms.newStatusCount += 1
sortTimeline(dms)
}
}
// Decide if we should treat the status as new for this timeline.
let resultForCurrentTimeline
// Some statuses should only be added to the global status repository.
if (timeline && addToTimeline) {
resultForCurrentTimeline = mergeOrAdd(timelineObject.statuses, timelineObject.statusesObject, status)
}
if (timeline && showImmediately) {
// Add it directly to the visibleStatuses, don't change
// newStatusCount
mergeOrAdd(timelineObject.visibleStatuses, timelineObject.visibleStatusesObject, status)
} else if (timeline && addToTimeline && resultForCurrentTimeline.new) {
// Just change newStatuscount
timelineObject.newStatusCount += 1
}
return status
}
const favoriteStatus = (favorite, counter) => {
const status = find(allStatuses, { id: favorite.in_reply_to_status_id })
if (status) {
// This is our favorite, so the relevant bit.
if (favorite.user.id === user.id) {
status.favorited = true
} else {
status.fave_num += 1
}
}
return status
}
const processors = {
'status': (status) => {
addStatus(status, showImmediately)
},
'retweet': (status) => {
// RetweetedStatuses are never shown immediately
const retweetedStatus = addStatus(status.retweeted_status, false, false)
let retweet
// If the retweeted status is already there, don't add the retweet
// to the timeline.
if (timeline && find(timelineObject.statuses, (s) => {
if (s.retweeted_status) {
return s.id === retweetedStatus.id || s.retweeted_status.id === retweetedStatus.id
} else {
return s.id === retweetedStatus.id
}
})) {
// Already have it visible (either as the original or another RT), don't add to timeline, don't show.
retweet = addStatus(status, false, false)
} else {
retweet = addStatus(status, showImmediately)
}
retweet.retweeted_status = retweetedStatus
},
'favorite': (favorite) => {
// Only update if this is a new favorite.
// Ignore our own favorites because we get info about likes as response to like request
if (!state.favorites.has(favorite.id)) {
state.favorites.add(favorite.id)
favoriteStatus(favorite)
}
},
'deletion': (deletion) => {
const uri = deletion.uri
const status = find(allStatuses, { uri })
if (!status) {
return
}
removeStatusFromGlobalStorage(state, status)
if (timeline) {
remove(timelineObject.statuses, { uri })
remove(timelineObject.visibleStatuses, { uri })
}
},
'follow': (follow) => {
// NOOP, it is known status but we don't do anything about it for now
},
'default': (unknown) => {
console.log('unknown status type')
console.log(unknown)
}
}
each(statuses, (status) => {
const type = status.type
const processor = processors[type] || processors['default']
processor(status)
})
// Keep the visible statuses sorted
if (timeline && !(timeline === 'bookmarks')) {
sortTimeline(timelineObject)
}
}
const addNewNotifications = (state, { dispatch, notifications, older, visibleNotificationTypes, rootGetters, newNotificationSideEffects }) => {
each(notifications, (notification) => {
if (isStatusNotification(notification.type)) {
notification.action = addStatusToGlobalStorage(state, notification.action).item
notification.status = notification.status && addStatusToGlobalStorage(state, notification.status).item
}
if (notification.type === 'pleroma:emoji_reaction') {
dispatch('fetchEmojiReactionsBy', notification.status.id)
}
// Only add a new notification if we don't have one for the same action
if (!state.notifications.idStore.hasOwnProperty(notification.id)) {
state.notifications.maxId = notification.id > state.notifications.maxId
? notification.id
: state.notifications.maxId
state.notifications.minId = notification.id < state.notifications.minId
? notification.id
: state.notifications.minId
state.notifications.data.push(notification)
state.notifications.idStore[notification.id] = notification
newNotificationSideEffects(notification)
} else if (notification.seen) {
state.notifications.idStore[notification.id].seen = true
}
})
}
const removeStatus = (state, { timeline, userId }) => {
const timelineObject = state.timelines[timeline]
if (userId) {
remove(timelineObject.statuses, { user: { id: userId } })
remove(timelineObject.visibleStatuses, { user: { id: userId } })
timelineObject.minVisibleId = timelineObject.visibleStatuses.length > 0 ? last(timelineObject.visibleStatuses).id : 0
timelineObject.maxId = timelineObject.statuses.length > 0 ? first(timelineObject.statuses).id : 0
}
}
export const mutations = {
addNewStatuses,
addNewNotifications,
removeStatus,
showNewStatuses (state, { timeline }) {
const oldTimeline = (state.timelines[timeline])
oldTimeline.newStatusCount = 0
oldTimeline.visibleStatuses = slice(oldTimeline.statuses, 0, 50)
oldTimeline.minVisibleId = last(oldTimeline.visibleStatuses).id
oldTimeline.minId = oldTimeline.minVisibleId
oldTimeline.visibleStatusesObject = {}
each(oldTimeline.visibleStatuses, (status) => { oldTimeline.visibleStatusesObject[status.id] = status })
},
resetStatuses (state) {
const emptyState = defaultState()
Object.entries(emptyState).forEach(([key, value]) => {
state[key] = value
})
},
clearTimeline (state, { timeline, excludeUserId = false }) {
const userId = excludeUserId ? state.timelines[timeline].userId : undefined
state.timelines[timeline] = emptyTl(userId)
},
clearNotifications (state) {
state.notifications = emptyNotifications()
},
setFavorited (state, { status, value }) {
const newStatus = state.allStatusesObject[status.id]
if (newStatus.favorited !== value) {
if (value) {
newStatus.fave_num++
} else {
newStatus.fave_num--
}
}
newStatus.favorited = value
},
setFavoritedConfirm (state, { status, user }) {
const newStatus = state.allStatusesObject[status.id]
newStatus.favorited = status.favorited
newStatus.fave_num = status.fave_num
const index = findIndex(newStatus.favoritedBy, { id: user.id })
if (index !== -1 && !newStatus.favorited) {
newStatus.favoritedBy.splice(index, 1)
} else if (index === -1 && newStatus.favorited) {
newStatus.favoritedBy.push(user)
}
},
setMutedStatus (state, status) {
const newStatus = state.allStatusesObject[status.id]
newStatus.thread_muted = status.thread_muted
if (newStatus.thread_muted !== undefined) {
state.conversationsObject[newStatus.statusnet_conversation_id].forEach(status => { status.thread_muted = newStatus.thread_muted })
}
},
setRetweeted (state, { status, value }) {
const newStatus = state.allStatusesObject[status.id]
if (newStatus.repeated !== value) {
if (value) {
newStatus.repeat_num++
} else {
newStatus.repeat_num--
}
}
newStatus.repeated = value
},
setRetweetedConfirm (state, { status, user }) {
const newStatus = state.allStatusesObject[status.id]
newStatus.repeated = status.repeated
newStatus.repeat_num = status.repeat_num
const index = findIndex(newStatus.rebloggedBy, { id: user.id })
if (index !== -1 && !newStatus.repeated) {
newStatus.rebloggedBy.splice(index, 1)
} else if (index === -1 && newStatus.repeated) {
newStatus.rebloggedBy.push(user)
}
},
setBookmarked (state, { status, value }) {
const newStatus = state.allStatusesObject[status.id]
newStatus.bookmarked = value
},
setBookmarkedConfirm (state, { status }) {
const newStatus = state.allStatusesObject[status.id]
newStatus.bookmarked = status.bookmarked
},
setDeleted (state, { status }) {
const newStatus = state.allStatusesObject[status.id]
if (newStatus) newStatus.deleted = true
},
setManyDeleted (state, condition) {
Object.values(state.allStatusesObject).forEach(status => {
if (condition(status)) {
status.deleted = true
}
})
},
setLoading (state, { timeline, value }) {
state.timelines[timeline].loading = value
},
setNsfw (state, { id, nsfw }) {
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
},
markNotificationsAsSeen (state) {
each(state.notifications.data, (notification) => {
notification.seen = true
})
},
markSingleNotificationAsSeen (state, { id }) {
const notification = find(state.notifications.data, n => n.id === id)
if (notification) notification.seen = true
},
dismissNotification (state, { id }) {
state.notifications.data = state.notifications.data.filter(n => n.id !== id)
},
dismissNotifications (state, { finder }) {
state.notifications.data = state.notifications.data.filter(n => finder)
},
updateNotification (state, { id, updater }) {
const notification = find(state.notifications.data, n => n.id === id)
notification && updater(notification)
},
queueFlush (state, { timeline, id }) {
state.timelines[timeline].flushMarker = id
},
queueFlushAll (state) {
Object.keys(state.timelines).forEach((timeline) => {
state.timelines[timeline].flushMarker = state.timelines[timeline].maxId
})
},
addRepeats (state, { id, rebloggedByUsers, currentUser }) {
const newStatus = state.allStatusesObject[id]
newStatus.rebloggedBy = rebloggedByUsers.filter(_ => _)
// repeats stats can be incorrect based on polling condition, let's update them using the most recent data
newStatus.repeat_num = newStatus.rebloggedBy.length
newStatus.repeated = !!newStatus.rebloggedBy.find(({ id }) => currentUser.id === id)
},
addFavs (state, { id, favoritedByUsers, currentUser }) {
const newStatus = state.allStatusesObject[id]
newStatus.favoritedBy = favoritedByUsers.filter(_ => _)
// favorites stats can be incorrect based on polling condition, let's update them using the most recent data
newStatus.fave_num = newStatus.favoritedBy.length
newStatus.favorited = !!newStatus.favoritedBy.find(({ id }) => currentUser.id === id)
},
addEmojiReactionsBy (state, { id, emojiReactions, currentUser }) {
const status = state.allStatusesObject[id]
set(status, 'emoji_reactions', emojiReactions)
},
addOwnReaction (state, { id, emoji, currentUser }) {
const status = state.allStatusesObject[id]
const reactionIndex = findIndex(status.emoji_reactions, { name: emoji })
const reaction = status.emoji_reactions[reactionIndex] || { name: emoji, count: 0, accounts: [] }
const newReaction = {
...reaction,
count: reaction.count + 1,
me: true,
accounts: [
...reaction.accounts,
currentUser
]
}
// Update count of existing reaction if it exists, otherwise append at the end
if (reactionIndex >= 0) {
set(status.emoji_reactions, reactionIndex, newReaction)
} else {
set(status, 'emoji_reactions', [...status.emoji_reactions, newReaction])
}
},
removeOwnReaction (state, { id, emoji, currentUser }) {
const status = state.allStatusesObject[id]
const reactionIndex = findIndex(status.emoji_reactions, { name: emoji })
if (reactionIndex < 0) return
const reaction = status.emoji_reactions[reactionIndex]
const accounts = reaction.accounts || []
const newReaction = {
...reaction,
count: reaction.count - 1,
me: false,
accounts: accounts.filter(acc => acc.id !== currentUser.id)
}
if (newReaction.count > 0) {
set(status.emoji_reactions, reactionIndex, newReaction)
} else {
set(status, 'emoji_reactions', status.emoji_reactions.filter(r => r.name !== emoji))
}
},
updateStatusWithPoll (state, { id, poll }) {
const status = state.allStatusesObject[id]
status.poll = poll
},
setVirtualHeight (state, { statusId, height }) {
state.allStatusesObject[statusId].virtualHeight = height
}
}
const statuses = {
state: defaultState(),
actions: {
addNewStatuses ({ rootState, commit }, { statuses, showImmediately = false, timeline = false, noIdUpdate = false, userId, pagination }) {
commit('addNewStatuses', { statuses, showImmediately, timeline, noIdUpdate, user: rootState.users.currentUser, userId, pagination })
},
addNewNotifications (store, { notifications, older }) {
const { commit, dispatch, rootGetters } = store
const newNotificationSideEffects = (notification) => {
maybeShowNotification(store, notification)
}
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 })
},
fetchStatus ({ rootState, dispatch }, id) {
return rootState.api.backendInteractor.fetchStatus({ id })
.then((status) => dispatch('addNewStatuses', { statuses: [status] }))
},
deleteStatus ({ rootState, commit }, status) {
commit('setDeleted', { status })
apiService.deleteStatus({ id: status.id, credentials: rootState.users.currentUser.credentials })
},
deleteStatusById ({ rootState, commit }, id) {
const status = rootState.statuses.allStatusesObject[id]
commit('setDeleted', { status })
},
markStatusesAsDeleted ({ commit }, condition) {
commit('setManyDeleted', condition)
},
favorite ({ rootState, commit }, status) {
// Optimistic favoriting...
commit('setFavorited', { status, value: true })
rootState.api.backendInteractor.favorite({ id: status.id })
.then(status => commit('setFavoritedConfirm', { status, user: rootState.users.currentUser }))
},
unfavorite ({ rootState, commit }, status) {
// Optimistic unfavoriting...
commit('setFavorited', { status, value: false })
rootState.api.backendInteractor.unfavorite({ id: status.id })
.then(status => commit('setFavoritedConfirm', { status, user: rootState.users.currentUser }))
},
fetchPinnedStatuses ({ rootState, dispatch }, userId) {
rootState.api.backendInteractor.fetchPinnedStatuses({ id: userId })
.then(statuses => dispatch('addNewStatuses', { statuses, timeline: 'user', userId, showImmediately: true, noIdUpdate: true }))
},
pinStatus ({ rootState, dispatch }, statusId) {
return rootState.api.backendInteractor.pinOwnStatus({ id: statusId })
.then((status) => dispatch('addNewStatuses', { statuses: [status] }))
},
unpinStatus ({ rootState, dispatch }, statusId) {
rootState.api.backendInteractor.unpinOwnStatus({ id: statusId })
.then((status) => dispatch('addNewStatuses', { statuses: [status] }))
},
muteConversation ({ rootState, commit }, statusId) {
return rootState.api.backendInteractor.muteConversation({ id: statusId })
.then((status) => commit('setMutedStatus', status))
},
unmuteConversation ({ rootState, commit }, statusId) {
return rootState.api.backendInteractor.unmuteConversation({ id: statusId })
.then((status) => commit('setMutedStatus', status))
},
retweet ({ rootState, commit }, status) {
// Optimistic retweeting...
commit('setRetweeted', { status, value: true })
rootState.api.backendInteractor.retweet({ id: status.id })
.then(status => commit('setRetweetedConfirm', { status: status.retweeted_status, user: rootState.users.currentUser }))
},
unretweet ({ rootState, commit }, status) {
// Optimistic unretweeting...
commit('setRetweeted', { status, value: false })
rootState.api.backendInteractor.unretweet({ id: status.id })
.then(status => commit('setRetweetedConfirm', { status, user: rootState.users.currentUser }))
},
bookmark ({ rootState, commit }, status) {
commit('setBookmarked', { status, value: true })
rootState.api.backendInteractor.bookmarkStatus({ id: status.id })
.then(status => {
commit('setBookmarkedConfirm', { status })
})
},
unbookmark ({ rootState, commit }, status) {
commit('setBookmarked', { status, value: false })
rootState.api.backendInteractor.unbookmarkStatus({ id: status.id })
.then(status => {
commit('setBookmarkedConfirm', { status })
})
},
queueFlush ({ rootState, commit }, { timeline, id }) {
commit('queueFlush', { timeline, id })
},
queueFlushAll ({ rootState, commit }) {
commit('queueFlushAll')
},
markNotificationsAsSeen ({ rootState, commit }) {
commit('markNotificationsAsSeen')
apiService.markNotificationsAsSeen({
id: rootState.statuses.notifications.maxId,
credentials: rootState.users.currentUser.credentials
})
},
markSingleNotificationAsSeen ({ rootState, commit }, { id }) {
commit('markSingleNotificationAsSeen', { id })
apiService.markNotificationsAsSeen({
single: true,
id,
credentials: rootState.users.currentUser.credentials
})
},
dismissNotificationLocal ({ rootState, commit }, { id }) {
commit('dismissNotification', { id })
},
dismissNotification ({ rootState, commit }, { id }) {
commit('dismissNotification', { id })
rootState.api.backendInteractor.dismissNotification({ id })
},
updateNotification ({ rootState, commit }, { id, updater }) {
commit('updateNotification', { id, updater })
},
fetchFavsAndRepeats ({ rootState, commit }, id) {
Promise.all([
rootState.api.backendInteractor.fetchFavoritedByUsers({ id }),
rootState.api.backendInteractor.fetchRebloggedByUsers({ id })
]).then(([favoritedByUsers, rebloggedByUsers]) => {
commit('addFavs', { id, favoritedByUsers, currentUser: rootState.users.currentUser })
commit('addRepeats', { id, rebloggedByUsers, currentUser: rootState.users.currentUser })
})
},
reactWithEmoji ({ rootState, dispatch, commit }, { id, emoji }) {
const currentUser = rootState.users.currentUser
if (!currentUser) return
commit('addOwnReaction', { id, emoji, currentUser })
rootState.api.backendInteractor.reactWithEmoji({ id, emoji }).then(
ok => {
dispatch('fetchEmojiReactionsBy', id)
}
)
},
unreactWithEmoji ({ rootState, dispatch, commit }, { id, emoji }) {
const currentUser = rootState.users.currentUser
if (!currentUser) return
commit('removeOwnReaction', { id, emoji, currentUser })
rootState.api.backendInteractor.unreactWithEmoji({ id, emoji }).then(
ok => {
dispatch('fetchEmojiReactionsBy', id)
}
)
},
fetchEmojiReactionsBy ({ rootState, commit }, id) {
rootState.api.backendInteractor.fetchEmojiReactions({ id }).then(
emojiReactions => {
commit('addEmojiReactionsBy', { id, emojiReactions, currentUser: rootState.users.currentUser })
}
)
},
fetchFavs ({ rootState, commit }, id) {
rootState.api.backendInteractor.fetchFavoritedByUsers({ id })
.then(favoritedByUsers => commit('addFavs', { id, favoritedByUsers, currentUser: rootState.users.currentUser }))
},
fetchRepeats ({ rootState, commit }, id) {
rootState.api.backendInteractor.fetchRebloggedByUsers({ id })
.then(rebloggedByUsers => commit('addRepeats', { id, rebloggedByUsers, currentUser: rootState.users.currentUser }))
},
search (store, { q, resolve, limit, offset, following }) {
return store.rootState.api.backendInteractor.search2({ q, resolve, limit, offset, following })
.then((data) => {
store.commit('addNewUsers', data.accounts)
store.commit('addNewStatuses', { statuses: data.statuses })
return data
})
},
setVirtualHeight ({ commit }, { statusId, height }) {
commit('setVirtualHeight', { statusId, height })
}
},
mutations
}
export default statuses
diff --git a/src/modules/users.js b/src/modules/users.js
index 9245db5c1e..655db4c7ed 100644
--- a/src/modules/users.js
+++ b/src/modules/users.js
@@ -1,588 +1,590 @@
import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js'
import oauthApi from '../services/new_api/oauth.js'
import { compact, map, each, mergeWith, last, concat, uniq, isArray } from 'lodash'
import { set } from 'vue'
import { registerPushNotifications, unregisterPushNotifications } from '../services/push/push.js'
// TODO: Unify with mergeOrAdd in statuses.js
export const mergeOrAdd = (arr, obj, item) => {
if (!item) { return false }
const oldItem = obj[item.id]
if (oldItem) {
// We already have this, so only merge the new info.
mergeWith(oldItem, item, mergeArrayLength)
return { item: oldItem, new: false }
} else {
// This is a new item, prepare it
arr.push(item)
set(obj, item.id, item)
if (item.screen_name && !item.screen_name.includes('@')) {
set(obj, item.screen_name.toLowerCase(), item)
}
return { item, new: true }
}
}
const mergeArrayLength = (oldValue, newValue) => {
if (isArray(oldValue) && isArray(newValue)) {
oldValue.length = newValue.length
return mergeWith(oldValue, newValue, mergeArrayLength)
}
}
const getNotificationPermission = () => {
const Notification = window.Notification
if (!Notification) return Promise.resolve(null)
if (Notification.permission === 'default') return Notification.requestPermission()
return Promise.resolve(Notification.permission)
}
const blockUser = (store, id) => {
return store.rootState.api.backendInteractor.blockUser({ id })
.then((relationship) => {
store.commit('updateUserRelationship', [relationship])
store.commit('addBlockId', id)
store.commit('removeStatus', { timeline: 'friends', userId: id })
store.commit('removeStatus', { timeline: 'public', userId: id })
store.commit('removeStatus', { timeline: 'publicAndExternal', userId: id })
})
}
const unblockUser = (store, id) => {
return store.rootState.api.backendInteractor.unblockUser({ id })
.then((relationship) => store.commit('updateUserRelationship', [relationship]))
}
const muteUser = (store, id) => {
const predictedRelationship = store.state.relationships[id] || { id }
predictedRelationship.muting = true
store.commit('updateUserRelationship', [predictedRelationship])
store.commit('addMuteId', id)
return store.rootState.api.backendInteractor.muteUser({ id })
.then((relationship) => {
store.commit('updateUserRelationship', [relationship])
store.commit('addMuteId', id)
})
}
const unmuteUser = (store, id) => {
const predictedRelationship = store.state.relationships[id] || { id }
predictedRelationship.muting = false
store.commit('updateUserRelationship', [predictedRelationship])
return store.rootState.api.backendInteractor.unmuteUser({ id })
.then((relationship) => store.commit('updateUserRelationship', [relationship]))
}
const hideReblogs = (store, userId) => {
return store.rootState.api.backendInteractor.followUser({ id: userId, reblogs: false })
.then((relationship) => {
store.commit('updateUserRelationship', [relationship])
})
}
const showReblogs = (store, userId) => {
return store.rootState.api.backendInteractor.followUser({ id: userId, reblogs: true })
.then((relationship) => store.commit('updateUserRelationship', [relationship]))
}
const muteDomain = (store, domain) => {
return store.rootState.api.backendInteractor.muteDomain({ domain })
.then(() => store.commit('addDomainMute', domain))
}
const unmuteDomain = (store, domain) => {
return store.rootState.api.backendInteractor.unmuteDomain({ domain })
.then(() => store.commit('removeDomainMute', domain))
}
export const mutations = {
tagUser (state, { user: { id }, tag }) {
const user = state.usersObject[id]
const tags = user.tags || []
const newTags = tags.concat([tag])
set(user, 'tags', newTags)
},
untagUser (state, { user: { id }, tag }) {
const user = state.usersObject[id]
const tags = user.tags || []
const newTags = tags.filter(t => t !== tag)
set(user, 'tags', newTags)
},
updateRight (state, { user: { id }, right, value }) {
const user = state.usersObject[id]
let newRights = user.rights
newRights[right] = value
set(user, 'rights', newRights)
},
updateActivationStatus (state, { user: { id }, deactivated }) {
const user = state.usersObject[id]
set(user, 'deactivated', deactivated)
},
setCurrentUser (state, user) {
state.lastLoginName = user.screen_name
state.currentUser = mergeWith(state.currentUser || {}, user, mergeArrayLength)
},
clearCurrentUser (state) {
state.currentUser = false
state.lastLoginName = false
},
beginLogin (state) {
state.loggingIn = true
},
endLogin (state) {
state.loggingIn = false
},
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.
clearFriends (state, userId) {
const user = state.usersObject[userId]
if (user) {
set(user, 'friendIds', [])
}
},
clearFollowers (state, userId) {
const user = state.usersObject[userId]
if (user) {
set(user, 'followerIds', [])
}
},
addNewUsers (state, users) {
each(users, (user) => {
if (user.relationship) {
set(state.relationships, user.relationship.id, user.relationship)
}
mergeOrAdd(state.users, state.usersObject, user)
})
},
updateUserRelationship (state, relationships) {
relationships.forEach((relationship) => {
set(state.relationships, relationship.id, relationship)
})
},
saveBlockIds (state, blockIds) {
state.currentUser.blockIds = blockIds
},
addBlockId (state, blockId) {
if (state.currentUser.blockIds.indexOf(blockId) === -1) {
state.currentUser.blockIds.push(blockId)
}
},
saveMuteIds (state, muteIds) {
state.currentUser.muteIds = muteIds
},
addMuteId (state, muteId) {
if (state.currentUser.muteIds.indexOf(muteId) === -1) {
state.currentUser.muteIds.push(muteId)
}
},
saveDomainMutes (state, domainMutes) {
state.currentUser.domainMutes = domainMutes
},
addDomainMute (state, domain) {
if (state.currentUser.domainMutes.indexOf(domain) === -1) {
state.currentUser.domainMutes.push(domain)
}
},
removeDomainMute (state, domain) {
const index = state.currentUser.domainMutes.indexOf(domain)
if (index !== -1) {
state.currentUser.domainMutes.splice(index, 1)
}
},
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) {
user.pinnedStatusIds.splice(index, 1)
}
},
setUserForStatus (state, status) {
status.user = state.usersObject[status.user.id]
},
setUserForNotification (state, notification) {
if (notification.type !== 'follow') {
notification.action.user = state.usersObject[notification.action.user.id]
}
notification.from_profile = state.usersObject[notification.from_profile.id]
},
setColor (state, { user: { id }, highlighted }) {
const user = state.usersObject[id]
set(user, 'highlight', highlighted)
},
signUpPending (state) {
state.signUpPending = true
state.signUpErrors = []
},
signUpSuccess (state) {
state.signUpPending = false
},
signUpFailure (state, errors) {
state.signUpPending = false
state.signUpErrors = errors
}
}
export const getters = {
findUser: state => query => {
const result = state.usersObject[query]
// In case it's a screen_name, we can try searching case-insensitive
if (!result && typeof query === 'string') {
return state.usersObject[query.toLowerCase()]
}
return result
},
relationship: state => id => {
const rel = id && state.relationships[id]
return rel || { id, loading: true }
}
}
export const defaultState = {
loggingIn: false,
lastLoginName: false,
currentUser: false,
users: [],
usersObject: {},
signUpPending: false,
signUpErrors: [],
relationships: {}
}
const users = {
state: defaultState,
mutations,
getters,
actions: {
fetchUserIfMissing (store, id) {
if (!store.getters.findUser(id)) {
store.dispatch('fetchUser', id)
}
},
fetchUser (store, id) {
return store.rootState.api.backendInteractor.fetchUser({ id })
.then((user) => {
store.commit('addNewUsers', [user])
return user
})
},
fetchUserRelationship (store, id) {
if (store.state.currentUser) {
store.rootState.api.backendInteractor.fetchUserRelationship({ id })
.then((relationships) => store.commit('updateUserRelationship', relationships))
}
},
fetchBlocks (store) {
return store.rootState.api.backendInteractor.fetchBlocks()
.then((blocks) => {
store.commit('saveBlockIds', map(blocks, 'id'))
store.commit('addNewUsers', blocks)
return blocks
})
},
blockUser (store, id) {
return blockUser(store, id)
},
unblockUser (store, id) {
return unblockUser(store, id)
},
blockUsers (store, ids = []) {
return Promise.all(ids.map(id => blockUser(store, id)))
},
unblockUsers (store, ids = []) {
return Promise.all(ids.map(id => unblockUser(store, id)))
},
fetchMutes (store) {
return store.rootState.api.backendInteractor.fetchMutes()
.then((mutes) => {
store.commit('saveMuteIds', map(mutes, 'id'))
store.commit('addNewUsers', mutes)
return mutes
})
},
muteUser (store, id) {
return muteUser(store, id)
},
unmuteUser (store, id) {
return unmuteUser(store, id)
},
hideReblogs (store, id) {
return hideReblogs(store, id)
},
showReblogs (store, id) {
return showReblogs(store, id)
},
muteUsers (store, ids = []) {
return Promise.all(ids.map(id => muteUser(store, id)))
},
unmuteUsers (store, ids = []) {
return Promise.all(ids.map(id => unmuteUser(store, id)))
},
fetchDomainMutes (store) {
return store.rootState.api.backendInteractor.fetchDomainMutes()
.then((domainMutes) => {
store.commit('saveDomainMutes', domainMutes)
return domainMutes
})
},
muteDomain (store, domain) {
return muteDomain(store, domain)
},
unmuteDomain (store, domain) {
return unmuteDomain(store, domain)
},
muteDomains (store, domains = []) {
return Promise.all(domains.map(domain => muteDomain(store, domain)))
},
unmuteDomains (store, domain = []) {
return Promise.all(domain.map(domain => unmuteDomain(store, domain)))
},
fetchFriends ({ rootState, commit }, id) {
const user = rootState.users.usersObject[id]
const maxId = last(user.friendIds)
return rootState.api.backendInteractor.fetchFriends({ id, maxId })
.then((friends) => {
commit('addNewUsers', friends)
commit('saveFriendIds', { id, friendIds: map(friends, 'id') })
return friends
})
},
fetchFollowers ({ rootState, commit }, id) {
const user = rootState.users.usersObject[id]
const maxId = last(user.followerIds)
return rootState.api.backendInteractor.fetchFollowers({ id, maxId })
.then((followers) => {
commit('addNewUsers', followers)
commit('saveFollowerIds', { id, followerIds: map(followers, 'id') })
return followers
})
},
clearFriends ({ commit }, userId) {
commit('clearFriends', userId)
},
clearFollowers ({ commit }, userId) {
commit('clearFollowers', userId)
},
subscribeUser ({ rootState, commit }, id) {
return rootState.api.backendInteractor.subscribeUser({ id })
.then((relationship) => commit('updateUserRelationship', [relationship]))
},
unsubscribeUser ({ rootState, commit }, id) {
return rootState.api.backendInteractor.unsubscribeUser({ id })
.then((relationship) => commit('updateUserRelationship', [relationship]))
},
toggleActivationStatus ({ rootState, commit }, { user }) {
const api = user.deactivated ? rootState.api.backendInteractor.activateUser : rootState.api.backendInteractor.deactivateUser
api({ user })
.then(({ deactivated }) => commit('updateActivationStatus', { user, deactivated }))
},
registerPushNotifications (store) {
const token = store.state.currentUser.credentials
const vapidPublicKey = store.rootState.instance.vapidPublicKey
const isEnabled = store.rootState.config.webPushNotifications
const notificationVisibility = store.rootState.config.notificationVisibility
registerPushNotifications(isEnabled, vapidPublicKey, token, notificationVisibility)
},
unregisterPushNotifications (store) {
const token = store.state.currentUser.credentials
unregisterPushNotifications(token)
},
addNewUsers ({ commit }, users) {
commit('addNewUsers', users)
},
addNewStatuses (store, { statuses }) {
const users = map(statuses, 'user')
const retweetedUsers = compact(map(statuses, 'retweeted_status.user'))
store.commit('addNewUsers', users)
store.commit('addNewUsers', retweetedUsers)
each(statuses, (status) => {
// Reconnect users to statuses
store.commit('setUserForStatus', status)
// Set pinned statuses to user
store.commit('setPinnedToUser', status)
})
each(compact(map(statuses, 'retweeted_status')), (status) => {
// Reconnect users to retweets
store.commit('setUserForStatus', status)
// Set pinned retweets to user
store.commit('setPinnedToUser', status)
})
},
addNewNotifications (store, { notifications }) {
const users = map(notifications, 'from_profile')
const targetUsers = map(notifications, 'target').filter(_ => _)
const notificationIds = notifications.map(_ => _.id)
store.commit('addNewUsers', users)
store.commit('addNewUsers', targetUsers)
const notificationsObject = store.rootState.statuses.notifications.idStore
const relevantNotifications = Object.entries(notificationsObject)
.filter(([k, val]) => notificationIds.includes(k))
.map(([k, val]) => val)
// Reconnect users to notifications
each(relevantNotifications, (notification) => {
store.commit('setUserForNotification', notification)
})
},
searchUsers ({ rootState, commit }, { query }) {
return rootState.api.backendInteractor.searchUsers({ query })
.then((users) => {
commit('addNewUsers', users)
return users
})
},
async signUp (store, userInfo) {
store.commit('signUpPending')
let rootState = store.rootState
try {
let data = await rootState.api.backendInteractor.register(
{ params: { ...userInfo } }
)
store.commit('signUpSuccess')
store.commit('setToken', data.access_token)
store.dispatch('loginUser', data.access_token)
} catch (e) {
let errors = e.message
store.commit('signUpFailure', errors)
throw e
}
},
async getCaptcha (store) {
return store.rootState.api.backendInteractor.getCaptcha()
},
logout (store) {
const { oauth, instance } = store.rootState
const data = {
...oauth,
commit: store.commit,
instance: instance.server
}
return oauthApi.getOrCreateApp(data)
.then((app) => {
const params = {
app,
instance: data.instance,
token: oauth.userToken
}
return oauthApi.revokeToken(params)
})
.then(() => {
store.commit('clearCurrentUser')
store.dispatch('disconnectFromSocket')
store.commit('clearToken')
store.dispatch('stopFetchingTimeline', 'friends')
store.commit('setBackendInteractor', backendInteractorService(store.getters.getToken()))
store.dispatch('stopFetchingNotifications')
store.dispatch('stopFetchingFollowRequests')
store.commit('clearNotifications')
store.commit('resetStatuses')
store.dispatch('resetChats')
store.dispatch('setLastTimeline', 'public-timeline')
})
},
loginUser (store, accessToken) {
return new Promise((resolve, reject) => {
const commit = store.commit
commit('beginLogin')
store.rootState.api.backendInteractor.verifyCredentials(accessToken)
.then((data) => {
if (!data.error) {
const user = data
// user.credentials = userCredentials
user.credentials = accessToken
user.blockIds = []
user.muteIds = []
user.domainMutes = []
commit('setCurrentUser', user)
commit('addNewUsers', [user])
store.dispatch('fetchEmoji')
getNotificationPermission()
.then(permission => commit('setNotificationPermission', permission))
// Set our new backend interactor
commit('setBackendInteractor', backendInteractorService(accessToken))
if (user.token) {
store.dispatch('setWsToken', user.token)
// Initialize the chat socket.
store.dispatch('initializeSocket')
}
const startPolling = () => {
// Start getting fresh posts.
store.dispatch('startFetchingTimeline', { timeline: 'friends' })
// Start fetching notifications
store.dispatch('startFetchingNotifications')
// Start fetching chats
store.dispatch('startFetchingChats')
}
if (store.getters.mergedConfig.useStreamingApi) {
store.dispatch('enableMastoSockets').catch((error) => {
console.error('Failed initializing MastoAPI Streaming socket', error)
startPolling()
}).then(() => {
store.dispatch('fetchChats', { latest: true })
setTimeout(() => store.dispatch('setNotificationsSilence', false), 10000)
})
} else {
startPolling()
}
// Get user mutes
store.dispatch('fetchMutes')
// Fetch our friends
store.rootState.api.backendInteractor.fetchFriends({ id: user.id })
.then((friends) => commit('addNewUsers', friends))
} else {
const response = data.error
// Authentication failed
commit('endLogin')
if (response.status === 401) {
reject(new Error('Wrong username or password'))
} else {
reject(new Error('An error occurred, please try again'))
}
}
commit('endLogin')
resolve()
})
.catch((error) => {
console.log(error)
commit('endLogin')
reject(new Error('Failed to connect to server, try again'))
})
})
}
}
}
export default users
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js
index 22b5e8bae1..8da933c41c 100644
--- a/src/services/api/api.service.js
+++ b/src/services/api/api.service.js
@@ -1,1348 +1,1348 @@
import { each, map, concat, last, get } from 'lodash'
import { parseStatus, parseUser, parseNotification, parseAttachment, parseChat, parseLinkHeaderPagination } from '../entity_normalizer/entity_normalizer.service.js'
import { RegistrationError, StatusCodeError } from '../errors/errors'
/* eslint-env browser */
const MUTES_IMPORT_URL = '/api/pleroma/mutes_import'
const BLOCKS_IMPORT_URL = '/api/pleroma/blocks_import'
const FOLLOW_IMPORT_URL = '/api/pleroma/follow_import'
const DELETE_ACCOUNT_URL = '/api/pleroma/delete_account'
const CHANGE_EMAIL_URL = '/api/pleroma/change_email'
const CHANGE_PASSWORD_URL = '/api/pleroma/change_password'
const TAG_USER_URL = '/api/pleroma/admin/users/tag'
const PERMISSION_GROUP_URL = (screenName, right) => `/api/pleroma/admin/users/${screenName}/permission_group/${right}`
const ACTIVATE_USER_URL = '/api/pleroma/admin/users/activate'
const DEACTIVATE_USER_URL = '/api/pleroma/admin/users/deactivate'
const ADMIN_USERS_URL = '/api/pleroma/admin/users'
const SUGGESTIONS_URL = '/api/v1/suggestions'
const NOTIFICATION_SETTINGS_URL = '/api/pleroma/notification_settings'
const NOTIFICATION_READ_URL = '/api/v1/pleroma/notifications/read'
const MFA_SETTINGS_URL = '/api/pleroma/accounts/mfa'
const MFA_BACKUP_CODES_URL = '/api/pleroma/accounts/mfa/backup_codes'
const MFA_SETUP_OTP_URL = '/api/pleroma/accounts/mfa/setup/totp'
const MFA_CONFIRM_OTP_URL = '/api/pleroma/accounts/mfa/confirm/totp'
const MFA_DISABLE_OTP_URL = '/api/pleroma/accounts/mfa/totp'
const MASTODON_LOGIN_URL = '/api/v1/accounts/verify_credentials'
const MASTODON_REGISTRATION_URL = '/api/v1/accounts'
const MASTODON_USER_FAVORITES_TIMELINE_URL = '/api/v1/favourites'
const MASTODON_USER_NOTIFICATIONS_URL = '/api/v1/notifications'
const MASTODON_DISMISS_NOTIFICATION_URL = id => `/api/v1/notifications/${id}/dismiss`
const MASTODON_FAVORITE_URL = id => `/api/v1/statuses/${id}/favourite`
const MASTODON_UNFAVORITE_URL = id => `/api/v1/statuses/${id}/unfavourite`
const MASTODON_RETWEET_URL = id => `/api/v1/statuses/${id}/reblog`
const MASTODON_UNRETWEET_URL = id => `/api/v1/statuses/${id}/unreblog`
const MASTODON_DELETE_URL = id => `/api/v1/statuses/${id}`
const MASTODON_FOLLOW_URL = id => `/api/v1/accounts/${id}/follow`
const MASTODON_UNFOLLOW_URL = id => `/api/v1/accounts/${id}/unfollow`
const MASTODON_FOLLOWING_URL = id => `/api/v1/accounts/${id}/following`
const MASTODON_FOLLOWERS_URL = id => `/api/v1/accounts/${id}/followers`
const MASTODON_FOLLOW_REQUESTS_URL = '/api/v1/follow_requests'
const MASTODON_APPROVE_USER_URL = id => `/api/v1/follow_requests/${id}/authorize`
const MASTODON_DENY_USER_URL = id => `/api/v1/follow_requests/${id}/reject`
const MASTODON_DIRECT_MESSAGES_TIMELINE_URL = '/api/v1/timelines/direct'
const MASTODON_PUBLIC_TIMELINE = '/api/v1/timelines/public'
const MASTODON_USER_HOME_TIMELINE_URL = '/api/v1/timelines/home'
const MASTODON_STATUS_URL = id => `/api/v1/statuses/${id}`
const MASTODON_STATUS_CONTEXT_URL = id => `/api/v1/statuses/${id}/context`
const MASTODON_USER_URL = '/api/v1/accounts'
const MASTODON_USER_RELATIONSHIPS_URL = '/api/v1/accounts/relationships'
const MASTODON_USER_TIMELINE_URL = id => `/api/v1/accounts/${id}/statuses`
const MASTODON_TAG_TIMELINE_URL = tag => `/api/v1/timelines/tag/${tag}`
const MASTODON_BOOKMARK_TIMELINE_URL = '/api/v1/bookmarks'
const MASTODON_USER_BLOCKS_URL = '/api/v1/blocks/'
const MASTODON_USER_MUTES_URL = '/api/v1/mutes/'
const MASTODON_BLOCK_USER_URL = id => `/api/v1/accounts/${id}/block`
const MASTODON_UNBLOCK_USER_URL = id => `/api/v1/accounts/${id}/unblock`
const MASTODON_MUTE_USER_URL = id => `/api/v1/accounts/${id}/mute`
const MASTODON_UNMUTE_USER_URL = id => `/api/v1/accounts/${id}/unmute`
const MASTODON_SUBSCRIBE_USER = id => `/api/v1/pleroma/accounts/${id}/subscribe`
const MASTODON_UNSUBSCRIBE_USER = id => `/api/v1/pleroma/accounts/${id}/unsubscribe`
const MASTODON_BOOKMARK_STATUS_URL = id => `/api/v1/statuses/${id}/bookmark`
const MASTODON_UNBOOKMARK_STATUS_URL = id => `/api/v1/statuses/${id}/unbookmark`
const MASTODON_POST_STATUS_URL = '/api/v1/statuses'
const MASTODON_MEDIA_UPLOAD_URL = '/api/v1/media'
const MASTODON_VOTE_URL = id => `/api/v1/polls/${id}/votes`
const MASTODON_POLL_URL = id => `/api/v1/polls/${id}`
const MASTODON_STATUS_FAVORITEDBY_URL = id => `/api/v1/statuses/${id}/favourited_by`
const MASTODON_STATUS_REBLOGGEDBY_URL = id => `/api/v1/statuses/${id}/reblogged_by`
const MASTODON_PROFILE_UPDATE_URL = '/api/v1/accounts/update_credentials'
const MASTODON_REPORT_USER_URL = '/api/v1/reports'
const MASTODON_PIN_OWN_STATUS = id => `/api/v1/statuses/${id}/pin`
const MASTODON_UNPIN_OWN_STATUS = id => `/api/v1/statuses/${id}/unpin`
const MASTODON_MUTE_CONVERSATION = id => `/api/v1/statuses/${id}/mute`
const MASTODON_UNMUTE_CONVERSATION = id => `/api/v1/statuses/${id}/unmute`
const MASTODON_SEARCH_2 = `/api/v2/search`
const MASTODON_USER_SEARCH_URL = '/api/v1/accounts/search'
const MASTODON_DOMAIN_BLOCKS_URL = '/api/v1/domain_blocks'
const MASTODON_STREAMING = '/api/v1/streaming'
const MASTODON_KNOWN_DOMAIN_LIST_URL = '/api/v1/instance/peers'
const PLEROMA_EMOJI_REACTIONS_URL = id => `/api/v1/pleroma/statuses/${id}/reactions`
const PLEROMA_EMOJI_REACT_URL = (id, emoji) => `/api/v1/pleroma/statuses/${id}/reactions/${emoji}`
const PLEROMA_EMOJI_UNREACT_URL = (id, emoji) => `/api/v1/pleroma/statuses/${id}/reactions/${emoji}`
const PLEROMA_CHATS_URL = `/api/v1/pleroma/chats`
const PLEROMA_CHAT_URL = id => `/api/v1/pleroma/chats/by-account-id/${id}`
const PLEROMA_CHAT_MESSAGES_URL = id => `/api/v1/pleroma/chats/${id}/messages`
const PLEROMA_CHAT_READ_URL = id => `/api/v1/pleroma/chats/${id}/read`
const PLEROMA_DELETE_CHAT_MESSAGE_URL = (chatId, messageId) => `/api/v1/pleroma/chats/${chatId}/messages/${messageId}`
const oldfetch = window.fetch
let fetch = (url, options) => {
options = options || {}
const baseUrl = ''
const fullUrl = baseUrl + url
options.credentials = 'same-origin'
return oldfetch(fullUrl, options)
}
const promisedRequest = ({ method, url, params, payload, credentials, headers = {} }) => {
const options = {
method,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
...headers
}
}
if (params) {
url += '?' + Object.entries(params)
.map(([key, value]) => encodeURIComponent(key) + '=' + encodeURIComponent(value))
.join('&')
}
if (payload) {
options.body = JSON.stringify(payload)
}
if (credentials) {
options.headers = {
...options.headers,
...authHeaders(credentials)
}
}
return fetch(url, options)
.then((response) => {
return new Promise((resolve, reject) => response.json()
.then((json) => {
if (!response.ok) {
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))
})
)
})
}
const updateNotificationSettings = ({ credentials, settings }) => {
const form = new FormData()
each(settings, (value, key) => {
form.append(key, value)
})
return fetch(NOTIFICATION_SETTINGS_URL, {
headers: authHeaders(credentials),
method: 'PUT',
body: form
}).then((data) => data.json())
}
const updateProfileImages = ({ credentials, avatar = null, banner = null, background = null }) => {
const form = new FormData()
if (avatar !== null) form.append('avatar', avatar)
if (banner !== null) form.append('header', banner)
if (background !== null) form.append('pleroma_background_image', background)
return fetch(MASTODON_PROFILE_UPDATE_URL, {
headers: authHeaders(credentials),
method: 'PATCH',
body: form
})
.then((data) => data.json())
.then((data) => parseUser(data))
}
const updateProfile = ({ credentials, params }) => {
return promisedRequest({
url: MASTODON_PROFILE_UPDATE_URL,
method: 'PATCH',
payload: params,
credentials
}).then((data) => parseUser(data))
}
// Params needed:
// nickname
// email
// fullname
// password
// password_confirm
//
// Optional
// bio
// homepage
// location
// token
const register = ({ params, credentials }) => {
const { nickname, ...rest } = params
return fetch(MASTODON_REGISTRATION_URL, {
method: 'POST',
headers: {
...authHeaders(credentials),
'Content-Type': 'application/json'
},
body: JSON.stringify({
nickname,
locale: 'en_US',
agreement: true,
...rest
})
})
.then((response) => {
if (response.ok) {
return response.json()
} else {
return response.json().then((error) => { throw new RegistrationError(error) })
}
})
}
const getCaptcha = () => fetch('/api/pleroma/captcha').then(resp => resp.json())
const authHeaders = (accessToken) => {
if (accessToken) {
return { 'Authorization': `Bearer ${accessToken}` }
} else {
return { }
}
}
const followUser = ({ id, credentials, ...options }) => {
let url = MASTODON_FOLLOW_URL(id)
const form = {}
if (options.reblogs !== undefined) { form['reblogs'] = options.reblogs }
return fetch(url, {
body: JSON.stringify(form),
headers: {
...authHeaders(credentials),
'Content-Type': 'application/json'
},
method: 'POST'
}).then((data) => data.json())
}
const unfollowUser = ({ id, credentials }) => {
let url = MASTODON_UNFOLLOW_URL(id)
return fetch(url, {
headers: authHeaders(credentials),
method: 'POST'
}).then((data) => data.json())
}
const pinOwnStatus = ({ id, credentials }) => {
return promisedRequest({ url: MASTODON_PIN_OWN_STATUS(id), credentials, method: 'POST' })
.then((data) => parseStatus(data))
}
const unpinOwnStatus = ({ id, credentials }) => {
return promisedRequest({ url: MASTODON_UNPIN_OWN_STATUS(id), credentials, method: 'POST' })
.then((data) => parseStatus(data))
}
const muteConversation = ({ id, credentials }) => {
return promisedRequest({ url: MASTODON_MUTE_CONVERSATION(id), credentials, method: 'POST' })
.then((data) => parseStatus(data))
}
const unmuteConversation = ({ id, credentials }) => {
return promisedRequest({ url: MASTODON_UNMUTE_CONVERSATION(id), credentials, method: 'POST' })
.then((data) => parseStatus(data))
}
const blockUser = ({ id, credentials }) => {
return fetch(MASTODON_BLOCK_USER_URL(id), {
headers: authHeaders(credentials),
method: 'POST'
}).then((data) => data.json())
}
const unblockUser = ({ id, credentials }) => {
return fetch(MASTODON_UNBLOCK_USER_URL(id), {
headers: authHeaders(credentials),
method: 'POST'
}).then((data) => data.json())
}
const approveUser = ({ id, credentials }) => {
let url = MASTODON_APPROVE_USER_URL(id)
return fetch(url, {
headers: authHeaders(credentials),
method: 'POST'
}).then((data) => data.json())
}
const denyUser = ({ id, credentials }) => {
let url = MASTODON_DENY_USER_URL(id)
return fetch(url, {
headers: authHeaders(credentials),
method: 'POST'
}).then((data) => data.json())
}
const fetchUser = ({ id, credentials }) => {
let url = `${MASTODON_USER_URL}/${id}`
return promisedRequest({ url, credentials })
.then((data) => parseUser(data))
}
const fetchUserRelationship = ({ id, credentials }) => {
let url = `${MASTODON_USER_RELATIONSHIPS_URL}/?id=${id}`
return fetch(url, { headers: authHeaders(credentials) })
.then((response) => {
return new Promise((resolve, reject) => response.json()
.then((json) => {
if (!response.ok) {
return reject(new StatusCodeError(response.status, json, { url }, response))
}
return resolve(json)
}))
})
}
const fetchFriends = ({ id, maxId, sinceId, limit = 20, credentials }) => {
let url = MASTODON_FOLLOWING_URL(id)
const args = [
maxId && `max_id=${maxId}`,
sinceId && `since_id=${sinceId}`,
limit && `limit=${limit}`,
`with_relationships=true`
].filter(_ => _).join('&')
url = url + (args ? '?' + args : '')
return fetch(url, { headers: authHeaders(credentials) })
.then((data) => data.json())
.then((data) => data.map(parseUser))
}
const exportFriends = ({ id, credentials }) => {
return new Promise(async (resolve, reject) => {
try {
let friends = []
let more = true
while (more) {
const maxId = friends.length > 0 ? last(friends).id : undefined
const users = await fetchFriends({ id, maxId, credentials })
friends = concat(friends, users)
if (users.length === 0) {
more = false
}
}
resolve(friends)
} catch (err) {
reject(err)
}
})
}
const fetchFollowers = ({ id, maxId, sinceId, limit = 20, credentials }) => {
let url = MASTODON_FOLLOWERS_URL(id)
const args = [
maxId && `max_id=${maxId}`,
sinceId && `since_id=${sinceId}`,
limit && `limit=${limit}`,
`with_relationships=true`
].filter(_ => _).join('&')
url += args ? '?' + args : ''
return fetch(url, { headers: authHeaders(credentials) })
.then((data) => data.json())
.then((data) => data.map(parseUser))
}
const fetchFollowRequests = ({ credentials }) => {
const url = MASTODON_FOLLOW_REQUESTS_URL
return fetch(url, { headers: authHeaders(credentials) })
.then((data) => data.json())
.then((data) => data.map(parseUser))
}
const fetchConversation = ({ id, credentials }) => {
let urlContext = MASTODON_STATUS_CONTEXT_URL(id)
return fetch(urlContext, { headers: authHeaders(credentials) })
.then((data) => {
if (data.ok) {
return data
}
throw new Error('Error fetching timeline', data)
})
.then((data) => data.json())
.then(({ ancestors, descendants }) => ({
ancestors: ancestors.map(parseStatus),
descendants: descendants.map(parseStatus)
}))
}
const fetchStatus = ({ id, credentials }) => {
let url = MASTODON_STATUS_URL(id)
return fetch(url, { headers: authHeaders(credentials) })
.then((data) => {
if (data.ok) {
return data
}
throw new Error('Error fetching timeline', data)
})
.then((data) => data.json())
.then((data) => parseStatus(data))
}
const tagUser = ({ tag, credentials, user }) => {
const screenName = user.screen_name
const form = {
nicknames: [screenName],
tags: [tag]
}
const headers = authHeaders(credentials)
headers['Content-Type'] = 'application/json'
return fetch(TAG_USER_URL, {
method: 'PUT',
headers: headers,
body: JSON.stringify(form)
})
}
const untagUser = ({ tag, credentials, user }) => {
const screenName = user.screen_name
const body = {
nicknames: [screenName],
tags: [tag]
}
const headers = authHeaders(credentials)
headers['Content-Type'] = 'application/json'
return fetch(TAG_USER_URL, {
method: 'DELETE',
headers: headers,
body: JSON.stringify(body)
})
}
const addRight = ({ right, credentials, user }) => {
const screenName = user.screen_name
return fetch(PERMISSION_GROUP_URL(screenName, right), {
method: 'POST',
headers: authHeaders(credentials),
body: {}
})
}
const deleteRight = ({ right, credentials, user }) => {
const screenName = user.screen_name
return fetch(PERMISSION_GROUP_URL(screenName, right), {
method: 'DELETE',
headers: authHeaders(credentials),
body: {}
})
}
const activateUser = ({ credentials, user: { screen_name: nickname } }) => {
return promisedRequest({
url: ACTIVATE_USER_URL,
method: 'PATCH',
credentials,
payload: {
nicknames: [nickname]
}
}).then(response => get(response, 'users.0'))
}
const deactivateUser = ({ credentials, user: { screen_name: nickname } }) => {
return promisedRequest({
url: DEACTIVATE_USER_URL,
method: 'PATCH',
credentials,
payload: {
nicknames: [nickname]
}
}).then(response => get(response, 'users.0'))
}
const deleteUser = ({ credentials, user }) => {
const screenName = user.screen_name
const headers = authHeaders(credentials)
return fetch(`${ADMIN_USERS_URL}?nickname=${screenName}`, {
method: 'DELETE',
headers: headers
})
}
const fetchTimeline = ({
timeline,
credentials,
since = false,
until = false,
userId = false,
tag = false,
withMuted = false,
replyVisibility = 'all'
}) => {
const timelineUrls = {
public: MASTODON_PUBLIC_TIMELINE,
friends: MASTODON_USER_HOME_TIMELINE_URL,
dms: MASTODON_DIRECT_MESSAGES_TIMELINE_URL,
notifications: MASTODON_USER_NOTIFICATIONS_URL,
'publicAndExternal': MASTODON_PUBLIC_TIMELINE,
user: MASTODON_USER_TIMELINE_URL,
media: MASTODON_USER_TIMELINE_URL,
favorites: MASTODON_USER_FAVORITES_TIMELINE_URL,
tag: MASTODON_TAG_TIMELINE_URL,
bookmarks: MASTODON_BOOKMARK_TIMELINE_URL
}
const isNotifications = timeline === 'notifications'
const params = []
let url = timelineUrls[timeline]
if (timeline === 'user' || timeline === 'media') {
url = url(userId)
}
if (since) {
params.push(['since_id', since])
}
if (until) {
params.push(['max_id', until])
}
if (tag) {
url = url(tag)
}
if (timeline === 'media') {
params.push(['only_media', 1])
}
if (timeline === 'public') {
params.push(['local', true])
}
if (timeline === 'public' || timeline === 'publicAndExternal') {
params.push(['only_media', false])
}
if (timeline !== 'favorites' && timeline !== 'bookmarks') {
params.push(['with_muted', withMuted])
}
if (replyVisibility !== 'all') {
params.push(['reply_visibility', replyVisibility])
}
params.push(['limit', 20])
const queryString = map(params, (param) => `${param[0]}=${param[1]}`).join('&')
url += `?${queryString}`
let status = ''
let statusText = ''
let pagination = {}
return fetch(url, { headers: authHeaders(credentials) })
.then((data) => {
status = data.status
statusText = data.statusText
pagination = parseLinkHeaderPagination(data.headers.get('Link'), {
flakeId: timeline !== 'bookmarks' && timeline !== 'notifications'
})
return data
})
.then((data) => data.json())
.then((data) => {
- if (!data.error) {
+ if (!data.errors) {
return { data: data.map(isNotifications ? parseNotification : parseStatus), pagination }
} else {
data.status = status
data.statusText = statusText
return data
}
})
}
const fetchPinnedStatuses = ({ id, credentials }) => {
const url = MASTODON_USER_TIMELINE_URL(id) + '?pinned=true'
return promisedRequest({ url, credentials })
.then((data) => data.map(parseStatus))
}
const verifyCredentials = (user) => {
return fetch(MASTODON_LOGIN_URL, {
headers: authHeaders(user)
})
.then((response) => {
if (response.ok) {
return response.json()
} else {
return {
error: response
}
}
})
.then((data) => data.error ? data : parseUser(data))
}
const favorite = ({ id, credentials }) => {
return promisedRequest({ url: MASTODON_FAVORITE_URL(id), method: 'POST', credentials })
.then((data) => parseStatus(data))
}
const unfavorite = ({ id, credentials }) => {
return promisedRequest({ url: MASTODON_UNFAVORITE_URL(id), method: 'POST', credentials })
.then((data) => parseStatus(data))
}
const retweet = ({ id, credentials }) => {
return promisedRequest({ url: MASTODON_RETWEET_URL(id), method: 'POST', credentials })
.then((data) => parseStatus(data))
}
const unretweet = ({ id, credentials }) => {
return promisedRequest({ url: MASTODON_UNRETWEET_URL(id), method: 'POST', credentials })
.then((data) => parseStatus(data))
}
const bookmarkStatus = ({ id, credentials }) => {
return promisedRequest({
url: MASTODON_BOOKMARK_STATUS_URL(id),
headers: authHeaders(credentials),
method: 'POST'
})
}
const unbookmarkStatus = ({ id, credentials }) => {
return promisedRequest({
url: MASTODON_UNBOOKMARK_STATUS_URL(id),
headers: authHeaders(credentials),
method: 'POST'
})
}
const postStatus = ({
credentials,
status,
spoilerText,
visibility,
sensitive,
poll,
mediaIds = [],
inReplyToStatusId,
contentType,
preview,
idempotencyKey
}) => {
const form = new FormData()
const pollOptions = poll.options || []
form.append('status', status)
form.append('source', 'Pleroma FE')
if (spoilerText) form.append('spoiler_text', spoilerText)
if (visibility) form.append('visibility', visibility)
if (sensitive) form.append('sensitive', sensitive)
if (contentType) form.append('content_type', contentType)
mediaIds.forEach(val => {
form.append('media_ids[]', val)
})
if (pollOptions.some(option => option !== '')) {
const normalizedPoll = {
expires_in: poll.expiresIn,
multiple: poll.multiple
}
Object.keys(normalizedPoll).forEach(key => {
form.append(`poll[${key}]`, normalizedPoll[key])
})
pollOptions.forEach(option => {
form.append('poll[options][]', option)
})
}
if (inReplyToStatusId) {
form.append('in_reply_to_id', inReplyToStatusId)
}
if (preview) {
form.append('preview', 'true')
}
let postHeaders = authHeaders(credentials)
if (idempotencyKey) {
postHeaders['idempotency-key'] = idempotencyKey
}
return fetch(MASTODON_POST_STATUS_URL, {
body: form,
method: 'POST',
headers: postHeaders
})
.then((response) => {
return response.json()
})
.then((data) => data.error ? data : parseStatus(data))
}
const deleteStatus = ({ id, credentials }) => {
return fetch(MASTODON_DELETE_URL(id), {
headers: authHeaders(credentials),
method: 'DELETE'
})
}
const uploadMedia = ({ formData, credentials }) => {
return fetch(MASTODON_MEDIA_UPLOAD_URL, {
body: formData,
method: 'POST',
headers: authHeaders(credentials)
})
.then((data) => data.json())
.then((data) => parseAttachment(data))
}
const setMediaDescription = ({ id, description, credentials }) => {
return promisedRequest({
url: `${MASTODON_MEDIA_UPLOAD_URL}/${id}`,
method: 'PUT',
headers: authHeaders(credentials),
payload: {
description
}
}).then((data) => parseAttachment(data))
}
const importMutes = ({ file, credentials }) => {
const formData = new FormData()
formData.append('list', file)
return fetch(MUTES_IMPORT_URL, {
body: formData,
method: 'POST',
headers: authHeaders(credentials)
})
.then((response) => response.ok)
}
const importBlocks = ({ file, credentials }) => {
const formData = new FormData()
formData.append('list', file)
return fetch(BLOCKS_IMPORT_URL, {
body: formData,
method: 'POST',
headers: authHeaders(credentials)
})
.then((response) => response.ok)
}
const importFollows = ({ file, credentials }) => {
const formData = new FormData()
formData.append('list', file)
return fetch(FOLLOW_IMPORT_URL, {
body: formData,
method: 'POST',
headers: authHeaders(credentials)
})
.then((response) => response.ok)
}
const deleteAccount = ({ credentials, password }) => {
const form = new FormData()
form.append('password', password)
return fetch(DELETE_ACCOUNT_URL, {
body: form,
method: 'POST',
headers: authHeaders(credentials)
})
.then((response) => response.json())
}
const changeEmail = ({ credentials, email, password }) => {
const form = new FormData()
form.append('email', email)
form.append('password', password)
return fetch(CHANGE_EMAIL_URL, {
body: form,
method: 'POST',
headers: authHeaders(credentials)
})
.then((response) => response.json())
}
const changePassword = ({ credentials, password, newPassword, newPasswordConfirmation }) => {
const form = new FormData()
form.append('password', password)
form.append('new_password', newPassword)
form.append('new_password_confirmation', newPasswordConfirmation)
return fetch(CHANGE_PASSWORD_URL, {
body: form,
method: 'POST',
headers: authHeaders(credentials)
})
.then((response) => response.json())
}
const settingsMFA = ({ credentials }) => {
return fetch(MFA_SETTINGS_URL, {
headers: authHeaders(credentials),
method: 'GET'
}).then((data) => data.json())
}
const mfaDisableOTP = ({ credentials, password }) => {
const form = new FormData()
form.append('password', password)
return fetch(MFA_DISABLE_OTP_URL, {
body: form,
method: 'DELETE',
headers: authHeaders(credentials)
})
.then((response) => response.json())
}
const mfaConfirmOTP = ({ credentials, password, token }) => {
const form = new FormData()
form.append('password', password)
form.append('code', token)
return fetch(MFA_CONFIRM_OTP_URL, {
body: form,
headers: authHeaders(credentials),
method: 'POST'
}).then((data) => data.json())
}
const mfaSetupOTP = ({ credentials }) => {
return fetch(MFA_SETUP_OTP_URL, {
headers: authHeaders(credentials),
method: 'GET'
}).then((data) => data.json())
}
const generateMfaBackupCodes = ({ credentials }) => {
return fetch(MFA_BACKUP_CODES_URL, {
headers: authHeaders(credentials),
method: 'GET'
}).then((data) => data.json())
}
const fetchMutes = ({ credentials }) => {
return promisedRequest({ url: MASTODON_USER_MUTES_URL, credentials })
.then((users) => users.map(parseUser))
}
const muteUser = ({ id, credentials }) => {
return promisedRequest({ url: MASTODON_MUTE_USER_URL(id), credentials, method: 'POST' })
}
const unmuteUser = ({ id, credentials }) => {
return promisedRequest({ url: MASTODON_UNMUTE_USER_URL(id), credentials, method: 'POST' })
}
const subscribeUser = ({ id, credentials }) => {
return promisedRequest({ url: MASTODON_SUBSCRIBE_USER(id), credentials, method: 'POST' })
}
const unsubscribeUser = ({ id, credentials }) => {
return promisedRequest({ url: MASTODON_UNSUBSCRIBE_USER(id), credentials, method: 'POST' })
}
const fetchBlocks = ({ credentials }) => {
return promisedRequest({ url: MASTODON_USER_BLOCKS_URL, credentials })
.then((users) => users.map(parseUser))
}
const fetchOAuthTokens = ({ credentials }) => {
const url = '/api/oauth_tokens.json'
return fetch(url, {
headers: authHeaders(credentials)
}).then((data) => {
if (data.ok) {
return data.json()
}
throw new Error('Error fetching auth tokens', data)
})
}
const revokeOAuthToken = ({ id, credentials }) => {
const url = `/api/oauth_tokens/${id}`
return fetch(url, {
headers: authHeaders(credentials),
method: 'DELETE'
})
}
const suggestions = ({ credentials }) => {
return fetch(SUGGESTIONS_URL, {
headers: authHeaders(credentials)
}).then((data) => data.json())
}
const markNotificationsAsSeen = ({ id, credentials, single = false }) => {
const body = new FormData()
if (single) {
body.append('id', id)
} else {
body.append('max_id', id)
}
return fetch(NOTIFICATION_READ_URL, {
body,
headers: authHeaders(credentials),
method: 'POST'
}).then((data) => data.json())
}
const vote = ({ pollId, choices, credentials }) => {
const form = new FormData()
form.append('choices', choices)
return promisedRequest({
url: MASTODON_VOTE_URL(encodeURIComponent(pollId)),
method: 'POST',
credentials,
payload: {
choices: choices
}
})
}
const fetchPoll = ({ pollId, credentials }) => {
return promisedRequest(
{
url: MASTODON_POLL_URL(encodeURIComponent(pollId)),
method: 'GET',
credentials
}
)
}
const fetchFavoritedByUsers = ({ id, credentials }) => {
return promisedRequest({
url: MASTODON_STATUS_FAVORITEDBY_URL(id),
method: 'GET',
credentials
}).then((users) => users.map(parseUser))
}
const fetchRebloggedByUsers = ({ id, credentials }) => {
return promisedRequest({
url: MASTODON_STATUS_REBLOGGEDBY_URL(id),
method: 'GET',
credentials
}).then((users) => users.map(parseUser))
}
const fetchEmojiReactions = ({ id, credentials }) => {
return promisedRequest({ url: PLEROMA_EMOJI_REACTIONS_URL(id), credentials })
.then((reactions) => reactions.map(r => {
r.accounts = r.accounts.map(parseUser)
return r
}))
}
const reactWithEmoji = ({ id, emoji, credentials }) => {
return promisedRequest({
url: PLEROMA_EMOJI_REACT_URL(id, emoji),
method: 'PUT',
credentials
}).then(parseStatus)
}
const unreactWithEmoji = ({ id, emoji, credentials }) => {
return promisedRequest({
url: PLEROMA_EMOJI_UNREACT_URL(id, emoji),
method: 'DELETE',
credentials
}).then(parseStatus)
}
const reportUser = ({ credentials, userId, statusIds, comment, forward }) => {
return promisedRequest({
url: MASTODON_REPORT_USER_URL,
method: 'POST',
payload: {
'account_id': userId,
'status_ids': statusIds,
comment,
forward
},
credentials
})
}
const searchUsers = ({ credentials, query }) => {
return promisedRequest({
url: MASTODON_USER_SEARCH_URL,
params: {
q: query,
resolve: true
},
credentials
})
.then((data) => data.map(parseUser))
}
const search2 = ({ credentials, q, resolve, limit, offset, following }) => {
let url = MASTODON_SEARCH_2
let params = []
if (q) {
params.push(['q', encodeURIComponent(q)])
}
if (resolve) {
params.push(['resolve', resolve])
}
if (limit) {
params.push(['limit', limit])
}
if (offset) {
params.push(['offset', offset])
}
if (following) {
params.push(['following', true])
}
params.push(['with_relationships', true])
let queryString = map(params, (param) => `${param[0]}=${param[1]}`).join('&')
url += `?${queryString}`
return fetch(url, { headers: authHeaders(credentials) })
.then((data) => {
if (data.ok) {
return data
}
throw new Error('Error fetching search result', data)
})
.then((data) => { return data.json() })
.then((data) => {
data.accounts = data.accounts.slice(0, limit).map(u => parseUser(u))
data.statuses = data.statuses.slice(0, limit).map(s => parseStatus(s))
return data
})
}
const fetchKnownDomains = ({ credentials }) => {
return promisedRequest({ url: MASTODON_KNOWN_DOMAIN_LIST_URL, credentials })
}
const fetchDomainMutes = ({ credentials }) => {
return promisedRequest({ url: MASTODON_DOMAIN_BLOCKS_URL, credentials })
}
const muteDomain = ({ domain, credentials }) => {
return promisedRequest({
url: MASTODON_DOMAIN_BLOCKS_URL,
method: 'POST',
payload: { domain },
credentials
})
}
const unmuteDomain = ({ domain, credentials }) => {
return promisedRequest({
url: MASTODON_DOMAIN_BLOCKS_URL,
method: 'DELETE',
payload: { domain },
credentials
})
}
const dismissNotification = ({ credentials, id }) => {
return promisedRequest({
url: MASTODON_DISMISS_NOTIFICATION_URL(id),
method: 'POST',
payload: { id },
credentials
})
}
export const getMastodonSocketURI = ({ credentials, stream, args = {} }) => {
return Object.entries({
...(credentials
? { access_token: credentials }
: {}
),
stream,
...args
}).reduce((acc, [key, val]) => {
return acc + `${key}=${val}&`
}, MASTODON_STREAMING + '?')
}
const MASTODON_STREAMING_EVENTS = new Set([
'update',
'notification',
'delete',
'filters_changed'
])
const PLEROMA_STREAMING_EVENTS = new Set([
'pleroma:chat_update'
])
// A thin wrapper around WebSocket API that allows adding a pre-processor to it
// Uses EventTarget and a CustomEvent to proxy events
export const ProcessedWS = ({
url,
preprocessor = handleMastoWS,
id = 'Unknown'
}) => {
const eventTarget = new EventTarget()
const socket = new WebSocket(url)
if (!socket) throw new Error(`Failed to create socket ${id}`)
const proxy = (original, eventName, processor = a => a) => {
original.addEventListener(eventName, (eventData) => {
eventTarget.dispatchEvent(new CustomEvent(
eventName,
{ detail: processor(eventData) }
))
})
}
socket.addEventListener('open', (wsEvent) => {
console.debug(`[WS][${id}] Socket connected`, wsEvent)
})
socket.addEventListener('error', (wsEvent) => {
console.debug(`[WS][${id}] Socket errored`, wsEvent)
})
socket.addEventListener('close', (wsEvent) => {
console.debug(
`[WS][${id}] Socket disconnected with code ${wsEvent.code}`,
wsEvent
)
})
// Commented code reason: very spammy, uncomment to enable message debug logging
/*
socket.addEventListener('message', (wsEvent) => {
console.debug(
`[WS][${id}] Message received`,
wsEvent
)
})
/**/
proxy(socket, 'open')
proxy(socket, 'close')
proxy(socket, 'message', preprocessor)
proxy(socket, 'error')
// 1000 = Normal Closure
eventTarget.close = () => { socket.close(1000, 'Shutting down socket') }
return eventTarget
}
export const handleMastoWS = (wsEvent) => {
const { data } = wsEvent
if (!data) return
const parsedEvent = JSON.parse(data)
const { event, payload } = parsedEvent
if (MASTODON_STREAMING_EVENTS.has(event) || PLEROMA_STREAMING_EVENTS.has(event)) {
// MastoBE and PleromaBE both send payload for delete as a PLAIN string
if (event === 'delete') {
return { event, id: payload }
}
const data = payload ? JSON.parse(payload) : null
if (event === 'update') {
return { event, status: parseStatus(data) }
} else if (event === 'notification') {
return { event, notification: parseNotification(data) }
} else if (event === 'pleroma:chat_update') {
return { event, chatUpdate: parseChat(data) }
}
} else {
console.warn('Unknown event', wsEvent)
return null
}
}
export const WSConnectionStatus = Object.freeze({
'JOINED': 1,
'CLOSED': 2,
'ERROR': 3
})
const chats = ({ credentials }) => {
return fetch(PLEROMA_CHATS_URL, { headers: authHeaders(credentials) })
.then((data) => data.json())
.then((data) => {
return { chats: data.map(parseChat).filter(c => c) }
})
}
const getOrCreateChat = ({ accountId, credentials }) => {
return promisedRequest({
url: PLEROMA_CHAT_URL(accountId),
method: 'POST',
credentials
})
}
const chatMessages = ({ id, credentials, maxId, sinceId, limit = 20 }) => {
let url = PLEROMA_CHAT_MESSAGES_URL(id)
const args = [
maxId && `max_id=${maxId}`,
sinceId && `since_id=${sinceId}`,
limit && `limit=${limit}`
].filter(_ => _).join('&')
url = url + (args ? '?' + args : '')
return promisedRequest({
url,
method: 'GET',
credentials
})
}
const sendChatMessage = ({ id, content, mediaId = null, idempotencyKey, credentials }) => {
const payload = {
'content': content
}
if (mediaId) {
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,
headers
})
}
const readChat = ({ id, lastReadId, credentials }) => {
return promisedRequest({
url: PLEROMA_CHAT_READ_URL(id),
method: 'POST',
payload: {
'last_read_id': lastReadId
},
credentials
})
}
const deleteChatMessage = ({ chatId, messageId, credentials }) => {
return promisedRequest({
url: PLEROMA_DELETE_CHAT_MESSAGE_URL(chatId, messageId),
method: 'DELETE',
credentials
})
}
const apiService = {
verifyCredentials,
fetchTimeline,
fetchPinnedStatuses,
fetchConversation,
fetchStatus,
fetchFriends,
exportFriends,
fetchFollowers,
followUser,
unfollowUser,
pinOwnStatus,
unpinOwnStatus,
muteConversation,
unmuteConversation,
blockUser,
unblockUser,
fetchUser,
fetchUserRelationship,
favorite,
unfavorite,
retweet,
unretweet,
bookmarkStatus,
unbookmarkStatus,
postStatus,
deleteStatus,
uploadMedia,
setMediaDescription,
fetchMutes,
muteUser,
unmuteUser,
subscribeUser,
unsubscribeUser,
fetchBlocks,
fetchOAuthTokens,
revokeOAuthToken,
tagUser,
untagUser,
deleteUser,
addRight,
deleteRight,
activateUser,
deactivateUser,
register,
getCaptcha,
updateProfileImages,
updateProfile,
importMutes,
importBlocks,
importFollows,
deleteAccount,
changeEmail,
changePassword,
settingsMFA,
mfaDisableOTP,
generateMfaBackupCodes,
mfaSetupOTP,
mfaConfirmOTP,
fetchFollowRequests,
approveUser,
denyUser,
suggestions,
markNotificationsAsSeen,
dismissNotification,
vote,
fetchPoll,
fetchFavoritedByUsers,
fetchRebloggedByUsers,
fetchEmojiReactions,
reactWithEmoji,
unreactWithEmoji,
reportUser,
updateNotificationSettings,
search2,
searchUsers,
fetchKnownDomains,
fetchDomainMutes,
muteDomain,
unmuteDomain,
chats,
getOrCreateChat,
chatMessages,
sendChatMessage,
readChat,
deleteChatMessage
}
export default apiService
diff --git a/src/services/chat_service/chat_service.js b/src/services/chat_service/chat_service.js
index 1fc4e390fc..e653ebc120 100644
--- a/src/services/chat_service/chat_service.js
+++ b/src/services/chat_service/chat_service.js
@@ -1,209 +1,209 @@
import _ from 'lodash'
const empty = (chatId) => {
return {
idIndex: {},
idempotencyKeyIndex: {},
messages: [],
newMessageCount: 0,
lastSeenMessageId: '0',
chatId: chatId,
minId: undefined,
maxId: undefined
}
}
const clear = (storage) => {
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.id]
+ delete storage.idempotencyKeyIndex[message.idempotency_key]
}
}
storage.messages = storage.messages.filter(m => failedMessageIds.includes(m.id))
storage.newMessageCount = 0
storage.lastSeenMessageId = '0'
storage.minId = undefined
storage.maxId = undefined
}
const deleteMessage = (storage, messageId) => {
if (!storage) { return }
storage.messages = storage.messages.filter(m => m.id !== messageId)
delete storage.idIndex[messageId]
if (storage.maxId === messageId) {
const lastMessage = _.maxBy(storage.messages, 'id')
storage.maxId = lastMessage.id
}
if (storage.minId === messageId) {
const firstMessage = _.minBy(storage.messages, 'id')
storage.minId = firstMessage.id
}
}
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++) {
const message = newMessages[i]
// sanity check
if (message.chat_id !== storage.chatId) { return }
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
}
if (!storage.maxId || message.id > storage.maxId) {
if (updateMaxId) {
storage.maxId = message.id
}
}
if (!storage.idIndex[message.id] && !isConfirmation(storage, message)) {
if (storage.lastSeenMessageId < message.id) {
storage.newMessageCount++
}
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.lastSeenMessageId = storage.maxId
}
// Inserts date separators and marks the head and tail if it's the chain of messages made by the same user
const getView = (storage) => {
if (!storage) { return [] }
const result = []
const messages = _.orderBy(storage.messages, ['pending', 'id'], ['asc', 'asc'])
const firstMessage = messages[0]
let previousMessage = messages[messages.length - 1]
let currentMessageChainId
if (firstMessage) {
const date = new Date(firstMessage.created_at)
date.setHours(0, 0, 0, 0)
result.push({
type: 'date',
date,
id: date.getTime().toString()
})
}
let afterDate = false
for (let i = 0; i < messages.length; i++) {
const message = messages[i]
const nextMessage = messages[i + 1]
const date = new Date(message.created_at)
date.setHours(0, 0, 0, 0)
// insert date separator and start a new message chain
if (previousMessage && previousMessage.date < date) {
result.push({
type: 'date',
date,
id: date.getTime().toString()
})
previousMessage['isTail'] = true
currentMessageChainId = undefined
afterDate = true
}
const object = {
type: 'message',
data: message,
date,
id: message.id,
messageChainId: currentMessageChainId
}
// end a message chian
if ((nextMessage && nextMessage.account_id) !== message.account_id) {
object['isTail'] = true
currentMessageChainId = undefined
}
// start a new message chain
if ((previousMessage && previousMessage.data && previousMessage.data.account_id) !== message.account_id || afterDate) {
currentMessageChainId = _.uniqueId()
object['isHead'] = true
object['messageChainId'] = currentMessageChainId
}
result.push(object)
previousMessage = object
afterDate = false
}
return result
}
const ChatService = {
add,
empty,
getView,
deleteMessage,
resetNewMessageCount,
clear,
handleMessageError
}
export default ChatService
diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js
index 093472e439..0fd01176d6 100644
--- a/src/services/entity_normalizer/entity_normalizer.service.js
+++ b/src/services/entity_normalizer/entity_normalizer.service.js
@@ -1,444 +1,450 @@
import escape from 'escape-html'
import parseLinkHeader from 'parse-link-header'
import { isStatusNotification } from '../notification_utils/notification_utils.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) {
return 'status'
}
if (status.retweeted_status) {
return 'retweet'
}
if ((typeof status.uri === 'string' && status.uri.match(/(fave|objectType=Favourite)/)) ||
(typeof status.text === 'string' && status.text.match(/favorited/))) {
return 'favorite'
}
if (status.text.match(/deleted notice {{tag/) || status.qvitter_delete_notice) {
return 'deletion'
}
if (status.text.match(/started following/) || status.activity_type === 'follow') {
return 'follow'
}
return 'unknown'
}
export const parseUser = (data) => {
const output = {}
const masto = data.hasOwnProperty('acct')
// case for users in "mentions" property for statuses in MastoAPI
const mastoShort = masto && !data.hasOwnProperty('avatar')
output.id = String(data.id)
if (masto) {
output.screen_name = data.acct
output.statusnet_profile_url = data.url
// There's nothing else to get
if (mastoShort) {
return output
}
output.name = data.display_name
output.name_html = addEmojis(escape(data.display_name), data.emojis)
output.description = data.note
output.description_html = addEmojis(data.note, data.emojis)
output.fields = data.fields
output.fields_html = data.fields.map(field => {
return {
name: addEmojis(escape(field.name), data.emojis),
value: addEmojis(field.value, data.emojis)
}
})
output.fields_text = data.fields.map(field => {
return {
name: unescape(field.name.replace(/<[^>]*>/g, '')),
value: unescape(field.value.replace(/<[^>]*>/g, ''))
}
})
// Utilize avatar_static for gif avatars?
output.profile_image_url = data.avatar
output.profile_image_url_original = data.avatar
// Same, utilize header_static?
output.cover_photo = data.header
output.friends_count = data.following_count
output.bot = data.bot
if (data.pleroma) {
const relationship = data.pleroma.relationship
output.background_image = data.pleroma.background_image
output.favicon = data.pleroma.favicon
output.token = data.pleroma.chat_token
if (relationship) {
output.relationship = relationship
}
output.allow_following_move = data.pleroma.allow_following_move
output.hide_follows = data.pleroma.hide_follows
output.hide_followers = data.pleroma.hide_followers
output.hide_follows_count = data.pleroma.hide_follows_count
output.hide_followers_count = data.pleroma.hide_followers_count
output.rights = {
moderator: data.pleroma.is_moderator,
admin: data.pleroma.is_admin
}
// TODO: Clean up in UI? This is duplication from what BE does for qvitterapi
if (output.rights.admin) {
output.role = 'admin'
} else if (output.rights.moderator) {
output.role = 'moderator'
} else {
output.role = 'member'
}
}
if (data.source) {
output.description = data.source.note
output.default_scope = data.source.privacy
output.fields = data.source.fields
if (data.source.pleroma) {
output.no_rich_text = data.source.pleroma.no_rich_text
output.show_role = data.source.pleroma.show_role
output.discoverable = data.source.pleroma.discoverable
}
}
// TODO: handle is_local
output.is_local = !output.screen_name.includes('@')
} else {
output.screen_name = data.screen_name
output.name = data.name
output.name_html = data.name_html
output.description = data.description
output.description_html = data.description_html
output.profile_image_url = data.profile_image_url
output.profile_image_url_original = data.profile_image_url_original
output.cover_photo = data.cover_photo
output.friends_count = data.friends_count
// output.bot = ??? missing
output.statusnet_profile_url = data.statusnet_profile_url
output.is_local = data.is_local
output.role = data.role
output.show_role = data.show_role
if (data.rights) {
output.rights = {
moderator: data.rights.delete_others_notice,
admin: data.rights.admin
}
}
output.no_rich_text = data.no_rich_text
output.default_scope = data.default_scope
output.hide_follows = data.hide_follows
output.hide_followers = data.hide_followers
output.hide_follows_count = data.hide_follows_count
output.hide_followers_count = data.hide_followers_count
output.background_image = data.background_image
// Websocket token
output.token = data.token
// Convert relationsip data to expected format
output.relationship = {
muting: data.muted,
blocking: data.statusnet_blocking,
followed_by: data.follows_you,
following: data.following
}
}
output.created_at = new Date(data.created_at)
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
output.notification_settings = data.pleroma.notification_settings
output.unread_chat_count = data.pleroma.unread_chat_count
}
output.tags = output.tags || []
output.rights = output.rights || {}
output.notification_settings = output.notification_settings || {}
return output
}
export const parseAttachment = (data) => {
const output = {}
const masto = !data.hasOwnProperty('oembed')
if (masto) {
// Not exactly same...
output.mimetype = data.pleroma ? data.pleroma.mime_type : data.type
output.meta = data.meta // not present in BE yet
output.id = data.id
} else {
output.mimetype = data.mimetype
// output.meta = ??? missing
}
output.url = data.url
output.large_thumb_url = data.preview_url
output.description = data.description
return output
}
export const addEmojis = (string, emojis) => {
const matchOperatorsRegex = /[|\\{}()[\]^$+*?.-]/g
return emojis.reduce((acc, emoji) => {
const regexSafeShortCode = emoji.shortcode.replace(matchOperatorsRegex, '\\$&')
return acc.replace(
new RegExp(`:${regexSafeShortCode}:`, 'g'),
`<img src='${emoji.url}' alt=':${emoji.shortcode}:' title=':${emoji.shortcode}:' class='emoji' />`
)
}, string)
}
export const parseStatus = (data) => {
const output = {}
const masto = data.hasOwnProperty('account')
if (masto) {
output.favorited = data.favourited
output.fave_num = data.favourites_count
output.repeated = data.reblogged
output.repeat_num = data.reblogs_count
output.bookmarked = data.bookmarked
output.type = data.reblog ? 'retweet' : 'status'
output.nsfw = data.sensitive
output.statusnet_html = addEmojis(data.content, data.emojis)
output.tags = data.tags
if (data.pleroma) {
const { pleroma } = data
output.text = pleroma.content ? data.pleroma.content['text/plain'] : data.content
output.summary = pleroma.spoiler_text ? data.pleroma.spoiler_text['text/plain'] : data.spoiler_text
output.statusnet_conversation_id = data.pleroma.conversation_id
output.is_local = pleroma.local
output.in_reply_to_screen_name = data.pleroma.in_reply_to_account_acct
output.thread_muted = pleroma.thread_muted
output.emoji_reactions = pleroma.emoji_reactions
output.parent_visible = pleroma.parent_visible === undefined ? true : pleroma.parent_visible
} else {
output.text = data.content
output.summary = data.spoiler_text
}
output.in_reply_to_status_id = data.in_reply_to_id
output.in_reply_to_user_id = data.in_reply_to_account_id
output.replies_count = data.replies_count
if (output.type === 'retweet') {
output.retweeted_status = parseStatus(data.reblog)
}
output.summary_html = addEmojis(escape(data.spoiler_text), data.emojis)
output.external_url = data.url
output.poll = data.poll
if (output.poll) {
output.poll.options = (output.poll.options || []).map(field => ({
...field,
title_html: addEmojis(field.title, data.emojis)
}))
}
output.pinned = data.pinned
output.muted = data.muted
} else {
output.favorited = data.favorited
output.fave_num = data.fave_num
output.repeated = data.repeated
output.repeat_num = data.repeat_num
// catchall, temporary
// Object.assign(output, data)
output.type = qvitterStatusType(data)
if (data.nsfw === undefined) {
output.nsfw = isNsfw(data)
if (data.retweeted_status) {
output.nsfw = data.retweeted_status.nsfw
}
} else {
output.nsfw = data.nsfw
}
output.statusnet_html = data.statusnet_html
output.text = data.text
output.in_reply_to_status_id = data.in_reply_to_status_id
output.in_reply_to_user_id = data.in_reply_to_user_id
output.in_reply_to_screen_name = data.in_reply_to_screen_name
output.statusnet_conversation_id = data.statusnet_conversation_id
if (output.type === 'retweet') {
output.retweeted_status = parseStatus(data.retweeted_status)
}
output.summary = data.summary
output.summary_html = data.summary_html
output.external_url = data.external_url
output.is_local = data.is_local
}
output.id = String(data.id)
output.visibility = data.visibility
output.card = data.card
output.created_at = new Date(data.created_at)
// Converting to string, the right way.
output.in_reply_to_status_id = output.in_reply_to_status_id
? String(output.in_reply_to_status_id)
: null
output.in_reply_to_user_id = output.in_reply_to_user_id
? String(output.in_reply_to_user_id)
: null
output.user = parseUser(masto ? data.account : data.user)
output.attentions = ((masto ? data.mentions : data.attentions) || []).map(parseUser)
output.attachments = ((masto ? data.media_attachments : data.attachments) || [])
.map(parseAttachment)
const retweetedStatus = masto ? data.reblog : data.retweeted_status
if (retweetedStatus) {
output.retweeted_status = parseStatus(retweetedStatus)
}
output.favoritedBy = []
output.rebloggedBy = []
return output
}
export const parseNotification = (data) => {
const mastoDict = {
'favourite': 'like',
'reblog': 'repeat'
}
const masto = !data.hasOwnProperty('ntype')
const output = {}
if (masto) {
output.type = mastoDict[data.type] || data.type
output.seen = data.pleroma.is_seen
output.status = isStatusNotification(output.type) ? parseStatus(data.status) : null
output.action = output.status // TODO: Refactor, this is unneeded
output.target = output.type !== 'move'
? null
: parseUser(data.target)
output.from_profile = parseUser(data.account)
output.emoji = data.emoji
if (data.report) {
output.report = data.report
output.report.content = data.report.content
output.report.acct = parseUser(data.report.acct)
output.report.actor = parseUser(data.report.actor)
output.report.statuses = data.report.statuses.map(parseStatus)
}
} else {
const parsedNotice = parseStatus(data.notice)
output.type = data.ntype
output.seen = Boolean(data.is_seen)
output.status = output.type === 'like'
? parseStatus(data.notice.favorited_status)
: parsedNotice
output.action = parsedNotice
output.from_profile = output.type === 'pleroma:chat_mention' ? parseUser(data.account) : parseUser(data.from_profile)
}
output.created_at = new Date(data.created_at)
output.id = parseInt(data.id)
return output
}
const isNsfw = (status) => {
const nsfwRegex = /#nsfw/i
return (status.tags || []).includes('nsfw') || !!(status.text || '').match(nsfwRegex)
}
export const parseLinkHeaderPagination = (linkHeader, opts = {}) => {
const flakeId = opts.flakeId
const parsedLinkHeader = parseLinkHeader(linkHeader)
if (!parsedLinkHeader) return
const maxId = parsedLinkHeader.next.max_id
const minId = parsedLinkHeader.prev.min_id
return {
maxId: flakeId ? maxId : parseInt(maxId, 10),
minId: flakeId ? minId : parseInt(minId, 10)
}
}
export const parseChat = (chat) => {
const output = {}
output.id = chat.id
output.account = parseUser(chat.account)
output.unread = chat.unread
output.lastMessage = parseChatMessage(chat.last_message)
output.updated_at = new Date(chat.updated_at)
return output
}
export const parseChatMessage = (message) => {
if (!message) { return }
if (message.isNormalized) { return message }
const output = message
output.id = message.id
output.created_at = new Date(message.created_at)
output.chat_id = message.chat_id
if (message.content) {
output.content = addEmojis(message.content, message.emojis)
} else {
output.content = ''
}
if (message.attachment) {
output.attachments = [parseAttachment(message.attachment)]
} 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 0000000000..d1ddee4102
--- /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/notifications_fetcher/notifications_fetcher.service.js b/src/services/notifications_fetcher/notifications_fetcher.service.js
index c908b6443b..beeb167c44 100644
--- a/src/services/notifications_fetcher/notifications_fetcher.service.js
+++ b/src/services/notifications_fetcher/notifications_fetcher.service.js
@@ -1,72 +1,82 @@
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 })
}
const fetchAndUpdate = ({ store, credentials, older = false }) => {
const args = { credentials }
const { getters } = store
const rootState = store.rootState || store.state
const timelineData = rootState.statuses.notifications
const hideMutedPosts = getters.mergedConfig.hideMutedPosts
args['withMuted'] = !hideMutedPosts
args['timeline'] = 'notifications'
if (older) {
if (timelineData.minId !== Number.POSITIVE_INFINITY) {
args['until'] = timelineData.minId
}
return fetchNotifications({ store, args, older })
} else {
// fetch new notifications
if (timelineData.maxId !== Number.POSITIVE_INFINITY) {
args['since'] = timelineData.maxId
}
const result = fetchNotifications({ store, args, older })
// If there's any unread notifications, try fetch notifications since
// the newest read notification to check if any of the unread notifs
// have changed their 'seen' state (marked as read in another session), so
// we can update the state in this session to mark them as read as well.
// The normal maxId-check does not tell if older notifications have changed
const notifications = timelineData.data
const readNotifsIds = notifications.filter(n => n.seen).map(n => n.id)
const numUnseenNotifs = notifications.length - readNotifsIds.length
if (numUnseenNotifs > 0 && readNotifsIds.length > 0) {
args['since'] = Math.max(...readNotifsIds)
fetchNotifications({ store, args, older })
}
return result
}
}
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 }) => {
// Initially there's set flag to silence all desktop notifications so
// that there won't spam of them when user just opened up the FE we
// reset that flag after a while to show new notifications once again.
setTimeout(() => store.dispatch('setNotificationsSilence', false), 10000)
const boundFetchAndUpdate = () => fetchAndUpdate({ credentials, store })
boundFetchAndUpdate()
return promiseInterval(boundFetchAndUpdate, 10000)
}
const notificationsFetcher = {
fetchAndUpdate,
startFetching
}
export default notificationsFetcher
diff --git a/src/services/timeline_fetcher/timeline_fetcher.service.js b/src/services/timeline_fetcher/timeline_fetcher.service.js
index 72ea4890ae..921df3edac 100644
--- a/src/services/timeline_fetcher/timeline_fetcher.service.js
+++ b/src/services/timeline_fetcher/timeline_fetcher.service.js
@@ -1,84 +1,88 @@
import { camelCase } from 'lodash'
import apiService from '../api/api.service.js'
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,
statuses,
showImmediately,
pagination
})
}
const fetchAndUpdate = ({
store,
credentials,
timeline = 'friends',
older = false,
showImmediately = false,
userId = false,
tag = false,
until
}) => {
const args = { timeline, credentials }
const rootState = store.rootState || store.state
const { getters } = store
const timelineData = rootState.statuses.timelines[camelCase(timeline)]
const { hideMutedPosts, replyVisibility } = getters.mergedConfig
const loggedIn = !!rootState.users.currentUser
if (older) {
args['until'] = until || timelineData.minId
} else {
args['since'] = timelineData.maxId
}
args['userId'] = userId
args['tag'] = tag
args['withMuted'] = !hideMutedPosts
if (loggedIn && ['friends', 'public', 'publicAndExternal'].includes(timeline)) {
args['replyVisibility'] = replyVisibility
}
const numStatusesBeforeFetch = timelineData.statuses.length
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
if (!older && statuses.length >= 20 && !timelineData.loading && numStatusesBeforeFetch > 0) {
store.dispatch('queueFlush', { timeline: timeline, id: timelineData.maxId })
}
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 }) => {
const rootState = store.rootState || store.state
const timelineData = rootState.statuses.timelines[camelCase(timeline)]
const showImmediately = timelineData.visibleStatuses.length === 0
timelineData.userId = userId
fetchAndUpdate({ timeline, credentials, store, showImmediately, userId, tag })
const boundFetchAndUpdate = () =>
fetchAndUpdate({ timeline, credentials, store, userId, tag })
return promiseInterval(boundFetchAndUpdate, 10000)
}
const timelineFetcher = {
fetchAndUpdate,
startFetching
}
export default timelineFetcher
diff --git a/static/emoji.json b/static/emoji.json
index ae93d17e11..12b91b3f6a 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/test/unit/specs/components/user_profile.spec.js b/test/unit/specs/components/user_profile.spec.js
index dcf066f9a3..80092b410c 100644
--- a/test/unit/specs/components/user_profile.spec.js
+++ b/test/unit/specs/components/user_profile.spec.js
@@ -1,207 +1,206 @@
import { mount, createLocalVue } from '@vue/test-utils'
import Vuex from 'vuex'
import UserProfile from 'src/components/user_profile/user_profile.vue'
import backendInteractorService from 'src/services/backend_interactor_service/backend_interactor_service.js'
import { getters } from 'src/modules/users.js'
const localVue = createLocalVue()
localVue.use(Vuex)
const mutations = {
- clearTimeline: () => {},
- setError: () => {}
+ clearTimeline: () => {}
}
const actions = {
fetchUser: () => {},
fetchUserByScreenName: () => {}
}
const testGetters = {
findUser: state => getters.findUser(state.users),
relationship: state => getters.relationship(state.users),
mergedConfig: state => ({
colors: '',
highlight: {},
customTheme: {
colors: []
}
})
}
const localUser = {
id: 100,
is_local: true,
screen_name: 'testUser'
}
const extUser = {
id: 100,
is_local: false,
screen_name: 'testUser@test.instance'
}
const externalProfileStore = new Vuex.Store({
mutations,
actions,
getters: testGetters,
state: {
api: {
fetchers: {},
backendInteractor: backendInteractorService('')
},
interface: {
browserSupport: ''
},
instance: {
hideUserStats: true
},
statuses: {
timelines: {
user: {
statuses: [],
statusesObject: {},
faves: [],
visibleStatuses: [],
visibleStatusesObject: {},
newStatusCount: 0,
maxId: 0,
minVisibleId: 0,
loading: false,
followers: [],
friends: [],
viewing: 'statuses',
userId: 100,
flushMarker: 0
},
media: {
statuses: [],
statusesObject: {},
faves: [],
visibleStatuses: [],
visibleStatusesObject: {},
newStatusCount: 0,
maxId: 0,
minVisibleId: 0,
loading: false,
followers: [],
friends: [],
viewing: 'statuses',
userId: 100,
flushMarker: 0
}
}
},
users: {
currentUser: {
credentials: ''
},
usersObject: { 100: extUser },
users: [extUser],
relationships: {}
}
}
})
const localProfileStore = new Vuex.Store({
mutations,
actions,
getters: testGetters,
state: {
api: {
fetchers: {},
backendInteractor: backendInteractorService('')
},
interface: {
browserSupport: ''
},
config: {
colors: '',
highlight: {},
customTheme: {
colors: []
}
},
instance: {
hideUserStats: true
},
statuses: {
timelines: {
user: {
statuses: [],
statusesObject: {},
faves: [],
visibleStatuses: [],
visibleStatusesObject: {},
newStatusCount: 0,
maxId: 0,
minVisibleId: 0,
loading: false,
followers: [],
friends: [],
viewing: 'statuses',
userId: 100,
flushMarker: 0
},
media: {
statuses: [],
statusesObject: {},
faves: [],
visibleStatuses: [],
visibleStatusesObject: {},
newStatusCount: 0,
maxId: 0,
minVisibleId: 0,
loading: false,
followers: [],
friends: [],
viewing: 'statuses',
userId: 100,
flushMarker: 0
}
}
},
users: {
currentUser: {
credentials: ''
},
usersObject: { 100: localUser, 'testuser': localUser },
users: [localUser],
relationships: {}
}
}
})
describe('UserProfile', () => {
it('renders external profile', () => {
const wrapper = mount(UserProfile, {
localVue,
store: externalProfileStore,
mocks: {
$route: {
params: { id: 100 },
name: 'external-user-profile'
},
$t: (msg) => msg
}
})
expect(wrapper.find('.user-screen-name').text()).to.eql('@testUser@test.instance')
})
it('renders local profile', () => {
const wrapper = mount(UserProfile, {
localVue,
store: localProfileStore,
mocks: {
$route: {
params: { name: 'testUser' },
name: 'user-profile'
},
$t: (msg) => msg
}
})
expect(wrapper.find('.user-screen-name').text()).to.eql('@testUser')
})
})
diff --git a/tools/emoji_merger.js b/tools/emoji_merger.js
new file mode 100644
index 0000000000..a74e847edf
--- /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 0000000000..62f25070a2
--- /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": "&#128105;&zwj;&#128105;&zwj;&#128103;&zwj;&#128103;", "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": "&#128105;&zwj;&#128105;&zwj;&#128103;&zwj;&#128102;", "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": "&#128105;&zwj;&#128105;&zwj;&#128102;&zwj;&#128102;", "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": "&#128104;&zwj;&#128105;&zwj;&#128103;&zwj;&#128103;", "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": "&#128104;&zwj;&#128105;&zwj;&#128103;&zwj;&#128102;", "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": "&#128104;&zwj;&#128105;&zwj;&#128102;&zwj;&#128102;", "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": "&#128104;&zwj;&#128104;&zwj;&#128103;&zwj;&#128103;", "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": "&#128104;&zwj;&#128104;&zwj;&#128103;&zwj;&#128102;", "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": "&#128104;&zwj;&#128104;&zwj;&#128102;&zwj;&#128102;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👩‍👩‍👧", "name": "family: woman, woman, girl", "shortname": ":woman_woman_girl:", "unicode": "1F469 200D 1F469 200D 1F467", "html": "&#128105;&zwj;&#128105;&zwj;&#128103;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👩‍👩‍đŸ‘Ļ", "name": "family: woman, woman, boy", "shortname": ":woman_woman_boy:", "unicode": "1F469 200D 1F469 200D 1F466", "html": "&#128105;&zwj;&#128105;&zwj;&#128102;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👩‍👧‍👧", "name": "family: woman, girl, girl", "shortname": ":woman_girl_girl:", "unicode": "1F469 200D 1F467 200D 1F467", "html": "&#128105;&zwj;&#128103;&zwj;&#128103;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👩‍👧‍đŸ‘Ļ", "name": "family: woman, girl, boy", "shortname": ":woman_girl_boy:", "unicode": "1F469 200D 1F467 200D 1F466", "html": "&#128105;&zwj;&#128103;&zwj;&#128102;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👩‍đŸ‘Ļ‍đŸ‘Ļ", "name": "family: woman, boy, boy", "shortname": ":woman_boy_boy:", "unicode": "1F469 200D 1F466 200D 1F466", "html": "&#128105;&zwj;&#128102;&zwj;&#128102;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👨‍👩‍👧", "name": "family: man, woman, girl", "shortname": ":man_woman_girl:", "unicode": "1F468 200D 1F469 200D 1F467", "html": "&#128104;&zwj;&#128105;&zwj;&#128103;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👨‍👨‍👧", "name": "family: man, man, girl", "shortname": ":man_man_girl:", "unicode": "1F468 200D 1F468 200D 1F467", "html": "&#128104;&zwj;&#128104;&zwj;&#128103;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👨‍👨‍đŸ‘Ļ", "name": "family: man, man, boy", "shortname": ":man_man_boy:", "unicode": "1F468 200D 1F468 200D 1F466", "html": "&#128104;&zwj;&#128104;&zwj;&#128102;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👨‍👧‍👧", "name": "family: man, girl, girl", "shortname": ":man_girl_girl:", "unicode": "1F468 200D 1F467 200D 1F467", "html": "&#128104;&zwj;&#128103;&zwj;&#128103;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👨‍👧‍đŸ‘Ļ", "name": "family: man, girl, boy", "shortname": ":man_girl_boy:", "unicode": "1F468 200D 1F467 200D 1F466", "html": "&#128104;&zwj;&#128103;&zwj;&#128102;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👨‍đŸ‘Ļ‍đŸ‘Ļ", "name": "family: man, boy, boy", "shortname": ":man_boy_boy:", "unicode": "1F468 200D 1F466 200D 1F466", "html": "&#128104;&zwj;&#128102;&zwj;&#128102;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👩‍👧", "name": "family: woman, girl", "shortname": ":woman_girl:", "unicode": "1F469 200D 1F467", "html": "&#128105;&zwj;&#128103;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👩‍đŸ‘Ļ", "name": "family: woman, boy", "shortname": ":woman_boy:", "unicode": "1F469 200D 1F466", "html": "&#128105;&zwj;&#128102;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👨‍👧", "name": "family: man, girl", "shortname": ":man_girl:", "unicode": "1F468 200D 1F467", "html": "&#128104;&zwj;&#128103;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👨‍đŸ‘Ļ", "name": "family: man, boy", "shortname": ":man_boy:", "unicode": "1F468 200D 1F466", "html": "&#128104;&zwj;&#128102;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "😂", "name": "face with tears of joy", "shortname": ":joy:", "unicode": "1f602", "html": "&#128514;", "category": "Smileys & Emotion (face-smiling)", "order": "3"},
+ {"emoji": "â¤ī¸", "name": "red heart", "shortname": ":heart:", "unicode": "2764", "html": "&#10084;", "category": "Smileys & Emotion (emotion)", "order": "1286"},
+ {"emoji": "â™Ĩī¸", "name": "heart suit", "shortname": ":heart_suit:", "unicode": "2665 FE0F", "html": "&hearts;ī¸", "category": "Activities (game)", "order": ""},
+ {"emoji": "😍", "name": "smiling face with heart-eyes", "shortname": ":heart_eyes:", "unicode": "1f60d", "html": "&#128525;", "category": "Smileys & Emotion (face-affection)", "order": "13"},
+ {"emoji": "😭", "name": "loudly crying face", "shortname": ":sob:", "unicode": "1f62d", "html": "&#128557;", "category": "Smileys & Emotion (face-concerned)", "order": "55"},
+ {"emoji": "😊", "name": "smiling face with smiling eyes", "shortname": ":blush:", "unicode": "1f60a", "html": "&#128522;", "category": "Smileys & Emotion (face-smiling)", "order": "10"},
+ {"emoji": "😒", "name": "unamused face", "shortname": ":unamused:", "unicode": "1f612", "html": "&#128530;", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": "41"},
+ {"emoji": "😘", "name": "face blowing a kiss", "shortname": ":kissing_heart:", "unicode": "1f618", "html": "&#128536;", "category": "Smileys & Emotion (face-affection)", "order": "14"},
+ {"emoji": "💕", "name": "two hearts", "shortname": ":two_hearts:", "unicode": "1f495", "html": "&#128149;", "category": "Smileys & Emotion (emotion)", "order": "1289"},
+ {"emoji": "â˜ēī¸", "name": "smiling face", "shortname": ":smiling:", "unicode": "263A FE0F", "html": "&#9786;", "category": "Smileys & Emotion (face-affection)", "order": ""},
+ {"emoji": "😩", "name": "weary face", "shortname": ":weary:", "unicode": "1f629", "html": "&#128553;", "category": "Smileys & Emotion (face-concerned)", "order": "59"},
+ {"emoji": "👌đŸŋ", "name": "OK hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F44C 1F3FF", "html": "&#128076;&#127999;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "👌🏾", "name": "OK hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F44C 1F3FE", "html": "&#128076;&#127998;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "👌đŸŊ", "name": "OK hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F44C 1F3FD", "html": "&#128076;&#127997;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "👌đŸŧ", "name": "OK hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F44C 1F3FC", "html": "&#128076;&#127996;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "👌đŸģ", "name": "OK hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F44C 1F3FB", "html": "&#128076;&#127995;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "👌", "name": "OK hand", "shortname": ":ok_hand:", "unicode": "1f44c", "html": "&#128076;", "category": "People & Body (hand-fingers-partial)", "order": "1170"},
+ {"emoji": "😔", "name": "pensive face", "shortname": ":pensive:", "unicode": "1f614", "html": "&#128532;", "category": "Smileys & Emotion (face-sleepy)", "order": "43"},
+ {"emoji": "😏", "name": "smirking face", "shortname": ":smirk:", "unicode": "1f60f", "html": "&#128527;", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": "26"},
+ {"emoji": "😁", "name": "beaming face with smiling eyes", "shortname": ":grin:", "unicode": "1f601", "html": "&#128513;", "category": "Smileys & Emotion (face-smiling)", "order": "2"},
+ {"emoji": "â™ģ", "name": "recycling symbol", "shortname": ":recycle:", "unicode": "267b", "html": "&#9851;", "category": "Symbols (other-symbol)", "order": "2072"},
+ {"emoji": "😉", "name": "winking face", "shortname": ":wink:", "unicode": "1f609", "html": "&#128521;", "category": "Smileys & Emotion (face-smiling)", "order": "9"},
+ {"emoji": "👍đŸŋ", "name": "thumbs up: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F44D 1F3FF", "html": "&#128077;&#127999;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "👍🏾", "name": "thumbs up: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F44D 1F3FE", "html": "&#128077;&#127998;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "👍đŸŊ", "name": "thumbs up: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F44D 1F3FD", "html": "&#128077;&#127997;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "👍đŸŧ", "name": "thumbs up: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F44D 1F3FC", "html": "&#128077;&#127996;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "👍đŸģ", "name": "thumbs up: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F44D 1F3FB", "html": "&#128077;&#127995;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "👍", "name": "thumbs up", "shortname": ":thumbsup:", "unicode": "1f44d", "html": "&#128077;", "category": "People & Body (hand-fingers-closed)", "order": "1176"},
+ {"emoji": "🙏đŸŋ", "name": "folded hands: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64F 1F3FF", "html": "&#128591;&#127999;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "🙏🏾", "name": "folded hands: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64F 1F3FE", "html": "&#128591;&#127998;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "🙏đŸŊ", "name": "folded hands: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64F 1F3FD", "html": "&#128591;&#127997;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "🙏đŸŧ", "name": "folded hands: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64F 1F3FC", "html": "&#128591;&#127996;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "🙏đŸģ", "name": "folded hands: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64F 1F3FB", "html": "&#128591;&#127995;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "🙏", "name": "folded hands", "shortname": ":pray:", "unicode": "1f64f", "html": "&#128591;", "category": "People & Body (hands)", "order": "1248"},
+ {"emoji": "😌", "name": "relieved face", "shortname": ":relieved:", "unicode": "1f60c", "html": "&#128524;", "category": "Smileys & Emotion (face-sleepy)", "order": "35"},
+ {"emoji": "đŸŽļ", "name": "musical notes", "shortname": ":notes:", "unicode": "1f3b6", "html": "&#127926;", "category": "Objects (music)", "order": "1825"},
+ {"emoji": "đŸ˜ŗ", "name": "flushed face", "shortname": ":flushed:", "unicode": "1f633", "html": "&#128563;", "category": "Smileys & Emotion (face-concerned)", "order": "63"},
+ {"emoji": "🙌đŸŋ", "name": "raising hands: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64C 1F3FF", "html": "&#128588;&#127999;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "🙌🏾", "name": "raising hands: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64C 1F3FE", "html": "&#128588;&#127998;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "🙌đŸŊ", "name": "raising hands: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64C 1F3FD", "html": "&#128588;&#127997;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "🙌đŸŧ", "name": "raising hands: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64C 1F3FC", "html": "&#128588;&#127996;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "🙌đŸģ", "name": "raising hands: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64C 1F3FB", "html": "&#128588;&#127995;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "🙌", "name": "raising hands", "shortname": ":raised_hands:", "unicode": "1f64c", "html": "&#128588;", "category": "People & Body (hands)", "order": "1242"},
+ {"emoji": "🙈", "name": "see-no-evil monkey", "shortname": ":see_no_evil:", "unicode": "1f648", "html": "&#128584;", "category": "Smileys & Emotion (monkey-face)", "order": "96"},
+ {"emoji": "đŸ˜ĸ", "name": "crying face", "shortname": ":cry:", "unicode": "1f622", "html": "&#128546;", "category": "Smileys & Emotion (face-concerned)", "order": "54"},
+ {"emoji": "😎", "name": "smiling face with sunglasses", "shortname": ":sunglasses:", "unicode": "1f60e", "html": "&#128526;", "category": "Smileys & Emotion (face-glasses)", "order": "12"},
+ {"emoji": "✌đŸŋ", "name": "victory hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "270C 1F3FF", "html": "&#9996;&#127999;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "✌🏾", "name": "victory hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "270C 1F3FE", "html": "&#9996;&#127998;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "✌đŸŊ", "name": "victory hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "270C 1F3FD", "html": "&#9996;&#127997;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "✌đŸŧ", "name": "victory hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "270C 1F3FC", "html": "&#9996;&#127996;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "✌đŸģ", "name": "victory hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "270C 1F3FB", "html": "&#9996;&#127995;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "âœŒī¸", "name": "victory hand", "shortname": ":v:", "unicode": "270c", "html": "&#9996;", "category": "People & Body (hand-fingers-partial)", "order": "1128"},
+ {"emoji": "👀", "name": "eyes", "shortname": ":eyes:", "unicode": "1f440", "html": "&#128064;", "category": "People & Body (body-parts)", "order": "1279"},
+ {"emoji": "😅", "name": "grinning face with sweat", "shortname": ":sweat_smile:", "unicode": "1f605", "html": "&#128517;", "category": "Smileys & Emotion (face-smiling)", "order": "7"},
+ {"emoji": "✨", "name": "sparkles", "shortname": ":sparkles:", "unicode": "2728", "html": "&#10024;", "category": "Activities (event)", "order": "1760"},
+ {"emoji": "😴", "name": "sleeping face", "shortname": ":sleeping:", "unicode": "1f634", "html": "&#128564;", "category": "Smileys & Emotion (face-sleepy)", "order": "34"},
+ {"emoji": "😄", "name": "grinning face with smiling eyes", "shortname": ":smile:", "unicode": "1f604", "html": "&#128516;", "category": "Smileys & Emotion (face-smiling)", "order": "6"},
+ {"emoji": "💜", "name": "purple heart", "shortname": ":purple_heart:", "unicode": "1f49c", "html": "&#128156;", "category": "Smileys & Emotion (emotion)", "order": "1295"},
+ {"emoji": "💔", "name": "broken heart", "shortname": ":broken_heart:", "unicode": "1f494", "html": "&#128148;", "category": "Smileys & Emotion (emotion)", "order": "1288"},
+ {"emoji": "đŸ’¯", "name": "hundred points", "shortname": ":hundred_points:", "unicode": "1F4AF", "html": "&#128175;", "category": "Smileys & Emotion (emotion)", "order": ""},
+ {"emoji": "😑", "name": "expressionless face", "shortname": ":expressionless:", "unicode": "1f611", "html": "&#128529;", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": "23"},
+ {"emoji": "💖", "name": "sparkling heart", "shortname": ":sparkling_heart:", "unicode": "1f496", "html": "&#128150;", "category": "Smileys & Emotion (emotion)", "order": "1290"},
+ {"emoji": "💙", "name": "blue heart", "shortname": ":blue_heart:", "unicode": "1f499", "html": "&#128153;", "category": "Smileys & Emotion (emotion)", "order": "1292"},
+ {"emoji": "😕", "name": "confused face", "shortname": ":confused:", "unicode": "1f615", "html": "&#128533;", "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": "&#128129;&#127999;&zwj;&#9794;", "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": "&#128129;&#127998;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "💁đŸŊ‍♂", "name": "man tipping hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F481 1F3FD 200D 2642", "html": "&#128129;&#127997;&zwj;&#9794;", "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": "&#128129;&#127996;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "💁đŸģ‍♂", "name": "man tipping hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F481 1F3FB 200D 2642", "html": "&#128129;&#127995;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "💁‍♂", "name": "man tipping hand", "shortname": ":man_tipping_hand:", "unicode": "1F481 200D 2642", "html": "&#128129;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "💁đŸŋ", "name": "person tipping hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F481 1F3FF", "html": "&#128129;&#127999;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "💁🏾", "name": "person tipping hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F481 1F3FE", "html": "&#128129;&#127998;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "💁đŸŊ", "name": "person tipping hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F481 1F3FD", "html": "&#128129;&#127997;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "💁đŸŧ", "name": "person tipping hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F481 1F3FC", "html": "&#128129;&#127996;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "💁đŸģ", "name": "person tipping hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F481 1F3FB", "html": "&#128129;&#127995;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "💁", "name": "person tipping hand", "shortname": ":information_desk_person:", "unicode": "1f481", "html": "&#128129;", "category": "People & Body (person-gesture)", "order": "567"},
+ {"emoji": "😜", "name": "winking face with tongue", "shortname": ":stuck_out_tongue_winking_eye:", "unicode": "1f61c", "html": "&#128540;", "category": "Smileys & Emotion (face-tongue)", "order": "38"},
+ {"emoji": "😞", "name": "disappointed face", "shortname": ":disappointed:", "unicode": "1f61e", "html": "&#128542;", "category": "Smileys & Emotion (face-concerned)", "order": "51"},
+ {"emoji": "😋", "name": "face savoring food", "shortname": ":yum:", "unicode": "1f60b", "html": "&#128523;", "category": "Smileys & Emotion (face-tongue)", "order": "11"},
+ {"emoji": "😐", "name": "neutral face", "shortname": ":neutral_face:", "unicode": "1f610", "html": "&#128528;", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": "22"},
+ {"emoji": "đŸ˜Ē", "name": "sleepy face", "shortname": ":sleepy:", "unicode": "1f62a", "html": "&#128554;", "category": "Smileys & Emotion (face-sleepy)", "order": "32"},
+ {"emoji": "👏đŸŋ", "name": "clapping hands: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F44F 1F3FF", "html": "&#128079;&#127999;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "👏🏾", "name": "clapping hands: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F44F 1F3FE", "html": "&#128079;&#127998;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "👏đŸŊ", "name": "clapping hands: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F44F 1F3FD", "html": "&#128079;&#127997;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "👏đŸŧ", "name": "clapping hands: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F44F 1F3FC", "html": "&#128079;&#127996;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "👏đŸģ", "name": "clapping hands: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F44F 1F3FB", "html": "&#128079;&#127995;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "👏", "name": "clapping hands", "shortname": ":clap:", "unicode": "1f44f", "html": "&#128079;", "category": "People & Body (hands)", "order": "1224"},
+ {"emoji": "💘", "name": "heart with arrow", "shortname": ":cupid:", "unicode": "1f498", "html": "&#128152;", "category": "Smileys & Emotion (emotion)", "order": "1285"},
+ {"emoji": "💗", "name": "growing heart", "shortname": ":heartpulse:", "unicode": "1f497", "html": "&#128151;", "category": "Smileys & Emotion (emotion)", "order": "1291"},
+ {"emoji": "💞", "name": "revolving hearts", "shortname": ":revolving_hearts:", "unicode": "1f49e", "html": "&#128158;", "category": "Smileys & Emotion (emotion)", "order": "1298"},
+ {"emoji": "âŦ…ī¸", "name": "left arrow", "shortname": ":arrow_left:", "unicode": "2b05", "html": "&#11013;", "category": "Symbols (arrow)", "order": "2008"},
+ {"emoji": "🙊", "name": "speak-no-evil monkey", "shortname": ":speak_no_evil:", "unicode": "1f64a", "html": "&#128586;", "category": "Smileys & Emotion (monkey-face)", "order": "98"},
+ {"emoji": "✋đŸŋ", "name": "raised hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "270B 1F3FF", "html": "&#9995;&#127999;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "✋🏾", "name": "raised hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "270B 1F3FE", "html": "&#9995;&#127998;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "✋đŸŊ", "name": "raised hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "270B 1F3FD", "html": "&#9995;&#127997;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "✋đŸŧ", "name": "raised hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "270B 1F3FC", "html": "&#9995;&#127996;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "✋đŸģ", "name": "raised hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "270B 1F3FB", "html": "&#9995;&#127995;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "✋", "name": "raised hand", "shortname": ":raised_hand:", "unicode": "270B", "html": "&#9995;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "💋", "name": "kiss mark", "shortname": ":kiss:", "unicode": "1f48b", "html": "&#128139;", "category": "Smileys & Emotion (emotion)", "order": "1284"},
+ {"emoji": "👉đŸŋ", "name": "backhand index pointing right: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F449 1F3FF", "html": "&#128073;&#127999;", "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": "&#128073;&#127998;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "👉đŸŊ", "name": "backhand index pointing right: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F449 1F3FD", "html": "&#128073;&#127997;", "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": "&#128073;&#127996;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "👉đŸģ", "name": "backhand index pointing right: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F449 1F3FB", "html": "&#128073;&#127995;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "👉", "name": "backhand index pointing right", "shortname": ":point_right:", "unicode": "1f449", "html": "&#128073;", "category": "People & Body (hand-single-finger)", "order": "1098"},
+ {"emoji": "🌸", "name": "cherry blossom", "shortname": ":cherry_blossom:", "unicode": "1f338", "html": "&#127800;", "category": "Animals & Nature (plant-flower)", "order": "1428"},
+ {"emoji": "😱", "name": "face screaming in fear", "shortname": ":scream:", "unicode": "1f631", "html": "&#128561;", "category": "Smileys & Emotion (face-concerned)", "order": "62"},
+ {"emoji": "đŸ”Ĩ", "name": "fire", "shortname": ":fire:", "unicode": "1f525", "html": "&#128293;", "category": "Travel & Places (sky & weather)", "order": "1753"},
+ {"emoji": "😡", "name": "pouting face", "shortname": ":rage:", "unicode": "1f621", "html": "&#128545;", "category": "Smileys & Emotion (face-negative)", "order": "65"},
+ {"emoji": "😃", "name": "grinning face with big eyes", "shortname": ":smiley:", "unicode": "1f603", "html": "&#128515;", "category": "Smileys & Emotion (face-smiling)", "order": "5"},
+ {"emoji": "🎉", "name": "party popper", "shortname": ":tada:", "unicode": "1f389", "html": "&#127881;", "category": "Activities (event)", "order": "1762"},
+ {"emoji": "👊đŸŋ", "name": "oncoming fist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F44A 1F3FF", "html": "&#128074;&#127999;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "👊🏾", "name": "oncoming fist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F44A 1F3FE", "html": "&#128074;&#127998;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "👊đŸŊ", "name": "oncoming fist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F44A 1F3FD", "html": "&#128074;&#127997;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "👊đŸŧ", "name": "oncoming fist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F44A 1F3FC", "html": "&#128074;&#127996;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "👊đŸģ", "name": "oncoming fist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F44A 1F3FB", "html": "&#128074;&#127995;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "👊", "name": "oncoming fist", "shortname": ":oncoming_fist:", "unicode": "1F44A", "html": "&#128074;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "đŸ˜Ģ", "name": "tired face", "shortname": ":tired_face:", "unicode": "1f62b", "html": "&#128555;", "category": "Smileys & Emotion (face-concerned)", "order": "33"},
+ {"emoji": "📷", "name": "camera", "shortname": ":camera:", "unicode": "1f4f7", "html": "&#128247;", "category": "Objects (light & video)", "order": "1861"},
+ {"emoji": "🌹", "name": "rose", "shortname": ":rose:", "unicode": "1f339", "html": "&#127801;", "category": "Animals & Nature (plant-flower)", "order": "1431"},
+ {"emoji": "😝", "name": "squinting face with tongue", "shortname": ":stuck_out_tongue_closed_eyes:", "unicode": "1f61d", "html": "&#128541;", "category": "Smileys & Emotion (face-tongue)", "order": "39"},
+ {"emoji": "đŸ’ĒđŸŋ", "name": "flexed biceps: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F4AA 1F3FF", "html": "&#128170;&#127999;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸ’Ē🏾", "name": "flexed biceps: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F4AA 1F3FE", "html": "&#128170;&#127998;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸ’ĒđŸŊ", "name": "flexed biceps: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F4AA 1F3FD", "html": "&#128170;&#127997;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸ’ĒđŸŧ", "name": "flexed biceps: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F4AA 1F3FC", "html": "&#128170;&#127996;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸ’ĒđŸģ", "name": "flexed biceps: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F4AA 1F3FB", "html": "&#128170;&#127995;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸ’Ē", "name": "flexed biceps", "shortname": ":muscle:", "unicode": "1f4aa", "html": "&#128170;", "category": "People & Body (body-parts)", "order": "1080"},
+ {"emoji": "💀", "name": "skull", "shortname": ":skull:", "unicode": "1f480", "html": "&#128128;", "category": "Smileys & Emotion (face-negative)", "order": "80"},
+ {"emoji": "â˜€ī¸", "name": "sun", "shortname": ":sunny:", "unicode": "2600", "html": "&#9728;", "category": "Travel & Places (sky & weather)", "order": "1724"},
+ {"emoji": "💛", "name": "yellow heart", "shortname": ":yellow_heart:", "unicode": "1f49b", "html": "&#128155;", "category": "Smileys & Emotion (emotion)", "order": "1294"},
+ {"emoji": "😤", "name": "face with steam from nose", "shortname": ":triumph:", "unicode": "1f624", "html": "&#128548;", "category": "Smileys & Emotion (face-negative)", "order": "53"},
+ {"emoji": "🌚", "name": "new moon face", "shortname": ":new_moon_with_face:", "unicode": "1f31a", "html": "&#127770;", "category": "Travel & Places (sky & weather)", "order": "1720"},
+ {"emoji": "😆", "name": "grinning squinting face", "shortname": ":laughing:", "unicode": "1f606", "html": "&#128518;", "category": "Smileys & Emotion (face-smiling)", "order": "8"},
+ {"emoji": "😓", "name": "downcast face with sweat", "shortname": ":sweat:", "unicode": "1f613", "html": "&#128531;", "category": "Smileys & Emotion (face-concerned)", "order": "42"},
+ {"emoji": "👈đŸŋ", "name": "backhand index pointing left: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F448 1F3FF", "html": "&#128072;&#127999;", "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": "&#128072;&#127998;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "👈đŸŊ", "name": "backhand index pointing left: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F448 1F3FD", "html": "&#128072;&#127997;", "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": "&#128072;&#127996;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "👈đŸģ", "name": "backhand index pointing left: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F448 1F3FB", "html": "&#128072;&#127995;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "👈", "name": "backhand index pointing left", "shortname": ":point_left:", "unicode": "1f448", "html": "&#128072;", "category": "People & Body (hand-single-finger)", "order": "1092"},
+ {"emoji": "âœ”ī¸", "name": "check mark", "shortname": ":heavy_check_mark:", "unicode": "2714", "html": "&#10004;", "category": "Symbols (other-symbol)", "order": "2080"},
+ {"emoji": "đŸ˜ģ", "name": "smiling cat with heart-eyes", "shortname": ":heart_eyes_cat:", "unicode": "1f63b", "html": "&#128571;", "category": "Smileys & Emotion (cat-face)", "order": "90"},
+ {"emoji": "😀", "name": "grinning face", "shortname": ":grinning:", "unicode": "1f600", "html": "&#128512;", "category": "Smileys & Emotion (face-smiling)", "order": "1"},
+ {"emoji": "😷", "name": "face with medical mask", "shortname": ":mask:", "unicode": "1f637", "html": "&#128567;", "category": "Smileys & Emotion (face-unwell)", "order": "71"},
+ {"emoji": "💚", "name": "green heart", "shortname": ":green_heart:", "unicode": "1f49a", "html": "&#128154;", "category": "Smileys & Emotion (emotion)", "order": "1293"},
+ {"emoji": "👋đŸŋ", "name": "waving hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F44B 1F3FF", "html": "&#128075;&#127999;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "👋🏾", "name": "waving hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F44B 1F3FE", "html": "&#128075;&#127998;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "👋đŸŊ", "name": "waving hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F44B 1F3FD", "html": "&#128075;&#127997;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "👋đŸŧ", "name": "waving hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F44B 1F3FC", "html": "&#128075;&#127996;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "👋đŸģ", "name": "waving hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F44B 1F3FB", "html": "&#128075;&#127995;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "👋", "name": "waving hand", "shortname": ":wave:", "unicode": "1f44b", "html": "&#128075;", "category": "People & Body (hand-fingers-open)", "order": "1218"},
+ {"emoji": "đŸ˜Ŗ", "name": "persevering face", "shortname": ":persevere:", "unicode": "1f623", "html": "&#128547;", "category": "Smileys & Emotion (face-concerned)", "order": "27"},
+ {"emoji": "💓", "name": "beating heart", "shortname": ":heartbeat:", "unicode": "1f493", "html": "&#128147;", "category": "Smileys & Emotion (emotion)", "order": "1287"},
+ {"emoji": "â–ļī¸", "name": "play button", "shortname": ":arrow_forward:", "unicode": "25b6", "html": "&#9654;", "category": "Symbols (av-symbol)", "order": "2051"},
+ {"emoji": "â—€ī¸", "name": "reverse button", "shortname": ":arrow_backward:", "unicode": "25c0", "html": "&#9664;", "category": "Symbols (av-symbol)", "order": "2055"},
+ {"emoji": "â†Ēī¸", "name": "left arrow curving right", "shortname": ":arrow_right_hook:", "unicode": "21aa", "html": "&#8618;", "category": "Symbols (arrow)", "order": "2013"},
+ {"emoji": "â†Šī¸", "name": "right arrow curving left", "shortname": ":leftwards_arrow_with_hook:", "unicode": "21a9", "html": "&#8617;", "category": "Symbols (arrow)", "order": "2012"},
+ {"emoji": "👑", "name": "crown", "shortname": ":crown:", "unicode": "1f451", "html": "&#128081;", "category": "Objects (clothing)", "order": "1333"},
+ {"emoji": "😚", "name": "kissing face with closed eyes", "shortname": ":kissing_closed_eyes:", "unicode": "1f61a", "html": "&#128538;", "category": "Smileys & Emotion (face-affection)", "order": "17"},
+ {"emoji": "😛", "name": "face with tongue", "shortname": ":stuck_out_tongue:", "unicode": "1f61b", "html": "&#128539;", "category": "Smileys & Emotion (face-tongue)", "order": "37"},
+ {"emoji": "đŸ˜Ĩ", "name": "sad but relieved face", "shortname": ":disappointed_relieved:", "unicode": "1f625", "html": "&#128549;", "category": "Smileys & Emotion (face-concerned)", "order": "28"},
+ {"emoji": "😇", "name": "smiling face with halo", "shortname": ":innocent:", "unicode": "1f607", "html": "&#128519;", "category": "Smileys & Emotion (face-smiling)", "order": "67"},
+ {"emoji": "🎧", "name": "headphone", "shortname": ":headphones:", "unicode": "1f3a7", "html": "&#127911;", "category": "Objects (music)", "order": "1830"},
+ {"emoji": "✅", "name": "check mark button", "shortname": ":white_check_mark:", "unicode": "2705", "html": "&#9989;", "category": "Symbols (other-symbol)", "order": "2078"},
+ {"emoji": "😖", "name": "confounded face", "shortname": ":confounded:", "unicode": "1f616", "html": "&#128534;", "category": "Smileys & Emotion (face-concerned)", "order": "50"},
+ {"emoji": "➡", "name": "right arrow", "shortname": ":arrow_right:", "unicode": "27a1", "html": "&#10145;", "category": "Symbols (arrow)", "order": "2004"},
+ {"emoji": "😠", "name": "angry face", "shortname": ":angry:", "unicode": "1f620", "html": "&#128544;", "category": "Smileys & Emotion (face-negative)", "order": "66"},
+ {"emoji": "đŸ˜Ŧ", "name": "grimacing face", "shortname": ":grimacing:", "unicode": "1f62c", "html": "&#128556;", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": "60"},
+ {"emoji": "🌟", "name": "glowing star", "shortname": ":star2:", "unicode": "1f31f", "html": "&#127775;", "category": "Travel & Places (sky & weather)", "order": "1728"},
+ {"emoji": "đŸ”Ģ", "name": "pistol", "shortname": ":gun:", "unicode": "1f52b", "html": "&#128299;", "category": "Objects (tool)", "order": "1956"},
+ {"emoji": "🙋đŸŋ‍♂", "name": "man raising hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64B 1F3FF 200D 2642", "html": "&#128587;&#127999;&zwj;&#9794;", "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": "&#128587;&#127998;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙋đŸŊ‍♂", "name": "man raising hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64B 1F3FD 200D 2642", "html": "&#128587;&#127997;&zwj;&#9794;", "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": "&#128587;&#127996;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙋đŸģ‍♂", "name": "man raising hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64B 1F3FB 200D 2642", "html": "&#128587;&#127995;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙋‍♂", "name": "man raising hand", "shortname": ":man_raising_hand:", "unicode": "1F64B 200D 2642", "html": "&#128587;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙋đŸŋ", "name": "person raising hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64B 1F3FF", "html": "&#128587;&#127999;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙋🏾", "name": "person raising hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64B 1F3FE", "html": "&#128587;&#127998;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙋đŸŊ", "name": "person raising hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64B 1F3FD", "html": "&#128587;&#127997;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙋đŸŧ", "name": "person raising hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64B 1F3FC", "html": "&#128587;&#127996;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙋đŸģ", "name": "person raising hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64B 1F3FB", "html": "&#128587;&#127995;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙋", "name": "person raising hand", "shortname": ":raising_hand:", "unicode": "1f64b", "html": "&#128587;", "category": "People & Body (person-gesture)", "order": "585"},
+ {"emoji": "👎đŸŋ", "name": "thumbs down: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F44E 1F3FF", "html": "&#128078;&#127999;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "👎🏾", "name": "thumbs down: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F44E 1F3FE", "html": "&#128078;&#127998;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "👎đŸŊ", "name": "thumbs down: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F44E 1F3FD", "html": "&#128078;&#127997;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "👎đŸŧ", "name": "thumbs down: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F44E 1F3FC", "html": "&#128078;&#127996;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "👎đŸģ", "name": "thumbs down: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F44E 1F3FB", "html": "&#128078;&#127995;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "👎", "name": "thumbs down", "shortname": ":thumbsdown:", "unicode": "1f44e", "html": "&#128078;", "category": "People & Body (hand-fingers-closed)", "order": "1182"},
+ {"emoji": "💃đŸŋ", "name": "woman dancing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F483 1F3FF", "html": "&#128131;&#127999;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💃🏾", "name": "woman dancing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F483 1F3FE", "html": "&#128131;&#127998;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💃đŸŊ", "name": "woman dancing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F483 1F3FD", "html": "&#128131;&#127997;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💃đŸŧ", "name": "woman dancing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F483 1F3FC", "html": "&#128131;&#127996;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💃đŸģ", "name": "woman dancing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F483 1F3FB", "html": "&#128131;&#127995;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💃", "name": "woman dancing", "shortname": ":dancer:", "unicode": "1f483", "html": "&#128131;", "category": "People & Body (person-activity)", "order": "729"},
+ {"emoji": "đŸŽĩ", "name": "musical note", "shortname": ":musical_note:", "unicode": "1f3b5", "html": "&#127925;", "category": "Objects (music)", "order": "1824"},
+ {"emoji": "đŸ˜ļ", "name": "face without mouth", "shortname": ":no_mouth:", "unicode": "1f636", "html": "&#128566;", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": "24"},
+ {"emoji": "đŸ’Ģ", "name": "dizzy", "shortname": ":dizzy:", "unicode": "1f4ab", "html": "&#128171;", "category": "Smileys & Emotion (emotion)", "order": "1308"},
+ {"emoji": "✊đŸŋ", "name": "raised fist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "270A 1F3FF", "html": "&#9994;&#127999;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "✊🏾", "name": "raised fist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "270A 1F3FE", "html": "&#9994;&#127998;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "✊đŸŊ", "name": "raised fist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "270A 1F3FD", "html": "&#9994;&#127997;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "✊đŸŧ", "name": "raised fist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "270A 1F3FC", "html": "&#9994;&#127996;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "✊đŸģ", "name": "raised fist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "270A 1F3FB", "html": "&#9994;&#127995;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "✊", "name": "raised fist", "shortname": ":fist:", "unicode": "270a", "html": "&#9994;", "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": "&#128071;&#127999;", "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": "&#128071;&#127998;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "👇đŸŊ", "name": "backhand index pointing down: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F447 1F3FD", "html": "&#128071;&#127997;", "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": "&#128071;&#127996;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "👇đŸģ", "name": "backhand index pointing down: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F447 1F3FB", "html": "&#128071;&#127995;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "👇", "name": "backhand index pointing down", "shortname": ":point_down:", "unicode": "1f447", "html": "&#128071;", "category": "People & Body (hand-single-finger)", "order": "1122"},
+ {"emoji": "🔴", "name": "red circle", "shortname": ":red_circle:", "unicode": "1f534", "html": "&#128308;", "category": "Symbols (geometric)", "order": "2179"},
+ {"emoji": "🙅đŸŋ‍♂", "name": "man gesturing NO: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F645 1F3FF 200D 2642", "html": "&#128581;&#127999;&zwj;&#9794;", "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": "&#128581;&#127998;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙅đŸŊ‍♂", "name": "man gesturing NO: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F645 1F3FD 200D 2642", "html": "&#128581;&#127997;&zwj;&#9794;", "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": "&#128581;&#127996;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙅đŸģ‍♂", "name": "man gesturing NO: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F645 1F3FB 200D 2642", "html": "&#128581;&#127995;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙅‍♂", "name": "man gesturing NO", "shortname": ":man_gesturing_NO:", "unicode": "1F645 200D 2642", "html": "&#128581;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙅đŸŋ", "name": "person gesturing NO: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F645 1F3FF", "html": "&#128581;&#127999;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙅🏾", "name": "person gesturing NO: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F645 1F3FE", "html": "&#128581;&#127998;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙅đŸŊ", "name": "person gesturing NO: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F645 1F3FD", "html": "&#128581;&#127997;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙅đŸŧ", "name": "person gesturing NO: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F645 1F3FC", "html": "&#128581;&#127996;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙅đŸģ", "name": "person gesturing NO: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F645 1F3FB", "html": "&#128581;&#127995;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙅", "name": "person gesturing NO", "shortname": ":no_good:", "unicode": "1f645", "html": "&#128581;", "category": "People & Body (person-gesture)", "order": "531"},
+ {"emoji": "đŸ’Ĩ", "name": "collision", "shortname": ":boom:", "unicode": "1f4a5", "html": "&#128165;", "category": "Smileys & Emotion (emotion)", "order": "1305"},
+ {"emoji": "ÂŠī¸", "name": "copyright", "shortname": ":copyright:", "unicode": "00A9 FE0F", "html": "&copy;ī¸", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "💭", "name": "thought balloon", "shortname": ":thought_balloon:", "unicode": "1f4ad", "html": "&#128173;", "category": "Smileys & Emotion (emotion)", "order": "1312"},
+ {"emoji": "👅", "name": "tongue", "shortname": ":tongue:", "unicode": "1f445", "html": "&#128069;", "category": "People & Body (body-parts)", "order": "1282"},
+ {"emoji": "💩", "name": "pile of poo", "shortname": ":poop:", "unicode": "1f4a9", "html": "&#128169;", "category": "Smileys & Emotion (face-costume)", "order": "85"},
+ {"emoji": "😰", "name": "anxious face with sweat", "shortname": ":cold_sweat:", "unicode": "1f630", "html": "&#128560;", "category": "Smileys & Emotion (face-concerned)", "order": "61"},
+ {"emoji": "💎", "name": "gem stone", "shortname": ":gem:", "unicode": "1f48e", "html": "&#128142;", "category": "Objects (clothing)", "order": "1341"},
+ {"emoji": "🙆đŸŋ‍♂", "name": "man gesturing OK: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F646 1F3FF 200D 2642", "html": "&#128582;&#127999;&zwj;&#9794;", "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": "&#128582;&#127998;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙆đŸŊ‍♂", "name": "man gesturing OK: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F646 1F3FD 200D 2642", "html": "&#128582;&#127997;&zwj;&#9794;", "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": "&#128582;&#127996;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙆đŸģ‍♂", "name": "man gesturing OK: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F646 1F3FB 200D 2642", "html": "&#128582;&#127995;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙆‍♂", "name": "man gesturing OK", "shortname": ":man_gesturing_OK:", "unicode": "1F646 200D 2642", "html": "&#128582;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙆đŸŋ", "name": "person gesturing OK: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F646 1F3FF", "html": "&#128582;&#127999;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙆🏾", "name": "person gesturing OK: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F646 1F3FE", "html": "&#128582;&#127998;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙆đŸŊ", "name": "person gesturing OK: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F646 1F3FD", "html": "&#128582;&#127997;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙆đŸŧ", "name": "person gesturing OK: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F646 1F3FC", "html": "&#128582;&#127996;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙆đŸģ", "name": "person gesturing OK: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F646 1F3FB", "html": "&#128582;&#127995;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙆", "name": "person gesturing OK", "shortname": ":ok_woman:", "unicode": "1f646", "html": "&#128582;", "category": "People & Body (person-gesture)", "order": "549"},
+ {"emoji": "🍕", "name": "pizza", "shortname": ":pizza:", "unicode": "1f355", "html": "&#127829;", "category": "Food & Drink (food-prepared)", "order": "1484"},
+ {"emoji": "😹", "name": "cat with tears of joy", "shortname": ":joy_cat:", "unicode": "1f639", "html": "&#128569;", "category": "Smileys & Emotion (cat-face)", "order": "89"},
+ {"emoji": "🌞", "name": "sun with face", "shortname": ":sun_with_face:", "unicode": "1f31e", "html": "&#127774;", "category": "Travel & Places (sky & weather)", "order": "1726"},
+ {"emoji": "🍃", "name": "leaf fluttering in wind", "shortname": ":leaves:", "unicode": "1f343", "html": "&#127811;", "category": "Animals & Nature (plant-other)", "order": "1448"},
+ {"emoji": "đŸ’Ļ", "name": "sweat droplets", "shortname": ":sweat_drops:", "unicode": "1f4a6", "html": "&#128166;", "category": "Smileys & Emotion (emotion)", "order": "1306"},
+ {"emoji": "🐧", "name": "penguin", "shortname": ":penguin:", "unicode": "1f427", "html": "&#128039;", "category": "Animals & Nature (animal-bird)", "order": "1394"},
+ {"emoji": "💤", "name": "zzz", "shortname": ":zzz:", "unicode": "1f4a4", "html": "&#128164;", "category": "Smileys & Emotion (emotion)", "order": "1302"},
+ {"emoji": "đŸšļđŸŋ‍♀", "name": "woman walking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B6 1F3FF 200D 2640", "html": "&#128694;&#127999;&zwj;&#9792;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļ🏾‍♀", "name": "woman walking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B6 1F3FE 200D 2640", "html": "&#128694;&#127998;&zwj;&#9792;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļđŸŊ‍♀", "name": "woman walking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B6 1F3FD 200D 2640", "html": "&#128694;&#127997;&zwj;&#9792;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļđŸŧ‍♀", "name": "woman walking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B6 1F3FC 200D 2640", "html": "&#128694;&#127996;&zwj;&#9792;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļđŸģ‍♀", "name": "woman walking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B6 1F3FB 200D 2640", "html": "&#128694;&#127995;&zwj;&#9792;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļ‍♀", "name": "woman walking", "shortname": ":woman_walking:", "unicode": "1F6B6 200D 2640", "html": "&#128694;&zwj;&#9792;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļđŸŋ", "name": "person walking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B6 1F3FF", "html": "&#128694;&#127999;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļ🏾", "name": "person walking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B6 1F3FE", "html": "&#128694;&#127998;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļđŸŊ", "name": "person walking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B6 1F3FD", "html": "&#128694;&#127997;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļđŸŧ", "name": "person walking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B6 1F3FC", "html": "&#128694;&#127996;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļđŸģ", "name": "person walking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B6 1F3FB", "html": "&#128694;&#127995;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļ", "name": "person walking", "shortname": ":walking:", "unicode": "1f6b6", "html": "&#128694;", "category": "People & Body (person-activity)", "order": "693"},
+ {"emoji": "âœˆī¸", "name": "airplane", "shortname": ":airplane:", "unicode": "2708", "html": "&#9992;", "category": "Travel & Places (transport-air)", "order": "1650"},
+ {"emoji": "🎈", "name": "balloon", "shortname": ":balloon:", "unicode": "1f388", "html": "&#127880;", "category": "Activities (event)", "order": "1761"},
+ {"emoji": "⭐", "name": "star", "shortname": ":star:", "unicode": "2b50", "html": "&#11088;", "category": "Travel & Places (sky & weather)", "order": "1727"},
+ {"emoji": "🎀", "name": "ribbon", "shortname": ":ribbon:", "unicode": "1f380", "html": "&#127872;", "category": "Activities (event)", "order": "1770"},
+ {"emoji": "â˜‘ī¸", "name": "check box with check", "shortname": ":ballot_box_with_check:", "unicode": "2611", "html": "&#9745;", "category": "Symbols (other-symbol)", "order": "2079"},
+ {"emoji": "😟", "name": "worried face", "shortname": ":worried:", "unicode": "1f61f", "html": "&#128543;", "category": "Smileys & Emotion (face-concerned)", "order": "52"},
+ {"emoji": "🔞", "name": "no one under eighteen", "shortname": ":underage:", "unicode": "1f51e", "html": "&#128286;", "category": "Symbols (warning)", "order": "1999"},
+ {"emoji": "😨", "name": "fearful face", "shortname": ":fearful:", "unicode": "1f628", "html": "&#128552;", "category": "Smileys & Emotion (face-concerned)", "order": "58"},
+ {"emoji": "🍀", "name": "four leaf clover", "shortname": ":four_leaf_clover:", "unicode": "1f340", "html": "&#127808;", "category": "Animals & Nature (plant-other)", "order": "1445"},
+ {"emoji": "đŸŒē", "name": "hibiscus", "shortname": ":hibiscus:", "unicode": "1f33a", "html": "&#127802;", "category": "Animals & Nature (plant-flower)", "order": "1433"},
+ {"emoji": "🎤", "name": "microphone", "shortname": ":microphone:", "unicode": "1f3a4", "html": "&#127908;", "category": "Objects (music)", "order": "1829"},
+ {"emoji": "👐đŸŋ", "name": "open hands: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F450 1F3FF", "html": "&#128080;&#127999;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "👐🏾", "name": "open hands: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F450 1F3FE", "html": "&#128080;&#127998;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "👐đŸŊ", "name": "open hands: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F450 1F3FD", "html": "&#128080;&#127997;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "👐đŸŧ", "name": "open hands: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F450 1F3FC", "html": "&#128080;&#127996;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "👐đŸģ", "name": "open hands: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F450 1F3FB", "html": "&#128080;&#127995;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "👐", "name": "open hands", "shortname": ":open_hands:", "unicode": "1f450", "html": "&#128080;", "category": "People & Body (hands)", "order": "1236"},
+ {"emoji": "đŸ‘ģ", "name": "ghost", "shortname": ":ghost:", "unicode": "1f47b", "html": "&#128123;", "category": "Smileys & Emotion (face-costume)", "order": "82"},
+ {"emoji": "🌴", "name": "palm tree", "shortname": ":palm_tree:", "unicode": "1f334", "html": "&#127796;", "category": "Animals & Nature (plant-other)", "order": "1440"},
+ {"emoji": "â€ŧī¸", "name": "double exclamation mark", "shortname": ":bangbang:", "unicode": "203c", "html": "&#8252;", "category": "Symbols (other-symbol)", "order": "2096"},
+ {"emoji": "💅đŸŋ", "name": "nail polish: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F485 1F3FF", "html": "&#128133;&#127999;", "category": "People & Body (hand-prop)", "order": ""},
+ {"emoji": "💅🏾", "name": "nail polish: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F485 1F3FE", "html": "&#128133;&#127998;", "category": "People & Body (hand-prop)", "order": ""},
+ {"emoji": "💅đŸŊ", "name": "nail polish: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F485 1F3FD", "html": "&#128133;&#127997;", "category": "People & Body (hand-prop)", "order": ""},
+ {"emoji": "💅đŸŧ", "name": "nail polish: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F485 1F3FC", "html": "&#128133;&#127996;", "category": "People & Body (hand-prop)", "order": ""},
+ {"emoji": "💅đŸģ", "name": "nail polish: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F485 1F3FB", "html": "&#128133;&#127995;", "category": "People & Body (hand-prop)", "order": ""},
+ {"emoji": "💅", "name": "nail polish", "shortname": ":nail_care:", "unicode": "1f485", "html": "&#128133;", "category": "People & Body (hand-prop)", "order": "1260"},
+ {"emoji": "❌", "name": "cross mark", "shortname": ":x:", "unicode": "274c", "html": "&#10060;", "category": "Symbols (other-symbol)", "order": "2082"},
+ {"emoji": "đŸ‘Ŋ", "name": "alien", "shortname": ":alien:", "unicode": "1f47d", "html": "&#128125;", "category": "Smileys & Emotion (face-costume)", "order": "83"},
+ {"emoji": "🙇đŸŋ‍♀", "name": "woman bowing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F647 1F3FF 200D 2640", "html": "&#128583;&#127999;&zwj;&#9792;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇🏾‍♀", "name": "woman bowing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F647 1F3FE 200D 2640", "html": "&#128583;&#127998;&zwj;&#9792;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇đŸŊ‍♀", "name": "woman bowing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F647 1F3FD 200D 2640", "html": "&#128583;&#127997;&zwj;&#9792;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇đŸŧ‍♀", "name": "woman bowing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F647 1F3FC 200D 2640", "html": "&#128583;&#127996;&zwj;&#9792;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇đŸģ‍♀", "name": "woman bowing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F647 1F3FB 200D 2640", "html": "&#128583;&#127995;&zwj;&#9792;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇‍♀", "name": "woman bowing", "shortname": ":woman_bowing:", "unicode": "1F647 200D 2640", "html": "&#128583;&zwj;&#9792;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇đŸŋ", "name": "person bowing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F647 1F3FF", "html": "&#128583;&#127999;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇🏾", "name": "person bowing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F647 1F3FE", "html": "&#128583;&#127998;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇đŸŊ", "name": "person bowing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F647 1F3FD", "html": "&#128583;&#127997;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇đŸŧ", "name": "person bowing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F647 1F3FC", "html": "&#128583;&#127996;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇đŸģ", "name": "person bowing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F647 1F3FB", "html": "&#128583;&#127995;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇", "name": "person bowing", "shortname": ":bow:", "unicode": "1f647", "html": "&#128583;", "category": "People & Body (person-gesture)", "order": "603"},
+ {"emoji": "☁", "name": "cloud", "shortname": ":cloud:", "unicode": "2601", "html": "&#9729;", "category": "Travel & Places (sky & weather)", "order": "1730"},
+ {"emoji": "âšŊ", "name": "soccer ball", "shortname": ":soccer:", "unicode": "26bd", "html": "&#9917;", "category": "Activities (sport)", "order": "1781"},
+ {"emoji": "đŸ‘ŧđŸŋ", "name": "baby angel: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F47C 1F3FF", "html": "&#128124;&#127999;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ‘ŧ🏾", "name": "baby angel: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F47C 1F3FE", "html": "&#128124;&#127998;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ‘ŧđŸŊ", "name": "baby angel: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F47C 1F3FD", "html": "&#128124;&#127997;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ‘ŧđŸŧ", "name": "baby angel: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F47C 1F3FC", "html": "&#128124;&#127996;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ‘ŧđŸģ", "name": "baby angel: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F47C 1F3FB", "html": "&#128124;&#127995;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ‘ŧ", "name": "baby angel", "shortname": ":angel:", "unicode": "1f47c", "html": "&#128124;", "category": "People & Body (person-fantasy)", "order": "141"},
+ {"emoji": "đŸ‘¯â€â™‚", "name": "men with bunny ears", "shortname": ":men_with_bunny_ears:", "unicode": "1F46F 200D 2642", "html": "&#128111;&zwj;&#9794;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ‘¯", "name": "people with bunny ears", "shortname": ":dancers:", "unicode": "1f46f", "html": "&#128111;", "category": "People & Body (person-activity)", "order": "741"},
+ {"emoji": "❗", "name": "exclamation mark", "shortname": ":exclamation:", "unicode": "2757", "html": "&#10071;", "category": "Symbols (other-symbol)", "order": "2101"},
+ {"emoji": "â„ī¸", "name": "snowflake", "shortname": ":snowflake:", "unicode": "2744", "html": "&#10052;", "category": "Travel & Places (sky & weather)", "order": "1749"},
+ {"emoji": "☝đŸŋ", "name": "index pointing up: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "261D 1F3FF", "html": "&#9757;&#127999;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "☝🏾", "name": "index pointing up: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "261D 1F3FE", "html": "&#9757;&#127998;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "☝đŸŊ", "name": "index pointing up: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "261D 1F3FD", "html": "&#9757;&#127997;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "☝đŸŧ", "name": "index pointing up: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "261D 1F3FC", "html": "&#9757;&#127996;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "☝đŸģ", "name": "index pointing up: light skin tone", "shortname": ":light_skin_tone:", "unicode": "261D 1F3FB", "html": "&#9757;&#127995;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "â˜ī¸", "name": "index pointing up", "shortname": ":point_up:", "unicode": "261d", "html": "&#9757;", "category": "People & Body (hand-single-finger)", "order": "1104"},
+ {"emoji": "😙", "name": "kissing face with smiling eyes", "shortname": ":kissing_smiling_eyes:", "unicode": "1f619", "html": "&#128537;", "category": "Smileys & Emotion (face-affection)", "order": "16"},
+ {"emoji": "🌈", "name": "rainbow", "shortname": ":rainbow:", "unicode": "1f308", "html": "&#127752;", "category": "Travel & Places (sky & weather)", "order": "1743"},
+ {"emoji": "🌙", "name": "crescent moon", "shortname": ":crescent_moon:", "unicode": "1f319", "html": "&#127769;", "category": "Travel & Places (sky & weather)", "order": "1719"},
+ {"emoji": "💟", "name": "heart decoration", "shortname": ":heart_decoration:", "unicode": "1f49f", "html": "&#128159;", "category": "Smileys & Emotion (emotion)", "order": "1299"},
+ {"emoji": "💝", "name": "heart with ribbon", "shortname": ":gift_heart:", "unicode": "1f49d", "html": "&#128157;", "category": "Smileys & Emotion (emotion)", "order": "1297"},
+ {"emoji": "🎁", "name": "wrapped gift", "shortname": ":gift:", "unicode": "1f381", "html": "&#127873;", "category": "Activities (event)", "order": "1771"},
+ {"emoji": "đŸģ", "name": "clinking beer mugs", "shortname": ":beers:", "unicode": "1f37b", "html": "&#127867;", "category": "Food & Drink (drink)", "order": "1530"},
+ {"emoji": "😧", "name": "anguished face", "shortname": ":anguished:", "unicode": "1f627", "html": "&#128551;", "category": "Smileys & Emotion (face-concerned)", "order": "57"},
+ {"emoji": "🌍", "name": "globe showing Europe-Africa", "shortname": ":earth_africa:", "unicode": "1f30d", "html": "&#127757;", "category": "Travel & Places (place-map)", "order": "1538"},
+ {"emoji": "đŸŽĨ", "name": "movie camera", "shortname": ":movie_camera:", "unicode": "1f3a5", "html": "&#127909;", "category": "Objects (light & video)", "order": "1856"},
+ {"emoji": "⚓", "name": "anchor", "shortname": ":anchor:", "unicode": "2693", "html": "&#9875;", "category": "Travel & Places (transport-water)", "order": "1642"},
+ {"emoji": "⚡", "name": "high voltage", "shortname": ":zap:", "unicode": "26a1", "html": "&#9889;", "category": "Travel & Places (sky & weather)", "order": "1748"},
+ {"emoji": "â™Ŗī¸", "name": "club suit", "shortname": ":club_suit:", "unicode": "2663 FE0F", "html": "&clubs;ī¸", "category": "Activities (game)", "order": ""},
+ {"emoji": "âœ–ī¸", "name": "multiplication sign", "shortname": ":heavy_multiplication_x:", "unicode": "2716", "html": "&#10006;", "category": "Symbols (other-symbol)", "order": "2081"},
+ {"emoji": "🏃đŸŋ‍♀", "name": "woman running: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C3 1F3FF 200D 2640", "html": "&#127939;&#127999;&zwj;&#9792;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃🏾‍♀", "name": "woman running: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C3 1F3FE 200D 2640", "html": "&#127939;&#127998;&zwj;&#9792;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃đŸŊ‍♀", "name": "woman running: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C3 1F3FD 200D 2640", "html": "&#127939;&#127997;&zwj;&#9792;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃đŸŧ‍♀", "name": "woman running: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C3 1F3FC 200D 2640", "html": "&#127939;&#127996;&zwj;&#9792;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃đŸģ‍♀", "name": "woman running: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C3 1F3FB 200D 2640", "html": "&#127939;&#127995;&zwj;&#9792;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃‍♀", "name": "woman running", "shortname": ":woman_running:", "unicode": "1F3C3 200D 2640", "html": "&#127939;&zwj;&#9792;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃đŸŋ", "name": "person running: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C3 1F3FF", "html": "&#127939;&#127999;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃🏾", "name": "person running: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C3 1F3FE", "html": "&#127939;&#127998;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃đŸŊ", "name": "person running: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C3 1F3FD", "html": "&#127939;&#127997;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃đŸŧ", "name": "person running: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C3 1F3FC", "html": "&#127939;&#127996;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃đŸģ", "name": "person running: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C3 1F3FB", "html": "&#127939;&#127995;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃", "name": "person running", "shortname": ":runner:", "unicode": "1f3c3", "html": "&#127939;", "category": "People & Body (person-activity)", "order": "711"},
+ {"emoji": "đŸŒģ", "name": "sunflower", "shortname": ":sunflower:", "unicode": "1f33b", "html": "&#127803;", "category": "Animals & Nature (plant-flower)", "order": "1434"},
+ {"emoji": "🌎", "name": "globe showing Americas", "shortname": ":earth_americas:", "unicode": "1f30e", "html": "&#127758;", "category": "Travel & Places (place-map)", "order": "1539"},
+ {"emoji": "💐", "name": "bouquet", "shortname": ":bouquet:", "unicode": "1f490", "html": "&#128144;", "category": "Animals & Nature (plant-flower)", "order": "1427"},
+ {"emoji": "đŸļ", "name": "dog face", "shortname": ":dog:", "unicode": "1f436", "html": "&#128054;", "category": "Animals & Nature (animal-mammal)", "order": "1345"},
+ {"emoji": "💰", "name": "money bag", "shortname": ":moneybag:", "unicode": "1f4b0", "html": "&#128176;", "category": "Objects (money)", "order": "1891"},
+ {"emoji": "đŸŒŋ", "name": "herb", "shortname": ":herb:", "unicode": "1f33f", "html": "&#127807;", "category": "Animals & Nature (plant-other)", "order": "1443"},
+ {"emoji": "đŸ‘Ģ", "name": "woman and man holding hands", "shortname": ":couple:", "unicode": "1f46b", "html": "&#128107;", "category": "People & Body (family)", "order": "1018"},
+ {"emoji": "🍂", "name": "fallen leaf", "shortname": ":fallen_leaf:", "unicode": "1f342", "html": "&#127810;", "category": "Animals & Nature (plant-other)", "order": "1447"},
+ {"emoji": "🌷", "name": "tulip", "shortname": ":tulip:", "unicode": "1f337", "html": "&#127799;", "category": "Animals & Nature (plant-flower)", "order": "1436"},
+ {"emoji": "🎂", "name": "birthday cake", "shortname": ":birthday:", "unicode": "1f382", "html": "&#127874;", "category": "Food & Drink (food-sweet)", "order": "1513"},
+ {"emoji": "🐱", "name": "cat face", "shortname": ":cat:", "unicode": "1f431", "html": "&#128049;", "category": "Animals & Nature (animal-mammal)", "order": "1350"},
+ {"emoji": "☕", "name": "hot beverage", "shortname": ":coffee:", "unicode": "2615", "html": "&#9749;", "category": "Food & Drink (drink)", "order": "1522"},
+ {"emoji": "đŸ˜ĩ", "name": "dizzy face", "shortname": ":dizzy_face:", "unicode": "1f635", "html": "&#128565;", "category": "Smileys & Emotion (face-unwell)", "order": "64"},
+ {"emoji": "👆đŸŋ", "name": "backhand index pointing up: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F446 1F3FF", "html": "&#128070;&#127999;", "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": "&#128070;&#127998;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "👆đŸŊ", "name": "backhand index pointing up: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F446 1F3FD", "html": "&#128070;&#127997;", "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": "&#128070;&#127996;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "👆đŸģ", "name": "backhand index pointing up: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F446 1F3FB", "html": "&#128070;&#127995;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "👆", "name": "backhand index pointing up", "shortname": ":point_up_2:", "unicode": "1f446", "html": "&#128070;", "category": "People & Body (hand-single-finger)", "order": "1110"},
+ {"emoji": "😮", "name": "face with open mouth", "shortname": ":open_mouth:", "unicode": "1f62e", "html": "&#128558;", "category": "Smileys & Emotion (face-concerned)", "order": "29"},
+ {"emoji": "đŸ˜¯", "name": "hushed face", "shortname": ":hushed:", "unicode": "1f62f", "html": "&#128559;", "category": "Smileys & Emotion (face-concerned)", "order": "31"},
+ {"emoji": "🏀", "name": "basketball", "shortname": ":basketball:", "unicode": "1f3c0", "html": "&#127936;", "category": "Activities (sport)", "order": "1783"},
+ {"emoji": "🎄", "name": "Christmas tree", "shortname": ":christmas_tree:", "unicode": "1f384", "html": "&#127876;", "category": "Activities (event)", "order": "1757"},
+ {"emoji": "💍", "name": "ring", "shortname": ":ring:", "unicode": "1f48d", "html": "&#128141;", "category": "Objects (clothing)", "order": "1340"},
+ {"emoji": "🌝", "name": "full moon face", "shortname": ":full_moon_with_face:", "unicode": "1f31d", "html": "&#127773;", "category": "Travel & Places (sky & weather)", "order": "1725"},
+ {"emoji": "😲", "name": "astonished face", "shortname": ":astonished:", "unicode": "1f632", "html": "&#128562;", "category": "Smileys & Emotion (face-concerned)", "order": "47"},
+ {"emoji": "👭", "name": "women holding hands", "shortname": ":two_women_holding_hands:", "unicode": "1f46d", "html": "&#128109;", "category": "People & Body (family)", "order": "1030"},
+ {"emoji": "💸", "name": "money with wings", "shortname": ":money_with_wings:", "unicode": "1f4b8", "html": "&#128184;", "category": "Objects (money)", "order": "1896"},
+ {"emoji": "đŸ˜ŋ", "name": "crying cat", "shortname": ":crying_cat_face:", "unicode": "1f63f", "html": "&#128575;", "category": "Smileys & Emotion (cat-face)", "order": "94"},
+ {"emoji": "🙉", "name": "hear-no-evil monkey", "shortname": ":hear_no_evil:", "unicode": "1f649", "html": "&#128585;", "category": "Smileys & Emotion (monkey-face)", "order": "97"},
+ {"emoji": "💨", "name": "dashing away", "shortname": ":dash:", "unicode": "1f4a8", "html": "&#128168;", "category": "Smileys & Emotion (emotion)", "order": "1307"},
+ {"emoji": "đŸŒĩ", "name": "cactus", "shortname": ":cactus:", "unicode": "1f335", "html": "&#127797;", "category": "Animals & Nature (plant-other)", "order": "1441"},
+ {"emoji": "â™¨ī¸", "name": "hot springs", "shortname": ":hotsprings:", "unicode": "2668", "html": "&#9832;", "category": "Travel & Places (place-other)", "order": "1591"},
+ {"emoji": "â˜Žī¸", "name": "telephone", "shortname": ":telephone:", "unicode": "260e", "html": "&#9742;", "category": "Objects (phone)", "order": "1840"},
+ {"emoji": "🍁", "name": "maple leaf", "shortname": ":maple_leaf:", "unicode": "1f341", "html": "&#127809;", "category": "Animals & Nature (plant-other)", "order": "1446"},
+ {"emoji": "👸đŸŋ", "name": "princess: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F478 1F3FF", "html": "&#128120;&#127999;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👸🏾", "name": "princess: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F478 1F3FE", "html": "&#128120;&#127998;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👸đŸŊ", "name": "princess: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F478 1F3FD", "html": "&#128120;&#127997;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👸đŸŧ", "name": "princess: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F478 1F3FC", "html": "&#128120;&#127996;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👸đŸģ", "name": "princess: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F478 1F3FB", "html": "&#128120;&#127995;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👸", "name": "princess", "shortname": ":princess:", "unicode": "1f478", "html": "&#128120;", "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": "&#128134;&#127999;&zwj;&#9794;", "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": "&#128134;&#127998;&zwj;&#9794;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💆đŸŊ‍♂", "name": "man getting massage: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F486 1F3FD 200D 2642", "html": "&#128134;&#127997;&zwj;&#9794;", "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": "&#128134;&#127996;&zwj;&#9794;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💆đŸģ‍♂", "name": "man getting massage: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F486 1F3FB 200D 2642", "html": "&#128134;&#127995;&zwj;&#9794;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💆‍♂", "name": "man getting massage", "shortname": ":man_getting_massage:", "unicode": "1F486 200D 2642", "html": "&#128134;&zwj;&#9794;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💆đŸŋ", "name": "person getting massage: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F486 1F3FF", "html": "&#128134;&#127999;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💆🏾", "name": "person getting massage: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F486 1F3FE", "html": "&#128134;&#127998;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💆đŸŊ", "name": "person getting massage: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F486 1F3FD", "html": "&#128134;&#127997;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💆đŸŧ", "name": "person getting massage: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F486 1F3FC", "html": "&#128134;&#127996;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💆đŸģ", "name": "person getting massage: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F486 1F3FB", "html": "&#128134;&#127995;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💆", "name": "person getting massage", "shortname": ":massage:", "unicode": "1f486", "html": "&#128134;", "category": "People & Body (person-activity)", "order": "657"},
+ {"emoji": "💌", "name": "love letter", "shortname": ":love_letter:", "unicode": "1f48c", "html": "&#128140;", "category": "Smileys & Emotion (emotion)", "order": "1301"},
+ {"emoji": "🏆", "name": "trophy", "shortname": ":trophy:", "unicode": "1f3c6", "html": "&#127942;", "category": "Activities (award-medal)", "order": "1776"},
+ {"emoji": "🙍đŸŋ‍♂", "name": "man frowning: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64D 1F3FF 200D 2642", "html": "&#128589;&#127999;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍🏾‍♂", "name": "man frowning: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64D 1F3FE 200D 2642", "html": "&#128589;&#127998;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍đŸŊ‍♂", "name": "man frowning: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64D 1F3FD 200D 2642", "html": "&#128589;&#127997;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍đŸŧ‍♂", "name": "man frowning: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64D 1F3FC 200D 2642", "html": "&#128589;&#127996;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍đŸģ‍♂", "name": "man frowning: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64D 1F3FB 200D 2642", "html": "&#128589;&#127995;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍‍♂", "name": "man frowning", "shortname": ":man_frowning:", "unicode": "1F64D 200D 2642", "html": "&#128589;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍đŸŋ", "name": "person frowning: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64D 1F3FF", "html": "&#128589;&#127999;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍🏾", "name": "person frowning: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64D 1F3FE", "html": "&#128589;&#127998;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍đŸŊ", "name": "person frowning: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64D 1F3FD", "html": "&#128589;&#127997;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍đŸŧ", "name": "person frowning: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64D 1F3FC", "html": "&#128589;&#127996;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍đŸģ", "name": "person frowning: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64D 1F3FB", "html": "&#128589;&#127995;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍", "name": "person frowning", "shortname": ":person_frowning:", "unicode": "1f64d", "html": "&#128589;", "category": "People & Body (person-gesture)", "order": "495"},
+ {"emoji": "đŸ‡ē🇸", "name": "flag: United States", "shortname": ":us:", "unicode": "1f1fa", "html": "&#127482;", "category": "Flags (country-flag)", "order": ""},
+ {"emoji": "🎊", "name": "confetti ball", "shortname": ":confetti_ball:", "unicode": "1f38a", "html": "&#127882;", "category": "Activities (event)", "order": "1763"},
+ {"emoji": "đŸŒŧ", "name": "blossom", "shortname": ":blossom:", "unicode": "1f33c", "html": "&#127804;", "category": "Animals & Nature (plant-flower)", "order": "1435"},
+ {"emoji": "đŸ”Ē", "name": "kitchen knife", "shortname": ":kitchen_knife:", "unicode": "1F52A", "html": "&#128298;", "category": "Food & Drink (dishware)", "order": ""},
+ {"emoji": "👄", "name": "mouth", "shortname": ":lips:", "unicode": "1f444", "html": "&#128068;", "category": "People & Body (body-parts)", "order": "1283"},
+ {"emoji": "🍟", "name": "french fries", "shortname": ":fries:", "unicode": "1f35f", "html": "&#127839;", "category": "Food & Drink (food-prepared)", "order": "1483"},
+ {"emoji": "🍩", "name": "doughnut", "shortname": ":doughnut:", "unicode": "1f369", "html": "&#127849;", "category": "Food & Drink (food-sweet)", "order": "1511"},
+ {"emoji": "đŸ˜Ļ", "name": "frowning face with open mouth", "shortname": ":frowning:", "unicode": "1f626", "html": "&#128550;", "category": "Smileys & Emotion (face-concerned)", "order": "56"},
+ {"emoji": "🌊", "name": "water wave", "shortname": ":ocean:", "unicode": "1f30a", "html": "&#127754;", "category": "Travel & Places (sky & weather)", "order": "1755"},
+ {"emoji": "đŸ’Ŗ", "name": "bomb", "shortname": ":bomb:", "unicode": "1f4a3", "html": "&#128163;", "category": "Smileys & Emotion (emotion)", "order": "1304"},
+ {"emoji": "🆗", "name": "OK button", "shortname": ":ok:", "unicode": "1f197", "html": "&#127383;", "category": "Symbols (alphanum)", "order": "2137"},
+ {"emoji": "🌀", "name": "cyclone", "shortname": ":cyclone:", "unicode": "1f300", "html": "&#127744;", "category": "Travel & Places (sky & weather)", "order": "1742"},
+ {"emoji": "🚀", "name": "rocket", "shortname": ":rocket:", "unicode": "1f680", "html": "&#128640;", "category": "Travel & Places (transport-air)", "order": "1659"},
+ {"emoji": "☔", "name": "umbrella with rain drops", "shortname": ":umbrella:", "unicode": "2614", "html": "&#9748;", "category": "Travel & Places (sky & weather)", "order": "1746"},
+ {"emoji": "💏", "name": "kiss", "shortname": ":couplekiss:", "unicode": "1f48f", "html": "&#128143;", "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": "&#128105;&zwj;&#10084;&zwj;&#128139;&zwj;&#128105;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "đŸ‘¨â€â¤ī¸â€đŸ’‹â€đŸ‘¨", "name": "kiss: man, man", "shortname": ":couple_man_kiss:", "unicode": "1F468 200D 2764 FE0F 200D 1F48B 200D 1F468", "html": "&#128104;&zwj;&#10084;&zwj;&#128139;&zwj;&#128104;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "💑", "name": "couple with heart", "shortname": ":couple_with_heart:", "unicode": "1f491", "html": "&#128145;", "category": "People & Body (family)", "order": "1040"},
+ {"emoji": "đŸ‘Šâ€â¤ī¸â€đŸ‘Š", "name": "couple with heart: woman, woman", "shortname": ":woman_woman:", "unicode": "1F469 200D 2764 FE0F 200D 1F469", "html": "&#128105;&zwj;&#10084;&zwj;&#128105;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "đŸ‘¨â€â¤ī¸â€đŸ‘¨", "name": "couple with heart: man, man", "shortname": ":man_man_love:", "unicode": "1F468 200D 2764 FE0F 200D 1F468", "html": "&#128104;&zwj;&#10084;&zwj;&#128104;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "🍭", "name": "lollipop", "shortname": ":lollipop:", "unicode": "1f36d", "html": "&#127853;", "category": "Food & Drink (food-sweet)", "order": "1517"},
+ {"emoji": "đŸŽŦ", "name": "clapper board", "shortname": ":clapper:", "unicode": "1f3ac", "html": "&#127916;", "category": "Objects (light & video)", "order": "1859"},
+ {"emoji": "🐷", "name": "pig face", "shortname": ":pig:", "unicode": "1f437", "html": "&#128055;", "category": "Animals & Nature (animal-mammal)", "order": "1364"},
+ {"emoji": "😈", "name": "smiling face with horns", "shortname": ":smiling_imp:", "unicode": "1f608", "html": "&#128520;", "category": "Smileys & Emotion (face-negative)", "order": "76"},
+ {"emoji": "đŸ‘ŋ", "name": "angry face with horns", "shortname": ":imp:", "unicode": "1f47f", "html": "&#128127;", "category": "Smileys & Emotion (face-negative)", "order": "77"},
+ {"emoji": "🐝", "name": "honeybee", "shortname": ":bee:", "unicode": "1f41d", "html": "&#128029;", "category": "Animals & Nature (animal-bug)", "order": "1422"},
+ {"emoji": "đŸ˜Ŋ", "name": "kissing cat", "shortname": ":kissing_cat:", "unicode": "1f63d", "html": "&#128573;", "category": "Smileys & Emotion (cat-face)", "order": "92"},
+ {"emoji": "đŸ’ĸ", "name": "anger symbol", "shortname": ":anger:", "unicode": "1f4a2", "html": "&#128162;", "category": "Smileys & Emotion (emotion)", "order": "1303"},
+ {"emoji": "đŸŽŧ", "name": "musical score", "shortname": ":musical_score:", "unicode": "1f3bc", "html": "&#127932;", "category": "Objects (music)", "order": "1823"},
+ {"emoji": "🎅đŸŋ", "name": "Santa Claus: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F385 1F3FF", "html": "&#127877;&#127999;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🎅🏾", "name": "Santa Claus: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F385 1F3FE", "html": "&#127877;&#127998;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🎅đŸŊ", "name": "Santa Claus: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F385 1F3FD", "html": "&#127877;&#127997;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🎅đŸŧ", "name": "Santa Claus: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F385 1F3FC", "html": "&#127877;&#127996;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🎅đŸģ", "name": "Santa Claus: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F385 1F3FB", "html": "&#127877;&#127995;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🎅", "name": "Santa Claus", "shortname": ":santa:", "unicode": "1f385", "html": "&#127877;", "category": "People & Body (person-fantasy)", "order": "447"},
+ {"emoji": "🌏", "name": "globe showing Asia-Australia", "shortname": ":earth_asia:", "unicode": "1f30f", "html": "&#127759;", "category": "Travel & Places (place-map)", "order": "1540"},
+ {"emoji": "🏈", "name": "american football", "shortname": ":football:", "unicode": "1f3c8", "html": "&#127944;", "category": "Activities (sport)", "order": "1785"},
+ {"emoji": "🎸", "name": "guitar", "shortname": ":guitar:", "unicode": "1f3b8", "html": "&#127928;", "category": "Objects (musical-instrument)", "order": "1833"},
+ {"emoji": "â™Ļī¸", "name": "diamond suit", "shortname": ":diamond_suit:", "unicode": "2666 FE0F", "html": "&diams;ī¸", "category": "Activities (game)", "order": ""},
+ {"emoji": "đŸŧ", "name": "panda", "shortname": ":panda_face:", "unicode": "1f43c", "html": "&#128060;", "category": "Animals & Nature (animal-mammal)", "order": "1385"},
+ {"emoji": "đŸ’Ŧ", "name": "speech balloon", "shortname": ":speech_balloon:", "unicode": "1f4ac", "html": "&#128172;", "category": "Smileys & Emotion (emotion)", "order": "1309"},
+ {"emoji": "🍓", "name": "strawberry", "shortname": ":strawberry:", "unicode": "1f353", "html": "&#127827;", "category": "Food & Drink (food-fruit)", "order": "1461"},
+ {"emoji": "đŸ˜ŧ", "name": "cat with wry smile", "shortname": ":smirk_cat:", "unicode": "1f63c", "html": "&#128572;", "category": "Smileys & Emotion (cat-face)", "order": "91"},
+ {"emoji": "🍌", "name": "banana", "shortname": ":banana:", "unicode": "1f34c", "html": "&#127820;", "category": "Food & Drink (food-fruit)", "order": "1454"},
+ {"emoji": "🍉", "name": "watermelon", "shortname": ":watermelon:", "unicode": "1f349", "html": "&#127817;", "category": "Food & Drink (food-fruit)", "order": "1451"},
+ {"emoji": "⛄", "name": "snowman without snow", "shortname": ":snowman:", "unicode": "26c4", "html": "&#9924;", "category": "Travel & Places (sky & weather)", "order": "1751"},
+ {"emoji": "😸", "name": "grinning cat with smiling eyes", "shortname": ":smile_cat:", "unicode": "1f638", "html": "&#128568;", "category": "Smileys & Emotion (cat-face)", "order": "88"},
+ {"emoji": "â™ ī¸", "name": "spade suit", "shortname": ":spade_suit:", "unicode": "2660 FE0F", "html": "&spades;ī¸", "category": "Activities (game)", "order": ""},
+ {"emoji": "🔝", "name": "TOP arrow", "shortname": ":top:", "unicode": "1f51d", "html": "&#128285;", "category": "Symbols (arrow)", "order": "2022"},
+ {"emoji": "🍆", "name": "eggplant", "shortname": ":eggplant:", "unicode": "1f346", "html": "&#127814;", "category": "Food & Drink (food-vegetable)", "order": "1465"},
+ {"emoji": "🔮", "name": "crystal ball", "shortname": ":crystal_ball:", "unicode": "1f52e", "html": "&#128302;", "category": "Activities (game)", "order": "1974"},
+ {"emoji": "🍴", "name": "fork and knife", "shortname": ":fork_and_knife:", "unicode": "1f374", "html": "&#127860;", "category": "Food & Drink (dishware)", "order": "1534"},
+ {"emoji": "📲", "name": "mobile phone with arrow", "shortname": ":calling:", "unicode": "1f4f2", "html": "&#128242;", "category": "Objects (phone)", "order": "1839"},
+ {"emoji": "📱", "name": "mobile phone", "shortname": ":iphone:", "unicode": "1f4f1", "html": "&#128241;", "category": "Objects (phone)", "order": "1838"},
+ {"emoji": "⛅", "name": "sun behind cloud", "shortname": ":partly_sunny:", "unicode": "26c5", "html": "&#9925;", "category": "Travel & Places (sky & weather)", "order": "1731"},
+ {"emoji": "âš ī¸", "name": "warning", "shortname": ":warning:", "unicode": "26a0", "html": "&#9888;", "category": "Symbols (warning)", "order": "1989"},
+ {"emoji": "🙀", "name": "weary cat", "shortname": ":scream_cat:", "unicode": "1f640", "html": "&#128576;", "category": "Smileys & Emotion (cat-face)", "order": "93"},
+ {"emoji": "🔸", "name": "small orange diamond", "shortname": ":small_orange_diamond:", "unicode": "1f538", "html": "&#128312;", "category": "Symbols (geometric)", "order": "2169"},
+ {"emoji": "đŸ‘ļđŸŋ", "name": "baby: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F476 1F3FF", "html": "&#128118;&#127999;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "đŸ‘ļ🏾", "name": "baby: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F476 1F3FE", "html": "&#128118;&#127998;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "đŸ‘ļđŸŊ", "name": "baby: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F476 1F3FD", "html": "&#128118;&#127997;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "đŸ‘ļđŸŧ", "name": "baby: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F476 1F3FC", "html": "&#128118;&#127996;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "đŸ‘ļđŸģ", "name": "baby: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F476 1F3FB", "html": "&#128118;&#127995;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "đŸ‘ļ", "name": "baby", "shortname": ":baby:", "unicode": "1f476", "html": "&#128118;", "category": "People & Body (person)", "order": "135"},
+ {"emoji": "🐾", "name": "paw prints", "shortname": ":feet:", "unicode": "1f43e", "html": "&#128062;", "category": "Animals & Nature (animal-mammal)", "order": "1386"},
+ {"emoji": "đŸ‘Ŗ", "name": "footprints", "shortname": ":footprints:", "unicode": "1f463", "html": "&#128099;", "category": "People & Body (person-symbol)", "order": "1278"},
+ {"emoji": "đŸē", "name": "beer mug", "shortname": ":beer:", "unicode": "1f37a", "html": "&#127866;", "category": "Food & Drink (drink)", "order": "1529"},
+ {"emoji": "🍷", "name": "wine glass", "shortname": ":wine_glass:", "unicode": "1f377", "html": "&#127863;", "category": "Food & Drink (drink)", "order": "1526"},
+ {"emoji": "⭕", "name": "hollow red circle", "shortname": ":o:", "unicode": "2b55", "html": "&#11093;", "category": "Symbols (other-symbol)", "order": "2077"},
+ {"emoji": "📹", "name": "video camera", "shortname": ":video_camera:", "unicode": "1f4f9", "html": "&#128249;", "category": "Objects (light & video)", "order": "1863"},
+ {"emoji": "🐰", "name": "rabbit face", "shortname": ":rabbit:", "unicode": "1f430", "html": "&#128048;", "category": "Animals & Nature (animal-mammal)", "order": "1379"},
+ {"emoji": "🍹", "name": "tropical drink", "shortname": ":tropical_drink:", "unicode": "1f379", "html": "&#127865;", "category": "Food & Drink (drink)", "order": "1528"},
+ {"emoji": "đŸšŦ", "name": "cigarette", "shortname": ":smoking:", "unicode": "1f6ac", "html": "&#128684;", "category": "Objects (other-object)", "order": "1969"},
+ {"emoji": "👾", "name": "alien monster", "shortname": ":space_invader:", "unicode": "1f47e", "html": "&#128126;", "category": "Smileys & Emotion (face-costume)", "order": "84"},
+ {"emoji": "🍑", "name": "peach", "shortname": ":peach:", "unicode": "1f351", "html": "&#127825;", "category": "Food & Drink (food-fruit)", "order": "1459"},
+ {"emoji": "🐍", "name": "snake", "shortname": ":snake:", "unicode": "1f40d", "html": "&#128013;", "category": "Animals & Nature (animal-reptile)", "order": "1403"},
+ {"emoji": "đŸĸ", "name": "turtle", "shortname": ":turtle:", "unicode": "1f422", "html": "&#128034;", "category": "Animals & Nature (animal-reptile)", "order": "1401"},
+ {"emoji": "🍒", "name": "cherries", "shortname": ":cherries:", "unicode": "1f352", "html": "&#127826;", "category": "Food & Drink (food-fruit)", "order": "1460"},
+ {"emoji": "😗", "name": "kissing face", "shortname": ":kissing:", "unicode": "1f617", "html": "&#128535;", "category": "Smileys & Emotion (face-affection)", "order": "15"},
+ {"emoji": "🐸", "name": "frog", "shortname": ":frog:", "unicode": "1f438", "html": "&#128056;", "category": "Animals & Nature (animal-amphibian)", "order": "1399"},
+ {"emoji": "🌌", "name": "milky way", "shortname": ":milky_way:", "unicode": "1f30c", "html": "&#127756;", "category": "Travel & Places (sky & weather)", "order": "1592"},
+ {"emoji": "🚨", "name": "police car light", "shortname": ":rotating_light:", "unicode": "1f6a8", "html": "&#128680;", "category": "Travel & Places (transport-ground)", "order": "1637"},
+ {"emoji": "đŸŖ", "name": "hatching chick", "shortname": ":hatching_chick:", "unicode": "1f423", "html": "&#128035;", "category": "Animals & Nature (animal-bird)", "order": "1390"},
+ {"emoji": "📕", "name": "closed book", "shortname": ":closed_book:", "unicode": "1f4d5", "html": "&#128213;", "category": "Objects (book-paper)", "order": "1875"},
+ {"emoji": "đŸŦ", "name": "candy", "shortname": ":candy:", "unicode": "1f36c", "html": "&#127852;", "category": "Food & Drink (food-sweet)", "order": "1516"},
+ {"emoji": "🍔", "name": "hamburger", "shortname": ":hamburger:", "unicode": "1f354", "html": "&#127828;", "category": "Food & Drink (food-prepared)", "order": "1482"},
+ {"emoji": "đŸģ", "name": "bear", "shortname": ":bear:", "unicode": "1f43b", "html": "&#128059;", "category": "Animals & Nature (animal-mammal)", "order": "1383"},
+ {"emoji": "đŸ¯", "name": "tiger face", "shortname": ":tiger:", "unicode": "1f42f", "html": "&#128047;", "category": "Animals & Nature (animal-mammal)", "order": "1353"},
+ {"emoji": "🚗", "name": "automobile", "shortname": ":automobile:", "unicode": "1F697", "html": "&#128663;", "category": "Travel & Places (transport-ground)", "order": ""},
+ {"emoji": "⏊", "name": "fast-forward button", "shortname": ":fast_forward:", "unicode": "2.3E+10", "html": "&#9193;", "category": "Symbols (av-symbol)", "order": "2052"},
+ {"emoji": "đŸĻ", "name": "soft ice cream", "shortname": ":icecream:", "unicode": "1f366", "html": "&#127846;", "category": "Food & Drink (food-sweet)", "order": "1508"},
+ {"emoji": "🍍", "name": "pineapple", "shortname": ":pineapple:", "unicode": "1f34d", "html": "&#127821;", "category": "Food & Drink (food-fruit)", "order": "1455"},
+ {"emoji": "🌾", "name": "sheaf of rice", "shortname": ":ear_of_rice:", "unicode": "1f33e", "html": "&#127806;", "category": "Animals & Nature (plant-other)", "order": "1442"},
+ {"emoji": "💉", "name": "syringe", "shortname": ":syringe:", "unicode": "1f489", "html": "&#128137;", "category": "Objects (medical)", "order": "1967"},
+ {"emoji": "🚮", "name": "litter in bin sign", "shortname": ":put_litter_in_its_place:", "unicode": "1f6ae", "html": "&#128686;", "category": "Symbols (transport-sign)", "order": "1977"},
+ {"emoji": "đŸĢ", "name": "chocolate bar", "shortname": ":chocolate_bar:", "unicode": "1f36b", "html": "&#127851;", "category": "Food & Drink (food-sweet)", "order": "1515"},
+ {"emoji": "â–Ēī¸", "name": "black small square", "shortname": ":black_small_square:", "unicode": "25aa", "html": "&#9642;", "category": "Symbols (geometric)", "order": "2159"},
+ {"emoji": "đŸ“ē", "name": "television", "shortname": ":tv:", "unicode": "1f4fa", "html": "&#128250;", "category": "Objects (light & video)", "order": "1860"},
+ {"emoji": "💊", "name": "pill", "shortname": ":pill:", "unicode": "1f48a", "html": "&#128138;", "category": "Objects (medical)", "order": "1968"},
+ {"emoji": "🐙", "name": "octopus", "shortname": ":octopus:", "unicode": "1f419", "html": "&#128025;", "category": "Animals & Nature (animal-marine)", "order": "1413"},
+ {"emoji": "🎃", "name": "jack-o-lantern", "shortname": ":jack_o_lantern:", "unicode": "1f383", "html": "&#127875;", "category": "Activities (event)", "order": "1756"},
+ {"emoji": "🍇", "name": "grapes", "shortname": ":grapes:", "unicode": "1f347", "html": "&#127815;", "category": "Food & Drink (food-fruit)", "order": "1449"},
+ {"emoji": "đŸ˜ē", "name": "grinning cat", "shortname": ":smiley_cat:", "unicode": "1f63a", "html": "&#128570;", "category": "Smileys & Emotion (cat-face)", "order": "87"},
+ {"emoji": "đŸ’ŋ", "name": "optical disk", "shortname": ":cd:", "unicode": "1f4bf", "html": "&#128191;", "category": "Objects (computer)", "order": "1854"},
+ {"emoji": "🍸", "name": "cocktail glass", "shortname": ":cocktail:", "unicode": "1f378", "html": "&#127864;", "category": "Food & Drink (drink)", "order": "1527"},
+ {"emoji": "🍰", "name": "shortcake", "shortname": ":cake:", "unicode": "1f370", "html": "&#127856;", "category": "Food & Drink (food-sweet)", "order": "1514"},
+ {"emoji": "🎮", "name": "video game", "shortname": ":video_game:", "unicode": "1f3ae", "html": "&#127918;", "category": "Activities (game)", "order": "1804"},
+ {"emoji": "â„ĸī¸", "name": "trade mark", "shortname": ":trade_mark:", "unicode": "2122 FE0F", "html": "&trade;ī¸", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "âŦ‡ī¸", "name": "down arrow", "shortname": ":arrow_down:", "unicode": "2b07", "html": "&#11015;", "category": "Symbols (arrow)", "order": "2006"},
+ {"emoji": "đŸšĢ", "name": "prohibited", "shortname": ":no_entry_sign:", "unicode": "1f6ab", "html": "&#128683;", "category": "Symbols (warning)", "order": "1992"},
+ {"emoji": "💄", "name": "lipstick", "shortname": ":lipstick:", "unicode": "1f484", "html": "&#128132;", "category": "Objects (clothing)", "order": "1339"},
+ {"emoji": "đŸŗ", "name": "spouting whale", "shortname": ":whale:", "unicode": "1f433", "html": "&#128051;", "category": "Animals & Nature (animal-marine)", "order": "1406"},
+ {"emoji": "📝", "name": "memo", "shortname": ":memo:", "unicode": "1F4DD", "html": "&#128221;", "category": "Objects (writing)", "order": ""},
+ {"emoji": "ÂŽī¸", "name": "registered", "shortname": ":registered:", "unicode": "00AE FE0F", "html": "&reg;ī¸", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "đŸĒ", "name": "cookie", "shortname": ":cookie:", "unicode": "1f36a", "html": "&#127850;", "category": "Food & Drink (food-sweet)", "order": "1512"},
+ {"emoji": "đŸŦ", "name": "dolphin", "shortname": ":dolphin:", "unicode": "1f42c", "html": "&#128044;", "category": "Animals & Nature (animal-marine)", "order": "1408"},
+ {"emoji": "🔊", "name": "speaker high volume", "shortname": ":loud_sound:", "unicode": "1f50a", "html": "&#128266;", "category": "Objects (sound)", "order": "1817"},
+ {"emoji": "👨đŸŋ", "name": "man: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF", "html": "&#128104;&#127999;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👨🏾", "name": "man: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE", "html": "&#128104;&#127998;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👨đŸŊ", "name": "man: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD", "html": "&#128104;&#127997;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👨đŸŧ", "name": "man: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC", "html": "&#128104;&#127996;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👨đŸģ", "name": "man: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB", "html": "&#128104;&#127995;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👨", "name": "man", "shortname": ":man:", "unicode": "1f468", "html": "&#128104;", "category": "People & Body (person)", "order": "111"},
+ {"emoji": "đŸĨ", "name": "front-facing baby chick", "shortname": ":hatched_chick:", "unicode": "1f425", "html": "&#128037;", "category": "Animals & Nature (animal-bird)", "order": "1392"},
+ {"emoji": "🐒", "name": "monkey", "shortname": ":monkey:", "unicode": "1f412", "html": "&#128018;", "category": "Animals & Nature (animal-mammal)", "order": "1343"},
+ {"emoji": "📚", "name": "books", "shortname": ":books:", "unicode": "1f4da", "html": "&#128218;", "category": "Objects (book-paper)", "order": "1880"},
+ {"emoji": "👹", "name": "ogre", "shortname": ":japanese_ogre:", "unicode": "1f479", "html": "&#128121;", "category": "Smileys & Emotion (face-costume)", "order": "78"},
+ {"emoji": "💂đŸŋ‍♀", "name": "woman guard: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F482 1F3FF 200D 2640", "html": "&#128130;&#127999;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂🏾‍♀", "name": "woman guard: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F482 1F3FE 200D 2640", "html": "&#128130;&#127998;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂đŸŊ‍♀", "name": "woman guard: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F482 1F3FD 200D 2640", "html": "&#128130;&#127997;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂đŸŧ‍♀", "name": "woman guard: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F482 1F3FC 200D 2640", "html": "&#128130;&#127996;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂đŸģ‍♀", "name": "woman guard: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F482 1F3FB 200D 2640", "html": "&#128130;&#127995;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂‍♀", "name": "woman guard", "shortname": ":woman_guard:", "unicode": "1F482 200D 2640", "html": "&#128130;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂đŸŋ", "name": "guard: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F482 1F3FF", "html": "&#128130;&#127999;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂🏾", "name": "guard: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F482 1F3FE", "html": "&#128130;&#127998;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂đŸŊ", "name": "guard: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F482 1F3FD", "html": "&#128130;&#127997;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂đŸŧ", "name": "guard: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F482 1F3FC", "html": "&#128130;&#127996;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂đŸģ", "name": "guard: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F482 1F3FB", "html": "&#128130;&#127995;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂", "name": "guard", "shortname": ":guardsman:", "unicode": "1f482", "html": "&#128130;", "category": "People & Body (person-role)", "order": "375"},
+ {"emoji": "đŸ“ĸ", "name": "loudspeaker", "shortname": ":loudspeaker:", "unicode": "1f4e2", "html": "&#128226;", "category": "Objects (sound)", "order": "1818"},
+ {"emoji": "âœ‚ī¸", "name": "scissors", "shortname": ":scissors:", "unicode": "2702", "html": "&#9986;", "category": "Objects (office)", "order": "1940"},
+ {"emoji": "👧đŸŋ", "name": "girl: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F467 1F3FF", "html": "&#128103;&#127999;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👧🏾", "name": "girl: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F467 1F3FE", "html": "&#128103;&#127998;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👧đŸŊ", "name": "girl: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F467 1F3FD", "html": "&#128103;&#127997;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👧đŸŧ", "name": "girl: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F467 1F3FC", "html": "&#128103;&#127996;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👧đŸģ", "name": "girl: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F467 1F3FB", "html": "&#128103;&#127995;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👧", "name": "girl", "shortname": ":girl:", "unicode": "1f467", "html": "&#128103;", "category": "People & Body (person)", "order": "105"},
+ {"emoji": "🎓", "name": "graduation cap", "shortname": ":mortar_board:", "unicode": "1f393", "html": "&#127891;", "category": "Objects (clothing)", "order": "1336"},
+ {"emoji": "đŸ‡Ģ🇷", "name": "flag: France", "shortname": ":fr:", "unicode": "1f1eb", "html": "&#127467;", "category": "Flags (country-flag)", "order": ""},
+ {"emoji": "âšžī¸", "name": "", "shortname": ":baseball:", "unicode": "26be", "html": "&#9918;", "category": "", "order": "1782"},
+ {"emoji": "đŸšĻ", "name": "vertical traffic light", "shortname": ":vertical_traffic_light:", "unicode": "1f6a6", "html": "&#128678;", "category": "Travel & Places (transport-ground)", "order": "1639"},
+ {"emoji": "👩đŸŋ", "name": "woman: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF", "html": "&#128105;&#127999;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👩🏾", "name": "woman: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE", "html": "&#128105;&#127998;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👩đŸŊ", "name": "woman: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD", "html": "&#128105;&#127997;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👩đŸŧ", "name": "woman: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC", "html": "&#128105;&#127996;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👩đŸģ", "name": "woman: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB", "html": "&#128105;&#127995;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👩", "name": "woman", "shortname": ":woman:", "unicode": "1f469", "html": "&#128105;", "category": "People & Body (person)", "order": "117"},
+ {"emoji": "🎆", "name": "fireworks", "shortname": ":fireworks:", "unicode": "1f386", "html": "&#127878;", "category": "Activities (event)", "order": "1758"},
+ {"emoji": "🌠", "name": "shooting star", "shortname": ":stars:", "unicode": "1f320", "html": "&#127776;", "category": "Travel & Places (sky & weather)", "order": "1729"},
+ {"emoji": "🆘", "name": "SOS button", "shortname": ":sos:", "unicode": "1f198", "html": "&#127384;", "category": "Symbols (alphanum)", "order": "2139"},
+ {"emoji": "🍄", "name": "mushroom", "shortname": ":mushroom:", "unicode": "1f344", "html": "&#127812;", "category": "Food & Drink (food-vegetable)", "order": "1471"},
+ {"emoji": "😾", "name": "pouting cat", "shortname": ":pouting_cat:", "unicode": "1f63e", "html": "&#128574;", "category": "Smileys & Emotion (cat-face)", "order": "95"},
+ {"emoji": "🛅", "name": "left luggage", "shortname": ":left_luggage:", "unicode": "1f6c5", "html": "&#128709;", "category": "Symbols (transport-sign)", "order": "1988"},
+ {"emoji": "👠", "name": "high-heeled shoe", "shortname": ":high_heel:", "unicode": "1f460", "html": "&#128096;", "category": "Objects (clothing)", "order": "1330"},
+ {"emoji": "đŸŽ¯", "name": "direct hit", "shortname": ":dart:", "unicode": "1f3af", "html": "&#127919;", "category": "Activities (game)", "order": "1798"},
+ {"emoji": "🏊đŸŋ‍♀", "name": "woman swimming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CA 1F3FF 200D 2640", "html": "&#127946;&#127999;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊🏾‍♀", "name": "woman swimming: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CA 1F3FE 200D 2640", "html": "&#127946;&#127998;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊đŸŊ‍♀", "name": "woman swimming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CA 1F3FD 200D 2640", "html": "&#127946;&#127997;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊đŸŧ‍♀", "name": "woman swimming: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CA 1F3FC 200D 2640", "html": "&#127946;&#127996;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊đŸģ‍♀", "name": "woman swimming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CA 1F3FB 200D 2640", "html": "&#127946;&#127995;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊‍♀", "name": "woman swimming", "shortname": ":woman_swimming:", "unicode": "1F3CA 200D 2640", "html": "&#127946;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊đŸŋ", "name": "person swimming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CA 1F3FF", "html": "&#127946;&#127999;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊🏾", "name": "person swimming: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CA 1F3FE", "html": "&#127946;&#127998;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊đŸŊ", "name": "person swimming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CA 1F3FD", "html": "&#127946;&#127997;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊đŸŧ", "name": "person swimming: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CA 1F3FC", "html": "&#127946;&#127996;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊đŸģ", "name": "person swimming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CA 1F3FB", "html": "&#127946;&#127995;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊", "name": "person swimming", "shortname": ":swimmer:", "unicode": "1f3ca", "html": "&#127946;", "category": "People & Body (person-sport)", "order": "836"},
+ {"emoji": "🔑", "name": "key", "shortname": ":key:", "unicode": "1f511", "html": "&#128273;", "category": "Objects (lock)", "order": "1948"},
+ {"emoji": "👙", "name": "bikini", "shortname": ":bikini:", "unicode": "1f459", "html": "&#128089;", "category": "Objects (clothing)", "order": "1321"},
+ {"emoji": "đŸ‘Ē", "name": "family", "shortname": ":family:", "unicode": "1f46a", "html": "&#128106;", "category": "People & Body (family)", "order": "1044"},
+ {"emoji": "✏", "name": "pencil", "shortname": ":pencil2:", "unicode": "270f", "html": "&#9999;", "category": "Objects (writing)", "order": "1914"},
+ {"emoji": "🐘", "name": "elephant", "shortname": ":elephant:", "unicode": "1f418", "html": "&#128024;", "category": "Animals & Nature (animal-mammal)", "order": "1373"},
+ {"emoji": "💧", "name": "droplet", "shortname": ":droplet:", "unicode": "1f4a7", "html": "&#128167;", "category": "Travel & Places (sky & weather)", "order": "1754"},
+ {"emoji": "🌱", "name": "seedling", "shortname": ":seedling:", "unicode": "1f331", "html": "&#127793;", "category": "Animals & Nature (plant-other)", "order": "1437"},
+ {"emoji": "🍎", "name": "red apple", "shortname": ":apple:", "unicode": "1f34e", "html": "&#127822;", "category": "Food & Drink (food-fruit)", "order": "1456"},
+ {"emoji": "🆒", "name": "COOL button", "shortname": ":cool:", "unicode": "1f192", "html": "&#127378;", "category": "Symbols (alphanum)", "order": "2129"},
+ {"emoji": "📞", "name": "telephone receiver", "shortname": ":telephone_receiver:", "unicode": "1f4de", "html": "&#128222;", "category": "Objects (phone)", "order": "1841"},
+ {"emoji": "đŸ’ĩ", "name": "dollar banknote", "shortname": ":dollar:", "unicode": "1f4b5", "html": "&#128181;", "category": "Objects (money)", "order": "1893"},
+ {"emoji": "🏡", "name": "house with garden", "shortname": ":house_with_garden:", "unicode": "1f3e1", "html": "&#127969;", "category": "Travel & Places (place-building)", "order": "1560"},
+ {"emoji": "📖", "name": "open book", "shortname": ":book:", "unicode": "1f4d6", "html": "&#128214;", "category": "Objects (book-paper)", "order": "1876"},
+ {"emoji": "💇đŸŋ‍♂", "name": "man getting haircut: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F487 1F3FF 200D 2642", "html": "&#128135;&#127999;&zwj;&#9794;", "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": "&#128135;&#127998;&zwj;&#9794;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💇đŸŊ‍♂", "name": "man getting haircut: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F487 1F3FD 200D 2642", "html": "&#128135;&#127997;&zwj;&#9794;", "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": "&#128135;&#127996;&zwj;&#9794;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💇đŸģ‍♂", "name": "man getting haircut: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F487 1F3FB 200D 2642", "html": "&#128135;&#127995;&zwj;&#9794;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💇‍♂", "name": "man getting haircut", "shortname": ":man_getting_haircut:", "unicode": "1F487 200D 2642", "html": "&#128135;&zwj;&#9794;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💇đŸŋ", "name": "person getting haircut: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F487 1F3FF", "html": "&#128135;&#127999;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💇🏾", "name": "person getting haircut: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F487 1F3FE", "html": "&#128135;&#127998;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💇đŸŊ", "name": "person getting haircut: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F487 1F3FD", "html": "&#128135;&#127997;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💇đŸŧ", "name": "person getting haircut: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F487 1F3FC", "html": "&#128135;&#127996;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💇đŸģ", "name": "person getting haircut: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F487 1F3FB", "html": "&#128135;&#127995;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💇", "name": "person getting haircut", "shortname": ":haircut:", "unicode": "1f487", "html": "&#128135;", "category": "People & Body (person-activity)", "order": "675"},
+ {"emoji": "đŸ’ģ", "name": "laptop", "shortname": ":computer:", "unicode": "1f4bb", "html": "&#128187;", "category": "Objects (computer)", "order": "1846"},
+ {"emoji": "💡", "name": "light bulb", "shortname": ":bulb:", "unicode": "1f4a1", "html": "&#128161;", "category": "Objects (light & video)", "order": "1871"},
+ {"emoji": "❓", "name": "question mark", "shortname": ":question:", "unicode": "2753", "html": "&#10067;", "category": "Symbols (other-symbol)", "order": "2098"},
+ {"emoji": "🔙", "name": "BACK arrow", "shortname": ":back:", "unicode": "1f519", "html": "&#128281;", "category": "Symbols (arrow)", "order": "2018"},
+ {"emoji": "đŸ‘ĻđŸŋ", "name": "boy: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F466 1F3FF", "html": "&#128102;&#127999;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "đŸ‘Ļ🏾", "name": "boy: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F466 1F3FE", "html": "&#128102;&#127998;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "đŸ‘ĻđŸŊ", "name": "boy: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F466 1F3FD", "html": "&#128102;&#127997;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "đŸ‘ĻđŸŧ", "name": "boy: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F466 1F3FC", "html": "&#128102;&#127996;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "đŸ‘ĻđŸģ", "name": "boy: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F466 1F3FB", "html": "&#128102;&#127995;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "đŸ‘Ļ", "name": "boy", "shortname": ":boy:", "unicode": "1f466", "html": "&#128102;", "category": "People & Body (person)", "order": "99"},
+ {"emoji": "🔐", "name": "locked with key", "shortname": ":closed_lock_with_key:", "unicode": "1f510", "html": "&#128272;", "category": "Objects (lock)", "order": "1947"},
+ {"emoji": "🙎đŸŋ‍♂", "name": "man pouting: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64E 1F3FF 200D 2642", "html": "&#128590;&#127999;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎🏾‍♂", "name": "man pouting: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64E 1F3FE 200D 2642", "html": "&#128590;&#127998;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎đŸŊ‍♂", "name": "man pouting: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64E 1F3FD 200D 2642", "html": "&#128590;&#127997;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎đŸŧ‍♂", "name": "man pouting: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64E 1F3FC 200D 2642", "html": "&#128590;&#127996;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎đŸģ‍♂", "name": "man pouting: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64E 1F3FB 200D 2642", "html": "&#128590;&#127995;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎‍♂", "name": "man pouting", "shortname": ":man_pouting:", "unicode": "1F64E 200D 2642", "html": "&#128590;&zwj;&#9794;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎đŸŋ", "name": "person pouting: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64E 1F3FF", "html": "&#128590;&#127999;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎🏾", "name": "person pouting: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64E 1F3FE", "html": "&#128590;&#127998;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎đŸŊ", "name": "person pouting: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64E 1F3FD", "html": "&#128590;&#127997;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎đŸŧ", "name": "person pouting: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64E 1F3FC", "html": "&#128590;&#127996;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎đŸģ", "name": "person pouting: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64E 1F3FB", "html": "&#128590;&#127995;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎", "name": "person pouting", "shortname": ":person_with_pouting_face:", "unicode": "1f64e", "html": "&#128590;", "category": "People & Body (person-gesture)", "order": "513"},
+ {"emoji": "🍊", "name": "tangerine", "shortname": ":tangerine:", "unicode": "1f34a", "html": "&#127818;", "category": "Food & Drink (food-fruit)", "order": "1452"},
+ {"emoji": "â†”ī¸", "name": "left-right arrow", "shortname": ":leftright_arrow:", "unicode": "2194 FE0F", "html": "&harr;ī¸", "category": "Symbols (arrow)", "order": ""},
+ {"emoji": "🌅", "name": "sunrise", "shortname": ":sunrise:", "unicode": "1f305", "html": "&#127749;", "category": "Travel & Places (place-other)", "order": "1587"},
+ {"emoji": "🍗", "name": "poultry leg", "shortname": ":poultry_leg:", "unicode": "1f357", "html": "&#127831;", "category": "Food & Drink (food-prepared)", "order": "1480"},
+ {"emoji": "đŸ”ĩ", "name": "blue circle", "shortname": ":blue_circle:", "unicode": "1f535", "html": "&#128309;", "category": "Symbols (geometric)", "order": "2180"},
+ {"emoji": "🚘", "name": "oncoming automobile", "shortname": ":oncoming_automobile:", "unicode": "1f698", "html": "&#128664;", "category": "Travel & Places (transport-ground)", "order": "1625"},
+ {"emoji": "🍧", "name": "shaved ice", "shortname": ":shaved_ice:", "unicode": "1f367", "html": "&#127847;", "category": "Food & Drink (food-sweet)", "order": "1509"},
+ {"emoji": "🇮🇹", "name": "flag: Italy", "shortname": ":it:", "unicode": "1F1EE 1F1F9", "html": "&#127470;", "category": "Flags (country-flag)", "order": ""},
+ {"emoji": "đŸĻ", "name": "bird", "shortname": ":bird:", "unicode": "1f426", "html": "&#128038;", "category": "Animals & Nature (animal-bird)", "order": "1393"},
+ {"emoji": "đŸ‡Ŧ🇧", "name": "flag: United Kingdom", "shortname": ":gb:", "unicode": "1F1EC 1F1E7", "html": "&#127468;", "category": "Flags (country-flag)", "order": ""},
+ {"emoji": "🌛", "name": "first quarter moon face", "shortname": ":first_quarter_moon_with_face:", "unicode": "1f31b", "html": "&#127771;", "category": "Travel & Places (sky & weather)", "order": "1721"},
+ {"emoji": "👓", "name": "glasses", "shortname": ":eyeglasses:", "unicode": "1f453", "html": "&#128083;", "category": "Objects (clothing)", "order": "1314"},
+ {"emoji": "🐐", "name": "goat", "shortname": ":goat:", "unicode": "1f410", "html": "&#128016;", "category": "Animals & Nature (animal-mammal)", "order": "1370"},
+ {"emoji": "🌃", "name": "night with stars", "shortname": ":night_with_stars:", "unicode": "1f303", "html": "&#127747;", "category": "Travel & Places (place-other)", "order": "1585"},
+ {"emoji": "đŸ‘ĩđŸŋ", "name": "old woman: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F475 1F3FF", "html": "&#128117;&#127999;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "đŸ‘ĩ🏾", "name": "old woman: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F475 1F3FE", "html": "&#128117;&#127998;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "đŸ‘ĩđŸŊ", "name": "old woman: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F475 1F3FD", "html": "&#128117;&#127997;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "đŸ‘ĩđŸŧ", "name": "old woman: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F475 1F3FC", "html": "&#128117;&#127996;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "đŸ‘ĩđŸģ", "name": "old woman: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F475 1F3FB", "html": "&#128117;&#127995;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "đŸ‘ĩ", "name": "old woman", "shortname": ":older_woman:", "unicode": "1f475", "html": "&#128117;", "category": "People & Body (person)", "order": "129"},
+ {"emoji": "âšĢ", "name": "black circle", "shortname": ":black_circle:", "unicode": "26ab", "html": "&#9899;", "category": "Symbols (geometric)", "order": "2178"},
+ {"emoji": "🌑", "name": "new moon", "shortname": ":new_moon:", "unicode": "1f311", "html": "&#127761;", "category": "Travel & Places (sky & weather)", "order": "1711"},
+ {"emoji": "đŸ‘Ŧ", "name": "men holding hands", "shortname": ":two_men_holding_hands:", "unicode": "1f46c", "html": "&#128108;", "category": "People & Body (family)", "order": "1024"},
+ {"emoji": "âšĒ", "name": "white circle", "shortname": ":white_circle:", "unicode": "26aa", "html": "&#9898;", "category": "Symbols (geometric)", "order": "2177"},
+ {"emoji": "🛃", "name": "customs", "shortname": ":customs:", "unicode": "1f6c3", "html": "&#128707;", "category": "Symbols (transport-sign)", "order": "1986"},
+ {"emoji": "🐠", "name": "tropical fish", "shortname": ":tropical_fish:", "unicode": "1f420", "html": "&#128032;", "category": "Animals & Nature (animal-marine)", "order": "1410"},
+ {"emoji": "🏠", "name": "house", "shortname": ":house:", "unicode": "1f3e0", "html": "&#127968;", "category": "Travel & Places (place-building)", "order": "1559"},
+ {"emoji": "🔃", "name": "clockwise vertical arrows", "shortname": ":arrows_clockwise:", "unicode": "1f503", "html": "&#128259;", "category": "Symbols (arrow)", "order": "2016"},
+ {"emoji": "🌜", "name": "last quarter moon face", "shortname": ":last_quarter_moon_with_face:", "unicode": "1f31c", "html": "&#127772;", "category": "Travel & Places (sky & weather)", "order": "1722"},
+ {"emoji": "📍", "name": "round pushpin", "shortname": ":round_pushpin:", "unicode": "1f4cd", "html": "&#128205;", "category": "Objects (office)", "order": "1935"},
+ {"emoji": "🌕", "name": "full moon", "shortname": ":full_moon:", "unicode": "1f315", "html": "&#127765;", "category": "Travel & Places (sky & weather)", "order": "1715"},
+ {"emoji": "👟", "name": "running shoe", "shortname": ":athletic_shoe:", "unicode": "1f45f", "html": "&#128095;", "category": "Objects (clothing)", "order": "1329"},
+ {"emoji": "🍋", "name": "lemon", "shortname": ":lemon:", "unicode": "1f34b", "html": "&#127819;", "category": "Food & Drink (food-fruit)", "order": "1453"},
+ {"emoji": "đŸŧ", "name": "baby bottle", "shortname": ":baby_bottle:", "unicode": "1f37c", "html": "&#127868;", "category": "Food & Drink (drink)", "order": "1520"},
+ {"emoji": "🎨", "name": "artist palette", "shortname": ":artist_palette:", "unicode": "1F3A8", "html": "&#127912;", "category": "Activities (arts & crafts)", "order": ""},
+ {"emoji": "âœ‰ī¸", "name": "envelope", "shortname": ":envelope:", "unicode": "2709 FE0F", "html": "&#9993;", "category": "Objects (mail)", "order": ""},
+ {"emoji": "🍝", "name": "spaghetti", "shortname": ":spaghetti:", "unicode": "1f35d", "html": "&#127837;", "category": "Food & Drink (food-asian)", "order": "1501"},
+ {"emoji": "🎐", "name": "wind chime", "shortname": ":wind_chime:", "unicode": "1f390", "html": "&#127888;", "category": "Activities (event)", "order": "1768"},
+ {"emoji": "đŸĨ", "name": "fish cake with swirl", "shortname": ":fish_cake:", "unicode": "1f365", "html": "&#127845;", "category": "Food & Drink (food-asian)", "order": "1506"},
+ {"emoji": "🌲", "name": "evergreen tree", "shortname": ":evergreen_tree:", "unicode": "1f332", "html": "&#127794;", "category": "Animals & Nature (plant-other)", "order": "1438"},
+ {"emoji": "🆙", "name": "UP! button", "shortname": ":up:", "unicode": "1f199", "html": "&#127385;", "category": "Symbols (alphanum)", "order": "2140"},
+ {"emoji": "âŦ†ī¸", "name": "up arrow", "shortname": ":arrow_up:", "unicode": "2b06", "html": "&#11014;", "category": "Symbols (arrow)", "order": "2002"},
+ {"emoji": "â†—ī¸", "name": "up-right arrow", "shortname": ":arrow_upper_right:", "unicode": "2197", "html": "&#8599;", "category": "Symbols (arrow)", "order": "2003"},
+ {"emoji": "â†˜ī¸", "name": "down-right arrow", "shortname": ":arrow_lower_right:", "unicode": "2198", "html": "&#8600;", "category": "Symbols (arrow)", "order": "2005"},
+ {"emoji": "â†™ī¸", "name": "down-left arrow", "shortname": ":arrow_lower_left:", "unicode": "2199", "html": "&#8601;", "category": "Symbols (arrow)", "order": "2007"},
+ {"emoji": "🎭", "name": "performing arts", "shortname": ":performing_arts:", "unicode": "1f3ad", "html": "&#127917;", "category": "Activities (arts & crafts)", "order": "1598"},
+ {"emoji": "👃đŸŋ", "name": "nose: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F443 1F3FF", "html": "&#128067;&#127999;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "👃🏾", "name": "nose: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F443 1F3FE", "html": "&#128067;&#127998;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "👃đŸŊ", "name": "nose: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F443 1F3FD", "html": "&#128067;&#127997;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "👃đŸŧ", "name": "nose: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F443 1F3FC", "html": "&#128067;&#127996;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "👃đŸģ", "name": "nose: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F443 1F3FB", "html": "&#128067;&#127995;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "👃", "name": "nose", "shortname": ":nose:", "unicode": "1f443", "html": "&#128067;", "category": "People & Body (body-parts)", "order": "1272"},
+ {"emoji": "đŸŊ", "name": "pig nose", "shortname": ":pig_nose:", "unicode": "1f43d", "html": "&#128061;", "category": "Animals & Nature (animal-mammal)", "order": "1367"},
+ {"emoji": "🐟", "name": "fish", "shortname": ":fish:", "unicode": "1f41f", "html": "&#128031;", "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": "&#128115;&#127999;&zwj;&#9792;", "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": "&#128115;&#127998;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘ŗđŸŊ‍♀", "name": "woman wearing turban: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F473 1F3FD 200D 2640", "html": "&#128115;&#127997;&zwj;&#9792;", "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": "&#128115;&#127996;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘ŗđŸģ‍♀", "name": "woman wearing turban: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F473 1F3FB 200D 2640", "html": "&#128115;&#127995;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘ŗâ€â™€", "name": "woman wearing turban", "shortname": ":woman_wearing_turban:", "unicode": "1F473 200D 2640", "html": "&#128115;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘ŗđŸŋ", "name": "person wearing turban: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F473 1F3FF", "html": "&#128115;&#127999;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘ŗđŸž", "name": "person wearing turban: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F473 1F3FE", "html": "&#128115;&#127998;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘ŗđŸŊ", "name": "person wearing turban: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F473 1F3FD", "html": "&#128115;&#127997;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘ŗđŸŧ", "name": "person wearing turban: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F473 1F3FC", "html": "&#128115;&#127996;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘ŗđŸģ", "name": "person wearing turban: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F473 1F3FB", "html": "&#128115;&#127995;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘ŗ", "name": "person wearing turban", "shortname": ":man_with_turban:", "unicode": "1f473", "html": "&#128115;", "category": "People & Body (person-role)", "order": "411"},
+ {"emoji": "🐨", "name": "koala", "shortname": ":koala:", "unicode": "1f428", "html": "&#128040;", "category": "Animals & Nature (animal-mammal)", "order": "1384"},
+ {"emoji": "👂đŸŋ", "name": "ear: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F442 1F3FF", "html": "&#128066;&#127999;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "👂🏾", "name": "ear: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F442 1F3FE", "html": "&#128066;&#127998;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "👂đŸŊ", "name": "ear: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F442 1F3FD", "html": "&#128066;&#127997;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "👂đŸŧ", "name": "ear: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F442 1F3FC", "html": "&#128066;&#127996;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "👂đŸģ", "name": "ear: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F442 1F3FB", "html": "&#128066;&#127995;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "👂", "name": "ear", "shortname": ":ear:", "unicode": "1f442", "html": "&#128066;", "category": "People & Body (body-parts)", "order": "1266"},
+ {"emoji": "âœŗī¸", "name": "eight-spoked asterisk", "shortname": ":eight_spoked_asterisk:", "unicode": "2733", "html": "&#10035;", "category": "Symbols (other-symbol)", "order": "2093"},
+ {"emoji": "🔹", "name": "small blue diamond", "shortname": ":small_blue_diamond:", "unicode": "1f539", "html": "&#128313;", "category": "Symbols (geometric)", "order": "2170"},
+ {"emoji": "đŸšŋ", "name": "shower", "shortname": ":shower:", "unicode": "1f6bf", "html": "&#128703;", "category": "Objects (household)", "order": "1672"},
+ {"emoji": "🐛", "name": "bug", "shortname": ":bug:", "unicode": "1f41b", "html": "&#128027;", "category": "Animals & Nature (animal-bug)", "order": "1420"},
+ {"emoji": "🍜", "name": "steaming bowl", "shortname": ":ramen:", "unicode": "1f35c", "html": "&#127836;", "category": "Food & Drink (food-asian)", "order": "1500"},
+ {"emoji": "🎩", "name": "top hat", "shortname": ":tophat:", "unicode": "1f3a9", "html": "&#127913;", "category": "Objects (clothing)", "order": "1335"},
+ {"emoji": "👰đŸŋ", "name": "bride with veil: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F470 1F3FF", "html": "&#128112;&#127999;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👰🏾", "name": "bride with veil: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F470 1F3FE", "html": "&#128112;&#127998;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👰đŸŊ", "name": "bride with veil: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F470 1F3FD", "html": "&#128112;&#127997;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👰đŸŧ", "name": "bride with veil: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F470 1F3FC", "html": "&#128112;&#127996;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👰đŸģ", "name": "bride with veil: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F470 1F3FB", "html": "&#128112;&#127995;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👰", "name": "bride with veil", "shortname": ":bride_with_veil:", "unicode": "1f470", "html": "&#128112;", "category": "People & Body (person-role)", "order": "471"},
+ {"emoji": "â›Ŋ", "name": "fuel pump", "shortname": ":fuelpump:", "unicode": "26fd", "html": "&#9981;", "category": "Travel & Places (transport-ground)", "order": "1636"},
+ {"emoji": "🏁", "name": "chequered flag", "shortname": ":checkered_flag:", "unicode": "1f3c1", "html": "&#127937;", "category": "Flags (flag)", "order": "2181"},
+ {"emoji": "🐴", "name": "horse face", "shortname": ":horse:", "unicode": "1f434", "html": "&#128052;", "category": "Animals & Nature (animal-mammal)", "order": "1356"},
+ {"emoji": "⌚", "name": "watch", "shortname": ":watch:", "unicode": "231a", "html": "&#8986;", "category": "Travel & Places (time)", "order": "1682"},
+ {"emoji": "đŸĩ", "name": "monkey face", "shortname": ":monkey_face:", "unicode": "1f435", "html": "&#128053;", "category": "Animals & Nature (animal-mammal)", "order": "1342"},
+ {"emoji": "đŸšŧ", "name": "baby symbol", "shortname": ":baby_symbol:", "unicode": "1f6bc", "html": "&#128700;", "category": "Symbols (transport-sign)", "order": "1983"},
+ {"emoji": "🆕", "name": "NEW button", "shortname": ":new:", "unicode": "1f195", "html": "&#127381;", "category": "Symbols (alphanum)", "order": "2134"},
+ {"emoji": "🆓", "name": "FREE button", "shortname": ":free:", "unicode": "1f193", "html": "&#127379;", "category": "Symbols (alphanum)", "order": "2130"},
+ {"emoji": "🎇", "name": "sparkler", "shortname": ":sparkler:", "unicode": "1f387", "html": "&#127879;", "category": "Activities (event)", "order": "1759"},
+ {"emoji": "đŸŒŊ", "name": "ear of corn", "shortname": ":corn:", "unicode": "1f33d", "html": "&#127805;", "category": "Food & Drink (food-vegetable)", "order": "1468"},
+ {"emoji": "🎾", "name": "tennis", "shortname": ":tennis:", "unicode": "1f3be", "html": "&#127934;", "category": "Activities (sport)", "order": "1787"},
+ {"emoji": "⏰", "name": "alarm clock", "shortname": ":alarm_clock:", "unicode": "23f0", "html": "&#9200;", "category": "Travel & Places (time)", "order": "1683"},
+ {"emoji": "🔋", "name": "battery", "shortname": ":battery:", "unicode": "1f50b", "html": "&#128267;", "category": "Objects (computer)", "order": "1844"},
+ {"emoji": "❕", "name": "white exclamation mark", "shortname": ":grey_exclamation:", "unicode": "2755", "html": "&#10069;", "category": "Symbols (other-symbol)", "order": "2100"},
+ {"emoji": "đŸē", "name": "wolf", "shortname": ":wolf:", "unicode": "1f43a", "html": "&#128058;", "category": "Animals & Nature (animal-mammal)", "order": "1348"},
+ {"emoji": "đŸ—ŋ", "name": "moai", "shortname": ":moyai:", "unicode": "1f5ff", "html": "&#128511;", "category": "Objects (other-object)", "order": "1972"},
+ {"emoji": "🐮", "name": "cow face", "shortname": ":cow:", "unicode": "1f42e", "html": "&#128046;", "category": "Animals & Nature (animal-mammal)", "order": "1360"},
+ {"emoji": "đŸ“Ŗ", "name": "megaphone", "shortname": ":mega:", "unicode": "1f4e3", "html": "&#128227;", "category": "Objects (sound)", "order": "1819"},
+ {"emoji": "👴đŸŋ", "name": "old man: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F474 1F3FF", "html": "&#128116;&#127999;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👴🏾", "name": "old man: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F474 1F3FE", "html": "&#128116;&#127998;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👴đŸŊ", "name": "old man: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F474 1F3FD", "html": "&#128116;&#127997;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👴đŸŧ", "name": "old man: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F474 1F3FC", "html": "&#128116;&#127996;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👴đŸģ", "name": "old man: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F474 1F3FB", "html": "&#128116;&#127995;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👴", "name": "old man", "shortname": ":older_man:", "unicode": "1f474", "html": "&#128116;", "category": "People & Body (person)", "order": "123"},
+ {"emoji": "👗", "name": "dress", "shortname": ":dress:", "unicode": "1f457", "html": "&#128087;", "category": "Objects (clothing)", "order": "1319"},
+ {"emoji": "🔗", "name": "link", "shortname": ":link:", "unicode": "1f517", "html": "&#128279;", "category": "Objects (tool)", "order": "1965"},
+ {"emoji": "🐔", "name": "chicken", "shortname": ":chicken:", "unicode": "1f414", "html": "&#128020;", "category": "Animals & Nature (animal-bird)", "order": "1388"},
+ {"emoji": "đŸŗ", "name": "cooking", "shortname": ":cooking:", "unicode": "1F373", "html": "&#127859;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "🐋", "name": "whale", "shortname": ":whale2:", "unicode": "1f40b", "html": "&#128011;", "category": "Animals & Nature (animal-marine)", "order": "1407"},
+ {"emoji": "↖", "name": "up-left arrow", "shortname": ":arrow_upper_left:", "unicode": "2196", "html": "&#8598;", "category": "Symbols (arrow)", "order": "2009"},
+ {"emoji": "đŸŒŗ", "name": "deciduous tree", "shortname": ":deciduous_tree:", "unicode": "1f333", "html": "&#127795;", "category": "Animals & Nature (plant-other)", "order": "1439"},
+ {"emoji": "🍱", "name": "bento box", "shortname": ":bento:", "unicode": "1f371", "html": "&#127857;", "category": "Food & Drink (food-asian)", "order": "1495"},
+ {"emoji": "📌", "name": "pushpin", "shortname": ":pushpin:", "unicode": "1f4cc", "html": "&#128204;", "category": "Objects (office)", "order": "1934"},
+ {"emoji": "🔜", "name": "SOON arrow", "shortname": ":soon:", "unicode": "1f51c", "html": "&#128284;", "category": "Symbols (arrow)", "order": "2021"},
+ {"emoji": "🔁", "name": "repeat button", "shortname": ":repeat:", "unicode": "1f501", "html": "&#128257;", "category": "Symbols (av-symbol)", "order": "2049"},
+ {"emoji": "🐉", "name": "dragon", "shortname": ":dragon:", "unicode": "1f409", "html": "&#128009;", "category": "Animals & Nature (animal-reptile)", "order": "1405"},
+ {"emoji": "🐹", "name": "hamster", "shortname": ":hamster:", "unicode": "1f439", "html": "&#128057;", "category": "Animals & Nature (animal-mammal)", "order": "1378"},
+ {"emoji": "â›ŗ", "name": "flag in hole", "shortname": ":golf:", "unicode": "26f3", "html": "&#9971;", "category": "Activities (sport)", "order": "1799"},
+ {"emoji": "🏄đŸŋ‍♀", "name": "woman surfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C4 1F3FF 200D 2640", "html": "&#127940;&#127999;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄🏾‍♀", "name": "woman surfing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C4 1F3FE 200D 2640", "html": "&#127940;&#127998;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄đŸŊ‍♀", "name": "woman surfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C4 1F3FD 200D 2640", "html": "&#127940;&#127997;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄đŸŧ‍♀", "name": "woman surfing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C4 1F3FC 200D 2640", "html": "&#127940;&#127996;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄đŸģ‍♀", "name": "woman surfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C4 1F3FB 200D 2640", "html": "&#127940;&#127995;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄‍♀", "name": "woman surfing", "shortname": ":woman_surfing:", "unicode": "1F3C4 200D 2640", "html": "&#127940;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄đŸŋ", "name": "person surfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C4 1F3FF", "html": "&#127940;&#127999;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄🏾", "name": "person surfing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C4 1F3FE", "html": "&#127940;&#127998;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄đŸŊ", "name": "person surfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C4 1F3FD", "html": "&#127940;&#127997;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄đŸŧ", "name": "person surfing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C4 1F3FC", "html": "&#127940;&#127996;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄đŸģ", "name": "person surfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C4 1F3FB", "html": "&#127940;&#127995;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄", "name": "person surfing", "shortname": ":surfer:", "unicode": "1f3c4", "html": "&#127940;", "category": "People & Body (person-sport)", "order": "800"},
+ {"emoji": "🐭", "name": "mouse face", "shortname": ":mouse:", "unicode": "1f42d", "html": "&#128045;", "category": "Animals & Nature (animal-mammal)", "order": "1375"},
+ {"emoji": "🌒", "name": "waxing crescent moon", "shortname": ":waxing_crescent_moon:", "unicode": "1f312", "html": "&#127762;", "category": "Travel & Places (sky & weather)", "order": "1712"},
+ {"emoji": "🚙", "name": "sport utility vehicle", "shortname": ":blue_car:", "unicode": "1f699", "html": "&#128665;", "category": "Travel & Places (transport-ground)", "order": "1626"},
+ {"emoji": "đŸ…°ī¸", "name": "A button (blood type)", "shortname": ":a:", "unicode": "1f170", "html": "&#127344;", "category": "Symbols (alphanum)", "order": "2125"},
+ {"emoji": "â‰ī¸", "name": "exclamation question mark", "shortname": ":interrobang:", "unicode": "2049", "html": "&#8265;", "category": "Symbols (other-symbol)", "order": "2097"},
+ {"emoji": "🈹", "name": "Japanese discount button", "shortname": ":u5272:", "unicode": "1f239", "html": "&#127545;", "category": "Symbols (alphanum)", "order": "2148"},
+ {"emoji": "🔌", "name": "electric plug", "shortname": ":electric_plug:", "unicode": "1f50c", "html": "&#128268;", "category": "Objects (computer)", "order": "1845"},
+ {"emoji": "🌓", "name": "first quarter moon", "shortname": ":first_quarter_moon:", "unicode": "1f313", "html": "&#127763;", "category": "Travel & Places (sky & weather)", "order": "1713"},
+ {"emoji": "♋", "name": "Cancer", "shortname": ":cancer:", "unicode": "264b", "html": "&#9803;", "category": "Symbols (zodiac)", "order": "2038"},
+ {"emoji": "🔱", "name": "trident emblem", "shortname": ":trident:", "unicode": "1f531", "html": "&#128305;", "category": "Symbols (other-symbol)", "order": "2076"},
+ {"emoji": "🍞", "name": "bread", "shortname": ":bread:", "unicode": "1f35e", "html": "&#127838;", "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": "&#128110;&#127999;&zwj;&#9792;", "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": "&#128110;&#127998;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👮đŸŊ‍♀", "name": "woman police officer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F46E 1F3FD 200D 2640", "html": "&#128110;&#127997;&zwj;&#9792;", "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": "&#128110;&#127996;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👮đŸģ‍♀", "name": "woman police officer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F46E 1F3FB 200D 2640", "html": "&#128110;&#127995;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👮‍♀", "name": "woman police officer", "shortname": ":woman_police_officer:", "unicode": "1F46E 200D 2640", "html": "&#128110;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👮đŸŋ", "name": "police officer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F46E 1F3FF", "html": "&#128110;&#127999;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👮🏾", "name": "police officer: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F46E 1F3FE", "html": "&#128110;&#127998;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👮đŸŊ", "name": "police officer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F46E 1F3FD", "html": "&#128110;&#127997;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👮đŸŧ", "name": "police officer: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F46E 1F3FC", "html": "&#128110;&#127996;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👮đŸģ", "name": "police officer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F46E 1F3FB", "html": "&#128110;&#127995;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👮", "name": "police officer", "shortname": ":cop:", "unicode": "1f46e", "html": "&#128110;", "category": "People & Body (person-role)", "order": "339"},
+ {"emoji": "đŸĩ", "name": "teacup without handle", "shortname": ":tea:", "unicode": "1f375", "html": "&#127861;", "category": "Food & Drink (drink)", "order": "1523"},
+ {"emoji": "đŸŽŖ", "name": "fishing pole", "shortname": ":fishing_pole_and_fish:", "unicode": "1f3a3", "html": "&#127907;", "category": "Activities (sport)", "order": "1801"},
+ {"emoji": "🌔", "name": "waxing gibbous moon", "shortname": ":waxing_gibbous_moon:", "unicode": "1F314", "html": "&#127764;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "🚲", "name": "bicycle", "shortname": ":bike:", "unicode": "1f6b2", "html": "&#128690;", "category": "Travel & Places (transport-ground)", "order": "1630"},
+ {"emoji": "👤", "name": "bust in silhouette", "shortname": ":bust_in_silhouette:", "unicode": "1F464", "html": "&#128100;", "category": "People & Body (person-symbol)", "order": ""},
+ {"emoji": "🍚", "name": "cooked rice", "shortname": ":rice:", "unicode": "1f35a", "html": "&#127834;", "category": "Food & Drink (food-asian)", "order": "1498"},
+ {"emoji": "đŸ“ģ", "name": "radio", "shortname": ":radio:", "unicode": "1f4fb", "html": "&#128251;", "category": "Objects (music)", "order": "1831"},
+ {"emoji": "🐤", "name": "baby chick", "shortname": ":baby_chick:", "unicode": "1f424", "html": "&#128036;", "category": "Animals & Nature (animal-bird)", "order": "1391"},
+ {"emoji": "â¤ĩī¸", "name": "right arrow curving down", "shortname": ":arrow_heading_down:", "unicode": "2935", "html": "&#10549;", "category": "Symbols (arrow)", "order": "2015"},
+ {"emoji": "🌘", "name": "waning crescent moon", "shortname": ":waning_crescent_moon:", "unicode": "1f318", "html": "&#127768;", "category": "Travel & Places (sky & weather)", "order": "1718"},
+ {"emoji": "↕", "name": "up-down arrow", "shortname": ":arrow_up_down:", "unicode": "2195", "html": "&#8597;", "category": "Symbols (arrow)", "order": "2010"},
+ {"emoji": "đŸ‡Ē", "name": "", "shortname": "", "unicode": "", "html": "&#127466;", "category": "", "order": ""},
+ {"emoji": "🌗", "name": "last quarter moon", "shortname": ":last_quarter_moon:", "unicode": "1f317", "html": "&#127767;", "category": "Travel & Places (sky & weather)", "order": "1717"},
+ {"emoji": "🔘", "name": "radio button", "shortname": ":radio_button:", "unicode": "1f518", "html": "&#128280;", "category": "Symbols (geometric)", "order": "2174"},
+ {"emoji": "🐑", "name": "ewe", "shortname": ":sheep:", "unicode": "1f411", "html": "&#128017;", "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": "&#128113;&#127999;&zwj;&#9792;", "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": "&#128113;&#127998;&zwj;&#9792;", "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": "&#128113;&#127997;&zwj;&#9792;", "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": "&#128113;&#127996;&zwj;&#9792;", "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": "&#128113;&#127995;&zwj;&#9792;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👱‍♀", "name": "woman: blond hair", "shortname": ":blond_hair:", "unicode": "1F471 200D 2640", "html": "&#128113;&zwj;&#9792;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👱đŸŋ", "name": "person: dark skin tone, blond hair", "shortname": ":dark_skin_tone_blond_hair:", "unicode": "1F471 1F3FF", "html": "&#128113;&#127999;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👱🏾", "name": "person: medium-dark skin tone, blond hair", "shortname": ":mediumdark_skin_tone_blond_hair:", "unicode": "1F471 1F3FE", "html": "&#128113;&#127998;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👱đŸŊ", "name": "person: medium skin tone, blond hair", "shortname": ":medium_skin_tone_blond_hair:", "unicode": "1F471 1F3FD", "html": "&#128113;&#127997;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👱đŸŧ", "name": "person: medium-light skin tone, blond hair", "shortname": ":mediumlight_skin_tone_blond_hair:", "unicode": "1F471 1F3FC", "html": "&#128113;&#127996;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👱đŸģ", "name": "person: light skin tone, blond hair", "shortname": ":light_skin_tone_blond_hair:", "unicode": "1F471 1F3FB", "html": "&#128113;&#127995;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👱", "name": "person: blond hair", "shortname": ":person_with_blond_hair:", "unicode": "1f471", "html": "&#128113;", "category": "People & Body (person)", "order": "429"},
+ {"emoji": "🌖", "name": "waning gibbous moon", "shortname": ":waning_gibbous_moon:", "unicode": "1f316", "html": "&#127766;", "category": "Travel & Places (sky & weather)", "order": "1716"},
+ {"emoji": "🔒", "name": "locked", "shortname": ":lock:", "unicode": "1f512", "html": "&#128274;", "category": "Objects (lock)", "order": "1944"},
+ {"emoji": "🍏", "name": "green apple", "shortname": ":green_apple:", "unicode": "1f34f", "html": "&#127823;", "category": "Food & Drink (food-fruit)", "order": "1457"},
+ {"emoji": "đŸ‘ē", "name": "goblin", "shortname": ":japanese_goblin:", "unicode": "1f47a", "html": "&#128122;", "category": "Smileys & Emotion (face-costume)", "order": "79"},
+ {"emoji": "➰", "name": "curly loop", "shortname": ":curly_loop:", "unicode": "27b0", "html": "&#10160;", "category": "Symbols (other-symbol)", "order": "2090"},
+ {"emoji": "🚩", "name": "triangular flag", "shortname": ":triangular_flag_on_post:", "unicode": "1f6a9", "html": "&#128681;", "category": "Flags (flag)", "order": "2182"},
+ {"emoji": "🔄", "name": "counterclockwise arrows button", "shortname": ":arrows_counterclockwise:", "unicode": "1f504", "html": "&#128260;", "category": "Symbols (arrow)", "order": "2017"},
+ {"emoji": "🐎", "name": "horse", "shortname": ":racehorse:", "unicode": "1f40e", "html": "&#128014;", "category": "Animals & Nature (animal-mammal)", "order": "1357"},
+ {"emoji": "🍤", "name": "fried shrimp", "shortname": ":fried_shrimp:", "unicode": "1f364", "html": "&#127844;", "category": "Food & Drink (food-asian)", "order": "1505"},
+ {"emoji": "🌄", "name": "sunrise over mountains", "shortname": ":sunrise_over_mountains:", "unicode": "1f304", "html": "&#127748;", "category": "Travel & Places (place-other)", "order": "1586"},
+ {"emoji": "🌋", "name": "volcano", "shortname": ":volcano:", "unicode": "1f30b", "html": "&#127755;", "category": "Travel & Places (place-geographic)", "order": "1546"},
+ {"emoji": "🐓", "name": "rooster", "shortname": ":rooster:", "unicode": "1f413", "html": "&#128019;", "category": "Animals & Nature (animal-bird)", "order": "1389"},
+ {"emoji": "đŸ“Ĩ", "name": "inbox tray", "shortname": ":inbox_tray:", "unicode": "1f4e5", "html": "&#128229;", "category": "Objects (mail)", "order": "1906"},
+ {"emoji": "💒", "name": "wedding", "shortname": ":wedding:", "unicode": "1f492", "html": "&#128146;", "category": "Travel & Places (place-building)", "order": "1574"},
+ {"emoji": "đŸŖ", "name": "sushi", "shortname": ":sushi:", "unicode": "1f363", "html": "&#127843;", "category": "Food & Drink (food-asian)", "order": "1504"},
+ {"emoji": "〰", "name": "wavy dash", "shortname": ":wavy_dash:", "unicode": "3030", "html": "&#12336;", "category": "Symbols (other-symbol)", "order": "2102"},
+ {"emoji": "🍨", "name": "ice cream", "shortname": ":ice_cream:", "unicode": "1f368", "html": "&#127848;", "category": "Food & Drink (food-sweet)", "order": "1510"},
+ {"emoji": "âĒ", "name": "fast reverse button", "shortname": ":rewind:", "unicode": "23ea", "html": "&#9194;", "category": "Symbols (av-symbol)", "order": "2056"},
+ {"emoji": "🍅", "name": "tomato", "shortname": ":tomato:", "unicode": "1f345", "html": "&#127813;", "category": "Food & Drink (food-fruit)", "order": "1463"},
+ {"emoji": "🐇", "name": "rabbit", "shortname": ":rabbit2:", "unicode": "1f407", "html": "&#128007;", "category": "Animals & Nature (animal-mammal)", "order": "1380"},
+ {"emoji": "âœ´ī¸", "name": "eight-pointed star", "shortname": ":eight_pointed_black_star:", "unicode": "2734", "html": "&#10036;", "category": "Symbols (other-symbol)", "order": "2094"},
+ {"emoji": "đŸ”ē", "name": "red triangle pointed up", "shortname": ":small_red_triangle:", "unicode": "1f53a", "html": "&#128314;", "category": "Symbols (geometric)", "order": "2171"},
+ {"emoji": "🔆", "name": "bright button", "shortname": ":high_brightness:", "unicode": "1f506", "html": "&#128262;", "category": "Symbols (av-symbol)", "order": "2068"},
+ {"emoji": "➕", "name": "plus sign", "shortname": ":heavy_plus_sign:", "unicode": "2795", "html": "&#10133;", "category": "Symbols (other-symbol)", "order": "2084"},
+ {"emoji": "👲đŸŋ", "name": "man with skullcap: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F472 1F3FF", "html": "&#128114;&#127999;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👲🏾", "name": "man with skullcap: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F472 1F3FE", "html": "&#128114;&#127998;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👲đŸŊ", "name": "man with skullcap: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F472 1F3FD", "html": "&#128114;&#127997;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👲đŸŧ", "name": "man with skullcap: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F472 1F3FC", "html": "&#128114;&#127996;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👲đŸģ", "name": "man with skullcap: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F472 1F3FB", "html": "&#128114;&#127995;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👲", "name": "man with skullcap", "shortname": ":man_with_gua_pi_mao:", "unicode": "1f472", "html": "&#128114;", "category": "People & Body (person-role)", "order": "489"},
+ {"emoji": "đŸĒ", "name": "convenience store", "shortname": ":convenience_store:", "unicode": "1f3ea", "html": "&#127978;", "category": "Travel & Places (place-building)", "order": "1568"},
+ {"emoji": "đŸ‘Ĩ", "name": "busts in silhouette", "shortname": ":busts_in_silhouette:", "unicode": "1f465", "html": "&#128101;", "category": "People & Body (person-symbol)", "order": "767"},
+ {"emoji": "🐞", "name": "lady beetle", "shortname": ":beetle:", "unicode": "1f41e", "html": "&#128030;", "category": "Animals & Nature (animal-bug)", "order": "1423"},
+ {"emoji": "đŸ”ģ", "name": "red triangle pointed down", "shortname": ":small_red_triangle_down:", "unicode": "1f53b", "html": "&#128315;", "category": "Symbols (geometric)", "order": "2172"},
+ {"emoji": "🇩đŸ‡Ē", "name": "flag: Germany", "shortname": ":ger:", "unicode": "1F1E9 1F1EA", "html": "&#127465;", "category": "Flags (country-flag)", "order": ""},
+ {"emoji": "â¤´ī¸", "name": "right arrow curving up", "shortname": ":arrow_heading_up:", "unicode": "2934", "html": "&#10548;", "category": "Symbols (arrow)", "order": "2014"},
+ {"emoji": "📛", "name": "name badge", "shortname": ":name_badge:", "unicode": "1f4db", "html": "&#128219;", "category": "Symbols (other-symbol)", "order": "2073"},
+ {"emoji": "🛀đŸŋ", "name": "person taking bath: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6C0 1F3FF", "html": "&#128704;&#127999;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "🛀🏾", "name": "person taking bath: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6C0 1F3FE", "html": "&#128704;&#127998;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "🛀đŸŊ", "name": "person taking bath: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6C0 1F3FD", "html": "&#128704;&#127997;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "🛀đŸŧ", "name": "person taking bath: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6C0 1F3FC", "html": "&#128704;&#127996;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "🛀đŸģ", "name": "person taking bath: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6C0 1F3FB", "html": "&#128704;&#127995;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "🛀", "name": "person taking bath", "shortname": ":bath:", "unicode": "1f6c0", "html": "&#128704;", "category": "People & Body (person-resting)", "order": "1673"},
+ {"emoji": "⛔", "name": "no entry", "shortname": ":no_entry:", "unicode": "26d4", "html": "&#9940;", "category": "Symbols (warning)", "order": "1991"},
+ {"emoji": "🐊", "name": "crocodile", "shortname": ":crocodile:", "unicode": "1f40a", "html": "&#128010;", "category": "Animals & Nature (animal-reptile)", "order": "1400"},
+ {"emoji": "🌰", "name": "chestnut", "shortname": ":chestnut:", "unicode": "1F330", "html": "&#127792;", "category": "Food & Drink (food-vegetable)", "order": ""},
+ {"emoji": "🐕", "name": "dog", "shortname": ":dog2:", "unicode": "1f415", "html": "&#128021;", "category": "Animals & Nature (animal-mammal)", "order": "1346"},
+ {"emoji": "🐈", "name": "cat", "shortname": ":cat2:", "unicode": "1f408", "html": "&#128008;", "category": "Animals & Nature (animal-mammal)", "order": "1351"},
+ {"emoji": "🔨", "name": "hammer", "shortname": ":hammer:", "unicode": "1f528", "html": "&#128296;", "category": "Objects (tool)", "order": "1950"},
+ {"emoji": "🍖", "name": "meat on bone", "shortname": ":meat_on_bone:", "unicode": "1f356", "html": "&#127830;", "category": "Food & Drink (food-prepared)", "order": "1479"},
+ {"emoji": "🐚", "name": "spiral shell", "shortname": ":shell:", "unicode": "1f41a", "html": "&#128026;", "category": "Animals & Nature (animal-marine)", "order": "1414"},
+ {"emoji": "â‡ī¸", "name": "sparkle", "shortname": ":sparkle:", "unicode": "2747", "html": "&#10055;", "category": "Symbols (other-symbol)", "order": "2095"},
+ {"emoji": "â›ĩ", "name": "sailboat", "shortname": ":sailboat:", "unicode": "26F5", "html": "&#9973;", "category": "Travel & Places (transport-water)", "order": ""},
+ {"emoji": "đŸ…ąī¸", "name": "B button (blood type)", "shortname": ":b:", "unicode": "1f171", "html": "&#127345;", "category": "Symbols (alphanum)", "order": "2127"},
+ {"emoji": "â“‚ī¸", "name": "circled M", "shortname": ":m:", "unicode": "24c2", "html": "&#9410;", "category": "Symbols (alphanum)", "order": "2133"},
+ {"emoji": "🐩", "name": "poodle", "shortname": ":poodle:", "unicode": "1f429", "html": "&#128041;", "category": "Animals & Nature (animal-mammal)", "order": "1347"},
+ {"emoji": "♒", "name": "Aquarius", "shortname": ":aquarius:", "unicode": "2652", "html": "&#9810;", "category": "Symbols (zodiac)", "order": "2045"},
+ {"emoji": "🍲", "name": "pot of food", "shortname": ":stew:", "unicode": "1f372", "html": "&#127858;", "category": "Food & Drink (food-prepared)", "order": "1492"},
+ {"emoji": "👖", "name": "jeans", "shortname": ":jeans:", "unicode": "1f456", "html": "&#128086;", "category": "Objects (clothing)", "order": "1318"},
+ {"emoji": "đŸ¯", "name": "honey pot", "shortname": ":honey_pot:", "unicode": "1f36f", "html": "&#127855;", "category": "Food & Drink (food-sweet)", "order": "1519"},
+ {"emoji": "🎹", "name": "musical keyboard", "shortname": ":musical_keyboard:", "unicode": "1f3b9", "html": "&#127929;", "category": "Objects (musical-instrument)", "order": "1834"},
+ {"emoji": "🔓", "name": "unlocked", "shortname": ":unlock:", "unicode": "1f513", "html": "&#128275;", "category": "Objects (lock)", "order": "1945"},
+ {"emoji": "✒", "name": "black nib", "shortname": ":black_nib:", "unicode": "2712", "html": "&#10002;", "category": "Objects (writing)", "order": "1915"},
+ {"emoji": "đŸ—Ŋ", "name": "Statue of Liberty", "shortname": ":statue_of_liberty:", "unicode": "1f5fd", "html": "&#128509;", "category": "Travel & Places (place-building)", "order": "1576"},
+ {"emoji": "💲", "name": "heavy dollar sign", "shortname": ":heavy_dollar_sign:", "unicode": "1f4b2", "html": "&#128178;", "category": "Objects (money)", "order": "1900"},
+ {"emoji": "🏂", "name": "snowboarder", "shortname": ":snowboarder:", "unicode": "1f3c2", "html": "&#127938;", "category": "People & Body (person-sport)", "order": "776"},
+ {"emoji": "💮", "name": "white flower", "shortname": ":white_flower:", "unicode": "1f4ae", "html": "&#128174;", "category": "Animals & Nature (plant-flower)", "order": "1429"},
+ {"emoji": "👔", "name": "necktie", "shortname": ":necktie:", "unicode": "1f454", "html": "&#128084;", "category": "Objects (clothing)", "order": "1316"},
+ {"emoji": "💠", "name": "diamond with a dot", "shortname": ":diamond_shape_with_a_dot_inside:", "unicode": "1f4a0", "html": "&#128160;", "category": "Symbols (geometric)", "order": "2173"},
+ {"emoji": "♈", "name": "Aries", "shortname": ":aries:", "unicode": "2648", "html": "&#9800;", "category": "Symbols (zodiac)", "order": "2035"},
+ {"emoji": "đŸšē", "name": "women’s room", "shortname": ":womens:", "unicode": "1f6ba", "html": "&#128698;", "category": "Symbols (transport-sign)", "order": "1981"},
+ {"emoji": "🐜", "name": "ant", "shortname": ":ant:", "unicode": "1f41c", "html": "&#128028;", "category": "Animals & Nature (animal-bug)", "order": "1421"},
+ {"emoji": "♏", "name": "Scorpio", "shortname": ":scorpius:", "unicode": "264f", "html": "&#9807;", "category": "Symbols (zodiac)", "order": "2042"},
+ {"emoji": "🌇", "name": "sunset", "shortname": ":city_sunset:", "unicode": "1f307", "html": "&#127751;", "category": "Travel & Places (place-other)", "order": "1589"},
+ {"emoji": "âŗ", "name": "hourglass not done", "shortname": ":hourglass_flowing_sand:", "unicode": "23f3", "html": "&#9203;", "category": "Travel & Places (time)", "order": "1681"},
+ {"emoji": "đŸ…žī¸", "name": "O button (blood type)", "shortname": ":o2:", "unicode": "1f17e", "html": "&#127358;", "category": "Symbols (alphanum)", "order": "2136"},
+ {"emoji": "🐲", "name": "dragon face", "shortname": ":dragon_face:", "unicode": "1f432", "html": "&#128050;", "category": "Animals & Nature (animal-reptile)", "order": "1404"},
+ {"emoji": "🐌", "name": "snail", "shortname": ":snail:", "unicode": "1f40c", "html": "&#128012;", "category": "Animals & Nature (animal-bug)", "order": "1419"},
+ {"emoji": "📀", "name": "dvd", "shortname": ":dvd:", "unicode": "1f4c0", "html": "&#128192;", "category": "Objects (computer)", "order": "1855"},
+ {"emoji": "👕", "name": "t-shirt", "shortname": ":shirt:", "unicode": "1f455", "html": "&#128085;", "category": "Objects (clothing)", "order": "1317"},
+ {"emoji": "🎲", "name": "game die", "shortname": ":game_die:", "unicode": "1f3b2", "html": "&#127922;", "category": "Activities (game)", "order": "1806"},
+ {"emoji": "➖", "name": "minus sign", "shortname": ":heavy_minus_sign:", "unicode": "2796", "html": "&#10134;", "category": "Symbols (other-symbol)", "order": "2088"},
+ {"emoji": "🎎", "name": "Japanese dolls", "shortname": ":dolls:", "unicode": "1f38e", "html": "&#127886;", "category": "Activities (event)", "order": "1766"},
+ {"emoji": "♐", "name": "Sagittarius", "shortname": ":sagittarius:", "unicode": "2650", "html": "&#9808;", "category": "Symbols (zodiac)", "order": "2043"},
+ {"emoji": "🎱", "name": "pool 8 ball", "shortname": ":8ball:", "unicode": "1f3b1", "html": "&#127921;", "category": "Activities (game)", "order": "1788"},
+ {"emoji": "🚌", "name": "bus", "shortname": ":bus:", "unicode": "1f68c", "html": "&#128652;", "category": "Travel & Places (transport-ground)", "order": "1614"},
+ {"emoji": "🍮", "name": "custard", "shortname": ":custard:", "unicode": "1f36e", "html": "&#127854;", "category": "Food & Drink (food-sweet)", "order": "1518"},
+ {"emoji": "🎌", "name": "crossed flags", "shortname": ":crossed_flags:", "unicode": "1f38c", "html": "&#127884;", "category": "Flags (flag)", "order": "2183"},
+ {"emoji": "ã€Ŋī¸", "name": "part alternation mark", "shortname": ":part_alternation_mark:", "unicode": "303d", "html": "&#12349;", "category": "Symbols (other-symbol)", "order": "2092"},
+ {"emoji": "đŸĢ", "name": "two-hump camel", "shortname": ":camel:", "unicode": "1f42b", "html": "&#128043;", "category": "Animals & Nature (animal-mammal)", "order": "1372"},
+ {"emoji": "🍛", "name": "curry rice", "shortname": ":curry:", "unicode": "1f35b", "html": "&#127835;", "category": "Food & Drink (food-asian)", "order": "1499"},
+ {"emoji": "🚂", "name": "locomotive", "shortname": ":steam_locomotive:", "unicode": "1f682", "html": "&#128642;", "category": "Travel & Places (transport-ground)", "order": "1602"},
+ {"emoji": "đŸĨ", "name": "hospital", "shortname": ":hospital:", "unicode": "1f3e5", "html": "&#127973;", "category": "Travel & Places (place-building)", "order": "1564"},
+ {"emoji": "đŸ‡¯đŸ‡ĩ", "name": "flag: Japan", "shortname": ":jp:", "unicode": "1F1EF 1F1F5", "html": "&#127471;", "category": "Flags (country-flag)", "order": ""},
+ {"emoji": "🔷", "name": "large blue diamond", "shortname": ":large_blue_diamond:", "unicode": "1f537", "html": "&#128311;", "category": "Symbols (geometric)", "order": "2168"},
+ {"emoji": "🎋", "name": "tanabata tree", "shortname": ":tanabata_tree:", "unicode": "1f38b", "html": "&#127883;", "category": "Activities (event)", "order": "1764"},
+ {"emoji": "🔔", "name": "bell", "shortname": ":bell:", "unicode": "1f514", "html": "&#128276;", "category": "Objects (sound)", "order": "1821"},
+ {"emoji": "♌", "name": "Leo", "shortname": ":leo:", "unicode": "264c", "html": "&#9804;", "category": "Symbols (zodiac)", "order": "2039"},
+ {"emoji": "♊", "name": "Gemini", "shortname": ":gemini:", "unicode": "264a", "html": "&#9802;", "category": "Symbols (zodiac)", "order": "2037"},
+ {"emoji": "🍐", "name": "pear", "shortname": ":pear:", "unicode": "1f350", "html": "&#127824;", "category": "Food & Drink (food-fruit)", "order": "1458"},
+ {"emoji": "đŸ”ļ", "name": "large orange diamond", "shortname": ":large_orange_diamond:", "unicode": "1f536", "html": "&#128310;", "category": "Symbols (geometric)", "order": "2167"},
+ {"emoji": "♉", "name": "Taurus", "shortname": ":taurus:", "unicode": "2649", "html": "&#9801;", "category": "Symbols (zodiac)", "order": "2036"},
+ {"emoji": "🌐", "name": "globe with meridians", "shortname": ":globe_with_meridians:", "unicode": "1f310", "html": "&#127760;", "category": "Travel & Places (place-map)", "order": "1541"},
+ {"emoji": "đŸšĒ", "name": "door", "shortname": ":door:", "unicode": "1f6aa", "html": "&#128682;", "category": "Objects (household)", "order": "1662"},
+ {"emoji": "🕕", "name": "six o’clock", "shortname": ":clock6:", "unicode": "1f555", "html": "&#128341;", "category": "Travel & Places (time)", "order": "1699"},
+ {"emoji": "🚔", "name": "oncoming police car", "shortname": ":oncoming_police_car:", "unicode": "1f694", "html": "&#128660;", "category": "Travel & Places (transport-ground)", "order": "1621"},
+ {"emoji": "📩", "name": "envelope with arrow", "shortname": ":envelope_with_arrow:", "unicode": "1f4e9", "html": "&#128233;", "category": "Objects (mail)", "order": "1904"},
+ {"emoji": "🌂", "name": "closed umbrella", "shortname": ":closed_umbrella:", "unicode": "1f302", "html": "&#127746;", "category": "Travel & Places (sky & weather)", "order": "1744"},
+ {"emoji": "🎷", "name": "saxophone", "shortname": ":saxophone:", "unicode": "1f3b7", "html": "&#127927;", "category": "Objects (musical-instrument)", "order": "1832"},
+ {"emoji": "â›Ē", "name": "church", "shortname": ":church:", "unicode": "26ea", "html": "&#9962;", "category": "Travel & Places (place-religious)", "order": "1577"},
+ {"emoji": "🚴đŸŋ‍♀", "name": "woman biking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B4 1F3FF 200D 2640", "html": "&#128692;&#127999;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴🏾‍♀", "name": "woman biking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B4 1F3FE 200D 2640", "html": "&#128692;&#127998;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴đŸŊ‍♀", "name": "woman biking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B4 1F3FD 200D 2640", "html": "&#128692;&#127997;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴đŸŧ‍♀", "name": "woman biking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B4 1F3FC 200D 2640", "html": "&#128692;&#127996;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴đŸģ‍♀", "name": "woman biking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B4 1F3FB 200D 2640", "html": "&#128692;&#127995;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴‍♀", "name": "woman biking", "shortname": ":woman_biking:", "unicode": "1F6B4 200D 2640", "html": "&#128692;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴đŸŋ", "name": "person biking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B4 1F3FF", "html": "&#128692;&#127999;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴🏾", "name": "person biking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B4 1F3FE", "html": "&#128692;&#127998;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴đŸŊ", "name": "person biking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B4 1F3FD", "html": "&#128692;&#127997;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴đŸŧ", "name": "person biking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B4 1F3FC", "html": "&#128692;&#127996;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴đŸģ", "name": "person biking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B4 1F3FB", "html": "&#128692;&#127995;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴", "name": "person biking", "shortname": ":bicyclist:", "unicode": "1f6b4", "html": "&#128692;", "category": "People & Body (person-sport)", "order": "890"},
+ {"emoji": "♓", "name": "Pisces", "shortname": ":pisces:", "unicode": "2653", "html": "&#9811;", "category": "Symbols (zodiac)", "order": "2046"},
+ {"emoji": "🍡", "name": "dango", "shortname": ":dango:", "unicode": "1f361", "html": "&#127841;", "category": "Food & Drink (food-asian)", "order": "1507"},
+ {"emoji": "♑", "name": "Capricorn", "shortname": ":capricorn:", "unicode": "2651", "html": "&#9809;", "category": "Symbols (zodiac)", "order": "2044"},
+ {"emoji": "đŸĸ", "name": "office building", "shortname": ":office:", "unicode": "1f3e2", "html": "&#127970;", "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": "&#128675;&#127999;&zwj;&#9792;", "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": "&#128675;&#127998;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšŖđŸŊ‍♀", "name": "woman rowing boat: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6A3 1F3FD 200D 2640", "html": "&#128675;&#127997;&zwj;&#9792;", "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": "&#128675;&#127996;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšŖđŸģ‍♀", "name": "woman rowing boat: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6A3 1F3FB 200D 2640", "html": "&#128675;&#127995;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšŖâ€â™€", "name": "woman rowing boat", "shortname": ":woman_rowing_boat:", "unicode": "1F6A3 200D 2640", "html": "&#128675;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšŖđŸŋ", "name": "person rowing boat: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6A3 1F3FF", "html": "&#128675;&#127999;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšŖđŸž", "name": "person rowing boat: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6A3 1F3FE", "html": "&#128675;&#127998;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšŖđŸŊ", "name": "person rowing boat: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6A3 1F3FD", "html": "&#128675;&#127997;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšŖđŸŧ", "name": "person rowing boat: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6A3 1F3FC", "html": "&#128675;&#127996;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšŖđŸģ", "name": "person rowing boat: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6A3 1F3FB", "html": "&#128675;&#127995;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšŖ", "name": "person rowing boat", "shortname": ":rowboat:", "unicode": "1f6a3", "html": "&#128675;", "category": "People & Body (person-sport)", "order": "818"},
+ {"emoji": "👒", "name": "woman’s hat", "shortname": ":womans_hat:", "unicode": "1f452", "html": "&#128082;", "category": "Objects (clothing)", "order": "1334"},
+ {"emoji": "👞", "name": "man’s shoe", "shortname": ":mans_shoe:", "unicode": "1f45e", "html": "&#128094;", "category": "Objects (clothing)", "order": "1328"},
+ {"emoji": "🏩", "name": "love hotel", "shortname": ":love_hotel:", "unicode": "1f3e9", "html": "&#127977;", "category": "Travel & Places (place-building)", "order": "1567"},
+ {"emoji": "đŸ—ģ", "name": "mount fuji", "shortname": ":mount_fuji:", "unicode": "1f5fb", "html": "&#128507;", "category": "Travel & Places (place-geographic)", "order": "1547"},
+ {"emoji": "đŸĒ", "name": "camel", "shortname": ":dromedary_camel:", "unicode": "1f42a", "html": "&#128042;", "category": "Animals & Nature (animal-mammal)", "order": "1371"},
+ {"emoji": "👜", "name": "handbag", "shortname": ":handbag:", "unicode": "1f45c", "html": "&#128092;", "category": "Objects (clothing)", "order": "1324"},
+ {"emoji": "⌛", "name": "hourglass done", "shortname": ":hourglass:", "unicode": "231b", "html": "&#8987;", "category": "Travel & Places (time)", "order": "1680"},
+ {"emoji": "❎", "name": "cross mark button", "shortname": ":negative_squared_cross_mark:", "unicode": "274e", "html": "&#10062;", "category": "Symbols (other-symbol)", "order": "2083"},
+ {"emoji": "đŸŽē", "name": "trumpet", "shortname": ":trumpet:", "unicode": "1f3ba", "html": "&#127930;", "category": "Objects (musical-instrument)", "order": "1835"},
+ {"emoji": "đŸĢ", "name": "school", "shortname": ":school:", "unicode": "1f3eb", "html": "&#127979;", "category": "Travel & Places (place-building)", "order": "1569"},
+ {"emoji": "🐄", "name": "cow", "shortname": ":cow2:", "unicode": "1f404", "html": "&#128004;", "category": "Animals & Nature (animal-mammal)", "order": "1363"},
+ {"emoji": "🌆", "name": "cityscape at dusk", "shortname": ":cityscape_at_dusk:", "unicode": "1F306", "html": "&#127750;", "category": "Travel & Places (place-other)", "order": ""},
+ {"emoji": "👷đŸŋ‍♀", "name": "woman construction worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F477 1F3FF 200D 2640", "html": "&#128119;&#127999;&zwj;&#9792;", "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": "&#128119;&#127998;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👷đŸŊ‍♀", "name": "woman construction worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F477 1F3FD 200D 2640", "html": "&#128119;&#127997;&zwj;&#9792;", "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": "&#128119;&#127996;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👷đŸģ‍♀", "name": "woman construction worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F477 1F3FB 200D 2640", "html": "&#128119;&#127995;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👷‍♀", "name": "woman construction worker", "shortname": ":woman_construction_worker:", "unicode": "1F477 200D 2640", "html": "&#128119;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👷đŸŋ", "name": "construction worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F477 1F3FF", "html": "&#128119;&#127999;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👷🏾", "name": "construction worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F477 1F3FE", "html": "&#128119;&#127998;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👷đŸŊ", "name": "construction worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F477 1F3FD", "html": "&#128119;&#127997;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👷đŸŧ", "name": "construction worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F477 1F3FC", "html": "&#128119;&#127996;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👷đŸģ", "name": "construction worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F477 1F3FB", "html": "&#128119;&#127995;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👷", "name": "construction worker", "shortname": ":construction_worker:", "unicode": "1f477", "html": "&#128119;", "category": "People & Body (person-role)", "order": "393"},
+ {"emoji": "đŸšŊ", "name": "toilet", "shortname": ":toilet:", "unicode": "1f6bd", "html": "&#128701;", "category": "Objects (household)", "order": "1671"},
+ {"emoji": "🐖", "name": "pig", "shortname": ":pig2:", "unicode": "1f416", "html": "&#128022;", "category": "Animals & Nature (animal-mammal)", "order": "1365"},
+ {"emoji": "❔", "name": "white question mark", "shortname": ":grey_question:", "unicode": "2754", "html": "&#10068;", "category": "Symbols (other-symbol)", "order": "2099"},
+ {"emoji": "🔰", "name": "Japanese symbol for beginner", "shortname": ":beginner:", "unicode": "1f530", "html": "&#128304;", "category": "Symbols (other-symbol)", "order": "2075"},
+ {"emoji": "đŸŽģ", "name": "violin", "shortname": ":violin:", "unicode": "1f3bb", "html": "&#127931;", "category": "Objects (musical-instrument)", "order": "1836"},
+ {"emoji": "🔛", "name": "ON! arrow", "shortname": ":on:", "unicode": "1f51b", "html": "&#128283;", "category": "Symbols (arrow)", "order": "2020"},
+ {"emoji": "đŸ’ŗ", "name": "credit card", "shortname": ":credit_card:", "unicode": "1f4b3", "html": "&#128179;", "category": "Objects (money)", "order": "1897"},
+ {"emoji": "🆔", "name": "ID button", "shortname": ":id:", "unicode": "1f194", "html": "&#127380;", "category": "Symbols (alphanum)", "order": "2132"},
+ {"emoji": "㊙", "name": "Japanese secret button", "shortname": ":secret:", "unicode": "3299", "html": "&#12953;", "category": "Symbols (alphanum)", "order": "2156"},
+ {"emoji": "🎡", "name": "ferris wheel", "shortname": ":ferris_wheel:", "unicode": "1f3a1", "html": "&#127905;", "category": "Travel & Places (place-other)", "order": "1594"},
+ {"emoji": "đŸŽŗ", "name": "bowling", "shortname": ":bowling:", "unicode": "1f3b3", "html": "&#127923;", "category": "Activities (sport)", "order": "1789"},
+ {"emoji": "♎", "name": "Libra", "shortname": ":libra:", "unicode": "264e", "html": "&#9806;", "category": "Symbols (zodiac)", "order": "2041"},
+ {"emoji": "♍", "name": "Virgo", "shortname": ":virgo:", "unicode": "264d", "html": "&#9805;", "category": "Symbols (zodiac)", "order": "2040"},
+ {"emoji": "💈", "name": "barber pole", "shortname": ":barber:", "unicode": "1f488", "html": "&#128136;", "category": "Travel & Places (place-other)", "order": "1596"},
+ {"emoji": "👛", "name": "purse", "shortname": ":purse:", "unicode": "1f45b", "html": "&#128091;", "category": "Objects (clothing)", "order": "1323"},
+ {"emoji": "đŸŽĸ", "name": "roller coaster", "shortname": ":roller_coaster:", "unicode": "1f3a2", "html": "&#127906;", "category": "Travel & Places (place-other)", "order": "1595"},
+ {"emoji": "🐀", "name": "rat", "shortname": ":rat:", "unicode": "1f400", "html": "&#128000;", "category": "Animals & Nature (animal-mammal)", "order": "1377"},
+ {"emoji": "📅", "name": "calendar", "shortname": ":date:", "unicode": "1f4c5", "html": "&#128197;", "category": "Objects (office)", "order": "1925"},
+ {"emoji": "🏉", "name": "rugby football", "shortname": ":rugby_football:", "unicode": "1f3c9", "html": "&#127945;", "category": "Activities (sport)", "order": "1786"},
+ {"emoji": "🐏", "name": "ram", "shortname": ":ram:", "unicode": "1f40f", "html": "&#128015;", "category": "Animals & Nature (animal-mammal)", "order": "1368"},
+ {"emoji": "đŸ”ŧ", "name": "upwards button", "shortname": ":arrow_up_small:", "unicode": "1f53c", "html": "&#128316;", "category": "Symbols (av-symbol)", "order": "2058"},
+ {"emoji": "🔲", "name": "black square button", "shortname": ":black_square_button:", "unicode": "1f532", "html": "&#128306;", "category": "Symbols (geometric)", "order": "2175"},
+ {"emoji": "📴", "name": "mobile phone off", "shortname": ":mobile_phone_off:", "unicode": "1f4f4", "html": "&#128244;", "category": "Symbols (av-symbol)", "order": "2071"},
+ {"emoji": "đŸ—ŧ", "name": "Tokyo tower", "shortname": ":tokyo_tower:", "unicode": "1f5fc", "html": "&#128508;", "category": "Travel & Places (place-building)", "order": "1575"},
+ {"emoji": "㊗", "name": "Japanese congratulations button", "shortname": ":congratulations:", "unicode": "3297", "html": "&#12951;", "category": "Symbols (alphanum)", "order": "2155"},
+ {"emoji": "👘", "name": "kimono", "shortname": ":kimono:", "unicode": "1f458", "html": "&#128088;", "category": "Objects (clothing)", "order": "1320"},
+ {"emoji": "🇷đŸ‡ē", "name": "flag: Russia", "shortname": ":ru:", "unicode": "1F1F7 1F1FA", "html": "&#127479;", "category": "Flags (country-flag)", "order": ""},
+ {"emoji": "đŸšĸ", "name": "ship", "shortname": ":ship:", "unicode": "1f6a2", "html": "&#128674;", "category": "Travel & Places (transport-water)", "order": "1649"},
+ {"emoji": "🔎", "name": "magnifying glass tilted right", "shortname": ":mag_right:", "unicode": "1f50e", "html": "&#128270;", "category": "Objects (light & video)", "order": "1866"},
+ {"emoji": "🔍", "name": "magnifying glass tilted left", "shortname": ":mag:", "unicode": "1f50d", "html": "&#128269;", "category": "Objects (light & video)", "order": "1865"},
+ {"emoji": "🚒", "name": "fire engine", "shortname": ":fire_engine:", "unicode": "1f692", "html": "&#128658;", "category": "Travel & Places (transport-ground)", "order": "1619"},
+ {"emoji": "đŸ•Ļ", "name": "eleven-thirty", "shortname": ":clock1130:", "unicode": "1f566", "html": "&#128358;", "category": "Travel & Places (time)", "order": "1710"},
+ {"emoji": "🚓", "name": "police car", "shortname": ":police_car:", "unicode": "1f693", "html": "&#128659;", "category": "Travel & Places (transport-ground)", "order": "1620"},
+ {"emoji": "🃏", "name": "joker", "shortname": ":black_joker:", "unicode": "1f0cf", "html": "&#127183;", "category": "Activities (game)", "order": "1811"},
+ {"emoji": "🌉", "name": "bridge at night", "shortname": ":bridge_at_night:", "unicode": "1f309", "html": "&#127753;", "category": "Travel & Places (place-other)", "order": "1590"},
+ {"emoji": "đŸ“Ļ", "name": "package", "shortname": ":package:", "unicode": "1f4e6", "html": "&#128230;", "category": "Objects (mail)", "order": "1907"},
+ {"emoji": "🚖", "name": "oncoming taxi", "shortname": ":oncoming_taxi:", "unicode": "1f696", "html": "&#128662;", "category": "Travel & Places (transport-ground)", "order": "1623"},
+ {"emoji": "📆", "name": "tear-off calendar", "shortname": ":calendar:", "unicode": "1f4c6", "html": "&#128198;", "category": "Objects (office)", "order": "1926"},
+ {"emoji": "🏇", "name": "horse racing", "shortname": ":horse_racing:", "unicode": "1f3c7", "html": "&#127943;", "category": "People & Body (person-sport)", "order": "769"},
+ {"emoji": "🐅", "name": "tiger", "shortname": ":tiger2:", "unicode": "1f405", "html": "&#128005;", "category": "Animals & Nature (animal-mammal)", "order": "1354"},
+ {"emoji": "đŸ‘ĸ", "name": "woman’s boot", "shortname": ":boot:", "unicode": "1f462", "html": "&#128098;", "category": "Objects (clothing)", "order": "1332"},
+ {"emoji": "🚑", "name": "ambulance", "shortname": ":ambulance:", "unicode": "1f691", "html": "&#128657;", "category": "Travel & Places (transport-ground)", "order": "1618"},
+ {"emoji": "đŸ”ŗ", "name": "white square button", "shortname": ":white_square_button:", "unicode": "1f533", "html": "&#128307;", "category": "Symbols (geometric)", "order": "2176"},
+ {"emoji": "🐗", "name": "boar", "shortname": ":boar:", "unicode": "1f417", "html": "&#128023;", "category": "Animals & Nature (animal-mammal)", "order": "1366"},
+ {"emoji": "🎒", "name": "backpack", "shortname": ":school_satchel:", "unicode": "1f392", "html": "&#127890;", "category": "Objects (clothing)", "order": "1327"},
+ {"emoji": "âžŋ", "name": "double curly loop", "shortname": ":loop:", "unicode": "27bf", "html": "&#10175;", "category": "Symbols (other-symbol)", "order": "2091"},
+ {"emoji": "💷", "name": "pound banknote", "shortname": ":pound:", "unicode": "1f4b7", "html": "&#128183;", "category": "Objects (money)", "order": "1895"},
+ {"emoji": "ℹ", "name": "information", "shortname": ":information_source:", "unicode": "2139", "html": "&#8505;", "category": "Symbols (alphanum)", "order": "2131"},
+ {"emoji": "🐂", "name": "ox", "shortname": ":ox:", "unicode": "1f402", "html": "&#128002;", "category": "Animals & Nature (animal-mammal)", "order": "1361"},
+ {"emoji": "🍙", "name": "rice ball", "shortname": ":rice_ball:", "unicode": "1f359", "html": "&#127833;", "category": "Food & Drink (food-asian)", "order": "1497"},
+ {"emoji": "🆚", "name": "VS button", "shortname": ":vs:", "unicode": "1f19a", "html": "&#127386;", "category": "Symbols (alphanum)", "order": "2141"},
+ {"emoji": "🔚", "name": "END arrow", "shortname": ":end:", "unicode": "1f51a", "html": "&#128282;", "category": "Symbols (arrow)", "order": "2019"},
+ {"emoji": "đŸ…ŋī¸", "name": "P button", "shortname": ":parking:", "unicode": "1f17f", "html": "&#127359;", "category": "Symbols (alphanum)", "order": "2138"},
+ {"emoji": "👡", "name": "woman’s sandal", "shortname": ":sandal:", "unicode": "1f461", "html": "&#128097;", "category": "Objects (clothing)", "order": "1331"},
+ {"emoji": "â›ē", "name": "tent", "shortname": ":tent:", "unicode": "26fa", "html": "&#9978;", "category": "Travel & Places (place-other)", "order": "1583"},
+ {"emoji": "đŸ’ē", "name": "seat", "shortname": ":seat:", "unicode": "1f4ba", "html": "&#128186;", "category": "Travel & Places (transport-air)", "order": "1654"},
+ {"emoji": "🚕", "name": "taxi", "shortname": ":taxi:", "unicode": "1f695", "html": "&#128661;", "category": "Travel & Places (transport-ground)", "order": "1622"},
+ {"emoji": "◾", "name": "black medium-small square", "shortname": ":black_medium_small_square:", "unicode": "25fe", "html": "&#9726;", "category": "Symbols (geometric)", "order": "2164"},
+ {"emoji": "đŸ’ŧ", "name": "briefcase", "shortname": ":briefcase:", "unicode": "1f4bc", "html": "&#128188;", "category": "Objects (office)", "order": "1921"},
+ {"emoji": "📰", "name": "newspaper", "shortname": ":newspaper:", "unicode": "1f4f0", "html": "&#128240;", "category": "Objects (book-paper)", "order": "1886"},
+ {"emoji": "đŸŽĒ", "name": "circus tent", "shortname": ":circus_tent:", "unicode": "1f3aa", "html": "&#127914;", "category": "Travel & Places (place-other)", "order": "1597"},
+ {"emoji": "đŸ”¯", "name": "dotted six-pointed star", "shortname": ":six_pointed_star:", "unicode": "1f52f", "html": "&#128303;", "category": "Symbols (religion)", "order": "2034"},
+ {"emoji": "🚹", "name": "men’s room", "shortname": ":mens:", "unicode": "1f6b9", "html": "&#128697;", "category": "Symbols (transport-sign)", "order": "1980"},
+ {"emoji": "🏰", "name": "castle", "shortname": ":european_castle:", "unicode": "1f3f0", "html": "&#127984;", "category": "Travel & Places (place-building)", "order": "1573"},
+ {"emoji": "đŸ”Ļ", "name": "flashlight", "shortname": ":flashlight:", "unicode": "1f526", "html": "&#128294;", "category": "Objects (light & video)", "order": "1872"},
+ {"emoji": "🌁", "name": "foggy", "shortname": ":foggy:", "unicode": "1f301", "html": "&#127745;", "category": "Travel & Places (place-other)", "order": "1584"},
+ {"emoji": "âĢ", "name": "fast up button", "shortname": ":arrow_double_up:", "unicode": "23eb", "html": "&#9195;", "category": "Symbols (av-symbol)", "order": "2059"},
+ {"emoji": "🎍", "name": "pine decoration", "shortname": ":bamboo:", "unicode": "1f38d", "html": "&#127885;", "category": "Activities (event)", "order": "1765"},
+ {"emoji": "đŸŽĢ", "name": "ticket", "shortname": ":ticket:", "unicode": "1f3ab", "html": "&#127915;", "category": "Activities (event)", "order": "1774"},
+ {"emoji": "🚁", "name": "helicopter", "shortname": ":helicopter:", "unicode": "1f681", "html": "&#128641;", "category": "Travel & Places (transport-air)", "order": "1655"},
+ {"emoji": "đŸ’Ŋ", "name": "computer disk", "shortname": ":minidisc:", "unicode": "1f4bd", "html": "&#128189;", "category": "Objects (computer)", "order": "1852"},
+ {"emoji": "🚍", "name": "oncoming bus", "shortname": ":oncoming_bus:", "unicode": "1f68d", "html": "&#128653;", "category": "Travel & Places (transport-ground)", "order": "1615"},
+ {"emoji": "🍈", "name": "melon", "shortname": ":melon:", "unicode": "1f348", "html": "&#127816;", "category": "Food & Drink (food-fruit)", "order": "1450"},
+ {"emoji": "â–Ģ", "name": "white small square", "shortname": ":white_small_square:", "unicode": "25ab", "html": "&#9643;", "category": "Symbols (geometric)", "order": "2160"},
+ {"emoji": "🏤", "name": "post office", "shortname": ":european_post_office:", "unicode": "1f3e4", "html": "&#127972;", "category": "Travel & Places (place-building)", "order": "1563"},
+ {"emoji": "🔟", "name": "keycap: 10", "shortname": ":keycap_ten:", "unicode": "1f51f", "html": "&#128287;", "category": "Symbols (keycap)", "order": "2118"},
+ {"emoji": "📓", "name": "notebook", "shortname": ":notebook:", "unicode": "1f4d3", "html": "&#128211;", "category": "Objects (book-paper)", "order": "1881"},
+ {"emoji": "🔕", "name": "bell with slash", "shortname": ":no_bell:", "unicode": "1f515", "html": "&#128277;", "category": "Objects (sound)", "order": "1822"},
+ {"emoji": "đŸĸ", "name": "oden", "shortname": ":oden:", "unicode": "1f362", "html": "&#127842;", "category": "Food & Drink (food-asian)", "order": "1503"},
+ {"emoji": "🎏", "name": "carp streamer", "shortname": ":flags:", "unicode": "1f38f", "html": "&#127887;", "category": "Activities (event)", "order": "1767"},
+ {"emoji": "🎠", "name": "carousel horse", "shortname": ":carousel_horse:", "unicode": "1f3a0", "html": "&#127904;", "category": "Travel & Places (place-other)", "order": "1593"},
+ {"emoji": "🐡", "name": "blowfish", "shortname": ":blowfish:", "unicode": "1f421", "html": "&#128033;", "category": "Animals & Nature (animal-marine)", "order": "1411"},
+ {"emoji": "📈", "name": "chart increasing", "shortname": ":chart_with_upwards_trend:", "unicode": "1f4c8", "html": "&#128200;", "category": "Objects (office)", "order": "1930"},
+ {"emoji": "🍠", "name": "roasted sweet potato", "shortname": ":sweet_potato:", "unicode": "1f360", "html": "&#127840;", "category": "Food & Drink (food-asian)", "order": "1502"},
+ {"emoji": "đŸŽŋ", "name": "skis", "shortname": ":ski:", "unicode": "1f3bf", "html": "&#127935;", "category": "Activities (sport)", "order": "1803"},
+ {"emoji": "🕛", "name": "twelve o’clock", "shortname": ":clock12:", "unicode": "1f55b", "html": "&#128347;", "category": "Travel & Places (time)", "order": "1687"},
+ {"emoji": "đŸ“ļ", "name": "antenna bars", "shortname": ":signal_strength:", "unicode": "1f4f6", "html": "&#128246;", "category": "Symbols (av-symbol)", "order": "2069"},
+ {"emoji": "🚧", "name": "construction", "shortname": ":construction:", "unicode": "1f6a7", "html": "&#128679;", "category": "Travel & Places (transport-ground)", "order": "1640"},
+ {"emoji": "#", "name": "", "shortname": "", "unicode": "", "html": "&#35;", "category": "", "order": ""},
+ {"emoji": "â—ŧ", "name": "black medium square", "shortname": ":black_medium_square:", "unicode": "25fc", "html": "&#9724;", "category": "Symbols (geometric)", "order": "2162"},
+ {"emoji": "📡", "name": "satellite antenna", "shortname": ":satellite:", "unicode": "1f4e1", "html": "&#128225;", "category": "Objects (science)", "order": "1869"},
+ {"emoji": "đŸ’ļ", "name": "euro banknote", "shortname": ":euro:", "unicode": "1f4b6", "html": "&#128182;", "category": "Objects (money)", "order": "1894"},
+ {"emoji": "👚", "name": "woman’s clothes", "shortname": ":womans_clothes:", "unicode": "1f45a", "html": "&#128090;", "category": "Objects (clothing)", "order": "1322"},
+ {"emoji": "📒", "name": "ledger", "shortname": ":ledger:", "unicode": "1f4d2", "html": "&#128210;", "category": "Objects (book-paper)", "order": "1882"},
+ {"emoji": "🐆", "name": "leopard", "shortname": ":leopard:", "unicode": "1f406", "html": "&#128006;", "category": "Animals & Nature (animal-mammal)", "order": "1355"},
+ {"emoji": "🔅", "name": "dim button", "shortname": ":low_brightness:", "unicode": "1f505", "html": "&#128261;", "category": "Symbols (av-symbol)", "order": "2067"},
+ {"emoji": "🕒", "name": "three o’clock", "shortname": ":clock3:", "unicode": "1f552", "html": "&#128338;", "category": "Travel & Places (time)", "order": "1693"},
+ {"emoji": "đŸŦ", "name": "department store", "shortname": ":department_store:", "unicode": "1f3ec", "html": "&#127980;", "category": "Travel & Places (place-building)", "order": "1570"},
+ {"emoji": "🚚", "name": "delivery truck", "shortname": ":truck:", "unicode": "1f69a", "html": "&#128666;", "category": "Travel & Places (transport-ground)", "order": "1627"},
+ {"emoji": "đŸļ", "name": "sake", "shortname": ":sake:", "unicode": "1f376", "html": "&#127862;", "category": "Food & Drink (drink)", "order": "1524"},
+ {"emoji": "🚃", "name": "railway car", "shortname": ":railway_car:", "unicode": "1f683", "html": "&#128643;", "category": "Travel & Places (transport-ground)", "order": "1603"},
+ {"emoji": "🚤", "name": "speedboat", "shortname": ":speedboat:", "unicode": "1f6a4", "html": "&#128676;", "category": "Travel & Places (transport-water)", "order": "1645"},
+ {"emoji": "🇰🇷", "name": "flag: South Korea", "shortname": ":ko:", "unicode": "1F1F0 1F1F7", "html": "&#127472;", "category": "Flags (country-flag)", "order": ""},
+ {"emoji": "đŸ“ŧ", "name": "videocassette", "shortname": ":vhs:", "unicode": "1f4fc", "html": "&#128252;", "category": "Objects (light & video)", "order": "1864"},
+ {"emoji": "🕐", "name": "one o’clock", "shortname": ":clock1:", "unicode": "1f550", "html": "&#128336;", "category": "Travel & Places (time)", "order": "1689"},
+ {"emoji": "âŦ", "name": "fast down button", "shortname": ":arrow_double_down:", "unicode": "23ec", "html": "&#9196;", "category": "Symbols (av-symbol)", "order": "2061"},
+ {"emoji": "🐃", "name": "water buffalo", "shortname": ":water_buffalo:", "unicode": "1f403", "html": "&#128003;", "category": "Animals & Nature (animal-mammal)", "order": "1362"},
+ {"emoji": "đŸ”Ŋ", "name": "downwards button", "shortname": ":arrow_down_small:", "unicode": "1f53d", "html": "&#128317;", "category": "Symbols (av-symbol)", "order": "2060"},
+ {"emoji": "💴", "name": "yen banknote", "shortname": ":yen:", "unicode": "1f4b4", "html": "&#128180;", "category": "Objects (money)", "order": "1892"},
+ {"emoji": "🔇", "name": "muted speaker", "shortname": ":mute:", "unicode": "1f507", "html": "&#128263;", "category": "Objects (sound)", "order": "1814"},
+ {"emoji": "đŸŽŊ", "name": "running shirt", "shortname": ":running_shirt_with_sash:", "unicode": "1f3bd", "html": "&#127933;", "category": "Activities (sport)", "order": "1802"},
+ {"emoji": "âŦœ", "name": "white large square", "shortname": ":white_large_square:", "unicode": "2b1c", "html": "&#11036;", "category": "Symbols (geometric)", "order": "2166"},
+ {"emoji": "â™ŋ", "name": "wheelchair symbol", "shortname": ":wheelchair:", "unicode": "267f", "html": "&#9855;", "category": "Symbols (transport-sign)", "order": "1979"},
+ {"emoji": "🕑", "name": "two o’clock", "shortname": ":clock2:", "unicode": "1f551", "html": "&#128337;", "category": "Travel & Places (time)", "order": "1691"},
+ {"emoji": "📎", "name": "paperclip", "shortname": ":paperclip:", "unicode": "1f4ce", "html": "&#128206;", "category": "Objects (office)", "order": "1936"},
+ {"emoji": "🏧", "name": "ATM sign", "shortname": ":atm:", "unicode": "1f3e7", "html": "&#127975;", "category": "Symbols (transport-sign)", "order": "1976"},
+ {"emoji": "đŸŽĻ", "name": "cinema", "shortname": ":cinema:", "unicode": "1f3a6", "html": "&#127910;", "category": "Symbols (av-symbol)", "order": "2066"},
+ {"emoji": "🔭", "name": "telescope", "shortname": ":telescope:", "unicode": "1f52d", "html": "&#128301;", "category": "Objects (science)", "order": "1868"},
+ {"emoji": "🎑", "name": "moon viewing ceremony", "shortname": ":rice_scene:", "unicode": "1f391", "html": "&#127889;", "category": "Activities (event)", "order": "1769"},
+ {"emoji": "📘", "name": "blue book", "shortname": ":blue_book:", "unicode": "1f4d8", "html": "&#128216;", "category": "Objects (book-paper)", "order": "1878"},
+ {"emoji": "â—ģī¸", "name": "white medium square", "shortname": ":white_medium_square:", "unicode": "25fb", "html": "&#9723;", "category": "Symbols (geometric)", "order": "2161"},
+ {"emoji": "📮", "name": "postbox", "shortname": ":postbox:", "unicode": "1f4ee", "html": "&#128238;", "category": "Objects (mail)", "order": "1912"},
+ {"emoji": "📧", "name": "e-mail", "shortname": ":e-mail:", "unicode": "1f4e7", "html": "&#128231;", "category": "Objects (mail)", "order": "1902"},
+ {"emoji": "🐁", "name": "mouse", "shortname": ":mouse2:", "unicode": "1f401", "html": "&#128001;", "category": "Animals & Nature (animal-mammal)", "order": "1376"},
+ {"emoji": "🚄", "name": "high-speed train", "shortname": ":bullettrain_side:", "unicode": "1f684", "html": "&#128644;", "category": "Travel & Places (transport-ground)", "order": "1604"},
+ {"emoji": "🉐", "name": "Japanese bargain button", "shortname": ":ideograph_advantage:", "unicode": "1f250", "html": "&#127568;", "category": "Symbols (alphanum)", "order": "2147"},
+ {"emoji": "🔩", "name": "nut and bolt", "shortname": ":nut_and_bolt:", "unicode": "1f529", "html": "&#128297;", "category": "Objects (tool)", "order": "1960"},
+ {"emoji": "🆖", "name": "NG button", "shortname": ":ng:", "unicode": "1f196", "html": "&#127382;", "category": "Symbols (alphanum)", "order": "2135"},
+ {"emoji": "🏨", "name": "hotel", "shortname": ":hotel:", "unicode": "1f3e8", "html": "&#127976;", "category": "Travel & Places (place-building)", "order": "1566"},
+ {"emoji": "🚾", "name": "water closet", "shortname": ":wc:", "unicode": "1f6be", "html": "&#128702;", "category": "Symbols (transport-sign)", "order": "1984"},
+ {"emoji": "🏮", "name": "red paper lantern", "shortname": ":izakaya_lantern:", "unicode": "1f3ee", "html": "&#127982;", "category": "Objects (light & video)", "order": "1873"},
+ {"emoji": "🔂", "name": "repeat single button", "shortname": ":repeat_one:", "unicode": "1f502", "html": "&#128258;", "category": "Symbols (av-symbol)", "order": "2050"},
+ {"emoji": "đŸ“Ŧ", "name": "open mailbox with raised flag", "shortname": ":mailbox_with_mail:", "unicode": "1f4ec", "html": "&#128236;", "category": "Objects (mail)", "order": "1910"},
+ {"emoji": "📉", "name": "chart decreasing", "shortname": ":chart_with_downwards_trend:", "unicode": "1f4c9", "html": "&#128201;", "category": "Objects (office)", "order": "1931"},
+ {"emoji": "📗", "name": "green book", "shortname": ":green_book:", "unicode": "1f4d7", "html": "&#128215;", "category": "Objects (book-paper)", "order": "1877"},
+ {"emoji": "🚜", "name": "tractor", "shortname": ":tractor:", "unicode": "1f69c", "html": "&#128668;", "category": "Travel & Places (transport-ground)", "order": "1629"},
+ {"emoji": "⛲", "name": "fountain", "shortname": ":fountain:", "unicode": "26f2", "html": "&#9970;", "category": "Travel & Places (place-other)", "order": "1582"},
+ {"emoji": "🚇", "name": "metro", "shortname": ":metro:", "unicode": "1f687", "html": "&#128647;", "category": "Travel & Places (transport-ground)", "order": "1607"},
+ {"emoji": "📋", "name": "clipboard", "shortname": ":clipboard:", "unicode": "1f4cb", "html": "&#128203;", "category": "Objects (office)", "order": "1933"},
+ {"emoji": "đŸ“ĩ", "name": "no mobile phones", "shortname": ":no_mobile_phones:", "unicode": "1f4f5", "html": "&#128245;", "category": "Symbols (warning)", "order": "1998"},
+ {"emoji": "🕓", "name": "four o’clock", "shortname": ":clock4:", "unicode": "1f553", "html": "&#128339;", "category": "Travel & Places (time)", "order": "1695"},
+ {"emoji": "🚭", "name": "no smoking", "shortname": ":no_smoking:", "unicode": "1f6ad", "html": "&#128685;", "category": "Symbols (warning)", "order": "1994"},
+ {"emoji": "âŦ›", "name": "black large square", "shortname": ":black_large_square:", "unicode": "2b1b", "html": "&#11035;", "category": "Symbols (geometric)", "order": "2165"},
+ {"emoji": "🎰", "name": "slot machine", "shortname": ":slot_machine:", "unicode": "1f3b0", "html": "&#127920;", "category": "Activities (game)", "order": "1601"},
+ {"emoji": "🕔", "name": "five o’clock", "shortname": ":clock5:", "unicode": "1f554", "html": "&#128340;", "category": "Travel & Places (time)", "order": "1697"},
+ {"emoji": "🛁", "name": "bathtub", "shortname": ":bathtub:", "unicode": "1f6c1", "html": "&#128705;", "category": "Objects (household)", "order": "1679"},
+ {"emoji": "📜", "name": "scroll", "shortname": ":scroll:", "unicode": "1f4dc", "html": "&#128220;", "category": "Objects (book-paper)", "order": "1884"},
+ {"emoji": "🚉", "name": "station", "shortname": ":station:", "unicode": "1f689", "html": "&#128649;", "category": "Travel & Places (transport-ground)", "order": "1609"},
+ {"emoji": "🍘", "name": "rice cracker", "shortname": ":rice_cracker:", "unicode": "1f358", "html": "&#127832;", "category": "Food & Drink (food-asian)", "order": "1496"},
+ {"emoji": "đŸĻ", "name": "bank", "shortname": ":bank:", "unicode": "1f3e6", "html": "&#127974;", "category": "Travel & Places (place-building)", "order": "1565"},
+ {"emoji": "🔧", "name": "wrench", "shortname": ":wrench:", "unicode": "1f527", "html": "&#128295;", "category": "Objects (tool)", "order": "1959"},
+ {"emoji": "đŸˆ¯ī¸", "name": "", "shortname": ":u6307:", "unicode": "1f22f", "html": "&#127535;", "category": "", "order": "2146"},
+ {"emoji": "🚛", "name": "articulated lorry", "shortname": ":articulated_lorry:", "unicode": "1f69b", "html": "&#128667;", "category": "Travel & Places (transport-ground)", "order": "1628"},
+ {"emoji": "📄", "name": "page facing up", "shortname": ":page_facing_up:", "unicode": "1f4c4", "html": "&#128196;", "category": "Objects (book-paper)", "order": "1885"},
+ {"emoji": "⛎", "name": "Ophiuchus", "shortname": ":ophiuchus:", "unicode": "26ce", "html": "&#9934;", "category": "Symbols (zodiac)", "order": "2047"},
+ {"emoji": "📊", "name": "bar chart", "shortname": ":bar_chart:", "unicode": "1f4ca", "html": "&#128202;", "category": "Objects (office)", "order": "1932"},
+ {"emoji": "🚷", "name": "no pedestrians", "shortname": ":no_pedestrians:", "unicode": "1f6b7", "html": "&#128695;", "category": "Symbols (warning)", "order": "1997"},
+ {"emoji": "đŸ‡¨đŸ‡ŗ", "name": "flag: China", "shortname": ":cn:", "unicode": "1F1E8 1F1F3", "html": "&#127464;", "category": "Flags (country-flag)", "order": ""},
+ {"emoji": "đŸ“ŗ", "name": "vibration mode", "shortname": ":vibration_mode:", "unicode": "1f4f3", "html": "&#128243;", "category": "Symbols (av-symbol)", "order": "2070"},
+ {"emoji": "🕙", "name": "ten o’clock", "shortname": ":clock10:", "unicode": "1f559", "html": "&#128345;", "category": "Travel & Places (time)", "order": "1707"},
+ {"emoji": "🕘", "name": "nine o’clock", "shortname": ":clock9:", "unicode": "1f558", "html": "&#128344;", "category": "Travel & Places (time)", "order": "1705"},
+ {"emoji": "🚅", "name": "bullet train", "shortname": ":bullettrain_front:", "unicode": "1f685", "html": "&#128645;", "category": "Travel & Places (transport-ground)", "order": "1605"},
+ {"emoji": "🚐", "name": "minibus", "shortname": ":minibus:", "unicode": "1f690", "html": "&#128656;", "category": "Travel & Places (transport-ground)", "order": "1617"},
+ {"emoji": "🚊", "name": "tram", "shortname": ":tram:", "unicode": "1f68a", "html": "&#128650;", "category": "Travel & Places (transport-ground)", "order": "1610"},
+ {"emoji": "🕗", "name": "eight o’clock", "shortname": ":clock8:", "unicode": "1f557", "html": "&#128343;", "category": "Travel & Places (time)", "order": "1703"},
+ {"emoji": "đŸˆŗ", "name": "Japanese vacancy button", "shortname": ":u7a7a:", "unicode": "1f233", "html": "&#127539;", "category": "Symbols (alphanum)", "order": "2154"},
+ {"emoji": "đŸšĨ", "name": "horizontal traffic light", "shortname": ":traffic_light:", "unicode": "1f6a5", "html": "&#128677;", "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": "&#128693;&#127999;&zwj;&#9792;", "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": "&#128693;&#127998;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšĩđŸŊ‍♀", "name": "woman mountain biking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B5 1F3FD 200D 2640", "html": "&#128693;&#127997;&zwj;&#9792;", "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": "&#128693;&#127996;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšĩđŸģ‍♀", "name": "woman mountain biking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B5 1F3FB 200D 2640", "html": "&#128693;&#127995;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšĩ‍♀", "name": "woman mountain biking", "shortname": ":woman_mountain_biking:", "unicode": "1F6B5 200D 2640", "html": "&#128693;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšĩđŸŋ", "name": "person mountain biking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B5 1F3FF", "html": "&#128693;&#127999;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšĩ🏾", "name": "person mountain biking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B5 1F3FE", "html": "&#128693;&#127998;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšĩđŸŊ", "name": "person mountain biking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B5 1F3FD", "html": "&#128693;&#127997;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšĩđŸŧ", "name": "person mountain biking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B5 1F3FC", "html": "&#128693;&#127996;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšĩđŸģ", "name": "person mountain biking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B5 1F3FB", "html": "&#128693;&#127995;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšĩ", "name": "person mountain biking", "shortname": ":mountain_bicyclist:", "unicode": "1f6b5", "html": "&#128693;", "category": "People & Body (person-sport)", "order": "908"},
+ {"emoji": "đŸ”Ŧ", "name": "microscope", "shortname": ":microscope:", "unicode": "1f52c", "html": "&#128300;", "category": "Objects (science)", "order": "1867"},
+ {"emoji": "đŸ¯", "name": "Japanese castle", "shortname": ":japanese_castle:", "unicode": "1f3ef", "html": "&#127983;", "category": "Travel & Places (place-building)", "order": "1572"},
+ {"emoji": "🔖", "name": "bookmark", "shortname": ":bookmark:", "unicode": "1f516", "html": "&#128278;", "category": "Objects (book-paper)", "order": "1889"},
+ {"emoji": "📑", "name": "bookmark tabs", "shortname": ":bookmark_tabs:", "unicode": "1f4d1", "html": "&#128209;", "category": "Objects (book-paper)", "order": "1888"},
+ {"emoji": "👝", "name": "clutch bag", "shortname": ":pouch:", "unicode": "1f45d", "html": "&#128093;", "category": "Objects (clothing)", "order": "1325"},
+ {"emoji": "🆎", "name": "AB button (blood type)", "shortname": ":ab:", "unicode": "1f18e", "html": "&#127374;", "category": "Symbols (alphanum)", "order": "2126"},
+ {"emoji": "📃", "name": "page with curl", "shortname": ":page_with_curl:", "unicode": "1f4c3", "html": "&#128195;", "category": "Objects (book-paper)", "order": "1883"},
+ {"emoji": "🎴", "name": "flower playing cards", "shortname": ":flower_playing_cards:", "unicode": "1f3b4", "html": "&#127924;", "category": "Activities (game)", "order": "1813"},
+ {"emoji": "🕚", "name": "eleven o’clock", "shortname": ":clock11:", "unicode": "1f55a", "html": "&#128346;", "category": "Travel & Places (time)", "order": "1709"},
+ {"emoji": "📠", "name": "fax machine", "shortname": ":fax:", "unicode": "1f4e0", "html": "&#128224;", "category": "Objects (phone)", "order": "1843"},
+ {"emoji": "🕖", "name": "seven o’clock", "shortname": ":clock7:", "unicode": "1f556", "html": "&#128342;", "category": "Travel & Places (time)", "order": "1701"},
+ {"emoji": "â—Ŋ", "name": "white medium-small square", "shortname": ":white_medium_small_square:", "unicode": "25fd", "html": "&#9725;", "category": "Symbols (geometric)", "order": "2163"},
+ {"emoji": "💱", "name": "currency exchange", "shortname": ":currency_exchange:", "unicode": "1f4b1", "html": "&#128177;", "category": "Objects (money)", "order": "1899"},
+ {"emoji": "🔉", "name": "speaker medium volume", "shortname": ":sound:", "unicode": "1f509", "html": "&#128265;", "category": "Objects (sound)", "order": "1816"},
+ {"emoji": "💹", "name": "chart increasing with yen", "shortname": ":chart:", "unicode": "1f4b9", "html": "&#128185;", "category": "Objects (money)", "order": "1898"},
+ {"emoji": "🆑", "name": "CL button", "shortname": ":cl:", "unicode": "1f191", "html": "&#127377;", "category": "Symbols (alphanum)", "order": "2128"},
+ {"emoji": "💾", "name": "floppy disk", "shortname": ":floppy_disk:", "unicode": "1f4be", "html": "&#128190;", "category": "Objects (computer)", "order": "1853"},
+ {"emoji": "đŸŖ", "name": "Japanese post office", "shortname": ":post_office:", "unicode": "1f3e3", "html": "&#127971;", "category": "Travel & Places (place-building)", "order": "1562"},
+ {"emoji": "🔈", "name": "speaker low volume", "shortname": ":speaker:", "unicode": "1f508", "html": "&#128264;", "category": "Objects (sound)", "order": "1815"},
+ {"emoji": "🗾", "name": "map of Japan", "shortname": ":japan:", "unicode": "1f5fe", "html": "&#128510;", "category": "Travel & Places (place-map)", "order": "1543"},
+ {"emoji": "đŸˆē", "name": "Japanese open for business button", "shortname": ":u55b6:", "unicode": "1f23a", "html": "&#127546;", "category": "Symbols (alphanum)", "order": "2157"},
+ {"emoji": "🀄", "name": "mahjong red dragon", "shortname": ":mahjong:", "unicode": "1f004", "html": "&#126980;", "category": "Activities (game)", "order": "1812"},
+ {"emoji": "📨", "name": "incoming envelope", "shortname": ":incoming_envelope:", "unicode": "1f4e8", "html": "&#128232;", "category": "Objects (mail)", "order": "1903"},
+ {"emoji": "📙", "name": "orange book", "shortname": ":orange_book:", "unicode": "1f4d9", "html": "&#128217;", "category": "Objects (book-paper)", "order": "1879"},
+ {"emoji": "đŸšģ", "name": "restroom", "shortname": ":restroom:", "unicode": "1f6bb", "html": "&#128699;", "category": "Symbols (transport-sign)", "order": "1982"},
+ {"emoji": "đŸˆšī¸", "name": "", "shortname": ":u7121:", "unicode": "1f21a", "html": "&#127514;", "category": "", "order": "2149"},
+ {"emoji": "đŸˆļ", "name": "Japanese not free of charge button", "shortname": ":u6709:", "unicode": "1f236", "html": "&#127542;", "category": "Symbols (alphanum)", "order": "2145"},
+ {"emoji": "📐", "name": "triangular ruler", "shortname": ":triangular_ruler:", "unicode": "1f4d0", "html": "&#128208;", "category": "Objects (office)", "order": "1939"},
+ {"emoji": "🚋", "name": "tram car", "shortname": ":train:", "unicode": "1f68b", "html": "&#128651;", "category": "Travel & Places (transport-ground)", "order": "1613"},
+ {"emoji": "🈸", "name": "Japanese application button", "shortname": ":u7533:", "unicode": "1f238", "html": "&#127544;", "category": "Symbols (alphanum)", "order": "2152"},
+ {"emoji": "🚎", "name": "trolleybus", "shortname": ":trolleybus:", "unicode": "1f68e", "html": "&#128654;", "category": "Travel & Places (transport-ground)", "order": "1616"},
+ {"emoji": "🈷", "name": "Japanese monthly amount button", "shortname": ":u6708:", "unicode": "1f237", "html": "&#127543;", "category": "Symbols (alphanum)", "order": "2144"},
+ {"emoji": "đŸ”ĸ", "name": "input numbers", "shortname": ":input_numbers:", "unicode": "1F522", "html": "&#128290;", "category": "Symbols (alphanum)", "order": ""},
+ {"emoji": "📔", "name": "notebook with decorative cover", "shortname": ":notebook_with_decorative_cover:", "unicode": "1f4d4", "html": "&#128212;", "category": "Objects (book-paper)", "order": "1874"},
+ {"emoji": "🈲", "name": "Japanese prohibited button", "shortname": ":u7981:", "unicode": "1f232", "html": "&#127538;", "category": "Symbols (alphanum)", "order": "2150"},
+ {"emoji": "đŸˆĩ", "name": "Japanese no vacancy button", "shortname": ":u6e80:", "unicode": "1f235", "html": "&#127541;", "category": "Symbols (alphanum)", "order": "2158"},
+ {"emoji": "đŸ“¯", "name": "postal horn", "shortname": ":postal_horn:", "unicode": "1f4ef", "html": "&#128239;", "category": "Objects (sound)", "order": "1820"},
+ {"emoji": "🏭", "name": "factory", "shortname": ":factory:", "unicode": "1f3ed", "html": "&#127981;", "category": "Travel & Places (place-building)", "order": "1571"},
+ {"emoji": "🚸", "name": "children crossing", "shortname": ":children_crossing:", "unicode": "1f6b8", "html": "&#128696;", "category": "Symbols (warning)", "order": "1990"},
+ {"emoji": "🚆", "name": "train", "shortname": ":train2:", "unicode": "1f686", "html": "&#128646;", "category": "Travel & Places (transport-ground)", "order": "1606"},
+ {"emoji": "📏", "name": "straight ruler", "shortname": ":straight_ruler:", "unicode": "1f4cf", "html": "&#128207;", "category": "Objects (office)", "order": "1938"},
+ {"emoji": "📟", "name": "pager", "shortname": ":pager:", "unicode": "1f4df", "html": "&#128223;", "category": "Objects (phone)", "order": "1842"},
+ {"emoji": "🉑", "name": "Japanese acceptable button", "shortname": ":accept:", "unicode": "1f251", "html": "&#127569;", "category": "Symbols (alphanum)", "order": "2151"},
+ {"emoji": "🈴", "name": "Japanese passing grade button", "shortname": ":u5408:", "unicode": "1f234", "html": "&#127540;", "category": "Symbols (alphanum)", "order": "2153"},
+ {"emoji": "🔏", "name": "locked with pen", "shortname": ":lock_with_ink_pen:", "unicode": "1f50f", "html": "&#128271;", "category": "Objects (lock)", "order": "1946"},
+ {"emoji": "🕜", "name": "one-thirty", "shortname": ":clock130:", "unicode": "1f55c", "html": "&#128348;", "category": "Travel & Places (time)", "order": "1690"},
+ {"emoji": "đŸˆ‚ī¸", "name": "Japanese service charge button", "shortname": ":sa:", "unicode": "1f202", "html": "&#127490;", "category": "Symbols (alphanum)", "order": "2143"},
+ {"emoji": "📤", "name": "outbox tray", "shortname": ":outbox_tray:", "unicode": "1f4e4", "html": "&#128228;", "category": "Objects (mail)", "order": "1905"},
+ {"emoji": "🔀", "name": "shuffle tracks button", "shortname": ":twisted_rightwards_arrows:", "unicode": "1f500", "html": "&#128256;", "category": "Symbols (av-symbol)", "order": "2048"},
+ {"emoji": "đŸ“Ģ", "name": "closed mailbox with raised flag", "shortname": ":mailbox:", "unicode": "1f4eb", "html": "&#128235;", "category": "Objects (mail)", "order": "1908"},
+ {"emoji": "🚈", "name": "light rail", "shortname": ":light_rail:", "unicode": "1f688", "html": "&#128648;", "category": "Travel & Places (transport-ground)", "order": "1608"},
+ {"emoji": "🕤", "name": "nine-thirty", "shortname": ":clock930:", "unicode": "1f564", "html": "&#128356;", "category": "Travel & Places (time)", "order": "1706"},
+ {"emoji": "🚏", "name": "bus stop", "shortname": ":busstop:", "unicode": "1f68f", "html": "&#128655;", "category": "Travel & Places (transport-ground)", "order": "1633"},
+ {"emoji": "📂", "name": "open file folder", "shortname": ":open_file_folder:", "unicode": "1f4c2", "html": "&#128194;", "category": "Objects (office)", "order": "1923"},
+ {"emoji": "📁", "name": "file folder", "shortname": ":file_folder:", "unicode": "1f4c1", "html": "&#128193;", "category": "Objects (office)", "order": "1922"},
+ {"emoji": "🚰", "name": "potable water", "shortname": ":potable_water:", "unicode": "1f6b0", "html": "&#128688;", "category": "Symbols (transport-sign)", "order": "1978"},
+ {"emoji": "📇", "name": "card index", "shortname": ":card_index:", "unicode": "1f4c7", "html": "&#128199;", "category": "Objects (office)", "order": "1929"},
+ {"emoji": "🕝", "name": "two-thirty", "shortname": ":clock230:", "unicode": "1f55d", "html": "&#128349;", "category": "Travel & Places (time)", "order": "1692"},
+ {"emoji": "🚝", "name": "monorail", "shortname": ":monorail:", "unicode": "1f69d", "html": "&#128669;", "category": "Travel & Places (transport-ground)", "order": "1611"},
+ {"emoji": "🕧", "name": "twelve-thirty", "shortname": ":clock1230:", "unicode": "1f567", "html": "&#128359;", "category": "Travel & Places (time)", "order": "1688"},
+ {"emoji": "đŸ•Ĩ", "name": "ten-thirty", "shortname": ":clock1030:", "unicode": "1f565", "html": "&#128357;", "category": "Travel & Places (time)", "order": "1708"},
+ {"emoji": "🔤", "name": "input latin letters", "shortname": ":abc:", "unicode": "1f524", "html": "&#128292;", "category": "Symbols (alphanum)", "order": "2124"},
+ {"emoji": "đŸ“Ē", "name": "closed mailbox with lowered flag", "shortname": ":mailbox_closed:", "unicode": "1f4ea", "html": "&#128234;", "category": "Objects (mail)", "order": "1909"},
+ {"emoji": "🕟", "name": "four-thirty", "shortname": ":clock430:", "unicode": "1f55f", "html": "&#128351;", "category": "Travel & Places (time)", "order": "1696"},
+ {"emoji": "🚞", "name": "mountain railway", "shortname": ":mountain_railway:", "unicode": "1f69e", "html": "&#128670;", "category": "Travel & Places (transport-ground)", "order": "1612"},
+ {"emoji": "đŸš¯", "name": "no littering", "shortname": ":do_not_litter:", "unicode": "1f6af", "html": "&#128687;", "category": "Symbols (warning)", "order": "1995"},
+ {"emoji": "🕞", "name": "three-thirty", "shortname": ":clock330:", "unicode": "1f55e", "html": "&#128350;", "category": "Travel & Places (time)", "order": "1694"},
+ {"emoji": "➗", "name": "division sign", "shortname": ":heavy_division_sign:", "unicode": "2797", "html": "&#10135;", "category": "Symbols (other-symbol)", "order": "2089"},
+ {"emoji": "đŸ•ĸ", "name": "seven-thirty", "shortname": ":clock730:", "unicode": "1f562", "html": "&#128354;", "category": "Travel & Places (time)", "order": "1702"},
+ {"emoji": "🕠", "name": "five-thirty", "shortname": ":clock530:", "unicode": "1f560", "html": "&#128352;", "category": "Travel & Places (time)", "order": "1698"},
+ {"emoji": "🔠", "name": "input latin uppercase", "shortname": ":capital_abcd:", "unicode": "1f520", "html": "&#128288;", "category": "Symbols (alphanum)", "order": "2120"},
+ {"emoji": "📭", "name": "open mailbox with lowered flag", "shortname": ":mailbox_with_no_mail:", "unicode": "1f4ed", "html": "&#128237;", "category": "Objects (mail)", "order": "1911"},
+ {"emoji": "đŸ”Ŗ", "name": "input symbols", "shortname": ":symbols:", "unicode": "1f523", "html": "&#128291;", "category": "Symbols (alphanum)", "order": "2123"},
+ {"emoji": "🚡", "name": "aerial tramway", "shortname": ":aerial_tramway:", "unicode": "1f6a1", "html": "&#128673;", "category": "Travel & Places (transport-air)", "order": "1658"},
+ {"emoji": "đŸ•Ŗ", "name": "eight-thirty", "shortname": ":clock830:", "unicode": "1f563", "html": "&#128355;", "category": "Travel & Places (time)", "order": "1704"},
+ {"emoji": "🕡", "name": "six-thirty", "shortname": ":clock630:", "unicode": "1f561", "html": "&#128353;", "category": "Travel & Places (time)", "order": "1700"},
+ {"emoji": "🔡", "name": "input latin lowercase", "shortname": ":abcd:", "unicode": "1f521", "html": "&#128289;", "category": "Symbols (alphanum)", "order": "2121"},
+ {"emoji": "🚠", "name": "mountain cableway", "shortname": ":mountain_cableway:", "unicode": "1f6a0", "html": "&#128672;", "category": "Travel & Places (transport-air)", "order": "1657"},
+ {"emoji": "🈁", "name": "Japanese here button", "shortname": ":koko:", "unicode": "1f201", "html": "&#127489;", "category": "Symbols (alphanum)", "order": "2142"},
+ {"emoji": "🛂", "name": "passport control", "shortname": ":passport_control:", "unicode": "1f6c2", "html": "&#128706;", "category": "Symbols (transport-sign)", "order": "1985"},
+ {"emoji": "🚱", "name": "non-potable water", "shortname": ":non-potable_water:", "unicode": "1f6b1", "html": "&#128689;", "category": "Symbols (warning)", "order": "1996"},
+ {"emoji": "🚟", "name": "suspension railway", "shortname": ":suspension_railway:", "unicode": "1f69f", "html": "&#128671;", "category": "Travel & Places (transport-air)", "order": "1656"},
+ {"emoji": "🛄", "name": "baggage claim", "shortname": ":baggage_claim:", "unicode": "1f6c4", "html": "&#128708;", "category": "Symbols (transport-sign)", "order": "1987"},
+ {"emoji": "đŸšŗ", "name": "no bicycles", "shortname": ":no_bicycles:", "unicode": "1f6b3", "html": "&#128691;", "category": "Symbols (warning)", "order": "1993"},
+ {"emoji": "đŸŗâ€đŸŒˆ", "name": "rainbow flag", "shortname": ":rainbow_flag:", "unicode": "1F3F3 200D 1F308", "html": "&#127987;&zwj;&#127752;", "category": "Flags (flag)", "order": ""},
+ {"emoji": "đŸ•ĩđŸŋ‍♀", "name": "woman detective: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F575 1F3FF 200D 2640", "html": "&#128373;&#127999;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩ🏾‍♀", "name": "woman detective: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F575 1F3FE 200D 2640", "html": "&#128373;&#127998;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩđŸŊ‍♀", "name": "woman detective: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F575 1F3FD 200D 2640", "html": "&#128373;&#127997;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩđŸŧ‍♀", "name": "woman detective: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F575 1F3FC 200D 2640", "html": "&#128373;&#127996;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩđŸģ‍♀", "name": "woman detective: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F575 1F3FB 200D 2640", "html": "&#128373;&#127995;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩ‍♀", "name": "woman detective", "shortname": ":woman_detective:", "unicode": "1F575 200D 2640", "html": "&#128373;&zwj;&#9792;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩđŸŋ", "name": "detective: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F575 1F3FF", "html": "&#128373;&#127999;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩ🏾", "name": "detective: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F575 1F3FE", "html": "&#128373;&#127998;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩđŸŊ", "name": "detective: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F575 1F3FD", "html": "&#128373;&#127997;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩđŸŧ", "name": "detective: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F575 1F3FC", "html": "&#128373;&#127996;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩđŸģ", "name": "detective: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F575 1F3FB", "html": "&#128373;&#127995;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩ", "name": "detective", "shortname": ":detective:", "unicode": "1F575", "html": "&#128373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "☚", "name": "frowning face", "shortname": ":frowning_face:", "unicode": "2639", "html": "&#9785;", "category": "Smileys & Emotion (face-concerned)", "order": ""},
+ {"emoji": "☠", "name": "skull and crossbones", "shortname": ":skull_crossbones:", "unicode": "2620", "html": "&#9760;", "category": "Smileys & Emotion (face-negative)", "order": "81"},
+ {"emoji": "🤗", "name": "hugging face", "shortname": ":hugging:", "unicode": "1f917", "html": "&#129303;", "category": "Smileys & Emotion (face-hand)", "order": "20"},
+ {"emoji": "🤖", "name": "robot", "shortname": ":robot:", "unicode": "1F916", "html": "&#129302;", "category": "Smileys & Emotion (face-costume)", "order": ""},
+ {"emoji": "🤕", "name": "face with head-bandage", "shortname": ":face_with_headbandage:", "unicode": "1F915", "html": "&#129301;", "category": "Smileys & Emotion (face-unwell)", "order": ""},
+ {"emoji": "🤔", "name": "thinking face", "shortname": ":thinking:", "unicode": "1f914", "html": "&#129300;", "category": "Smileys & Emotion (face-hand)", "order": "21"},
+ {"emoji": "🤓", "name": "nerd face", "shortname": ":nerd:", "unicode": "1f913", "html": "&#129299;", "category": "Smileys & Emotion (face-glasses)", "order": "36"},
+ {"emoji": "🤒", "name": "face with thermometer", "shortname": ":face_with_thermometer:", "unicode": "1F912", "html": "&#129298;", "category": "Smileys & Emotion (face-unwell)", "order": ""},
+ {"emoji": "🤑", "name": "money-mouth face", "shortname": ":moneymouth_face:", "unicode": "1F911", "html": "&#129297;", "category": "Smileys & Emotion (face-tongue)", "order": ""},
+ {"emoji": "🤐", "name": "zipper-mouth face", "shortname": ":zipper_mouth:", "unicode": "1f910", "html": "&#129296;", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": "30"},
+ {"emoji": "🙄", "name": "face with rolling eyes", "shortname": ":rolling_eyes:", "unicode": "1f644", "html": "&#128580;", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": "25"},
+ {"emoji": "🙃", "name": "upside-down face", "shortname": ":upside_down:", "unicode": "1f643", "html": "&#128579;", "category": "Smileys & Emotion (face-smiling)", "order": "45"},
+ {"emoji": "🙂", "name": "slightly smiling face", "shortname": ":slight_smile:", "unicode": "1f642", "html": "&#128578;", "category": "Smileys & Emotion (face-smiling)", "order": "19"},
+ {"emoji": "🙁", "name": "slightly frowning face", "shortname": ":slightly_frowning_face:", "unicode": "1F641", "html": "&#128577;", "category": "Smileys & Emotion (face-concerned)", "order": ""},
+ {"emoji": "🤘đŸŋ", "name": "sign of the horns: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F918 1F3FF", "html": "&#129304;&#127999;", "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": "&#129304;&#127998;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤘đŸŊ", "name": "sign of the horns: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F918 1F3FD", "html": "&#129304;&#127997;", "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": "&#129304;&#127996;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤘đŸģ", "name": "sign of the horns: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F918 1F3FB", "html": "&#129304;&#127995;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤘", "name": "sign of the horns", "shortname": ":sign_of_the_horns:", "unicode": "1F918", "html": "&#129304;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🖖đŸŋ", "name": "vulcan salute: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F596 1F3FF", "html": "&#128406;&#127999;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "🖖🏾", "name": "vulcan salute: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F596 1F3FE", "html": "&#128406;&#127998;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "🖖đŸŊ", "name": "vulcan salute: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F596 1F3FD", "html": "&#128406;&#127997;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "🖖đŸŧ", "name": "vulcan salute: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F596 1F3FC", "html": "&#128406;&#127996;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "🖖đŸģ", "name": "vulcan salute: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F596 1F3FB", "html": "&#128406;&#127995;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "🖖", "name": "vulcan salute", "shortname": ":vulcan_salute:", "unicode": "1F596", "html": "&#128406;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "🖕đŸŋ", "name": "middle finger: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F595 1F3FF", "html": "&#128405;&#127999;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "🖕🏾", "name": "middle finger: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F595 1F3FE", "html": "&#128405;&#127998;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "🖕đŸŊ", "name": "middle finger: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F595 1F3FD", "html": "&#128405;&#127997;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "🖕đŸŧ", "name": "middle finger: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F595 1F3FC", "html": "&#128405;&#127996;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "🖕đŸģ", "name": "middle finger: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F595 1F3FB", "html": "&#128405;&#127995;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "🖕", "name": "middle finger", "shortname": ":middle_finger:", "unicode": "1f595", "html": "&#128405;", "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": "&#128400;&#127999;", "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": "&#128400;&#127998;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "🖐đŸŊ", "name": "hand with fingers splayed: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F590 1F3FD", "html": "&#128400;&#127997;", "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": "&#128400;&#127996;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "🖐đŸģ", "name": "hand with fingers splayed: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F590 1F3FB", "html": "&#128400;&#127995;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "🖐", "name": "hand with fingers splayed", "shortname": ":hand_with_fingers_splayed:", "unicode": "1F590", "html": "&#128400;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "✍đŸŋ", "name": "writing hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "270D 1F3FF", "html": "&#9997;&#127999;", "category": "People & Body (hand-prop)", "order": ""},
+ {"emoji": "✍🏾", "name": "writing hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "270D 1F3FE", "html": "&#9997;&#127998;", "category": "People & Body (hand-prop)", "order": ""},
+ {"emoji": "✍đŸŊ", "name": "writing hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "270D 1F3FD", "html": "&#9997;&#127997;", "category": "People & Body (hand-prop)", "order": ""},
+ {"emoji": "✍đŸŧ", "name": "writing hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "270D 1F3FC", "html": "&#9997;&#127996;", "category": "People & Body (hand-prop)", "order": ""},
+ {"emoji": "✍đŸģ", "name": "writing hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "270D 1F3FB", "html": "&#9997;&#127995;", "category": "People & Body (hand-prop)", "order": ""},
+ {"emoji": "✍", "name": "writing hand", "shortname": ":writing_hand:", "unicode": "270d", "html": "&#9997;", "category": "People & Body (hand-prop)", "order": "1230"},
+ {"emoji": "đŸ•ļ", "name": "sunglasses", "shortname": ":dark_sunglasses:", "unicode": "1f576", "html": "&#128374;", "category": "Objects (clothing)", "order": "1315"},
+ {"emoji": "👁‍🗨", "name": "eye in speech bubble", "shortname": ":eye_speachbubble:", "unicode": "1F441 200D 1F5E8", "html": "&#128065;&zwj;&#128488;", "category": "Smileys & Emotion (emotion)", "order": ""},
+ {"emoji": "👁", "name": "eye", "shortname": ":eye:", "unicode": "1f441", "html": "&#128065;", "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": "&#127947;&#127999;&zwj;&#9792;", "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": "&#127947;&#127998;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏋đŸŊ‍♀", "name": "woman lifting weights: medium skin tone", "shortname": ":weightlifter_woman_mt:", "unicode": "1F3CB 1F3FD 200D 2640", "html": "&#127947;&#127997;&zwj;&#9792;", "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": "&#127947;&#127996;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏋đŸģ‍♀", "name": "woman lifting weights: light skin tone", "shortname": ":weightlifter_woman_lt:", "unicode": "1F3CB 1F3FB 200D 2640", "html": "&#127947;&#127995;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏋‍♀", "name": "woman lifting weights", "shortname": ":weightlifter_woman:", "unicode": "1F3CB 200D 2640", "html": "&#127947;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏋đŸŋ", "name": "person lifting weights: dark skin tone", "shortname": ":weightlifter_dt:", "unicode": "1F3CB 1F3FF", "html": "&#127947;&#127999;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏋🏾", "name": "person lifting weights: medium-dark skin tone", "shortname": ":weightlifter_mdt:", "unicode": "1F3CB 1F3FE", "html": "&#127947;&#127998;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏋đŸŊ", "name": "person lifting weights: medium skin tone", "shortname": ":weightlifter_mt:", "unicode": "1F3CB 1F3FD", "html": "&#127947;&#127997;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏋đŸŧ", "name": "person lifting weights: medium-light skin tone", "shortname": ":weightlifter_mlt:", "unicode": "1F3CB 1F3FC", "html": "&#127947;&#127996;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏋đŸģ", "name": "person lifting weights: light skin tone", "shortname": ":weightlifter_lt:", "unicode": "1F3CB 1F3FB", "html": "&#127947;&#127995;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏋", "name": "person lifting weights", "shortname": ":weightlifter:", "unicode": "1F3CB", "html": "&#127947;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "⛹đŸŋ‍♀", "name": "woman bouncing ball: dark skin tone", "shortname": ":basketballer_woman_dt:", "unicode": ":basketballer:", "html": "&#9977;&#127999;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "⛹🏾‍♀", "name": "woman bouncing ball: medium-dark skin tone", "shortname": ":basketballer_woman_mdt:", "unicode": ":basketballer:", "html": "&#9977;&#127998;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "⛹đŸŊ‍♀", "name": "woman bouncing ball: medium skin tone", "shortname": ":basketballer_woman_mt:", "unicode": ":basketballer:", "html": "&#9977;&#127997;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "⛹đŸŧ‍♀", "name": "woman bouncing ball: medium-light skin tone", "shortname": ":basketballer_woman_mlt:", "unicode": ":basketballer:", "html": "&#9977;&#127996;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "⛹đŸģ‍♀", "name": "woman bouncing ball: light skin tone", "shortname": ":basketballer_woman_lt:", "unicode": ":basketballer:", "html": "&#9977;&#127995;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "⛹‍♀", "name": "woman bouncing ball", "shortname": ":woman_bouncing_ball:", "unicode": ":basketballer_woman:", "html": "&#9977;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "⛹đŸŋ", "name": "person bouncing ball: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": ":basketballer_dt:", "html": "&#9977;&#127999;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "⛹🏾", "name": "person bouncing ball: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": ":basketballer_mdt:", "html": "&#9977;&#127998;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "⛹đŸŊ", "name": "person bouncing ball: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": ":basketballer_mt:", "html": "&#9977;&#127997;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "⛹đŸŧ", "name": "person bouncing ball: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": ":basketballer_mlt:", "html": "&#9977;&#127996;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "⛹đŸģ", "name": "person bouncing ball: light skin tone", "shortname": ":basketballer_lt:", "unicode": "26F9 1F3FB", "html": "&#9977;&#127995;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "⛹", "name": "person bouncing ball", "shortname": ":basketballer:", "unicode": "26F9", "html": "&#9977;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🕴", "name": "man in suit levitating", "shortname": ":man_in_suit:", "unicode": "1f574", "html": "&#128372;", "category": "People & Body (person-activity)", "order": "784"},
+ {"emoji": "🏌", "name": "person golfing", "shortname": ":golfer:", "unicode": "1f3cc", "html": "&#127948;", "category": "People & Body (person-sport)", "order": "782"},
+ {"emoji": "🏌‍♀", "name": "woman golfing", "shortname": ":golfer_woman:", "unicode": "1F3CC 200D 2640", "html": "&#127948;&zwj;&#9792;", "category": "People & Body (person-sport)", "order": "783"},
+ {"emoji": "*ī¸âƒŖ", "name": "keycap: #", "shortname": "*", "unicode": "0023 FE0F 20E3", "html": "&#42;", "category": "Symbols (keycap)", "order": "2118"},
+ {"emoji": "âŖī¸", "name": "heart exclamation", "shortname": ":heart_exclamation:", "unicode": "2763", "html": "&#10083;", "category": "Smileys & Emotion (emotion)", "order": "1300"},
+ {"emoji": "âœĄī¸", "name": "star of David", "shortname": ":star_of_david:", "unicode": "2721", "html": "&#10017;", "category": "Symbols (religion)", "order": "2026"},
+ {"emoji": "âœī¸", "name": "latin cross", "shortname": ":cross:", "unicode": "271d", "html": "&#10013;", "category": "Symbols (religion)", "order": "2029"},
+ {"emoji": "⚜", "name": "fleur-de-lis", "shortname": ":fleur-de-lis:", "unicode": "269c", "html": "&#9884;", "category": "Symbols (other-symbol)", "order": "2074"},
+ {"emoji": "⚛", "name": "atom symbol", "shortname": ":atom:", "unicode": "269b", "html": "&#9883;", "category": "Symbols (religion)", "order": "2024"},
+ {"emoji": "☸", "name": "wheel of dharma", "shortname": ":wheel_of_dharma:", "unicode": "2638", "html": "&#9784;", "category": "Symbols (religion)", "order": "2027"},
+ {"emoji": "☯", "name": "yin yang", "shortname": ":yin_yang:", "unicode": "262f", "html": "&#9775;", "category": "Symbols (religion)", "order": "2028"},
+ {"emoji": "☎", "name": "peace symbol", "shortname": ":peace:", "unicode": "262e", "html": "&#9774;", "category": "Symbols (religion)", "order": "2032"},
+ {"emoji": "â˜Ē", "name": "star and crescent", "shortname": ":star_and_crescent:", "unicode": "262a", "html": "&#9770;", "category": "Symbols (religion)", "order": "2031"},
+ {"emoji": "â˜Ļ", "name": "orthodox cross", "shortname": ":orthodox_cross:", "unicode": "2626", "html": "&#9766;", "category": "Symbols (religion)", "order": "2030"},
+ {"emoji": "â˜Ŗ", "name": "biohazard", "shortname": ":biohazard:", "unicode": "2623", "html": "&#9763;", "category": "Symbols (warning)", "order": "2001"},
+ {"emoji": "â˜ĸ", "name": "radioactive", "shortname": ":radioactive:", "unicode": "2622", "html": "&#9762;", "category": "Symbols (warning)", "order": "2000"},
+ {"emoji": "🛐", "name": "place of worship", "shortname": ":place_of_worship:", "unicode": "1f6d0", "html": "&#128720;", "category": "Symbols (religion)", "order": "2023"},
+ {"emoji": "đŸ—¯", "name": "right anger bubble", "shortname": ":anger_right:", "unicode": "1f5ef", "html": "&#128495;", "category": "Smileys & Emotion (emotion)", "order": "1311"},
+ {"emoji": "🕎", "name": "menorah", "shortname": ":menorah:", "unicode": "1f54e", "html": "&#128334;", "category": "Symbols (religion)", "order": "2033"},
+ {"emoji": "🕉", "name": "om", "shortname": ":om_symbol:", "unicode": "1f549", "html": "&#128329;", "category": "Symbols (religion)", "order": "2025"},
+ {"emoji": "⚱", "name": "funeral urn", "shortname": ":funeral_urn:", "unicode": "26B1", "html": "&#9905;", "category": "Objects (other-object)", "order": ""},
+ {"emoji": "⚰", "name": "coffin", "shortname": ":coffin:", "unicode": "26b0", "html": "&#9904;", "category": "Objects (other-object)", "order": "1970"},
+ {"emoji": "⚙", "name": "gear", "shortname": ":gear:", "unicode": "2699", "html": "&#9881;", "category": "Objects (tool)", "order": "1961"},
+ {"emoji": "⚗", "name": "alembic", "shortname": ":alembic:", "unicode": "2697", "html": "&#9879;", "category": "Objects (science)", "order": "1963"},
+ {"emoji": "⚖", "name": "balance scale", "shortname": ":scales:", "unicode": "2696", "html": "&#9878;", "category": "Objects (tool)", "order": "1964"},
+ {"emoji": "⚔", "name": "crossed swords", "shortname": ":crossed_swords:", "unicode": "2694", "html": "&#9876;", "category": "Objects (tool)", "order": "1955"},
+ {"emoji": "⌨", "name": "keyboard", "shortname": ":keyboard:", "unicode": "2328", "html": "&#9000;", "category": "Objects (computer)", "order": "1849"},
+ {"emoji": "đŸ›ĸ", "name": "oil drum", "shortname": ":oil_drum:", "unicode": "1F6E2", "html": "&#128738;", "category": "Travel & Places (transport-ground)", "order": ""},
+ {"emoji": "🛡", "name": "shield", "shortname": ":shield:", "unicode": "1f6e1", "html": "&#128737;", "category": "Objects (tool)", "order": "1958"},
+ {"emoji": "🛠", "name": "hammer and wrench", "shortname": ":hammer_and_wrench:", "unicode": "1F6E0", "html": "&#128736;", "category": "Objects (tool)", "order": ""},
+ {"emoji": "🛏", "name": "bed", "shortname": ":bed:", "unicode": "1f6cf", "html": "&#128719;", "category": "Objects (household)", "order": "1669"},
+ {"emoji": "🛎", "name": "bellhop bell", "shortname": ":bellhop_bell:", "unicode": "1F6CE", "html": "&#128718;", "category": "Travel & Places (hotel)", "order": ""},
+ {"emoji": "🛍", "name": "shopping bags", "shortname": ":shopping_bags:", "unicode": "1f6cd", "html": "&#128717;", "category": "Objects (clothing)", "order": "1326"},
+ {"emoji": "🛌", "name": "person in bed", "shortname": ":sleeping_accommodation:", "unicode": "1f6cc", "html": "&#128716;", "category": "People & Body (person-resting)", "order": "1663"},
+ {"emoji": "🛋", "name": "couch and lamp", "shortname": ":couch_and_lamp:", "unicode": "1F6CB", "html": "&#128715;", "category": "Objects (household)", "order": ""},
+ {"emoji": "đŸ—ŗ", "name": "ballot box with ballot", "shortname": ":ballot_box:", "unicode": "1f5f3", "html": "&#128499;", "category": "Objects (mail)", "order": "1913"},
+ {"emoji": "🗡", "name": "dagger", "shortname": ":dagger:", "unicode": "1F5E1", "html": "&#128481;", "category": "Objects (tool)", "order": ""},
+ {"emoji": "🗞", "name": "rolled-up newspaper", "shortname": ":rolledup_newspaper:", "unicode": "1F5DE", "html": "&#128478;", "category": "Objects (book-paper)", "order": ""},
+ {"emoji": "🗝", "name": "old key", "shortname": ":old_key:", "unicode": "1F5DD", "html": "&#128477;", "category": "Objects (lock)", "order": ""},
+ {"emoji": "🗜", "name": "clamp", "shortname": ":compression:", "unicode": "1f5dc", "html": "&#128476;", "category": "Objects (tool)", "order": "1962"},
+ {"emoji": "🗓", "name": "spiral calendar", "shortname": ":spiral_calendar:", "unicode": "1F5D3", "html": "&#128467;", "category": "Objects (office)", "order": ""},
+ {"emoji": "🗒", "name": "spiral notepad", "shortname": ":spiral_notepad:", "unicode": "1F5D2", "html": "&#128466;", "category": "Objects (office)", "order": ""},
+ {"emoji": "🗑", "name": "wastebasket", "shortname": ":wastebasket:", "unicode": "1f5d1", "html": "&#128465;", "category": "Objects (office)", "order": "1943"},
+ {"emoji": "🗄", "name": "file cabinet", "shortname": ":file_cabinet:", "unicode": "1f5c4", "html": "&#128452;", "category": "Objects (office)", "order": "1942"},
+ {"emoji": "🗃", "name": "card file box", "shortname": ":card_file_box:", "unicode": "1F5C3", "html": "&#128451;", "category": "Objects (office)", "order": ""},
+ {"emoji": "🗂", "name": "card index dividers", "shortname": ":card_index_dividers:", "unicode": "1F5C2", "html": "&#128450;", "category": "Objects (office)", "order": ""},
+ {"emoji": "đŸ–ŧ", "name": "framed picture", "shortname": ":framed_picture:", "unicode": "1F5BC", "html": "&#128444;", "category": "Activities (arts & crafts)", "order": ""},
+ {"emoji": "🖲", "name": "trackball", "shortname": ":trackball:", "unicode": "1f5b2", "html": "&#128434;", "category": "Objects (computer)", "order": "1851"},
+ {"emoji": "🖱", "name": "computer mouse", "shortname": ":computer_mouse:", "unicode": "1F5B1", "html": "&#128433;", "category": "Objects (computer)", "order": ""},
+ {"emoji": "🖨", "name": "printer", "shortname": ":printer:", "unicode": "1f5a8", "html": "&#128424;", "category": "Objects (computer)", "order": "1848"},
+ {"emoji": "đŸ–Ĩ", "name": "desktop computer", "shortname": ":desktop_computer:", "unicode": "1F5A5", "html": "&#128421;", "category": "Objects (computer)", "order": ""},
+ {"emoji": "🖍", "name": "crayon", "shortname": ":crayon:", "unicode": "1F58D", "html": "&#128397;", "category": "Objects (writing)", "order": ""},
+ {"emoji": "🖌", "name": "paintbrush", "shortname": ":paintbrush:", "unicode": "1F58C", "html": "&#128396;", "category": "Objects (writing)", "order": ""},
+ {"emoji": "🖋", "name": "fountain pen", "shortname": ":fountain_pen:", "unicode": "1F58B", "html": "&#128395;", "category": "Objects (writing)", "order": ""},
+ {"emoji": "🖊", "name": "pen", "shortname": ":pen:", "unicode": "1F58A", "html": "&#128394;", "category": "Objects (writing)", "order": ""},
+ {"emoji": "🖇", "name": "linked paperclips", "shortname": ":linked_paperclips:", "unicode": "1F587", "html": "&#128391;", "category": "Objects (office)", "order": ""},
+ {"emoji": "🕹", "name": "joystick", "shortname": ":joystick:", "unicode": "1f579", "html": "&#128377;", "category": "Activities (game)", "order": "1805"},
+ {"emoji": "đŸ•ŗ", "name": "hole", "shortname": ":hole:", "unicode": "1f573", "html": "&#128371;", "category": "Smileys & Emotion (emotion)", "order": "1313"},
+ {"emoji": "🕰", "name": "mantelpiece clock", "shortname": ":mantelpiece_clock:", "unicode": "1F570", "html": "&#128368;", "category": "Travel & Places (time)", "order": ""},
+ {"emoji": "đŸ•¯", "name": "candle", "shortname": ":candle:", "unicode": "1f56f", "html": "&#128367;", "category": "Objects (light & video)", "order": "1870"},
+ {"emoji": "đŸ“ŋ", "name": "prayer beads", "shortname": ":prayer_beads:", "unicode": "1f4ff", "html": "&#128255;", "category": "Objects (clothing)", "order": "1338"},
+ {"emoji": "đŸ“Ŋ", "name": "film projector", "shortname": ":film_projector:", "unicode": "1F4FD", "html": "&#128253;", "category": "Objects (light & video)", "order": ""},
+ {"emoji": "📸", "name": "camera with flash", "shortname": ":camera_with_flash:", "unicode": "1f4f8", "html": "&#128248;", "category": "Objects (light & video)", "order": "1862"},
+ {"emoji": "đŸē", "name": "amphora", "shortname": ":amphora:", "unicode": "1f3fa", "html": "&#127994;", "category": "Food & Drink (dishware)", "order": "1537"},
+ {"emoji": "🏷", "name": "label", "shortname": ":label:", "unicode": "1f3f7", "html": "&#127991;", "category": "Objects (book-paper)", "order": "1890"},
+ {"emoji": "🏴", "name": "black flag", "shortname": ":flag_black:", "unicode": "1f3f4", "html": "&#127988;", "category": "Flags (flag)", "order": "2184"},
+ {"emoji": "đŸŗ", "name": "white flag", "shortname": ":flag_white:", "unicode": "1f3f3", "html": "&#127987;", "category": "Flags (flag)", "order": "2185"},
+ {"emoji": "🎞", "name": "film frames", "shortname": ":film_frames:", "unicode": "1f39e", "html": "&#127902;", "category": "Objects (light & video)", "order": "1857"},
+ {"emoji": "🎛", "name": "control knobs", "shortname": ":control_knobs:", "unicode": "1f39b", "html": "&#127899;", "category": "Objects (music)", "order": "1828"},
+ {"emoji": "🎚", "name": "level slider", "shortname": ":level_slider:", "unicode": "1f39a", "html": "&#127898;", "category": "Objects (music)", "order": "1827"},
+ {"emoji": "🎙", "name": "studio microphone", "shortname": ":studio_microphone:", "unicode": "1F399", "html": "&#127897;", "category": "Objects (music)", "order": ""},
+ {"emoji": "🌡", "name": "thermometer", "shortname": ":thermometer:", "unicode": "1f321", "html": "&#127777;", "category": "Travel & Places (sky & weather)", "order": "1723"},
+ {"emoji": "đŸ›ŗ", "name": "passenger ship", "shortname": ":passenger_ship:", "unicode": "1F6F3", "html": "&#128755;", "category": "Travel & Places (transport-water)", "order": ""},
+ {"emoji": "🛰", "name": "satellite", "shortname": ":satellite:", "unicode": "1F6F0", "html": "&#128752;", "category": "Travel & Places (transport-air)", "order": ""},
+ {"emoji": "đŸ›Ŧ", "name": "airplane arrival", "shortname": ":airplane_arriving:", "unicode": "1f6ec", "html": "&#128748;", "category": "Travel & Places (transport-air)", "order": "1653"},
+ {"emoji": "đŸ›Ģ", "name": "airplane departure", "shortname": ":airplane_departure:", "unicode": "1f6eb", "html": "&#128747;", "category": "Travel & Places (transport-air)", "order": "1652"},
+ {"emoji": "🛩", "name": "small airplane", "shortname": ":small_airplane:", "unicode": "1F6E9", "html": "&#128745;", "category": "Travel & Places (transport-air)", "order": ""},
+ {"emoji": "đŸ›Ĩ", "name": "motor boat", "shortname": ":motor_boat:", "unicode": "1F6E5", "html": "&#128741;", "category": "Travel & Places (transport-water)", "order": ""},
+ {"emoji": "🛤", "name": "railway track", "shortname": ":railway_track:", "unicode": "1f6e4", "html": "&#128740;", "category": "Travel & Places (transport-ground)", "order": "1635"},
+ {"emoji": "đŸ›Ŗ", "name": "motorway", "shortname": ":motorway:", "unicode": "1f6e3", "html": "&#128739;", "category": "Travel & Places (transport-ground)", "order": "1634"},
+ {"emoji": "đŸ—ē", "name": "world map", "shortname": ":world_map:", "unicode": "1F5FA", "html": "&#128506;", "category": "Travel & Places (place-map)", "order": ""},
+ {"emoji": "🕍", "name": "synagogue", "shortname": ":synagogue:", "unicode": "1f54d", "html": "&#128333;", "category": "Travel & Places (place-religious)", "order": "1579"},
+ {"emoji": "🕌", "name": "mosque", "shortname": ":mosque:", "unicode": "1f54c", "html": "&#128332;", "category": "Travel & Places (place-religious)", "order": "1578"},
+ {"emoji": "🕋", "name": "kaaba", "shortname": ":kaaba:", "unicode": "1f54b", "html": "&#128331;", "category": "Travel & Places (place-religious)", "order": "1581"},
+ {"emoji": "🏟", "name": "stadium", "shortname": ":stadium:", "unicode": "1f3df", "html": "&#127967;", "category": "Travel & Places (place-building)", "order": "1553"},
+ {"emoji": "🏞", "name": "national park", "shortname": ":national_park:", "unicode": "1F3DE", "html": "&#127966;", "category": "Travel & Places (place-geographic)", "order": ""},
+ {"emoji": "🏝", "name": "desert island", "shortname": ":desert_island:", "unicode": "1F3DD", "html": "&#127965;", "category": "Travel & Places (place-geographic)", "order": ""},
+ {"emoji": "🏜", "name": "desert", "shortname": ":desert:", "unicode": "1f3dc", "html": "&#127964;", "category": "Travel & Places (place-geographic)", "order": "1550"},
+ {"emoji": "🏛", "name": "classical building", "shortname": ":classical_building:", "unicode": "1f3db", "html": "&#127963;", "category": "Travel & Places (place-building)", "order": "1554"},
+ {"emoji": "🏚", "name": "derelict house", "shortname": ":derelict_house:", "unicode": "1F3DA", "html": "&#127962;", "category": "Travel & Places (place-building)", "order": ""},
+ {"emoji": "🏙", "name": "cityscape", "shortname": ":cityscape:", "unicode": "1f3d9", "html": "&#127961;", "category": "Travel & Places (place-other)", "order": "1557"},
+ {"emoji": "🏘", "name": "houses", "shortname": ":houses:", "unicode": "1F3D8", "html": "&#127960;", "category": "Travel & Places (place-building)", "order": ""},
+ {"emoji": "🏗", "name": "building construction", "shortname": ":building_construction:", "unicode": "1F3D7", "html": "&#127959;", "category": "Travel & Places (place-building)", "order": ""},
+ {"emoji": "🏖", "name": "beach with umbrella", "shortname": ":beach_with_umbrella:", "unicode": "1F3D6", "html": "&#127958;", "category": "Travel & Places (place-geographic)", "order": ""},
+ {"emoji": "🏕", "name": "camping", "shortname": ":camping:", "unicode": "1f3d5", "html": "&#127957;", "category": "Travel & Places (place-geographic)", "order": "1548"},
+ {"emoji": "🏔", "name": "snow-capped mountain", "shortname": ":snowcapped_mountain:", "unicode": "1F3D4", "html": "&#127956;", "category": "Travel & Places (place-geographic)", "order": ""},
+ {"emoji": "🏎", "name": "racing car", "shortname": ":racing_car:", "unicode": "1F3CE", "html": "&#127950;", "category": "Travel & Places (transport-ground)", "order": ""},
+ {"emoji": "🏍", "name": "motorcycle", "shortname": ":motorcycle:", "unicode": "1F3CD", "html": "&#127949;", "category": "Travel & Places (transport-ground)", "order": ""},
+ {"emoji": "🏹", "name": "bow and arrow", "shortname": ":bow_and_arrow:", "unicode": "1f3f9", "html": "&#127993;", "category": "Objects (tool)", "order": "1957"},
+ {"emoji": "🏸", "name": "badminton", "shortname": ":badminton:", "unicode": "1F3F8", "html": "&#127992;", "category": "Activities (sport)", "order": ""},
+ {"emoji": "đŸĩ", "name": "rosette", "shortname": ":rosette:", "unicode": "1f3f5", "html": "&#127989;", "category": "Animals & Nature (plant-flower)", "order": "1430"},
+ {"emoji": "🏓", "name": "ping pong", "shortname": ":ping_pong:", "unicode": "1F3D3", "html": "&#127955;", "category": "Activities (sport)", "order": ""},
+ {"emoji": "🏒", "name": "ice hockey", "shortname": ":ice_hockey:", "unicode": "1F3D2", "html": "&#127954;", "category": "Activities (sport)", "order": ""},
+ {"emoji": "🏑", "name": "field hockey", "shortname": ":field_hockey:", "unicode": "1F3D1", "html": "&#127953;", "category": "Activities (sport)", "order": ""},
+ {"emoji": "🏐", "name": "volleyball", "shortname": ":volleyball:", "unicode": "1f3d0", "html": "&#127952;", "category": "Activities (sport)", "order": "1784"},
+ {"emoji": "🏏", "name": "cricket game", "shortname": ":cricket_game:", "unicode": "1F3CF", "html": "&#127951;", "category": "Activities (sport)", "order": ""},
+ {"emoji": "🏅", "name": "sports medal", "shortname": ":medal:", "unicode": "1f3c5", "html": "&#127941;", "category": "Activities (award-medal)", "order": "1777"},
+ {"emoji": "🎟", "name": "admission tickets", "shortname": ":admission_tickets:", "unicode": "1F39F", "html": "&#127903;", "category": "Activities (event)", "order": ""},
+ {"emoji": "🎗", "name": "reminder ribbon", "shortname": ":reminder_ribbon:", "unicode": "1f397", "html": "&#127895;", "category": "Activities (event)", "order": "1772"},
+ {"emoji": "🎖", "name": "military medal", "shortname": ":military_medal:", "unicode": "1F396", "html": "&#127894;", "category": "Activities (award-medal)", "order": ""},
+ {"emoji": "🧀", "name": "cheese wedge", "shortname": ":cheese_wedge:", "unicode": "1F9C0", "html": "&#129472;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "đŸŋ", "name": "popcorn", "shortname": ":popcorn:", "unicode": "1f37f", "html": "&#127871;", "category": "Food & Drink (food-prepared)", "order": "1494"},
+ {"emoji": "🍾", "name": "bottle with popping cork", "shortname": ":champagne:", "unicode": "1f37e", "html": "&#127870;", "category": "Food & Drink (drink)", "order": "1525"},
+ {"emoji": "đŸŊ", "name": "fork and knife with plate", "shortname": ":fork_and_knife_with_plate:", "unicode": "1F37D", "html": "&#127869;", "category": "Food & Drink (dishware)", "order": ""},
+ {"emoji": "đŸŒļ", "name": "hot pepper", "shortname": ":hot_pepper:", "unicode": "1f336", "html": "&#127798;", "category": "Food & Drink (food-vegetable)", "order": "1469"},
+ {"emoji": "đŸŒ¯", "name": "burrito", "shortname": ":burrito:", "unicode": "1f32f", "html": "&#127791;", "category": "Food & Drink (food-prepared)", "order": "1487"},
+ {"emoji": "🌮", "name": "taco", "shortname": ":taco:", "unicode": "1f32e", "html": "&#127790;", "category": "Food & Drink (food-prepared)", "order": "1486"},
+ {"emoji": "🌭", "name": "hot dog", "shortname": ":hotdog:", "unicode": "1f32d", "html": "&#127789;", "category": "Food & Drink (food-prepared)", "order": "1485"},
+ {"emoji": "☘", "name": "shamrock", "shortname": ":shamrock:", "unicode": "2618", "html": "&#9752;", "category": "Animals & Nature (plant-other)", "order": "1444"},
+ {"emoji": "☄", "name": "comet", "shortname": ":comet:", "unicode": "2604", "html": "&#9732;", "category": "Travel & Places (sky & weather)", "order": "1752"},
+ {"emoji": "â˜ƒī¸", "name": "snowman", "shortname": ":snowman:", "unicode": "2603 FE0F", "html": "&#9731;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "â˜‚ī¸", "name": "umbrella", "shortname": ":umbrella:", "unicode": "2602 FE0F", "html": "&#9730;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "đŸĻ„", "name": "unicorn", "shortname": ":unicorn:", "unicode": "1F984", "html": "&#129412;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸĻƒ", "name": "turkey", "shortname": ":turkey:", "unicode": "1f983", "html": "&#129411;", "category": "Animals & Nature (animal-bird)", "order": "1387"},
+ {"emoji": "đŸĻ‚", "name": "scorpion", "shortname": ":scorpion:", "unicode": "1f982", "html": "&#129410;", "category": "Animals & Nature (animal-bug)", "order": "1426"},
+ {"emoji": "đŸĻ", "name": "lion", "shortname": ":lion_face:", "unicode": "1f981", "html": "&#129409;", "category": "Animals & Nature (animal-mammal)", "order": "1352"},
+ {"emoji": "đŸĻ€", "name": "crab", "shortname": ":crab:", "unicode": "1f980", "html": "&#129408;", "category": "Food & Drink (food-marine)", "order": "1415"},
+ {"emoji": "🕸", "name": "spider web", "shortname": ":spider_web:", "unicode": "1f578", "html": "&#128376;", "category": "Animals & Nature (animal-bug)", "order": "1425"},
+ {"emoji": "🕷", "name": "spider", "shortname": ":spider:", "unicode": "1f577", "html": "&#128375;", "category": "Animals & Nature (animal-bug)", "order": "1424"},
+ {"emoji": "🕊", "name": "dove", "shortname": ":dove:", "unicode": "1F54A", "html": "&#128330;", "category": "Animals & Nature (animal-bird)", "order": ""},
+ {"emoji": "đŸŋ", "name": "chipmunk", "shortname": ":chipmunk:", "unicode": "1f43f", "html": "&#128063;", "category": "Animals & Nature (animal-mammal)", "order": "1381"},
+ {"emoji": "đŸŒŦ", "name": "wind face", "shortname": ":wind_blowing_face:", "unicode": "1f32c", "html": "&#127788;", "category": "Travel & Places (sky & weather)", "order": "1741"},
+ {"emoji": "đŸŒĢ", "name": "fog", "shortname": ":fog:", "unicode": "1f32b", "html": "&#127787;", "category": "Travel & Places (sky & weather)", "order": "1740"},
+ {"emoji": "đŸŒĒ", "name": "tornado", "shortname": ":tornado:", "unicode": "1F32A", "html": "&#127786;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "🌩", "name": "cloud with lightning", "shortname": ":cloud_with_lightning:", "unicode": "1F329", "html": "&#127785;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "🌨", "name": "cloud with snow", "shortname": ":cloud_with_snow:", "unicode": "1F328", "html": "&#127784;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "🌧", "name": "cloud with rain", "shortname": ":cloud_with_rain:", "unicode": "1F327", "html": "&#127783;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "đŸŒĻ", "name": "sun behind rain cloud", "shortname": ":sun_behind_rain_cloud:", "unicode": "1F326", "html": "&#127782;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "đŸŒĨ", "name": "sun behind large cloud", "shortname": ":sun_behind_large_cloud:", "unicode": "1F325", "html": "&#127781;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "🌤", "name": "sun behind small cloud", "shortname": ":sun_behind_small_cloud:", "unicode": "1F324", "html": "&#127780;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "đŸ—Ŗ", "name": "speaking head", "shortname": ":speaking_head:", "unicode": "1F5E3", "html": "&#128483;", "category": "People & Body (person-symbol)", "order": ""},
+ {"emoji": "âē", "name": "record button", "shortname": ":record_button:", "unicode": "23FA", "html": "&#9210;", "category": "Symbols (av-symbol)", "order": ""},
+ {"emoji": "⏚", "name": "stop button", "shortname": ":stop_button:", "unicode": "23F9", "html": "&#9209;", "category": "Symbols (av-symbol)", "order": ""},
+ {"emoji": "⏸", "name": "pause button", "shortname": ":pause_button:", "unicode": "23F8", "html": "&#9208;", "category": "Symbols (av-symbol)", "order": ""},
+ {"emoji": "⏯", "name": "play or pause button", "shortname": ":play_pause:", "unicode": "23ef", "html": "&#9199;", "category": "Symbols (av-symbol)", "order": "2054"},
+ {"emoji": "⏎", "name": "last track button", "shortname": ":track_previous:", "unicode": "23ee", "html": "&#9198;", "category": "Symbols (av-symbol)", "order": "2057"},
+ {"emoji": "⏭", "name": "next track button", "shortname": ":track_next:", "unicode": "23ed", "html": "&#9197;", "category": "Symbols (av-symbol)", "order": "2053"},
+ {"emoji": "⛱", "name": "umbrella on ground", "shortname": ":beach_umbrella:", "unicode": "26f1", "html": "&#9969;", "category": "Travel & Places (sky & weather)", "order": "1747"},
+ {"emoji": "⛓", "name": "chains", "shortname": ":chains:", "unicode": "26d3", "html": "&#9939;", "category": "Objects (tool)", "order": "1966"},
+ {"emoji": "⛏", "name": "pick", "shortname": ":pick:", "unicode": "26cf", "html": "&#9935;", "category": "Objects (tool)", "order": "1951"},
+ {"emoji": "⚒", "name": "hammer and pick", "shortname": ":hammer_and_pick:", "unicode": "2692", "html": "&#9874;", "category": "Objects (tool)", "order": ""},
+ {"emoji": "⏲", "name": "timer clock", "shortname": ":timer_clock:", "unicode": "23F2", "html": "&#9202;", "category": "Travel & Places (time)", "order": ""},
+ {"emoji": "⏱", "name": "stopwatch", "shortname": ":stopwatch:", "unicode": "23f1", "html": "&#9201;", "category": "Travel & Places (time)", "order": "1684"},
+ {"emoji": "⛴", "name": "ferry", "shortname": ":ferry:", "unicode": "26f4", "html": "&#9972;", "category": "Travel & Places (transport-water)", "order": "1647"},
+ {"emoji": "⛰", "name": "mountain", "shortname": ":mountain:", "unicode": "26f0", "html": "&#9968;", "category": "Travel & Places (place-geographic)", "order": "1545"},
+ {"emoji": "⛩", "name": "shinto shrine", "shortname": ":shinto_shrine:", "unicode": "2.6E+10", "html": "&#9961;", "category": "Travel & Places (place-religious)", "order": "1580"},
+ {"emoji": "⛸", "name": "ice skate", "shortname": ":ice_skate:", "unicode": "26f8", "html": "&#9976;", "category": "Activities (sport)", "order": "1800"},
+ {"emoji": "⛷", "name": "skier", "shortname": ":skier:", "unicode": "26f7", "html": "&#9975;", "category": "People & Body (person-sport)", "order": "775"},
+ {"emoji": "⛈", "name": "cloud with lightning and rain", "shortname": ":cloud_with_lightning_and_rain:", "unicode": "26C8", "html": "&#9928;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "⛑", "name": "rescue worker’s helmet", "shortname": ":rescue_worker’s_helmet:", "unicode": "26D1", "html": "&#9937;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "đŸ‡Ļ🇨", "name": "flag: Ascension Island", "shortname": ":flag_ac:", "unicode": "1f1e6-1f1e8", "html": "&#127462;&#127464;", "category": "Flags (country-flag)", "order": "2187"},
+ {"emoji": "đŸ‡Ļ🇩", "name": "flag: Andorra", "shortname": ":flag_ad:", "unicode": "1f1e6-1f1e9", "html": "&#127462;&#127465;", "category": "Flags (country-flag)", "order": "2188"},
+ {"emoji": "đŸ‡ĻđŸ‡Ē", "name": "flag: United Arab Emirates", "shortname": ":flag_ae:", "unicode": "1f1e6-1f1ea", "html": "&#127462;&#127466;", "category": "Flags (country-flag)", "order": "2189"},
+ {"emoji": "đŸ‡ĻđŸ‡Ģ", "name": "flag: Afghanistan", "shortname": ":flag_af:", "unicode": "1f1e6-1f1eb", "html": "&#127462;&#127467;", "category": "Flags (country-flag)", "order": "2190"},
+ {"emoji": "đŸ‡ĻđŸ‡Ŧ", "name": "flag: Antigua & Barbuda", "shortname": ":flag_ag:", "unicode": "1f1e6-1f1ec", "html": "&#127462;&#127468;", "category": "Flags (country-flag)", "order": "2191"},
+ {"emoji": "đŸ‡Ļ🇮", "name": "flag: Anguilla", "shortname": ":flag_ai:", "unicode": "1f1e6-1f1ee", "html": "&#127462;&#127470;", "category": "Flags (country-flag)", "order": "2192"},
+ {"emoji": "đŸ‡Ļ🇱", "name": "flag: Albania", "shortname": ":flag_al:", "unicode": "1f1e6-1f1f1", "html": "&#127462;&#127473;", "category": "Flags (country-flag)", "order": "2193"},
+ {"emoji": "đŸ‡Ļ🇲", "name": "flag: Armenia", "shortname": ":flag_am:", "unicode": "1f1e6-1f1f2", "html": "&#127462;&#127474;", "category": "Flags (country-flag)", "order": "2194"},
+ {"emoji": "đŸ‡Ļ🇴", "name": "flag: Angola", "shortname": ":flag-ao:", "unicode": "1f1e6-1f1f4", "html": "&#127462;&#127476;", "category": "Flags (country-flag)", "order": "2195"},
+ {"emoji": "đŸ‡ĻđŸ‡ļ", "name": "flag: Antarctica", "shortname": ":flag-aq:", "unicode": "1f1e6-1f1f6", "html": "&#127462;&#127478;", "category": "Flags (country-flag)", "order": "2196"},
+ {"emoji": "đŸ‡Ļ🇷", "name": "flag: Argentina", "shortname": ":flag-ar:", "unicode": "1f1e6-1f1f7", "html": "&#127462;&#127479;", "category": "Flags (country-flag)", "order": "2197"},
+ {"emoji": "đŸ‡Ļ🇸", "name": "flag: American Samoa", "shortname": ":flag-as:", "unicode": "1f1e6-1f1f8", "html": "&#127462;&#127480;", "category": "Flags (country-flag)", "order": "2198"},
+ {"emoji": "đŸ‡Ļ🇹", "name": "flag: Austria", "shortname": ":flag-at:", "unicode": "1f1e6-1f1f9", "html": "&#127462;&#127481;", "category": "Flags (country-flag)", "order": "2199"},
+ {"emoji": "đŸ‡ĻđŸ‡ē", "name": "flag: Australia", "shortname": ":flag-au:", "unicode": "1f1e6-1f1fa", "html": "&#127462;&#127482;", "category": "Flags (country-flag)", "order": "2200"},
+ {"emoji": "đŸ‡ĻđŸ‡ŧ", "name": "flag: Aruba", "shortname": ":flag-aw:", "unicode": "1f1e6-1f1fc", "html": "&#127462;&#127484;", "category": "Flags (country-flag)", "order": "2201"},
+ {"emoji": "đŸ‡ĻđŸ‡Ŋ", "name": "flag: Åland Islands", "shortname": ":flag-ax:", "unicode": "1f1e6-1f1fd", "html": "&#127462;&#127485;", "category": "Flags (country-flag)", "order": "2202"},
+ {"emoji": "đŸ‡ĻđŸ‡ŋ", "name": "flag: Azerbaijan", "shortname": ":flag-az:", "unicode": "1f1e6-1f1ff", "html": "&#127462;&#127487;", "category": "Flags (country-flag)", "order": "2203"},
+ {"emoji": "🇧đŸ‡Ļ", "name": "flag: Bosnia & Herzegovina", "shortname": ":flag-ba:", "unicode": "1f1e7-1f1e6", "html": "&#127463;&#127462;", "category": "Flags (country-flag)", "order": "2204"},
+ {"emoji": "🇧🇧", "name": "flag: Barbados", "shortname": ":flag-bb:", "unicode": "1f1e7-1f1e7", "html": "&#127463;&#127463;", "category": "Flags (country-flag)", "order": "2205"},
+ {"emoji": "🇧🇩", "name": "flag: Bangladesh", "shortname": ":flag-bd:", "unicode": "1f1e7-1f1e9", "html": "&#127463;&#127465;", "category": "Flags (country-flag)", "order": "2206"},
+ {"emoji": "🇧đŸ‡Ē", "name": "flag: Belgium", "shortname": ":flag-be:", "unicode": "1f1e7-1f1ea", "html": "&#127463;&#127466;", "category": "Flags (country-flag)", "order": "2207"},
+ {"emoji": "🇧đŸ‡Ģ", "name": "flag: Burkina Faso", "shortname": ":flag-bf:", "unicode": "1f1e7-1f1eb", "html": "&#127463;&#127467;", "category": "Flags (country-flag)", "order": "2208"},
+ {"emoji": "🇧đŸ‡Ŧ", "name": "flag: Bulgaria", "shortname": ":flag-bg:", "unicode": "1f1e7-1f1ec", "html": "&#127463;&#127468;", "category": "Flags (country-flag)", "order": "2209"},
+ {"emoji": "🇧🇭", "name": "flag: Bahrain", "shortname": ":flag-bh:", "unicode": "1f1e7-1f1ed", "html": "&#127463;&#127469;", "category": "Flags (country-flag)", "order": "2210"},
+ {"emoji": "🇧🇮", "name": "flag: Burundi", "shortname": ":flag-bi:", "unicode": "1f1e7-1f1ee", "html": "&#127463;&#127470;", "category": "Flags (country-flag)", "order": "2211"},
+ {"emoji": "đŸ‡§đŸ‡¯", "name": "flag: Benin", "shortname": ":flag-bj:", "unicode": "1f1e7-1f1ef", "html": "&#127463;&#127471;", "category": "Flags (country-flag)", "order": "2212"},
+ {"emoji": "🇧🇱", "name": "flag: St. BarthÊlemy", "shortname": ":flag-bl:", "unicode": "1f1e7-1f1f1", "html": "&#127463;&#127473;", "category": "Flags (country-flag)", "order": "2213"},
+ {"emoji": "🇧🇲", "name": "flag: Bermuda", "shortname": ":flag-bm:", "unicode": "1f1e7-1f1f2", "html": "&#127463;&#127474;", "category": "Flags (country-flag)", "order": "2214"},
+ {"emoji": "đŸ‡§đŸ‡ŗ", "name": "flag: Brunei", "shortname": ":flag-bn:", "unicode": "1f1e7-1f1f3", "html": "&#127463;&#127475;", "category": "Flags (country-flag)", "order": "2215"},
+ {"emoji": "🇧🇴", "name": "flag: Bolivia", "shortname": ":flag-bo:", "unicode": "1f1e7-1f1f4", "html": "&#127463;&#127476;", "category": "Flags (country-flag)", "order": "2216"},
+ {"emoji": "🇧đŸ‡ļ", "name": "flag: Caribbean Netherlands", "shortname": ":flag-bq:", "unicode": "1f1e7-1f1f6", "html": "&#127463;&#127478;", "category": "Flags (country-flag)", "order": "2217"},
+ {"emoji": "🇧🇷", "name": "flag: Brazil", "shortname": ":flag-br:", "unicode": "1f1e7-1f1f7", "html": "&#127463;&#127479;", "category": "Flags (country-flag)", "order": "2218"},
+ {"emoji": "🇧🇸", "name": "flag: Bahamas", "shortname": ":flag-bs:", "unicode": "1f1e7-1f1f8", "html": "&#127463;&#127480;", "category": "Flags (country-flag)", "order": "2219"},
+ {"emoji": "🇧🇹", "name": "flag: Bhutan", "shortname": ":flag-bt:", "unicode": "1f1e7-1f1f9", "html": "&#127463;&#127481;", "category": "Flags (country-flag)", "order": "2220"},
+ {"emoji": "🇧đŸ‡ģ", "name": "flag: Bouvet Island", "shortname": ":flag-bv:", "unicode": "1f1e7-1f1fb", "html": "&#127463;&#127483;", "category": "Flags (country-flag)", "order": "2221"},
+ {"emoji": "🇧đŸ‡ŧ", "name": "flag: Botswana", "shortname": ":flag-bw:", "unicode": "1f1e7-1f1fc", "html": "&#127463;&#127484;", "category": "Flags (country-flag)", "order": "2222"},
+ {"emoji": "🇧🇾", "name": "flag: Belarus", "shortname": ":flag-by:", "unicode": "1f1e7-1f1fe", "html": "&#127463;&#127486;", "category": "Flags (country-flag)", "order": "2223"},
+ {"emoji": "🇧đŸ‡ŋ", "name": "flag: Belize", "shortname": ":flag-bz:", "unicode": "1f1e7-1f1ff", "html": "&#127463;&#127487;", "category": "Flags (country-flag)", "order": "2224"},
+ {"emoji": "🇨đŸ‡Ļ", "name": "flag: Canada", "shortname": ":flag-ca:", "unicode": "1f1e8-1f1e6", "html": "&#127464;&#127462;", "category": "Flags (country-flag)", "order": "2225"},
+ {"emoji": "🇨🇨", "name": "flag: Cocos (Keeling) Islands", "shortname": ":flag-cc:", "unicode": "1f1e8-1f1e8", "html": "&#127464;&#127464;", "category": "Flags (country-flag)", "order": "2226"},
+ {"emoji": "🇨🇩", "name": "flag: Congo - Kinshasa", "shortname": ":flag-cd:", "unicode": "1f1e8-1f1e9", "html": "&#127464;&#127465;", "category": "Flags (country-flag)", "order": "2227"},
+ {"emoji": "🇨đŸ‡Ģ", "name": "flag: Central African Republic", "shortname": ":flag-cf:", "unicode": "1f1e8-1f1eb", "html": "&#127464;&#127467;", "category": "Flags (country-flag)", "order": "2228"},
+ {"emoji": "🇨đŸ‡Ŧ", "name": "flag: Congo - Brazzaville", "shortname": ":flag-cg:", "unicode": "1f1e8-1f1ec", "html": "&#127464;&#127468;", "category": "Flags (country-flag)", "order": "2229"},
+ {"emoji": "🇨🇭", "name": "flag: Switzerland", "shortname": ":flag-ch:", "unicode": "1f1e8-1f1ed", "html": "&#127464;&#127469;", "category": "Flags (country-flag)", "order": "2230"},
+ {"emoji": "🇨🇮", "name": "flag: Côte d’Ivoire", "shortname": ":flag-ci:", "unicode": "1f1e8-1f1ee", "html": "&#127464;&#127470;", "category": "Flags (country-flag)", "order": "2231"},
+ {"emoji": "🇨🇰", "name": "flag: Cook Islands", "shortname": ":flag-ck:", "unicode": "1f1e8-1f1f0", "html": "&#127464;&#127472;", "category": "Flags (country-flag)", "order": "2232"},
+ {"emoji": "🇨🇱", "name": "flag: Chile", "shortname": ":flag-cl:", "unicode": "1f1e8-1f1f1", "html": "&#127464;&#127473;", "category": "Flags (country-flag)", "order": "2233"},
+ {"emoji": "🇨🇲", "name": "flag: Cameroon", "shortname": ":flag-cm:", "unicode": "1f1e8-1f1f2", "html": "&#127464;&#127474;", "category": "Flags (country-flag)", "order": "2234"},
+ {"emoji": "đŸ‡¨đŸ‡ŗ", "name": "flag: China", "shortname": ":flag-cn:", "unicode": "1f1e8-1f1f3", "html": "&#127464;&#127475;", "category": "Flags (country-flag)", "order": "2235"},
+ {"emoji": "🇨🇴", "name": "flag: Colombia", "shortname": ":flag-co:", "unicode": "1f1e8-1f1f4", "html": "&#127464;&#127476;", "category": "Flags (country-flag)", "order": "2236"},
+ {"emoji": "🇨đŸ‡ĩ", "name": "flag: Clipperton Island", "shortname": ":flag-cp:", "unicode": "1f1e8-1f1f5", "html": "&#127464;&#127477;", "category": "Flags (country-flag)", "order": "2237"},
+ {"emoji": "🇨🇷", "name": "flag: Costa Rica", "shortname": ":flag-cr:", "unicode": "1f1e8-1f1f7", "html": "&#127464;&#127479;", "category": "Flags (country-flag)", "order": "2238"},
+ {"emoji": "🇨đŸ‡ē", "name": "flag: Cuba", "shortname": ":flag-cu:", "unicode": "1f1e8-1f1fa", "html": "&#127464;&#127482;", "category": "Flags (country-flag)", "order": "2239"},
+ {"emoji": "🇨đŸ‡ģ", "name": "flag: Cape Verde", "shortname": ":flag-cv:", "unicode": "1f1e8-1f1fb", "html": "&#127464;&#127483;", "category": "Flags (country-flag)", "order": "2240"},
+ {"emoji": "🇨đŸ‡ŧ", "name": "flag: Curaçao", "shortname": ":flag-cw:", "unicode": "1f1e8-1f1fc", "html": "&#127464;&#127484;", "category": "Flags (country-flag)", "order": "2241"},
+ {"emoji": "🇨đŸ‡Ŋ", "name": "flag: Christmas Island", "shortname": ":flag-cx:", "unicode": "1f1e8-1f1fd", "html": "&#127464;&#127485;", "category": "Flags (country-flag)", "order": "2242"},
+ {"emoji": "🇨🇾", "name": "flag: Cyprus", "shortname": ":flag-cy:", "unicode": "1f1e8-1f1fe", "html": "&#127464;&#127486;", "category": "Flags (country-flag)", "order": "2243"},
+ {"emoji": "🇨đŸ‡ŋ", "name": "flag: Czechia", "shortname": ":flag-cz:", "unicode": "1f1e8-1f1ff", "html": "&#127464;&#127487;", "category": "Flags (country-flag)", "order": "2244"},
+ {"emoji": "🇩đŸ‡Ē", "name": "flag: Germany", "shortname": ":flag-de:", "unicode": "1f1e9-1f1ea", "html": "&#127465;&#127466;", "category": "Flags (country-flag)", "order": "2245"},
+ {"emoji": "🇩đŸ‡Ŧ", "name": "flag: Diego Garcia", "shortname": ":flag-dg:", "unicode": "1f1e9-1f1ec", "html": "&#127465;&#127468;", "category": "Flags (country-flag)", "order": "2246"},
+ {"emoji": "đŸ‡ŠđŸ‡¯", "name": "flag: Djibouti", "shortname": ":flag-dj:", "unicode": "1f1e9-1f1ef", "html": "&#127465;&#127471;", "category": "Flags (country-flag)", "order": "2247"},
+ {"emoji": "🇩🇰", "name": "flag: Denmark", "shortname": ":flag-dk:", "unicode": "1f1e9-1f1f0", "html": "&#127465;&#127472;", "category": "Flags (country-flag)", "order": "2248"},
+ {"emoji": "🇩🇲", "name": "flag: Dominica", "shortname": ":flag-dm:", "unicode": "1f1e9-1f1f2", "html": "&#127465;&#127474;", "category": "Flags (country-flag)", "order": "2249"},
+ {"emoji": "🇩🇴", "name": "flag: Dominican Republic", "shortname": ":flag-do:", "unicode": "1f1e9-1f1f4", "html": "&#127465;&#127476;", "category": "Flags (country-flag)", "order": "2250"},
+ {"emoji": "🇩đŸ‡ŋ", "name": "flag: Algeria", "shortname": ":flag-dz:", "unicode": "1f1e9-1f1ff", "html": "&#127465;&#127487;", "category": "Flags (country-flag)", "order": "2251"},
+ {"emoji": "đŸ‡ĒđŸ‡Ļ", "name": "flag: Ceuta & Melilla", "shortname": ":flag-ea:", "unicode": "1f1ea-1f1e6", "html": "&#127466;&#127462;", "category": "Flags (country-flag)", "order": "2252"},
+ {"emoji": "đŸ‡Ē🇨", "name": "flag: Ecuador", "shortname": ":flag-ec:", "unicode": "1f1ea-1f1e8", "html": "&#127466;&#127464;", "category": "Flags (country-flag)", "order": "2253"},
+ {"emoji": "đŸ‡ĒđŸ‡Ē", "name": "flag: Estonia", "shortname": ":flag-ee:", "unicode": "1f1ea-1f1ea", "html": "&#127466;&#127466;", "category": "Flags (country-flag)", "order": "2254"},
+ {"emoji": "đŸ‡ĒđŸ‡Ŧ", "name": "flag: Egypt", "shortname": ":flag-eg:", "unicode": "1f1ea-1f1ec", "html": "&#127466;&#127468;", "category": "Flags (country-flag)", "order": "2255"},
+ {"emoji": "đŸ‡Ē🇭", "name": "flag: Western Sahara", "shortname": ":flag-eh:", "unicode": "1f1ea-1f1ed", "html": "&#127466;&#127469;", "category": "Flags (country-flag)", "order": "2256"},
+ {"emoji": "đŸ‡Ē🇷", "name": "flag: Eritrea", "shortname": ":flag-er:", "unicode": "1f1ea-1f1f7", "html": "&#127466;&#127479;", "category": "Flags (country-flag)", "order": "2257"},
+ {"emoji": "đŸ‡Ē🇸", "name": "flag: Spain", "shortname": ":flag-es:", "unicode": "1f1ea-1f1f8", "html": "&#127466;&#127480;", "category": "Flags (country-flag)", "order": "2258"},
+ {"emoji": "đŸ‡Ē🇹", "name": "flag: Ethiopia", "shortname": ":flag-et:", "unicode": "1f1ea-1f1f9", "html": "&#127466;&#127481;", "category": "Flags (country-flag)", "order": "2259"},
+ {"emoji": "đŸ‡ĒđŸ‡ē", "name": "flag: European Union", "shortname": ":flag-eu:", "unicode": "1f1ea-1f1fa", "html": "&#127466;&#127482;", "category": "Flags (country-flag)", "order": "2260"},
+ {"emoji": "đŸ‡Ģ🇮", "name": "flag: Finland", "shortname": ":flag-fi:", "unicode": "1f1eb-1f1ee", "html": "&#127467;&#127470;", "category": "Flags (country-flag)", "order": "2261"},
+ {"emoji": "đŸ‡ĢđŸ‡¯", "name": "flag: Fiji", "shortname": ":flag-fj:", "unicode": "1f1eb-1f1ef", "html": "&#127467;&#127471;", "category": "Flags (country-flag)", "order": "2262"},
+ {"emoji": "đŸ‡Ģ🇰", "name": "flag: Falkland Islands", "shortname": ":flag-fk:", "unicode": "1f1eb-1f1f0", "html": "&#127467;&#127472;", "category": "Flags (country-flag)", "order": "2263"},
+ {"emoji": "đŸ‡Ģ🇲", "name": "flag: Micronesia", "shortname": ":flag-fm:", "unicode": "1f1eb-1f1f2", "html": "&#127467;&#127474;", "category": "Flags (country-flag)", "order": "2264"},
+ {"emoji": "đŸ‡Ģ🇴", "name": "flag: Faroe Islands", "shortname": ":flag-fo:", "unicode": "1f1eb-1f1f4", "html": "&#127467;&#127476;", "category": "Flags (country-flag)", "order": "2265"},
+ {"emoji": "đŸ‡Ģ🇷", "name": "flag: France", "shortname": ":flag-fr:", "unicode": "1f1eb-1f1f7", "html": "&#127467;&#127479;", "category": "Flags (country-flag)", "order": "2266"},
+ {"emoji": "đŸ‡ŦđŸ‡Ļ", "name": "flag: Gabon", "shortname": ":flag-ga:", "unicode": "1f1ec-1f1e6", "html": "&#127468;&#127462;", "category": "Flags (country-flag)", "order": "2267"},
+ {"emoji": "đŸ‡Ŧ🇧", "name": "flag: United Kingdom", "shortname": ":flag-gb:", "unicode": "1f1ec-1f1e7", "html": "&#127468;&#127463;", "category": "Flags (country-flag)", "order": "2268"},
+ {"emoji": "đŸ‡Ŧ🇩", "name": "flag: Grenada", "shortname": ":flag-gd:", "unicode": "1f1ec-1f1e9", "html": "&#127468;&#127465;", "category": "Flags (country-flag)", "order": "2269"},
+ {"emoji": "đŸ‡ŦđŸ‡Ē", "name": "flag: Georgia", "shortname": ":flag-ge:", "unicode": "1f1ec-1f1ea", "html": "&#127468;&#127466;", "category": "Flags (country-flag)", "order": "2270"},
+ {"emoji": "đŸ‡ŦđŸ‡Ģ", "name": "flag: French Guiana", "shortname": ":flag-gf:", "unicode": "1f1ec-1f1eb", "html": "&#127468;&#127467;", "category": "Flags (country-flag)", "order": "2271"},
+ {"emoji": "đŸ‡ŦđŸ‡Ŧ", "name": "flag: Guernsey", "shortname": ":flag-gg:", "unicode": "1f1ec-1f1ec", "html": "&#127468;&#127468;", "category": "Flags (country-flag)", "order": "2272"},
+ {"emoji": "đŸ‡Ŧ🇭", "name": "flag: Ghana", "shortname": ":flag-gh:", "unicode": "1f1ec-1f1ed", "html": "&#127468;&#127469;", "category": "Flags (country-flag)", "order": "2273"},
+ {"emoji": "đŸ‡Ŧ🇮", "name": "flag: Gibraltar", "shortname": ":flag-gi:", "unicode": "1f1ec-1f1ee", "html": "&#127468;&#127470;", "category": "Flags (country-flag)", "order": "2274"},
+ {"emoji": "đŸ‡Ŧ🇱", "name": "flag: Greenland", "shortname": ":flag-gl:", "unicode": "1f1ec-1f1f1", "html": "&#127468;&#127473;", "category": "Flags (country-flag)", "order": "2275"},
+ {"emoji": "đŸ‡Ŧ🇲", "name": "flag: Gambia", "shortname": ":flag-gm:", "unicode": "1f1ec-1f1f2", "html": "&#127468;&#127474;", "category": "Flags (country-flag)", "order": "2276"},
+ {"emoji": "đŸ‡ŦđŸ‡ŗ", "name": "flag: Guinea", "shortname": ":flag-gn:", "unicode": "1f1ec-1f1f3", "html": "&#127468;&#127475;", "category": "Flags (country-flag)", "order": "2277"},
+ {"emoji": "đŸ‡ŦđŸ‡ĩ", "name": "flag: Guadeloupe", "shortname": ":flag-gp:", "unicode": "1f1ec-1f1f5", "html": "&#127468;&#127477;", "category": "Flags (country-flag)", "order": "2278"},
+ {"emoji": "đŸ‡ŦđŸ‡ļ", "name": "flag: Equatorial Guinea", "shortname": ":flag-gq:", "unicode": "1f1ec-1f1f6", "html": "&#127468;&#127478;", "category": "Flags (country-flag)", "order": "2279"},
+ {"emoji": "đŸ‡Ŧ🇷", "name": "flag: Greece", "shortname": ":flag-gr:", "unicode": "1f1ec-1f1f7", "html": "&#127468;&#127479;", "category": "Flags (country-flag)", "order": "2280"},
+ {"emoji": "đŸ‡Ŧ🇸", "name": "flag: South Georgia & South Sandwich Islands", "shortname": ":flag-gs:", "unicode": "1f1ec-1f1f8", "html": "&#127468;&#127480;", "category": "Flags (country-flag)", "order": "2281"},
+ {"emoji": "đŸ‡Ŧ🇹", "name": "flag: Guatemala", "shortname": ":flag-gt:", "unicode": "1f1ec-1f1f9", "html": "&#127468;&#127481;", "category": "Flags (country-flag)", "order": "2282"},
+ {"emoji": "đŸ‡ŦđŸ‡ē", "name": "flag: Guam", "shortname": ":flag-gu:", "unicode": "1f1ec-1f1fa", "html": "&#127468;&#127482;", "category": "Flags (country-flag)", "order": "2283"},
+ {"emoji": "đŸ‡ŦđŸ‡ŧ", "name": "flag: Guinea-Bissau", "shortname": ":flag-gw:", "unicode": "1f1ec-1f1fc", "html": "&#127468;&#127484;", "category": "Flags (country-flag)", "order": "2284"},
+ {"emoji": "đŸ‡Ŧ🇾", "name": "flag: Guyana", "shortname": ":flag-gy:", "unicode": "1f1ec-1f1fe", "html": "&#127468;&#127486;", "category": "Flags (country-flag)", "order": "2285"},
+ {"emoji": "🇭🇰", "name": "flag: Hong Kong SAR China", "shortname": ":flag-hk:", "unicode": "1f1ed-1f1f0", "html": "&#127469;&#127472;", "category": "Flags (country-flag)", "order": "2286"},
+ {"emoji": "🇭🇲", "name": "flag: Heard & McDonald Islands", "shortname": ":flag-hm:", "unicode": "1f1ed-1f1f2", "html": "&#127469;&#127474;", "category": "Flags (country-flag)", "order": "2287"},
+ {"emoji": "đŸ‡­đŸ‡ŗ", "name": "flag: Honduras", "shortname": ":flag-hn:", "unicode": "1f1ed-1f1f3", "html": "&#127469;&#127475;", "category": "Flags (country-flag)", "order": "2288"},
+ {"emoji": "🇭🇷", "name": "flag: Croatia", "shortname": ":flag-hr:", "unicode": "1f1ed-1f1f7", "html": "&#127469;&#127479;", "category": "Flags (country-flag)", "order": "2289"},
+ {"emoji": "🇭🇹", "name": "flag: Haiti", "shortname": ":flag-ht:", "unicode": "1f1ed-1f1f9", "html": "&#127469;&#127481;", "category": "Flags (country-flag)", "order": "2290"},
+ {"emoji": "🇭đŸ‡ē", "name": "flag: Hungary", "shortname": ":flag-hu:", "unicode": "1f1ed-1f1fa", "html": "&#127469;&#127482;", "category": "Flags (country-flag)", "order": "2291"},
+ {"emoji": "🇮🇨", "name": "flag: Canary Islands", "shortname": ":flag-ic:", "unicode": "1f1ee-1f1e8", "html": "&#127470;&#127464;", "category": "Flags (country-flag)", "order": "2292"},
+ {"emoji": "🇮🇩", "name": "flag: Indonesia", "shortname": ":flag-id:", "unicode": "1f1ee-1f1e9", "html": "&#127470;&#127465;", "category": "Flags (country-flag)", "order": "2293"},
+ {"emoji": "🇮đŸ‡Ē", "name": "flag: Ireland", "shortname": ":flag-ie:", "unicode": "1f1ee-1f1ea", "html": "&#127470;&#127466;", "category": "Flags (country-flag)", "order": "2294"},
+ {"emoji": "🇮🇱", "name": "flag: Israel", "shortname": ":flag-il:", "unicode": "1f1ee-1f1f1", "html": "&#127470;&#127473;", "category": "Flags (country-flag)", "order": "2295"},
+ {"emoji": "🇮🇲", "name": "flag: Isle of Man", "shortname": ":flag-im:", "unicode": "1f1ee-1f1f2", "html": "&#127470;&#127474;", "category": "Flags (country-flag)", "order": "2296"},
+ {"emoji": "đŸ‡ŽđŸ‡ŗ", "name": "flag: India", "shortname": ":flag-in:", "unicode": "1f1ee-1f1f3", "html": "&#127470;&#127475;", "category": "Flags (country-flag)", "order": "2297"},
+ {"emoji": "🇮🇴", "name": "flag: British Indian Ocean Territory", "shortname": ":flag-io:", "unicode": "1f1ee-1f1f4", "html": "&#127470;&#127476;", "category": "Flags (country-flag)", "order": "2298"},
+ {"emoji": "🇮đŸ‡ļ", "name": "flag: Iraq", "shortname": ":flag-iq:", "unicode": "1f1ee-1f1f6", "html": "&#127470;&#127478;", "category": "Flags (country-flag)", "order": "2299"},
+ {"emoji": "🇮🇷", "name": "flag: Iran", "shortname": ":flag-ir:", "unicode": "1f1ee-1f1f7", "html": "&#127470;&#127479;", "category": "Flags (country-flag)", "order": "2300"},
+ {"emoji": "🇮🇸", "name": "flag: Iceland", "shortname": ":flag-is:", "unicode": "1f1ee-1f1f8", "html": "&#127470;&#127480;", "category": "Flags (country-flag)", "order": "2301"},
+ {"emoji": "🇮🇹", "name": "flag: Italy", "shortname": ":flag-it:", "unicode": "1f1ee-1f1f9", "html": "&#127470;&#127481;", "category": "Flags (country-flag)", "order": "2302"},
+ {"emoji": "đŸ‡¯đŸ‡Ē", "name": "flag: Jersey", "shortname": ":flag-je:", "unicode": "1f1ef-1f1ea", "html": "&#127471;&#127466;", "category": "Flags (country-flag)", "order": "2303"},
+ {"emoji": "đŸ‡¯đŸ‡˛", "name": "flag: Jamaica", "shortname": ":flag-jm:", "unicode": "1f1ef-1f1f2", "html": "&#127471;&#127474;", "category": "Flags (country-flag)", "order": "2304"},
+ {"emoji": "đŸ‡¯đŸ‡´", "name": "flag: Jordan", "shortname": ":flag-jo:", "unicode": "1f1ef-1f1f4", "html": "&#127471;&#127476;", "category": "Flags (country-flag)", "order": "2305"},
+ {"emoji": "đŸ‡¯đŸ‡ĩ", "name": "flag: Japan", "shortname": ":flag-jp:", "unicode": "1f1ef-1f1f5", "html": "&#127471;&#127477;", "category": "Flags (country-flag)", "order": "2306"},
+ {"emoji": "🇰đŸ‡Ē", "name": "flag: Kenya", "shortname": ":flag-ke:", "unicode": "1f1f0-1f1ea", "html": "&#127472;&#127466;", "category": "Flags (country-flag)", "order": "2307"},
+ {"emoji": "🇰đŸ‡Ŧ", "name": "flag: Kyrgyzstan", "shortname": ":flag-kg:", "unicode": "1f1f0-1f1ec", "html": "&#127472;&#127468;", "category": "Flags (country-flag)", "order": "2308"},
+ {"emoji": "🇰🇭", "name": "flag: Cambodia", "shortname": ":flag-kh:", "unicode": "1f1f0-1f1ed", "html": "&#127472;&#127469;", "category": "Flags (country-flag)", "order": "2309"},
+ {"emoji": "🇰🇮", "name": "flag: Kiribati", "shortname": ":flag-ki:", "unicode": "1f1f0-1f1ee", "html": "&#127472;&#127470;", "category": "Flags (country-flag)", "order": "2310"},
+ {"emoji": "🇰🇲", "name": "flag: Comoros", "shortname": ":flag-km:", "unicode": "1f1f0-1f1f2", "html": "&#127472;&#127474;", "category": "Flags (country-flag)", "order": "2311"},
+ {"emoji": "đŸ‡°đŸ‡ŗ", "name": "flag: St. Kitts & Nevis", "shortname": ":flag-kn:", "unicode": "1f1f0-1f1f3", "html": "&#127472;&#127475;", "category": "Flags (country-flag)", "order": "2312"},
+ {"emoji": "🇰đŸ‡ĩ", "name": "flag: North Korea", "shortname": ":flag-kp:", "unicode": "1f1f0-1f1f5", "html": "&#127472;&#127477;", "category": "Flags (country-flag)", "order": "2313"},
+ {"emoji": "🇰🇷", "name": "flag: South Korea", "shortname": ":flag-kr:", "unicode": "1f1f0-1f1f7", "html": "&#127472;&#127479;", "category": "Flags (country-flag)", "order": "2314"},
+ {"emoji": "🇰đŸ‡ŧ", "name": "flag: Kuwait", "shortname": ":flag-kw:", "unicode": "1f1f0-1f1fc", "html": "&#127472;&#127484;", "category": "Flags (country-flag)", "order": "2315"},
+ {"emoji": "🇰🇾", "name": "flag: Cayman Islands", "shortname": ":flag-ky:", "unicode": "1f1f0-1f1fe", "html": "&#127472;&#127486;", "category": "Flags (country-flag)", "order": "2316"},
+ {"emoji": "🇰đŸ‡ŋ", "name": "flag: Kazakhstan", "shortname": ":flag-kz:", "unicode": "1f1f0-1f1ff", "html": "&#127472;&#127487;", "category": "Flags (country-flag)", "order": "2317"},
+ {"emoji": "🇱đŸ‡Ļ", "name": "flag: Laos", "shortname": ":flag-la:", "unicode": "1f1f1-1f1e6", "html": "&#127473;&#127462;", "category": "Flags (country-flag)", "order": "2318"},
+ {"emoji": "🇱🇧", "name": "flag: Lebanon", "shortname": ":flag-lb:", "unicode": "1f1f1-1f1e7", "html": "&#127473;&#127463;", "category": "Flags (country-flag)", "order": "2319"},
+ {"emoji": "🇱🇨", "name": "flag: St. Lucia", "shortname": ":flag-lc:", "unicode": "1f1f1-1f1e8", "html": "&#127473;&#127464;", "category": "Flags (country-flag)", "order": "2320"},
+ {"emoji": "🇱🇮", "name": "flag: Liechtenstein", "shortname": ":flag-li:", "unicode": "1f1f1-1f1ee", "html": "&#127473;&#127470;", "category": "Flags (country-flag)", "order": "2321"},
+ {"emoji": "🇱🇰", "name": "flag: Sri Lanka", "shortname": ":flag-lk:", "unicode": "1f1f1-1f1f0", "html": "&#127473;&#127472;", "category": "Flags (country-flag)", "order": "2322"},
+ {"emoji": "🇱🇷", "name": "flag: Liberia", "shortname": ":flag-lr:", "unicode": "1f1f1-1f1f7", "html": "&#127473;&#127479;", "category": "Flags (country-flag)", "order": "2323"},
+ {"emoji": "🇱🇸", "name": "flag: Lesotho", "shortname": ":flag-ls:", "unicode": "1f1f1-1f1f8", "html": "&#127473;&#127480;", "category": "Flags (country-flag)", "order": "2324"},
+ {"emoji": "🇱🇹", "name": "flag: Lithuania", "shortname": ":flag-lt:", "unicode": "1f1f1-1f1f9", "html": "&#127473;&#127481;", "category": "Flags (country-flag)", "order": "2325"},
+ {"emoji": "🇱đŸ‡ē", "name": "flag: Luxembourg", "shortname": ":flag-lu:", "unicode": "1f1f1-1f1fa", "html": "&#127473;&#127482;", "category": "Flags (country-flag)", "order": "2326"},
+ {"emoji": "🇱đŸ‡ģ", "name": "flag: Latvia", "shortname": ":flag-lv:", "unicode": "1f1f1-1f1fb", "html": "&#127473;&#127483;", "category": "Flags (country-flag)", "order": "2327"},
+ {"emoji": "🇱🇾", "name": "flag: Libya", "shortname": ":flag-ly:", "unicode": "1f1f1-1f1fe", "html": "&#127473;&#127486;", "category": "Flags (country-flag)", "order": "2328"},
+ {"emoji": "🇲đŸ‡Ļ", "name": "flag: Morocco", "shortname": ":flag-ma:", "unicode": "1f1f2-1f1e6", "html": "&#127474;&#127462;", "category": "Flags (country-flag)", "order": "2329"},
+ {"emoji": "🇲🇨", "name": "flag: Monaco", "shortname": ":flag-mc:", "unicode": "1f1f2-1f1e8", "html": "&#127474;&#127464;", "category": "Flags (country-flag)", "order": "2330"},
+ {"emoji": "🇲🇩", "name": "flag: Moldova", "shortname": ":flag-md:", "unicode": "1f1f2-1f1e9", "html": "&#127474;&#127465;", "category": "Flags (country-flag)", "order": "2331"},
+ {"emoji": "🇲đŸ‡Ē", "name": "flag: Montenegro", "shortname": ":flag-me:", "unicode": "1f1f2-1f1ea", "html": "&#127474;&#127466;", "category": "Flags (country-flag)", "order": "2332"},
+ {"emoji": "🇲đŸ‡Ģ", "name": "flag: St. Martin", "shortname": ":flag-mf:", "unicode": "1f1f2-1f1eb", "html": "&#127474;&#127467;", "category": "Flags (country-flag)", "order": "2333"},
+ {"emoji": "🇲đŸ‡Ŧ", "name": "flag: Madagascar", "shortname": ":flag-mg:", "unicode": "1f1f2-1f1ec", "html": "&#127474;&#127468;", "category": "Flags (country-flag)", "order": "2334"},
+ {"emoji": "🇲🇭", "name": "flag: Marshall Islands", "shortname": ":flag-mh:", "unicode": "1f1f2-1f1ed", "html": "&#127474;&#127469;", "category": "Flags (country-flag)", "order": "2335"},
+ {"emoji": "🇲🇰", "name": "flag: North Macedonia", "shortname": ":flag-mk:", "unicode": "1f1f2-1f1f0", "html": "&#127474;&#127472;", "category": "Flags (country-flag)", "order": "2336"},
+ {"emoji": "🇲🇱", "name": "flag: Mali", "shortname": ":flag-ml:", "unicode": "1f1f2-1f1f1", "html": "&#127474;&#127473;", "category": "Flags (country-flag)", "order": "2337"},
+ {"emoji": "🇲🇲", "name": "flag: Myanmar (Burma)", "shortname": ":flag-mm:", "unicode": "1f1f2-1f1f2", "html": "&#127474;&#127474;", "category": "Flags (country-flag)", "order": "2338"},
+ {"emoji": "đŸ‡˛đŸ‡ŗ", "name": "flag: Mongolia", "shortname": ":flag-mn:", "unicode": "1f1f2-1f1f3", "html": "&#127474;&#127475;", "category": "Flags (country-flag)", "order": "2339"},
+ {"emoji": "🇲🇴", "name": "flag: Macao SAR China", "shortname": ":flag-mo:", "unicode": "1f1f2-1f1f4", "html": "&#127474;&#127476;", "category": "Flags (country-flag)", "order": "2340"},
+ {"emoji": "🇲đŸ‡ĩ", "name": "flag: Northern Mariana Islands", "shortname": ":flag-mp:", "unicode": "1f1f2-1f1f5", "html": "&#127474;&#127477;", "category": "Flags (country-flag)", "order": "2341"},
+ {"emoji": "🇲đŸ‡ļ", "name": "flag: Martinique", "shortname": ":flag-mq:", "unicode": "1f1f2-1f1f6", "html": "&#127474;&#127478;", "category": "Flags (country-flag)", "order": "2342"},
+ {"emoji": "🇲🇷", "name": "flag: Mauritania", "shortname": ":flag-mr:", "unicode": "1f1f2-1f1f7", "html": "&#127474;&#127479;", "category": "Flags (country-flag)", "order": "2343"},
+ {"emoji": "🇲🇸", "name": "flag: Montserrat", "shortname": ":flag-ms:", "unicode": "1f1f2-1f1f8", "html": "&#127474;&#127480;", "category": "Flags (country-flag)", "order": "2344"},
+ {"emoji": "🇲🇹", "name": "flag: Malta", "shortname": ":flag-mt:", "unicode": "1f1f2-1f1f9", "html": "&#127474;&#127481;", "category": "Flags (country-flag)", "order": "2345"},
+ {"emoji": "🇲đŸ‡ē", "name": "flag: Mauritius", "shortname": ":flag-mu:", "unicode": "1f1f2-1f1fa", "html": "&#127474;&#127482;", "category": "Flags (country-flag)", "order": "2346"},
+ {"emoji": "🇲đŸ‡ģ", "name": "flag: Maldives", "shortname": ":flag-mv:", "unicode": "1f1f2-1f1fb", "html": "&#127474;&#127483;", "category": "Flags (country-flag)", "order": "2347"},
+ {"emoji": "🇲đŸ‡ŧ", "name": "flag: Malawi", "shortname": ":flag-mw:", "unicode": "1f1f2-1f1fc", "html": "&#127474;&#127484;", "category": "Flags (country-flag)", "order": "2348"},
+ {"emoji": "🇲đŸ‡Ŋ", "name": "flag: Mexico", "shortname": ":flag-mx:", "unicode": "1f1f2-1f1fd", "html": "&#127474;&#127485;", "category": "Flags (country-flag)", "order": "2349"},
+ {"emoji": "🇲🇾", "name": "flag: Malaysia", "shortname": ":flag-my:", "unicode": "1f1f2-1f1fe", "html": "&#127474;&#127486;", "category": "Flags (country-flag)", "order": "2350"},
+ {"emoji": "🇲đŸ‡ŋ", "name": "flag: Mozambique", "shortname": ":flag-mz:", "unicode": "1f1f2-1f1ff", "html": "&#127474;&#127487;", "category": "Flags (country-flag)", "order": "2351"},
+ {"emoji": "đŸ‡ŗđŸ‡Ļ", "name": "flag: Namibia", "shortname": ":flag-na:", "unicode": "1f1f3-1f1e6", "html": "&#127475;&#127462;", "category": "Flags (country-flag)", "order": "2352"},
+ {"emoji": "đŸ‡ŗđŸ‡¨", "name": "flag: New Caledonia", "shortname": ":flag-nc:", "unicode": "1f1f3-1f1e8", "html": "&#127475;&#127464;", "category": "Flags (country-flag)", "order": "2353"},
+ {"emoji": "đŸ‡ŗđŸ‡Ē", "name": "flag: Niger", "shortname": ":flag-ne:", "unicode": "1f1f3-1f1ea", "html": "&#127475;&#127466;", "category": "Flags (country-flag)", "order": "2354"},
+ {"emoji": "đŸ‡ŗđŸ‡Ģ", "name": "flag: Norfolk Island", "shortname": ":flag-nf:", "unicode": "1f1f3-1f1eb", "html": "&#127475;&#127467;", "category": "Flags (country-flag)", "order": "2355"},
+ {"emoji": "đŸ‡ŗđŸ‡Ŧ", "name": "flag: Nigeria", "shortname": ":flag-ng:", "unicode": "1f1f3-1f1ec", "html": "&#127475;&#127468;", "category": "Flags (country-flag)", "order": "2356"},
+ {"emoji": "đŸ‡ŗđŸ‡Ž", "name": "flag: Nicaragua", "shortname": ":flag-ni:", "unicode": "1f1f3-1f1ee", "html": "&#127475;&#127470;", "category": "Flags (country-flag)", "order": "2357"},
+ {"emoji": "đŸ‡ŗđŸ‡ą", "name": "flag: Netherlands", "shortname": ":flag-nl:", "unicode": "1f1f3-1f1f1", "html": "&#127475;&#127473;", "category": "Flags (country-flag)", "order": "2358"},
+ {"emoji": "đŸ‡ŗđŸ‡´", "name": "flag: Norway", "shortname": ":flag-no:", "unicode": "1f1f3-1f1f4", "html": "&#127475;&#127476;", "category": "Flags (country-flag)", "order": "2359"},
+ {"emoji": "đŸ‡ŗđŸ‡ĩ", "name": "flag: Nepal", "shortname": ":flag-np:", "unicode": "1f1f3-1f1f5", "html": "&#127475;&#127477;", "category": "Flags (country-flag)", "order": "2360"},
+ {"emoji": "đŸ‡ŗđŸ‡ˇ", "name": "flag: Nauru", "shortname": ":flag-nr:", "unicode": "1f1f3-1f1f7", "html": "&#127475;&#127479;", "category": "Flags (country-flag)", "order": "2361"},
+ {"emoji": "đŸ‡ŗđŸ‡ē", "name": "flag: Niue", "shortname": ":flag-nu:", "unicode": "1f1f3-1f1fa", "html": "&#127475;&#127482;", "category": "Flags (country-flag)", "order": "2362"},
+ {"emoji": "đŸ‡ŗđŸ‡ŋ", "name": "flag: New Zealand", "shortname": ":flag-nz:", "unicode": "1f1f3-1f1ff", "html": "&#127475;&#127487;", "category": "Flags (country-flag)", "order": "2363"},
+ {"emoji": "🇴🇲", "name": "flag: Oman", "shortname": ":flag-om:", "unicode": "1f1f4-1f1f2", "html": "&#127476;&#127474;", "category": "Flags (country-flag)", "order": "2364"},
+ {"emoji": "đŸ‡ĩđŸ‡Ļ", "name": "flag: Panama", "shortname": ":flag-pa:", "unicode": "1f1f5-1f1e6", "html": "&#127477;&#127462;", "category": "Flags (country-flag)", "order": "2365"},
+ {"emoji": "đŸ‡ĩđŸ‡Ē", "name": "flag: Peru", "shortname": ":flag-pe:", "unicode": "1f1f5-1f1ea", "html": "&#127477;&#127466;", "category": "Flags (country-flag)", "order": "2366"},
+ {"emoji": "đŸ‡ĩđŸ‡Ģ", "name": "flag: French Polynesia", "shortname": ":flag-pf:", "unicode": "1f1f5-1f1eb", "html": "&#127477;&#127467;", "category": "Flags (country-flag)", "order": "2367"},
+ {"emoji": "đŸ‡ĩđŸ‡Ŧ", "name": "flag: Papua New Guinea", "shortname": ":flag-pg:", "unicode": "1f1f5-1f1ec", "html": "&#127477;&#127468;", "category": "Flags (country-flag)", "order": "2368"},
+ {"emoji": "đŸ‡ĩ🇭", "name": "flag: Philippines", "shortname": ":flag-ph:", "unicode": "1f1f5-1f1ed", "html": "&#127477;&#127469;", "category": "Flags (country-flag)", "order": "2369"},
+ {"emoji": "đŸ‡ĩ🇰", "name": "flag: Pakistan", "shortname": ":flag-pk:", "unicode": "1f1f5-1f1f0", "html": "&#127477;&#127472;", "category": "Flags (country-flag)", "order": "2370"},
+ {"emoji": "đŸ‡ĩ🇱", "name": "flag: Poland", "shortname": ":flag-pl:", "unicode": "1f1f5-1f1f1", "html": "&#127477;&#127473;", "category": "Flags (country-flag)", "order": "2371"},
+ {"emoji": "đŸ‡ĩ🇲", "name": "flag: St. Pierre & Miquelon", "shortname": ":flag-pm:", "unicode": "1f1f5-1f1f2", "html": "&#127477;&#127474;", "category": "Flags (country-flag)", "order": "2372"},
+ {"emoji": "đŸ‡ĩđŸ‡ŗ", "name": "flag: Pitcairn Islands", "shortname": ":flag-pn:", "unicode": "1f1f5-1f1f3", "html": "&#127477;&#127475;", "category": "Flags (country-flag)", "order": "2373"},
+ {"emoji": "đŸ‡ĩ🇷", "name": "flag: Puerto Rico", "shortname": ":flag-pr:", "unicode": "1f1f5-1f1f7", "html": "&#127477;&#127479;", "category": "Flags (country-flag)", "order": "2374"},
+ {"emoji": "đŸ‡ĩ🇸", "name": "flag: Palestinian Territories", "shortname": ":flag-ps:", "unicode": "1f1f5-1f1f8", "html": "&#127477;&#127480;", "category": "Flags (country-flag)", "order": "2375"},
+ {"emoji": "đŸ‡ĩ🇹", "name": "flag: Portugal", "shortname": ":flag-pt:", "unicode": "1f1f5-1f1f9", "html": "&#127477;&#127481;", "category": "Flags (country-flag)", "order": "2376"},
+ {"emoji": "đŸ‡ĩđŸ‡ŧ", "name": "flag: Palau", "shortname": ":flag-pw:", "unicode": "1f1f5-1f1fc", "html": "&#127477;&#127484;", "category": "Flags (country-flag)", "order": "2377"},
+ {"emoji": "đŸ‡ĩ🇾", "name": "flag: Paraguay", "shortname": ":flag-py:", "unicode": "1f1f5-1f1fe", "html": "&#127477;&#127486;", "category": "Flags (country-flag)", "order": "2378"},
+ {"emoji": "đŸ‡ļđŸ‡Ļ", "name": "flag: Qatar", "shortname": ":flag-qa:", "unicode": "1f1f6-1f1e6", "html": "&#127478;&#127462;", "category": "Flags (country-flag)", "order": "2379"},
+ {"emoji": "🇷đŸ‡Ē", "name": "flag: RÊunion", "shortname": ":flag-re:", "unicode": "1f1f7-1f1ea", "html": "&#127479;&#127466;", "category": "Flags (country-flag)", "order": "2380"},
+ {"emoji": "🇷🇴", "name": "flag: Romania", "shortname": ":flag-ro:", "unicode": "1f1f7-1f1f4", "html": "&#127479;&#127476;", "category": "Flags (country-flag)", "order": "2381"},
+ {"emoji": "🇷🇸", "name": "flag: Serbia", "shortname": ":flag-rs:", "unicode": "1f1f7-1f1f8", "html": "&#127479;&#127480;", "category": "Flags (country-flag)", "order": "2382"},
+ {"emoji": "🇷đŸ‡ē", "name": "flag: Russia", "shortname": ":flag-ru:", "unicode": "1f1f7-1f1fa", "html": "&#127479;&#127482;", "category": "Flags (country-flag)", "order": "2383"},
+ {"emoji": "🇷đŸ‡ŧ", "name": "flag: Rwanda", "shortname": ":flag-rw:", "unicode": "1f1f7-1f1fc", "html": "&#127479;&#127484;", "category": "Flags (country-flag)", "order": "2384"},
+ {"emoji": "🇸đŸ‡Ļ", "name": "flag: Saudi Arabia", "shortname": ":flag-sa:", "unicode": "1f1f8-1f1e6", "html": "&#127480;&#127462;", "category": "Flags (country-flag)", "order": "2385"},
+ {"emoji": "🇸🇧", "name": "flag: Solomon Islands", "shortname": ":flag-sb:", "unicode": "1f1f8-1f1e7", "html": "&#127480;&#127463;", "category": "Flags (country-flag)", "order": "2386"},
+ {"emoji": "🇸🇨", "name": "flag: Seychelles", "shortname": ":flag-sc:", "unicode": "1f1f8-1f1e8", "html": "&#127480;&#127464;", "category": "Flags (country-flag)", "order": "2387"},
+ {"emoji": "🇸🇩", "name": "flag: Sudan", "shortname": ":flag-sd:", "unicode": "1f1f8-1f1e9", "html": "&#127480;&#127465;", "category": "Flags (country-flag)", "order": "2388"},
+ {"emoji": "🇸đŸ‡Ē", "name": "flag: Sweden", "shortname": ":flag-se:", "unicode": "1f1f8-1f1ea", "html": "&#127480;&#127466;", "category": "Flags (country-flag)", "order": "2389"},
+ {"emoji": "🇸đŸ‡Ŧ", "name": "flag: Singapore", "shortname": ":flag-sg:", "unicode": "1f1f8-1f1ec", "html": "&#127480;&#127468;", "category": "Flags (country-flag)", "order": "2390"},
+ {"emoji": "🇸🇭", "name": "flag: St. Helena", "shortname": ":flag-sh:", "unicode": "1f1f8-1f1ed", "html": "&#127480;&#127469;", "category": "Flags (country-flag)", "order": "2391"},
+ {"emoji": "🇸🇮", "name": "flag: Slovenia", "shortname": ":flag-si:", "unicode": "1f1f8-1f1ee", "html": "&#127480;&#127470;", "category": "Flags (country-flag)", "order": "2392"},
+ {"emoji": "đŸ‡¸đŸ‡¯", "name": "flag: Svalbard & Jan Mayen", "shortname": ":flag-sj:", "unicode": "1f1f8-1f1ef", "html": "&#127480;&#127471;", "category": "Flags (country-flag)", "order": "2393"},
+ {"emoji": "🇸🇰", "name": "flag: Slovakia", "shortname": ":flag-sk:", "unicode": "1f1f8-1f1f0", "html": "&#127480;&#127472;", "category": "Flags (country-flag)", "order": "2394"},
+ {"emoji": "🇸🇱", "name": "flag: Sierra Leone", "shortname": ":flag-sl:", "unicode": "1f1f8-1f1f1", "html": "&#127480;&#127473;", "category": "Flags (country-flag)", "order": "2395"},
+ {"emoji": "🇸🇲", "name": "flag: San Marino", "shortname": ":flag-sm:", "unicode": "1f1f8-1f1f2", "html": "&#127480;&#127474;", "category": "Flags (country-flag)", "order": "2396"},
+ {"emoji": "đŸ‡¸đŸ‡ŗ", "name": "flag: Senegal", "shortname": ":flag-sn:", "unicode": "1f1f8-1f1f3", "html": "&#127480;&#127475;", "category": "Flags (country-flag)", "order": "2397"},
+ {"emoji": "🇸🇴", "name": "flag: Somalia", "shortname": ":flag-so:", "unicode": "1f1f8-1f1f4", "html": "&#127480;&#127476;", "category": "Flags (country-flag)", "order": "2398"},
+ {"emoji": "🇸🇷", "name": "flag: Suriname", "shortname": ":flag-sr:", "unicode": "1f1f8-1f1f7", "html": "&#127480;&#127479;", "category": "Flags (country-flag)", "order": "2399"},
+ {"emoji": "🇸🇸", "name": "flag: South Sudan", "shortname": ":flag-ss:", "unicode": "1f1f8-1f1f8", "html": "&#127480;&#127480;", "category": "Flags (country-flag)", "order": "2400"},
+ {"emoji": "🇸🇹", "name": "flag: SÃŖo TomÊ & Príncipe", "shortname": ":flag-st:", "unicode": "1f1f8-1f1f9", "html": "&#127480;&#127481;", "category": "Flags (country-flag)", "order": "2401"},
+ {"emoji": "🇸đŸ‡ģ", "name": "flag: El Salvador", "shortname": ":flag-sv:", "unicode": "1f1f8-1f1fb", "html": "&#127480;&#127483;", "category": "Flags (country-flag)", "order": "2402"},
+ {"emoji": "🇸đŸ‡Ŋ", "name": "flag: Sint Maarten", "shortname": ":flag-sx:", "unicode": "1f1f8-1f1fd", "html": "&#127480;&#127485;", "category": "Flags (country-flag)", "order": "2403"},
+ {"emoji": "🇸🇾", "name": "flag: Syria", "shortname": ":flag-sy:", "unicode": "1f1f8-1f1fe", "html": "&#127480;&#127486;", "category": "Flags (country-flag)", "order": "2404"},
+ {"emoji": "🇸đŸ‡ŋ", "name": "flag: Eswatini", "shortname": ":flag-sz:", "unicode": "1f1f8-1f1ff", "html": "&#127480;&#127487;", "category": "Flags (country-flag)", "order": "2405"},
+ {"emoji": "🇹đŸ‡Ļ", "name": "flag: Tristan da Cunha", "shortname": ":flag-ta:", "unicode": "1f1f9-1f1e6", "html": "&#127481;&#127462;", "category": "Flags (country-flag)", "order": "2406"},
+ {"emoji": "🇹🇨", "name": "flag: Turks & Caicos Islands", "shortname": ":flag-tc:", "unicode": "1f1f9-1f1e8", "html": "&#127481;&#127464;", "category": "Flags (country-flag)", "order": "2407"},
+ {"emoji": "🇹🇩", "name": "flag: Chad", "shortname": ":flag-td:", "unicode": "1f1f9-1f1e9", "html": "&#127481;&#127465;", "category": "Flags (country-flag)", "order": "2408"},
+ {"emoji": "🇹đŸ‡Ģ", "name": "flag: French Southern Territories", "shortname": ":flag-tf:", "unicode": "1f1f9-1f1eb", "html": "&#127481;&#127467;", "category": "Flags (country-flag)", "order": "2409"},
+ {"emoji": "🇹đŸ‡Ŧ", "name": "flag: Togo", "shortname": ":flag-tg:", "unicode": "1f1f9-1f1ec", "html": "&#127481;&#127468;", "category": "Flags (country-flag)", "order": "2410"},
+ {"emoji": "🇹🇭", "name": "flag: Thailand", "shortname": ":flag-th:", "unicode": "1f1f9-1f1ed", "html": "&#127481;&#127469;", "category": "Flags (country-flag)", "order": "2411"},
+ {"emoji": "đŸ‡šđŸ‡¯", "name": "flag: Tajikistan", "shortname": ":flag-tj:", "unicode": "1f1f9-1f1ef", "html": "&#127481;&#127471;", "category": "Flags (country-flag)", "order": "2412"},
+ {"emoji": "🇹🇰", "name": "flag: Tokelau", "shortname": ":flag-tk:", "unicode": "1f1f9-1f1f0", "html": "&#127481;&#127472;", "category": "Flags (country-flag)", "order": "2413"},
+ {"emoji": "🇹🇱", "name": "flag: Timor-Leste", "shortname": ":flag-tl:", "unicode": "1f1f9-1f1f1", "html": "&#127481;&#127473;", "category": "Flags (country-flag)", "order": "2414"},
+ {"emoji": "🇹🇲", "name": "flag: Turkmenistan", "shortname": ":flag-tm:", "unicode": "1f1f9-1f1f2", "html": "&#127481;&#127474;", "category": "Flags (country-flag)", "order": "2415"},
+ {"emoji": "đŸ‡šđŸ‡ŗ", "name": "flag: Tunisia", "shortname": ":flag-tn:", "unicode": "1f1f9-1f1f3", "html": "&#127481;&#127475;", "category": "Flags (country-flag)", "order": "2416"},
+ {"emoji": "🇹🇴", "name": "flag: Tonga", "shortname": ":flag-to:", "unicode": "1f1f9-1f1f4", "html": "&#127481;&#127476;", "category": "Flags (country-flag)", "order": "2417"},
+ {"emoji": "🇹🇷", "name": "flag: Turkey", "shortname": ":flag-tr:", "unicode": "1f1f9-1f1f7", "html": "&#127481;&#127479;", "category": "Flags (country-flag)", "order": "2418"},
+ {"emoji": "🇹🇹", "name": "flag: Trinidad & Tobago", "shortname": ":flag-tt:", "unicode": "1f1f9-1f1f9", "html": "&#127481;&#127481;", "category": "Flags (country-flag)", "order": "2419"},
+ {"emoji": "🇹đŸ‡ģ", "name": "flag: Tuvalu", "shortname": ":flag-tv:", "unicode": "1f1f9-1f1fb", "html": "&#127481;&#127483;", "category": "Flags (country-flag)", "order": "2420"},
+ {"emoji": "🇹đŸ‡ŧ", "name": "flag: Taiwan", "shortname": ":flag-tw:", "unicode": "1f1f9-1f1fc", "html": "&#127481;&#127484;", "category": "Flags (country-flag)", "order": "2421"},
+ {"emoji": "🇹đŸ‡ŋ", "name": "flag: Tanzania", "shortname": ":flag-tz:", "unicode": "1f1f9-1f1ff", "html": "&#127481;&#127487;", "category": "Flags (country-flag)", "order": "2422"},
+ {"emoji": "đŸ‡ēđŸ‡Ļ", "name": "flag: Ukraine", "shortname": ":flag-ua:", "unicode": "1f1fa-1f1e6", "html": "&#127482;&#127462;", "category": "Flags (country-flag)", "order": "2423"},
+ {"emoji": "đŸ‡ēđŸ‡Ŧ", "name": "flag: Uganda", "shortname": ":flag-ug:", "unicode": "1f1fa-1f1ec", "html": "&#127482;&#127468;", "category": "Flags (country-flag)", "order": "2424"},
+ {"emoji": "đŸ‡ē🇲", "name": "flag: U.S. Outlying Islands", "shortname": ":flag-um:", "unicode": "1f1fa-1f1f2", "html": "&#127482;&#127474;", "category": "Flags (country-flag)", "order": "2425"},
+ {"emoji": "đŸ‡ē🇸", "name": "flag: United States", "shortname": ":flag-us:", "unicode": "1f1fa-1f1f8", "html": "&#127482;&#127480;", "category": "Flags (country-flag)", "order": "2427"},
+ {"emoji": "đŸ‡ē🇾", "name": "flag: Uruguay", "shortname": ":flag-uy:", "unicode": "1f1fa-1f1fe", "html": "&#127482;&#127486;", "category": "Flags (country-flag)", "order": "2428"},
+ {"emoji": "đŸ‡ēđŸ‡ŋ", "name": "flag: Uzbekistan", "shortname": ":flag-uz:", "unicode": "1f1fa-1f1ff", "html": "&#127482;&#127487;", "category": "Flags (country-flag)", "order": "2429"},
+ {"emoji": "đŸ‡ģđŸ‡Ļ", "name": "flag: Vatican City", "shortname": ":flag-va:", "unicode": "1f1fb-1f1e6", "html": "&#127483;&#127462;", "category": "Flags (country-flag)", "order": "2430"},
+ {"emoji": "đŸ‡ģ🇨", "name": "flag: St. Vincent & Grenadines", "shortname": ":flag-vc:", "unicode": "1f1fb-1f1e8", "html": "&#127483;&#127464;", "category": "Flags (country-flag)", "order": "2431"},
+ {"emoji": "đŸ‡ģđŸ‡Ē", "name": "flag: Venezuela", "shortname": ":flag-ve:", "unicode": "1f1fb-1f1ea", "html": "&#127483;&#127466;", "category": "Flags (country-flag)", "order": "2432"},
+ {"emoji": "đŸ‡ģđŸ‡Ŧ", "name": "flag: British Virgin Islands", "shortname": ":flag-vg:", "unicode": "1f1fb-1f1ec", "html": "&#127483;&#127468;", "category": "Flags (country-flag)", "order": "2433"},
+ {"emoji": "đŸ‡ģ🇮", "name": "flag: U.S. Virgin Islands", "shortname": ":flag-vi:", "unicode": "1f1fb-1f1ee", "html": "&#127483;&#127470;", "category": "Flags (country-flag)", "order": "2434"},
+ {"emoji": "đŸ‡ģđŸ‡ŗ", "name": "flag: Vietnam", "shortname": ":flag-vn:", "unicode": "1f1fb-1f1f3", "html": "&#127483;&#127475;", "category": "Flags (country-flag)", "order": "2435"},
+ {"emoji": "đŸ‡ģđŸ‡ē", "name": "flag: Vanuatu", "shortname": ":flag_vu:", "unicode": "1f1fb-1f1fa", "html": "&#127483;&#127482;", "category": "Flags (country-flag)", "order": "2436"},
+ {"emoji": "đŸ‡ŧđŸ‡Ģ", "name": "flag: Wallis & Futuna", "shortname": ":flag_wf:", "unicode": "1f1fc-1f1eb", "html": "&#127484;&#127467;", "category": "Flags (country-flag)", "order": "2437"},
+ {"emoji": "đŸ‡ŧ🇸", "name": "flag: Samoa", "shortname": ":flag_ws:", "unicode": "1f1fc-1f1f8", "html": "&#127484;&#127480;", "category": "Flags (country-flag)", "order": "2438"},
+ {"emoji": "đŸ‡Ŋ🇰", "name": "flag: Kosovo", "shortname": ":flag_xk:", "unicode": "1f1fd-1f1f0", "html": "&#127485;&#127472;", "category": "Flags (country-flag)", "order": "2439"},
+ {"emoji": "🇾đŸ‡Ē", "name": "flag: Yemen", "shortname": ":flag_ye:", "unicode": "1f1fe-1f1ea", "html": "&#127486;&#127466;", "category": "Flags (country-flag)", "order": "2440"},
+ {"emoji": "🇾🇹", "name": "flag: Mayotte", "shortname": ":flag_yt:", "unicode": "1f1fe-1f1f9", "html": "&#127486;&#127481;", "category": "Flags (country-flag)", "order": "2441"},
+ {"emoji": "đŸ‡ŋđŸ‡Ļ", "name": "flag: South Africa", "shortname": ":flag_za:", "unicode": "1f1ff-1f1e6", "html": "&#127487;&#127462;", "category": "Flags (country-flag)", "order": "2442"},
+ {"emoji": "đŸ‡ŋ🇲", "name": "flag: Zambia", "shortname": ":flag_zm:", "unicode": "1f1ff-1f1f2", "html": "&#127487;&#127474;", "category": "Flags (country-flag)", "order": "2443"},
+ {"emoji": "đŸ‡ŋđŸ‡ŧ", "name": "flag: Zimbabwe", "shortname": ":flag_zw:", "unicode": "1f1ff-1f1fc", "html": "&#127487;&#127484;", "category": "Flags (country-flag)", "order": "2444"},
+ {"emoji": "🖤", "name": "black heart", "shortname": ":black_heart:", "unicode": "1f5a4", "html": "&#128420;", "category": "Smileys & Emotion (emotion)", "order": "1296"},
+ {"emoji": "🗨", "name": "left speech bubble", "shortname": ":speech_left:", "unicode": "1f5e8", "html": "&#128488;", "category": "Smileys & Emotion (emotion)", "order": "1310"},
+ {"emoji": "đŸĨš", "name": "egg", "shortname": ":egg:", "unicode": "1f95a", "html": "&#129370;", "category": "Food & Drink (food-prepared)", "order": "1489"},
+ {"emoji": "🛑", "name": "stop sign", "shortname": ":octagonal_sign:", "unicode": "1f6d1", "html": "&#128721;", "category": "Travel & Places (transport-ground)", "order": "1641"},
+ {"emoji": "♠", "name": "spade suit", "shortname": ":spades:", "unicode": "2660", "html": "&spades;", "category": "Activities (game)", "order": "1807"},
+ {"emoji": "â™Ĩ", "name": "heart suit", "shortname": ":hearts:", "unicode": "2665", "html": "&hearts;", "category": "Activities (game)", "order": "1808"},
+ {"emoji": "â™Ļ", "name": "diamond suit", "shortname": ":diamonds:", "unicode": "2666", "html": "&diams;", "category": "Activities (game)", "order": "1809"},
+ {"emoji": "â™Ŗ", "name": "club suit", "shortname": ":clubs:", "unicode": "2663", "html": "&clubs;", "category": "Activities (game)", "order": "1810"},
+ {"emoji": "đŸĨ", "name": "drum", "shortname": ":drum:", "unicode": "1f941", "html": "&#129345;", "category": "Objects (musical-instrument)", "order": "1837"},
+ {"emoji": "↔", "name": "left-right arrow", "shortname": ":left_right_arrow:", "unicode": "2194", "html": "&harr;", "category": "Symbols (arrow)", "order": "2011"},
+ {"emoji": "Š", "name": "copyright", "shortname": ":copyright:", "unicode": "00a9", "html": "&copy;", "category": "Symbols (other-symbol)", "order": "2103"},
+ {"emoji": "ÂŽ", "name": "registered", "shortname": ":registered:", "unicode": "00ae", "html": "&reg;", "category": "Symbols (other-symbol)", "order": "2104"},
+ {"emoji": "â„ĸ", "name": "trade mark", "shortname": ":tm:", "unicode": "2122", "html": "&trade;", "category": "Symbols (other-symbol)", "order": "2105"},
+ {"emoji": "0ī¸âƒŖ", "name": "keycap: 0", "shortname": ":0:", "unicode": "0030 FE0F 20E3", "html": "&#48;", "category": "Symbols (keycap)", "order": ""},
+ {"emoji": "1ī¸âƒŖ", "name": "keycap: 1", "shortname": ":1:", "unicode": "0031 FE0F 20E3", "html": "&#49;", "category": "Symbols (keycap)", "order": ""},
+ {"emoji": "2ī¸âƒŖ", "name": "keycap: 2", "shortname": ":2:", "unicode": "0032 FE0F 20E3", "html": "&#50;", "category": "Symbols (keycap)", "order": ""},
+ {"emoji": "3ī¸âƒŖ", "name": "keycap: 3", "shortname": ":3:", "unicode": "0033 FE0F 20E3", "html": "&#51;", "category": "Symbols (keycap)", "order": ""},
+ {"emoji": "4ī¸âƒŖ", "name": "keycap: 4", "shortname": ":4:", "unicode": "0034 FE0F 20E3", "html": "&#52;", "category": "Symbols (keycap)", "order": ""},
+ {"emoji": "5ī¸âƒŖ", "name": "keycap: 5", "shortname": ":5:", "unicode": "0035 FE0F 20E3", "html": "&#53;", "category": "Symbols (keycap)", "order": ""},
+ {"emoji": "6ī¸âƒŖ", "name": "keycap: 6", "shortname": ":6:", "unicode": "0036 FE0F 20E3", "html": "&#54;", "category": "Symbols (keycap)", "order": ""},
+ {"emoji": "7ī¸âƒŖ", "name": "keycap: 7", "shortname": ":7:", "unicode": "0037 FE0F 20E3", "html": "&#55;", "category": "Symbols (keycap)", "order": ""},
+ {"emoji": "8ī¸âƒŖ", "name": "keycap: 8", "shortname": ":8:", "unicode": "0038 FE0F 20E3", "html": "&#56;", "category": "Symbols (keycap)", "order": ""},
+ {"emoji": "9ī¸âƒŖ", "name": "keycap: 9", "shortname": ":9:", "unicode": "0039 FE0F 20E3", "html": "&#57;", "category": "Symbols (keycap)", "order": ""},
+ {"emoji": "#âƒŖ", "name": "keycap: #", "shortname": ":hash:", "unicode": "0023-20e3", "html": "#&#8419;", "category": "Symbols (keycap)", "order": "2106"},
+ {"emoji": "*âƒŖ", "name": "keycap: #", "shortname": ":asterisk:", "unicode": "002a-20e3", "html": "*&#8419;", "category": "Symbols (keycap)", "order": "2107"},
+ {"emoji": "0âƒŖ", "name": "keycap: 0", "shortname": ":zero:", "unicode": "0030-20e3", "html": "0&#8419;", "category": "Symbols (keycap)", "order": "2108"},
+ {"emoji": "1âƒŖ", "name": "keycap: 1", "shortname": ":one:", "unicode": "0031-20e3", "html": "1&#8419;", "category": "Symbols (keycap)", "order": "2109"},
+ {"emoji": "2âƒŖ", "name": "keycap: 2", "shortname": ":two:", "unicode": "0032-20e3", "html": "2&#8419;", "category": "Symbols (keycap)", "order": "2110"},
+ {"emoji": "3âƒŖ", "name": "keycap: 3", "shortname": ":three:", "unicode": "0033-20e3", "html": "3&#8419;", "category": "Symbols (keycap)", "order": "2111"},
+ {"emoji": "4âƒŖ", "name": "keycap: 4", "shortname": ":four:", "unicode": "0034-20e3", "html": "4&#8419;", "category": "Symbols (keycap)", "order": "2112"},
+ {"emoji": "5âƒŖ", "name": "keycap: 5", "shortname": ":five:", "unicode": "0035-20e3", "html": "5&#8419;", "category": "Symbols (keycap)", "order": "2113"},
+ {"emoji": "6âƒŖ", "name": "keycap: 6", "shortname": ":six:", "unicode": "0036-20e3", "html": "6&#8419;", "category": "Symbols (keycap)", "order": "2114"},
+ {"emoji": "7âƒŖ", "name": "keycap: 7", "shortname": ":seven:", "unicode": "0037-20e3", "html": "7&#8419;", "category": "Symbols (keycap)", "order": "2115"},
+ {"emoji": "8âƒŖ", "name": "keycap: 8", "shortname": ":eight:", "unicode": "0038-20e3", "html": "8&#8419;", "category": "Symbols (keycap)", "order": "2116"},
+ {"emoji": "9âƒŖ", "name": "keycap: 9", "shortname": ":nine:", "unicode": "0039-20e3", "html": "9&#8419;", "category": "Symbols (keycap)", "order": "2117"},
+ {"emoji": "đŸ¤Ŗ", "name": "rolling on the floor laughing", "shortname": ":rolling_on_the_floor_laughing:", "unicode": "1F923", "html": "&#x1F923;", "category": "Smileys & Emotion (face-smiling)", "order": ""},
+ {"emoji": "đŸĨ°", "name": "smiling face with hearts", "shortname": ":smiling_face_with_hearts:", "unicode": "1F970", "html": "&#x1F970;", "category": "Smileys & Emotion (face-affection)", "order": ""},
+ {"emoji": "🤩", "name": "star-struck", "shortname": ":starstruck:", "unicode": "1F929", "html": "&#x1F929;", "category": "Smileys & Emotion (face-affection)", "order": ""},
+ {"emoji": "â˜ē", "name": "smiling face", "shortname": ":smiling_face:", "unicode": "263A", "html": "&#x263A;", "category": "Smileys & Emotion (face-affection)", "order": ""},
+ {"emoji": "đŸ¤Ē", "name": "zany face", "shortname": ":zany_face:", "unicode": "1F92A", "html": "&#x1F92A;", "category": "Smileys & Emotion (face-tongue)", "order": ""},
+ {"emoji": "🤭", "name": "face with hand over mouth", "shortname": ":face_with_hand_over_mouth:", "unicode": "1F92D", "html": "&#x1F92D;", "category": "Smileys & Emotion (face-hand)", "order": ""},
+ {"emoji": "đŸ¤Ģ", "name": "shushing face", "shortname": ":shushing_face:", "unicode": "1F92B", "html": "&#x1F92B;", "category": "Smileys & Emotion (face-hand)", "order": ""},
+ {"emoji": "🤨", "name": "face with raised eyebrow", "shortname": ":face_with_raised_eyebrow:", "unicode": "1F928", "html": "&#x1F928;", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": ""},
+ {"emoji": "đŸ¤Ĩ", "name": "lying face", "shortname": ":lying_face:", "unicode": "1F925", "html": "&#x1F925;", "category": "Smileys & Emotion (face-neutral-skeptical)", "order": ""},
+ {"emoji": "🤤", "name": "drooling face", "shortname": ":drooling_face:", "unicode": "1F924", "html": "&#x1F924;", "category": "Smileys & Emotion (face-sleepy)", "order": ""},
+ {"emoji": "đŸ¤ĸ", "name": "nauseated face", "shortname": ":nauseated_face:", "unicode": "1F922", "html": "&#x1F922;", "category": "Smileys & Emotion (face-unwell)", "order": ""},
+ {"emoji": "🤮", "name": "face vomiting", "shortname": ":face_vomiting:", "unicode": "1F92E", "html": "&#x1F92E;", "category": "Smileys & Emotion (face-unwell)", "order": ""},
+ {"emoji": "🤧", "name": "sneezing face", "shortname": ":sneezing_face:", "unicode": "1F927", "html": "&#x1F927;", "category": "Smileys & Emotion (face-unwell)", "order": ""},
+ {"emoji": "đŸĨĩ", "name": "hot face", "shortname": ":hot_face:", "unicode": "1F975", "html": "&#x1F975;", "category": "Smileys & Emotion (face-unwell)", "order": ""},
+ {"emoji": "đŸĨļ", "name": "cold face", "shortname": ":cold_face:", "unicode": "1F976", "html": "&#x1F976;", "category": "Smileys & Emotion (face-unwell)", "order": ""},
+ {"emoji": "đŸĨ´", "name": "woozy face", "shortname": ":woozy_face:", "unicode": "1F974", "html": "&#x1F974;", "category": "Smileys & Emotion (face-unwell)", "order": ""},
+ {"emoji": "đŸ¤¯", "name": "exploding head", "shortname": ":exploding_head:", "unicode": "1F92F", "html": "&#x1F92F;", "category": "Smileys & Emotion (face-unwell)", "order": ""},
+ {"emoji": "🤠", "name": "cowboy hat face", "shortname": ":cowboy_hat_face:", "unicode": "1F920", "html": "&#x1F920;", "category": "Smileys & Emotion (face-hat)", "order": ""},
+ {"emoji": "đŸĨŗ", "name": "partying face", "shortname": ":partying_face:", "unicode": "1F973", "html": "&#x1F973;", "category": "Smileys & Emotion (face-hat)", "order": ""},
+ {"emoji": "🧐", "name": "face with monocle", "shortname": ":face_with_monocle:", "unicode": "1F9D0", "html": "&#x1F9D0;", "category": "Smileys & Emotion (face-glasses)", "order": ""},
+ {"emoji": "â˜šī¸", "name": "frowning face", "shortname": ":frowning_face:", "unicode": "2639 FE0F", "html": "&#x2639;&#xFE0F;", "category": "Smileys & Emotion (face-concerned)", "order": ""},
+ {"emoji": "đŸĨē", "name": "pleading face", "shortname": ":pleading_face:", "unicode": "1F97A", "html": "&#x1F97A;", "category": "Smileys & Emotion (face-concerned)", "order": ""},
+ {"emoji": "đŸĨą", "name": "yawning face", "shortname": ":yawning_face:", "unicode": "1F971", "html": "&#x1F971;", "category": "Smileys & Emotion (face-concerned)", "order": ""},
+ {"emoji": "đŸ¤Ŧ", "name": "face with symbols on mouth", "shortname": ":face_with_symbols_on_mouth:", "unicode": "1F92C", "html": "&#x1F92C;", "category": "Smileys & Emotion (face-negative)", "order": ""},
+ {"emoji": "â˜ ī¸", "name": "skull and crossbones", "shortname": ":skull_and_crossbones:", "unicode": "2620 FE0F", "html": "&#x2620;&#xFE0F;", "category": "Smileys & Emotion (face-negative)", "order": ""},
+ {"emoji": "🤡", "name": "clown face", "shortname": ":clown_face:", "unicode": "1F921", "html": "&#x1F921;", "category": "Smileys & Emotion (face-costume)", "order": ""},
+ {"emoji": "âŖ", "name": "heart exclamation", "shortname": ":heart_exclamation:", "unicode": "2763", "html": "&#x2763;", "category": "Smileys & Emotion (emotion)", "order": ""},
+ {"emoji": "❤", "name": "red heart", "shortname": ":red_heart:", "unicode": "2764", "html": "&#x2764;", "category": "Smileys & Emotion (emotion)", "order": ""},
+ {"emoji": "🧡", "name": "orange heart", "shortname": ":orange_heart:", "unicode": "1F9E1", "html": "&#x1F9E1;", "category": "Smileys & Emotion (emotion)", "order": ""},
+ {"emoji": "🤎", "name": "brown heart", "shortname": ":brown_heart:", "unicode": "1F90E", "html": "&#x1F90E;", "category": "Smileys & Emotion (emotion)", "order": ""},
+ {"emoji": "🤍", "name": "white heart", "shortname": ":white_heart:", "unicode": "1F90D", "html": "&#x1F90D;", "category": "Smileys & Emotion (emotion)", "order": ""},
+ {"emoji": "đŸ•ŗī¸", "name": "hole", "shortname": ":hole:", "unicode": "1F573 FE0F", "html": "&#x1F573;&#xFE0F;", "category": "Smileys & Emotion (emotion)", "order": ""},
+ {"emoji": "đŸ‘ī¸â€đŸ—¨ī¸", "name": "eye in speech bubble", "shortname": ":eye_in_speech_bubble:", "unicode": "1F441 FE0F 200D 1F5E8 FE0F", "html": "&#x1F441;&#xFE0F;&#x200D;&#x1F5E8;&#xFE0F;", "category": "Smileys & Emotion (emotion)", "order": ""},
+ {"emoji": "đŸ‘â€đŸ—¨ī¸", "name": "eye in speech bubble", "shortname": ":eye_in_speech_bubble:", "unicode": "1F441 200D 1F5E8 FE0F", "html": "&#x1F441;&#x200D;&#x1F5E8;&#xFE0F;", "category": "Smileys & Emotion (emotion)", "order": ""},
+ {"emoji": "đŸ‘ī¸â€đŸ—¨", "name": "eye in speech bubble", "shortname": ":eye_in_speech_bubble:", "unicode": "1F441 FE0F 200D 1F5E8", "html": "&#x1F441;&#xFE0F;&#x200D;&#x1F5E8;", "category": "Smileys & Emotion (emotion)", "order": ""},
+ {"emoji": "đŸ—¨ī¸", "name": "left speech bubble", "shortname": ":left_speech_bubble:", "unicode": "1F5E8 FE0F", "html": "&#x1F5E8;&#xFE0F;", "category": "Smileys & Emotion (emotion)", "order": ""},
+ {"emoji": "đŸ—¯ī¸", "name": "right anger bubble", "shortname": ":right_anger_bubble:", "unicode": "1F5EF FE0F", "html": "&#x1F5EF;&#xFE0F;", "category": "Smileys & Emotion (emotion)", "order": ""},
+ {"emoji": "🤚", "name": "raised back of hand", "shortname": ":raised_back_of_hand:", "unicode": "1F91A", "html": "&#x1F91A;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "🤚đŸģ", "name": "raised back of hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F91A 1F3FB", "html": "&#x1F91A;&#x1F3FB;", "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": "&#x1F91A;&#x1F3FC;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "🤚đŸŊ", "name": "raised back of hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F91A 1F3FD", "html": "&#x1F91A;&#x1F3FD;", "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": "&#x1F91A;&#x1F3FE;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "🤚đŸŋ", "name": "raised back of hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F91A 1F3FF", "html": "&#x1F91A;&#x1F3FF;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "đŸ–ī¸", "name": "hand with fingers splayed", "shortname": ":hand_with_fingers_splayed:", "unicode": "1F590 FE0F", "html": "&#x1F590;&#xFE0F;", "category": "People & Body (hand-fingers-open)", "order": ""},
+ {"emoji": "🤏", "name": "pinching hand", "shortname": ":pinching_hand:", "unicode": "1F90F", "html": "&#x1F90F;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤏đŸģ", "name": "pinching hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F90F 1F3FB", "html": "&#x1F90F;&#x1F3FB;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤏đŸŧ", "name": "pinching hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F90F 1F3FC", "html": "&#x1F90F;&#x1F3FC;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤏đŸŊ", "name": "pinching hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F90F 1F3FD", "html": "&#x1F90F;&#x1F3FD;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤏🏾", "name": "pinching hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F90F 1F3FE", "html": "&#x1F90F;&#x1F3FE;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤏đŸŋ", "name": "pinching hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F90F 1F3FF", "html": "&#x1F90F;&#x1F3FF;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "✌", "name": "victory hand", "shortname": ":victory_hand:", "unicode": "270C", "html": "&#x270C;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤞", "name": "crossed fingers", "shortname": ":crossed_fingers:", "unicode": "1F91E", "html": "&#x1F91E;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤞đŸģ", "name": "crossed fingers: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F91E 1F3FB", "html": "&#x1F91E;&#x1F3FB;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤞đŸŧ", "name": "crossed fingers: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F91E 1F3FC", "html": "&#x1F91E;&#x1F3FC;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤞đŸŊ", "name": "crossed fingers: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F91E 1F3FD", "html": "&#x1F91E;&#x1F3FD;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤞🏾", "name": "crossed fingers: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F91E 1F3FE", "html": "&#x1F91E;&#x1F3FE;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤞đŸŋ", "name": "crossed fingers: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F91E 1F3FF", "html": "&#x1F91E;&#x1F3FF;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤟", "name": "love-you gesture", "shortname": ":loveyou_gesture:", "unicode": "1F91F", "html": "&#x1F91F;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤟đŸģ", "name": "love-you gesture: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F91F 1F3FB", "html": "&#x1F91F;&#x1F3FB;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤟đŸŧ", "name": "love-you gesture: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F91F 1F3FC", "html": "&#x1F91F;&#x1F3FC;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤟đŸŊ", "name": "love-you gesture: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F91F 1F3FD", "html": "&#x1F91F;&#x1F3FD;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤟🏾", "name": "love-you gesture: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F91F 1F3FE", "html": "&#x1F91F;&#x1F3FE;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤟đŸŋ", "name": "love-you gesture: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F91F 1F3FF", "html": "&#x1F91F;&#x1F3FF;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤙", "name": "call me hand", "shortname": ":call_me_hand:", "unicode": "1F919", "html": "&#x1F919;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤙đŸģ", "name": "call me hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F919 1F3FB", "html": "&#x1F919;&#x1F3FB;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤙đŸŧ", "name": "call me hand: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F919 1F3FC", "html": "&#x1F919;&#x1F3FC;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤙đŸŊ", "name": "call me hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F919 1F3FD", "html": "&#x1F919;&#x1F3FD;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤙🏾", "name": "call me hand: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F919 1F3FE", "html": "&#x1F919;&#x1F3FE;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "🤙đŸŋ", "name": "call me hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F919 1F3FF", "html": "&#x1F919;&#x1F3FF;", "category": "People & Body (hand-fingers-partial)", "order": ""},
+ {"emoji": "☝", "name": "index pointing up", "shortname": ":index_pointing_up:", "unicode": "261D", "html": "&#x261D;", "category": "People & Body (hand-single-finger)", "order": ""},
+ {"emoji": "🤛", "name": "left-facing fist", "shortname": ":leftfacing_fist:", "unicode": "1F91B", "html": "&#x1F91B;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "🤛đŸģ", "name": "left-facing fist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F91B 1F3FB", "html": "&#x1F91B;&#x1F3FB;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "🤛đŸŧ", "name": "left-facing fist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F91B 1F3FC", "html": "&#x1F91B;&#x1F3FC;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "🤛đŸŊ", "name": "left-facing fist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F91B 1F3FD", "html": "&#x1F91B;&#x1F3FD;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "🤛🏾", "name": "left-facing fist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F91B 1F3FE", "html": "&#x1F91B;&#x1F3FE;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "🤛đŸŋ", "name": "left-facing fist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F91B 1F3FF", "html": "&#x1F91B;&#x1F3FF;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "🤜", "name": "right-facing fist", "shortname": ":rightfacing_fist:", "unicode": "1F91C", "html": "&#x1F91C;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "🤜đŸģ", "name": "right-facing fist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F91C 1F3FB", "html": "&#x1F91C;&#x1F3FB;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "🤜đŸŧ", "name": "right-facing fist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F91C 1F3FC", "html": "&#x1F91C;&#x1F3FC;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "🤜đŸŊ", "name": "right-facing fist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F91C 1F3FD", "html": "&#x1F91C;&#x1F3FD;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "🤜🏾", "name": "right-facing fist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F91C 1F3FE", "html": "&#x1F91C;&#x1F3FE;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "🤜đŸŋ", "name": "right-facing fist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F91C 1F3FF", "html": "&#x1F91C;&#x1F3FF;", "category": "People & Body (hand-fingers-closed)", "order": ""},
+ {"emoji": "🤲", "name": "palms up together", "shortname": ":palms_up_together:", "unicode": "1F932", "html": "&#x1F932;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "🤲đŸģ", "name": "palms up together: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F932 1F3FB", "html": "&#x1F932;&#x1F3FB;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "🤲đŸŧ", "name": "palms up together: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F932 1F3FC", "html": "&#x1F932;&#x1F3FC;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "🤲đŸŊ", "name": "palms up together: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F932 1F3FD", "html": "&#x1F932;&#x1F3FD;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "🤲🏾", "name": "palms up together: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F932 1F3FE", "html": "&#x1F932;&#x1F3FE;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "🤲đŸŋ", "name": "palms up together: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F932 1F3FF", "html": "&#x1F932;&#x1F3FF;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "🤝", "name": "handshake", "shortname": ":handshake:", "unicode": "1F91D", "html": "&#x1F91D;", "category": "People & Body (hands)", "order": ""},
+ {"emoji": "âœī¸", "name": "writing hand", "shortname": ":writing_hand:", "unicode": "270D FE0F", "html": "&#x270D;&#xFE0F;", "category": "People & Body (hand-prop)", "order": ""},
+ {"emoji": "đŸ¤ŗ", "name": "selfie", "shortname": ":selfie:", "unicode": "1F933", "html": "&#x1F933;", "category": "People & Body (hand-prop)", "order": ""},
+ {"emoji": "đŸ¤ŗđŸģ", "name": "selfie: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F933 1F3FB", "html": "&#x1F933;&#x1F3FB;", "category": "People & Body (hand-prop)", "order": ""},
+ {"emoji": "đŸ¤ŗđŸŧ", "name": "selfie: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F933 1F3FC", "html": "&#x1F933;&#x1F3FC;", "category": "People & Body (hand-prop)", "order": ""},
+ {"emoji": "đŸ¤ŗđŸŊ", "name": "selfie: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F933 1F3FD", "html": "&#x1F933;&#x1F3FD;", "category": "People & Body (hand-prop)", "order": ""},
+ {"emoji": "đŸ¤ŗđŸž", "name": "selfie: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F933 1F3FE", "html": "&#x1F933;&#x1F3FE;", "category": "People & Body (hand-prop)", "order": ""},
+ {"emoji": "đŸ¤ŗđŸŋ", "name": "selfie: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F933 1F3FF", "html": "&#x1F933;&#x1F3FF;", "category": "People & Body (hand-prop)", "order": ""},
+ {"emoji": "đŸĻž", "name": "mechanical arm", "shortname": ":mechanical_arm:", "unicode": "1F9BE", "html": "&#x1F9BE;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻŋ", "name": "mechanical leg", "shortname": ":mechanical_leg:", "unicode": "1F9BF", "html": "&#x1F9BF;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻĩ", "name": "leg", "shortname": ":leg:", "unicode": "1F9B5", "html": "&#x1F9B5;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻĩđŸģ", "name": "leg: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B5 1F3FB", "html": "&#x1F9B5;&#x1F3FB;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻĩđŸŧ", "name": "leg: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B5 1F3FC", "html": "&#x1F9B5;&#x1F3FC;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻĩđŸŊ", "name": "leg: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B5 1F3FD", "html": "&#x1F9B5;&#x1F3FD;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻĩ🏾", "name": "leg: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B5 1F3FE", "html": "&#x1F9B5;&#x1F3FE;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻĩđŸŋ", "name": "leg: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B5 1F3FF", "html": "&#x1F9B5;&#x1F3FF;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻļ", "name": "foot", "shortname": ":foot:", "unicode": "1F9B6", "html": "&#x1F9B6;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻļđŸģ", "name": "foot: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B6 1F3FB", "html": "&#x1F9B6;&#x1F3FB;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻļđŸŧ", "name": "foot: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B6 1F3FC", "html": "&#x1F9B6;&#x1F3FC;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻļđŸŊ", "name": "foot: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B6 1F3FD", "html": "&#x1F9B6;&#x1F3FD;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻļ🏾", "name": "foot: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B6 1F3FE", "html": "&#x1F9B6;&#x1F3FE;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻļđŸŋ", "name": "foot: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B6 1F3FF", "html": "&#x1F9B6;&#x1F3FF;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻģ", "name": "ear with hearing aid", "shortname": ":ear_with_hearing_aid:", "unicode": "1F9BB", "html": "&#x1F9BB;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻģđŸģ", "name": "ear with hearing aid: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9BB 1F3FB", "html": "&#x1F9BB;&#x1F3FB;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻģđŸŧ", "name": "ear with hearing aid: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9BB 1F3FC", "html": "&#x1F9BB;&#x1F3FC;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻģđŸŊ", "name": "ear with hearing aid: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9BB 1F3FD", "html": "&#x1F9BB;&#x1F3FD;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻģ🏾", "name": "ear with hearing aid: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9BB 1F3FE", "html": "&#x1F9BB;&#x1F3FE;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻģđŸŋ", "name": "ear with hearing aid: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9BB 1F3FF", "html": "&#x1F9BB;&#x1F3FF;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "🧠", "name": "brain", "shortname": ":brain:", "unicode": "1F9E0", "html": "&#x1F9E0;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻˇ", "name": "tooth", "shortname": ":tooth:", "unicode": "1F9B7", "html": "&#x1F9B7;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸĻ´", "name": "bone", "shortname": ":bone:", "unicode": "1F9B4", "html": "&#x1F9B4;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "đŸ‘ī¸", "name": "eye", "shortname": ":eye:", "unicode": "1F441 FE0F", "html": "&#x1F441;&#xFE0F;", "category": "People & Body (body-parts)", "order": ""},
+ {"emoji": "🧒", "name": "child", "shortname": ":child:", "unicode": "1F9D2", "html": "&#x1F9D2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧒đŸģ", "name": "child: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D2 1F3FB", "html": "&#x1F9D2;&#x1F3FB;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧒đŸŧ", "name": "child: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D2 1F3FC", "html": "&#x1F9D2;&#x1F3FC;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧒đŸŊ", "name": "child: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D2 1F3FD", "html": "&#x1F9D2;&#x1F3FD;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧒🏾", "name": "child: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D2 1F3FE", "html": "&#x1F9D2;&#x1F3FE;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧒đŸŋ", "name": "child: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D2 1F3FF", "html": "&#x1F9D2;&#x1F3FF;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧑", "name": "person", "shortname": ":person:", "unicode": "1F9D1", "html": "&#x1F9D1;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧑đŸģ", "name": "person: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB", "html": "&#x1F9D1;&#x1F3FB;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧑đŸŧ", "name": "person: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC", "html": "&#x1F9D1;&#x1F3FC;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧑đŸŊ", "name": "person: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD", "html": "&#x1F9D1;&#x1F3FD;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧑🏾", "name": "person: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE", "html": "&#x1F9D1;&#x1F3FE;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧑đŸŋ", "name": "person: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF", "html": "&#x1F9D1;&#x1F3FF;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧔", "name": "man: beard", "shortname": ":beard:", "unicode": "1F9D4", "html": "&#x1F9D4;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧔đŸģ", "name": "man: light skin tone, beard", "shortname": ":light_skin_tone_beard:", "unicode": "1F9D4 1F3FB", "html": "&#x1F9D4;&#x1F3FB;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧔đŸŧ", "name": "man: medium-light skin tone, beard", "shortname": ":mediumlight_skin_tone_beard:", "unicode": "1F9D4 1F3FC", "html": "&#x1F9D4;&#x1F3FC;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧔đŸŊ", "name": "man: medium skin tone, beard", "shortname": ":medium_skin_tone_beard:", "unicode": "1F9D4 1F3FD", "html": "&#x1F9D4;&#x1F3FD;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧔🏾", "name": "man: medium-dark skin tone, beard", "shortname": ":mediumdark_skin_tone_beard:", "unicode": "1F9D4 1F3FE", "html": "&#x1F9D4;&#x1F3FE;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧔đŸŋ", "name": "man: dark skin tone, beard", "shortname": ":dark_skin_tone_beard:", "unicode": "1F9D4 1F3FF", "html": "&#x1F9D4;&#x1F3FF;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👨‍đŸĻ°", "name": "man: red hair", "shortname": ":red_hair:", "unicode": "1F468 200D 1F9B0", "html": "&#x1F468;&#x200D;&#x1F9B0;", "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": "&#x1F468;&#x1F3FB;&#x200D;&#x1F9B0;", "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": "&#x1F468;&#x1F3FC;&#x200D;&#x1F9B0;", "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": "&#x1F468;&#x1F3FD;&#x200D;&#x1F9B0;", "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": "&#x1F468;&#x1F3FE;&#x200D;&#x1F9B0;", "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": "&#x1F468;&#x1F3FF;&#x200D;&#x1F9B0;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👨‍đŸĻą", "name": "man: curly hair", "shortname": ":curly_hair:", "unicode": "1F468 200D 1F9B1", "html": "&#x1F468;&#x200D;&#x1F9B1;", "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": "&#x1F468;&#x1F3FB;&#x200D;&#x1F9B1;", "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": "&#x1F468;&#x1F3FC;&#x200D;&#x1F9B1;", "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": "&#x1F468;&#x1F3FD;&#x200D;&#x1F9B1;", "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": "&#x1F468;&#x1F3FE;&#x200D;&#x1F9B1;", "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": "&#x1F468;&#x1F3FF;&#x200D;&#x1F9B1;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👨‍đŸĻŗ", "name": "man: white hair", "shortname": ":white_hair:", "unicode": "1F468 200D 1F9B3", "html": "&#x1F468;&#x200D;&#x1F9B3;", "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": "&#x1F468;&#x1F3FB;&#x200D;&#x1F9B3;", "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": "&#x1F468;&#x1F3FC;&#x200D;&#x1F9B3;", "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": "&#x1F468;&#x1F3FD;&#x200D;&#x1F9B3;", "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": "&#x1F468;&#x1F3FE;&#x200D;&#x1F9B3;", "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": "&#x1F468;&#x1F3FF;&#x200D;&#x1F9B3;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👨‍đŸĻ˛", "name": "man: bald", "shortname": ":bald:", "unicode": "1F468 200D 1F9B2", "html": "&#x1F468;&#x200D;&#x1F9B2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👨đŸģ‍đŸĻ˛", "name": "man: light skin tone, bald", "shortname": ":light_skin_tone_bald:", "unicode": "1F468 1F3FB 200D 1F9B2", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x1F9B2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👨đŸŧ‍đŸĻ˛", "name": "man: medium-light skin tone, bald", "shortname": ":mediumlight_skin_tone_bald:", "unicode": "1F468 1F3FC 200D 1F9B2", "html": "&#x1F468;&#x1F3FC;&#x200D;&#x1F9B2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👨đŸŊ‍đŸĻ˛", "name": "man: medium skin tone, bald", "shortname": ":medium_skin_tone_bald:", "unicode": "1F468 1F3FD 200D 1F9B2", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x1F9B2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👨🏾‍đŸĻ˛", "name": "man: medium-dark skin tone, bald", "shortname": ":mediumdark_skin_tone_bald:", "unicode": "1F468 1F3FE 200D 1F9B2", "html": "&#x1F468;&#x1F3FE;&#x200D;&#x1F9B2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👨đŸŋ‍đŸĻ˛", "name": "man: dark skin tone, bald", "shortname": ":dark_skin_tone_bald:", "unicode": "1F468 1F3FF 200D 1F9B2", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x1F9B2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👩‍đŸĻ°", "name": "woman: red hair", "shortname": ":red_hair:", "unicode": "1F469 200D 1F9B0", "html": "&#x1F469;&#x200D;&#x1F9B0;", "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": "&#x1F469;&#x1F3FB;&#x200D;&#x1F9B0;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x1F9B0;", "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": "&#x1F469;&#x1F3FD;&#x200D;&#x1F9B0;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x1F9B0;", "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": "&#x1F469;&#x1F3FF;&#x200D;&#x1F9B0;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧑‍đŸĻ°", "name": "person: red hair", "shortname": ":red_hair:", "unicode": "1F9D1 200D 1F9B0", "html": "&#x1F9D1;&#x200D;&#x1F9B0;", "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": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F9B0;", "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": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F9B0;", "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": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F9B0;", "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": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F9B0;", "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": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F9B0;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👩‍đŸĻą", "name": "woman: curly hair", "shortname": ":curly_hair:", "unicode": "1F469 200D 1F9B1", "html": "&#x1F469;&#x200D;&#x1F9B1;", "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": "&#x1F469;&#x1F3FB;&#x200D;&#x1F9B1;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x1F9B1;", "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": "&#x1F469;&#x1F3FD;&#x200D;&#x1F9B1;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x1F9B1;", "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": "&#x1F469;&#x1F3FF;&#x200D;&#x1F9B1;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧑‍đŸĻą", "name": "person: curly hair", "shortname": ":curly_hair:", "unicode": "1F9D1 200D 1F9B1", "html": "&#x1F9D1;&#x200D;&#x1F9B1;", "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": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F9B1;", "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": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F9B1;", "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": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F9B1;", "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": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F9B1;", "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": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F9B1;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👩‍đŸĻŗ", "name": "woman: white hair", "shortname": ":white_hair:", "unicode": "1F469 200D 1F9B3", "html": "&#x1F469;&#x200D;&#x1F9B3;", "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": "&#x1F469;&#x1F3FB;&#x200D;&#x1F9B3;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x1F9B3;", "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": "&#x1F469;&#x1F3FD;&#x200D;&#x1F9B3;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x1F9B3;", "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": "&#x1F469;&#x1F3FF;&#x200D;&#x1F9B3;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧑‍đŸĻŗ", "name": "person: white hair", "shortname": ":white_hair:", "unicode": "1F9D1 200D 1F9B3", "html": "&#x1F9D1;&#x200D;&#x1F9B3;", "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": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F9B3;", "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": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F9B3;", "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": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F9B3;", "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": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F9B3;", "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": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F9B3;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👩‍đŸĻ˛", "name": "woman: bald", "shortname": ":bald:", "unicode": "1F469 200D 1F9B2", "html": "&#x1F469;&#x200D;&#x1F9B2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👩đŸģ‍đŸĻ˛", "name": "woman: light skin tone, bald", "shortname": ":light_skin_tone_bald:", "unicode": "1F469 1F3FB 200D 1F9B2", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x1F9B2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👩đŸŧ‍đŸĻ˛", "name": "woman: medium-light skin tone, bald", "shortname": ":mediumlight_skin_tone_bald:", "unicode": "1F469 1F3FC 200D 1F9B2", "html": "&#x1F469;&#x1F3FC;&#x200D;&#x1F9B2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👩đŸŊ‍đŸĻ˛", "name": "woman: medium skin tone, bald", "shortname": ":medium_skin_tone_bald:", "unicode": "1F469 1F3FD 200D 1F9B2", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x1F9B2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👩🏾‍đŸĻ˛", "name": "woman: medium-dark skin tone, bald", "shortname": ":mediumdark_skin_tone_bald:", "unicode": "1F469 1F3FE 200D 1F9B2", "html": "&#x1F469;&#x1F3FE;&#x200D;&#x1F9B2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👩đŸŋ‍đŸĻ˛", "name": "woman: dark skin tone, bald", "shortname": ":dark_skin_tone_bald:", "unicode": "1F469 1F3FF 200D 1F9B2", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x1F9B2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧑‍đŸĻ˛", "name": "person: bald", "shortname": ":bald:", "unicode": "1F9D1 200D 1F9B2", "html": "&#x1F9D1;&#x200D;&#x1F9B2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧑đŸģ‍đŸĻ˛", "name": "person: light skin tone, bald", "shortname": ":light_skin_tone_bald:", "unicode": "1F9D1 1F3FB 200D 1F9B2", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F9B2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧑đŸŧ‍đŸĻ˛", "name": "person: medium-light skin tone, bald", "shortname": ":mediumlight_skin_tone_bald:", "unicode": "1F9D1 1F3FC 200D 1F9B2", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F9B2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧑đŸŊ‍đŸĻ˛", "name": "person: medium skin tone, bald", "shortname": ":medium_skin_tone_bald:", "unicode": "1F9D1 1F3FD 200D 1F9B2", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F9B2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧑🏾‍đŸĻ˛", "name": "person: medium-dark skin tone, bald", "shortname": ":mediumdark_skin_tone_bald:", "unicode": "1F9D1 1F3FE 200D 1F9B2", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F9B2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧑đŸŋ‍đŸĻ˛", "name": "person: dark skin tone, bald", "shortname": ":dark_skin_tone_bald:", "unicode": "1F9D1 1F3FF 200D 1F9B2", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F9B2;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "đŸ‘ąâ€â™€ī¸", "name": "woman: blond hair", "shortname": ":blond_hair:", "unicode": "1F471 200D 2640 FE0F", "html": "&#x1F471;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F471;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F471;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F471;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F471;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F471;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "đŸ‘ąâ€â™‚ī¸", "name": "man: blond hair", "shortname": ":blond_hair:", "unicode": "1F471 200D 2642 FE0F", "html": "&#x1F471;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "👱‍♂", "name": "man: blond hair", "shortname": ":blond_hair:", "unicode": "1F471 200D 2642", "html": "&#x1F471;&#x200D;&#x2642;", "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": "&#x1F471;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F471;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F471;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F471;&#x1F3FC;&#x200D;&#x2642;", "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": "&#x1F471;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F471;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F471;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F471;&#x1F3FE;&#x200D;&#x2642;", "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": "&#x1F471;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F471;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧓", "name": "older person", "shortname": ":older_person:", "unicode": "1F9D3", "html": "&#x1F9D3;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧓đŸģ", "name": "older person: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D3 1F3FB", "html": "&#x1F9D3;&#x1F3FB;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧓đŸŧ", "name": "older person: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D3 1F3FC", "html": "&#x1F9D3;&#x1F3FC;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧓đŸŊ", "name": "older person: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D3 1F3FD", "html": "&#x1F9D3;&#x1F3FD;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧓🏾", "name": "older person: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D3 1F3FE", "html": "&#x1F9D3;&#x1F3FE;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "🧓đŸŋ", "name": "older person: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D3 1F3FF", "html": "&#x1F9D3;&#x1F3FF;", "category": "People & Body (person)", "order": ""},
+ {"emoji": "đŸ™â€â™‚ī¸", "name": "man frowning", "shortname": ":man_frowning:", "unicode": "1F64D 200D 2642 FE0F", "html": "&#x1F64D;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍đŸģâ€â™‚ī¸", "name": "man frowning: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64D 1F3FB 200D 2642 FE0F", "html": "&#x1F64D;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F64D;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍đŸŊâ€â™‚ī¸", "name": "man frowning: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64D 1F3FD 200D 2642 FE0F", "html": "&#x1F64D;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F64D;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍đŸŋâ€â™‚ī¸", "name": "man frowning: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64D 1F3FF 200D 2642 FE0F", "html": "&#x1F64D;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ™â€â™€ī¸", "name": "woman frowning", "shortname": ":woman_frowning:", "unicode": "1F64D 200D 2640 FE0F", "html": "&#x1F64D;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍‍♀", "name": "woman frowning", "shortname": ":woman_frowning:", "unicode": "1F64D 200D 2640", "html": "&#x1F64D;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍đŸģâ€â™€ī¸", "name": "woman frowning: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64D 1F3FB 200D 2640 FE0F", "html": "&#x1F64D;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍đŸģ‍♀", "name": "woman frowning: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64D 1F3FB 200D 2640", "html": "&#x1F64D;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F64D;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍đŸŧ‍♀", "name": "woman frowning: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64D 1F3FC 200D 2640", "html": "&#x1F64D;&#x1F3FC;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍đŸŊâ€â™€ī¸", "name": "woman frowning: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64D 1F3FD 200D 2640 FE0F", "html": "&#x1F64D;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍đŸŊ‍♀", "name": "woman frowning: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64D 1F3FD 200D 2640", "html": "&#x1F64D;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F64D;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍🏾‍♀", "name": "woman frowning: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64D 1F3FE 200D 2640", "html": "&#x1F64D;&#x1F3FE;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍đŸŋâ€â™€ī¸", "name": "woman frowning: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64D 1F3FF 200D 2640 FE0F", "html": "&#x1F64D;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙍đŸŋ‍♀", "name": "woman frowning: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64D 1F3FF 200D 2640", "html": "&#x1F64D;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ™Žâ€â™‚ī¸", "name": "man pouting", "shortname": ":man_pouting:", "unicode": "1F64E 200D 2642 FE0F", "html": "&#x1F64E;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎đŸģâ€â™‚ī¸", "name": "man pouting: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64E 1F3FB 200D 2642 FE0F", "html": "&#x1F64E;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F64E;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎đŸŊâ€â™‚ī¸", "name": "man pouting: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64E 1F3FD 200D 2642 FE0F", "html": "&#x1F64E;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F64E;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎đŸŋâ€â™‚ī¸", "name": "man pouting: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64E 1F3FF 200D 2642 FE0F", "html": "&#x1F64E;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ™Žâ€â™€ī¸", "name": "woman pouting", "shortname": ":woman_pouting:", "unicode": "1F64E 200D 2640 FE0F", "html": "&#x1F64E;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎‍♀", "name": "woman pouting", "shortname": ":woman_pouting:", "unicode": "1F64E 200D 2640", "html": "&#x1F64E;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎đŸģâ€â™€ī¸", "name": "woman pouting: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64E 1F3FB 200D 2640 FE0F", "html": "&#x1F64E;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎đŸģ‍♀", "name": "woman pouting: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64E 1F3FB 200D 2640", "html": "&#x1F64E;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F64E;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎đŸŧ‍♀", "name": "woman pouting: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F64E 1F3FC 200D 2640", "html": "&#x1F64E;&#x1F3FC;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎đŸŊâ€â™€ī¸", "name": "woman pouting: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64E 1F3FD 200D 2640 FE0F", "html": "&#x1F64E;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎đŸŊ‍♀", "name": "woman pouting: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64E 1F3FD 200D 2640", "html": "&#x1F64E;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F64E;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎🏾‍♀", "name": "woman pouting: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F64E 1F3FE 200D 2640", "html": "&#x1F64E;&#x1F3FE;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎đŸŋâ€â™€ī¸", "name": "woman pouting: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64E 1F3FF 200D 2640 FE0F", "html": "&#x1F64E;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙎đŸŋ‍♀", "name": "woman pouting: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64E 1F3FF 200D 2640", "html": "&#x1F64E;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ™…â€â™‚ī¸", "name": "man gesturing NO", "shortname": ":man_gesturing_NO:", "unicode": "1F645 200D 2642 FE0F", "html": "&#x1F645;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F645;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F645;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F645;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F645;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F645;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ™…â€â™€ī¸", "name": "woman gesturing NO", "shortname": ":woman_gesturing_NO:", "unicode": "1F645 200D 2640 FE0F", "html": "&#x1F645;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙅‍♀", "name": "woman gesturing NO", "shortname": ":woman_gesturing_NO:", "unicode": "1F645 200D 2640", "html": "&#x1F645;&#x200D;&#x2640;", "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": "&#x1F645;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙅đŸģ‍♀", "name": "woman gesturing NO: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F645 1F3FB 200D 2640", "html": "&#x1F645;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F645;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F645;&#x1F3FC;&#x200D;&#x2640;", "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": "&#x1F645;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙅đŸŊ‍♀", "name": "woman gesturing NO: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F645 1F3FD 200D 2640", "html": "&#x1F645;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F645;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F645;&#x1F3FE;&#x200D;&#x2640;", "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": "&#x1F645;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙅đŸŋ‍♀", "name": "woman gesturing NO: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F645 1F3FF 200D 2640", "html": "&#x1F645;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ™†â€â™‚ī¸", "name": "man gesturing OK", "shortname": ":man_gesturing_OK:", "unicode": "1F646 200D 2642 FE0F", "html": "&#x1F646;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F646;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F646;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F646;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F646;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F646;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ™†â€â™€ī¸", "name": "woman gesturing OK", "shortname": ":woman_gesturing_OK:", "unicode": "1F646 200D 2640 FE0F", "html": "&#x1F646;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙆‍♀", "name": "woman gesturing OK", "shortname": ":woman_gesturing_OK:", "unicode": "1F646 200D 2640", "html": "&#x1F646;&#x200D;&#x2640;", "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": "&#x1F646;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙆đŸģ‍♀", "name": "woman gesturing OK: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F646 1F3FB 200D 2640", "html": "&#x1F646;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F646;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F646;&#x1F3FC;&#x200D;&#x2640;", "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": "&#x1F646;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙆đŸŊ‍♀", "name": "woman gesturing OK: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F646 1F3FD 200D 2640", "html": "&#x1F646;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F646;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F646;&#x1F3FE;&#x200D;&#x2640;", "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": "&#x1F646;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙆đŸŋ‍♀", "name": "woman gesturing OK: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F646 1F3FF 200D 2640", "html": "&#x1F646;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ’â€â™‚ī¸", "name": "man tipping hand", "shortname": ":man_tipping_hand:", "unicode": "1F481 200D 2642 FE0F", "html": "&#x1F481;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F481;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F481;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F481;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F481;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F481;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ’â€â™€ī¸", "name": "woman tipping hand", "shortname": ":woman_tipping_hand:", "unicode": "1F481 200D 2640 FE0F", "html": "&#x1F481;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "💁‍♀", "name": "woman tipping hand", "shortname": ":woman_tipping_hand:", "unicode": "1F481 200D 2640", "html": "&#x1F481;&#x200D;&#x2640;", "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": "&#x1F481;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "💁đŸģ‍♀", "name": "woman tipping hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F481 1F3FB 200D 2640", "html": "&#x1F481;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F481;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F481;&#x1F3FC;&#x200D;&#x2640;", "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": "&#x1F481;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "💁đŸŊ‍♀", "name": "woman tipping hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F481 1F3FD 200D 2640", "html": "&#x1F481;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F481;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F481;&#x1F3FE;&#x200D;&#x2640;", "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": "&#x1F481;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "💁đŸŋ‍♀", "name": "woman tipping hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F481 1F3FF 200D 2640", "html": "&#x1F481;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ™‹â€â™‚ī¸", "name": "man raising hand", "shortname": ":man_raising_hand:", "unicode": "1F64B 200D 2642 FE0F", "html": "&#x1F64B;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F64B;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F64B;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F64B;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F64B;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F64B;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ™‹â€â™€ī¸", "name": "woman raising hand", "shortname": ":woman_raising_hand:", "unicode": "1F64B 200D 2640 FE0F", "html": "&#x1F64B;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙋‍♀", "name": "woman raising hand", "shortname": ":woman_raising_hand:", "unicode": "1F64B 200D 2640", "html": "&#x1F64B;&#x200D;&#x2640;", "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": "&#x1F64B;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙋đŸģ‍♀", "name": "woman raising hand: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F64B 1F3FB 200D 2640", "html": "&#x1F64B;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F64B;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F64B;&#x1F3FC;&#x200D;&#x2640;", "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": "&#x1F64B;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙋đŸŊ‍♀", "name": "woman raising hand: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F64B 1F3FD 200D 2640", "html": "&#x1F64B;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F64B;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F64B;&#x1F3FE;&#x200D;&#x2640;", "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": "&#x1F64B;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙋đŸŋ‍♀", "name": "woman raising hand: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F64B 1F3FF 200D 2640", "html": "&#x1F64B;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏", "name": "deaf person", "shortname": ":deaf_person:", "unicode": "1F9CF", "html": "&#x1F9CF;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏đŸģ", "name": "deaf person: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CF 1F3FB", "html": "&#x1F9CF;&#x1F3FB;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏đŸŧ", "name": "deaf person: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CF 1F3FC", "html": "&#x1F9CF;&#x1F3FC;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏đŸŊ", "name": "deaf person: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CF 1F3FD", "html": "&#x1F9CF;&#x1F3FD;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏🏾", "name": "deaf person: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CF 1F3FE", "html": "&#x1F9CF;&#x1F3FE;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏đŸŋ", "name": "deaf person: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CF 1F3FF", "html": "&#x1F9CF;&#x1F3FF;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ§â€â™‚ī¸", "name": "deaf man", "shortname": ":deaf_man:", "unicode": "1F9CF 200D 2642 FE0F", "html": "&#x1F9CF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏‍♂", "name": "deaf man", "shortname": ":deaf_man:", "unicode": "1F9CF 200D 2642", "html": "&#x1F9CF;&#x200D;&#x2642;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏đŸģâ€â™‚ī¸", "name": "deaf man: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CF 1F3FB 200D 2642 FE0F", "html": "&#x1F9CF;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏đŸģ‍♂", "name": "deaf man: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CF 1F3FB 200D 2642", "html": "&#x1F9CF;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F9CF;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏đŸŧ‍♂", "name": "deaf man: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CF 1F3FC 200D 2642", "html": "&#x1F9CF;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏đŸŊâ€â™‚ī¸", "name": "deaf man: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CF 1F3FD 200D 2642 FE0F", "html": "&#x1F9CF;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏đŸŊ‍♂", "name": "deaf man: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CF 1F3FD 200D 2642", "html": "&#x1F9CF;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F9CF;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏🏾‍♂", "name": "deaf man: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CF 1F3FE 200D 2642", "html": "&#x1F9CF;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏đŸŋâ€â™‚ī¸", "name": "deaf man: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CF 1F3FF 200D 2642 FE0F", "html": "&#x1F9CF;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏đŸŋ‍♂", "name": "deaf man: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CF 1F3FF 200D 2642", "html": "&#x1F9CF;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ§â€â™€ī¸", "name": "deaf woman", "shortname": ":deaf_woman:", "unicode": "1F9CF 200D 2640 FE0F", "html": "&#x1F9CF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏‍♀", "name": "deaf woman", "shortname": ":deaf_woman:", "unicode": "1F9CF 200D 2640", "html": "&#x1F9CF;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏đŸģâ€â™€ī¸", "name": "deaf woman: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CF 1F3FB 200D 2640 FE0F", "html": "&#x1F9CF;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏đŸģ‍♀", "name": "deaf woman: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CF 1F3FB 200D 2640", "html": "&#x1F9CF;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F9CF;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏đŸŧ‍♀", "name": "deaf woman: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CF 1F3FC 200D 2640", "html": "&#x1F9CF;&#x1F3FC;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏đŸŊâ€â™€ī¸", "name": "deaf woman: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CF 1F3FD 200D 2640 FE0F", "html": "&#x1F9CF;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏đŸŊ‍♀", "name": "deaf woman: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CF 1F3FD 200D 2640", "html": "&#x1F9CF;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F9CF;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏🏾‍♀", "name": "deaf woman: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CF 1F3FE 200D 2640", "html": "&#x1F9CF;&#x1F3FE;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏đŸŋâ€â™€ī¸", "name": "deaf woman: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CF 1F3FF 200D 2640 FE0F", "html": "&#x1F9CF;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🧏đŸŋ‍♀", "name": "deaf woman: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CF 1F3FF 200D 2640", "html": "&#x1F9CF;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ™‡â€â™‚ī¸", "name": "man bowing", "shortname": ":man_bowing:", "unicode": "1F647 200D 2642 FE0F", "html": "&#x1F647;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇‍♂", "name": "man bowing", "shortname": ":man_bowing:", "unicode": "1F647 200D 2642", "html": "&#x1F647;&#x200D;&#x2642;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇đŸģâ€â™‚ī¸", "name": "man bowing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F647 1F3FB 200D 2642 FE0F", "html": "&#x1F647;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇đŸģ‍♂", "name": "man bowing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F647 1F3FB 200D 2642", "html": "&#x1F647;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F647;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇đŸŧ‍♂", "name": "man bowing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F647 1F3FC 200D 2642", "html": "&#x1F647;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇đŸŊâ€â™‚ī¸", "name": "man bowing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F647 1F3FD 200D 2642 FE0F", "html": "&#x1F647;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇đŸŊ‍♂", "name": "man bowing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F647 1F3FD 200D 2642", "html": "&#x1F647;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F647;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇🏾‍♂", "name": "man bowing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F647 1F3FE 200D 2642", "html": "&#x1F647;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇đŸŋâ€â™‚ī¸", "name": "man bowing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F647 1F3FF 200D 2642 FE0F", "html": "&#x1F647;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇đŸŋ‍♂", "name": "man bowing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F647 1F3FF 200D 2642", "html": "&#x1F647;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ™‡â€â™€ī¸", "name": "woman bowing", "shortname": ":woman_bowing:", "unicode": "1F647 200D 2640 FE0F", "html": "&#x1F647;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇đŸģâ€â™€ī¸", "name": "woman bowing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F647 1F3FB 200D 2640 FE0F", "html": "&#x1F647;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F647;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇đŸŊâ€â™€ī¸", "name": "woman bowing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F647 1F3FD 200D 2640 FE0F", "html": "&#x1F647;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F647;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🙇đŸŋâ€â™€ī¸", "name": "woman bowing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F647 1F3FF 200D 2640 FE0F", "html": "&#x1F647;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤Ļ", "name": "person facepalming", "shortname": ":person_facepalming:", "unicode": "1F926", "html": "&#x1F926;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ĻđŸģ", "name": "person facepalming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F926 1F3FB", "html": "&#x1F926;&#x1F3FB;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ĻđŸŧ", "name": "person facepalming: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F926 1F3FC", "html": "&#x1F926;&#x1F3FC;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ĻđŸŊ", "name": "person facepalming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F926 1F3FD", "html": "&#x1F926;&#x1F3FD;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤Ļ🏾", "name": "person facepalming: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F926 1F3FE", "html": "&#x1F926;&#x1F3FE;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ĻđŸŋ", "name": "person facepalming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F926 1F3FF", "html": "&#x1F926;&#x1F3FF;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤Ļâ€â™‚ī¸", "name": "man facepalming", "shortname": ":man_facepalming:", "unicode": "1F926 200D 2642 FE0F", "html": "&#x1F926;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤Ļ‍♂", "name": "man facepalming", "shortname": ":man_facepalming:", "unicode": "1F926 200D 2642", "html": "&#x1F926;&#x200D;&#x2642;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ĻđŸģâ€â™‚ī¸", "name": "man facepalming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F926 1F3FB 200D 2642 FE0F", "html": "&#x1F926;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ĻđŸģ‍♂", "name": "man facepalming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F926 1F3FB 200D 2642", "html": "&#x1F926;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F926;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ĻđŸŧ‍♂", "name": "man facepalming: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F926 1F3FC 200D 2642", "html": "&#x1F926;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ĻđŸŊâ€â™‚ī¸", "name": "man facepalming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F926 1F3FD 200D 2642 FE0F", "html": "&#x1F926;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ĻđŸŊ‍♂", "name": "man facepalming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F926 1F3FD 200D 2642", "html": "&#x1F926;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F926;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤Ļ🏾‍♂", "name": "man facepalming: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F926 1F3FE 200D 2642", "html": "&#x1F926;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ĻđŸŋâ€â™‚ī¸", "name": "man facepalming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F926 1F3FF 200D 2642 FE0F", "html": "&#x1F926;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ĻđŸŋ‍♂", "name": "man facepalming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F926 1F3FF 200D 2642", "html": "&#x1F926;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤Ļâ€â™€ī¸", "name": "woman facepalming", "shortname": ":woman_facepalming:", "unicode": "1F926 200D 2640 FE0F", "html": "&#x1F926;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤Ļ‍♀", "name": "woman facepalming", "shortname": ":woman_facepalming:", "unicode": "1F926 200D 2640", "html": "&#x1F926;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ĻđŸģâ€â™€ī¸", "name": "woman facepalming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F926 1F3FB 200D 2640 FE0F", "html": "&#x1F926;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ĻđŸģ‍♀", "name": "woman facepalming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F926 1F3FB 200D 2640", "html": "&#x1F926;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F926;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ĻđŸŧ‍♀", "name": "woman facepalming: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F926 1F3FC 200D 2640", "html": "&#x1F926;&#x1F3FC;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ĻđŸŊâ€â™€ī¸", "name": "woman facepalming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F926 1F3FD 200D 2640 FE0F", "html": "&#x1F926;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ĻđŸŊ‍♀", "name": "woman facepalming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F926 1F3FD 200D 2640", "html": "&#x1F926;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F926;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤Ļ🏾‍♀", "name": "woman facepalming: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F926 1F3FE 200D 2640", "html": "&#x1F926;&#x1F3FE;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ĻđŸŋâ€â™€ī¸", "name": "woman facepalming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F926 1F3FF 200D 2640 FE0F", "html": "&#x1F926;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ĻđŸŋ‍♀", "name": "woman facepalming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F926 1F3FF 200D 2640", "html": "&#x1F926;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷", "name": "person shrugging", "shortname": ":person_shrugging:", "unicode": "1F937", "html": "&#x1F937;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷đŸģ", "name": "person shrugging: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F937 1F3FB", "html": "&#x1F937;&#x1F3FB;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷đŸŧ", "name": "person shrugging: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F937 1F3FC", "html": "&#x1F937;&#x1F3FC;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷đŸŊ", "name": "person shrugging: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F937 1F3FD", "html": "&#x1F937;&#x1F3FD;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷🏾", "name": "person shrugging: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F937 1F3FE", "html": "&#x1F937;&#x1F3FE;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷đŸŋ", "name": "person shrugging: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F937 1F3FF", "html": "&#x1F937;&#x1F3FF;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ˇâ€â™‚ī¸", "name": "man shrugging", "shortname": ":man_shrugging:", "unicode": "1F937 200D 2642 FE0F", "html": "&#x1F937;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷‍♂", "name": "man shrugging", "shortname": ":man_shrugging:", "unicode": "1F937 200D 2642", "html": "&#x1F937;&#x200D;&#x2642;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷đŸģâ€â™‚ī¸", "name": "man shrugging: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F937 1F3FB 200D 2642 FE0F", "html": "&#x1F937;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷đŸģ‍♂", "name": "man shrugging: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F937 1F3FB 200D 2642", "html": "&#x1F937;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F937;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷đŸŧ‍♂", "name": "man shrugging: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F937 1F3FC 200D 2642", "html": "&#x1F937;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷đŸŊâ€â™‚ī¸", "name": "man shrugging: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F937 1F3FD 200D 2642 FE0F", "html": "&#x1F937;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷đŸŊ‍♂", "name": "man shrugging: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F937 1F3FD 200D 2642", "html": "&#x1F937;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F937;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷🏾‍♂", "name": "man shrugging: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F937 1F3FE 200D 2642", "html": "&#x1F937;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷đŸŋâ€â™‚ī¸", "name": "man shrugging: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F937 1F3FF 200D 2642 FE0F", "html": "&#x1F937;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷đŸŋ‍♂", "name": "man shrugging: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F937 1F3FF 200D 2642", "html": "&#x1F937;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ¤ˇâ€â™€ī¸", "name": "woman shrugging", "shortname": ":woman_shrugging:", "unicode": "1F937 200D 2640 FE0F", "html": "&#x1F937;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷‍♀", "name": "woman shrugging", "shortname": ":woman_shrugging:", "unicode": "1F937 200D 2640", "html": "&#x1F937;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷đŸģâ€â™€ī¸", "name": "woman shrugging: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F937 1F3FB 200D 2640 FE0F", "html": "&#x1F937;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷đŸģ‍♀", "name": "woman shrugging: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F937 1F3FB 200D 2640", "html": "&#x1F937;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F937;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷đŸŧ‍♀", "name": "woman shrugging: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F937 1F3FC 200D 2640", "html": "&#x1F937;&#x1F3FC;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷đŸŊâ€â™€ī¸", "name": "woman shrugging: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F937 1F3FD 200D 2640 FE0F", "html": "&#x1F937;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷đŸŊ‍♀", "name": "woman shrugging: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F937 1F3FD 200D 2640", "html": "&#x1F937;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F937;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷🏾‍♀", "name": "woman shrugging: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F937 1F3FE 200D 2640", "html": "&#x1F937;&#x1F3FE;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷đŸŋâ€â™€ī¸", "name": "woman shrugging: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F937 1F3FF 200D 2640 FE0F", "html": "&#x1F937;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "🤷đŸŋ‍♀", "name": "woman shrugging: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F937 1F3FF 200D 2640", "html": "&#x1F937;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-gesture)", "order": ""},
+ {"emoji": "đŸ§‘â€âš•ī¸", "name": "health worker", "shortname": ":health_worker:", "unicode": "1F9D1 200D 2695 FE0F", "html": "&#x1F9D1;&#x200D;&#x2695;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑‍⚕", "name": "health worker", "shortname": ":health_worker:", "unicode": "1F9D1 200D 2695", "html": "&#x1F9D1;&#x200D;&#x2695;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģâ€âš•ī¸", "name": "health worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 2695 FE0F", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x2695;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģ‍⚕", "name": "health worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 2695", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x2695;", "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": "&#x1F9D1;&#x1F3FC;&#x200D;&#x2695;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŧ‍⚕", "name": "health worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 2695", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x2695;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊâ€âš•ī¸", "name": "health worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 2695 FE0F", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x2695;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊ‍⚕", "name": "health worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 2695", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x2695;", "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": "&#x1F9D1;&#x1F3FE;&#x200D;&#x2695;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑🏾‍⚕", "name": "health worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 2695", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x2695;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋâ€âš•ī¸", "name": "health worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 2695 FE0F", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x2695;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋ‍⚕", "name": "health worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 2695", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x2695;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘¨â€âš•ī¸", "name": "man health worker", "shortname": ":man_health_worker:", "unicode": "1F468 200D 2695 FE0F", "html": "&#x1F468;&#x200D;&#x2695;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨‍⚕", "name": "man health worker", "shortname": ":man_health_worker:", "unicode": "1F468 200D 2695", "html": "&#x1F468;&#x200D;&#x2695;", "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": "&#x1F468;&#x1F3FB;&#x200D;&#x2695;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸģ‍⚕", "name": "man health worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 2695", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x2695;", "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": "&#x1F468;&#x1F3FC;&#x200D;&#x2695;&#xFE0F;", "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": "&#x1F468;&#x1F3FC;&#x200D;&#x2695;", "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": "&#x1F468;&#x1F3FD;&#x200D;&#x2695;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŊ‍⚕", "name": "man health worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 2695", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x2695;", "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": "&#x1F468;&#x1F3FE;&#x200D;&#x2695;&#xFE0F;", "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": "&#x1F468;&#x1F3FE;&#x200D;&#x2695;", "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": "&#x1F468;&#x1F3FF;&#x200D;&#x2695;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŋ‍⚕", "name": "man health worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 2695", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x2695;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘Šâ€âš•ī¸", "name": "woman health worker", "shortname": ":woman_health_worker:", "unicode": "1F469 200D 2695 FE0F", "html": "&#x1F469;&#x200D;&#x2695;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩‍⚕", "name": "woman health worker", "shortname": ":woman_health_worker:", "unicode": "1F469 200D 2695", "html": "&#x1F469;&#x200D;&#x2695;", "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": "&#x1F469;&#x1F3FB;&#x200D;&#x2695;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸģ‍⚕", "name": "woman health worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 2695", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x2695;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x2695;&#xFE0F;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x2695;", "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": "&#x1F469;&#x1F3FD;&#x200D;&#x2695;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŊ‍⚕", "name": "woman health worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 2695", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x2695;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x2695;&#xFE0F;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x2695;", "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": "&#x1F469;&#x1F3FF;&#x200D;&#x2695;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŋ‍⚕", "name": "woman health worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 2695", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x2695;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑‍🎓", "name": "student", "shortname": ":student:", "unicode": "1F9D1 200D 1F393", "html": "&#x1F9D1;&#x200D;&#x1F393;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģ‍🎓", "name": "student: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F393", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F393;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŧ‍🎓", "name": "student: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F393", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F393;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊ‍🎓", "name": "student: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F393", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F393;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑🏾‍🎓", "name": "student: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F393", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F393;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋ‍🎓", "name": "student: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F393", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F393;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨‍🎓", "name": "man student", "shortname": ":man_student:", "unicode": "1F468 200D 1F393", "html": "&#x1F468;&#x200D;&#x1F393;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸģ‍🎓", "name": "man student: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F393", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x1F393;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŧ‍🎓", "name": "man student: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F393", "html": "&#x1F468;&#x1F3FC;&#x200D;&#x1F393;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŊ‍🎓", "name": "man student: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F393", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x1F393;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨🏾‍🎓", "name": "man student: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F393", "html": "&#x1F468;&#x1F3FE;&#x200D;&#x1F393;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŋ‍🎓", "name": "man student: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F393", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x1F393;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩‍🎓", "name": "woman student", "shortname": ":woman_student:", "unicode": "1F469 200D 1F393", "html": "&#x1F469;&#x200D;&#x1F393;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸģ‍🎓", "name": "woman student: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F393", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x1F393;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŧ‍🎓", "name": "woman student: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F393", "html": "&#x1F469;&#x1F3FC;&#x200D;&#x1F393;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŊ‍🎓", "name": "woman student: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F393", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x1F393;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩🏾‍🎓", "name": "woman student: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F393", "html": "&#x1F469;&#x1F3FE;&#x200D;&#x1F393;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŋ‍🎓", "name": "woman student: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F393", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x1F393;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑‍đŸĢ", "name": "teacher", "shortname": ":teacher:", "unicode": "1F9D1 200D 1F3EB", "html": "&#x1F9D1;&#x200D;&#x1F3EB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģ‍đŸĢ", "name": "teacher: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F3EB", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F3EB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŧ‍đŸĢ", "name": "teacher: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F3EB", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F3EB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊ‍đŸĢ", "name": "teacher: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F3EB", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F3EB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑🏾‍đŸĢ", "name": "teacher: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F3EB", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F3EB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋ‍đŸĢ", "name": "teacher: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F3EB", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F3EB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨‍đŸĢ", "name": "man teacher", "shortname": ":man_teacher:", "unicode": "1F468 200D 1F3EB", "html": "&#x1F468;&#x200D;&#x1F3EB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸģ‍đŸĢ", "name": "man teacher: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F3EB", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x1F3EB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŧ‍đŸĢ", "name": "man teacher: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F3EB", "html": "&#x1F468;&#x1F3FC;&#x200D;&#x1F3EB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŊ‍đŸĢ", "name": "man teacher: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F3EB", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x1F3EB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨🏾‍đŸĢ", "name": "man teacher: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F3EB", "html": "&#x1F468;&#x1F3FE;&#x200D;&#x1F3EB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŋ‍đŸĢ", "name": "man teacher: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F3EB", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x1F3EB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩‍đŸĢ", "name": "woman teacher", "shortname": ":woman_teacher:", "unicode": "1F469 200D 1F3EB", "html": "&#x1F469;&#x200D;&#x1F3EB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸģ‍đŸĢ", "name": "woman teacher: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F3EB", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x1F3EB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŧ‍đŸĢ", "name": "woman teacher: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F3EB", "html": "&#x1F469;&#x1F3FC;&#x200D;&#x1F3EB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŊ‍đŸĢ", "name": "woman teacher: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F3EB", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x1F3EB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩🏾‍đŸĢ", "name": "woman teacher: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F3EB", "html": "&#x1F469;&#x1F3FE;&#x200D;&#x1F3EB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŋ‍đŸĢ", "name": "woman teacher: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F3EB", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x1F3EB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ§‘â€âš–ī¸", "name": "judge", "shortname": ":judge:", "unicode": "1F9D1 200D 2696 FE0F", "html": "&#x1F9D1;&#x200D;&#x2696;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑‍⚖", "name": "judge", "shortname": ":judge:", "unicode": "1F9D1 200D 2696", "html": "&#x1F9D1;&#x200D;&#x2696;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģâ€âš–ī¸", "name": "judge: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 2696 FE0F", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x2696;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģ‍⚖", "name": "judge: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 2696", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x2696;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŧâ€âš–ī¸", "name": "judge: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 2696 FE0F", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x2696;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŧ‍⚖", "name": "judge: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 2696", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x2696;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊâ€âš–ī¸", "name": "judge: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 2696 FE0F", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x2696;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊ‍⚖", "name": "judge: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 2696", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x2696;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ§‘đŸžâ€âš–ī¸", "name": "judge: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 2696 FE0F", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x2696;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑🏾‍⚖", "name": "judge: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 2696", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x2696;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋâ€âš–ī¸", "name": "judge: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 2696 FE0F", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x2696;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋ‍⚖", "name": "judge: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 2696", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x2696;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘¨â€âš–ī¸", "name": "man judge", "shortname": ":man_judge:", "unicode": "1F468 200D 2696 FE0F", "html": "&#x1F468;&#x200D;&#x2696;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨‍⚖", "name": "man judge", "shortname": ":man_judge:", "unicode": "1F468 200D 2696", "html": "&#x1F468;&#x200D;&#x2696;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸģâ€âš–ī¸", "name": "man judge: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 2696 FE0F", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x2696;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸģ‍⚖", "name": "man judge: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 2696", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x2696;", "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": "&#x1F468;&#x1F3FC;&#x200D;&#x2696;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŧ‍⚖", "name": "man judge: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 2696", "html": "&#x1F468;&#x1F3FC;&#x200D;&#x2696;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŊâ€âš–ī¸", "name": "man judge: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 2696 FE0F", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x2696;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŊ‍⚖", "name": "man judge: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 2696", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x2696;", "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": "&#x1F468;&#x1F3FE;&#x200D;&#x2696;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨🏾‍⚖", "name": "man judge: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 2696", "html": "&#x1F468;&#x1F3FE;&#x200D;&#x2696;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŋâ€âš–ī¸", "name": "man judge: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 2696 FE0F", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x2696;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŋ‍⚖", "name": "man judge: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 2696", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x2696;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘Šâ€âš–ī¸", "name": "woman judge", "shortname": ":woman_judge:", "unicode": "1F469 200D 2696 FE0F", "html": "&#x1F469;&#x200D;&#x2696;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩‍⚖", "name": "woman judge", "shortname": ":woman_judge:", "unicode": "1F469 200D 2696", "html": "&#x1F469;&#x200D;&#x2696;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸģâ€âš–ī¸", "name": "woman judge: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 2696 FE0F", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x2696;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸģ‍⚖", "name": "woman judge: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 2696", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x2696;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x2696;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŧ‍⚖", "name": "woman judge: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 2696", "html": "&#x1F469;&#x1F3FC;&#x200D;&#x2696;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŊâ€âš–ī¸", "name": "woman judge: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 2696 FE0F", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x2696;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŊ‍⚖", "name": "woman judge: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 2696", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x2696;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x2696;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩🏾‍⚖", "name": "woman judge: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 2696", "html": "&#x1F469;&#x1F3FE;&#x200D;&#x2696;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŋâ€âš–ī¸", "name": "woman judge: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 2696 FE0F", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x2696;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŋ‍⚖", "name": "woman judge: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 2696", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x2696;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑‍🌾", "name": "farmer", "shortname": ":farmer:", "unicode": "1F9D1 200D 1F33E", "html": "&#x1F9D1;&#x200D;&#x1F33E;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģ‍🌾", "name": "farmer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F33E", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F33E;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŧ‍🌾", "name": "farmer: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F33E", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F33E;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊ‍🌾", "name": "farmer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F33E", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F33E;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑🏾‍🌾", "name": "farmer: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F33E", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F33E;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋ‍🌾", "name": "farmer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F33E", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F33E;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨‍🌾", "name": "man farmer", "shortname": ":man_farmer:", "unicode": "1F468 200D 1F33E", "html": "&#x1F468;&#x200D;&#x1F33E;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸģ‍🌾", "name": "man farmer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F33E", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x1F33E;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŧ‍🌾", "name": "man farmer: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F33E", "html": "&#x1F468;&#x1F3FC;&#x200D;&#x1F33E;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŊ‍🌾", "name": "man farmer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F33E", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x1F33E;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨🏾‍🌾", "name": "man farmer: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F33E", "html": "&#x1F468;&#x1F3FE;&#x200D;&#x1F33E;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŋ‍🌾", "name": "man farmer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F33E", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x1F33E;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩‍🌾", "name": "woman farmer", "shortname": ":woman_farmer:", "unicode": "1F469 200D 1F33E", "html": "&#x1F469;&#x200D;&#x1F33E;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸģ‍🌾", "name": "woman farmer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F33E", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x1F33E;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŧ‍🌾", "name": "woman farmer: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F33E", "html": "&#x1F469;&#x1F3FC;&#x200D;&#x1F33E;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŊ‍🌾", "name": "woman farmer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F33E", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x1F33E;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩🏾‍🌾", "name": "woman farmer: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F33E", "html": "&#x1F469;&#x1F3FE;&#x200D;&#x1F33E;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŋ‍🌾", "name": "woman farmer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F33E", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x1F33E;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ§‘â€đŸŗ", "name": "cook", "shortname": ":cook:", "unicode": "1F9D1 200D 1F373", "html": "&#x1F9D1;&#x200D;&#x1F373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģâ€đŸŗ", "name": "cook: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F373", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŧâ€đŸŗ", "name": "cook: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F373", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊâ€đŸŗ", "name": "cook: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F373", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ§‘đŸžâ€đŸŗ", "name": "cook: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F373", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋâ€đŸŗ", "name": "cook: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F373", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘¨â€đŸŗ", "name": "man cook", "shortname": ":man_cook:", "unicode": "1F468 200D 1F373", "html": "&#x1F468;&#x200D;&#x1F373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸģâ€đŸŗ", "name": "man cook: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F373", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x1F373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŧâ€đŸŗ", "name": "man cook: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F373", "html": "&#x1F468;&#x1F3FC;&#x200D;&#x1F373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŊâ€đŸŗ", "name": "man cook: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F373", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x1F373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘¨đŸžâ€đŸŗ", "name": "man cook: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F373", "html": "&#x1F468;&#x1F3FE;&#x200D;&#x1F373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŋâ€đŸŗ", "name": "man cook: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F373", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x1F373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘Šâ€đŸŗ", "name": "woman cook", "shortname": ":woman_cook:", "unicode": "1F469 200D 1F373", "html": "&#x1F469;&#x200D;&#x1F373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸģâ€đŸŗ", "name": "woman cook: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F373", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x1F373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŧâ€đŸŗ", "name": "woman cook: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F373", "html": "&#x1F469;&#x1F3FC;&#x200D;&#x1F373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŊâ€đŸŗ", "name": "woman cook: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F373", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x1F373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘ŠđŸžâ€đŸŗ", "name": "woman cook: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F373", "html": "&#x1F469;&#x1F3FE;&#x200D;&#x1F373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŋâ€đŸŗ", "name": "woman cook: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F373", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x1F373;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑‍🔧", "name": "mechanic", "shortname": ":mechanic:", "unicode": "1F9D1 200D 1F527", "html": "&#x1F9D1;&#x200D;&#x1F527;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģ‍🔧", "name": "mechanic: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F527", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F527;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŧ‍🔧", "name": "mechanic: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F527", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F527;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊ‍🔧", "name": "mechanic: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F527", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F527;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑🏾‍🔧", "name": "mechanic: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F527", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F527;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋ‍🔧", "name": "mechanic: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F527", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F527;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨‍🔧", "name": "man mechanic", "shortname": ":man_mechanic:", "unicode": "1F468 200D 1F527", "html": "&#x1F468;&#x200D;&#x1F527;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸģ‍🔧", "name": "man mechanic: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F527", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x1F527;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŧ‍🔧", "name": "man mechanic: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F527", "html": "&#x1F468;&#x1F3FC;&#x200D;&#x1F527;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŊ‍🔧", "name": "man mechanic: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F527", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x1F527;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨🏾‍🔧", "name": "man mechanic: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F527", "html": "&#x1F468;&#x1F3FE;&#x200D;&#x1F527;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŋ‍🔧", "name": "man mechanic: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F527", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x1F527;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩‍🔧", "name": "woman mechanic", "shortname": ":woman_mechanic:", "unicode": "1F469 200D 1F527", "html": "&#x1F469;&#x200D;&#x1F527;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸģ‍🔧", "name": "woman mechanic: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F527", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x1F527;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŧ‍🔧", "name": "woman mechanic: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F527", "html": "&#x1F469;&#x1F3FC;&#x200D;&#x1F527;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŊ‍🔧", "name": "woman mechanic: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F527", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x1F527;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩🏾‍🔧", "name": "woman mechanic: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F527", "html": "&#x1F469;&#x1F3FE;&#x200D;&#x1F527;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŋ‍🔧", "name": "woman mechanic: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F527", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x1F527;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑‍🏭", "name": "factory worker", "shortname": ":factory_worker:", "unicode": "1F9D1 200D 1F3ED", "html": "&#x1F9D1;&#x200D;&#x1F3ED;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģ‍🏭", "name": "factory worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F3ED", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F3ED;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŧ‍🏭", "name": "factory worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F3ED", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F3ED;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊ‍🏭", "name": "factory worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F3ED", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F3ED;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑🏾‍🏭", "name": "factory worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F3ED", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F3ED;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋ‍🏭", "name": "factory worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F3ED", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F3ED;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨‍🏭", "name": "man factory worker", "shortname": ":man_factory_worker:", "unicode": "1F468 200D 1F3ED", "html": "&#x1F468;&#x200D;&#x1F3ED;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸģ‍🏭", "name": "man factory worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F3ED", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x1F3ED;", "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": "&#x1F468;&#x1F3FC;&#x200D;&#x1F3ED;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŊ‍🏭", "name": "man factory worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F3ED", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x1F3ED;", "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": "&#x1F468;&#x1F3FE;&#x200D;&#x1F3ED;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŋ‍🏭", "name": "man factory worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F3ED", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x1F3ED;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩‍🏭", "name": "woman factory worker", "shortname": ":woman_factory_worker:", "unicode": "1F469 200D 1F3ED", "html": "&#x1F469;&#x200D;&#x1F3ED;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸģ‍🏭", "name": "woman factory worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F3ED", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x1F3ED;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x1F3ED;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŊ‍🏭", "name": "woman factory worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F3ED", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x1F3ED;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x1F3ED;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŋ‍🏭", "name": "woman factory worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F3ED", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x1F3ED;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑‍đŸ’ŧ", "name": "office worker", "shortname": ":office_worker:", "unicode": "1F9D1 200D 1F4BC", "html": "&#x1F9D1;&#x200D;&#x1F4BC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģ‍đŸ’ŧ", "name": "office worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F4BC", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F4BC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŧ‍đŸ’ŧ", "name": "office worker: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F4BC", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F4BC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊ‍đŸ’ŧ", "name": "office worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F4BC", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F4BC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑🏾‍đŸ’ŧ", "name": "office worker: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F4BC", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F4BC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋ‍đŸ’ŧ", "name": "office worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F4BC", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F4BC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨‍đŸ’ŧ", "name": "man office worker", "shortname": ":man_office_worker:", "unicode": "1F468 200D 1F4BC", "html": "&#x1F468;&#x200D;&#x1F4BC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸģ‍đŸ’ŧ", "name": "man office worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F4BC", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x1F4BC;", "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": "&#x1F468;&#x1F3FC;&#x200D;&#x1F4BC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŊ‍đŸ’ŧ", "name": "man office worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F4BC", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x1F4BC;", "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": "&#x1F468;&#x1F3FE;&#x200D;&#x1F4BC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŋ‍đŸ’ŧ", "name": "man office worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F4BC", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x1F4BC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩‍đŸ’ŧ", "name": "woman office worker", "shortname": ":woman_office_worker:", "unicode": "1F469 200D 1F4BC", "html": "&#x1F469;&#x200D;&#x1F4BC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸģ‍đŸ’ŧ", "name": "woman office worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F4BC", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x1F4BC;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x1F4BC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŊ‍đŸ’ŧ", "name": "woman office worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F4BC", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x1F4BC;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x1F4BC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŋ‍đŸ’ŧ", "name": "woman office worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F4BC", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x1F4BC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑‍đŸ”Ŧ", "name": "scientist", "shortname": ":scientist:", "unicode": "1F9D1 200D 1F52C", "html": "&#x1F9D1;&#x200D;&#x1F52C;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģ‍đŸ”Ŧ", "name": "scientist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F52C", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F52C;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŧ‍đŸ”Ŧ", "name": "scientist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F52C", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F52C;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊ‍đŸ”Ŧ", "name": "scientist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F52C", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F52C;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑🏾‍đŸ”Ŧ", "name": "scientist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F52C", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F52C;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋ‍đŸ”Ŧ", "name": "scientist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F52C", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F52C;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨‍đŸ”Ŧ", "name": "man scientist", "shortname": ":man_scientist:", "unicode": "1F468 200D 1F52C", "html": "&#x1F468;&#x200D;&#x1F52C;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸģ‍đŸ”Ŧ", "name": "man scientist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F52C", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x1F52C;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŧ‍đŸ”Ŧ", "name": "man scientist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F52C", "html": "&#x1F468;&#x1F3FC;&#x200D;&#x1F52C;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŊ‍đŸ”Ŧ", "name": "man scientist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F52C", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x1F52C;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨🏾‍đŸ”Ŧ", "name": "man scientist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F52C", "html": "&#x1F468;&#x1F3FE;&#x200D;&#x1F52C;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŋ‍đŸ”Ŧ", "name": "man scientist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F52C", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x1F52C;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩‍đŸ”Ŧ", "name": "woman scientist", "shortname": ":woman_scientist:", "unicode": "1F469 200D 1F52C", "html": "&#x1F469;&#x200D;&#x1F52C;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸģ‍đŸ”Ŧ", "name": "woman scientist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F52C", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x1F52C;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŧ‍đŸ”Ŧ", "name": "woman scientist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F52C", "html": "&#x1F469;&#x1F3FC;&#x200D;&#x1F52C;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŊ‍đŸ”Ŧ", "name": "woman scientist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F52C", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x1F52C;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩🏾‍đŸ”Ŧ", "name": "woman scientist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F52C", "html": "&#x1F469;&#x1F3FE;&#x200D;&#x1F52C;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŋ‍đŸ”Ŧ", "name": "woman scientist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F52C", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x1F52C;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑‍đŸ’ģ", "name": "technologist", "shortname": ":technologist:", "unicode": "1F9D1 200D 1F4BB", "html": "&#x1F9D1;&#x200D;&#x1F4BB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģ‍đŸ’ģ", "name": "technologist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F4BB", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F4BB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŧ‍đŸ’ģ", "name": "technologist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F4BB", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F4BB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊ‍đŸ’ģ", "name": "technologist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F4BB", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F4BB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑🏾‍đŸ’ģ", "name": "technologist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F4BB", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F4BB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋ‍đŸ’ģ", "name": "technologist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F4BB", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F4BB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨‍đŸ’ģ", "name": "man technologist", "shortname": ":man_technologist:", "unicode": "1F468 200D 1F4BB", "html": "&#x1F468;&#x200D;&#x1F4BB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸģ‍đŸ’ģ", "name": "man technologist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F4BB", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x1F4BB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŧ‍đŸ’ģ", "name": "man technologist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F4BB", "html": "&#x1F468;&#x1F3FC;&#x200D;&#x1F4BB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŊ‍đŸ’ģ", "name": "man technologist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F4BB", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x1F4BB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨🏾‍đŸ’ģ", "name": "man technologist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F4BB", "html": "&#x1F468;&#x1F3FE;&#x200D;&#x1F4BB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŋ‍đŸ’ģ", "name": "man technologist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F4BB", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x1F4BB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩‍đŸ’ģ", "name": "woman technologist", "shortname": ":woman_technologist:", "unicode": "1F469 200D 1F4BB", "html": "&#x1F469;&#x200D;&#x1F4BB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸģ‍đŸ’ģ", "name": "woman technologist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F4BB", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x1F4BB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŧ‍đŸ’ģ", "name": "woman technologist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F4BB", "html": "&#x1F469;&#x1F3FC;&#x200D;&#x1F4BB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŊ‍đŸ’ģ", "name": "woman technologist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F4BB", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x1F4BB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩🏾‍đŸ’ģ", "name": "woman technologist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F4BB", "html": "&#x1F469;&#x1F3FE;&#x200D;&#x1F4BB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŋ‍đŸ’ģ", "name": "woman technologist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F4BB", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x1F4BB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑‍🎤", "name": "singer", "shortname": ":singer:", "unicode": "1F9D1 200D 1F3A4", "html": "&#x1F9D1;&#x200D;&#x1F3A4;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģ‍🎤", "name": "singer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F3A4", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F3A4;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŧ‍🎤", "name": "singer: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F3A4", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F3A4;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊ‍🎤", "name": "singer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F3A4", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F3A4;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑🏾‍🎤", "name": "singer: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F3A4", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F3A4;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋ‍🎤", "name": "singer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F3A4", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F3A4;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨‍🎤", "name": "man singer", "shortname": ":man_singer:", "unicode": "1F468 200D 1F3A4", "html": "&#x1F468;&#x200D;&#x1F3A4;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸģ‍🎤", "name": "man singer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F3A4", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x1F3A4;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŧ‍🎤", "name": "man singer: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F3A4", "html": "&#x1F468;&#x1F3FC;&#x200D;&#x1F3A4;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŊ‍🎤", "name": "man singer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F3A4", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x1F3A4;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨🏾‍🎤", "name": "man singer: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F3A4", "html": "&#x1F468;&#x1F3FE;&#x200D;&#x1F3A4;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŋ‍🎤", "name": "man singer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F3A4", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x1F3A4;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩‍🎤", "name": "woman singer", "shortname": ":woman_singer:", "unicode": "1F469 200D 1F3A4", "html": "&#x1F469;&#x200D;&#x1F3A4;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸģ‍🎤", "name": "woman singer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F3A4", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x1F3A4;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŧ‍🎤", "name": "woman singer: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F3A4", "html": "&#x1F469;&#x1F3FC;&#x200D;&#x1F3A4;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŊ‍🎤", "name": "woman singer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F3A4", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x1F3A4;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩🏾‍🎤", "name": "woman singer: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F3A4", "html": "&#x1F469;&#x1F3FE;&#x200D;&#x1F3A4;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŋ‍🎤", "name": "woman singer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F3A4", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x1F3A4;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑‍🎨", "name": "artist", "shortname": ":artist:", "unicode": "1F9D1 200D 1F3A8", "html": "&#x1F9D1;&#x200D;&#x1F3A8;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģ‍🎨", "name": "artist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F3A8", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F3A8;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŧ‍🎨", "name": "artist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F3A8", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F3A8;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊ‍🎨", "name": "artist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F3A8", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F3A8;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑🏾‍🎨", "name": "artist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F3A8", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F3A8;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋ‍🎨", "name": "artist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F3A8", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F3A8;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨‍🎨", "name": "man artist", "shortname": ":man_artist:", "unicode": "1F468 200D 1F3A8", "html": "&#x1F468;&#x200D;&#x1F3A8;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸģ‍🎨", "name": "man artist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F3A8", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x1F3A8;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŧ‍🎨", "name": "man artist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F3A8", "html": "&#x1F468;&#x1F3FC;&#x200D;&#x1F3A8;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŊ‍🎨", "name": "man artist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F3A8", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x1F3A8;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨🏾‍🎨", "name": "man artist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F3A8", "html": "&#x1F468;&#x1F3FE;&#x200D;&#x1F3A8;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŋ‍🎨", "name": "man artist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F3A8", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x1F3A8;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩‍🎨", "name": "woman artist", "shortname": ":woman_artist:", "unicode": "1F469 200D 1F3A8", "html": "&#x1F469;&#x200D;&#x1F3A8;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸģ‍🎨", "name": "woman artist: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F3A8", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x1F3A8;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŧ‍🎨", "name": "woman artist: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F3A8", "html": "&#x1F469;&#x1F3FC;&#x200D;&#x1F3A8;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŊ‍🎨", "name": "woman artist: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F3A8", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x1F3A8;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩🏾‍🎨", "name": "woman artist: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F3A8", "html": "&#x1F469;&#x1F3FE;&#x200D;&#x1F3A8;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŋ‍🎨", "name": "woman artist: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F3A8", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x1F3A8;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ§‘â€âœˆī¸", "name": "pilot", "shortname": ":pilot:", "unicode": "1F9D1 200D 2708 FE0F", "html": "&#x1F9D1;&#x200D;&#x2708;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑‍✈", "name": "pilot", "shortname": ":pilot:", "unicode": "1F9D1 200D 2708", "html": "&#x1F9D1;&#x200D;&#x2708;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģâ€âœˆī¸", "name": "pilot: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 2708 FE0F", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x2708;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģ‍✈", "name": "pilot: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 2708", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x2708;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŧâ€âœˆī¸", "name": "pilot: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 2708 FE0F", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x2708;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŧ‍✈", "name": "pilot: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 2708", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x2708;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊâ€âœˆī¸", "name": "pilot: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 2708 FE0F", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x2708;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊ‍✈", "name": "pilot: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 2708", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x2708;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ§‘đŸžâ€âœˆī¸", "name": "pilot: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 2708 FE0F", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x2708;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑🏾‍✈", "name": "pilot: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 2708", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x2708;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋâ€âœˆī¸", "name": "pilot: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 2708 FE0F", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x2708;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋ‍✈", "name": "pilot: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 2708", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x2708;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘¨â€âœˆī¸", "name": "man pilot", "shortname": ":man_pilot:", "unicode": "1F468 200D 2708 FE0F", "html": "&#x1F468;&#x200D;&#x2708;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨‍✈", "name": "man pilot", "shortname": ":man_pilot:", "unicode": "1F468 200D 2708", "html": "&#x1F468;&#x200D;&#x2708;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸģâ€âœˆī¸", "name": "man pilot: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 2708 FE0F", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x2708;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸģ‍✈", "name": "man pilot: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 2708", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x2708;", "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": "&#x1F468;&#x1F3FC;&#x200D;&#x2708;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŧ‍✈", "name": "man pilot: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 2708", "html": "&#x1F468;&#x1F3FC;&#x200D;&#x2708;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŊâ€âœˆī¸", "name": "man pilot: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 2708 FE0F", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x2708;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŊ‍✈", "name": "man pilot: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 2708", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x2708;", "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": "&#x1F468;&#x1F3FE;&#x200D;&#x2708;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨🏾‍✈", "name": "man pilot: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 2708", "html": "&#x1F468;&#x1F3FE;&#x200D;&#x2708;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŋâ€âœˆī¸", "name": "man pilot: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 2708 FE0F", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x2708;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŋ‍✈", "name": "man pilot: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 2708", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x2708;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘Šâ€âœˆī¸", "name": "woman pilot", "shortname": ":woman_pilot:", "unicode": "1F469 200D 2708 FE0F", "html": "&#x1F469;&#x200D;&#x2708;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩‍✈", "name": "woman pilot", "shortname": ":woman_pilot:", "unicode": "1F469 200D 2708", "html": "&#x1F469;&#x200D;&#x2708;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸģâ€âœˆī¸", "name": "woman pilot: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 2708 FE0F", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x2708;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸģ‍✈", "name": "woman pilot: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 2708", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x2708;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x2708;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŧ‍✈", "name": "woman pilot: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 2708", "html": "&#x1F469;&#x1F3FC;&#x200D;&#x2708;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŊâ€âœˆī¸", "name": "woman pilot: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 2708 FE0F", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x2708;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŊ‍✈", "name": "woman pilot: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 2708", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x2708;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x2708;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩🏾‍✈", "name": "woman pilot: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 2708", "html": "&#x1F469;&#x1F3FE;&#x200D;&#x2708;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŋâ€âœˆī¸", "name": "woman pilot: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 2708 FE0F", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x2708;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŋ‍✈", "name": "woman pilot: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 2708", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x2708;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑‍🚀", "name": "astronaut", "shortname": ":astronaut:", "unicode": "1F9D1 200D 1F680", "html": "&#x1F9D1;&#x200D;&#x1F680;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģ‍🚀", "name": "astronaut: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F680", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F680;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŧ‍🚀", "name": "astronaut: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F680", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F680;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊ‍🚀", "name": "astronaut: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F680", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F680;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑🏾‍🚀", "name": "astronaut: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F680", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F680;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋ‍🚀", "name": "astronaut: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F680", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F680;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨‍🚀", "name": "man astronaut", "shortname": ":man_astronaut:", "unicode": "1F468 200D 1F680", "html": "&#x1F468;&#x200D;&#x1F680;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸģ‍🚀", "name": "man astronaut: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F680", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x1F680;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŧ‍🚀", "name": "man astronaut: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F680", "html": "&#x1F468;&#x1F3FC;&#x200D;&#x1F680;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŊ‍🚀", "name": "man astronaut: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F680", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x1F680;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨🏾‍🚀", "name": "man astronaut: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F680", "html": "&#x1F468;&#x1F3FE;&#x200D;&#x1F680;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŋ‍🚀", "name": "man astronaut: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F680", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x1F680;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩‍🚀", "name": "woman astronaut", "shortname": ":woman_astronaut:", "unicode": "1F469 200D 1F680", "html": "&#x1F469;&#x200D;&#x1F680;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸģ‍🚀", "name": "woman astronaut: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F680", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x1F680;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŧ‍🚀", "name": "woman astronaut: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F680", "html": "&#x1F469;&#x1F3FC;&#x200D;&#x1F680;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŊ‍🚀", "name": "woman astronaut: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F680", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x1F680;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩🏾‍🚀", "name": "woman astronaut: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F680", "html": "&#x1F469;&#x1F3FE;&#x200D;&#x1F680;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŋ‍🚀", "name": "woman astronaut: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F680", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x1F680;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑‍🚒", "name": "firefighter", "shortname": ":firefighter:", "unicode": "1F9D1 200D 1F692", "html": "&#x1F9D1;&#x200D;&#x1F692;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸģ‍🚒", "name": "firefighter: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D1 1F3FB 200D 1F692", "html": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F692;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŧ‍🚒", "name": "firefighter: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D1 1F3FC 200D 1F692", "html": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F692;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŊ‍🚒", "name": "firefighter: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D1 1F3FD 200D 1F692", "html": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F692;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑🏾‍🚒", "name": "firefighter: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D1 1F3FE 200D 1F692", "html": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F692;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧑đŸŋ‍🚒", "name": "firefighter: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D1 1F3FF 200D 1F692", "html": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F692;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨‍🚒", "name": "man firefighter", "shortname": ":man_firefighter:", "unicode": "1F468 200D 1F692", "html": "&#x1F468;&#x200D;&#x1F692;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸģ‍🚒", "name": "man firefighter: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F468 1F3FB 200D 1F692", "html": "&#x1F468;&#x1F3FB;&#x200D;&#x1F692;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŧ‍🚒", "name": "man firefighter: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F468 1F3FC 200D 1F692", "html": "&#x1F468;&#x1F3FC;&#x200D;&#x1F692;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŊ‍🚒", "name": "man firefighter: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F468 1F3FD 200D 1F692", "html": "&#x1F468;&#x1F3FD;&#x200D;&#x1F692;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨🏾‍🚒", "name": "man firefighter: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F468 1F3FE 200D 1F692", "html": "&#x1F468;&#x1F3FE;&#x200D;&#x1F692;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👨đŸŋ‍🚒", "name": "man firefighter: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F468 1F3FF 200D 1F692", "html": "&#x1F468;&#x1F3FF;&#x200D;&#x1F692;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩‍🚒", "name": "woman firefighter", "shortname": ":woman_firefighter:", "unicode": "1F469 200D 1F692", "html": "&#x1F469;&#x200D;&#x1F692;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸģ‍🚒", "name": "woman firefighter: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F469 1F3FB 200D 1F692", "html": "&#x1F469;&#x1F3FB;&#x200D;&#x1F692;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŧ‍🚒", "name": "woman firefighter: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F469 1F3FC 200D 1F692", "html": "&#x1F469;&#x1F3FC;&#x200D;&#x1F692;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŊ‍🚒", "name": "woman firefighter: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F469 1F3FD 200D 1F692", "html": "&#x1F469;&#x1F3FD;&#x200D;&#x1F692;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩🏾‍🚒", "name": "woman firefighter: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F469 1F3FE 200D 1F692", "html": "&#x1F469;&#x1F3FE;&#x200D;&#x1F692;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👩đŸŋ‍🚒", "name": "woman firefighter: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F469 1F3FF 200D 1F692", "html": "&#x1F469;&#x1F3FF;&#x200D;&#x1F692;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘Žâ€â™‚ī¸", "name": "man police officer", "shortname": ":man_police_officer:", "unicode": "1F46E 200D 2642 FE0F", "html": "&#x1F46E;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👮‍♂", "name": "man police officer", "shortname": ":man_police_officer:", "unicode": "1F46E 200D 2642", "html": "&#x1F46E;&#x200D;&#x2642;", "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": "&#x1F46E;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👮đŸģ‍♂", "name": "man police officer: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F46E 1F3FB 200D 2642", "html": "&#x1F46E;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F46E;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F46E;&#x1F3FC;&#x200D;&#x2642;", "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": "&#x1F46E;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👮đŸŊ‍♂", "name": "man police officer: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F46E 1F3FD 200D 2642", "html": "&#x1F46E;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F46E;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F46E;&#x1F3FE;&#x200D;&#x2642;", "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": "&#x1F46E;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👮đŸŋ‍♂", "name": "man police officer: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F46E 1F3FF 200D 2642", "html": "&#x1F46E;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘Žâ€â™€ī¸", "name": "woman police officer", "shortname": ":woman_police_officer:", "unicode": "1F46E 200D 2640 FE0F", "html": "&#x1F46E;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F46E;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F46E;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F46E;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F46E;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F46E;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩī¸", "name": "detective", "shortname": ":detective:", "unicode": "1F575 FE0F", "html": "&#x1F575;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩī¸â€â™‚ī¸", "name": "man detective", "shortname": ":man_detective:", "unicode": "1F575 FE0F 200D 2642 FE0F", "html": "&#x1F575;&#xFE0F;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩâ€â™‚ī¸", "name": "man detective", "shortname": ":man_detective:", "unicode": "1F575 200D 2642 FE0F", "html": "&#x1F575;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩī¸â€â™‚", "name": "man detective", "shortname": ":man_detective:", "unicode": "1F575 FE0F 200D 2642", "html": "&#x1F575;&#xFE0F;&#x200D;&#x2642;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩ‍♂", "name": "man detective", "shortname": ":man_detective:", "unicode": "1F575 200D 2642", "html": "&#x1F575;&#x200D;&#x2642;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩđŸģâ€â™‚ī¸", "name": "man detective: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F575 1F3FB 200D 2642 FE0F", "html": "&#x1F575;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩđŸģ‍♂", "name": "man detective: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F575 1F3FB 200D 2642", "html": "&#x1F575;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F575;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩđŸŧ‍♂", "name": "man detective: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F575 1F3FC 200D 2642", "html": "&#x1F575;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩđŸŊâ€â™‚ī¸", "name": "man detective: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F575 1F3FD 200D 2642 FE0F", "html": "&#x1F575;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩđŸŊ‍♂", "name": "man detective: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F575 1F3FD 200D 2642", "html": "&#x1F575;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F575;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩ🏾‍♂", "name": "man detective: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F575 1F3FE 200D 2642", "html": "&#x1F575;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩđŸŋâ€â™‚ī¸", "name": "man detective: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F575 1F3FF 200D 2642 FE0F", "html": "&#x1F575;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩđŸŋ‍♂", "name": "man detective: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F575 1F3FF 200D 2642", "html": "&#x1F575;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩī¸â€â™€ī¸", "name": "woman detective", "shortname": ":woman_detective:", "unicode": "1F575 FE0F 200D 2640 FE0F", "html": "&#x1F575;&#xFE0F;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩâ€â™€ī¸", "name": "woman detective", "shortname": ":woman_detective:", "unicode": "1F575 200D 2640 FE0F", "html": "&#x1F575;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩī¸â€â™€", "name": "woman detective", "shortname": ":woman_detective:", "unicode": "1F575 FE0F 200D 2640", "html": "&#x1F575;&#xFE0F;&#x200D;&#x2640;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩđŸģâ€â™€ī¸", "name": "woman detective: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F575 1F3FB 200D 2640 FE0F", "html": "&#x1F575;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F575;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩđŸŊâ€â™€ī¸", "name": "woman detective: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F575 1F3FD 200D 2640 FE0F", "html": "&#x1F575;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F575;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ•ĩđŸŋâ€â™€ī¸", "name": "woman detective: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F575 1F3FF 200D 2640 FE0F", "html": "&#x1F575;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ’‚â€â™‚ī¸", "name": "man guard", "shortname": ":man_guard:", "unicode": "1F482 200D 2642 FE0F", "html": "&#x1F482;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂‍♂", "name": "man guard", "shortname": ":man_guard:", "unicode": "1F482 200D 2642", "html": "&#x1F482;&#x200D;&#x2642;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂đŸģâ€â™‚ī¸", "name": "man guard: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F482 1F3FB 200D 2642 FE0F", "html": "&#x1F482;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂đŸģ‍♂", "name": "man guard: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F482 1F3FB 200D 2642", "html": "&#x1F482;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F482;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂đŸŧ‍♂", "name": "man guard: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F482 1F3FC 200D 2642", "html": "&#x1F482;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂đŸŊâ€â™‚ī¸", "name": "man guard: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F482 1F3FD 200D 2642 FE0F", "html": "&#x1F482;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂đŸŊ‍♂", "name": "man guard: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F482 1F3FD 200D 2642", "html": "&#x1F482;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F482;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂🏾‍♂", "name": "man guard: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F482 1F3FE 200D 2642", "html": "&#x1F482;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂đŸŋâ€â™‚ī¸", "name": "man guard: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F482 1F3FF 200D 2642 FE0F", "html": "&#x1F482;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂đŸŋ‍♂", "name": "man guard: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F482 1F3FF 200D 2642", "html": "&#x1F482;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ’‚â€â™€ī¸", "name": "woman guard", "shortname": ":woman_guard:", "unicode": "1F482 200D 2640 FE0F", "html": "&#x1F482;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂đŸģâ€â™€ī¸", "name": "woman guard: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F482 1F3FB 200D 2640 FE0F", "html": "&#x1F482;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F482;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂đŸŊâ€â™€ī¸", "name": "woman guard: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F482 1F3FD 200D 2640 FE0F", "html": "&#x1F482;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F482;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "💂đŸŋâ€â™€ī¸", "name": "woman guard: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F482 1F3FF 200D 2640 FE0F", "html": "&#x1F482;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘ˇâ€â™‚ī¸", "name": "man construction worker", "shortname": ":man_construction_worker:", "unicode": "1F477 200D 2642 FE0F", "html": "&#x1F477;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👷‍♂", "name": "man construction worker", "shortname": ":man_construction_worker:", "unicode": "1F477 200D 2642", "html": "&#x1F477;&#x200D;&#x2642;", "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": "&#x1F477;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👷đŸģ‍♂", "name": "man construction worker: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F477 1F3FB 200D 2642", "html": "&#x1F477;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F477;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F477;&#x1F3FC;&#x200D;&#x2642;", "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": "&#x1F477;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👷đŸŊ‍♂", "name": "man construction worker: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F477 1F3FD 200D 2642", "html": "&#x1F477;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F477;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F477;&#x1F3FE;&#x200D;&#x2642;", "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": "&#x1F477;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "👷đŸŋ‍♂", "name": "man construction worker: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F477 1F3FF 200D 2642", "html": "&#x1F477;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘ˇâ€â™€ī¸", "name": "woman construction worker", "shortname": ":woman_construction_worker:", "unicode": "1F477 200D 2640 FE0F", "html": "&#x1F477;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F477;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F477;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F477;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F477;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F477;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🤴", "name": "prince", "shortname": ":prince:", "unicode": "1F934", "html": "&#x1F934;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🤴đŸģ", "name": "prince: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F934 1F3FB", "html": "&#x1F934;&#x1F3FB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🤴đŸŧ", "name": "prince: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F934 1F3FC", "html": "&#x1F934;&#x1F3FC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🤴đŸŊ", "name": "prince: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F934 1F3FD", "html": "&#x1F934;&#x1F3FD;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🤴🏾", "name": "prince: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F934 1F3FE", "html": "&#x1F934;&#x1F3FE;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🤴đŸŋ", "name": "prince: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F934 1F3FF", "html": "&#x1F934;&#x1F3FF;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘ŗâ€â™‚ī¸", "name": "man wearing turban", "shortname": ":man_wearing_turban:", "unicode": "1F473 200D 2642 FE0F", "html": "&#x1F473;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘ŗâ€â™‚", "name": "man wearing turban", "shortname": ":man_wearing_turban:", "unicode": "1F473 200D 2642", "html": "&#x1F473;&#x200D;&#x2642;", "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": "&#x1F473;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘ŗđŸģ‍♂", "name": "man wearing turban: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F473 1F3FB 200D 2642", "html": "&#x1F473;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F473;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F473;&#x1F3FC;&#x200D;&#x2642;", "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": "&#x1F473;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘ŗđŸŊ‍♂", "name": "man wearing turban: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F473 1F3FD 200D 2642", "html": "&#x1F473;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F473;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F473;&#x1F3FE;&#x200D;&#x2642;", "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": "&#x1F473;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘ŗđŸŋ‍♂", "name": "man wearing turban: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F473 1F3FF 200D 2642", "html": "&#x1F473;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ‘ŗâ€â™€ī¸", "name": "woman wearing turban", "shortname": ":woman_wearing_turban:", "unicode": "1F473 200D 2640 FE0F", "html": "&#x1F473;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F473;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F473;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F473;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F473;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F473;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧕", "name": "woman with headscarf", "shortname": ":woman_with_headscarf:", "unicode": "1F9D5", "html": "&#x1F9D5;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧕đŸģ", "name": "woman with headscarf: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D5 1F3FB", "html": "&#x1F9D5;&#x1F3FB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧕đŸŧ", "name": "woman with headscarf: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D5 1F3FC", "html": "&#x1F9D5;&#x1F3FC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧕đŸŊ", "name": "woman with headscarf: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D5 1F3FD", "html": "&#x1F9D5;&#x1F3FD;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧕🏾", "name": "woman with headscarf: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D5 1F3FE", "html": "&#x1F9D5;&#x1F3FE;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🧕đŸŋ", "name": "woman with headscarf: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D5 1F3FF", "html": "&#x1F9D5;&#x1F3FF;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ¤ĩ", "name": "man in tuxedo", "shortname": ":man_in_tuxedo:", "unicode": "1F935", "html": "&#x1F935;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ¤ĩđŸģ", "name": "man in tuxedo: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F935 1F3FB", "html": "&#x1F935;&#x1F3FB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ¤ĩđŸŧ", "name": "man in tuxedo: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F935 1F3FC", "html": "&#x1F935;&#x1F3FC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ¤ĩđŸŊ", "name": "man in tuxedo: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F935 1F3FD", "html": "&#x1F935;&#x1F3FD;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ¤ĩ🏾", "name": "man in tuxedo: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F935 1F3FE", "html": "&#x1F935;&#x1F3FE;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ¤ĩđŸŋ", "name": "man in tuxedo: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F935 1F3FF", "html": "&#x1F935;&#x1F3FF;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🤰", "name": "pregnant woman", "shortname": ":pregnant_woman:", "unicode": "1F930", "html": "&#x1F930;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🤰đŸģ", "name": "pregnant woman: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F930 1F3FB", "html": "&#x1F930;&#x1F3FB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🤰đŸŧ", "name": "pregnant woman: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F930 1F3FC", "html": "&#x1F930;&#x1F3FC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🤰đŸŊ", "name": "pregnant woman: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F930 1F3FD", "html": "&#x1F930;&#x1F3FD;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🤰🏾", "name": "pregnant woman: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F930 1F3FE", "html": "&#x1F930;&#x1F3FE;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🤰đŸŋ", "name": "pregnant woman: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F930 1F3FF", "html": "&#x1F930;&#x1F3FF;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🤱", "name": "breast-feeding", "shortname": ":breastfeeding:", "unicode": "1F931", "html": "&#x1F931;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🤱đŸģ", "name": "breast-feeding: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F931 1F3FB", "html": "&#x1F931;&#x1F3FB;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🤱đŸŧ", "name": "breast-feeding: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F931 1F3FC", "html": "&#x1F931;&#x1F3FC;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🤱đŸŊ", "name": "breast-feeding: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F931 1F3FD", "html": "&#x1F931;&#x1F3FD;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🤱🏾", "name": "breast-feeding: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F931 1F3FE", "html": "&#x1F931;&#x1F3FE;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "🤱đŸŋ", "name": "breast-feeding: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F931 1F3FF", "html": "&#x1F931;&#x1F3FF;", "category": "People & Body (person-role)", "order": ""},
+ {"emoji": "đŸ¤ļ", "name": "Mrs. Claus", "shortname": ":Mrs_Claus:", "unicode": "1F936", "html": "&#x1F936;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ¤ļđŸģ", "name": "Mrs. Claus: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F936 1F3FB", "html": "&#x1F936;&#x1F3FB;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ¤ļđŸŧ", "name": "Mrs. Claus: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F936 1F3FC", "html": "&#x1F936;&#x1F3FC;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ¤ļđŸŊ", "name": "Mrs. Claus: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F936 1F3FD", "html": "&#x1F936;&#x1F3FD;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ¤ļ🏾", "name": "Mrs. Claus: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F936 1F3FE", "html": "&#x1F936;&#x1F3FE;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ¤ļđŸŋ", "name": "Mrs. Claus: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F936 1F3FF", "html": "&#x1F936;&#x1F3FF;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸", "name": "superhero", "shortname": ":superhero:", "unicode": "1F9B8", "html": "&#x1F9B8;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸģ", "name": "superhero: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B8 1F3FB", "html": "&#x1F9B8;&#x1F3FB;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸŧ", "name": "superhero: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B8 1F3FC", "html": "&#x1F9B8;&#x1F3FC;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸŊ", "name": "superhero: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B8 1F3FD", "html": "&#x1F9B8;&#x1F3FD;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸž", "name": "superhero: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B8 1F3FE", "html": "&#x1F9B8;&#x1F3FE;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸŋ", "name": "superhero: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B8 1F3FF", "html": "&#x1F9B8;&#x1F3FF;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸â€â™‚ī¸", "name": "man superhero", "shortname": ":man_superhero:", "unicode": "1F9B8 200D 2642 FE0F", "html": "&#x1F9B8;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸â€â™‚", "name": "man superhero", "shortname": ":man_superhero:", "unicode": "1F9B8 200D 2642", "html": "&#x1F9B8;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸģâ€â™‚ī¸", "name": "man superhero: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B8 1F3FB 200D 2642 FE0F", "html": "&#x1F9B8;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸģ‍♂", "name": "man superhero: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B8 1F3FB 200D 2642", "html": "&#x1F9B8;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F9B8;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸŧ‍♂", "name": "man superhero: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B8 1F3FC 200D 2642", "html": "&#x1F9B8;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸŊâ€â™‚ī¸", "name": "man superhero: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B8 1F3FD 200D 2642 FE0F", "html": "&#x1F9B8;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸŊ‍♂", "name": "man superhero: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B8 1F3FD 200D 2642", "html": "&#x1F9B8;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F9B8;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸžâ€â™‚", "name": "man superhero: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B8 1F3FE 200D 2642", "html": "&#x1F9B8;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸŋâ€â™‚ī¸", "name": "man superhero: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B8 1F3FF 200D 2642 FE0F", "html": "&#x1F9B8;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸŋ‍♂", "name": "man superhero: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B8 1F3FF 200D 2642", "html": "&#x1F9B8;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸â€â™€ī¸", "name": "woman superhero", "shortname": ":woman_superhero:", "unicode": "1F9B8 200D 2640 FE0F", "html": "&#x1F9B8;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸â€â™€", "name": "woman superhero", "shortname": ":woman_superhero:", "unicode": "1F9B8 200D 2640", "html": "&#x1F9B8;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸģâ€â™€ī¸", "name": "woman superhero: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B8 1F3FB 200D 2640 FE0F", "html": "&#x1F9B8;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸģ‍♀", "name": "woman superhero: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B8 1F3FB 200D 2640", "html": "&#x1F9B8;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F9B8;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸŧ‍♀", "name": "woman superhero: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B8 1F3FC 200D 2640", "html": "&#x1F9B8;&#x1F3FC;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸŊâ€â™€ī¸", "name": "woman superhero: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B8 1F3FD 200D 2640 FE0F", "html": "&#x1F9B8;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸŊ‍♀", "name": "woman superhero: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B8 1F3FD 200D 2640", "html": "&#x1F9B8;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F9B8;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸžâ€â™€", "name": "woman superhero: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B8 1F3FE 200D 2640", "html": "&#x1F9B8;&#x1F3FE;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸŋâ€â™€ī¸", "name": "woman superhero: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B8 1F3FF 200D 2640 FE0F", "html": "&#x1F9B8;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻ¸đŸŋ‍♀", "name": "woman superhero: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B8 1F3FF 200D 2640", "html": "&#x1F9B8;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻš", "name": "supervillain", "shortname": ":supervillain:", "unicode": "1F9B9", "html": "&#x1F9B9;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸģ", "name": "supervillain: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B9 1F3FB", "html": "&#x1F9B9;&#x1F3FB;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸŧ", "name": "supervillain: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B9 1F3FC", "html": "&#x1F9B9;&#x1F3FC;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸŊ", "name": "supervillain: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B9 1F3FD", "html": "&#x1F9B9;&#x1F3FD;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸž", "name": "supervillain: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B9 1F3FE", "html": "&#x1F9B9;&#x1F3FE;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸŋ", "name": "supervillain: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B9 1F3FF", "html": "&#x1F9B9;&#x1F3FF;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšâ€â™‚ī¸", "name": "man supervillain", "shortname": ":man_supervillain:", "unicode": "1F9B9 200D 2642 FE0F", "html": "&#x1F9B9;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšâ€â™‚", "name": "man supervillain", "shortname": ":man_supervillain:", "unicode": "1F9B9 200D 2642", "html": "&#x1F9B9;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸģâ€â™‚ī¸", "name": "man supervillain: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B9 1F3FB 200D 2642 FE0F", "html": "&#x1F9B9;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸģ‍♂", "name": "man supervillain: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B9 1F3FB 200D 2642", "html": "&#x1F9B9;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F9B9;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸŧ‍♂", "name": "man supervillain: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B9 1F3FC 200D 2642", "html": "&#x1F9B9;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸŊâ€â™‚ī¸", "name": "man supervillain: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B9 1F3FD 200D 2642 FE0F", "html": "&#x1F9B9;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸŊ‍♂", "name": "man supervillain: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B9 1F3FD 200D 2642", "html": "&#x1F9B9;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F9B9;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸžâ€â™‚", "name": "man supervillain: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B9 1F3FE 200D 2642", "html": "&#x1F9B9;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸŋâ€â™‚ī¸", "name": "man supervillain: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B9 1F3FF 200D 2642 FE0F", "html": "&#x1F9B9;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸŋ‍♂", "name": "man supervillain: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B9 1F3FF 200D 2642", "html": "&#x1F9B9;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšâ€â™€ī¸", "name": "woman supervillain", "shortname": ":woman_supervillain:", "unicode": "1F9B9 200D 2640 FE0F", "html": "&#x1F9B9;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšâ€â™€", "name": "woman supervillain", "shortname": ":woman_supervillain:", "unicode": "1F9B9 200D 2640", "html": "&#x1F9B9;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸģâ€â™€ī¸", "name": "woman supervillain: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B9 1F3FB 200D 2640 FE0F", "html": "&#x1F9B9;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸģ‍♀", "name": "woman supervillain: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9B9 1F3FB 200D 2640", "html": "&#x1F9B9;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F9B9;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸŧ‍♀", "name": "woman supervillain: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9B9 1F3FC 200D 2640", "html": "&#x1F9B9;&#x1F3FC;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸŊâ€â™€ī¸", "name": "woman supervillain: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B9 1F3FD 200D 2640 FE0F", "html": "&#x1F9B9;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸŊ‍♀", "name": "woman supervillain: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9B9 1F3FD 200D 2640", "html": "&#x1F9B9;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F9B9;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸžâ€â™€", "name": "woman supervillain: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9B9 1F3FE 200D 2640", "html": "&#x1F9B9;&#x1F3FE;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸŋâ€â™€ī¸", "name": "woman supervillain: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B9 1F3FF 200D 2640 FE0F", "html": "&#x1F9B9;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸĻšđŸŋ‍♀", "name": "woman supervillain: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9B9 1F3FF 200D 2640", "html": "&#x1F9B9;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙", "name": "mage", "shortname": ":mage:", "unicode": "1F9D9", "html": "&#x1F9D9;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙đŸģ", "name": "mage: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D9 1F3FB", "html": "&#x1F9D9;&#x1F3FB;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙đŸŧ", "name": "mage: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D9 1F3FC", "html": "&#x1F9D9;&#x1F3FC;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙đŸŊ", "name": "mage: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D9 1F3FD", "html": "&#x1F9D9;&#x1F3FD;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙🏾", "name": "mage: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D9 1F3FE", "html": "&#x1F9D9;&#x1F3FE;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙đŸŋ", "name": "mage: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D9 1F3FF", "html": "&#x1F9D9;&#x1F3FF;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ§™â€â™‚ī¸", "name": "man mage", "shortname": ":man_mage:", "unicode": "1F9D9 200D 2642 FE0F", "html": "&#x1F9D9;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙‍♂", "name": "man mage", "shortname": ":man_mage:", "unicode": "1F9D9 200D 2642", "html": "&#x1F9D9;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙đŸģâ€â™‚ī¸", "name": "man mage: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D9 1F3FB 200D 2642 FE0F", "html": "&#x1F9D9;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙đŸģ‍♂", "name": "man mage: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D9 1F3FB 200D 2642", "html": "&#x1F9D9;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F9D9;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙đŸŧ‍♂", "name": "man mage: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D9 1F3FC 200D 2642", "html": "&#x1F9D9;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙đŸŊâ€â™‚ī¸", "name": "man mage: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D9 1F3FD 200D 2642 FE0F", "html": "&#x1F9D9;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙đŸŊ‍♂", "name": "man mage: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D9 1F3FD 200D 2642", "html": "&#x1F9D9;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F9D9;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙🏾‍♂", "name": "man mage: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D9 1F3FE 200D 2642", "html": "&#x1F9D9;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙đŸŋâ€â™‚ī¸", "name": "man mage: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D9 1F3FF 200D 2642 FE0F", "html": "&#x1F9D9;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙đŸŋ‍♂", "name": "man mage: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D9 1F3FF 200D 2642", "html": "&#x1F9D9;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ§™â€â™€ī¸", "name": "woman mage", "shortname": ":woman_mage:", "unicode": "1F9D9 200D 2640 FE0F", "html": "&#x1F9D9;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙‍♀", "name": "woman mage", "shortname": ":woman_mage:", "unicode": "1F9D9 200D 2640", "html": "&#x1F9D9;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙đŸģâ€â™€ī¸", "name": "woman mage: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D9 1F3FB 200D 2640 FE0F", "html": "&#x1F9D9;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙đŸģ‍♀", "name": "woman mage: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D9 1F3FB 200D 2640", "html": "&#x1F9D9;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F9D9;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙đŸŧ‍♀", "name": "woman mage: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D9 1F3FC 200D 2640", "html": "&#x1F9D9;&#x1F3FC;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙đŸŊâ€â™€ī¸", "name": "woman mage: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D9 1F3FD 200D 2640 FE0F", "html": "&#x1F9D9;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙đŸŊ‍♀", "name": "woman mage: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D9 1F3FD 200D 2640", "html": "&#x1F9D9;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F9D9;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙🏾‍♀", "name": "woman mage: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D9 1F3FE 200D 2640", "html": "&#x1F9D9;&#x1F3FE;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙đŸŋâ€â™€ī¸", "name": "woman mage: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D9 1F3FF 200D 2640 FE0F", "html": "&#x1F9D9;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧙đŸŋ‍♀", "name": "woman mage: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D9 1F3FF 200D 2640", "html": "&#x1F9D9;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚", "name": "fairy", "shortname": ":fairy:", "unicode": "1F9DA", "html": "&#x1F9DA;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚đŸģ", "name": "fairy: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DA 1F3FB", "html": "&#x1F9DA;&#x1F3FB;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚đŸŧ", "name": "fairy: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DA 1F3FC", "html": "&#x1F9DA;&#x1F3FC;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚đŸŊ", "name": "fairy: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DA 1F3FD", "html": "&#x1F9DA;&#x1F3FD;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚🏾", "name": "fairy: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DA 1F3FE", "html": "&#x1F9DA;&#x1F3FE;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚đŸŋ", "name": "fairy: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DA 1F3FF", "html": "&#x1F9DA;&#x1F3FF;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ§šâ€â™‚ī¸", "name": "man fairy", "shortname": ":man_fairy:", "unicode": "1F9DA 200D 2642 FE0F", "html": "&#x1F9DA;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚‍♂", "name": "man fairy", "shortname": ":man_fairy:", "unicode": "1F9DA 200D 2642", "html": "&#x1F9DA;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚đŸģâ€â™‚ī¸", "name": "man fairy: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DA 1F3FB 200D 2642 FE0F", "html": "&#x1F9DA;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚đŸģ‍♂", "name": "man fairy: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DA 1F3FB 200D 2642", "html": "&#x1F9DA;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F9DA;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚đŸŧ‍♂", "name": "man fairy: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DA 1F3FC 200D 2642", "html": "&#x1F9DA;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚đŸŊâ€â™‚ī¸", "name": "man fairy: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DA 1F3FD 200D 2642 FE0F", "html": "&#x1F9DA;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚đŸŊ‍♂", "name": "man fairy: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DA 1F3FD 200D 2642", "html": "&#x1F9DA;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F9DA;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚🏾‍♂", "name": "man fairy: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DA 1F3FE 200D 2642", "html": "&#x1F9DA;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚đŸŋâ€â™‚ī¸", "name": "man fairy: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DA 1F3FF 200D 2642 FE0F", "html": "&#x1F9DA;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚đŸŋ‍♂", "name": "man fairy: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DA 1F3FF 200D 2642", "html": "&#x1F9DA;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ§šâ€â™€ī¸", "name": "woman fairy", "shortname": ":woman_fairy:", "unicode": "1F9DA 200D 2640 FE0F", "html": "&#x1F9DA;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚‍♀", "name": "woman fairy", "shortname": ":woman_fairy:", "unicode": "1F9DA 200D 2640", "html": "&#x1F9DA;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚đŸģâ€â™€ī¸", "name": "woman fairy: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DA 1F3FB 200D 2640 FE0F", "html": "&#x1F9DA;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚đŸģ‍♀", "name": "woman fairy: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DA 1F3FB 200D 2640", "html": "&#x1F9DA;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F9DA;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚đŸŧ‍♀", "name": "woman fairy: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DA 1F3FC 200D 2640", "html": "&#x1F9DA;&#x1F3FC;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚đŸŊâ€â™€ī¸", "name": "woman fairy: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DA 1F3FD 200D 2640 FE0F", "html": "&#x1F9DA;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚đŸŊ‍♀", "name": "woman fairy: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DA 1F3FD 200D 2640", "html": "&#x1F9DA;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F9DA;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚🏾‍♀", "name": "woman fairy: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DA 1F3FE 200D 2640", "html": "&#x1F9DA;&#x1F3FE;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚đŸŋâ€â™€ī¸", "name": "woman fairy: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DA 1F3FF 200D 2640 FE0F", "html": "&#x1F9DA;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧚đŸŋ‍♀", "name": "woman fairy: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DA 1F3FF 200D 2640", "html": "&#x1F9DA;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛", "name": "vampire", "shortname": ":vampire:", "unicode": "1F9DB", "html": "&#x1F9DB;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛đŸģ", "name": "vampire: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DB 1F3FB", "html": "&#x1F9DB;&#x1F3FB;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛đŸŧ", "name": "vampire: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DB 1F3FC", "html": "&#x1F9DB;&#x1F3FC;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛đŸŊ", "name": "vampire: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DB 1F3FD", "html": "&#x1F9DB;&#x1F3FD;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛🏾", "name": "vampire: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DB 1F3FE", "html": "&#x1F9DB;&#x1F3FE;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛đŸŋ", "name": "vampire: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DB 1F3FF", "html": "&#x1F9DB;&#x1F3FF;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ§›â€â™‚ī¸", "name": "man vampire", "shortname": ":man_vampire:", "unicode": "1F9DB 200D 2642 FE0F", "html": "&#x1F9DB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛‍♂", "name": "man vampire", "shortname": ":man_vampire:", "unicode": "1F9DB 200D 2642", "html": "&#x1F9DB;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛đŸģâ€â™‚ī¸", "name": "man vampire: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DB 1F3FB 200D 2642 FE0F", "html": "&#x1F9DB;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛đŸģ‍♂", "name": "man vampire: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DB 1F3FB 200D 2642", "html": "&#x1F9DB;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F9DB;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛đŸŧ‍♂", "name": "man vampire: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DB 1F3FC 200D 2642", "html": "&#x1F9DB;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛đŸŊâ€â™‚ī¸", "name": "man vampire: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DB 1F3FD 200D 2642 FE0F", "html": "&#x1F9DB;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛đŸŊ‍♂", "name": "man vampire: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DB 1F3FD 200D 2642", "html": "&#x1F9DB;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F9DB;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛🏾‍♂", "name": "man vampire: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DB 1F3FE 200D 2642", "html": "&#x1F9DB;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛đŸŋâ€â™‚ī¸", "name": "man vampire: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DB 1F3FF 200D 2642 FE0F", "html": "&#x1F9DB;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛đŸŋ‍♂", "name": "man vampire: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DB 1F3FF 200D 2642", "html": "&#x1F9DB;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ§›â€â™€ī¸", "name": "woman vampire", "shortname": ":woman_vampire:", "unicode": "1F9DB 200D 2640 FE0F", "html": "&#x1F9DB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛‍♀", "name": "woman vampire", "shortname": ":woman_vampire:", "unicode": "1F9DB 200D 2640", "html": "&#x1F9DB;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛đŸģâ€â™€ī¸", "name": "woman vampire: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DB 1F3FB 200D 2640 FE0F", "html": "&#x1F9DB;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛đŸģ‍♀", "name": "woman vampire: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DB 1F3FB 200D 2640", "html": "&#x1F9DB;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F9DB;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛đŸŧ‍♀", "name": "woman vampire: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DB 1F3FC 200D 2640", "html": "&#x1F9DB;&#x1F3FC;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛đŸŊâ€â™€ī¸", "name": "woman vampire: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DB 1F3FD 200D 2640 FE0F", "html": "&#x1F9DB;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛đŸŊ‍♀", "name": "woman vampire: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DB 1F3FD 200D 2640", "html": "&#x1F9DB;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F9DB;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛🏾‍♀", "name": "woman vampire: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DB 1F3FE 200D 2640", "html": "&#x1F9DB;&#x1F3FE;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛đŸŋâ€â™€ī¸", "name": "woman vampire: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DB 1F3FF 200D 2640 FE0F", "html": "&#x1F9DB;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧛đŸŋ‍♀", "name": "woman vampire: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DB 1F3FF 200D 2640", "html": "&#x1F9DB;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜", "name": "merperson", "shortname": ":merperson:", "unicode": "1F9DC", "html": "&#x1F9DC;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸģ", "name": "merperson: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DC 1F3FB", "html": "&#x1F9DC;&#x1F3FB;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸŧ", "name": "merperson: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DC 1F3FC", "html": "&#x1F9DC;&#x1F3FC;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸŊ", "name": "merperson: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DC 1F3FD", "html": "&#x1F9DC;&#x1F3FD;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜🏾", "name": "merperson: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DC 1F3FE", "html": "&#x1F9DC;&#x1F3FE;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸŋ", "name": "merperson: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DC 1F3FF", "html": "&#x1F9DC;&#x1F3FF;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ§œâ€â™‚ī¸", "name": "merman", "shortname": ":merman:", "unicode": "1F9DC 200D 2642 FE0F", "html": "&#x1F9DC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜‍♂", "name": "merman", "shortname": ":merman:", "unicode": "1F9DC 200D 2642", "html": "&#x1F9DC;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸģâ€â™‚ī¸", "name": "merman: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DC 1F3FB 200D 2642 FE0F", "html": "&#x1F9DC;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸģ‍♂", "name": "merman: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DC 1F3FB 200D 2642", "html": "&#x1F9DC;&#x1F3FB;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸŧâ€â™‚ī¸", "name": "merman: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DC 1F3FC 200D 2642 FE0F", "html": "&#x1F9DC;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸŧ‍♂", "name": "merman: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DC 1F3FC 200D 2642", "html": "&#x1F9DC;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸŊâ€â™‚ī¸", "name": "merman: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DC 1F3FD 200D 2642 FE0F", "html": "&#x1F9DC;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸŊ‍♂", "name": "merman: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DC 1F3FD 200D 2642", "html": "&#x1F9DC;&#x1F3FD;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ§œđŸžâ€â™‚ī¸", "name": "merman: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DC 1F3FE 200D 2642 FE0F", "html": "&#x1F9DC;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜🏾‍♂", "name": "merman: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DC 1F3FE 200D 2642", "html": "&#x1F9DC;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸŋâ€â™‚ī¸", "name": "merman: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DC 1F3FF 200D 2642 FE0F", "html": "&#x1F9DC;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸŋ‍♂", "name": "merman: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DC 1F3FF 200D 2642", "html": "&#x1F9DC;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ§œâ€â™€ī¸", "name": "mermaid", "shortname": ":mermaid:", "unicode": "1F9DC 200D 2640 FE0F", "html": "&#x1F9DC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜‍♀", "name": "mermaid", "shortname": ":mermaid:", "unicode": "1F9DC 200D 2640", "html": "&#x1F9DC;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸģâ€â™€ī¸", "name": "mermaid: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DC 1F3FB 200D 2640 FE0F", "html": "&#x1F9DC;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸģ‍♀", "name": "mermaid: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DC 1F3FB 200D 2640", "html": "&#x1F9DC;&#x1F3FB;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸŧâ€â™€ī¸", "name": "mermaid: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DC 1F3FC 200D 2640 FE0F", "html": "&#x1F9DC;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸŧ‍♀", "name": "mermaid: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DC 1F3FC 200D 2640", "html": "&#x1F9DC;&#x1F3FC;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸŊâ€â™€ī¸", "name": "mermaid: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DC 1F3FD 200D 2640 FE0F", "html": "&#x1F9DC;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸŊ‍♀", "name": "mermaid: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DC 1F3FD 200D 2640", "html": "&#x1F9DC;&#x1F3FD;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ§œđŸžâ€â™€ī¸", "name": "mermaid: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DC 1F3FE 200D 2640 FE0F", "html": "&#x1F9DC;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜🏾‍♀", "name": "mermaid: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DC 1F3FE 200D 2640", "html": "&#x1F9DC;&#x1F3FE;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸŋâ€â™€ī¸", "name": "mermaid: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DC 1F3FF 200D 2640 FE0F", "html": "&#x1F9DC;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧜đŸŋ‍♀", "name": "mermaid: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DC 1F3FF 200D 2640", "html": "&#x1F9DC;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝", "name": "elf", "shortname": ":elf:", "unicode": "1F9DD", "html": "&#x1F9DD;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝đŸģ", "name": "elf: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DD 1F3FB", "html": "&#x1F9DD;&#x1F3FB;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝đŸŧ", "name": "elf: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DD 1F3FC", "html": "&#x1F9DD;&#x1F3FC;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝đŸŊ", "name": "elf: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DD 1F3FD", "html": "&#x1F9DD;&#x1F3FD;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝🏾", "name": "elf: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DD 1F3FE", "html": "&#x1F9DD;&#x1F3FE;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝đŸŋ", "name": "elf: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DD 1F3FF", "html": "&#x1F9DD;&#x1F3FF;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ§â€â™‚ī¸", "name": "man elf", "shortname": ":man_elf:", "unicode": "1F9DD 200D 2642 FE0F", "html": "&#x1F9DD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝‍♂", "name": "man elf", "shortname": ":man_elf:", "unicode": "1F9DD 200D 2642", "html": "&#x1F9DD;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝đŸģâ€â™‚ī¸", "name": "man elf: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DD 1F3FB 200D 2642 FE0F", "html": "&#x1F9DD;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝đŸģ‍♂", "name": "man elf: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DD 1F3FB 200D 2642", "html": "&#x1F9DD;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F9DD;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝đŸŧ‍♂", "name": "man elf: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DD 1F3FC 200D 2642", "html": "&#x1F9DD;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝đŸŊâ€â™‚ī¸", "name": "man elf: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DD 1F3FD 200D 2642 FE0F", "html": "&#x1F9DD;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝đŸŊ‍♂", "name": "man elf: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DD 1F3FD 200D 2642", "html": "&#x1F9DD;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F9DD;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝🏾‍♂", "name": "man elf: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DD 1F3FE 200D 2642", "html": "&#x1F9DD;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝đŸŋâ€â™‚ī¸", "name": "man elf: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DD 1F3FF 200D 2642 FE0F", "html": "&#x1F9DD;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝đŸŋ‍♂", "name": "man elf: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DD 1F3FF 200D 2642", "html": "&#x1F9DD;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ§â€â™€ī¸", "name": "woman elf", "shortname": ":woman_elf:", "unicode": "1F9DD 200D 2640 FE0F", "html": "&#x1F9DD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝‍♀", "name": "woman elf", "shortname": ":woman_elf:", "unicode": "1F9DD 200D 2640", "html": "&#x1F9DD;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝đŸģâ€â™€ī¸", "name": "woman elf: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DD 1F3FB 200D 2640 FE0F", "html": "&#x1F9DD;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝đŸģ‍♀", "name": "woman elf: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9DD 1F3FB 200D 2640", "html": "&#x1F9DD;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F9DD;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝đŸŧ‍♀", "name": "woman elf: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9DD 1F3FC 200D 2640", "html": "&#x1F9DD;&#x1F3FC;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝đŸŊâ€â™€ī¸", "name": "woman elf: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DD 1F3FD 200D 2640 FE0F", "html": "&#x1F9DD;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝đŸŊ‍♀", "name": "woman elf: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9DD 1F3FD 200D 2640", "html": "&#x1F9DD;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F9DD;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝🏾‍♀", "name": "woman elf: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9DD 1F3FE 200D 2640", "html": "&#x1F9DD;&#x1F3FE;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝đŸŋâ€â™€ī¸", "name": "woman elf: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DD 1F3FF 200D 2640 FE0F", "html": "&#x1F9DD;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧝đŸŋ‍♀", "name": "woman elf: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9DD 1F3FF 200D 2640", "html": "&#x1F9DD;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧞", "name": "genie", "shortname": ":genie:", "unicode": "1F9DE", "html": "&#x1F9DE;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ§žâ€â™‚ī¸", "name": "man genie", "shortname": ":man_genie:", "unicode": "1F9DE 200D 2642 FE0F", "html": "&#x1F9DE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧞‍♂", "name": "man genie", "shortname": ":man_genie:", "unicode": "1F9DE 200D 2642", "html": "&#x1F9DE;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ§žâ€â™€ī¸", "name": "woman genie", "shortname": ":woman_genie:", "unicode": "1F9DE 200D 2640 FE0F", "html": "&#x1F9DE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧞‍♀", "name": "woman genie", "shortname": ":woman_genie:", "unicode": "1F9DE 200D 2640", "html": "&#x1F9DE;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧟", "name": "zombie", "shortname": ":zombie:", "unicode": "1F9DF", "html": "&#x1F9DF;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ§Ÿâ€â™‚ī¸", "name": "man zombie", "shortname": ":man_zombie:", "unicode": "1F9DF 200D 2642 FE0F", "html": "&#x1F9DF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧟‍♂", "name": "man zombie", "shortname": ":man_zombie:", "unicode": "1F9DF 200D 2642", "html": "&#x1F9DF;&#x200D;&#x2642;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ§Ÿâ€â™€ī¸", "name": "woman zombie", "shortname": ":woman_zombie:", "unicode": "1F9DF 200D 2640 FE0F", "html": "&#x1F9DF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "🧟‍♀", "name": "woman zombie", "shortname": ":woman_zombie:", "unicode": "1F9DF 200D 2640", "html": "&#x1F9DF;&#x200D;&#x2640;", "category": "People & Body (person-fantasy)", "order": ""},
+ {"emoji": "đŸ’†â€â™‚ī¸", "name": "man getting massage", "shortname": ":man_getting_massage:", "unicode": "1F486 200D 2642 FE0F", "html": "&#x1F486;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F486;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F486;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F486;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F486;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F486;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ’†â€â™€ī¸", "name": "woman getting massage", "shortname": ":woman_getting_massage:", "unicode": "1F486 200D 2640 FE0F", "html": "&#x1F486;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💆‍♀", "name": "woman getting massage", "shortname": ":woman_getting_massage:", "unicode": "1F486 200D 2640", "html": "&#x1F486;&#x200D;&#x2640;", "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": "&#x1F486;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💆đŸģ‍♀", "name": "woman getting massage: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F486 1F3FB 200D 2640", "html": "&#x1F486;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F486;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F486;&#x1F3FC;&#x200D;&#x2640;", "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": "&#x1F486;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💆đŸŊ‍♀", "name": "woman getting massage: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F486 1F3FD 200D 2640", "html": "&#x1F486;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F486;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F486;&#x1F3FE;&#x200D;&#x2640;", "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": "&#x1F486;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💆đŸŋ‍♀", "name": "woman getting massage: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F486 1F3FF 200D 2640", "html": "&#x1F486;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ’‡â€â™‚ī¸", "name": "man getting haircut", "shortname": ":man_getting_haircut:", "unicode": "1F487 200D 2642 FE0F", "html": "&#x1F487;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F487;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F487;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F487;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F487;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F487;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ’‡â€â™€ī¸", "name": "woman getting haircut", "shortname": ":woman_getting_haircut:", "unicode": "1F487 200D 2640 FE0F", "html": "&#x1F487;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💇‍♀", "name": "woman getting haircut", "shortname": ":woman_getting_haircut:", "unicode": "1F487 200D 2640", "html": "&#x1F487;&#x200D;&#x2640;", "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": "&#x1F487;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💇đŸģ‍♀", "name": "woman getting haircut: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F487 1F3FB 200D 2640", "html": "&#x1F487;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F487;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F487;&#x1F3FC;&#x200D;&#x2640;", "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": "&#x1F487;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💇đŸŊ‍♀", "name": "woman getting haircut: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F487 1F3FD 200D 2640", "html": "&#x1F487;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F487;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F487;&#x1F3FE;&#x200D;&#x2640;", "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": "&#x1F487;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "💇đŸŋ‍♀", "name": "woman getting haircut: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F487 1F3FF 200D 2640", "html": "&#x1F487;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļâ€â™‚ī¸", "name": "man walking", "shortname": ":man_walking:", "unicode": "1F6B6 200D 2642 FE0F", "html": "&#x1F6B6;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļ‍♂", "name": "man walking", "shortname": ":man_walking:", "unicode": "1F6B6 200D 2642", "html": "&#x1F6B6;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļđŸģâ€â™‚ī¸", "name": "man walking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B6 1F3FB 200D 2642 FE0F", "html": "&#x1F6B6;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļđŸģ‍♂", "name": "man walking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B6 1F3FB 200D 2642", "html": "&#x1F6B6;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F6B6;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļđŸŧ‍♂", "name": "man walking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B6 1F3FC 200D 2642", "html": "&#x1F6B6;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļđŸŊâ€â™‚ī¸", "name": "man walking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B6 1F3FD 200D 2642 FE0F", "html": "&#x1F6B6;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļđŸŊ‍♂", "name": "man walking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B6 1F3FD 200D 2642", "html": "&#x1F6B6;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F6B6;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļ🏾‍♂", "name": "man walking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B6 1F3FE 200D 2642", "html": "&#x1F6B6;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļđŸŋâ€â™‚ī¸", "name": "man walking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B6 1F3FF 200D 2642 FE0F", "html": "&#x1F6B6;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļđŸŋ‍♂", "name": "man walking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B6 1F3FF 200D 2642", "html": "&#x1F6B6;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļâ€â™€ī¸", "name": "woman walking", "shortname": ":woman_walking:", "unicode": "1F6B6 200D 2640 FE0F", "html": "&#x1F6B6;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļđŸģâ€â™€ī¸", "name": "woman walking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B6 1F3FB 200D 2640 FE0F", "html": "&#x1F6B6;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F6B6;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļđŸŊâ€â™€ī¸", "name": "woman walking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B6 1F3FD 200D 2640 FE0F", "html": "&#x1F6B6;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F6B6;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸšļđŸŋâ€â™€ī¸", "name": "woman walking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B6 1F3FF 200D 2640 FE0F", "html": "&#x1F6B6;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍", "name": "person standing", "shortname": ":person_standing:", "unicode": "1F9CD", "html": "&#x1F9CD;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍đŸģ", "name": "person standing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CD 1F3FB", "html": "&#x1F9CD;&#x1F3FB;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍đŸŧ", "name": "person standing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CD 1F3FC", "html": "&#x1F9CD;&#x1F3FC;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍đŸŊ", "name": "person standing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CD 1F3FD", "html": "&#x1F9CD;&#x1F3FD;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍🏾", "name": "person standing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CD 1F3FE", "html": "&#x1F9CD;&#x1F3FE;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍đŸŋ", "name": "person standing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CD 1F3FF", "html": "&#x1F9CD;&#x1F3FF;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ§â€â™‚ī¸", "name": "man standing", "shortname": ":man_standing:", "unicode": "1F9CD 200D 2642 FE0F", "html": "&#x1F9CD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍‍♂", "name": "man standing", "shortname": ":man_standing:", "unicode": "1F9CD 200D 2642", "html": "&#x1F9CD;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍đŸģâ€â™‚ī¸", "name": "man standing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CD 1F3FB 200D 2642 FE0F", "html": "&#x1F9CD;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍đŸģ‍♂", "name": "man standing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CD 1F3FB 200D 2642", "html": "&#x1F9CD;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F9CD;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍đŸŧ‍♂", "name": "man standing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CD 1F3FC 200D 2642", "html": "&#x1F9CD;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍đŸŊâ€â™‚ī¸", "name": "man standing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CD 1F3FD 200D 2642 FE0F", "html": "&#x1F9CD;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍đŸŊ‍♂", "name": "man standing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CD 1F3FD 200D 2642", "html": "&#x1F9CD;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F9CD;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍🏾‍♂", "name": "man standing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CD 1F3FE 200D 2642", "html": "&#x1F9CD;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍đŸŋâ€â™‚ī¸", "name": "man standing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CD 1F3FF 200D 2642 FE0F", "html": "&#x1F9CD;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍đŸŋ‍♂", "name": "man standing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CD 1F3FF 200D 2642", "html": "&#x1F9CD;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ§â€â™€ī¸", "name": "woman standing", "shortname": ":woman_standing:", "unicode": "1F9CD 200D 2640 FE0F", "html": "&#x1F9CD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍‍♀", "name": "woman standing", "shortname": ":woman_standing:", "unicode": "1F9CD 200D 2640", "html": "&#x1F9CD;&#x200D;&#x2640;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍đŸģâ€â™€ī¸", "name": "woman standing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CD 1F3FB 200D 2640 FE0F", "html": "&#x1F9CD;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍đŸģ‍♀", "name": "woman standing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CD 1F3FB 200D 2640", "html": "&#x1F9CD;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F9CD;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍đŸŧ‍♀", "name": "woman standing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CD 1F3FC 200D 2640", "html": "&#x1F9CD;&#x1F3FC;&#x200D;&#x2640;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍đŸŊâ€â™€ī¸", "name": "woman standing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CD 1F3FD 200D 2640 FE0F", "html": "&#x1F9CD;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍đŸŊ‍♀", "name": "woman standing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CD 1F3FD 200D 2640", "html": "&#x1F9CD;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F9CD;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍🏾‍♀", "name": "woman standing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CD 1F3FE 200D 2640", "html": "&#x1F9CD;&#x1F3FE;&#x200D;&#x2640;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍đŸŋâ€â™€ī¸", "name": "woman standing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CD 1F3FF 200D 2640 FE0F", "html": "&#x1F9CD;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧍đŸŋ‍♀", "name": "woman standing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CD 1F3FF 200D 2640", "html": "&#x1F9CD;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎", "name": "person kneeling", "shortname": ":person_kneeling:", "unicode": "1F9CE", "html": "&#x1F9CE;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎đŸģ", "name": "person kneeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CE 1F3FB", "html": "&#x1F9CE;&#x1F3FB;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎đŸŧ", "name": "person kneeling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CE 1F3FC", "html": "&#x1F9CE;&#x1F3FC;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎đŸŊ", "name": "person kneeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CE 1F3FD", "html": "&#x1F9CE;&#x1F3FD;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎🏾", "name": "person kneeling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CE 1F3FE", "html": "&#x1F9CE;&#x1F3FE;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎đŸŋ", "name": "person kneeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CE 1F3FF", "html": "&#x1F9CE;&#x1F3FF;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ§Žâ€â™‚ī¸", "name": "man kneeling", "shortname": ":man_kneeling:", "unicode": "1F9CE 200D 2642 FE0F", "html": "&#x1F9CE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎‍♂", "name": "man kneeling", "shortname": ":man_kneeling:", "unicode": "1F9CE 200D 2642", "html": "&#x1F9CE;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎đŸģâ€â™‚ī¸", "name": "man kneeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CE 1F3FB 200D 2642 FE0F", "html": "&#x1F9CE;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎đŸģ‍♂", "name": "man kneeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CE 1F3FB 200D 2642", "html": "&#x1F9CE;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F9CE;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎đŸŧ‍♂", "name": "man kneeling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CE 1F3FC 200D 2642", "html": "&#x1F9CE;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎đŸŊâ€â™‚ī¸", "name": "man kneeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CE 1F3FD 200D 2642 FE0F", "html": "&#x1F9CE;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎đŸŊ‍♂", "name": "man kneeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CE 1F3FD 200D 2642", "html": "&#x1F9CE;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F9CE;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎🏾‍♂", "name": "man kneeling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CE 1F3FE 200D 2642", "html": "&#x1F9CE;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎đŸŋâ€â™‚ī¸", "name": "man kneeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CE 1F3FF 200D 2642 FE0F", "html": "&#x1F9CE;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎đŸŋ‍♂", "name": "man kneeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CE 1F3FF 200D 2642", "html": "&#x1F9CE;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ§Žâ€â™€ī¸", "name": "woman kneeling", "shortname": ":woman_kneeling:", "unicode": "1F9CE 200D 2640 FE0F", "html": "&#x1F9CE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎‍♀", "name": "woman kneeling", "shortname": ":woman_kneeling:", "unicode": "1F9CE 200D 2640", "html": "&#x1F9CE;&#x200D;&#x2640;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎đŸģâ€â™€ī¸", "name": "woman kneeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CE 1F3FB 200D 2640 FE0F", "html": "&#x1F9CE;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎đŸģ‍♀", "name": "woman kneeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9CE 1F3FB 200D 2640", "html": "&#x1F9CE;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F9CE;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎đŸŧ‍♀", "name": "woman kneeling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9CE 1F3FC 200D 2640", "html": "&#x1F9CE;&#x1F3FC;&#x200D;&#x2640;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎đŸŊâ€â™€ī¸", "name": "woman kneeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CE 1F3FD 200D 2640 FE0F", "html": "&#x1F9CE;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎đŸŊ‍♀", "name": "woman kneeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9CE 1F3FD 200D 2640", "html": "&#x1F9CE;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F9CE;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎🏾‍♀", "name": "woman kneeling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9CE 1F3FE 200D 2640", "html": "&#x1F9CE;&#x1F3FE;&#x200D;&#x2640;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎đŸŋâ€â™€ī¸", "name": "woman kneeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CE 1F3FF 200D 2640 FE0F", "html": "&#x1F9CE;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧎đŸŋ‍♀", "name": "woman kneeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9CE 1F3FF 200D 2640", "html": "&#x1F9CE;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧑‍đŸĻ¯", "name": "person with probing cane", "shortname": ":person_with_probing_cane:", "unicode": "1F9D1 200D 1F9AF", "html": "&#x1F9D1;&#x200D;&#x1F9AF;", "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": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F9AF;", "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": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F9AF;", "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": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F9AF;", "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": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F9AF;", "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": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F9AF;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "👨‍đŸĻ¯", "name": "man with probing cane", "shortname": ":man_with_probing_cane:", "unicode": "1F468 200D 1F9AF", "html": "&#x1F468;&#x200D;&#x1F9AF;", "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": "&#x1F468;&#x1F3FB;&#x200D;&#x1F9AF;", "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": "&#x1F468;&#x1F3FC;&#x200D;&#x1F9AF;", "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": "&#x1F468;&#x1F3FD;&#x200D;&#x1F9AF;", "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": "&#x1F468;&#x1F3FE;&#x200D;&#x1F9AF;", "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": "&#x1F468;&#x1F3FF;&#x200D;&#x1F9AF;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "👩‍đŸĻ¯", "name": "woman with probing cane", "shortname": ":woman_with_probing_cane:", "unicode": "1F469 200D 1F9AF", "html": "&#x1F469;&#x200D;&#x1F9AF;", "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": "&#x1F469;&#x1F3FB;&#x200D;&#x1F9AF;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x1F9AF;", "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": "&#x1F469;&#x1F3FD;&#x200D;&#x1F9AF;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x1F9AF;", "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": "&#x1F469;&#x1F3FF;&#x200D;&#x1F9AF;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧑‍đŸĻŧ", "name": "person in motorized wheelchair", "shortname": ":person_in_motorized_wheelchair:", "unicode": "1F9D1 200D 1F9BC", "html": "&#x1F9D1;&#x200D;&#x1F9BC;", "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": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F9BC;", "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": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F9BC;", "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": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F9BC;", "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": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F9BC;", "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": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F9BC;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "👨‍đŸĻŧ", "name": "man in motorized wheelchair", "shortname": ":man_in_motorized_wheelchair:", "unicode": "1F468 200D 1F9BC", "html": "&#x1F468;&#x200D;&#x1F9BC;", "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": "&#x1F468;&#x1F3FB;&#x200D;&#x1F9BC;", "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": "&#x1F468;&#x1F3FC;&#x200D;&#x1F9BC;", "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": "&#x1F468;&#x1F3FD;&#x200D;&#x1F9BC;", "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": "&#x1F468;&#x1F3FE;&#x200D;&#x1F9BC;", "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": "&#x1F468;&#x1F3FF;&#x200D;&#x1F9BC;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "👩‍đŸĻŧ", "name": "woman in motorized wheelchair", "shortname": ":woman_in_motorized_wheelchair:", "unicode": "1F469 200D 1F9BC", "html": "&#x1F469;&#x200D;&#x1F9BC;", "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": "&#x1F469;&#x1F3FB;&#x200D;&#x1F9BC;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x1F9BC;", "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": "&#x1F469;&#x1F3FD;&#x200D;&#x1F9BC;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x1F9BC;", "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": "&#x1F469;&#x1F3FF;&#x200D;&#x1F9BC;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧑‍đŸĻŊ", "name": "person in manual wheelchair", "shortname": ":person_in_manual_wheelchair:", "unicode": "1F9D1 200D 1F9BD", "html": "&#x1F9D1;&#x200D;&#x1F9BD;", "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": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F9BD;", "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": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F9BD;", "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": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F9BD;", "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": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F9BD;", "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": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F9BD;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "👨‍đŸĻŊ", "name": "man in manual wheelchair", "shortname": ":man_in_manual_wheelchair:", "unicode": "1F468 200D 1F9BD", "html": "&#x1F468;&#x200D;&#x1F9BD;", "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": "&#x1F468;&#x1F3FB;&#x200D;&#x1F9BD;", "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": "&#x1F468;&#x1F3FC;&#x200D;&#x1F9BD;", "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": "&#x1F468;&#x1F3FD;&#x200D;&#x1F9BD;", "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": "&#x1F468;&#x1F3FE;&#x200D;&#x1F9BD;", "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": "&#x1F468;&#x1F3FF;&#x200D;&#x1F9BD;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "👩‍đŸĻŊ", "name": "woman in manual wheelchair", "shortname": ":woman_in_manual_wheelchair:", "unicode": "1F469 200D 1F9BD", "html": "&#x1F469;&#x200D;&#x1F9BD;", "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": "&#x1F469;&#x1F3FB;&#x200D;&#x1F9BD;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x1F9BD;", "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": "&#x1F469;&#x1F3FD;&#x200D;&#x1F9BD;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x1F9BD;", "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": "&#x1F469;&#x1F3FF;&#x200D;&#x1F9BD;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸƒâ€â™‚ī¸", "name": "man running", "shortname": ":man_running:", "unicode": "1F3C3 200D 2642 FE0F", "html": "&#x1F3C3;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃‍♂", "name": "man running", "shortname": ":man_running:", "unicode": "1F3C3 200D 2642", "html": "&#x1F3C3;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃đŸģâ€â™‚ī¸", "name": "man running: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C3 1F3FB 200D 2642 FE0F", "html": "&#x1F3C3;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃đŸģ‍♂", "name": "man running: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C3 1F3FB 200D 2642", "html": "&#x1F3C3;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F3C3;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃đŸŧ‍♂", "name": "man running: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C3 1F3FC 200D 2642", "html": "&#x1F3C3;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃đŸŊâ€â™‚ī¸", "name": "man running: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C3 1F3FD 200D 2642 FE0F", "html": "&#x1F3C3;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃đŸŊ‍♂", "name": "man running: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C3 1F3FD 200D 2642", "html": "&#x1F3C3;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F3C3;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃🏾‍♂", "name": "man running: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C3 1F3FE 200D 2642", "html": "&#x1F3C3;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃đŸŋâ€â™‚ī¸", "name": "man running: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C3 1F3FF 200D 2642 FE0F", "html": "&#x1F3C3;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃đŸŋ‍♂", "name": "man running: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C3 1F3FF 200D 2642", "html": "&#x1F3C3;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸƒâ€â™€ī¸", "name": "woman running", "shortname": ":woman_running:", "unicode": "1F3C3 200D 2640 FE0F", "html": "&#x1F3C3;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃đŸģâ€â™€ī¸", "name": "woman running: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C3 1F3FB 200D 2640 FE0F", "html": "&#x1F3C3;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F3C3;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃đŸŊâ€â™€ī¸", "name": "woman running: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C3 1F3FD 200D 2640 FE0F", "html": "&#x1F3C3;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F3C3;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🏃đŸŋâ€â™€ī¸", "name": "woman running: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C3 1F3FF 200D 2640 FE0F", "html": "&#x1F3C3;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ•ē", "name": "man dancing", "shortname": ":man_dancing:", "unicode": "1F57A", "html": "&#x1F57A;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ•ēđŸģ", "name": "man dancing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F57A 1F3FB", "html": "&#x1F57A;&#x1F3FB;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ•ēđŸŧ", "name": "man dancing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F57A 1F3FC", "html": "&#x1F57A;&#x1F3FC;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ•ēđŸŊ", "name": "man dancing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F57A 1F3FD", "html": "&#x1F57A;&#x1F3FD;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ•ē🏾", "name": "man dancing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F57A 1F3FE", "html": "&#x1F57A;&#x1F3FE;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ•ēđŸŋ", "name": "man dancing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F57A 1F3FF", "html": "&#x1F57A;&#x1F3FF;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ•´ī¸", "name": "man in suit levitating", "shortname": ":man_in_suit_levitating:", "unicode": "1F574 FE0F", "html": "&#x1F574;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🕴đŸģ", "name": "man in suit levitating: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F574 1F3FB", "html": "&#x1F574;&#x1F3FB;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🕴đŸŧ", "name": "man in suit levitating: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F574 1F3FC", "html": "&#x1F574;&#x1F3FC;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🕴đŸŊ", "name": "man in suit levitating: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F574 1F3FD", "html": "&#x1F574;&#x1F3FD;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🕴🏾", "name": "man in suit levitating: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F574 1F3FE", "html": "&#x1F574;&#x1F3FE;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🕴đŸŋ", "name": "man in suit levitating: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F574 1F3FF", "html": "&#x1F574;&#x1F3FF;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ‘¯â€â™‚ī¸", "name": "men with bunny ears", "shortname": ":men_with_bunny_ears:", "unicode": "1F46F 200D 2642 FE0F", "html": "&#x1F46F;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ‘¯â€â™€ī¸", "name": "women with bunny ears", "shortname": ":women_with_bunny_ears:", "unicode": "1F46F 200D 2640 FE0F", "html": "&#x1F46F;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ‘¯â€â™€", "name": "women with bunny ears", "shortname": ":women_with_bunny_ears:", "unicode": "1F46F 200D 2640", "html": "&#x1F46F;&#x200D;&#x2640;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧖", "name": "person in steamy room", "shortname": ":person_in_steamy_room:", "unicode": "1F9D6", "html": "&#x1F9D6;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧖đŸģ", "name": "person in steamy room: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D6 1F3FB", "html": "&#x1F9D6;&#x1F3FB;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧖đŸŧ", "name": "person in steamy room: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D6 1F3FC", "html": "&#x1F9D6;&#x1F3FC;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧖đŸŊ", "name": "person in steamy room: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D6 1F3FD", "html": "&#x1F9D6;&#x1F3FD;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧖🏾", "name": "person in steamy room: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D6 1F3FE", "html": "&#x1F9D6;&#x1F3FE;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧖đŸŋ", "name": "person in steamy room: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D6 1F3FF", "html": "&#x1F9D6;&#x1F3FF;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ§–â€â™‚ī¸", "name": "man in steamy room", "shortname": ":man_in_steamy_room:", "unicode": "1F9D6 200D 2642 FE0F", "html": "&#x1F9D6;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧖‍♂", "name": "man in steamy room", "shortname": ":man_in_steamy_room:", "unicode": "1F9D6 200D 2642", "html": "&#x1F9D6;&#x200D;&#x2642;", "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": "&#x1F9D6;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F9D6;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F9D6;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F9D6;&#x1F3FC;&#x200D;&#x2642;", "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": "&#x1F9D6;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F9D6;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F9D6;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F9D6;&#x1F3FE;&#x200D;&#x2642;", "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": "&#x1F9D6;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F9D6;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ§–â€â™€ī¸", "name": "woman in steamy room", "shortname": ":woman_in_steamy_room:", "unicode": "1F9D6 200D 2640 FE0F", "html": "&#x1F9D6;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧖‍♀", "name": "woman in steamy room", "shortname": ":woman_in_steamy_room:", "unicode": "1F9D6 200D 2640", "html": "&#x1F9D6;&#x200D;&#x2640;", "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": "&#x1F9D6;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F9D6;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F9D6;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F9D6;&#x1F3FC;&#x200D;&#x2640;", "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": "&#x1F9D6;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F9D6;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F9D6;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F9D6;&#x1F3FE;&#x200D;&#x2640;", "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": "&#x1F9D6;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F9D6;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗", "name": "person climbing", "shortname": ":person_climbing:", "unicode": "1F9D7", "html": "&#x1F9D7;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗đŸģ", "name": "person climbing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D7 1F3FB", "html": "&#x1F9D7;&#x1F3FB;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗đŸŧ", "name": "person climbing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D7 1F3FC", "html": "&#x1F9D7;&#x1F3FC;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗đŸŊ", "name": "person climbing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D7 1F3FD", "html": "&#x1F9D7;&#x1F3FD;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗🏾", "name": "person climbing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D7 1F3FE", "html": "&#x1F9D7;&#x1F3FE;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗đŸŋ", "name": "person climbing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D7 1F3FF", "html": "&#x1F9D7;&#x1F3FF;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ§—â€â™‚ī¸", "name": "man climbing", "shortname": ":man_climbing:", "unicode": "1F9D7 200D 2642 FE0F", "html": "&#x1F9D7;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗‍♂", "name": "man climbing", "shortname": ":man_climbing:", "unicode": "1F9D7 200D 2642", "html": "&#x1F9D7;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗đŸģâ€â™‚ī¸", "name": "man climbing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D7 1F3FB 200D 2642 FE0F", "html": "&#x1F9D7;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗đŸģ‍♂", "name": "man climbing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D7 1F3FB 200D 2642", "html": "&#x1F9D7;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F9D7;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗đŸŧ‍♂", "name": "man climbing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D7 1F3FC 200D 2642", "html": "&#x1F9D7;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗đŸŊâ€â™‚ī¸", "name": "man climbing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D7 1F3FD 200D 2642 FE0F", "html": "&#x1F9D7;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗đŸŊ‍♂", "name": "man climbing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D7 1F3FD 200D 2642", "html": "&#x1F9D7;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F9D7;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗🏾‍♂", "name": "man climbing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D7 1F3FE 200D 2642", "html": "&#x1F9D7;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗đŸŋâ€â™‚ī¸", "name": "man climbing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D7 1F3FF 200D 2642 FE0F", "html": "&#x1F9D7;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗đŸŋ‍♂", "name": "man climbing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D7 1F3FF 200D 2642", "html": "&#x1F9D7;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ§—â€â™€ī¸", "name": "woman climbing", "shortname": ":woman_climbing:", "unicode": "1F9D7 200D 2640 FE0F", "html": "&#x1F9D7;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗‍♀", "name": "woman climbing", "shortname": ":woman_climbing:", "unicode": "1F9D7 200D 2640", "html": "&#x1F9D7;&#x200D;&#x2640;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗đŸģâ€â™€ī¸", "name": "woman climbing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D7 1F3FB 200D 2640 FE0F", "html": "&#x1F9D7;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗đŸģ‍♀", "name": "woman climbing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D7 1F3FB 200D 2640", "html": "&#x1F9D7;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F9D7;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗đŸŧ‍♀", "name": "woman climbing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D7 1F3FC 200D 2640", "html": "&#x1F9D7;&#x1F3FC;&#x200D;&#x2640;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗đŸŊâ€â™€ī¸", "name": "woman climbing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D7 1F3FD 200D 2640 FE0F", "html": "&#x1F9D7;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗đŸŊ‍♀", "name": "woman climbing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D7 1F3FD 200D 2640", "html": "&#x1F9D7;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F9D7;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗🏾‍♀", "name": "woman climbing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D7 1F3FE 200D 2640", "html": "&#x1F9D7;&#x1F3FE;&#x200D;&#x2640;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗đŸŋâ€â™€ī¸", "name": "woman climbing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D7 1F3FF 200D 2640 FE0F", "html": "&#x1F9D7;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "🧗đŸŋ‍♀", "name": "woman climbing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D7 1F3FF 200D 2640", "html": "&#x1F9D7;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-activity)", "order": ""},
+ {"emoji": "đŸ¤ē", "name": "person fencing", "shortname": ":person_fencing:", "unicode": "1F93A", "html": "&#x1F93A;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏇đŸģ", "name": "horse racing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C7 1F3FB", "html": "&#x1F3C7;&#x1F3FB;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏇đŸŧ", "name": "horse racing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C7 1F3FC", "html": "&#x1F3C7;&#x1F3FC;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏇đŸŊ", "name": "horse racing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C7 1F3FD", "html": "&#x1F3C7;&#x1F3FD;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏇🏾", "name": "horse racing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C7 1F3FE", "html": "&#x1F3C7;&#x1F3FE;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏇đŸŋ", "name": "horse racing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C7 1F3FF", "html": "&#x1F3C7;&#x1F3FF;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "â›ˇī¸", "name": "skier", "shortname": ":skier:", "unicode": "26F7 FE0F", "html": "&#x26F7;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏂đŸģ", "name": "snowboarder: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C2 1F3FB", "html": "&#x1F3C2;&#x1F3FB;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏂đŸŧ", "name": "snowboarder: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C2 1F3FC", "html": "&#x1F3C2;&#x1F3FC;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏂đŸŊ", "name": "snowboarder: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C2 1F3FD", "html": "&#x1F3C2;&#x1F3FD;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏂🏾", "name": "snowboarder: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C2 1F3FE", "html": "&#x1F3C2;&#x1F3FE;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏂đŸŋ", "name": "snowboarder: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C2 1F3FF", "html": "&#x1F3C2;&#x1F3FF;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸŒī¸", "name": "person golfing", "shortname": ":person_golfing:", "unicode": "1F3CC FE0F", "html": "&#x1F3CC;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌đŸģ", "name": "person golfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CC 1F3FB", "html": "&#x1F3CC;&#x1F3FB;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌đŸŧ", "name": "person golfing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CC 1F3FC", "html": "&#x1F3CC;&#x1F3FC;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌đŸŊ", "name": "person golfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CC 1F3FD", "html": "&#x1F3CC;&#x1F3FD;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌🏾", "name": "person golfing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CC 1F3FE", "html": "&#x1F3CC;&#x1F3FE;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌đŸŋ", "name": "person golfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CC 1F3FF", "html": "&#x1F3CC;&#x1F3FF;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸŒī¸â€â™‚ī¸", "name": "man golfing", "shortname": ":man_golfing:", "unicode": "1F3CC FE0F 200D 2642 FE0F", "html": "&#x1F3CC;&#xFE0F;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸŒâ€â™‚ī¸", "name": "man golfing", "shortname": ":man_golfing:", "unicode": "1F3CC 200D 2642 FE0F", "html": "&#x1F3CC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸŒī¸â€â™‚", "name": "man golfing", "shortname": ":man_golfing:", "unicode": "1F3CC FE0F 200D 2642", "html": "&#x1F3CC;&#xFE0F;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌‍♂", "name": "man golfing", "shortname": ":man_golfing:", "unicode": "1F3CC 200D 2642", "html": "&#x1F3CC;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌đŸģâ€â™‚ī¸", "name": "man golfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CC 1F3FB 200D 2642 FE0F", "html": "&#x1F3CC;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌đŸģ‍♂", "name": "man golfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CC 1F3FB 200D 2642", "html": "&#x1F3CC;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F3CC;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌đŸŧ‍♂", "name": "man golfing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CC 1F3FC 200D 2642", "html": "&#x1F3CC;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌đŸŊâ€â™‚ī¸", "name": "man golfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CC 1F3FD 200D 2642 FE0F", "html": "&#x1F3CC;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌đŸŊ‍♂", "name": "man golfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CC 1F3FD 200D 2642", "html": "&#x1F3CC;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F3CC;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌🏾‍♂", "name": "man golfing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CC 1F3FE 200D 2642", "html": "&#x1F3CC;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌đŸŋâ€â™‚ī¸", "name": "man golfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CC 1F3FF 200D 2642 FE0F", "html": "&#x1F3CC;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌đŸŋ‍♂", "name": "man golfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CC 1F3FF 200D 2642", "html": "&#x1F3CC;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸŒī¸â€â™€ī¸", "name": "woman golfing", "shortname": ":woman_golfing:", "unicode": "1F3CC FE0F 200D 2640 FE0F", "html": "&#x1F3CC;&#xFE0F;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸŒâ€â™€ī¸", "name": "woman golfing", "shortname": ":woman_golfing:", "unicode": "1F3CC 200D 2640 FE0F", "html": "&#x1F3CC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸŒī¸â€â™€", "name": "woman golfing", "shortname": ":woman_golfing:", "unicode": "1F3CC FE0F 200D 2640", "html": "&#x1F3CC;&#xFE0F;&#x200D;&#x2640;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌đŸģâ€â™€ī¸", "name": "woman golfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CC 1F3FB 200D 2640 FE0F", "html": "&#x1F3CC;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌đŸģ‍♀", "name": "woman golfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CC 1F3FB 200D 2640", "html": "&#x1F3CC;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F3CC;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌đŸŧ‍♀", "name": "woman golfing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CC 1F3FC 200D 2640", "html": "&#x1F3CC;&#x1F3FC;&#x200D;&#x2640;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌đŸŊâ€â™€ī¸", "name": "woman golfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CC 1F3FD 200D 2640 FE0F", "html": "&#x1F3CC;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌đŸŊ‍♀", "name": "woman golfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CC 1F3FD 200D 2640", "html": "&#x1F3CC;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F3CC;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌🏾‍♀", "name": "woman golfing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CC 1F3FE 200D 2640", "html": "&#x1F3CC;&#x1F3FE;&#x200D;&#x2640;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌đŸŋâ€â™€ī¸", "name": "woman golfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CC 1F3FF 200D 2640 FE0F", "html": "&#x1F3CC;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏌đŸŋ‍♀", "name": "woman golfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CC 1F3FF 200D 2640", "html": "&#x1F3CC;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ„â€â™‚ī¸", "name": "man surfing", "shortname": ":man_surfing:", "unicode": "1F3C4 200D 2642 FE0F", "html": "&#x1F3C4;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄‍♂", "name": "man surfing", "shortname": ":man_surfing:", "unicode": "1F3C4 200D 2642", "html": "&#x1F3C4;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄đŸģâ€â™‚ī¸", "name": "man surfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C4 1F3FB 200D 2642 FE0F", "html": "&#x1F3C4;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄đŸģ‍♂", "name": "man surfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C4 1F3FB 200D 2642", "html": "&#x1F3C4;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F3C4;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄đŸŧ‍♂", "name": "man surfing: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3C4 1F3FC 200D 2642", "html": "&#x1F3C4;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄đŸŊâ€â™‚ī¸", "name": "man surfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C4 1F3FD 200D 2642 FE0F", "html": "&#x1F3C4;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄đŸŊ‍♂", "name": "man surfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C4 1F3FD 200D 2642", "html": "&#x1F3C4;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F3C4;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄🏾‍♂", "name": "man surfing: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3C4 1F3FE 200D 2642", "html": "&#x1F3C4;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄đŸŋâ€â™‚ī¸", "name": "man surfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C4 1F3FF 200D 2642 FE0F", "html": "&#x1F3C4;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄đŸŋ‍♂", "name": "man surfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C4 1F3FF 200D 2642", "html": "&#x1F3C4;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ„â€â™€ī¸", "name": "woman surfing", "shortname": ":woman_surfing:", "unicode": "1F3C4 200D 2640 FE0F", "html": "&#x1F3C4;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄đŸģâ€â™€ī¸", "name": "woman surfing: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3C4 1F3FB 200D 2640 FE0F", "html": "&#x1F3C4;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F3C4;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄đŸŊâ€â™€ī¸", "name": "woman surfing: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3C4 1F3FD 200D 2640 FE0F", "html": "&#x1F3C4;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F3C4;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏄đŸŋâ€â™€ī¸", "name": "woman surfing: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3C4 1F3FF 200D 2640 FE0F", "html": "&#x1F3C4;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšŖâ€â™‚ī¸", "name": "man rowing boat", "shortname": ":man_rowing_boat:", "unicode": "1F6A3 200D 2642 FE0F", "html": "&#x1F6A3;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšŖâ€â™‚", "name": "man rowing boat", "shortname": ":man_rowing_boat:", "unicode": "1F6A3 200D 2642", "html": "&#x1F6A3;&#x200D;&#x2642;", "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": "&#x1F6A3;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšŖđŸģ‍♂", "name": "man rowing boat: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6A3 1F3FB 200D 2642", "html": "&#x1F6A3;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F6A3;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F6A3;&#x1F3FC;&#x200D;&#x2642;", "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": "&#x1F6A3;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšŖđŸŊ‍♂", "name": "man rowing boat: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6A3 1F3FD 200D 2642", "html": "&#x1F6A3;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F6A3;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F6A3;&#x1F3FE;&#x200D;&#x2642;", "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": "&#x1F6A3;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšŖđŸŋ‍♂", "name": "man rowing boat: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6A3 1F3FF 200D 2642", "html": "&#x1F6A3;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšŖâ€â™€ī¸", "name": "woman rowing boat", "shortname": ":woman_rowing_boat:", "unicode": "1F6A3 200D 2640 FE0F", "html": "&#x1F6A3;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F6A3;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F6A3;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F6A3;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F6A3;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F6A3;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸŠâ€â™‚ī¸", "name": "man swimming", "shortname": ":man_swimming:", "unicode": "1F3CA 200D 2642 FE0F", "html": "&#x1F3CA;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊‍♂", "name": "man swimming", "shortname": ":man_swimming:", "unicode": "1F3CA 200D 2642", "html": "&#x1F3CA;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊đŸģâ€â™‚ī¸", "name": "man swimming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CA 1F3FB 200D 2642 FE0F", "html": "&#x1F3CA;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊đŸģ‍♂", "name": "man swimming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CA 1F3FB 200D 2642", "html": "&#x1F3CA;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F3CA;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊đŸŧ‍♂", "name": "man swimming: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3CA 1F3FC 200D 2642", "html": "&#x1F3CA;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊đŸŊâ€â™‚ī¸", "name": "man swimming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CA 1F3FD 200D 2642 FE0F", "html": "&#x1F3CA;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊đŸŊ‍♂", "name": "man swimming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CA 1F3FD 200D 2642", "html": "&#x1F3CA;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F3CA;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊🏾‍♂", "name": "man swimming: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3CA 1F3FE 200D 2642", "html": "&#x1F3CA;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊đŸŋâ€â™‚ī¸", "name": "man swimming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CA 1F3FF 200D 2642 FE0F", "html": "&#x1F3CA;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊đŸŋ‍♂", "name": "man swimming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CA 1F3FF 200D 2642", "html": "&#x1F3CA;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸŠâ€â™€ī¸", "name": "woman swimming", "shortname": ":woman_swimming:", "unicode": "1F3CA 200D 2640 FE0F", "html": "&#x1F3CA;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊đŸģâ€â™€ī¸", "name": "woman swimming: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CA 1F3FB 200D 2640 FE0F", "html": "&#x1F3CA;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F3CA;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊đŸŊâ€â™€ī¸", "name": "woman swimming: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CA 1F3FD 200D 2640 FE0F", "html": "&#x1F3CA;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F3CA;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏊đŸŋâ€â™€ī¸", "name": "woman swimming: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CA 1F3FF 200D 2640 FE0F", "html": "&#x1F3CA;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "â›šī¸", "name": "person bouncing ball", "shortname": ":person_bouncing_ball:", "unicode": "26F9 FE0F", "html": "&#x26F9;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "â›šī¸â€â™‚ī¸", "name": "man bouncing ball", "shortname": ":man_bouncing_ball:", "unicode": "26F9 FE0F 200D 2642 FE0F", "html": "&#x26F9;&#xFE0F;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "â›šâ€â™‚ī¸", "name": "man bouncing ball", "shortname": ":man_bouncing_ball:", "unicode": "26F9 200D 2642 FE0F", "html": "&#x26F9;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "â›šī¸â€â™‚", "name": "man bouncing ball", "shortname": ":man_bouncing_ball:", "unicode": "26F9 FE0F 200D 2642", "html": "&#x26F9;&#xFE0F;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "⛹‍♂", "name": "man bouncing ball", "shortname": ":man_bouncing_ball:", "unicode": "26F9 200D 2642", "html": "&#x26F9;&#x200D;&#x2642;", "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": "&#x26F9;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "⛹đŸģ‍♂", "name": "man bouncing ball: light skin tone", "shortname": ":light_skin_tone:", "unicode": "26F9 1F3FB 200D 2642", "html": "&#x26F9;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x26F9;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "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": "&#x26F9;&#x1F3FC;&#x200D;&#x2642;", "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": "&#x26F9;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "⛹đŸŊ‍♂", "name": "man bouncing ball: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "26F9 1F3FD 200D 2642", "html": "&#x26F9;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x26F9;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "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": "&#x26F9;&#x1F3FE;&#x200D;&#x2642;", "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": "&#x26F9;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "⛹đŸŋ‍♂", "name": "man bouncing ball: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "26F9 1F3FF 200D 2642", "html": "&#x26F9;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "â›šī¸â€â™€ī¸", "name": "woman bouncing ball", "shortname": ":woman_bouncing_ball:", "unicode": "26F9 FE0F 200D 2640 FE0F", "html": "&#x26F9;&#xFE0F;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "â›šâ€â™€ī¸", "name": "woman bouncing ball", "shortname": ":woman_bouncing_ball:", "unicode": "26F9 200D 2640 FE0F", "html": "&#x26F9;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "â›šī¸â€â™€", "name": "woman bouncing ball", "shortname": ":woman_bouncing_ball:", "unicode": "26F9 FE0F 200D 2640", "html": "&#x26F9;&#xFE0F;&#x200D;&#x2640;", "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": "&#x26F9;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x26F9;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "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": "&#x26F9;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x26F9;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "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": "&#x26F9;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ‹ī¸", "name": "person lifting weights", "shortname": ":person_lifting_weights:", "unicode": "1F3CB FE0F", "html": "&#x1F3CB;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ‹ī¸â€â™‚ī¸", "name": "man lifting weights", "shortname": ":man_lifting_weights:", "unicode": "1F3CB FE0F 200D 2642 FE0F", "html": "&#x1F3CB;&#xFE0F;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ‹â€â™‚ī¸", "name": "man lifting weights", "shortname": ":man_lifting_weights:", "unicode": "1F3CB 200D 2642 FE0F", "html": "&#x1F3CB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ‹ī¸â€â™‚", "name": "man lifting weights", "shortname": ":man_lifting_weights:", "unicode": "1F3CB FE0F 200D 2642", "html": "&#x1F3CB;&#xFE0F;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏋‍♂", "name": "man lifting weights", "shortname": ":man_lifting_weights:", "unicode": "1F3CB 200D 2642", "html": "&#x1F3CB;&#x200D;&#x2642;", "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": "&#x1F3CB;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏋đŸģ‍♂", "name": "man lifting weights: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3CB 1F3FB 200D 2642", "html": "&#x1F3CB;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F3CB;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F3CB;&#x1F3FC;&#x200D;&#x2642;", "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": "&#x1F3CB;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏋đŸŊ‍♂", "name": "man lifting weights: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3CB 1F3FD 200D 2642", "html": "&#x1F3CB;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F3CB;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F3CB;&#x1F3FE;&#x200D;&#x2642;", "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": "&#x1F3CB;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🏋đŸŋ‍♂", "name": "man lifting weights: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3CB 1F3FF 200D 2642", "html": "&#x1F3CB;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ‹ī¸â€â™€ī¸", "name": "woman lifting weights", "shortname": ":woman_lifting_weights:", "unicode": "1F3CB FE0F 200D 2640 FE0F", "html": "&#x1F3CB;&#xFE0F;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ‹â€â™€ī¸", "name": "woman lifting weights", "shortname": ":woman_lifting_weights:", "unicode": "1F3CB 200D 2640 FE0F", "html": "&#x1F3CB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ‹ī¸â€â™€", "name": "woman lifting weights", "shortname": ":woman_lifting_weights:", "unicode": "1F3CB FE0F 200D 2640", "html": "&#x1F3CB;&#xFE0F;&#x200D;&#x2640;", "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": "&#x1F3CB;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F3CB;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F3CB;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F3CB;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F3CB;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸš´â€â™‚ī¸", "name": "man biking", "shortname": ":man_biking:", "unicode": "1F6B4 200D 2642 FE0F", "html": "&#x1F6B4;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴‍♂", "name": "man biking", "shortname": ":man_biking:", "unicode": "1F6B4 200D 2642", "html": "&#x1F6B4;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴đŸģâ€â™‚ī¸", "name": "man biking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B4 1F3FB 200D 2642 FE0F", "html": "&#x1F6B4;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴đŸģ‍♂", "name": "man biking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B4 1F3FB 200D 2642", "html": "&#x1F6B4;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F6B4;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴đŸŧ‍♂", "name": "man biking: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6B4 1F3FC 200D 2642", "html": "&#x1F6B4;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴đŸŊâ€â™‚ī¸", "name": "man biking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B4 1F3FD 200D 2642 FE0F", "html": "&#x1F6B4;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴đŸŊ‍♂", "name": "man biking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B4 1F3FD 200D 2642", "html": "&#x1F6B4;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F6B4;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴🏾‍♂", "name": "man biking: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6B4 1F3FE 200D 2642", "html": "&#x1F6B4;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴đŸŋâ€â™‚ī¸", "name": "man biking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B4 1F3FF 200D 2642 FE0F", "html": "&#x1F6B4;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴đŸŋ‍♂", "name": "man biking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B4 1F3FF 200D 2642", "html": "&#x1F6B4;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸš´â€â™€ī¸", "name": "woman biking", "shortname": ":woman_biking:", "unicode": "1F6B4 200D 2640 FE0F", "html": "&#x1F6B4;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴đŸģâ€â™€ī¸", "name": "woman biking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B4 1F3FB 200D 2640 FE0F", "html": "&#x1F6B4;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F6B4;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴đŸŊâ€â™€ī¸", "name": "woman biking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B4 1F3FD 200D 2640 FE0F", "html": "&#x1F6B4;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F6B4;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🚴đŸŋâ€â™€ī¸", "name": "woman biking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B4 1F3FF 200D 2640 FE0F", "html": "&#x1F6B4;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšĩâ€â™‚ī¸", "name": "man mountain biking", "shortname": ":man_mountain_biking:", "unicode": "1F6B5 200D 2642 FE0F", "html": "&#x1F6B5;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšĩ‍♂", "name": "man mountain biking", "shortname": ":man_mountain_biking:", "unicode": "1F6B5 200D 2642", "html": "&#x1F6B5;&#x200D;&#x2642;", "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": "&#x1F6B5;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšĩđŸģ‍♂", "name": "man mountain biking: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6B5 1F3FB 200D 2642", "html": "&#x1F6B5;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F6B5;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F6B5;&#x1F3FC;&#x200D;&#x2642;", "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": "&#x1F6B5;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšĩđŸŊ‍♂", "name": "man mountain biking: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6B5 1F3FD 200D 2642", "html": "&#x1F6B5;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F6B5;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F6B5;&#x1F3FE;&#x200D;&#x2642;", "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": "&#x1F6B5;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšĩđŸŋ‍♂", "name": "man mountain biking: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6B5 1F3FF 200D 2642", "html": "&#x1F6B5;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸšĩâ€â™€ī¸", "name": "woman mountain biking", "shortname": ":woman_mountain_biking:", "unicode": "1F6B5 200D 2640 FE0F", "html": "&#x1F6B5;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F6B5;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F6B5;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F6B5;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F6B5;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F6B5;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸", "name": "person cartwheeling", "shortname": ":person_cartwheeling:", "unicode": "1F938", "html": "&#x1F938;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸đŸģ", "name": "person cartwheeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F938 1F3FB", "html": "&#x1F938;&#x1F3FB;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸đŸŧ", "name": "person cartwheeling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F938 1F3FC", "html": "&#x1F938;&#x1F3FC;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸đŸŊ", "name": "person cartwheeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F938 1F3FD", "html": "&#x1F938;&#x1F3FD;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸🏾", "name": "person cartwheeling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F938 1F3FE", "html": "&#x1F938;&#x1F3FE;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸đŸŋ", "name": "person cartwheeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F938 1F3FF", "html": "&#x1F938;&#x1F3FF;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤¸â€â™‚ī¸", "name": "man cartwheeling", "shortname": ":man_cartwheeling:", "unicode": "1F938 200D 2642 FE0F", "html": "&#x1F938;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸‍♂", "name": "man cartwheeling", "shortname": ":man_cartwheeling:", "unicode": "1F938 200D 2642", "html": "&#x1F938;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸đŸģâ€â™‚ī¸", "name": "man cartwheeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F938 1F3FB 200D 2642 FE0F", "html": "&#x1F938;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸đŸģ‍♂", "name": "man cartwheeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F938 1F3FB 200D 2642", "html": "&#x1F938;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F938;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸đŸŧ‍♂", "name": "man cartwheeling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F938 1F3FC 200D 2642", "html": "&#x1F938;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸đŸŊâ€â™‚ī¸", "name": "man cartwheeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F938 1F3FD 200D 2642 FE0F", "html": "&#x1F938;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸đŸŊ‍♂", "name": "man cartwheeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F938 1F3FD 200D 2642", "html": "&#x1F938;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F938;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸🏾‍♂", "name": "man cartwheeling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F938 1F3FE 200D 2642", "html": "&#x1F938;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸đŸŋâ€â™‚ī¸", "name": "man cartwheeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F938 1F3FF 200D 2642 FE0F", "html": "&#x1F938;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸đŸŋ‍♂", "name": "man cartwheeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F938 1F3FF 200D 2642", "html": "&#x1F938;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤¸â€â™€ī¸", "name": "woman cartwheeling", "shortname": ":woman_cartwheeling:", "unicode": "1F938 200D 2640 FE0F", "html": "&#x1F938;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸‍♀", "name": "woman cartwheeling", "shortname": ":woman_cartwheeling:", "unicode": "1F938 200D 2640", "html": "&#x1F938;&#x200D;&#x2640;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸đŸģâ€â™€ī¸", "name": "woman cartwheeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F938 1F3FB 200D 2640 FE0F", "html": "&#x1F938;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸đŸģ‍♀", "name": "woman cartwheeling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F938 1F3FB 200D 2640", "html": "&#x1F938;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F938;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸đŸŧ‍♀", "name": "woman cartwheeling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F938 1F3FC 200D 2640", "html": "&#x1F938;&#x1F3FC;&#x200D;&#x2640;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸đŸŊâ€â™€ī¸", "name": "woman cartwheeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F938 1F3FD 200D 2640 FE0F", "html": "&#x1F938;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸đŸŊ‍♀", "name": "woman cartwheeling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F938 1F3FD 200D 2640", "html": "&#x1F938;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F938;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸🏾‍♀", "name": "woman cartwheeling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F938 1F3FE 200D 2640", "html": "&#x1F938;&#x1F3FE;&#x200D;&#x2640;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸đŸŋâ€â™€ī¸", "name": "woman cartwheeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F938 1F3FF 200D 2640 FE0F", "html": "&#x1F938;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤸đŸŋ‍♀", "name": "woman cartwheeling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F938 1F3FF 200D 2640", "html": "&#x1F938;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤ŧ", "name": "people wrestling", "shortname": ":people_wrestling:", "unicode": "1F93C", "html": "&#x1F93C;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤ŧâ€â™‚ī¸", "name": "men wrestling", "shortname": ":men_wrestling:", "unicode": "1F93C 200D 2642 FE0F", "html": "&#x1F93C;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤ŧ‍♂", "name": "men wrestling", "shortname": ":men_wrestling:", "unicode": "1F93C 200D 2642", "html": "&#x1F93C;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤ŧâ€â™€ī¸", "name": "women wrestling", "shortname": ":women_wrestling:", "unicode": "1F93C 200D 2640 FE0F", "html": "&#x1F93C;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤ŧ‍♀", "name": "women wrestling", "shortname": ":women_wrestling:", "unicode": "1F93C 200D 2640", "html": "&#x1F93C;&#x200D;&#x2640;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤Ŋ", "name": "person playing water polo", "shortname": ":person_playing_water_polo:", "unicode": "1F93D", "html": "&#x1F93D;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤ŊđŸģ", "name": "person playing water polo: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F93D 1F3FB", "html": "&#x1F93D;&#x1F3FB;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤ŊđŸŧ", "name": "person playing water polo: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F93D 1F3FC", "html": "&#x1F93D;&#x1F3FC;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤ŊđŸŊ", "name": "person playing water polo: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F93D 1F3FD", "html": "&#x1F93D;&#x1F3FD;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤Ŋ🏾", "name": "person playing water polo: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F93D 1F3FE", "html": "&#x1F93D;&#x1F3FE;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤ŊđŸŋ", "name": "person playing water polo: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F93D 1F3FF", "html": "&#x1F93D;&#x1F3FF;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤Ŋâ€â™‚ī¸", "name": "man playing water polo", "shortname": ":man_playing_water_polo:", "unicode": "1F93D 200D 2642 FE0F", "html": "&#x1F93D;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤Ŋ‍♂", "name": "man playing water polo", "shortname": ":man_playing_water_polo:", "unicode": "1F93D 200D 2642", "html": "&#x1F93D;&#x200D;&#x2642;", "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": "&#x1F93D;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F93D;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F93D;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F93D;&#x1F3FC;&#x200D;&#x2642;", "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": "&#x1F93D;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F93D;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F93D;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F93D;&#x1F3FE;&#x200D;&#x2642;", "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": "&#x1F93D;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F93D;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤Ŋâ€â™€ī¸", "name": "woman playing water polo", "shortname": ":woman_playing_water_polo:", "unicode": "1F93D 200D 2640 FE0F", "html": "&#x1F93D;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤Ŋ‍♀", "name": "woman playing water polo", "shortname": ":woman_playing_water_polo:", "unicode": "1F93D 200D 2640", "html": "&#x1F93D;&#x200D;&#x2640;", "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": "&#x1F93D;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F93D;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F93D;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F93D;&#x1F3FC;&#x200D;&#x2640;", "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": "&#x1F93D;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F93D;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F93D;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F93D;&#x1F3FE;&#x200D;&#x2640;", "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": "&#x1F93D;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F93D;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤾", "name": "person playing handball", "shortname": ":person_playing_handball:", "unicode": "1F93E", "html": "&#x1F93E;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤾đŸģ", "name": "person playing handball: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F93E 1F3FB", "html": "&#x1F93E;&#x1F3FB;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤾đŸŧ", "name": "person playing handball: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F93E 1F3FC", "html": "&#x1F93E;&#x1F3FC;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤾đŸŊ", "name": "person playing handball: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F93E 1F3FD", "html": "&#x1F93E;&#x1F3FD;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤾🏾", "name": "person playing handball: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F93E 1F3FE", "html": "&#x1F93E;&#x1F3FE;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤾đŸŋ", "name": "person playing handball: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F93E 1F3FF", "html": "&#x1F93E;&#x1F3FF;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤žâ€â™‚ī¸", "name": "man playing handball", "shortname": ":man_playing_handball:", "unicode": "1F93E 200D 2642 FE0F", "html": "&#x1F93E;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤾‍♂", "name": "man playing handball", "shortname": ":man_playing_handball:", "unicode": "1F93E 200D 2642", "html": "&#x1F93E;&#x200D;&#x2642;", "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": "&#x1F93E;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤾đŸģ‍♂", "name": "man playing handball: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F93E 1F3FB 200D 2642", "html": "&#x1F93E;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F93E;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F93E;&#x1F3FC;&#x200D;&#x2642;", "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": "&#x1F93E;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤾đŸŊ‍♂", "name": "man playing handball: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F93E 1F3FD 200D 2642", "html": "&#x1F93E;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F93E;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F93E;&#x1F3FE;&#x200D;&#x2642;", "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": "&#x1F93E;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤾đŸŋ‍♂", "name": "man playing handball: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F93E 1F3FF 200D 2642", "html": "&#x1F93E;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤žâ€â™€ī¸", "name": "woman playing handball", "shortname": ":woman_playing_handball:", "unicode": "1F93E 200D 2640 FE0F", "html": "&#x1F93E;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤾‍♀", "name": "woman playing handball", "shortname": ":woman_playing_handball:", "unicode": "1F93E 200D 2640", "html": "&#x1F93E;&#x200D;&#x2640;", "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": "&#x1F93E;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤾đŸģ‍♀", "name": "woman playing handball: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F93E 1F3FB 200D 2640", "html": "&#x1F93E;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F93E;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F93E;&#x1F3FC;&#x200D;&#x2640;", "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": "&#x1F93E;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤾đŸŊ‍♀", "name": "woman playing handball: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F93E 1F3FD 200D 2640", "html": "&#x1F93E;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F93E;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F93E;&#x1F3FE;&#x200D;&#x2640;", "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": "&#x1F93E;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤾đŸŋ‍♀", "name": "woman playing handball: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F93E 1F3FF 200D 2640", "html": "&#x1F93E;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹", "name": "person juggling", "shortname": ":person_juggling:", "unicode": "1F939", "html": "&#x1F939;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹đŸģ", "name": "person juggling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F939 1F3FB", "html": "&#x1F939;&#x1F3FB;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹đŸŧ", "name": "person juggling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F939 1F3FC", "html": "&#x1F939;&#x1F3FC;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹đŸŊ", "name": "person juggling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F939 1F3FD", "html": "&#x1F939;&#x1F3FD;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹🏾", "name": "person juggling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F939 1F3FE", "html": "&#x1F939;&#x1F3FE;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹đŸŋ", "name": "person juggling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F939 1F3FF", "html": "&#x1F939;&#x1F3FF;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤šâ€â™‚ī¸", "name": "man juggling", "shortname": ":man_juggling:", "unicode": "1F939 200D 2642 FE0F", "html": "&#x1F939;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹‍♂", "name": "man juggling", "shortname": ":man_juggling:", "unicode": "1F939 200D 2642", "html": "&#x1F939;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹đŸģâ€â™‚ī¸", "name": "man juggling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F939 1F3FB 200D 2642 FE0F", "html": "&#x1F939;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹đŸģ‍♂", "name": "man juggling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F939 1F3FB 200D 2642", "html": "&#x1F939;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F939;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹đŸŧ‍♂", "name": "man juggling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F939 1F3FC 200D 2642", "html": "&#x1F939;&#x1F3FC;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹đŸŊâ€â™‚ī¸", "name": "man juggling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F939 1F3FD 200D 2642 FE0F", "html": "&#x1F939;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹đŸŊ‍♂", "name": "man juggling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F939 1F3FD 200D 2642", "html": "&#x1F939;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F939;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹🏾‍♂", "name": "man juggling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F939 1F3FE 200D 2642", "html": "&#x1F939;&#x1F3FE;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹đŸŋâ€â™‚ī¸", "name": "man juggling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F939 1F3FF 200D 2642 FE0F", "html": "&#x1F939;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹đŸŋ‍♂", "name": "man juggling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F939 1F3FF 200D 2642", "html": "&#x1F939;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "đŸ¤šâ€â™€ī¸", "name": "woman juggling", "shortname": ":woman_juggling:", "unicode": "1F939 200D 2640 FE0F", "html": "&#x1F939;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹‍♀", "name": "woman juggling", "shortname": ":woman_juggling:", "unicode": "1F939 200D 2640", "html": "&#x1F939;&#x200D;&#x2640;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹đŸģâ€â™€ī¸", "name": "woman juggling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F939 1F3FB 200D 2640 FE0F", "html": "&#x1F939;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹đŸģ‍♀", "name": "woman juggling: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F939 1F3FB 200D 2640", "html": "&#x1F939;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F939;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹đŸŧ‍♀", "name": "woman juggling: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F939 1F3FC 200D 2640", "html": "&#x1F939;&#x1F3FC;&#x200D;&#x2640;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹đŸŊâ€â™€ī¸", "name": "woman juggling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F939 1F3FD 200D 2640 FE0F", "html": "&#x1F939;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹đŸŊ‍♀", "name": "woman juggling: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F939 1F3FD 200D 2640", "html": "&#x1F939;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F939;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹🏾‍♀", "name": "woman juggling: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F939 1F3FE 200D 2640", "html": "&#x1F939;&#x1F3FE;&#x200D;&#x2640;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹đŸŋâ€â™€ī¸", "name": "woman juggling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F939 1F3FF 200D 2640 FE0F", "html": "&#x1F939;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🤹đŸŋ‍♀", "name": "woman juggling: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F939 1F3FF 200D 2640", "html": "&#x1F939;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-sport)", "order": ""},
+ {"emoji": "🧘", "name": "person in lotus position", "shortname": ":person_in_lotus_position:", "unicode": "1F9D8", "html": "&#x1F9D8;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "🧘đŸģ", "name": "person in lotus position: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F9D8 1F3FB", "html": "&#x1F9D8;&#x1F3FB;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "🧘đŸŧ", "name": "person in lotus position: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F9D8 1F3FC", "html": "&#x1F9D8;&#x1F3FC;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "🧘đŸŊ", "name": "person in lotus position: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F9D8 1F3FD", "html": "&#x1F9D8;&#x1F3FD;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "🧘🏾", "name": "person in lotus position: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F9D8 1F3FE", "html": "&#x1F9D8;&#x1F3FE;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "🧘đŸŋ", "name": "person in lotus position: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F9D8 1F3FF", "html": "&#x1F9D8;&#x1F3FF;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "đŸ§˜â€â™‚ī¸", "name": "man in lotus position", "shortname": ":man_in_lotus_position:", "unicode": "1F9D8 200D 2642 FE0F", "html": "&#x1F9D8;&#x200D;&#x2642;&#xFE0F;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "🧘‍♂", "name": "man in lotus position", "shortname": ":man_in_lotus_position:", "unicode": "1F9D8 200D 2642", "html": "&#x1F9D8;&#x200D;&#x2642;", "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": "&#x1F9D8;&#x1F3FB;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F9D8;&#x1F3FB;&#x200D;&#x2642;", "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": "&#x1F9D8;&#x1F3FC;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F9D8;&#x1F3FC;&#x200D;&#x2642;", "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": "&#x1F9D8;&#x1F3FD;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F9D8;&#x1F3FD;&#x200D;&#x2642;", "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": "&#x1F9D8;&#x1F3FE;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F9D8;&#x1F3FE;&#x200D;&#x2642;", "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": "&#x1F9D8;&#x1F3FF;&#x200D;&#x2642;&#xFE0F;", "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": "&#x1F9D8;&#x1F3FF;&#x200D;&#x2642;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "đŸ§˜â€â™€ī¸", "name": "woman in lotus position", "shortname": ":woman_in_lotus_position:", "unicode": "1F9D8 200D 2640 FE0F", "html": "&#x1F9D8;&#x200D;&#x2640;&#xFE0F;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "🧘‍♀", "name": "woman in lotus position", "shortname": ":woman_in_lotus_position:", "unicode": "1F9D8 200D 2640", "html": "&#x1F9D8;&#x200D;&#x2640;", "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": "&#x1F9D8;&#x1F3FB;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F9D8;&#x1F3FB;&#x200D;&#x2640;", "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": "&#x1F9D8;&#x1F3FC;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F9D8;&#x1F3FC;&#x200D;&#x2640;", "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": "&#x1F9D8;&#x1F3FD;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F9D8;&#x1F3FD;&#x200D;&#x2640;", "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": "&#x1F9D8;&#x1F3FE;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F9D8;&#x1F3FE;&#x200D;&#x2640;", "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": "&#x1F9D8;&#x1F3FF;&#x200D;&#x2640;&#xFE0F;", "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": "&#x1F9D8;&#x1F3FF;&#x200D;&#x2640;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "🛌đŸģ", "name": "person in bed: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F6CC 1F3FB", "html": "&#x1F6CC;&#x1F3FB;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "🛌đŸŧ", "name": "person in bed: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F6CC 1F3FC", "html": "&#x1F6CC;&#x1F3FC;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "🛌đŸŊ", "name": "person in bed: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F6CC 1F3FD", "html": "&#x1F6CC;&#x1F3FD;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "🛌🏾", "name": "person in bed: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F6CC 1F3FE", "html": "&#x1F6CC;&#x1F3FE;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "🛌đŸŋ", "name": "person in bed: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F6CC 1F3FF", "html": "&#x1F6CC;&#x1F3FF;", "category": "People & Body (person-resting)", "order": ""},
+ {"emoji": "🧑‍🤝‍🧑", "name": "people holding hands", "shortname": ":people_holding_hands:", "unicode": "1F9D1 200D 1F91D 200D 1F9D1", "html": "&#x1F9D1;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;", "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": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FB;", "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": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FC;", "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": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FD;", "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": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FE;", "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": "&#x1F9D1;&#x1F3FB;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FF;", "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": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FB;", "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": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FC;", "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": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FD;", "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": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FE;", "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": "&#x1F9D1;&#x1F3FC;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FF;", "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": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FB;", "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": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FC;", "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": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FD;", "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": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FE;", "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": "&#x1F9D1;&#x1F3FD;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FF;", "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": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FB;", "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": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FC;", "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": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FD;", "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": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FE;", "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": "&#x1F9D1;&#x1F3FE;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FF;", "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": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FB;", "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": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FC;", "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": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FD;", "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": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FE;", "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": "&#x1F9D1;&#x1F3FF;&#x200D;&#x1F91D;&#x200D;&#x1F9D1;&#x1F3FF;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👭đŸģ", "name": "women holding hands: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F46D 1F3FB", "html": "&#x1F46D;&#x1F3FB;", "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": "&#x1F469;&#x1F3FB;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FC;", "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": "&#x1F469;&#x1F3FB;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FD;", "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": "&#x1F469;&#x1F3FB;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FE;", "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": "&#x1F469;&#x1F3FB;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FF;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FB;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👭đŸŧ", "name": "women holding hands: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F46D 1F3FC", "html": "&#x1F46D;&#x1F3FC;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FD;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FE;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FF;", "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": "&#x1F469;&#x1F3FD;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FB;", "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": "&#x1F469;&#x1F3FD;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FC;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👭đŸŊ", "name": "women holding hands: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F46D 1F3FD", "html": "&#x1F46D;&#x1F3FD;", "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": "&#x1F469;&#x1F3FD;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FE;", "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": "&#x1F469;&#x1F3FD;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FF;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FB;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FC;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FD;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👭🏾", "name": "women holding hands: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F46D 1F3FE", "html": "&#x1F46D;&#x1F3FE;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FF;", "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": "&#x1F469;&#x1F3FF;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FB;", "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": "&#x1F469;&#x1F3FF;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FC;", "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": "&#x1F469;&#x1F3FF;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FD;", "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": "&#x1F469;&#x1F3FF;&#x200D;&#x1F91D;&#x200D;&#x1F469;&#x1F3FE;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👭đŸŋ", "name": "women holding hands: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F46D 1F3FF", "html": "&#x1F46D;&#x1F3FF;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "đŸ‘ĢđŸģ", "name": "woman and man holding hands: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F46B 1F3FB", "html": "&#x1F46B;&#x1F3FB;", "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": "&#x1F469;&#x1F3FB;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FC;", "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": "&#x1F469;&#x1F3FB;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FD;", "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": "&#x1F469;&#x1F3FB;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FE;", "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": "&#x1F469;&#x1F3FB;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FF;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FB;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "đŸ‘ĢđŸŧ", "name": "woman and man holding hands: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F46B 1F3FC", "html": "&#x1F46B;&#x1F3FC;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FD;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FE;", "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": "&#x1F469;&#x1F3FC;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FF;", "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": "&#x1F469;&#x1F3FD;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FB;", "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": "&#x1F469;&#x1F3FD;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FC;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "đŸ‘ĢđŸŊ", "name": "woman and man holding hands: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F46B 1F3FD", "html": "&#x1F46B;&#x1F3FD;", "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": "&#x1F469;&#x1F3FD;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FE;", "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": "&#x1F469;&#x1F3FD;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FF;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FB;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FC;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FD;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "đŸ‘Ģ🏾", "name": "woman and man holding hands: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F46B 1F3FE", "html": "&#x1F46B;&#x1F3FE;", "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": "&#x1F469;&#x1F3FE;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FF;", "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": "&#x1F469;&#x1F3FF;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FB;", "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": "&#x1F469;&#x1F3FF;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FC;", "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": "&#x1F469;&#x1F3FF;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FD;", "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": "&#x1F469;&#x1F3FF;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FE;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "đŸ‘ĢđŸŋ", "name": "woman and man holding hands: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F46B 1F3FF", "html": "&#x1F46B;&#x1F3FF;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "đŸ‘ŦđŸģ", "name": "men holding hands: light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F46C 1F3FB", "html": "&#x1F46C;&#x1F3FB;", "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": "&#x1F468;&#x1F3FB;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FC;", "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": "&#x1F468;&#x1F3FB;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FD;", "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": "&#x1F468;&#x1F3FB;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FE;", "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": "&#x1F468;&#x1F3FB;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FF;", "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": "&#x1F468;&#x1F3FC;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FB;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "đŸ‘ŦđŸŧ", "name": "men holding hands: medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F46C 1F3FC", "html": "&#x1F46C;&#x1F3FC;", "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": "&#x1F468;&#x1F3FC;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FD;", "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": "&#x1F468;&#x1F3FC;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FE;", "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": "&#x1F468;&#x1F3FC;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FF;", "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": "&#x1F468;&#x1F3FD;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FB;", "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": "&#x1F468;&#x1F3FD;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FC;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "đŸ‘ŦđŸŊ", "name": "men holding hands: medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F46C 1F3FD", "html": "&#x1F46C;&#x1F3FD;", "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": "&#x1F468;&#x1F3FD;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FE;", "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": "&#x1F468;&#x1F3FD;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FF;", "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": "&#x1F468;&#x1F3FE;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FB;", "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": "&#x1F468;&#x1F3FE;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FC;", "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": "&#x1F468;&#x1F3FE;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FD;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "đŸ‘Ŧ🏾", "name": "men holding hands: medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F46C 1F3FE", "html": "&#x1F46C;&#x1F3FE;", "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": "&#x1F468;&#x1F3FE;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FF;", "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": "&#x1F468;&#x1F3FF;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FB;", "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": "&#x1F468;&#x1F3FF;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FC;", "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": "&#x1F468;&#x1F3FF;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FD;", "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": "&#x1F468;&#x1F3FF;&#x200D;&#x1F91D;&#x200D;&#x1F468;&#x1F3FE;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "đŸ‘ŦđŸŋ", "name": "men holding hands: dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F46C 1F3FF", "html": "&#x1F46C;&#x1F3FF;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "đŸ‘Šâ€â¤ī¸â€đŸ’‹â€đŸ‘¨", "name": "kiss: woman, man", "shortname": ":woman_man:", "unicode": "1F469 200D 2764 FE0F 200D 1F48B 200D 1F468", "html": "&#x1F469;&#x200D;&#x2764;&#xFE0F;&#x200D;&#x1F48B;&#x200D;&#x1F468;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👩‍❤‍💋‍👨", "name": "kiss: woman, man", "shortname": ":woman_man:", "unicode": "1F469 200D 2764 200D 1F48B 200D 1F468", "html": "&#x1F469;&#x200D;&#x2764;&#x200D;&#x1F48B;&#x200D;&#x1F468;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👨‍❤‍💋‍👨", "name": "kiss: man, man", "shortname": ":man_man:", "unicode": "1F468 200D 2764 200D 1F48B 200D 1F468", "html": "&#x1F468;&#x200D;&#x2764;&#x200D;&#x1F48B;&#x200D;&#x1F468;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👩‍❤‍💋‍👩", "name": "kiss: woman, woman", "shortname": ":woman_woman:", "unicode": "1F469 200D 2764 200D 1F48B 200D 1F469", "html": "&#x1F469;&#x200D;&#x2764;&#x200D;&#x1F48B;&#x200D;&#x1F469;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "đŸ‘Šâ€â¤ī¸â€đŸ‘¨", "name": "couple with heart: woman, man", "shortname": ":woman_man:", "unicode": "1F469 200D 2764 FE0F 200D 1F468", "html": "&#x1F469;&#x200D;&#x2764;&#xFE0F;&#x200D;&#x1F468;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👩‍❤‍👨", "name": "couple with heart: woman, man", "shortname": ":woman_man:", "unicode": "1F469 200D 2764 200D 1F468", "html": "&#x1F469;&#x200D;&#x2764;&#x200D;&#x1F468;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👨‍❤‍👨", "name": "couple with heart: man, man", "shortname": ":man_man:", "unicode": "1F468 200D 2764 200D 1F468", "html": "&#x1F468;&#x200D;&#x2764;&#x200D;&#x1F468;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👩‍❤‍👩", "name": "couple with heart: woman, woman", "shortname": ":woman_woman:", "unicode": "1F469 200D 2764 200D 1F469", "html": "&#x1F469;&#x200D;&#x2764;&#x200D;&#x1F469;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "👨‍👩‍đŸ‘Ļ", "name": "family: man, woman, boy", "shortname": ":man_woman_boy:", "unicode": "1F468 200D 1F469 200D 1F466", "html": "&#x1F468;&#x200D;&#x1F469;&#x200D;&#x1F466;", "category": "People & Body (family)", "order": ""},
+ {"emoji": "đŸ—Ŗī¸", "name": "speaking head", "shortname": ":speaking_head:", "unicode": "1F5E3 FE0F", "html": "&#x1F5E3;&#xFE0F;", "category": "People & Body (person-symbol)", "order": ""},
+ {"emoji": "đŸģ", "name": "light skin tone", "shortname": ":light_skin_tone:", "unicode": "1F3FB", "html": "&#x1F3FB;", "category": "Component (skin-tone)", "order": ""},
+ {"emoji": "đŸŧ", "name": "medium-light skin tone", "shortname": ":mediumlight_skin_tone:", "unicode": "1F3FC", "html": "&#x1F3FC;", "category": "Component (skin-tone)", "order": ""},
+ {"emoji": "đŸŊ", "name": "medium skin tone", "shortname": ":medium_skin_tone:", "unicode": "1F3FD", "html": "&#x1F3FD;", "category": "Component (skin-tone)", "order": ""},
+ {"emoji": "🏾", "name": "medium-dark skin tone", "shortname": ":mediumdark_skin_tone:", "unicode": "1F3FE", "html": "&#x1F3FE;", "category": "Component (skin-tone)", "order": ""},
+ {"emoji": "đŸŋ", "name": "dark skin tone", "shortname": ":dark_skin_tone:", "unicode": "1F3FF", "html": "&#x1F3FF;", "category": "Component (skin-tone)", "order": ""},
+ {"emoji": "đŸĻ°", "name": "red hair", "shortname": ":red_hair:", "unicode": "1F9B0", "html": "&#x1F9B0;", "category": "Component (hair-style)", "order": ""},
+ {"emoji": "đŸĻą", "name": "curly hair", "shortname": ":curly_hair:", "unicode": "1F9B1", "html": "&#x1F9B1;", "category": "Component (hair-style)", "order": ""},
+ {"emoji": "đŸĻŗ", "name": "white hair", "shortname": ":white_hair:", "unicode": "1F9B3", "html": "&#x1F9B3;", "category": "Component (hair-style)", "order": ""},
+ {"emoji": "đŸĻ˛", "name": "bald", "shortname": ":bald:", "unicode": "1F9B2", "html": "&#x1F9B2;", "category": "Component (hair-style)", "order": ""},
+ {"emoji": "đŸĻ", "name": "gorilla", "shortname": ":gorilla:", "unicode": "1F98D", "html": "&#x1F98D;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸĻ§", "name": "orangutan", "shortname": ":orangutan:", "unicode": "1F9A7", "html": "&#x1F9A7;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸĻŽ", "name": "guide dog", "shortname": ":guide_dog:", "unicode": "1F9AE", "html": "&#x1F9AE;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "🐕‍đŸĻē", "name": "service dog", "shortname": ":service_dog:", "unicode": "1F415 200D 1F9BA", "html": "&#x1F415;&#x200D;&#x1F9BA;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸĻŠ", "name": "fox", "shortname": ":fox:", "unicode": "1F98A", "html": "&#x1F98A;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸĻ", "name": "raccoon", "shortname": ":raccoon:", "unicode": "1F99D", "html": "&#x1F99D;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸĻ“", "name": "zebra", "shortname": ":zebra:", "unicode": "1F993", "html": "&#x1F993;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸĻŒ", "name": "deer", "shortname": ":deer:", "unicode": "1F98C", "html": "&#x1F98C;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸĻ™", "name": "llama", "shortname": ":llama:", "unicode": "1F999", "html": "&#x1F999;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸĻ’", "name": "giraffe", "shortname": ":giraffe:", "unicode": "1F992", "html": "&#x1F992;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸĻ", "name": "rhinoceros", "shortname": ":rhinoceros:", "unicode": "1F98F", "html": "&#x1F98F;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸĻ›", "name": "hippopotamus", "shortname": ":hippopotamus:", "unicode": "1F99B", "html": "&#x1F99B;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸŋī¸", "name": "chipmunk", "shortname": ":chipmunk:", "unicode": "1F43F FE0F", "html": "&#x1F43F;&#xFE0F;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸĻ”", "name": "hedgehog", "shortname": ":hedgehog:", "unicode": "1F994", "html": "&#x1F994;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸĻ‡", "name": "bat", "shortname": ":bat:", "unicode": "1F987", "html": "&#x1F987;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸĻĨ", "name": "sloth", "shortname": ":sloth:", "unicode": "1F9A5", "html": "&#x1F9A5;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸĻĻ", "name": "otter", "shortname": ":otter:", "unicode": "1F9A6", "html": "&#x1F9A6;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸĻ¨", "name": "skunk", "shortname": ":skunk:", "unicode": "1F9A8", "html": "&#x1F9A8;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸĻ˜", "name": "kangaroo", "shortname": ":kangaroo:", "unicode": "1F998", "html": "&#x1F998;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸĻĄ", "name": "badger", "shortname": ":badger:", "unicode": "1F9A1", "html": "&#x1F9A1;", "category": "Animals & Nature (animal-mammal)", "order": ""},
+ {"emoji": "đŸ•Šī¸", "name": "dove", "shortname": ":dove:", "unicode": "1F54A FE0F", "html": "&#x1F54A;&#xFE0F;", "category": "Animals & Nature (animal-bird)", "order": ""},
+ {"emoji": "đŸĻ…", "name": "eagle", "shortname": ":eagle:", "unicode": "1F985", "html": "&#x1F985;", "category": "Animals & Nature (animal-bird)", "order": ""},
+ {"emoji": "đŸĻ†", "name": "duck", "shortname": ":duck:", "unicode": "1F986", "html": "&#x1F986;", "category": "Animals & Nature (animal-bird)", "order": ""},
+ {"emoji": "đŸĻĸ", "name": "swan", "shortname": ":swan:", "unicode": "1F9A2", "html": "&#x1F9A2;", "category": "Animals & Nature (animal-bird)", "order": ""},
+ {"emoji": "đŸĻ‰", "name": "owl", "shortname": ":owl:", "unicode": "1F989", "html": "&#x1F989;", "category": "Animals & Nature (animal-bird)", "order": ""},
+ {"emoji": "đŸĻŠ", "name": "flamingo", "shortname": ":flamingo:", "unicode": "1F9A9", "html": "&#x1F9A9;", "category": "Animals & Nature (animal-bird)", "order": ""},
+ {"emoji": "đŸĻš", "name": "peacock", "shortname": ":peacock:", "unicode": "1F99A", "html": "&#x1F99A;", "category": "Animals & Nature (animal-bird)", "order": ""},
+ {"emoji": "đŸĻœ", "name": "parrot", "shortname": ":parrot:", "unicode": "1F99C", "html": "&#x1F99C;", "category": "Animals & Nature (animal-bird)", "order": ""},
+ {"emoji": "đŸĻŽ", "name": "lizard", "shortname": ":lizard:", "unicode": "1F98E", "html": "&#x1F98E;", "category": "Animals & Nature (animal-reptile)", "order": ""},
+ {"emoji": "đŸĻ•", "name": "sauropod", "shortname": ":sauropod:", "unicode": "1F995", "html": "&#x1F995;", "category": "Animals & Nature (animal-reptile)", "order": ""},
+ {"emoji": "đŸĻ–", "name": "T-Rex", "shortname": ":TRex:", "unicode": "1F996", "html": "&#x1F996;", "category": "Animals & Nature (animal-reptile)", "order": ""},
+ {"emoji": "đŸĻˆ", "name": "shark", "shortname": ":shark:", "unicode": "1F988", "html": "&#x1F988;", "category": "Animals & Nature (animal-marine)", "order": ""},
+ {"emoji": "đŸĻ‹", "name": "butterfly", "shortname": ":butterfly:", "unicode": "1F98B", "html": "&#x1F98B;", "category": "Animals & Nature (animal-bug)", "order": ""},
+ {"emoji": "đŸĻ—", "name": "cricket", "shortname": ":cricket:", "unicode": "1F997", "html": "&#x1F997;", "category": "Animals & Nature (animal-bug)", "order": ""},
+ {"emoji": "đŸ•ˇī¸", "name": "spider", "shortname": ":spider:", "unicode": "1F577 FE0F", "html": "&#x1F577;&#xFE0F;", "category": "Animals & Nature (animal-bug)", "order": ""},
+ {"emoji": "đŸ•¸ī¸", "name": "spider web", "shortname": ":spider_web:", "unicode": "1F578 FE0F", "html": "&#x1F578;&#xFE0F;", "category": "Animals & Nature (animal-bug)", "order": ""},
+ {"emoji": "đŸĻŸ", "name": "mosquito", "shortname": ":mosquito:", "unicode": "1F99F", "html": "&#x1F99F;", "category": "Animals & Nature (animal-bug)", "order": ""},
+ {"emoji": "đŸĻ ", "name": "microbe", "shortname": ":microbe:", "unicode": "1F9A0", "html": "&#x1F9A0;", "category": "Animals & Nature (animal-bug)", "order": ""},
+ {"emoji": "đŸĩī¸", "name": "rosette", "shortname": ":rosette:", "unicode": "1F3F5 FE0F", "html": "&#x1F3F5;&#xFE0F;", "category": "Animals & Nature (plant-flower)", "order": ""},
+ {"emoji": "đŸĨ€", "name": "wilted flower", "shortname": ":wilted_flower:", "unicode": "1F940", "html": "&#x1F940;", "category": "Animals & Nature (plant-flower)", "order": ""},
+ {"emoji": "â˜˜ī¸", "name": "shamrock", "shortname": ":shamrock:", "unicode": "2618 FE0F", "html": "&#x2618;&#xFE0F;", "category": "Animals & Nature (plant-other)", "order": ""},
+ {"emoji": "đŸĨ­", "name": "mango", "shortname": ":mango:", "unicode": "1F96D", "html": "&#x1F96D;", "category": "Food & Drink (food-fruit)", "order": ""},
+ {"emoji": "đŸĨ", "name": "kiwi fruit", "shortname": ":kiwi_fruit:", "unicode": "1F95D", "html": "&#x1F95D;", "category": "Food & Drink (food-fruit)", "order": ""},
+ {"emoji": "đŸĨĨ", "name": "coconut", "shortname": ":coconut:", "unicode": "1F965", "html": "&#x1F965;", "category": "Food & Drink (food-fruit)", "order": ""},
+ {"emoji": "đŸĨ‘", "name": "avocado", "shortname": ":avocado:", "unicode": "1F951", "html": "&#x1F951;", "category": "Food & Drink (food-vegetable)", "order": ""},
+ {"emoji": "đŸĨ”", "name": "potato", "shortname": ":potato:", "unicode": "1F954", "html": "&#x1F954;", "category": "Food & Drink (food-vegetable)", "order": ""},
+ {"emoji": "đŸĨ•", "name": "carrot", "shortname": ":carrot:", "unicode": "1F955", "html": "&#x1F955;", "category": "Food & Drink (food-vegetable)", "order": ""},
+ {"emoji": "đŸŒļī¸", "name": "hot pepper", "shortname": ":hot_pepper:", "unicode": "1F336 FE0F", "html": "&#x1F336;&#xFE0F;", "category": "Food & Drink (food-vegetable)", "order": ""},
+ {"emoji": "đŸĨ’", "name": "cucumber", "shortname": ":cucumber:", "unicode": "1F952", "html": "&#x1F952;", "category": "Food & Drink (food-vegetable)", "order": ""},
+ {"emoji": "đŸĨŦ", "name": "leafy green", "shortname": ":leafy_green:", "unicode": "1F96C", "html": "&#x1F96C;", "category": "Food & Drink (food-vegetable)", "order": ""},
+ {"emoji": "đŸĨĻ", "name": "broccoli", "shortname": ":broccoli:", "unicode": "1F966", "html": "&#x1F966;", "category": "Food & Drink (food-vegetable)", "order": ""},
+ {"emoji": "🧄", "name": "garlic", "shortname": ":garlic:", "unicode": "1F9C4", "html": "&#x1F9C4;", "category": "Food & Drink (food-vegetable)", "order": ""},
+ {"emoji": "🧅", "name": "onion", "shortname": ":onion:", "unicode": "1F9C5", "html": "&#x1F9C5;", "category": "Food & Drink (food-vegetable)", "order": ""},
+ {"emoji": "đŸĨœ", "name": "peanuts", "shortname": ":peanuts:", "unicode": "1F95C", "html": "&#x1F95C;", "category": "Food & Drink (food-vegetable)", "order": ""},
+ {"emoji": "đŸĨ", "name": "croissant", "shortname": ":croissant:", "unicode": "1F950", "html": "&#x1F950;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "đŸĨ–", "name": "baguette bread", "shortname": ":baguette_bread:", "unicode": "1F956", "html": "&#x1F956;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "đŸĨ¨", "name": "pretzel", "shortname": ":pretzel:", "unicode": "1F968", "html": "&#x1F968;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "đŸĨ¯", "name": "bagel", "shortname": ":bagel:", "unicode": "1F96F", "html": "&#x1F96F;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "đŸĨž", "name": "pancakes", "shortname": ":pancakes:", "unicode": "1F95E", "html": "&#x1F95E;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "🧇", "name": "waffle", "shortname": ":waffle:", "unicode": "1F9C7", "html": "&#x1F9C7;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "đŸĨŠ", "name": "cut of meat", "shortname": ":cut_of_meat:", "unicode": "1F969", "html": "&#x1F969;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "đŸĨ“", "name": "bacon", "shortname": ":bacon:", "unicode": "1F953", "html": "&#x1F953;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "đŸĨĒ", "name": "sandwich", "shortname": ":sandwich:", "unicode": "1F96A", "html": "&#x1F96A;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "đŸĨ™", "name": "stuffed flatbread", "shortname": ":stuffed_flatbread:", "unicode": "1F959", "html": "&#x1F959;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "🧆", "name": "falafel", "shortname": ":falafel:", "unicode": "1F9C6", "html": "&#x1F9C6;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "đŸĨ˜", "name": "shallow pan of food", "shortname": ":shallow_pan_of_food:", "unicode": "1F958", "html": "&#x1F958;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "đŸĨŖ", "name": "bowl with spoon", "shortname": ":bowl_with_spoon:", "unicode": "1F963", "html": "&#x1F963;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "đŸĨ—", "name": "green salad", "shortname": ":green_salad:", "unicode": "1F957", "html": "&#x1F957;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "🧈", "name": "butter", "shortname": ":butter:", "unicode": "1F9C8", "html": "&#x1F9C8;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "🧂", "name": "salt", "shortname": ":salt:", "unicode": "1F9C2", "html": "&#x1F9C2;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "đŸĨĢ", "name": "canned food", "shortname": ":canned_food:", "unicode": "1F96B", "html": "&#x1F96B;", "category": "Food & Drink (food-prepared)", "order": ""},
+ {"emoji": "đŸĨŽ", "name": "moon cake", "shortname": ":moon_cake:", "unicode": "1F96E", "html": "&#x1F96E;", "category": "Food & Drink (food-asian)", "order": ""},
+ {"emoji": "đŸĨŸ", "name": "dumpling", "shortname": ":dumpling:", "unicode": "1F95F", "html": "&#x1F95F;", "category": "Food & Drink (food-asian)", "order": ""},
+ {"emoji": "đŸĨ ", "name": "fortune cookie", "shortname": ":fortune_cookie:", "unicode": "1F960", "html": "&#x1F960;", "category": "Food & Drink (food-asian)", "order": ""},
+ {"emoji": "đŸĨĄ", "name": "takeout box", "shortname": ":takeout_box:", "unicode": "1F961", "html": "&#x1F961;", "category": "Food & Drink (food-asian)", "order": ""},
+ {"emoji": "đŸĻž", "name": "lobster", "shortname": ":lobster:", "unicode": "1F99E", "html": "&#x1F99E;", "category": "Food & Drink (food-marine)", "order": ""},
+ {"emoji": "đŸĻ", "name": "shrimp", "shortname": ":shrimp:", "unicode": "1F990", "html": "&#x1F990;", "category": "Food & Drink (food-marine)", "order": ""},
+ {"emoji": "đŸĻ‘", "name": "squid", "shortname": ":squid:", "unicode": "1F991", "html": "&#x1F991;", "category": "Food & Drink (food-marine)", "order": ""},
+ {"emoji": "đŸĻĒ", "name": "oyster", "shortname": ":oyster:", "unicode": "1F9AA", "html": "&#x1F9AA;", "category": "Food & Drink (food-marine)", "order": ""},
+ {"emoji": "🧁", "name": "cupcake", "shortname": ":cupcake:", "unicode": "1F9C1", "html": "&#x1F9C1;", "category": "Food & Drink (food-sweet)", "order": ""},
+ {"emoji": "đŸĨ§", "name": "pie", "shortname": ":pie:", "unicode": "1F967", "html": "&#x1F967;", "category": "Food & Drink (food-sweet)", "order": ""},
+ {"emoji": "đŸĨ›", "name": "glass of milk", "shortname": ":glass_of_milk:", "unicode": "1F95B", "html": "&#x1F95B;", "category": "Food & Drink (drink)", "order": ""},
+ {"emoji": "đŸĨ‚", "name": "clinking glasses", "shortname": ":clinking_glasses:", "unicode": "1F942", "html": "&#x1F942;", "category": "Food & Drink (drink)", "order": ""},
+ {"emoji": "đŸĨƒ", "name": "tumbler glass", "shortname": ":tumbler_glass:", "unicode": "1F943", "html": "&#x1F943;", "category": "Food & Drink (drink)", "order": ""},
+ {"emoji": "đŸĨ¤", "name": "cup with straw", "shortname": ":cup_with_straw:", "unicode": "1F964", "html": "&#x1F964;", "category": "Food & Drink (drink)", "order": ""},
+ {"emoji": "🧃", "name": "beverage box", "shortname": ":beverage_box:", "unicode": "1F9C3", "html": "&#x1F9C3;", "category": "Food & Drink (drink)", "order": ""},
+ {"emoji": "🧉", "name": "mate", "shortname": ":mate:", "unicode": "1F9C9", "html": "&#x1F9C9;", "category": "Food & Drink (drink)", "order": ""},
+ {"emoji": "🧊", "name": "ice", "shortname": ":ice:", "unicode": "1F9CA", "html": "&#x1F9CA;", "category": "Food & Drink (drink)", "order": ""},
+ {"emoji": "đŸĨĸ", "name": "chopsticks", "shortname": ":chopsticks:", "unicode": "1F962", "html": "&#x1F962;", "category": "Food & Drink (dishware)", "order": ""},
+ {"emoji": "đŸŊī¸", "name": "fork and knife with plate", "shortname": ":fork_and_knife_with_plate:", "unicode": "1F37D FE0F", "html": "&#x1F37D;&#xFE0F;", "category": "Food & Drink (dishware)", "order": ""},
+ {"emoji": "đŸĨ„", "name": "spoon", "shortname": ":spoon:", "unicode": "1F944", "html": "&#x1F944;", "category": "Food & Drink (dishware)", "order": ""},
+ {"emoji": "đŸ—ēī¸", "name": "world map", "shortname": ":world_map:", "unicode": "1F5FA FE0F", "html": "&#x1F5FA;&#xFE0F;", "category": "Travel & Places (place-map)", "order": ""},
+ {"emoji": "🧭", "name": "compass", "shortname": ":compass:", "unicode": "1F9ED", "html": "&#x1F9ED;", "category": "Travel & Places (place-map)", "order": ""},
+ {"emoji": "đŸ”ī¸", "name": "snow-capped mountain", "shortname": ":snowcapped_mountain:", "unicode": "1F3D4 FE0F", "html": "&#x1F3D4;&#xFE0F;", "category": "Travel & Places (place-geographic)", "order": ""},
+ {"emoji": "â›°ī¸", "name": "mountain", "shortname": ":mountain:", "unicode": "26F0 FE0F", "html": "&#x26F0;&#xFE0F;", "category": "Travel & Places (place-geographic)", "order": ""},
+ {"emoji": "đŸ•ī¸", "name": "camping", "shortname": ":camping:", "unicode": "1F3D5 FE0F", "html": "&#x1F3D5;&#xFE0F;", "category": "Travel & Places (place-geographic)", "order": ""},
+ {"emoji": "đŸ–ī¸", "name": "beach with umbrella", "shortname": ":beach_with_umbrella:", "unicode": "1F3D6 FE0F", "html": "&#x1F3D6;&#xFE0F;", "category": "Travel & Places (place-geographic)", "order": ""},
+ {"emoji": "đŸœī¸", "name": "desert", "shortname": ":desert:", "unicode": "1F3DC FE0F", "html": "&#x1F3DC;&#xFE0F;", "category": "Travel & Places (place-geographic)", "order": ""},
+ {"emoji": "đŸī¸", "name": "desert island", "shortname": ":desert_island:", "unicode": "1F3DD FE0F", "html": "&#x1F3DD;&#xFE0F;", "category": "Travel & Places (place-geographic)", "order": ""},
+ {"emoji": "đŸžī¸", "name": "national park", "shortname": ":national_park:", "unicode": "1F3DE FE0F", "html": "&#x1F3DE;&#xFE0F;", "category": "Travel & Places (place-geographic)", "order": ""},
+ {"emoji": "đŸŸī¸", "name": "stadium", "shortname": ":stadium:", "unicode": "1F3DF FE0F", "html": "&#x1F3DF;&#xFE0F;", "category": "Travel & Places (place-building)", "order": ""},
+ {"emoji": "đŸ›ī¸", "name": "classical building", "shortname": ":classical_building:", "unicode": "1F3DB FE0F", "html": "&#x1F3DB;&#xFE0F;", "category": "Travel & Places (place-building)", "order": ""},
+ {"emoji": "đŸ—ī¸", "name": "building construction", "shortname": ":building_construction:", "unicode": "1F3D7 FE0F", "html": "&#x1F3D7;&#xFE0F;", "category": "Travel & Places (place-building)", "order": ""},
+ {"emoji": "🧱", "name": "brick", "shortname": ":brick:", "unicode": "1F9F1", "html": "&#x1F9F1;", "category": "Travel & Places (place-building)", "order": ""},
+ {"emoji": "đŸ˜ī¸", "name": "houses", "shortname": ":houses:", "unicode": "1F3D8 FE0F", "html": "&#x1F3D8;&#xFE0F;", "category": "Travel & Places (place-building)", "order": ""},
+ {"emoji": "đŸšī¸", "name": "derelict house", "shortname": ":derelict_house:", "unicode": "1F3DA FE0F", "html": "&#x1F3DA;&#xFE0F;", "category": "Travel & Places (place-building)", "order": ""},
+ {"emoji": "🛕", "name": "hindu temple", "shortname": ":hindu_temple:", "unicode": "1F6D5", "html": "&#x1F6D5;", "category": "Travel & Places (place-religious)", "order": ""},
+ {"emoji": "â›Šī¸", "name": "shinto shrine", "shortname": ":shinto_shrine:", "unicode": "26E9 FE0F", "html": "&#x26E9;&#xFE0F;", "category": "Travel & Places (place-religious)", "order": ""},
+ {"emoji": "đŸ™ī¸", "name": "cityscape", "shortname": ":cityscape:", "unicode": "1F3D9 FE0F", "html": "&#x1F3D9;&#xFE0F;", "category": "Travel & Places (place-other)", "order": ""},
+ {"emoji": "♨", "name": "hot springs", "shortname": ":hot_springs:", "unicode": "2668", "html": "&#x2668;", "category": "Travel & Places (place-other)", "order": ""},
+ {"emoji": "đŸŽī¸", "name": "racing car", "shortname": ":racing_car:", "unicode": "1F3CE FE0F", "html": "&#x1F3CE;&#xFE0F;", "category": "Travel & Places (transport-ground)", "order": ""},
+ {"emoji": "đŸī¸", "name": "motorcycle", "shortname": ":motorcycle:", "unicode": "1F3CD FE0F", "html": "&#x1F3CD;&#xFE0F;", "category": "Travel & Places (transport-ground)", "order": ""},
+ {"emoji": "đŸ›ĩ", "name": "motor scooter", "shortname": ":motor_scooter:", "unicode": "1F6F5", "html": "&#x1F6F5;", "category": "Travel & Places (transport-ground)", "order": ""},
+ {"emoji": "đŸĻŊ", "name": "manual wheelchair", "shortname": ":manual_wheelchair:", "unicode": "1F9BD", "html": "&#x1F9BD;", "category": "Travel & Places (transport-ground)", "order": ""},
+ {"emoji": "đŸĻŧ", "name": "motorized wheelchair", "shortname": ":motorized_wheelchair:", "unicode": "1F9BC", "html": "&#x1F9BC;", "category": "Travel & Places (transport-ground)", "order": ""},
+ {"emoji": "đŸ›ē", "name": "auto rickshaw", "shortname": ":auto_rickshaw:", "unicode": "1F6FA", "html": "&#x1F6FA;", "category": "Travel & Places (transport-ground)", "order": ""},
+ {"emoji": "🛴", "name": "kick scooter", "shortname": ":kick_scooter:", "unicode": "1F6F4", "html": "&#x1F6F4;", "category": "Travel & Places (transport-ground)", "order": ""},
+ {"emoji": "🛹", "name": "skateboard", "shortname": ":skateboard:", "unicode": "1F6F9", "html": "&#x1F6F9;", "category": "Travel & Places (transport-ground)", "order": ""},
+ {"emoji": "đŸ›Ŗī¸", "name": "motorway", "shortname": ":motorway:", "unicode": "1F6E3 FE0F", "html": "&#x1F6E3;&#xFE0F;", "category": "Travel & Places (transport-ground)", "order": ""},
+ {"emoji": "đŸ›¤ī¸", "name": "railway track", "shortname": ":railway_track:", "unicode": "1F6E4 FE0F", "html": "&#x1F6E4;&#xFE0F;", "category": "Travel & Places (transport-ground)", "order": ""},
+ {"emoji": "đŸ›ĸī¸", "name": "oil drum", "shortname": ":oil_drum:", "unicode": "1F6E2 FE0F", "html": "&#x1F6E2;&#xFE0F;", "category": "Travel & Places (transport-ground)", "order": ""},
+ {"emoji": "đŸ›ļ", "name": "canoe", "shortname": ":canoe:", "unicode": "1F6F6", "html": "&#x1F6F6;", "category": "Travel & Places (transport-water)", "order": ""},
+ {"emoji": "đŸ›ŗī¸", "name": "passenger ship", "shortname": ":passenger_ship:", "unicode": "1F6F3 FE0F", "html": "&#x1F6F3;&#xFE0F;", "category": "Travel & Places (transport-water)", "order": ""},
+ {"emoji": "â›´ī¸", "name": "ferry", "shortname": ":ferry:", "unicode": "26F4 FE0F", "html": "&#x26F4;&#xFE0F;", "category": "Travel & Places (transport-water)", "order": ""},
+ {"emoji": "đŸ›Ĩī¸", "name": "motor boat", "shortname": ":motor_boat:", "unicode": "1F6E5 FE0F", "html": "&#x1F6E5;&#xFE0F;", "category": "Travel & Places (transport-water)", "order": ""},
+ {"emoji": "✈", "name": "airplane", "shortname": ":airplane:", "unicode": "2708", "html": "&#x2708;", "category": "Travel & Places (transport-air)", "order": ""},
+ {"emoji": "đŸ›Šī¸", "name": "small airplane", "shortname": ":small_airplane:", "unicode": "1F6E9 FE0F", "html": "&#x1F6E9;&#xFE0F;", "category": "Travel & Places (transport-air)", "order": ""},
+ {"emoji": "đŸĒ‚", "name": "parachute", "shortname": ":parachute:", "unicode": "1FA82", "html": "&#x1FA82;", "category": "Travel & Places (transport-air)", "order": ""},
+ {"emoji": "đŸ›°ī¸", "name": "satellite", "shortname": ":satellite:", "unicode": "1F6F0 FE0F", "html": "&#x1F6F0;&#xFE0F;", "category": "Travel & Places (transport-air)", "order": ""},
+ {"emoji": "🛸", "name": "flying saucer", "shortname": ":flying_saucer:", "unicode": "1F6F8", "html": "&#x1F6F8;", "category": "Travel & Places (transport-air)", "order": ""},
+ {"emoji": "đŸ›Žī¸", "name": "bellhop bell", "shortname": ":bellhop_bell:", "unicode": "1F6CE FE0F", "html": "&#x1F6CE;&#xFE0F;", "category": "Travel & Places (hotel)", "order": ""},
+ {"emoji": "đŸ§ŗ", "name": "luggage", "shortname": ":luggage:", "unicode": "1F9F3", "html": "&#x1F9F3;", "category": "Travel & Places (hotel)", "order": ""},
+ {"emoji": "âąī¸", "name": "stopwatch", "shortname": ":stopwatch:", "unicode": "23F1 FE0F", "html": "&#x23F1;&#xFE0F;", "category": "Travel & Places (time)", "order": ""},
+ {"emoji": "â˛ī¸", "name": "timer clock", "shortname": ":timer_clock:", "unicode": "23F2 FE0F", "html": "&#x23F2;&#xFE0F;", "category": "Travel & Places (time)", "order": ""},
+ {"emoji": "đŸ•°ī¸", "name": "mantelpiece clock", "shortname": ":mantelpiece_clock:", "unicode": "1F570 FE0F", "html": "&#x1F570;&#xFE0F;", "category": "Travel & Places (time)", "order": ""},
+ {"emoji": "đŸŒĄī¸", "name": "thermometer", "shortname": ":thermometer:", "unicode": "1F321 FE0F", "html": "&#x1F321;&#xFE0F;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "☀", "name": "sun", "shortname": ":sun:", "unicode": "2600", "html": "&#x2600;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "đŸĒ", "name": "ringed planet", "shortname": ":ringed_planet:", "unicode": "1FA90", "html": "&#x1FA90;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "â˜ī¸", "name": "cloud", "shortname": ":cloud:", "unicode": "2601 FE0F", "html": "&#x2601;&#xFE0F;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "â›ˆī¸", "name": "cloud with lightning and rain", "shortname": ":cloud_with_lightning_and_rain:", "unicode": "26C8 FE0F", "html": "&#x26C8;&#xFE0F;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "đŸŒ¤ī¸", "name": "sun behind small cloud", "shortname": ":sun_behind_small_cloud:", "unicode": "1F324 FE0F", "html": "&#x1F324;&#xFE0F;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "đŸŒĨī¸", "name": "sun behind large cloud", "shortname": ":sun_behind_large_cloud:", "unicode": "1F325 FE0F", "html": "&#x1F325;&#xFE0F;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "đŸŒĻī¸", "name": "sun behind rain cloud", "shortname": ":sun_behind_rain_cloud:", "unicode": "1F326 FE0F", "html": "&#x1F326;&#xFE0F;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "đŸŒ§ī¸", "name": "cloud with rain", "shortname": ":cloud_with_rain:", "unicode": "1F327 FE0F", "html": "&#x1F327;&#xFE0F;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "đŸŒ¨ī¸", "name": "cloud with snow", "shortname": ":cloud_with_snow:", "unicode": "1F328 FE0F", "html": "&#x1F328;&#xFE0F;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "đŸŒŠī¸", "name": "cloud with lightning", "shortname": ":cloud_with_lightning:", "unicode": "1F329 FE0F", "html": "&#x1F329;&#xFE0F;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "đŸŒĒī¸", "name": "tornado", "shortname": ":tornado:", "unicode": "1F32A FE0F", "html": "&#x1F32A;&#xFE0F;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "đŸŒĢī¸", "name": "fog", "shortname": ":fog:", "unicode": "1F32B FE0F", "html": "&#x1F32B;&#xFE0F;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "đŸŒŦī¸", "name": "wind face", "shortname": ":wind_face:", "unicode": "1F32C FE0F", "html": "&#x1F32C;&#xFE0F;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "☂", "name": "umbrella", "shortname": ":umbrella:", "unicode": "2602", "html": "&#x2602;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "â›ąī¸", "name": "umbrella on ground", "shortname": ":umbrella_on_ground:", "unicode": "26F1 FE0F", "html": "&#x26F1;&#xFE0F;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "❄", "name": "snowflake", "shortname": ":snowflake:", "unicode": "2744", "html": "&#x2744;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "☃", "name": "snowman", "shortname": ":snowman:", "unicode": "2603", "html": "&#x2603;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "â˜„ī¸", "name": "comet", "shortname": ":comet:", "unicode": "2604 FE0F", "html": "&#x2604;&#xFE0F;", "category": "Travel & Places (sky & weather)", "order": ""},
+ {"emoji": "🧨", "name": "firecracker", "shortname": ":firecracker:", "unicode": "1F9E8", "html": "&#x1F9E8;", "category": "Activities (event)", "order": ""},
+ {"emoji": "🧧", "name": "red envelope", "shortname": ":red_envelope:", "unicode": "1F9E7", "html": "&#x1F9E7;", "category": "Activities (event)", "order": ""},
+ {"emoji": "đŸŽ—ī¸", "name": "reminder ribbon", "shortname": ":reminder_ribbon:", "unicode": "1F397 FE0F", "html": "&#x1F397;&#xFE0F;", "category": "Activities (event)", "order": ""},
+ {"emoji": "đŸŽŸī¸", "name": "admission tickets", "shortname": ":admission_tickets:", "unicode": "1F39F FE0F", "html": "&#x1F39F;&#xFE0F;", "category": "Activities (event)", "order": ""},
+ {"emoji": "đŸŽ–ī¸", "name": "military medal", "shortname": ":military_medal:", "unicode": "1F396 FE0F", "html": "&#x1F396;&#xFE0F;", "category": "Activities (award-medal)", "order": ""},
+ {"emoji": "đŸĨ‡", "name": "1st place medal", "shortname": ":1st_place_medal:", "unicode": "1F947", "html": "&#x1F947;", "category": "Activities (award-medal)", "order": ""},
+ {"emoji": "đŸĨˆ", "name": "2nd place medal", "shortname": ":2nd_place_medal:", "unicode": "1F948", "html": "&#x1F948;", "category": "Activities (award-medal)", "order": ""},
+ {"emoji": "đŸĨ‰", "name": "3rd place medal", "shortname": ":3rd_place_medal:", "unicode": "1F949", "html": "&#x1F949;", "category": "Activities (award-medal)", "order": ""},
+ {"emoji": "⚾", "name": "baseball", "shortname": ":baseball:", "unicode": "26BE", "html": "&#x26BE;", "category": "Activities (sport)", "order": ""},
+ {"emoji": "đŸĨŽ", "name": "softball", "shortname": ":softball:", "unicode": "1F94E", "html": "&#x1F94E;", "category": "Activities (sport)", "order": ""},
+ {"emoji": "đŸĨ", "name": "flying disc", "shortname": ":flying_disc:", "unicode": "1F94F", "html": "&#x1F94F;", "category": "Activities (sport)", "order": ""},
+ {"emoji": "đŸĨ", "name": "lacrosse", "shortname": ":lacrosse:", "unicode": "1F94D", "html": "&#x1F94D;", "category": "Activities (sport)", "order": ""},
+ {"emoji": "đŸĨŠ", "name": "boxing glove", "shortname": ":boxing_glove:", "unicode": "1F94A", "html": "&#x1F94A;", "category": "Activities (sport)", "order": ""},
+ {"emoji": "đŸĨ‹", "name": "martial arts uniform", "shortname": ":martial_arts_uniform:", "unicode": "1F94B", "html": "&#x1F94B;", "category": "Activities (sport)", "order": ""},
+ {"emoji": "đŸĨ…", "name": "goal net", "shortname": ":goal_net:", "unicode": "1F945", "html": "&#x1F945;", "category": "Activities (sport)", "order": ""},
+ {"emoji": "â›¸ī¸", "name": "ice skate", "shortname": ":ice_skate:", "unicode": "26F8 FE0F", "html": "&#x26F8;&#xFE0F;", "category": "Activities (sport)", "order": ""},
+ {"emoji": "đŸ¤ŋ", "name": "diving mask", "shortname": ":diving_mask:", "unicode": "1F93F", "html": "&#x1F93F;", "category": "Activities (sport)", "order": ""},
+ {"emoji": "🛷", "name": "sled", "shortname": ":sled:", "unicode": "1F6F7", "html": "&#x1F6F7;", "category": "Activities (sport)", "order": ""},
+ {"emoji": "đŸĨŒ", "name": "curling stone", "shortname": ":curling_stone:", "unicode": "1F94C", "html": "&#x1F94C;", "category": "Activities (sport)", "order": ""},
+ {"emoji": "đŸĒ€", "name": "yo-yo", "shortname": ":yoyo:", "unicode": "1FA80", "html": "&#x1FA80;", "category": "Activities (game)", "order": ""},
+ {"emoji": "đŸĒ", "name": "kite", "shortname": ":kite:", "unicode": "1FA81", "html": "&#x1FA81;", "category": "Activities (game)", "order": ""},
+ {"emoji": "đŸ§ŋ", "name": "nazar amulet", "shortname": ":nazar_amulet:", "unicode": "1F9FF", "html": "&#x1F9FF;", "category": "Activities (game)", "order": ""},
+ {"emoji": "đŸ•šī¸", "name": "joystick", "shortname": ":joystick:", "unicode": "1F579 FE0F", "html": "&#x1F579;&#xFE0F;", "category": "Activities (game)", "order": ""},
+ {"emoji": "🧩", "name": "puzzle piece", "shortname": ":puzzle_piece:", "unicode": "1F9E9", "html": "&#x1F9E9;", "category": "Activities (game)", "order": ""},
+ {"emoji": "🧸", "name": "teddy bear", "shortname": ":teddy_bear:", "unicode": "1F9F8", "html": "&#x1F9F8;", "category": "Activities (game)", "order": ""},
+ {"emoji": "â™Ÿī¸", "name": "chess pawn", "shortname": ":chess_pawn:", "unicode": "265F FE0F", "html": "&#x265F;&#xFE0F;", "category": "Activities (game)", "order": ""},
+ {"emoji": "♟", "name": "chess pawn", "shortname": ":chess_pawn:", "unicode": "265F", "html": "&#x265F;", "category": "Activities (game)", "order": ""},
+ {"emoji": "đŸ–ŧī¸", "name": "framed picture", "shortname": ":framed_picture:", "unicode": "1F5BC FE0F", "html": "&#x1F5BC;&#xFE0F;", "category": "Activities (arts & crafts)", "order": ""},
+ {"emoji": "đŸ§ĩ", "name": "thread", "shortname": ":thread:", "unicode": "1F9F5", "html": "&#x1F9F5;", "category": "Activities (arts & crafts)", "order": ""},
+ {"emoji": "đŸ§ļ", "name": "yarn", "shortname": ":yarn:", "unicode": "1F9F6", "html": "&#x1F9F6;", "category": "Activities (arts & crafts)", "order": ""},
+ {"emoji": "đŸ•ļī¸", "name": "sunglasses", "shortname": ":sunglasses:", "unicode": "1F576 FE0F", "html": "&#x1F576;&#xFE0F;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "đŸĨŊ", "name": "goggles", "shortname": ":goggles:", "unicode": "1F97D", "html": "&#x1F97D;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "đŸĨŧ", "name": "lab coat", "shortname": ":lab_coat:", "unicode": "1F97C", "html": "&#x1F97C;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "đŸĻē", "name": "safety vest", "shortname": ":safety_vest:", "unicode": "1F9BA", "html": "&#x1F9BA;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "đŸ§Ŗ", "name": "scarf", "shortname": ":scarf:", "unicode": "1F9E3", "html": "&#x1F9E3;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "🧤", "name": "gloves", "shortname": ":gloves:", "unicode": "1F9E4", "html": "&#x1F9E4;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "đŸ§Ĩ", "name": "coat", "shortname": ":coat:", "unicode": "1F9E5", "html": "&#x1F9E5;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "đŸ§Ļ", "name": "socks", "shortname": ":socks:", "unicode": "1F9E6", "html": "&#x1F9E6;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "đŸĨģ", "name": "sari", "shortname": ":sari:", "unicode": "1F97B", "html": "&#x1F97B;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "🩱", "name": "one-piece swimsuit", "shortname": ":onepiece_swimsuit:", "unicode": "1FA71", "html": "&#x1FA71;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "🩲", "name": "briefs", "shortname": ":briefs:", "unicode": "1FA72", "html": "&#x1FA72;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "đŸŠŗ", "name": "shorts", "shortname": ":shorts:", "unicode": "1FA73", "html": "&#x1FA73;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "đŸ›ī¸", "name": "shopping bags", "shortname": ":shopping_bags:", "unicode": "1F6CD FE0F", "html": "&#x1F6CD;&#xFE0F;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "đŸĨž", "name": "hiking boot", "shortname": ":hiking_boot:", "unicode": "1F97E", "html": "&#x1F97E;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "đŸĨŋ", "name": "flat shoe", "shortname": ":flat_shoe:", "unicode": "1F97F", "html": "&#x1F97F;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "🩰", "name": "ballet shoes", "shortname": ":ballet_shoes:", "unicode": "1FA70", "html": "&#x1FA70;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "đŸ§ĸ", "name": "billed cap", "shortname": ":billed_cap:", "unicode": "1F9E2", "html": "&#x1F9E2;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "â›‘ī¸", "name": "rescue worker’s helmet", "shortname": ":rescue_worker’s_helmet:", "unicode": "26D1 FE0F", "html": "&#x26D1;&#xFE0F;", "category": "Objects (clothing)", "order": ""},
+ {"emoji": "đŸŽ™ī¸", "name": "studio microphone", "shortname": ":studio_microphone:", "unicode": "1F399 FE0F", "html": "&#x1F399;&#xFE0F;", "category": "Objects (music)", "order": ""},
+ {"emoji": "đŸŽšī¸", "name": "level slider", "shortname": ":level_slider:", "unicode": "1F39A FE0F", "html": "&#x1F39A;&#xFE0F;", "category": "Objects (music)", "order": ""},
+ {"emoji": "đŸŽ›ī¸", "name": "control knobs", "shortname": ":control_knobs:", "unicode": "1F39B FE0F", "html": "&#x1F39B;&#xFE0F;", "category": "Objects (music)", "order": ""},
+ {"emoji": "đŸĒ•", "name": "banjo", "shortname": ":banjo:", "unicode": "1FA95", "html": "&#x1FA95;", "category": "Objects (musical-instrument)", "order": ""},
+ {"emoji": "☎", "name": "telephone", "shortname": ":telephone:", "unicode": "260E", "html": "&#x260E;", "category": "Objects (phone)", "order": ""},
+ {"emoji": "đŸ–Ĩī¸", "name": "desktop computer", "shortname": ":desktop_computer:", "unicode": "1F5A5 FE0F", "html": "&#x1F5A5;&#xFE0F;", "category": "Objects (computer)", "order": ""},
+ {"emoji": "đŸ–¨ī¸", "name": "printer", "shortname": ":printer:", "unicode": "1F5A8 FE0F", "html": "&#x1F5A8;&#xFE0F;", "category": "Objects (computer)", "order": ""},
+ {"emoji": "âŒ¨ī¸", "name": "keyboard", "shortname": ":keyboard:", "unicode": "2328 FE0F", "html": "&#x2328;&#xFE0F;", "category": "Objects (computer)", "order": ""},
+ {"emoji": "đŸ–ąī¸", "name": "computer mouse", "shortname": ":computer_mouse:", "unicode": "1F5B1 FE0F", "html": "&#x1F5B1;&#xFE0F;", "category": "Objects (computer)", "order": ""},
+ {"emoji": "đŸ–˛ī¸", "name": "trackball", "shortname": ":trackball:", "unicode": "1F5B2 FE0F", "html": "&#x1F5B2;&#xFE0F;", "category": "Objects (computer)", "order": ""},
+ {"emoji": "🧮", "name": "abacus", "shortname": ":abacus:", "unicode": "1F9EE", "html": "&#x1F9EE;", "category": "Objects (computer)", "order": ""},
+ {"emoji": "đŸŽžī¸", "name": "film frames", "shortname": ":film_frames:", "unicode": "1F39E FE0F", "html": "&#x1F39E;&#xFE0F;", "category": "Objects (light & video)", "order": ""},
+ {"emoji": "đŸ“Ŋī¸", "name": "film projector", "shortname": ":film_projector:", "unicode": "1F4FD FE0F", "html": "&#x1F4FD;&#xFE0F;", "category": "Objects (light & video)", "order": ""},
+ {"emoji": "đŸ•¯ī¸", "name": "candle", "shortname": ":candle:", "unicode": "1F56F FE0F", "html": "&#x1F56F;&#xFE0F;", "category": "Objects (light & video)", "order": ""},
+ {"emoji": "đŸĒ”", "name": "diya lamp", "shortname": ":diya_lamp:", "unicode": "1FA94", "html": "&#x1FA94;", "category": "Objects (light & video)", "order": ""},
+ {"emoji": "đŸ—žī¸", "name": "rolled-up newspaper", "shortname": ":rolledup_newspaper:", "unicode": "1F5DE FE0F", "html": "&#x1F5DE;&#xFE0F;", "category": "Objects (book-paper)", "order": ""},
+ {"emoji": "đŸˇī¸", "name": "label", "shortname": ":label:", "unicode": "1F3F7 FE0F", "html": "&#x1F3F7;&#xFE0F;", "category": "Objects (book-paper)", "order": ""},
+ {"emoji": "🧾", "name": "receipt", "shortname": ":receipt:", "unicode": "1F9FE", "html": "&#x1F9FE;", "category": "Objects (money)", "order": ""},
+ {"emoji": "✉", "name": "envelope", "shortname": ":envelope:", "unicode": "2709", "html": "&#x2709;", "category": "Objects (mail)", "order": ""},
+ {"emoji": "đŸ—ŗī¸", "name": "ballot box with ballot", "shortname": ":ballot_box_with_ballot:", "unicode": "1F5F3 FE0F", "html": "&#x1F5F3;&#xFE0F;", "category": "Objects (mail)", "order": ""},
+ {"emoji": "âœī¸", "name": "pencil", "shortname": ":pencil:", "unicode": "270F FE0F", "html": "&#x270F;&#xFE0F;", "category": "Objects (writing)", "order": ""},
+ {"emoji": "âœ’ī¸", "name": "black nib", "shortname": ":black_nib:", "unicode": "2712 FE0F", "html": "&#x2712;&#xFE0F;", "category": "Objects (writing)", "order": ""},
+ {"emoji": "đŸ–‹ī¸", "name": "fountain pen", "shortname": ":fountain_pen:", "unicode": "1F58B FE0F", "html": "&#x1F58B;&#xFE0F;", "category": "Objects (writing)", "order": ""},
+ {"emoji": "đŸ–Šī¸", "name": "pen", "shortname": ":pen:", "unicode": "1F58A FE0F", "html": "&#x1F58A;&#xFE0F;", "category": "Objects (writing)", "order": ""},
+ {"emoji": "đŸ–Œī¸", "name": "paintbrush", "shortname": ":paintbrush:", "unicode": "1F58C FE0F", "html": "&#x1F58C;&#xFE0F;", "category": "Objects (writing)", "order": ""},
+ {"emoji": "đŸ–ī¸", "name": "crayon", "shortname": ":crayon:", "unicode": "1F58D FE0F", "html": "&#x1F58D;&#xFE0F;", "category": "Objects (writing)", "order": ""},
+ {"emoji": "đŸ—‚ī¸", "name": "card index dividers", "shortname": ":card_index_dividers:", "unicode": "1F5C2 FE0F", "html": "&#x1F5C2;&#xFE0F;", "category": "Objects (office)", "order": ""},
+ {"emoji": "đŸ—’ī¸", "name": "spiral notepad", "shortname": ":spiral_notepad:", "unicode": "1F5D2 FE0F", "html": "&#x1F5D2;&#xFE0F;", "category": "Objects (office)", "order": ""},
+ {"emoji": "đŸ—“ī¸", "name": "spiral calendar", "shortname": ":spiral_calendar:", "unicode": "1F5D3 FE0F", "html": "&#x1F5D3;&#xFE0F;", "category": "Objects (office)", "order": ""},
+ {"emoji": "đŸ–‡ī¸", "name": "linked paperclips", "shortname": ":linked_paperclips:", "unicode": "1F587 FE0F", "html": "&#x1F587;&#xFE0F;", "category": "Objects (office)", "order": ""},
+ {"emoji": "✂", "name": "scissors", "shortname": ":scissors:", "unicode": "2702", "html": "&#x2702;", "category": "Objects (office)", "order": ""},
+ {"emoji": "đŸ—ƒī¸", "name": "card file box", "shortname": ":card_file_box:", "unicode": "1F5C3 FE0F", "html": "&#x1F5C3;&#xFE0F;", "category": "Objects (office)", "order": ""},
+ {"emoji": "đŸ—„ī¸", "name": "file cabinet", "shortname": ":file_cabinet:", "unicode": "1F5C4 FE0F", "html": "&#x1F5C4;&#xFE0F;", "category": "Objects (office)", "order": ""},
+ {"emoji": "đŸ—‘ī¸", "name": "wastebasket", "shortname": ":wastebasket:", "unicode": "1F5D1 FE0F", "html": "&#x1F5D1;&#xFE0F;", "category": "Objects (office)", "order": ""},
+ {"emoji": "đŸ—ī¸", "name": "old key", "shortname": ":old_key:", "unicode": "1F5DD FE0F", "html": "&#x1F5DD;&#xFE0F;", "category": "Objects (lock)", "order": ""},
+ {"emoji": "đŸĒ“", "name": "axe", "shortname": ":axe:", "unicode": "1FA93", "html": "&#x1FA93;", "category": "Objects (tool)", "order": ""},
+ {"emoji": "â›ī¸", "name": "pick", "shortname": ":pick:", "unicode": "26CF FE0F", "html": "&#x26CF;&#xFE0F;", "category": "Objects (tool)", "order": ""},
+ {"emoji": "âš’ī¸", "name": "hammer and pick", "shortname": ":hammer_and_pick:", "unicode": "2692 FE0F", "html": "&#x2692;&#xFE0F;", "category": "Objects (tool)", "order": ""},
+ {"emoji": "đŸ› ī¸", "name": "hammer and wrench", "shortname": ":hammer_and_wrench:", "unicode": "1F6E0 FE0F", "html": "&#x1F6E0;&#xFE0F;", "category": "Objects (tool)", "order": ""},
+ {"emoji": "đŸ—Ąī¸", "name": "dagger", "shortname": ":dagger:", "unicode": "1F5E1 FE0F", "html": "&#x1F5E1;&#xFE0F;", "category": "Objects (tool)", "order": ""},
+ {"emoji": "âš”ī¸", "name": "crossed swords", "shortname": ":crossed_swords:", "unicode": "2694 FE0F", "html": "&#x2694;&#xFE0F;", "category": "Objects (tool)", "order": ""},
+ {"emoji": "đŸ›Ąī¸", "name": "shield", "shortname": ":shield:", "unicode": "1F6E1 FE0F", "html": "&#x1F6E1;&#xFE0F;", "category": "Objects (tool)", "order": ""},
+ {"emoji": "âš™ī¸", "name": "gear", "shortname": ":gear:", "unicode": "2699 FE0F", "html": "&#x2699;&#xFE0F;", "category": "Objects (tool)", "order": ""},
+ {"emoji": "đŸ—œī¸", "name": "clamp", "shortname": ":clamp:", "unicode": "1F5DC FE0F", "html": "&#x1F5DC;&#xFE0F;", "category": "Objects (tool)", "order": ""},
+ {"emoji": "âš–ī¸", "name": "balance scale", "shortname": ":balance_scale:", "unicode": "2696 FE0F", "html": "&#x2696;&#xFE0F;", "category": "Objects (tool)", "order": ""},
+ {"emoji": "đŸĻ¯", "name": "probing cane", "shortname": ":probing_cane:", "unicode": "1F9AF", "html": "&#x1F9AF;", "category": "Objects (tool)", "order": ""},
+ {"emoji": "â›“ī¸", "name": "chains", "shortname": ":chains:", "unicode": "26D3 FE0F", "html": "&#x26D3;&#xFE0F;", "category": "Objects (tool)", "order": ""},
+ {"emoji": "🧰", "name": "toolbox", "shortname": ":toolbox:", "unicode": "1F9F0", "html": "&#x1F9F0;", "category": "Objects (tool)", "order": ""},
+ {"emoji": "🧲", "name": "magnet", "shortname": ":magnet:", "unicode": "1F9F2", "html": "&#x1F9F2;", "category": "Objects (tool)", "order": ""},
+ {"emoji": "âš—ī¸", "name": "alembic", "shortname": ":alembic:", "unicode": "2697 FE0F", "html": "&#x2697;&#xFE0F;", "category": "Objects (science)", "order": ""},
+ {"emoji": "đŸ§Ē", "name": "test tube", "shortname": ":test_tube:", "unicode": "1F9EA", "html": "&#x1F9EA;", "category": "Objects (science)", "order": ""},
+ {"emoji": "đŸ§Ģ", "name": "petri dish", "shortname": ":petri_dish:", "unicode": "1F9EB", "html": "&#x1F9EB;", "category": "Objects (science)", "order": ""},
+ {"emoji": "đŸ§Ŧ", "name": "dna", "shortname": ":dna:", "unicode": "1F9EC", "html": "&#x1F9EC;", "category": "Objects (science)", "order": ""},
+ {"emoji": "🩸", "name": "drop of blood", "shortname": ":drop_of_blood:", "unicode": "1FA78", "html": "&#x1FA78;", "category": "Objects (medical)", "order": ""},
+ {"emoji": "🩹", "name": "adhesive bandage", "shortname": ":adhesive_bandage:", "unicode": "1FA79", "html": "&#x1FA79;", "category": "Objects (medical)", "order": ""},
+ {"emoji": "đŸŠē", "name": "stethoscope", "shortname": ":stethoscope:", "unicode": "1FA7A", "html": "&#x1FA7A;", "category": "Objects (medical)", "order": ""},
+ {"emoji": "đŸ›ī¸", "name": "bed", "shortname": ":bed:", "unicode": "1F6CF FE0F", "html": "&#x1F6CF;&#xFE0F;", "category": "Objects (household)", "order": ""},
+ {"emoji": "đŸ›‹ī¸", "name": "couch and lamp", "shortname": ":couch_and_lamp:", "unicode": "1F6CB FE0F", "html": "&#x1F6CB;&#xFE0F;", "category": "Objects (household)", "order": ""},
+ {"emoji": "đŸĒ‘", "name": "chair", "shortname": ":chair:", "unicode": "1FA91", "html": "&#x1FA91;", "category": "Objects (household)", "order": ""},
+ {"emoji": "đŸĒ’", "name": "razor", "shortname": ":razor:", "unicode": "1FA92", "html": "&#x1FA92;", "category": "Objects (household)", "order": ""},
+ {"emoji": "🧴", "name": "lotion bottle", "shortname": ":lotion_bottle:", "unicode": "1F9F4", "html": "&#x1F9F4;", "category": "Objects (household)", "order": ""},
+ {"emoji": "🧷", "name": "safety pin", "shortname": ":safety_pin:", "unicode": "1F9F7", "html": "&#x1F9F7;", "category": "Objects (household)", "order": ""},
+ {"emoji": "🧹", "name": "broom", "shortname": ":broom:", "unicode": "1F9F9", "html": "&#x1F9F9;", "category": "Objects (household)", "order": ""},
+ {"emoji": "đŸ§ē", "name": "basket", "shortname": ":basket:", "unicode": "1F9FA", "html": "&#x1F9FA;", "category": "Objects (household)", "order": ""},
+ {"emoji": "đŸ§ģ", "name": "roll of paper", "shortname": ":roll_of_paper:", "unicode": "1F9FB", "html": "&#x1F9FB;", "category": "Objects (household)", "order": ""},
+ {"emoji": "đŸ§ŧ", "name": "soap", "shortname": ":soap:", "unicode": "1F9FC", "html": "&#x1F9FC;", "category": "Objects (household)", "order": ""},
+ {"emoji": "đŸ§Ŋ", "name": "sponge", "shortname": ":sponge:", "unicode": "1F9FD", "html": "&#x1F9FD;", "category": "Objects (household)", "order": ""},
+ {"emoji": "đŸ§¯", "name": "fire extinguisher", "shortname": ":fire_extinguisher:", "unicode": "1F9EF", "html": "&#x1F9EF;", "category": "Objects (household)", "order": ""},
+ {"emoji": "🛒", "name": "shopping cart", "shortname": ":shopping_cart:", "unicode": "1F6D2", "html": "&#x1F6D2;", "category": "Objects (household)", "order": ""},
+ {"emoji": "âš°ī¸", "name": "coffin", "shortname": ":coffin:", "unicode": "26B0 FE0F", "html": "&#x26B0;&#xFE0F;", "category": "Objects (other-object)", "order": ""},
+ {"emoji": "âšąī¸", "name": "funeral urn", "shortname": ":funeral_urn:", "unicode": "26B1 FE0F", "html": "&#x26B1;&#xFE0F;", "category": "Objects (other-object)", "order": ""},
+ {"emoji": "⚠", "name": "warning", "shortname": ":warning:", "unicode": "26A0", "html": "&#x26A0;", "category": "Symbols (warning)", "order": ""},
+ {"emoji": "â˜ĸī¸", "name": "radioactive", "shortname": ":radioactive:", "unicode": "2622 FE0F", "html": "&#x2622;&#xFE0F;", "category": "Symbols (warning)", "order": ""},
+ {"emoji": "â˜Ŗī¸", "name": "biohazard", "shortname": ":biohazard:", "unicode": "2623 FE0F", "html": "&#x2623;&#xFE0F;", "category": "Symbols (warning)", "order": ""},
+ {"emoji": "âŦ†", "name": "up arrow", "shortname": ":up_arrow:", "unicode": "2B06", "html": "&#x2B06;", "category": "Symbols (arrow)", "order": ""},
+ {"emoji": "↗", "name": "up-right arrow", "shortname": ":upright_arrow:", "unicode": "2197", "html": "&#x2197;", "category": "Symbols (arrow)", "order": ""},
+ {"emoji": "âžĄī¸", "name": "right arrow", "shortname": ":right_arrow:", "unicode": "27A1 FE0F", "html": "&#x27A1;&#xFE0F;", "category": "Symbols (arrow)", "order": ""},
+ {"emoji": "↘", "name": "down-right arrow", "shortname": ":downright_arrow:", "unicode": "2198", "html": "&#x2198;", "category": "Symbols (arrow)", "order": ""},
+ {"emoji": "âŦ‡", "name": "down arrow", "shortname": ":down_arrow:", "unicode": "2B07", "html": "&#x2B07;", "category": "Symbols (arrow)", "order": ""},
+ {"emoji": "↙", "name": "down-left arrow", "shortname": ":downleft_arrow:", "unicode": "2199", "html": "&#x2199;", "category": "Symbols (arrow)", "order": ""},
+ {"emoji": "âŦ…", "name": "left arrow", "shortname": ":left_arrow:", "unicode": "2B05", "html": "&#x2B05;", "category": "Symbols (arrow)", "order": ""},
+ {"emoji": "â†–ī¸", "name": "up-left arrow", "shortname": ":upleft_arrow:", "unicode": "2196 FE0F", "html": "&#x2196;&#xFE0F;", "category": "Symbols (arrow)", "order": ""},
+ {"emoji": "â†•ī¸", "name": "up-down arrow", "shortname": ":updown_arrow:", "unicode": "2195 FE0F", "html": "&#x2195;&#xFE0F;", "category": "Symbols (arrow)", "order": ""},
+ {"emoji": "↩", "name": "right arrow curving left", "shortname": ":right_arrow_curving_left:", "unicode": "21A9", "html": "&#x21A9;", "category": "Symbols (arrow)", "order": ""},
+ {"emoji": "â†Ē", "name": "left arrow curving right", "shortname": ":left_arrow_curving_right:", "unicode": "21AA", "html": "&#x21AA;", "category": "Symbols (arrow)", "order": ""},
+ {"emoji": "⤴", "name": "right arrow curving up", "shortname": ":right_arrow_curving_up:", "unicode": "2934", "html": "&#x2934;", "category": "Symbols (arrow)", "order": ""},
+ {"emoji": "â¤ĩ", "name": "right arrow curving down", "shortname": ":right_arrow_curving_down:", "unicode": "2935", "html": "&#x2935;", "category": "Symbols (arrow)", "order": ""},
+ {"emoji": "âš›ī¸", "name": "atom symbol", "shortname": ":atom_symbol:", "unicode": "269B FE0F", "html": "&#x269B;&#xFE0F;", "category": "Symbols (religion)", "order": ""},
+ {"emoji": "đŸ•‰ī¸", "name": "om", "shortname": ":om:", "unicode": "1F549 FE0F", "html": "&#x1F549;&#xFE0F;", "category": "Symbols (religion)", "order": ""},
+ {"emoji": "✡", "name": "star of David", "shortname": ":star_of_David:", "unicode": "2721", "html": "&#x2721;", "category": "Symbols (religion)", "order": ""},
+ {"emoji": "â˜¸ī¸", "name": "wheel of dharma", "shortname": ":wheel_of_dharma:", "unicode": "2638 FE0F", "html": "&#x2638;&#xFE0F;", "category": "Symbols (religion)", "order": ""},
+ {"emoji": "â˜¯ī¸", "name": "yin yang", "shortname": ":yin_yang:", "unicode": "262F FE0F", "html": "&#x262F;&#xFE0F;", "category": "Symbols (religion)", "order": ""},
+ {"emoji": "✝", "name": "latin cross", "shortname": ":latin_cross:", "unicode": "271D", "html": "&#x271D;", "category": "Symbols (religion)", "order": ""},
+ {"emoji": "â˜Ļī¸", "name": "orthodox cross", "shortname": ":orthodox_cross:", "unicode": "2626 FE0F", "html": "&#x2626;&#xFE0F;", "category": "Symbols (religion)", "order": ""},
+ {"emoji": "â˜Ēī¸", "name": "star and crescent", "shortname": ":star_and_crescent:", "unicode": "262A FE0F", "html": "&#x262A;&#xFE0F;", "category": "Symbols (religion)", "order": ""},
+ {"emoji": "â˜Žī¸", "name": "peace symbol", "shortname": ":peace_symbol:", "unicode": "262E FE0F", "html": "&#x262E;&#xFE0F;", "category": "Symbols (religion)", "order": ""},
+ {"emoji": "â–ļ", "name": "play button", "shortname": ":play_button:", "unicode": "25B6", "html": "&#x25B6;", "category": "Symbols (av-symbol)", "order": ""},
+ {"emoji": "â­ī¸", "name": "next track button", "shortname": ":next_track_button:", "unicode": "23ED FE0F", "html": "&#x23ED;&#xFE0F;", "category": "Symbols (av-symbol)", "order": ""},
+ {"emoji": "â¯ī¸", "name": "play or pause button", "shortname": ":play_or_pause_button:", "unicode": "23EF FE0F", "html": "&#x23EF;&#xFE0F;", "category": "Symbols (av-symbol)", "order": ""},
+ {"emoji": "◀", "name": "reverse button", "shortname": ":reverse_button:", "unicode": "25C0", "html": "&#x25C0;", "category": "Symbols (av-symbol)", "order": ""},
+ {"emoji": "âŽī¸", "name": "last track button", "shortname": ":last_track_button:", "unicode": "23EE FE0F", "html": "&#x23EE;&#xFE0F;", "category": "Symbols (av-symbol)", "order": ""},
+ {"emoji": "â¸ī¸", "name": "pause button", "shortname": ":pause_button:", "unicode": "23F8 FE0F", "html": "&#x23F8;&#xFE0F;", "category": "Symbols (av-symbol)", "order": ""},
+ {"emoji": "âšī¸", "name": "stop button", "shortname": ":stop_button:", "unicode": "23F9 FE0F", "html": "&#x23F9;&#xFE0F;", "category": "Symbols (av-symbol)", "order": ""},
+ {"emoji": "âēī¸", "name": "record button", "shortname": ":record_button:", "unicode": "23FA FE0F", "html": "&#x23FA;&#xFE0F;", "category": "Symbols (av-symbol)", "order": ""},
+ {"emoji": "âī¸", "name": "eject button", "shortname": ":eject_button:", "unicode": "23CF FE0F", "html": "&#x23CF;&#xFE0F;", "category": "Symbols (av-symbol)", "order": ""},
+ {"emoji": "⏏", "name": "eject button", "shortname": ":eject_button:", "unicode": "23CF", "html": "&#x23CF;", "category": "Symbols (av-symbol)", "order": ""},
+ {"emoji": "â™€ī¸", "name": "female sign", "shortname": ":female_sign:", "unicode": "2640 FE0F", "html": "&#x2640;&#xFE0F;", "category": "Symbols (gender)", "order": ""},
+ {"emoji": "♀", "name": "female sign", "shortname": ":female_sign:", "unicode": "2640", "html": "&#x2640;", "category": "Symbols (gender)", "order": ""},
+ {"emoji": "â™‚ī¸", "name": "male sign", "shortname": ":male_sign:", "unicode": "2642 FE0F", "html": "&#x2642;&#xFE0F;", "category": "Symbols (gender)", "order": ""},
+ {"emoji": "♂", "name": "male sign", "shortname": ":male_sign:", "unicode": "2642", "html": "&#x2642;", "category": "Symbols (gender)", "order": ""},
+ {"emoji": "âš•ī¸", "name": "medical symbol", "shortname": ":medical_symbol:", "unicode": "2695 FE0F", "html": "&#x2695;&#xFE0F;", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "⚕", "name": "medical symbol", "shortname": ":medical_symbol:", "unicode": "2695", "html": "&#x2695;", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "â™žī¸", "name": "infinity", "shortname": ":infinity:", "unicode": "267E FE0F", "html": "&#x267E;&#xFE0F;", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "♾", "name": "infinity", "shortname": ":infinity:", "unicode": "267E", "html": "&#x267E;", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "â™ģī¸", "name": "recycling symbol", "shortname": ":recycling_symbol:", "unicode": "267B FE0F", "html": "&#x267B;&#xFE0F;", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "âšœī¸", "name": "fleur-de-lis", "shortname": ":fleurde-lis:", "unicode": "269C FE0F", "html": "&#x269C;&#xFE0F;", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "☑", "name": "check box with check", "shortname": ":check_box_with_check:", "unicode": "2611", "html": "&#x2611;", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "✔", "name": "check mark", "shortname": ":check_mark:", "unicode": "2714", "html": "&#x2714;", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "✖", "name": "multiplication sign", "shortname": ":multiplication_sign:", "unicode": "2716", "html": "&#x2716;", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "ã€Ŋ", "name": "part alternation mark", "shortname": ":part_alternation_mark:", "unicode": "303D", "html": "&#x303D;", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "âœŗ", "name": "eight-spoked asterisk", "shortname": ":eightspoked_asterisk:", "unicode": "2733", "html": "&#x2733;", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "✴", "name": "eight-pointed star", "shortname": ":eightpointed_star:", "unicode": "2734", "html": "&#x2734;", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "❇", "name": "sparkle", "shortname": ":sparkle:", "unicode": "2747", "html": "&#x2747;", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "â€ŧ", "name": "double exclamation mark", "shortname": ":double_exclamation_mark:", "unicode": "203C", "html": "&#x203C;", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "⁉", "name": "exclamation question mark", "shortname": ":exclamation_question_mark:", "unicode": "2049", "html": "&#x2049;", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "ã€°ī¸", "name": "wavy dash", "shortname": ":wavy_dash:", "unicode": "3030 FE0F", "html": "&#x3030;&#xFE0F;", "category": "Symbols (other-symbol)", "order": ""},
+ {"emoji": "#ī¸âƒŖ", "name": "keycap: #", "shortname": ":#:", "unicode": "0023 FE0F 20E3", "html": "&#x0023;&#xFE0F;&#x20E3;", "category": "Symbols (keycap)", "order": ""},
+ {"emoji": "🅰", "name": "A button (blood type)", "shortname": ":A_button_blood_type:", "unicode": "1F170", "html": "&#x1F170;", "category": "Symbols (alphanum)", "order": ""},
+ {"emoji": "🅱", "name": "B button (blood type)", "shortname": ":B_button_blood_type:", "unicode": "1F171", "html": "&#x1F171;", "category": "Symbols (alphanum)", "order": ""},
+ {"emoji": "â„šī¸", "name": "information", "shortname": ":information:", "unicode": "2139 FE0F", "html": "&#x2139;&#xFE0F;", "category": "Symbols (alphanum)", "order": ""},
+ {"emoji": "Ⓜ", "name": "circled M", "shortname": ":circled_M:", "unicode": "24C2", "html": "&#x24C2;", "category": "Symbols (alphanum)", "order": ""},
+ {"emoji": "🅾", "name": "O button (blood type)", "shortname": ":O_button_blood_type:", "unicode": "1F17E", "html": "&#x1F17E;", "category": "Symbols (alphanum)", "order": ""},
+ {"emoji": "đŸ…ŋ", "name": "P button", "shortname": ":P_button:", "unicode": "1F17F", "html": "&#x1F17F;", "category": "Symbols (alphanum)", "order": ""},
+ {"emoji": "🈂", "name": "Japanese service charge button", "shortname": ":Japanese_service_charge_button:", "unicode": "1F202", "html": "&#x1F202;", "category": "Symbols (alphanum)", "order": ""},
+ {"emoji": "đŸˆˇī¸", "name": "Japanese monthly amount button", "shortname": ":Japanese_monthly_amount_button:", "unicode": "1F237 FE0F", "html": "&#x1F237;&#xFE0F;", "category": "Symbols (alphanum)", "order": ""},
+ {"emoji": "đŸˆ¯", "name": "Japanese reserved button", "shortname": ":Japanese_reserved_button:", "unicode": "1F22F", "html": "&#x1F22F;", "category": "Symbols (alphanum)", "order": ""},
+ {"emoji": "🈚", "name": "Japanese free of charge button", "shortname": ":Japanese_free_of_charge_button:", "unicode": "1F21A", "html": "&#x1F21A;", "category": "Symbols (alphanum)", "order": ""},
+ {"emoji": "ãŠ—ī¸", "name": "Japanese congratulations button", "shortname": ":Japanese_congratulations_button:", "unicode": "3297 FE0F", "html": "&#x3297;&#xFE0F;", "category": "Symbols (alphanum)", "order": ""},
+ {"emoji": "ãŠ™ī¸", "name": "Japanese secret button", "shortname": ":Japanese_secret_button:", "unicode": "3299 FE0F", "html": "&#x3299;&#xFE0F;", "category": "Symbols (alphanum)", "order": ""},
+ {"emoji": "🟠", "name": "orange circle", "shortname": ":orange_circle:", "unicode": "1F7E0", "html": "&#x1F7E0;", "category": "Symbols (geometric)", "order": ""},
+ {"emoji": "🟡", "name": "yellow circle", "shortname": ":yellow_circle:", "unicode": "1F7E1", "html": "&#x1F7E1;", "category": "Symbols (geometric)", "order": ""},
+ {"emoji": "đŸŸĸ", "name": "green circle", "shortname": ":green_circle:", "unicode": "1F7E2", "html": "&#x1F7E2;", "category": "Symbols (geometric)", "order": ""},
+ {"emoji": "đŸŸŖ", "name": "purple circle", "shortname": ":purple_circle:", "unicode": "1F7E3", "html": "&#x1F7E3;", "category": "Symbols (geometric)", "order": ""},
+ {"emoji": "🟤", "name": "brown circle", "shortname": ":brown_circle:", "unicode": "1F7E4", "html": "&#x1F7E4;", "category": "Symbols (geometric)", "order": ""},
+ {"emoji": "đŸŸĨ", "name": "red square", "shortname": ":red_square:", "unicode": "1F7E5", "html": "&#x1F7E5;", "category": "Symbols (geometric)", "order": ""},
+ {"emoji": "🟧", "name": "orange square", "shortname": ":orange_square:", "unicode": "1F7E7", "html": "&#x1F7E7;", "category": "Symbols (geometric)", "order": ""},
+ {"emoji": "🟨", "name": "yellow square", "shortname": ":yellow_square:", "unicode": "1F7E8", "html": "&#x1F7E8;", "category": "Symbols (geometric)", "order": ""},
+ {"emoji": "🟩", "name": "green square", "shortname": ":green_square:", "unicode": "1F7E9", "html": "&#x1F7E9;", "category": "Symbols (geometric)", "order": ""},
+ {"emoji": "đŸŸĻ", "name": "blue square", "shortname": ":blue_square:", "unicode": "1F7E6", "html": "&#x1F7E6;", "category": "Symbols (geometric)", "order": ""},
+ {"emoji": "â–Ē", "name": "black small square", "shortname": ":black_small_square:", "unicode": "25AA", "html": "&#x25AA;", "category": "Symbols (geometric)", "order": ""},
+ {"emoji": "â–Ģī¸", "name": "white small square", "shortname": ":white_small_square:", "unicode": "25AB FE0F", "html": "&#x25AB;&#xFE0F;", "category": "Symbols (geometric)", "order": ""},
+ {"emoji": "đŸŗī¸", "name": "white flag", "shortname": ":white_flag:", "unicode": "1F3F3 FE0F", "html": "&#x1F3F3;&#xFE0F;", "category": "Flags (flag)", "order": ""},
+ {"emoji": "đŸŗī¸â€đŸŒˆ", "name": "rainbow flag", "shortname": ":rainbow_flag:", "unicode": "1F3F3 FE0F 200D 1F308", "html": "&#x1F3F3;&#xFE0F;&#x200D;&#x1F308;", "category": "Flags (flag)", "order": ""},
+ {"emoji": "đŸ´â€â˜ ī¸", "name": "pirate flag", "shortname": ":pirate_flag:", "unicode": "1F3F4 200D 2620 FE0F", "html": "&#x1F3F4;&#x200D;&#x2620;&#xFE0F;", "category": "Flags (flag)", "order": ""},
+ {"emoji": "🏴‍☠", "name": "pirate flag", "shortname": ":pirate_flag:", "unicode": "1F3F4 200D 2620", "html": "&#x1F3F4;&#x200D;&#x2620;", "category": "Flags (flag)", "order": ""},
+ {"emoji": "đŸ‡ēđŸ‡ŗ", "name": "flag: United Nations", "shortname": ":United_Nations:", "unicode": "1F1FA 1F1F3", "html": "&#x1F1FA;&#x1F1F3;", "category": "Flags (country-flag)", "order": ""},
+ {"emoji": "đŸ´ķ §ķ ĸķ Ĩķ Žķ §ķ ŋ", "name": "flag: England", "shortname": ":England:", "unicode": "1F3F4 E0067 E0062 E0065 E006E E0067 E007F", "html": "&#x1F3F4;&#xE0067;&#xE0062;&#xE0065;&#xE006E;&#xE0067;&#xE007F;", "category": "Flags (subdivision-flag)", "order": ""},
+ {"emoji": "đŸ´ķ §ķ ĸķ ŗķ Ŗķ ´ķ ŋ", "name": "flag: Scotland", "shortname": ":Scotland:", "unicode": "1F3F4 E0067 E0062 E0073 E0063 E0074 E007F", "html": "&#x1F3F4;&#xE0067;&#xE0062;&#xE0073;&#xE0063;&#xE0074;&#xE007F;", "category": "Flags (subdivision-flag)", "order": ""},
+ {"emoji": "đŸ´ķ §ķ ĸķ ˇķ Ŧķ ŗķ ŋ", "name": "Wales", "shortname": ":wales:", "unicode": "1F3F4 E0067 E0062 E0077 E006C E0073 E007F", "html": "&#x1F3F4;&#xE0067;&#xE0062;&#xE0077;&#xE006C;&#xE0073;&#xE007F;", "category": "(subdivision-flag)", "order": ""}
+ ]
+}
\ No newline at end of file

File Metadata

Mime Type
text/x-diff
Expires
Sat, Sep 19, 3:14 AM (23 h, 2 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1767828
Default Alt Text
(1 MB)

Event Timeline