diff --git a/src/App.php b/src/App.php index 0d860638b..495cfb8b0 100644 --- a/src/App.php +++ b/src/App.php @@ -335,7 +335,13 @@ class App */ protected function load(DbaDefinition $dbaDefinition, ViewDefinition $viewDefinition) { - set_time_limit(0); + if ($this->config->get('system', 'ini_max_execution_time') !== false) { + set_time_limit((int)$this->config->get('system', 'ini_max_execution_time')); + } + + if ($this->config->get('system', 'ini_pcre_backtrack_limit') !== false) { + ini_set('pcre.backtrack_limit', (int)$this->config->get('system', 'ini_pcre_backtrack_limit')); + } // Normally this constant is defined - but not if "pcntl" isn't installed if (!defined('SIGTERM')) { @@ -345,9 +351,6 @@ class App // Ensure that all "strtotime" operations do run timezone independent date_default_timezone_set('UTC'); - // This has to be quite large to deal with embedded private photos - ini_set('pcre.backtrack_limit', 500000); - set_include_path( get_include_path() . PATH_SEPARATOR . $this->getBasePath() . DIRECTORY_SEPARATOR . 'include' . PATH_SEPARATOR diff --git a/src/Content/Conversation.php b/src/Content/Conversation.php index 6e7820a6f..e0205d3d0 100644 --- a/src/Content/Conversation.php +++ b/src/Content/Conversation.php @@ -365,6 +365,7 @@ class Conversation '$editalic' => $this->l10n->t('Italic'), '$eduline' => $this->l10n->t('Underline'), '$edquote' => $this->l10n->t('Quote'), + '$edemojis' => $this->l10n->t('Add emojis'), '$edcode' => $this->l10n->t('Code'), '$edimg' => $this->l10n->t('Image'), '$edurl' => $this->l10n->t('Link'), diff --git a/src/Model/Item.php b/src/Model/Item.php index 1943ea4f8..6da214398 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -3021,6 +3021,7 @@ class Item if (!$is_preview) { $item['body'] = preg_replace("#\s*\[attachment .*?].*?\[/attachment]\s*#ism", "\n", $item['body']); $item['body'] = Post\Media::removeFromEndOfBody($item['body'] ?? ''); + $item['body'] = Post\Media::replaceImage($item['body']); } $body = $item['body']; @@ -3038,6 +3039,7 @@ class Item if (!empty($shared['post'])) { $shared_item = $shared['post']; $shared_item['body'] = Post\Media::removeFromEndOfBody($shared_item['body']); + $shared_item['body'] = Post\Media::replaceImage($shared_item['body']); $quote_uri_id = $shared['post']['uri-id']; $shared_links[] = strtolower($shared['post']['uri']); $item['body'] = BBCode::removeSharedData($item['body']); @@ -3141,12 +3143,14 @@ class Item } if (!empty($shared_attachments)) { + $s = self::addGallery($s, $shared_attachments, $item['uri-id']); $s = self::addVisualAttachments($shared_attachments, $shared_item, $s, true); $s = self::addLinkAttachment($shared_uri_id ?: $item['uri-id'], $shared_attachments, $body, $s, true, $quote_shared_links); $s = self::addNonVisualAttachments($shared_attachments, $item, $s, true); $body = BBCode::removeSharedData($body); } + $s = self::addGallery($s, $attachments, $item['uri-id']); $s = self::addVisualAttachments($attachments, $item, $s, false); $s = self::addLinkAttachment($item['uri-id'], $attachments, $body, $s, false, $shared_links); $s = self::addNonVisualAttachments($attachments, $item, $s, false); @@ -3196,6 +3200,24 @@ class Item ]); } + /** + * Modify links to pictures to links for the "Fancybox" gallery + * + * @param string $s + * @param array $attachments + * @param integer $uri_id + * @return string + */ + private static function addGallery(string $s, array $attachments, int $uri_id): string + { + foreach ($attachments['visual'] as $attachment) { + if (empty($attachment['preview']) || ($attachment['type'] != Post\Media::IMAGE)) { + continue; + } + $s = str_replace(' $src_url, 'preview' => $preview_url, 'attachment' => $attachment]; + $images[] = ['src' => $src_url, 'preview' => $preview_url, 'attachment' => $attachment, 'uri_id' => $item['uri-id']]; } } diff --git a/src/Model/Post/Media.php b/src/Model/Post/Media.php index 77ecf7521..4b806bcc6 100644 --- a/src/Model/Post/Media.php +++ b/src/Model/Post/Media.php @@ -478,6 +478,33 @@ class Media return preg_match('#/photos/.*/image/#ism', $page) && preg_match('#/photo/.*-[01]\.#ism', $preview); } + /** + * Replace the image link in Friendica image posts with a link to the image + * + * @param string $body + * @return string + */ + public static function replaceImage(string $body): string + { + if (preg_match_all("#\[url=([^\]]+?)\]\s*\[img=([^\[\]]*)\]([^\[\]]*)\[\/img\]\s*\[/url\]#ism", $body, $pictures, PREG_SET_ORDER)) { + foreach ($pictures as $picture) { + if (self::isLinkToImagePage($picture[1], $picture[2])) { + $body = str_replace($picture[0], '[url=' . str_replace('-1.', '-0.', $picture[2]) . '][img=' . $picture[2] . ']' . $picture[3] . '[/img][/url]', $body); + } + } + } + + if (preg_match_all("#\[url=([^\]]+?)\]\s*\[img\]([^\[]+?)\[/img\]\s*\[/url\]#ism", $body, $pictures, PREG_SET_ORDER)) { + foreach ($pictures as $picture) { + if (self::isLinkToImagePage($picture[1], $picture[2])) { + $body = str_replace($picture[0], '[url=' . str_replace('-1.', '-0.', $picture[2]) . '][img]' . $picture[2] . '[/img][/url]', $body); + } + } + } + + return $body; + } + /** * Add media links and remove them from the body * diff --git a/src/Module/Post/Edit.php b/src/Module/Post/Edit.php index 0d6badf4d..1505c301a 100644 --- a/src/Module/Post/Edit.php +++ b/src/Module/Post/Edit.php @@ -172,6 +172,7 @@ class Edit extends BaseModule '$editalic' => $this->t('Italic'), '$eduline' => $this->t('Underline'), '$edquote' => $this->t('Quote'), + '$edemojis' => $this->t('Add emojis'), '$edcode' => $this->t('Code'), '$edurl' => $this->t('Link'), '$edattach' => $this->t('Link or Media'), diff --git a/src/Object/Post.php b/src/Object/Post.php index b34f51377..b0c9adf2c 100644 --- a/src/Object/Post.php +++ b/src/Object/Post.php @@ -1066,6 +1066,7 @@ class Post '$editalic' => DI::l10n()->t('Italic'), '$eduline' => DI::l10n()->t('Underline'), '$edquote' => DI::l10n()->t('Quote'), + '$edemojis' => DI::l10n()->t('Add emojis'), '$edcode' => DI::l10n()->t('Code'), '$edimg' => DI::l10n()->t('Image'), '$edurl' => DI::l10n()->t('Link'), diff --git a/static/defaults.config.php b/static/defaults.config.php index 7e699fad7..d0b8262ac 100644 --- a/static/defaults.config.php +++ b/static/defaults.config.php @@ -341,6 +341,14 @@ return [ // Resolve IPV4 addresses only. Don't resolve to IPV6. 'ipv4_resolve' => false, + // ini_max_execution_time (False|Integer) + // Set the number of seconds a script is allowed to run. Default unlimited for Friendica, false to use the system value. + 'ini_max_execution_time' => 0, + + // ini_pcre_backtrack_limit (False|Integer) + // This has to be quite large to deal with embedded private photos. False to use the system value. + 'ini_pcre_backtrack_limit' => 500000, + // invitation_only (Boolean) // If set true registration is only possible after a current member of the node has sent an invitation. 'invitation_only' => false, diff --git a/view/js/fancybox/README.md b/view/js/fancybox/README.md new file mode 100644 index 000000000..e32b89e16 --- /dev/null +++ b/view/js/fancybox/README.md @@ -0,0 +1,62 @@ +# fancyBox 3.5.7 + +jQuery lightbox script for displaying images, videos and more. +Touch enabled, responsive and fully customizable. + +See the [project page](http://fancyapps.com/fancybox/3/) for documentation and a demonstration. + +Follow [@thefancyapps](//twitter.com/thefancyapps) for updates. + + +## Quick start + +1\. Add latest jQuery and fancyBox files + +```html + + + + +``` + + +2\. Create links + +```html + + + + + + + +``` + + +3\. Enjoy! + + +## License + +fancyBox is licensed under the [GPLv3](http://choosealicense.com/licenses/gpl-3.0) license for all open source applications. +A commercial license is required for all commercial applications (including sites, themes and apps you plan to sell). + +[Read more about fancyBox license](http://fancyapps.com/fancybox/3/#license). + +## Bugs and feature requests + +If you find a bug, please report it [here on Github](https://github.com/fancyapps/fancybox/issues). + +Guidelines for bug reports: + +1. Use the GitHub issue search — check if the issue has already been reported. +2. Check if the issue has been fixed — try to reproduce it using the latest master or development branch in the repository. +3. Isolate the problem — create a reduced test case and a live example. You can use CodePen to fork any demo found on documentation to use it as a template. + +A good bug report shouldn't leave others needing to chase you up for more information. +Please try to be as detailed as possible in your report. + + +Feature requests are welcome. Please look for existing ones and use GitHub's "reactions" feature to vote. + +Please do not use the issue tracker for personal support requests - use Stack Overflow ([fancybox-3](http://stackoverflow.com/questions/tagged/fancybox-3) tag) instead. diff --git a/view/js/fancybox/fancybox.config.js b/view/js/fancybox/fancybox.config.js new file mode 100644 index 000000000..233b423f9 --- /dev/null +++ b/view/js/fancybox/fancybox.config.js @@ -0,0 +1,13 @@ +$(document).ready(function() { + $.fancybox.defaults.loop = "true"; + // this disables the colorbox hook found in frio/js/modal.js:34 + $("body").off("click", ".wall-item-body a img"); + + // Adds ALT/TITLE text to fancybox + $('a[data-fancybox').fancybox({ + afterLoad : function(instance, current) { + current.$image.attr('alt', current.opts.$orig.find('img').attr('alt') ); + current.$image.attr('title', current.opts.$orig.find('img').attr('title') ); + } + }); +}); \ No newline at end of file diff --git a/view/js/fancybox/jquery.fancybox.css b/view/js/fancybox/jquery.fancybox.css new file mode 100644 index 000000000..16b01254a --- /dev/null +++ b/view/js/fancybox/jquery.fancybox.css @@ -0,0 +1,895 @@ +body.compensate-for-scrollbar { + overflow: hidden; +} + +.fancybox-active { + height: auto; +} + +.fancybox-is-hidden { + left: -9999px; + margin: 0; + position: absolute !important; + top: -9999px; + visibility: hidden; +} + +.fancybox-container { + -webkit-backface-visibility: hidden; + height: 100%; + left: 0; + outline: none; + position: fixed; + -webkit-tap-highlight-color: transparent; + top: 0; + -ms-touch-action: manipulation; + touch-action: manipulation; + transform: translateZ(0); + width: 100%; + z-index: 99992; +} + +.fancybox-container * { + box-sizing: border-box; +} + +.fancybox-outer, +.fancybox-inner, +.fancybox-bg, +.fancybox-stage { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; +} + +.fancybox-outer { + -webkit-overflow-scrolling: touch; + overflow-y: auto; +} + +.fancybox-bg { + background: rgb(30, 30, 30); + opacity: 0; + transition-duration: inherit; + transition-property: opacity; + transition-timing-function: cubic-bezier(.47, 0, .74, .71); +} + +.fancybox-is-open .fancybox-bg { + opacity: .9; + transition-timing-function: cubic-bezier(.22, .61, .36, 1); +} + +.fancybox-infobar, +.fancybox-toolbar, +.fancybox-caption, +.fancybox-navigation .fancybox-button { + direction: ltr; + opacity: 0; + position: absolute; + transition: opacity .25s ease, visibility 0s ease .25s; + visibility: hidden; + z-index: 99997; +} + +.fancybox-show-infobar .fancybox-infobar, +.fancybox-show-toolbar .fancybox-toolbar, +.fancybox-show-caption .fancybox-caption, +.fancybox-show-nav .fancybox-navigation .fancybox-button { + opacity: 1; + transition: opacity .25s ease 0s, visibility 0s ease 0s; + visibility: visible; +} + +.fancybox-infobar { + color: #ccc; + font-size: 13px; + -webkit-font-smoothing: subpixel-antialiased; + height: 44px; + left: 0; + line-height: 44px; + min-width: 44px; + mix-blend-mode: difference; + padding: 0 10px; + pointer-events: none; + top: 0; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.fancybox-toolbar { + right: 0; + top: 0; +} + +.fancybox-stage { + direction: ltr; + overflow: visible; + transform: translateZ(0); + z-index: 99994; +} + +.fancybox-is-open .fancybox-stage { + overflow: hidden; +} + +.fancybox-slide { + -webkit-backface-visibility: hidden; + /* Using without prefix would break IE11 */ + display: none; + height: 100%; + left: 0; + outline: none; + overflow: auto; + -webkit-overflow-scrolling: touch; + padding: 44px; + position: absolute; + text-align: center; + top: 0; + transition-property: transform, opacity; + white-space: normal; + width: 100%; + z-index: 99994; +} + +.fancybox-slide::before { + content: ''; + display: inline-block; + font-size: 0; + height: 100%; + vertical-align: middle; + width: 0; +} + +.fancybox-is-sliding .fancybox-slide, +.fancybox-slide--previous, +.fancybox-slide--current, +.fancybox-slide--next { + display: block; +} + +.fancybox-slide--image { + overflow: hidden; + padding: 44px 0; +} + +.fancybox-slide--image::before { + display: none; +} + +.fancybox-slide--html { + padding: 6px; +} + +.fancybox-content { + background: #fff; + display: inline-block; + margin: 0; + max-width: 100%; + overflow: auto; + -webkit-overflow-scrolling: touch; + padding: 44px; + position: relative; + text-align: left; + vertical-align: middle; +} + +.fancybox-slide--image .fancybox-content { + animation-timing-function: cubic-bezier(.5, 0, .14, 1); + -webkit-backface-visibility: hidden; + background: transparent; + background-repeat: no-repeat; + background-size: 100% 100%; + left: 0; + max-width: none; + overflow: visible; + padding: 0; + position: absolute; + top: 0; + -ms-transform-origin: top left; + transform-origin: top left; + transition-property: transform, opacity; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + z-index: 99995; +} + +.fancybox-can-zoomOut .fancybox-content { + cursor: zoom-out; +} + +.fancybox-can-zoomIn .fancybox-content { + cursor: zoom-in; +} + +.fancybox-can-swipe .fancybox-content, +.fancybox-can-pan .fancybox-content { + cursor: -webkit-grab; + cursor: grab; +} + +.fancybox-is-grabbing .fancybox-content { + cursor: -webkit-grabbing; + cursor: grabbing; +} + +.fancybox-container [data-selectable='true'] { + cursor: text; +} + +.fancybox-image, +.fancybox-spaceball { + background: transparent; + border: 0; + height: 100%; + left: 0; + margin: 0; + max-height: none; + max-width: none; + padding: 0; + position: absolute; + top: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + width: 100%; +} + +.fancybox-spaceball { + z-index: 1; +} + +.fancybox-slide--video .fancybox-content, +.fancybox-slide--map .fancybox-content, +.fancybox-slide--pdf .fancybox-content, +.fancybox-slide--iframe .fancybox-content { + height: 100%; + overflow: visible; + padding: 0; + width: 100%; +} + +.fancybox-slide--video .fancybox-content { + background: #000; +} + +.fancybox-slide--map .fancybox-content { + background: #e5e3df; +} + +.fancybox-slide--iframe .fancybox-content { + background: #fff; +} + +.fancybox-video, +.fancybox-iframe { + background: transparent; + border: 0; + display: block; + height: 100%; + margin: 0; + overflow: hidden; + padding: 0; + width: 100%; +} + +/* Fix iOS */ +.fancybox-iframe { + left: 0; + position: absolute; + top: 0; +} + +.fancybox-error { + background: #fff; + cursor: default; + max-width: 400px; + padding: 40px; + width: 100%; +} + +.fancybox-error p { + color: #444; + font-size: 16px; + line-height: 20px; + margin: 0; + padding: 0; +} + +/* Buttons */ + +.fancybox-button { + background: rgba(30, 30, 30, .6); + border: 0; + border-radius: 0; + box-shadow: none; + cursor: pointer; + display: inline-block; + height: 44px; + margin: 0; + padding: 10px; + position: relative; + transition: color .2s; + vertical-align: top; + visibility: inherit; + width: 44px; +} + +.fancybox-button, +.fancybox-button:visited, +.fancybox-button:link { + color: #ccc; +} + +.fancybox-button:hover { + color: #fff; +} + +.fancybox-button:focus { + outline: none; +} + +.fancybox-button.fancybox-focus { + outline: 1px dotted; +} + +.fancybox-button[disabled], +.fancybox-button[disabled]:hover { + color: #888; + cursor: default; + outline: none; +} + +/* Fix IE11 */ +.fancybox-button div { + height: 100%; +} + +.fancybox-button svg { + display: block; + height: 100%; + overflow: visible; + position: relative; + width: 100%; +} + +.fancybox-button svg path { + fill: currentColor; + stroke-width: 0; +} + +.fancybox-button--play svg:nth-child(2), +.fancybox-button--fsenter svg:nth-child(2) { + display: none; +} + +.fancybox-button--pause svg:nth-child(1), +.fancybox-button--fsexit svg:nth-child(1) { + display: none; +} + +.fancybox-progress { + background: #ff5268; + height: 2px; + left: 0; + position: absolute; + right: 0; + top: 0; + -ms-transform: scaleX(0); + transform: scaleX(0); + -ms-transform-origin: 0; + transform-origin: 0; + transition-property: transform; + transition-timing-function: linear; + z-index: 99998; +} + +/* Close button on the top right corner of html content */ + +.fancybox-close-small { + background: transparent; + border: 0; + border-radius: 0; + color: #ccc; + cursor: pointer; + opacity: .8; + padding: 8px; + position: absolute; + right: -12px; + top: -44px; + z-index: 401; +} + +.fancybox-close-small:hover { + color: #fff; + opacity: 1; +} + +.fancybox-slide--html .fancybox-close-small { + color: currentColor; + padding: 10px; + right: 0; + top: 0; +} + +.fancybox-slide--image.fancybox-is-scaling .fancybox-content { + overflow: hidden; +} + +.fancybox-is-scaling .fancybox-close-small, +.fancybox-is-zoomable.fancybox-can-pan .fancybox-close-small { + display: none; +} + +/* Navigation arrows */ + +.fancybox-navigation .fancybox-button { + background-clip: content-box; + height: 100px; + opacity: 0; + position: absolute; + top: calc(50% - 50px); + width: 70px; +} + +.fancybox-navigation .fancybox-button div { + padding: 7px; +} + +.fancybox-navigation .fancybox-button--arrow_left { + left: 0; + left: env(safe-area-inset-left); + padding: 31px 26px 31px 6px; +} + +.fancybox-navigation .fancybox-button--arrow_right { + padding: 31px 6px 31px 26px; + right: 0; + right: env(safe-area-inset-right); +} + +/* Caption */ + +.fancybox-caption { + background: linear-gradient(to top, + rgba(0, 0, 0, .85) 0%, + rgba(0, 0, 0, .3) 50%, + rgba(0, 0, 0, .15) 65%, + rgba(0, 0, 0, .075) 75.5%, + rgba(0, 0, 0, .037) 82.85%, + rgba(0, 0, 0, .019) 88%, + rgba(0, 0, 0, 0) 100%); + bottom: 0; + color: #eee; + font-size: 14px; + font-weight: 400; + left: 0; + line-height: 1.5; + padding: 75px 44px 25px 44px; + pointer-events: none; + right: 0; + text-align: center; + z-index: 99996; +} + +@supports (padding: max(0px)) { + .fancybox-caption { + padding: 75px max(44px, env(safe-area-inset-right)) max(25px, env(safe-area-inset-bottom)) max(44px, env(safe-area-inset-left)); + } +} + +.fancybox-caption--separate { + margin-top: -50px; +} + +.fancybox-caption__body { + max-height: 50vh; + overflow: auto; + pointer-events: all; +} + +.fancybox-caption a, +.fancybox-caption a:link, +.fancybox-caption a:visited { + color: #ccc; + text-decoration: none; +} + +.fancybox-caption a:hover { + color: #fff; + text-decoration: underline; +} + +/* Loading indicator */ + +.fancybox-loading { + animation: fancybox-rotate 1s linear infinite; + background: transparent; + border: 4px solid #888; + border-bottom-color: #fff; + border-radius: 50%; + height: 50px; + left: 50%; + margin: -25px 0 0 -25px; + opacity: .7; + padding: 0; + position: absolute; + top: 50%; + width: 50px; + z-index: 99999; +} + +@keyframes fancybox-rotate { + 100% { + transform: rotate(360deg); + } +} + +/* Transition effects */ + +.fancybox-animated { + transition-timing-function: cubic-bezier(0, 0, .25, 1); +} + +/* transitionEffect: slide */ + +.fancybox-fx-slide.fancybox-slide--previous { + opacity: 0; + transform: translate3d(-100%, 0, 0); +} + +.fancybox-fx-slide.fancybox-slide--next { + opacity: 0; + transform: translate3d(100%, 0, 0); +} + +.fancybox-fx-slide.fancybox-slide--current { + opacity: 1; + transform: translate3d(0, 0, 0); +} + +/* transitionEffect: fade */ + +.fancybox-fx-fade.fancybox-slide--previous, +.fancybox-fx-fade.fancybox-slide--next { + opacity: 0; + transition-timing-function: cubic-bezier(.19, 1, .22, 1); +} + +.fancybox-fx-fade.fancybox-slide--current { + opacity: 1; +} + +/* transitionEffect: zoom-in-out */ + +.fancybox-fx-zoom-in-out.fancybox-slide--previous { + opacity: 0; + transform: scale3d(1.5, 1.5, 1.5); +} + +.fancybox-fx-zoom-in-out.fancybox-slide--next { + opacity: 0; + transform: scale3d(.5, .5, .5); +} + +.fancybox-fx-zoom-in-out.fancybox-slide--current { + opacity: 1; + transform: scale3d(1, 1, 1); +} + +/* transitionEffect: rotate */ + +.fancybox-fx-rotate.fancybox-slide--previous { + opacity: 0; + -ms-transform: rotate(-360deg); + transform: rotate(-360deg); +} + +.fancybox-fx-rotate.fancybox-slide--next { + opacity: 0; + -ms-transform: rotate(360deg); + transform: rotate(360deg); +} + +.fancybox-fx-rotate.fancybox-slide--current { + opacity: 1; + -ms-transform: rotate(0deg); + transform: rotate(0deg); +} + +/* transitionEffect: circular */ + +.fancybox-fx-circular.fancybox-slide--previous { + opacity: 0; + transform: scale3d(0, 0, 0) translate3d(-100%, 0, 0); +} + +.fancybox-fx-circular.fancybox-slide--next { + opacity: 0; + transform: scale3d(0, 0, 0) translate3d(100%, 0, 0); +} + +.fancybox-fx-circular.fancybox-slide--current { + opacity: 1; + transform: scale3d(1, 1, 1) translate3d(0, 0, 0); +} + +/* transitionEffect: tube */ + +.fancybox-fx-tube.fancybox-slide--previous { + transform: translate3d(-100%, 0, 0) scale(.1) skew(-10deg); +} + +.fancybox-fx-tube.fancybox-slide--next { + transform: translate3d(100%, 0, 0) scale(.1) skew(10deg); +} + +.fancybox-fx-tube.fancybox-slide--current { + transform: translate3d(0, 0, 0) scale(1); +} + +/* Styling for Small-Screen Devices */ +@media all and (max-height: 576px) { + .fancybox-slide { + padding-left: 6px; + padding-right: 6px; + } + + .fancybox-slide--image { + padding: 6px 0; + } + + .fancybox-close-small { + right: -6px; + } + + .fancybox-slide--image .fancybox-close-small { + background: #4e4e4e; + color: #f2f4f6; + height: 36px; + opacity: 1; + padding: 6px; + right: 0; + top: 0; + width: 36px; + } + + .fancybox-caption { + padding-left: 12px; + padding-right: 12px; + } + + @supports (padding: max(0px)) { + .fancybox-caption { + padding-left: max(12px, env(safe-area-inset-left)); + padding-right: max(12px, env(safe-area-inset-right)); + } + } +} +/* Share */ + +.fancybox-share { + background: #f4f4f4; + border-radius: 3px; + max-width: 90%; + padding: 30px; + text-align: center; +} + +.fancybox-share h1 { + color: #222; + font-size: 35px; + font-weight: 700; + margin: 0 0 20px 0; +} + +.fancybox-share p { + margin: 0; + padding: 0; +} + +.fancybox-share__button { + border: 0; + border-radius: 3px; + display: inline-block; + font-size: 14px; + font-weight: 700; + line-height: 40px; + margin: 0 5px 10px 5px; + min-width: 130px; + padding: 0 15px; + text-decoration: none; + transition: all .2s; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + white-space: nowrap; +} + +.fancybox-share__button:visited, +.fancybox-share__button:link { + color: #fff; +} + +.fancybox-share__button:hover { + text-decoration: none; +} + +.fancybox-share__button--fb { + background: #3b5998; +} + +.fancybox-share__button--fb:hover { + background: #344e86; +} + +.fancybox-share__button--pt { + background: #bd081d; +} + +.fancybox-share__button--pt:hover { + background: #aa0719; +} + +.fancybox-share__button--tw { + background: #1da1f2; +} + +.fancybox-share__button--tw:hover { + background: #0d95e8; +} + +.fancybox-share__button svg { + height: 25px; + margin-right: 7px; + position: relative; + top: -1px; + vertical-align: middle; + width: 25px; +} + +.fancybox-share__button svg path { + fill: #fff; +} + +.fancybox-share__input { + background: transparent; + border: 0; + border-bottom: 1px solid #d7d7d7; + border-radius: 0; + color: #5d5b5b; + font-size: 14px; + margin: 10px 0 0 0; + outline: none; + padding: 10px 15px; + width: 100%; +} +/* Thumbs */ + +.fancybox-thumbs { + background: #ddd; + bottom: 0; + display: none; + margin: 0; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + padding: 2px 2px 4px 2px; + position: absolute; + right: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + top: 0; + width: 212px; + z-index: 99995; +} + +.fancybox-thumbs-x { + overflow-x: auto; + overflow-y: hidden; +} + +.fancybox-show-thumbs .fancybox-thumbs { + display: block; +} + +.fancybox-show-thumbs .fancybox-inner { + right: 212px; +} + +.fancybox-thumbs__list { + font-size: 0; + height: 100%; + list-style: none; + margin: 0; + overflow-x: hidden; + overflow-y: auto; + padding: 0; + position: absolute; + position: relative; + white-space: nowrap; + width: 100%; +} + +.fancybox-thumbs-x .fancybox-thumbs__list { + overflow: hidden; +} + +.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar { + width: 7px; +} + +.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-track { + background: #fff; + border-radius: 10px; + box-shadow: inset 0 0 6px rgba(0, 0, 0, .3); +} + +.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-thumb { + background: #2a2a2a; + border-radius: 10px; +} + +.fancybox-thumbs__list a { + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + background-color: rgba(0, 0, 0, .1); + background-position: center center; + background-repeat: no-repeat; + background-size: cover; + cursor: pointer; + float: left; + height: 75px; + margin: 2px; + max-height: calc(100% - 8px); + max-width: calc(50% - 4px); + outline: none; + overflow: hidden; + padding: 0; + position: relative; + -webkit-tap-highlight-color: transparent; + width: 100px; +} + +.fancybox-thumbs__list a::before { + border: 6px solid #ff5268; + bottom: 0; + content: ''; + left: 0; + opacity: 0; + position: absolute; + right: 0; + top: 0; + transition: all .2s cubic-bezier(.25, .46, .45, .94); + z-index: 99991; +} + +.fancybox-thumbs__list a:focus::before { + opacity: .5; +} + +.fancybox-thumbs__list a.fancybox-thumbs-active::before { + opacity: 1; +} + +/* Styling for Small-Screen Devices */ +@media all and (max-width: 576px) { + .fancybox-thumbs { + width: 110px; + } + + .fancybox-show-thumbs .fancybox-inner { + right: 110px; + } + + .fancybox-thumbs__list a { + max-width: calc(100% - 10px); + } +} \ No newline at end of file diff --git a/view/js/fancybox/jquery.fancybox.js b/view/js/fancybox/jquery.fancybox.js new file mode 100644 index 000000000..806b27034 --- /dev/null +++ b/view/js/fancybox/jquery.fancybox.js @@ -0,0 +1,5632 @@ +// ================================================== +// fancyBox v3.5.7 +// +// Licensed GPLv3 for open source use +// or fancyBox Commercial License for commercial use +// +// http://fancyapps.com/fancybox/ +// Copyright 2019 fancyApps +// +// ================================================== +(function (window, document, $, undefined) { + "use strict"; + + window.console = window.console || { + info: function (stuff) {} + }; + + // If there's no jQuery, fancyBox can't work + // ========================================= + + if (!$) { + return; + } + + // Check if fancyBox is already initialized + // ======================================== + + if ($.fn.fancybox) { + console.info("fancyBox already initialized"); + + return; + } + + // Private default settings + // ======================== + + var defaults = { + // Close existing modals + // Set this to false if you do not need to stack multiple instances + closeExisting: false, + + // Enable infinite gallery navigation + loop: false, + + // Horizontal space between slides + gutter: 50, + + // Enable keyboard navigation + keyboard: true, + + // Should allow caption to overlap the content + preventCaptionOverlap: true, + + // Should display navigation arrows at the screen edges + arrows: true, + + // Should display counter at the top left corner + infobar: true, + + // Should display close button (using `btnTpl.smallBtn` template) over the content + // Can be true, false, "auto" + // If "auto" - will be automatically enabled for "html", "inline" or "ajax" items + smallBtn: "auto", + + // Should display toolbar (buttons at the top) + // Can be true, false, "auto" + // If "auto" - will be automatically hidden if "smallBtn" is enabled + toolbar: "auto", + + // What buttons should appear in the top right corner. + // Buttons will be created using templates from `btnTpl` option + // and they will be placed into toolbar (class="fancybox-toolbar"` element) + buttons: [ + "zoom", + //"share", + "slideShow", + //"fullScreen", + //"download", + "thumbs", + "close" + ], + + // Detect "idle" time in seconds + idleTime: 3, + + // Disable right-click and use simple image protection for images + protect: false, + + // Shortcut to make content "modal" - disable keyboard navigtion, hide buttons, etc + modal: false, + + image: { + // Wait for images to load before displaying + // true - wait for image to load and then display; + // false - display thumbnail and load the full-sized image over top, + // requires predefined image dimensions (`data-width` and `data-height` attributes) + preload: false + }, + + ajax: { + // Object containing settings for ajax request + settings: { + // This helps to indicate that request comes from the modal + // Feel free to change naming + data: { + fancybox: true + } + } + }, + + iframe: { + // Iframe template + tpl: '', + + // Preload iframe before displaying it + // This allows to calculate iframe content width and height + // (note: Due to "Same Origin Policy", you can't get cross domain data). + preload: true, + + // Custom CSS styling for iframe wrapping element + // You can use this to set custom iframe dimensions + css: {}, + + // Iframe tag attributes + attr: { + scrolling: "auto" + } + }, + + // For HTML5 video only + video: { + tpl: '", + format: "", // custom video format + autoStart: true + }, + + // Default content type if cannot be detected automatically + defaultType: "image", + + // Open/close animation type + // Possible values: + // false - disable + // "zoom" - zoom images from/to thumbnail + // "fade" + // "zoom-in-out" + // + animationEffect: "zoom", + + // Duration in ms for open/close animation + animationDuration: 366, + + // Should image change opacity while zooming + // If opacity is "auto", then opacity will be changed if image and thumbnail have different aspect ratios + zoomOpacity: "auto", + + // Transition effect between slides + // + // Possible values: + // false - disable + // "fade' + // "slide' + // "circular' + // "tube' + // "zoom-in-out' + // "rotate' + // + transitionEffect: "fade", + + // Duration in ms for transition animation + transitionDuration: 366, + + // Custom CSS class for slide element + slideClass: "", + + // Custom CSS class for layout + baseClass: "", + + // Base template for layout + baseTpl: '", + + // Loading indicator template + spinnerTpl: '
', + + // Error message template + errorTpl: '

{{ERROR}}

', + + btnTpl: { + download: '' + + '' + + "", + + zoom: '", + + close: '", + + // Arrows + arrowLeft: '", + + arrowRight: '", + + // This small close button will be appended to your html/inline/ajax content by default, + // if "smallBtn" option is not set to false + smallBtn: '" + }, + + // Container is injected into this element + parentEl: "body", + + // Hide browser vertical scrollbars; use at your own risk + hideScrollbar: true, + + // Focus handling + // ============== + + // Try to focus on the first focusable element after opening + autoFocus: true, + + // Put focus back to active element after closing + backFocus: true, + + // Do not let user to focus on element outside modal content + trapFocus: true, + + // Module specific options + // ======================= + + fullScreen: { + autoStart: false + }, + + // Set `touch: false` to disable panning/swiping + touch: { + vertical: true, // Allow to drag content vertically + momentum: true // Continue movement after releasing mouse/touch when panning + }, + + // Hash value when initializing manually, + // set `false` to disable hash change + hash: null, + + // Customize or add new media types + // Example: + /* + media : { + youtube : { + params : { + autoplay : 0 + } + } + } + */ + media: {}, + + slideShow: { + autoStart: false, + speed: 3000 + }, + + thumbs: { + autoStart: false, // Display thumbnails on opening + hideOnClose: true, // Hide thumbnail grid when closing animation starts + parentEl: ".fancybox-container", // Container is injected into this element + axis: "y" // Vertical (y) or horizontal (x) scrolling + }, + + // Use mousewheel to navigate gallery + // If 'auto' - enabled for images only + wheel: "auto", + + // Callbacks + //========== + + // See Documentation/API/Events for more information + // Example: + /* + afterShow: function( instance, current ) { + console.info( 'Clicked element:' ); + console.info( current.opts.$orig ); + } + */ + + onInit: $.noop, // When instance has been initialized + + beforeLoad: $.noop, // Before the content of a slide is being loaded + afterLoad: $.noop, // When the content of a slide is done loading + + beforeShow: $.noop, // Before open animation starts + afterShow: $.noop, // When content is done loading and animating + + beforeClose: $.noop, // Before the instance attempts to close. Return false to cancel the close. + afterClose: $.noop, // After instance has been closed + + onActivate: $.noop, // When instance is brought to front + onDeactivate: $.noop, // When other instance has been activated + + // Interaction + // =========== + + // Use options below to customize taken action when user clicks or double clicks on the fancyBox area, + // each option can be string or method that returns value. + // + // Possible values: + // "close" - close instance + // "next" - move to next gallery item + // "nextOrClose" - move to next gallery item or close if gallery has only one item + // "toggleControls" - show/hide controls + // "zoom" - zoom image (if loaded) + // false - do nothing + + // Clicked on the content + clickContent: function (current, event) { + return current.type === "image" ? "zoom" : false; + }, + + // Clicked on the slide + clickSlide: "close", + + // Clicked on the background (backdrop) element; + // if you have not changed the layout, then most likely you need to use `clickSlide` option + clickOutside: "close", + + // Same as previous two, but for double click + dblclickContent: false, + dblclickSlide: false, + dblclickOutside: false, + + // Custom options when mobile device is detected + // ============================================= + + mobile: { + preventCaptionOverlap: false, + idleTime: false, + clickContent: function (current, event) { + return current.type === "image" ? "toggleControls" : false; + }, + clickSlide: function (current, event) { + return current.type === "image" ? "toggleControls" : "close"; + }, + dblclickContent: function (current, event) { + return current.type === "image" ? "zoom" : false; + }, + dblclickSlide: function (current, event) { + return current.type === "image" ? "zoom" : false; + } + }, + + // Internationalization + // ==================== + + lang: "en", + i18n: { + en: { + CLOSE: "Close", + NEXT: "Next", + PREV: "Previous", + ERROR: "The requested content cannot be loaded.
Please try again later.", + PLAY_START: "Start slideshow", + PLAY_STOP: "Pause slideshow", + FULL_SCREEN: "Full screen", + THUMBS: "Thumbnails", + DOWNLOAD: "Download", + SHARE: "Share", + ZOOM: "Zoom" + }, + de: { + CLOSE: "Schließen", + NEXT: "Weiter", + PREV: "Zurück", + ERROR: "Die angeforderten Daten konnten nicht geladen werden.
Bitte versuchen Sie es später nochmal.", + PLAY_START: "Diaschau starten", + PLAY_STOP: "Diaschau beenden", + FULL_SCREEN: "Vollbild", + THUMBS: "Vorschaubilder", + DOWNLOAD: "Herunterladen", + SHARE: "Teilen", + ZOOM: "Vergrößern" + } + } + }; + + // Few useful variables and methods + // ================================ + + var $W = $(window); + var $D = $(document); + + var called = 0; + + // Check if an object is a jQuery object and not a native JavaScript object + // ======================================================================== + var isQuery = function (obj) { + return obj && obj.hasOwnProperty && obj instanceof $; + }; + + // Handle multiple browsers for "requestAnimationFrame" and "cancelAnimationFrame" + // =============================================================================== + var requestAFrame = (function () { + return ( + window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + // if all else fails, use setTimeout + function (callback) { + return window.setTimeout(callback, 1000 / 60); + } + ); + })(); + + var cancelAFrame = (function () { + return ( + window.cancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.mozCancelAnimationFrame || + window.oCancelAnimationFrame || + function (id) { + window.clearTimeout(id); + } + ); + })(); + + // Detect the supported transition-end event property name + // ======================================================= + var transitionEnd = (function () { + var el = document.createElement("fakeelement"), + t; + + var transitions = { + transition: "transitionend", + OTransition: "oTransitionEnd", + MozTransition: "transitionend", + WebkitTransition: "webkitTransitionEnd" + }; + + for (t in transitions) { + if (el.style[t] !== undefined) { + return transitions[t]; + } + } + + return "transitionend"; + })(); + + // Force redraw on an element. + // This helps in cases where the browser doesn't redraw an updated element properly + // ================================================================================ + var forceRedraw = function ($el) { + return $el && $el.length && $el[0].offsetHeight; + }; + + // Exclude array (`buttons`) options from deep merging + // =================================================== + var mergeOpts = function (opts1, opts2) { + var rez = $.extend(true, {}, opts1, opts2); + + $.each(opts2, function (key, value) { + if ($.isArray(value)) { + rez[key] = value; + } + }); + + return rez; + }; + + // How much of an element is visible in viewport + // ============================================= + + var inViewport = function (elem) { + var elemCenter, rez; + + if (!elem || elem.ownerDocument !== document) { + return false; + } + + $(".fancybox-container").css("pointer-events", "none"); + + elemCenter = { + x: elem.getBoundingClientRect().left + elem.offsetWidth / 2, + y: elem.getBoundingClientRect().top + elem.offsetHeight / 2 + }; + + rez = document.elementFromPoint(elemCenter.x, elemCenter.y) === elem; + + $(".fancybox-container").css("pointer-events", ""); + + return rez; + }; + + // Class definition + // ================ + + var FancyBox = function (content, opts, index) { + var self = this; + + self.opts = mergeOpts({ + index: index + }, $.fancybox.defaults); + + if ($.isPlainObject(opts)) { + self.opts = mergeOpts(self.opts, opts); + } + + if ($.fancybox.isMobile) { + self.opts = mergeOpts(self.opts, self.opts.mobile); + } + + self.id = self.opts.id || ++called; + + self.currIndex = parseInt(self.opts.index, 10) || 0; + self.prevIndex = null; + + self.prevPos = null; + self.currPos = 0; + + self.firstRun = true; + + // All group items + self.group = []; + + // Existing slides (for current, next and previous gallery items) + self.slides = {}; + + // Create group elements + self.addContent(content); + + if (!self.group.length) { + return; + } + + self.init(); + }; + + $.extend(FancyBox.prototype, { + // Create DOM structure + // ==================== + + init: function () { + var self = this, + firstItem = self.group[self.currIndex], + firstItemOpts = firstItem.opts, + $container, + buttonStr; + + if (firstItemOpts.closeExisting) { + $.fancybox.close(true); + } + + // Hide scrollbars + // =============== + + $("body").addClass("fancybox-active"); + + if ( + !$.fancybox.getInstance() && + firstItemOpts.hideScrollbar !== false && + !$.fancybox.isMobile && + document.body.scrollHeight > window.innerHeight + ) { + $("head").append( + '" + ); + + $("body").addClass("compensate-for-scrollbar"); + } + + // Build html markup and set references + // ==================================== + + // Build html code for buttons and insert into main template + buttonStr = ""; + + $.each(firstItemOpts.buttons, function (index, value) { + buttonStr += firstItemOpts.btnTpl[value] || ""; + }); + + // Create markup from base template, it will be initially hidden to + // avoid unnecessary work like painting while initializing is not complete + $container = $( + self.translate( + self, + firstItemOpts.baseTpl + .replace("{{buttons}}", buttonStr) + .replace("{{arrows}}", firstItemOpts.btnTpl.arrowLeft + firstItemOpts.btnTpl.arrowRight) + ) + ) + .attr("id", "fancybox-container-" + self.id) + .addClass(firstItemOpts.baseClass) + .data("FancyBox", self) + .appendTo(firstItemOpts.parentEl); + + // Create object holding references to jQuery wrapped nodes + self.$refs = { + container: $container + }; + + ["bg", "inner", "infobar", "toolbar", "stage", "caption", "navigation"].forEach(function (item) { + self.$refs[item] = $container.find(".fancybox-" + item); + }); + + self.trigger("onInit"); + + // Enable events, deactive previous instances + self.activate(); + + // Build slides, load and reveal content + self.jumpTo(self.currIndex); + }, + + // Simple i18n support - replaces object keys found in template + // with corresponding values + // ============================================================ + + translate: function (obj, str) { + var arr = obj.opts.i18n[obj.opts.lang] || obj.opts.i18n.en; + + return str.replace(/\{\{(\w+)\}\}/g, function (match, n) { + return arr[n] === undefined ? match : arr[n]; + }); + }, + + // Populate current group with fresh content + // Check if each object has valid type and content + // =============================================== + + addContent: function (content) { + var self = this, + items = $.makeArray(content), + thumbs; + + $.each(items, function (i, item) { + var obj = {}, + opts = {}, + $item, + type, + found, + src, + srcParts; + + // Step 1 - Make sure we have an object + // ==================================== + + if ($.isPlainObject(item)) { + // We probably have manual usage here, something like + // $.fancybox.open( [ { src : "image.jpg", type : "image" } ] ) + + obj = item; + opts = item.opts || item; + } else if ($.type(item) === "object" && $(item).length) { + // Here we probably have jQuery collection returned by some selector + $item = $(item); + + // Support attributes like `data-options='{"touch" : false}'` and `data-touch='false'` + opts = $item.data() || {}; + opts = $.extend(true, {}, opts, opts.options); + + // Here we store clicked element + opts.$orig = $item; + + obj.src = self.opts.src || opts.src || $item.attr("href"); + + // Assume that simple syntax is used, for example: + // `$.fancybox.open( $("#test"), {} );` + if (!obj.type && !obj.src) { + obj.type = "inline"; + obj.src = item; + } + } else { + // Assume we have a simple html code, for example: + // $.fancybox.open( '

Hi!

' ); + obj = { + type: "html", + src: item + "" + }; + } + + // Each gallery object has full collection of options + obj.opts = $.extend(true, {}, self.opts, opts); + + // Do not merge buttons array + if ($.isArray(opts.buttons)) { + obj.opts.buttons = opts.buttons; + } + + if ($.fancybox.isMobile && obj.opts.mobile) { + obj.opts = mergeOpts(obj.opts, obj.opts.mobile); + } + + // Step 2 - Make sure we have content type, if not - try to guess + // ============================================================== + + type = obj.type || obj.opts.type; + src = obj.src || ""; + + if (!type && src) { + if ((found = src.match(/\.(mp4|mov|ogv|webm)((\?|#).*)?$/i))) { + type = "video"; + + if (!obj.opts.video.format) { + obj.opts.video.format = "video/" + (found[1] === "ogv" ? "ogg" : found[1]); + } + } else if (src.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i)) { + type = "image"; + } else if (src.match(/\.(pdf)((\?|#).*)?$/i)) { + type = "iframe"; + obj = $.extend(true, obj, { + contentType: "pdf", + opts: { + iframe: { + preload: false + } + } + }); + } else if (src.charAt(0) === "#") { + type = "inline"; + } + } + + if (type) { + obj.type = type; + } else { + self.trigger("objectNeedsType", obj); + } + + if (!obj.contentType) { + obj.contentType = $.inArray(obj.type, ["html", "inline", "ajax"]) > -1 ? "html" : obj.type; + } + + // Step 3 - Some adjustments + // ========================= + + obj.index = self.group.length; + + if (obj.opts.smallBtn == "auto") { + obj.opts.smallBtn = $.inArray(obj.type, ["html", "inline", "ajax"]) > -1; + } + + if (obj.opts.toolbar === "auto") { + obj.opts.toolbar = !obj.opts.smallBtn; + } + + // Find thumbnail image, check if exists and if is in the viewport + obj.$thumb = obj.opts.$thumb || null; + + if (obj.opts.$trigger && obj.index === self.opts.index) { + obj.$thumb = obj.opts.$trigger.find("img:first"); + + if (obj.$thumb.length) { + obj.opts.$orig = obj.opts.$trigger; + } + } + + if (!(obj.$thumb && obj.$thumb.length) && obj.opts.$orig) { + obj.$thumb = obj.opts.$orig.find("img:first"); + } + + if (obj.$thumb && !obj.$thumb.length) { + obj.$thumb = null; + } + + obj.thumb = obj.opts.thumb || (obj.$thumb ? obj.$thumb[0].src : null); + + // "caption" is a "special" option, it can be used to customize caption per gallery item + if ($.type(obj.opts.caption) === "function") { + obj.opts.caption = obj.opts.caption.apply(item, [self, obj]); + } + + if ($.type(self.opts.caption) === "function") { + obj.opts.caption = self.opts.caption.apply(item, [self, obj]); + } + + // Make sure we have caption as a string or jQuery object + if (!(obj.opts.caption instanceof $)) { + obj.opts.caption = obj.opts.caption === undefined ? "" : obj.opts.caption + ""; + } + + // Check if url contains "filter" used to filter the content + // Example: "ajax.html #something" + if (obj.type === "ajax") { + srcParts = src.split(/\s+/, 2); + + if (srcParts.length > 1) { + obj.src = srcParts.shift(); + + obj.opts.filter = srcParts.shift(); + } + } + + // Hide all buttons and disable interactivity for modal items + if (obj.opts.modal) { + obj.opts = $.extend(true, obj.opts, { + trapFocus: true, + // Remove buttons + infobar: 0, + toolbar: 0, + + smallBtn: 0, + + // Disable keyboard navigation + keyboard: 0, + + // Disable some modules + slideShow: 0, + fullScreen: 0, + thumbs: 0, + touch: 0, + + // Disable click event handlers + clickContent: false, + clickSlide: false, + clickOutside: false, + dblclickContent: false, + dblclickSlide: false, + dblclickOutside: false + }); + } + + // Step 4 - Add processed object to group + // ====================================== + + self.group.push(obj); + }); + + // Update controls if gallery is already opened + if (Object.keys(self.slides).length) { + self.updateControls(); + + // Update thumbnails, if needed + thumbs = self.Thumbs; + + if (thumbs && thumbs.isActive) { + thumbs.create(); + + thumbs.focus(); + } + } + }, + + // Attach an event handler functions for: + // - navigation buttons + // - browser scrolling, resizing; + // - focusing + // - keyboard + // - detecting inactivity + // ====================================== + + addEvents: function () { + var self = this; + + self.removeEvents(); + + // Make navigation elements clickable + // ================================== + + self.$refs.container + .on("click.fb-close", "[data-fancybox-close]", function (e) { + e.stopPropagation(); + e.preventDefault(); + + self.close(e); + }) + .on("touchstart.fb-prev click.fb-prev", "[data-fancybox-prev]", function (e) { + e.stopPropagation(); + e.preventDefault(); + + self.previous(); + }) + .on("touchstart.fb-next click.fb-next", "[data-fancybox-next]", function (e) { + e.stopPropagation(); + e.preventDefault(); + + self.next(); + }) + .on("click.fb", "[data-fancybox-zoom]", function (e) { + // Click handler for zoom button + self[self.isScaledDown() ? "scaleToActual" : "scaleToFit"](); + }); + + // Handle page scrolling and browser resizing + // ========================================== + + $W.on("orientationchange.fb resize.fb", function (e) { + if (e && e.originalEvent && e.originalEvent.type === "resize") { + if (self.requestId) { + cancelAFrame(self.requestId); + } + + self.requestId = requestAFrame(function () { + self.update(e); + }); + } else { + if (self.current && self.current.type === "iframe") { + self.$refs.stage.hide(); + } + + setTimeout( + function () { + self.$refs.stage.show(); + + self.update(e); + }, + $.fancybox.isMobile ? 600 : 250 + ); + } + }); + + $D.on("keydown.fb", function (e) { + var instance = $.fancybox ? $.fancybox.getInstance() : null, + current = instance.current, + keycode = e.keyCode || e.which; + + // Trap keyboard focus inside of the modal + // ======================================= + + if (keycode == 9) { + if (current.opts.trapFocus) { + self.focus(e); + } + + return; + } + + // Enable keyboard navigation + // ========================== + + if (!current.opts.keyboard || e.ctrlKey || e.altKey || e.shiftKey || $(e.target).is("input,textarea,video,audio,select")) { + return; + } + + // Backspace and Esc keys + if (keycode === 8 || keycode === 27) { + e.preventDefault(); + + self.close(e); + + return; + } + + // Left arrow and Up arrow + if (keycode === 37 || keycode === 38) { + e.preventDefault(); + + self.previous(); + + return; + } + + // Righ arrow and Down arrow + if (keycode === 39 || keycode === 40) { + e.preventDefault(); + + self.next(); + + return; + } + + self.trigger("afterKeydown", e, keycode); + }); + + // Hide controls after some inactivity period + if (self.group[self.currIndex].opts.idleTime) { + self.idleSecondsCounter = 0; + + $D.on( + "mousemove.fb-idle mouseleave.fb-idle mousedown.fb-idle touchstart.fb-idle touchmove.fb-idle scroll.fb-idle keydown.fb-idle", + function (e) { + self.idleSecondsCounter = 0; + + if (self.isIdle) { + self.showControls(); + } + + self.isIdle = false; + } + ); + + self.idleInterval = window.setInterval(function () { + self.idleSecondsCounter++; + + if (self.idleSecondsCounter >= self.group[self.currIndex].opts.idleTime && !self.isDragging) { + self.isIdle = true; + self.idleSecondsCounter = 0; + + self.hideControls(); + } + }, 1000); + } + }, + + // Remove events added by the core + // =============================== + + removeEvents: function () { + var self = this; + + $W.off("orientationchange.fb resize.fb"); + $D.off("keydown.fb .fb-idle"); + + this.$refs.container.off(".fb-close .fb-prev .fb-next"); + + if (self.idleInterval) { + window.clearInterval(self.idleInterval); + + self.idleInterval = null; + } + }, + + // Change to previous gallery item + // =============================== + + previous: function (duration) { + return this.jumpTo(this.currPos - 1, duration); + }, + + // Change to next gallery item + // =========================== + + next: function (duration) { + return this.jumpTo(this.currPos + 1, duration); + }, + + // Switch to selected gallery item + // =============================== + + jumpTo: function (pos, duration) { + var self = this, + groupLen = self.group.length, + firstRun, + isMoved, + loop, + current, + previous, + slidePos, + stagePos, + prop, + diff; + + if (self.isDragging || self.isClosing || (self.isAnimating && self.firstRun)) { + return; + } + + // Should loop? + pos = parseInt(pos, 10); + loop = self.current ? self.current.opts.loop : self.opts.loop; + + if (!loop && (pos < 0 || pos >= groupLen)) { + return false; + } + + // Check if opening for the first time; this helps to speed things up + firstRun = self.firstRun = !Object.keys(self.slides).length; + + // Create slides + previous = self.current; + + self.prevIndex = self.currIndex; + self.prevPos = self.currPos; + + current = self.createSlide(pos); + + if (groupLen > 1) { + if (loop || current.index < groupLen - 1) { + self.createSlide(pos + 1); + } + + if (loop || current.index > 0) { + self.createSlide(pos - 1); + } + } + + self.current = current; + self.currIndex = current.index; + self.currPos = current.pos; + + self.trigger("beforeShow", firstRun); + + self.updateControls(); + + // Validate duration length + current.forcedDuration = undefined; + + if ($.isNumeric(duration)) { + current.forcedDuration = duration; + } else { + duration = current.opts[firstRun ? "animationDuration" : "transitionDuration"]; + } + + duration = parseInt(duration, 10); + + // Check if user has swiped the slides or if still animating + isMoved = self.isMoved(current); + + // Make sure current slide is visible + current.$slide.addClass("fancybox-slide--current"); + + // Fresh start - reveal container, current slide and start loading content + if (firstRun) { + if (current.opts.animationEffect && duration) { + self.$refs.container.css("transition-duration", duration + "ms"); + } + + self.$refs.container.addClass("fancybox-is-open").trigger("focus"); + + // Attempt to load content into slide + // This will later call `afterLoad` -> `revealContent` + self.loadSlide(current); + + self.preload("image"); + + return; + } + + // Get actual slide/stage positions (before cleaning up) + slidePos = $.fancybox.getTranslate(previous.$slide); + stagePos = $.fancybox.getTranslate(self.$refs.stage); + + // Clean up all slides + $.each(self.slides, function (index, slide) { + $.fancybox.stop(slide.$slide, true); + }); + + if (previous.pos !== current.pos) { + previous.isComplete = false; + } + + previous.$slide.removeClass("fancybox-slide--complete fancybox-slide--current"); + + // If slides are out of place, then animate them to correct position + if (isMoved) { + // Calculate horizontal swipe distance + diff = slidePos.left - (previous.pos * slidePos.width + previous.pos * previous.opts.gutter); + + $.each(self.slides, function (index, slide) { + slide.$slide.removeClass("fancybox-animated").removeClass(function (index, className) { + return (className.match(/(^|\s)fancybox-fx-\S+/g) || []).join(" "); + }); + + // Make sure that each slide is in equal distance + // This is mostly needed for freshly added slides, because they are not yet positioned + var leftPos = slide.pos * slidePos.width + slide.pos * slide.opts.gutter; + + $.fancybox.setTranslate(slide.$slide, { + top: 0, + left: leftPos - stagePos.left + diff + }); + + if (slide.pos !== current.pos) { + slide.$slide.addClass("fancybox-slide--" + (slide.pos > current.pos ? "next" : "previous")); + } + + // Redraw to make sure that transition will start + forceRedraw(slide.$slide); + + // Animate the slide + $.fancybox.animate( + slide.$slide, { + top: 0, + left: (slide.pos - current.pos) * slidePos.width + (slide.pos - current.pos) * slide.opts.gutter + }, + duration, + function () { + slide.$slide + .css({ + transform: "", + opacity: "" + }) + .removeClass("fancybox-slide--next fancybox-slide--previous"); + + if (slide.pos === self.currPos) { + self.complete(); + } + } + ); + }); + } else if (duration && current.opts.transitionEffect) { + // Set transition effect for previously active slide + prop = "fancybox-animated fancybox-fx-" + current.opts.transitionEffect; + + previous.$slide.addClass("fancybox-slide--" + (previous.pos > current.pos ? "next" : "previous")); + + $.fancybox.animate( + previous.$slide, + prop, + duration, + function () { + previous.$slide.removeClass(prop).removeClass("fancybox-slide--next fancybox-slide--previous"); + }, + false + ); + } + + if (current.isLoaded) { + self.revealContent(current); + } else { + self.loadSlide(current); + } + + self.preload("image"); + }, + + // Create new "slide" element + // These are gallery items that are actually added to DOM + // ======================================================= + + createSlide: function (pos) { + var self = this, + $slide, + index; + + index = pos % self.group.length; + index = index < 0 ? self.group.length + index : index; + + if (!self.slides[pos] && self.group[index]) { + $slide = $('
').appendTo(self.$refs.stage); + + self.slides[pos] = $.extend(true, {}, self.group[index], { + pos: pos, + $slide: $slide, + isLoaded: false + }); + + self.updateSlide(self.slides[pos]); + } + + return self.slides[pos]; + }, + + // Scale image to the actual size of the image; + // x and y values should be relative to the slide + // ============================================== + + scaleToActual: function (x, y, duration) { + var self = this, + current = self.current, + $content = current.$content, + canvasWidth = $.fancybox.getTranslate(current.$slide).width, + canvasHeight = $.fancybox.getTranslate(current.$slide).height, + newImgWidth = current.width, + newImgHeight = current.height, + imgPos, + posX, + posY, + scaleX, + scaleY; + + if (self.isAnimating || self.isMoved() || !$content || !(current.type == "image" && current.isLoaded && !current.hasError)) { + return; + } + + self.isAnimating = true; + + $.fancybox.stop($content); + + x = x === undefined ? canvasWidth * 0.5 : x; + y = y === undefined ? canvasHeight * 0.5 : y; + + imgPos = $.fancybox.getTranslate($content); + + imgPos.top -= $.fancybox.getTranslate(current.$slide).top; + imgPos.left -= $.fancybox.getTranslate(current.$slide).left; + + scaleX = newImgWidth / imgPos.width; + scaleY = newImgHeight / imgPos.height; + + // Get center position for original image + posX = canvasWidth * 0.5 - newImgWidth * 0.5; + posY = canvasHeight * 0.5 - newImgHeight * 0.5; + + // Make sure image does not move away from edges + if (newImgWidth > canvasWidth) { + posX = imgPos.left * scaleX - (x * scaleX - x); + + if (posX > 0) { + posX = 0; + } + + if (posX < canvasWidth - newImgWidth) { + posX = canvasWidth - newImgWidth; + } + } + + if (newImgHeight > canvasHeight) { + posY = imgPos.top * scaleY - (y * scaleY - y); + + if (posY > 0) { + posY = 0; + } + + if (posY < canvasHeight - newImgHeight) { + posY = canvasHeight - newImgHeight; + } + } + + self.updateCursor(newImgWidth, newImgHeight); + + $.fancybox.animate( + $content, { + top: posY, + left: posX, + scaleX: scaleX, + scaleY: scaleY + }, + duration || 366, + function () { + self.isAnimating = false; + } + ); + + // Stop slideshow + if (self.SlideShow && self.SlideShow.isActive) { + self.SlideShow.stop(); + } + }, + + // Scale image to fit inside parent element + // ======================================== + + scaleToFit: function (duration) { + var self = this, + current = self.current, + $content = current.$content, + end; + + if (self.isAnimating || self.isMoved() || !$content || !(current.type == "image" && current.isLoaded && !current.hasError)) { + return; + } + + self.isAnimating = true; + + $.fancybox.stop($content); + + end = self.getFitPos(current); + + self.updateCursor(end.width, end.height); + + $.fancybox.animate( + $content, { + top: end.top, + left: end.left, + scaleX: end.width / $content.width(), + scaleY: end.height / $content.height() + }, + duration || 366, + function () { + self.isAnimating = false; + } + ); + }, + + // Calculate image size to fit inside viewport + // =========================================== + + getFitPos: function (slide) { + var self = this, + $content = slide.$content, + $slide = slide.$slide, + width = slide.width || slide.opts.width, + height = slide.height || slide.opts.height, + maxWidth, + maxHeight, + minRatio, + aspectRatio, + rez = {}; + + if (!slide.isLoaded || !$content || !$content.length) { + return false; + } + + maxWidth = $.fancybox.getTranslate(self.$refs.stage).width; + maxHeight = $.fancybox.getTranslate(self.$refs.stage).height; + + maxWidth -= + parseFloat($slide.css("paddingLeft")) + + parseFloat($slide.css("paddingRight")) + + parseFloat($content.css("marginLeft")) + + parseFloat($content.css("marginRight")); + + maxHeight -= + parseFloat($slide.css("paddingTop")) + + parseFloat($slide.css("paddingBottom")) + + parseFloat($content.css("marginTop")) + + parseFloat($content.css("marginBottom")); + + if (!width || !height) { + width = maxWidth; + height = maxHeight; + } + + minRatio = Math.min(1, maxWidth / width, maxHeight / height); + + width = minRatio * width; + height = minRatio * height; + + // Adjust width/height to precisely fit into container + if (width > maxWidth - 0.5) { + width = maxWidth; + } + + if (height > maxHeight - 0.5) { + height = maxHeight; + } + + if (slide.type === "image") { + rez.top = Math.floor((maxHeight - height) * 0.5) + parseFloat($slide.css("paddingTop")); + rez.left = Math.floor((maxWidth - width) * 0.5) + parseFloat($slide.css("paddingLeft")); + } else if (slide.contentType === "video") { + // Force aspect ratio for the video + // "I say the whole world must learn of our peaceful ways… by force!" + aspectRatio = slide.opts.width && slide.opts.height ? width / height : slide.opts.ratio || 16 / 9; + + if (height > width / aspectRatio) { + height = width / aspectRatio; + } else if (width > height * aspectRatio) { + width = height * aspectRatio; + } + } + + rez.width = width; + rez.height = height; + + return rez; + }, + + // Update content size and position for all slides + // ============================================== + + update: function (e) { + var self = this; + + $.each(self.slides, function (key, slide) { + self.updateSlide(slide, e); + }); + }, + + // Update slide content position and size + // ====================================== + + updateSlide: function (slide, e) { + var self = this, + $content = slide && slide.$content, + width = slide.width || slide.opts.width, + height = slide.height || slide.opts.height, + $slide = slide.$slide; + + // First, prevent caption overlap, if needed + self.adjustCaption(slide); + + // Then resize content to fit inside the slide + if ($content && (width || height || slide.contentType === "video") && !slide.hasError) { + $.fancybox.stop($content); + + $.fancybox.setTranslate($content, self.getFitPos(slide)); + + if (slide.pos === self.currPos) { + self.isAnimating = false; + + self.updateCursor(); + } + } + + // Then some adjustments + self.adjustLayout(slide); + + if ($slide.length) { + $slide.trigger("refresh"); + + if (slide.pos === self.currPos) { + self.$refs.toolbar + .add(self.$refs.navigation.find(".fancybox-button--arrow_right")) + .toggleClass("compensate-for-scrollbar", $slide.get(0).scrollHeight > $slide.get(0).clientHeight); + } + } + + self.trigger("onUpdate", slide, e); + }, + + // Horizontally center slide + // ========================= + + centerSlide: function (duration) { + var self = this, + current = self.current, + $slide = current.$slide; + + if (self.isClosing || !current) { + return; + } + + $slide.siblings().css({ + transform: "", + opacity: "" + }); + + $slide + .parent() + .children() + .removeClass("fancybox-slide--previous fancybox-slide--next"); + + $.fancybox.animate( + $slide, { + top: 0, + left: 0, + opacity: 1 + }, + duration === undefined ? 0 : duration, + function () { + // Clean up + $slide.css({ + transform: "", + opacity: "" + }); + + if (!current.isComplete) { + self.complete(); + } + }, + false + ); + }, + + // Check if current slide is moved (swiped) + // ======================================== + + isMoved: function (slide) { + var current = slide || this.current, + slidePos, + stagePos; + + if (!current) { + return false; + } + + stagePos = $.fancybox.getTranslate(this.$refs.stage); + slidePos = $.fancybox.getTranslate(current.$slide); + + return ( + !current.$slide.hasClass("fancybox-animated") && + (Math.abs(slidePos.top - stagePos.top) > 0.5 || Math.abs(slidePos.left - stagePos.left) > 0.5) + ); + }, + + // Update cursor style depending if content can be zoomed + // ====================================================== + + updateCursor: function (nextWidth, nextHeight) { + var self = this, + current = self.current, + $container = self.$refs.container, + canPan, + isZoomable; + + if (!current || self.isClosing || !self.Guestures) { + return; + } + + $container.removeClass("fancybox-is-zoomable fancybox-can-zoomIn fancybox-can-zoomOut fancybox-can-swipe fancybox-can-pan"); + + canPan = self.canPan(nextWidth, nextHeight); + + isZoomable = canPan ? true : self.isZoomable(); + + $container.toggleClass("fancybox-is-zoomable", isZoomable); + + $("[data-fancybox-zoom]").prop("disabled", !isZoomable); + + if (canPan) { + $container.addClass("fancybox-can-pan"); + } else if ( + isZoomable && + (current.opts.clickContent === "zoom" || ($.isFunction(current.opts.clickContent) && current.opts.clickContent(current) == "zoom")) + ) { + $container.addClass("fancybox-can-zoomIn"); + } else if (current.opts.touch && (current.opts.touch.vertical || self.group.length > 1) && current.contentType !== "video") { + $container.addClass("fancybox-can-swipe"); + } + }, + + // Check if current slide is zoomable + // ================================== + + isZoomable: function () { + var self = this, + current = self.current, + fitPos; + + // Assume that slide is zoomable if: + // - image is still loading + // - actual size of the image is smaller than available area + if (current && !self.isClosing && current.type === "image" && !current.hasError) { + if (!current.isLoaded) { + return true; + } + + fitPos = self.getFitPos(current); + + if (fitPos && (current.width > fitPos.width || current.height > fitPos.height)) { + return true; + } + } + + return false; + }, + + // Check if current image dimensions are smaller than actual + // ========================================================= + + isScaledDown: function (nextWidth, nextHeight) { + var self = this, + rez = false, + current = self.current, + $content = current.$content; + + if (nextWidth !== undefined && nextHeight !== undefined) { + rez = nextWidth < current.width && nextHeight < current.height; + } else if ($content) { + rez = $.fancybox.getTranslate($content); + rez = rez.width < current.width && rez.height < current.height; + } + + return rez; + }, + + // Check if image dimensions exceed parent element + // =============================================== + + canPan: function (nextWidth, nextHeight) { + var self = this, + current = self.current, + pos = null, + rez = false; + + if (current.type === "image" && (current.isComplete || (nextWidth && nextHeight)) && !current.hasError) { + rez = self.getFitPos(current); + + if (nextWidth !== undefined && nextHeight !== undefined) { + pos = { + width: nextWidth, + height: nextHeight + }; + } else if (current.isComplete) { + pos = $.fancybox.getTranslate(current.$content); + } + + if (pos && rez) { + rez = Math.abs(pos.width - rez.width) > 1.5 || Math.abs(pos.height - rez.height) > 1.5; + } + } + + return rez; + }, + + // Load content into the slide + // =========================== + + loadSlide: function (slide) { + var self = this, + type, + $slide, + ajaxLoad; + + if (slide.isLoading || slide.isLoaded) { + return; + } + + slide.isLoading = true; + + if (self.trigger("beforeLoad", slide) === false) { + slide.isLoading = false; + + return false; + } + + type = slide.type; + $slide = slide.$slide; + + $slide + .off("refresh") + .trigger("onReset") + .addClass(slide.opts.slideClass); + + // Create content depending on the type + switch (type) { + case "image": + self.setImage(slide); + + break; + + case "iframe": + self.setIframe(slide); + + break; + + case "html": + self.setContent(slide, slide.src || slide.content); + + break; + + case "video": + self.setContent( + slide, + slide.opts.video.tpl + .replace(/\{\{src\}\}/gi, slide.src) + .replace("{{format}}", slide.opts.videoFormat || slide.opts.video.format || "") + .replace("{{poster}}", slide.thumb || "") + ); + + break; + + case "inline": + if ($(slide.src).length) { + self.setContent(slide, $(slide.src)); + } else { + self.setError(slide); + } + + break; + + case "ajax": + self.showLoading(slide); + + ajaxLoad = $.ajax( + $.extend({}, slide.opts.ajax.settings, { + url: slide.src, + success: function (data, textStatus) { + if (textStatus === "success") { + self.setContent(slide, data); + } + }, + error: function (jqXHR, textStatus) { + if (jqXHR && textStatus !== "abort") { + self.setError(slide); + } + } + }) + ); + + $slide.one("onReset", function () { + ajaxLoad.abort(); + }); + + break; + + default: + self.setError(slide); + + break; + } + + return true; + }, + + // Use thumbnail image, if possible + // ================================ + + setImage: function (slide) { + var self = this, + ghost; + + // Check if need to show loading icon + setTimeout(function () { + var $img = slide.$image; + + if (!self.isClosing && slide.isLoading && (!$img || !$img.length || !$img[0].complete) && !slide.hasError) { + self.showLoading(slide); + } + }, 50); + + //Check if image has srcset + self.checkSrcset(slide); + + // This will be wrapper containing both ghost and actual image + slide.$content = $('
') + .addClass("fancybox-is-hidden") + .appendTo(slide.$slide.addClass("fancybox-slide--image")); + + // If we have a thumbnail, we can display it while actual image is loading + // Users will not stare at black screen and actual image will appear gradually + if (slide.opts.preload !== false && slide.opts.width && slide.opts.height && slide.thumb) { + slide.width = slide.opts.width; + slide.height = slide.opts.height; + + ghost = document.createElement("img"); + + ghost.onerror = function () { + $(this).remove(); + + slide.$ghost = null; + }; + + ghost.onload = function () { + self.afterLoad(slide); + }; + + slide.$ghost = $(ghost) + .addClass("fancybox-image") + .appendTo(slide.$content) + .attr("src", slide.thumb); + } + + // Start loading actual image + self.setBigImage(slide); + }, + + // Check if image has srcset and get the source + // ============================================ + checkSrcset: function (slide) { + var srcset = slide.opts.srcset || slide.opts.image.srcset, + found, + temp, + pxRatio, + windowWidth; + + // If we have "srcset", then we need to find first matching "src" value. + // This is necessary, because when you set an src attribute, the browser will preload the image + // before any javascript or even CSS is applied. + if (srcset) { + pxRatio = window.devicePixelRatio || 1; + windowWidth = window.innerWidth * pxRatio; + + temp = srcset.split(",").map(function (el) { + var ret = {}; + + el.trim() + .split(/\s+/) + .forEach(function (el, i) { + var value = parseInt(el.substring(0, el.length - 1), 10); + + if (i === 0) { + return (ret.url = el); + } + + if (value) { + ret.value = value; + ret.postfix = el[el.length - 1]; + } + }); + + return ret; + }); + + // Sort by value + temp.sort(function (a, b) { + return a.value - b.value; + }); + + // Ok, now we have an array of all srcset values + for (var j = 0; j < temp.length; j++) { + var el = temp[j]; + + if ((el.postfix === "w" && el.value >= windowWidth) || (el.postfix === "x" && el.value >= pxRatio)) { + found = el; + break; + } + } + + // If not found, take the last one + if (!found && temp.length) { + found = temp[temp.length - 1]; + } + + if (found) { + slide.src = found.url; + + // If we have default width/height values, we can calculate height for matching source + if (slide.width && slide.height && found.postfix == "w") { + slide.height = (slide.width / slide.height) * found.value; + slide.width = found.value; + } + + slide.opts.srcset = srcset; + } + } + }, + + // Create full-size image + // ====================== + + setBigImage: function (slide) { + var self = this, + img = document.createElement("img"), + $img = $(img); + + slide.$image = $img + .one("error", function () { + self.setError(slide); + }) + .one("load", function () { + var sizes; + + if (!slide.$ghost) { + self.resolveImageSlideSize(slide, this.naturalWidth, this.naturalHeight); + + self.afterLoad(slide); + } + + if (self.isClosing) { + return; + } + + if (slide.opts.srcset) { + sizes = slide.opts.sizes; + + if (!sizes || sizes === "auto") { + sizes = + (slide.width / slide.height > 1 && $W.width() / $W.height() > 1 ? "100" : Math.round((slide.width / slide.height) * 100)) + + "vw"; + } + + $img.attr("sizes", sizes).attr("srcset", slide.opts.srcset); + } + + // Hide temporary image after some delay + if (slide.$ghost) { + setTimeout(function () { + if (slide.$ghost && !self.isClosing) { + slide.$ghost.hide(); + } + }, Math.min(300, Math.max(1000, slide.height / 1600))); + } + + self.hideLoading(slide); + }) + .addClass("fancybox-image") + .attr("src", slide.src) + .appendTo(slide.$content); + + if ((img.complete || img.readyState == "complete") && $img.naturalWidth && $img.naturalHeight) { + $img.trigger("load"); + } else if (img.error) { + $img.trigger("error"); + } + }, + + // Computes the slide size from image size and maxWidth/maxHeight + // ============================================================== + + resolveImageSlideSize: function (slide, imgWidth, imgHeight) { + var maxWidth = parseInt(slide.opts.width, 10), + maxHeight = parseInt(slide.opts.height, 10); + + // Sets the default values from the image + slide.width = imgWidth; + slide.height = imgHeight; + + if (maxWidth > 0) { + slide.width = maxWidth; + slide.height = Math.floor((maxWidth * imgHeight) / imgWidth); + } + + if (maxHeight > 0) { + slide.width = Math.floor((maxHeight * imgWidth) / imgHeight); + slide.height = maxHeight; + } + }, + + // Create iframe wrapper, iframe and bindings + // ========================================== + + setIframe: function (slide) { + var self = this, + opts = slide.opts.iframe, + $slide = slide.$slide, + $iframe; + + slide.$content = $('
') + .css(opts.css) + .appendTo($slide); + + $slide.addClass("fancybox-slide--" + slide.contentType); + + slide.$iframe = $iframe = $(opts.tpl.replace(/\{rnd\}/g, new Date().getTime())) + .attr(opts.attr) + .appendTo(slide.$content); + + if (opts.preload) { + self.showLoading(slide); + + // Unfortunately, it is not always possible to determine if iframe is successfully loaded + // (due to browser security policy) + + $iframe.on("load.fb error.fb", function (e) { + this.isReady = 1; + + slide.$slide.trigger("refresh"); + + self.afterLoad(slide); + }); + + // Recalculate iframe content size + // =============================== + + $slide.on("refresh.fb", function () { + var $content = slide.$content, + frameWidth = opts.css.width, + frameHeight = opts.css.height, + $contents, + $body; + + if ($iframe[0].isReady !== 1) { + return; + } + + try { + $contents = $iframe.contents(); + $body = $contents.find("body"); + } catch (ignore) {} + + // Calculate content dimensions, if it is accessible + if ($body && $body.length && $body.children().length) { + // Avoid scrolling to top (if multiple instances) + $slide.css("overflow", "visible"); + + $content.css({ + width: "100%", + "max-width": "100%", + height: "9999px" + }); + + if (frameWidth === undefined) { + frameWidth = Math.ceil(Math.max($body[0].clientWidth, $body.outerWidth(true))); + } + + $content.css("width", frameWidth ? frameWidth : "").css("max-width", ""); + + if (frameHeight === undefined) { + frameHeight = Math.ceil(Math.max($body[0].clientHeight, $body.outerHeight(true))); + } + + $content.css("height", frameHeight ? frameHeight : ""); + + $slide.css("overflow", "auto"); + } + + $content.removeClass("fancybox-is-hidden"); + }); + } else { + self.afterLoad(slide); + } + + $iframe.attr("src", slide.src); + + // Remove iframe if closing or changing gallery item + $slide.one("onReset", function () { + // This helps IE not to throw errors when closing + try { + $(this) + .find("iframe") + .hide() + .unbind() + .attr("src", "//about:blank"); + } catch (ignore) {} + + $(this) + .off("refresh.fb") + .empty(); + + slide.isLoaded = false; + slide.isRevealed = false; + }); + }, + + // Wrap and append content to the slide + // ====================================== + + setContent: function (slide, content) { + var self = this; + + if (self.isClosing) { + return; + } + + self.hideLoading(slide); + + if (slide.$content) { + $.fancybox.stop(slide.$content); + } + + slide.$slide.empty(); + + // If content is a jQuery object, then it will be moved to the slide. + // The placeholder is created so we will know where to put it back. + if (isQuery(content) && content.parent().length) { + // Make sure content is not already moved to fancyBox + if (content.hasClass("fancybox-content") || content.parent().hasClass("fancybox-content")) { + content.parents(".fancybox-slide").trigger("onReset"); + } + + // Create temporary element marking original place of the content + slide.$placeholder = $("
") + .hide() + .insertAfter(content); + + // Make sure content is visible + content.css("display", "inline-block"); + } else if (!slide.hasError) { + // If content is just a plain text, try to convert it to html + if ($.type(content) === "string") { + content = $("
") + .append($.trim(content)) + .contents(); + } + + // If "filter" option is provided, then filter content + if (slide.opts.filter) { + content = $("
") + .html(content) + .find(slide.opts.filter); + } + } + + slide.$slide.one("onReset", function () { + // Pause all html5 video/audio + $(this) + .find("video,audio") + .trigger("pause"); + + // Put content back + if (slide.$placeholder) { + slide.$placeholder.after(content.removeClass("fancybox-content").hide()).remove(); + + slide.$placeholder = null; + } + + // Remove custom close button + if (slide.$smallBtn) { + slide.$smallBtn.remove(); + + slide.$smallBtn = null; + } + + // Remove content and mark slide as not loaded + if (!slide.hasError) { + $(this).empty(); + + slide.isLoaded = false; + slide.isRevealed = false; + } + }); + + $(content).appendTo(slide.$slide); + + if ($(content).is("video,audio")) { + $(content).addClass("fancybox-video"); + + $(content).wrap("
"); + + slide.contentType = "video"; + + slide.opts.width = slide.opts.width || $(content).attr("width"); + slide.opts.height = slide.opts.height || $(content).attr("height"); + } + + slide.$content = slide.$slide + .children() + .filter("div,form,main,video,audio,article,.fancybox-content") + .first(); + + slide.$content.siblings().hide(); + + // Re-check if there is a valid content + // (in some cases, ajax response can contain various elements or plain text) + if (!slide.$content.length) { + slide.$content = slide.$slide + .wrapInner("
") + .children() + .first(); + } + + slide.$content.addClass("fancybox-content"); + + slide.$slide.addClass("fancybox-slide--" + slide.contentType); + + self.afterLoad(slide); + }, + + // Display error message + // ===================== + + setError: function (slide) { + slide.hasError = true; + + slide.$slide + .trigger("onReset") + .removeClass("fancybox-slide--" + slide.contentType) + .addClass("fancybox-slide--error"); + + slide.contentType = "html"; + + this.setContent(slide, this.translate(slide, slide.opts.errorTpl)); + + if (slide.pos === this.currPos) { + this.isAnimating = false; + } + }, + + // Show loading icon inside the slide + // ================================== + + showLoading: function (slide) { + var self = this; + + slide = slide || self.current; + + if (slide && !slide.$spinner) { + slide.$spinner = $(self.translate(self, self.opts.spinnerTpl)) + .appendTo(slide.$slide) + .hide() + .fadeIn("fast"); + } + }, + + // Remove loading icon from the slide + // ================================== + + hideLoading: function (slide) { + var self = this; + + slide = slide || self.current; + + if (slide && slide.$spinner) { + slide.$spinner.stop().remove(); + + delete slide.$spinner; + } + }, + + // Adjustments after slide content has been loaded + // =============================================== + + afterLoad: function (slide) { + var self = this; + + if (self.isClosing) { + return; + } + + slide.isLoading = false; + slide.isLoaded = true; + + self.trigger("afterLoad", slide); + + self.hideLoading(slide); + + // Add small close button + if (slide.opts.smallBtn && (!slide.$smallBtn || !slide.$smallBtn.length)) { + slide.$smallBtn = $(self.translate(slide, slide.opts.btnTpl.smallBtn)).appendTo(slide.$content); + } + + // Disable right click + if (slide.opts.protect && slide.$content && !slide.hasError) { + slide.$content.on("contextmenu.fb", function (e) { + if (e.button == 2) { + e.preventDefault(); + } + + return true; + }); + + // Add fake element on top of the image + // This makes a bit harder for user to select image + if (slide.type === "image") { + $('
').appendTo(slide.$content); + } + } + + self.adjustCaption(slide); + + self.adjustLayout(slide); + + if (slide.pos === self.currPos) { + self.updateCursor(); + } + + self.revealContent(slide); + }, + + // Prevent caption overlap, + // fix css inconsistency across browsers + // ===================================== + + adjustCaption: function (slide) { + var self = this, + current = slide || self.current, + caption = current.opts.caption, + preventOverlap = current.opts.preventCaptionOverlap, + $caption = self.$refs.caption, + $clone, + captionH = false; + + $caption.toggleClass("fancybox-caption--separate", preventOverlap); + + if (preventOverlap && caption && caption.length) { + if (current.pos !== self.currPos) { + $clone = $caption.clone().appendTo($caption.parent()); + + $clone + .children() + .eq(0) + .empty() + .html(caption); + + captionH = $clone.outerHeight(true); + + $clone.empty().remove(); + } else if (self.$caption) { + captionH = self.$caption.outerHeight(true); + } + + current.$slide.css("padding-bottom", captionH || ""); + } + }, + + // Simple hack to fix inconsistency across browsers, described here (affects Edge, too): + // https://bugzilla.mozilla.org/show_bug.cgi?id=748518 + // ==================================================================================== + + adjustLayout: function (slide) { + var self = this, + current = slide || self.current, + scrollHeight, + marginBottom, + inlinePadding, + actualPadding; + + if (current.isLoaded && current.opts.disableLayoutFix !== true) { + current.$content.css("margin-bottom", ""); + + // If we would always set margin-bottom for the content, + // then it would potentially break vertical align + if (current.$content.outerHeight() > current.$slide.height() + 0.5) { + inlinePadding = current.$slide[0].style["padding-bottom"]; + actualPadding = current.$slide.css("padding-bottom"); + + if (parseFloat(actualPadding) > 0) { + scrollHeight = current.$slide[0].scrollHeight; + + current.$slide.css("padding-bottom", 0); + + if (Math.abs(scrollHeight - current.$slide[0].scrollHeight) < 1) { + marginBottom = actualPadding; + } + + current.$slide.css("padding-bottom", inlinePadding); + } + } + + current.$content.css("margin-bottom", marginBottom); + } + }, + + // Make content visible + // This method is called right after content has been loaded or + // user navigates gallery and transition should start + // ============================================================ + + revealContent: function (slide) { + var self = this, + $slide = slide.$slide, + end = false, + start = false, + isMoved = self.isMoved(slide), + isRevealed = slide.isRevealed, + effect, + effectClassName, + duration, + opacity; + + slide.isRevealed = true; + + effect = slide.opts[self.firstRun ? "animationEffect" : "transitionEffect"]; + duration = slide.opts[self.firstRun ? "animationDuration" : "transitionDuration"]; + + duration = parseInt(slide.forcedDuration === undefined ? duration : slide.forcedDuration, 10); + + if (isMoved || slide.pos !== self.currPos || !duration) { + effect = false; + } + + // Check if can zoom + if (effect === "zoom") { + if (slide.pos === self.currPos && duration && slide.type === "image" && !slide.hasError && (start = self.getThumbPos(slide))) { + end = self.getFitPos(slide); + } else { + effect = "fade"; + } + } + + // Zoom animation + // ============== + if (effect === "zoom") { + self.isAnimating = true; + + end.scaleX = end.width / start.width; + end.scaleY = end.height / start.height; + + // Check if we need to animate opacity + opacity = slide.opts.zoomOpacity; + + if (opacity == "auto") { + opacity = Math.abs(slide.width / slide.height - start.width / start.height) > 0.1; + } + + if (opacity) { + start.opacity = 0.1; + end.opacity = 1; + } + + // Draw image at start position + $.fancybox.setTranslate(slide.$content.removeClass("fancybox-is-hidden"), start); + + forceRedraw(slide.$content); + + // Start animation + $.fancybox.animate(slide.$content, end, duration, function () { + self.isAnimating = false; + + self.complete(); + }); + + return; + } + + self.updateSlide(slide); + + // Simply show content if no effect + // ================================ + if (!effect) { + slide.$content.removeClass("fancybox-is-hidden"); + + if (!isRevealed && isMoved && slide.type === "image" && !slide.hasError) { + slide.$content.hide().fadeIn("fast"); + } + + if (slide.pos === self.currPos) { + self.complete(); + } + + return; + } + + // Prepare for CSS transiton + // ========================= + $.fancybox.stop($slide); + + //effectClassName = "fancybox-animated fancybox-slide--" + (slide.pos >= self.prevPos ? "next" : "previous") + " fancybox-fx-" + effect; + effectClassName = "fancybox-slide--" + (slide.pos >= self.prevPos ? "next" : "previous") + " fancybox-animated fancybox-fx-" + effect; + + $slide.addClass(effectClassName).removeClass("fancybox-slide--current"); //.addClass(effectClassName); + + slide.$content.removeClass("fancybox-is-hidden"); + + // Force reflow + forceRedraw($slide); + + if (slide.type !== "image") { + slide.$content.hide().show(0); + } + + $.fancybox.animate( + $slide, + "fancybox-slide--current", + duration, + function () { + $slide.removeClass(effectClassName).css({ + transform: "", + opacity: "" + }); + + if (slide.pos === self.currPos) { + self.complete(); + } + }, + true + ); + }, + + // Check if we can and have to zoom from thumbnail + //================================================ + + getThumbPos: function (slide) { + var rez = false, + $thumb = slide.$thumb, + thumbPos, + btw, + brw, + bbw, + blw; + + if (!$thumb || !inViewport($thumb[0])) { + return false; + } + + thumbPos = $.fancybox.getTranslate($thumb); + + btw = parseFloat($thumb.css("border-top-width") || 0); + brw = parseFloat($thumb.css("border-right-width") || 0); + bbw = parseFloat($thumb.css("border-bottom-width") || 0); + blw = parseFloat($thumb.css("border-left-width") || 0); + + rez = { + top: thumbPos.top + btw, + left: thumbPos.left + blw, + width: thumbPos.width - brw - blw, + height: thumbPos.height - btw - bbw, + scaleX: 1, + scaleY: 1 + }; + + return thumbPos.width > 0 && thumbPos.height > 0 ? rez : false; + }, + + // Final adjustments after current gallery item is moved to position + // and it`s content is loaded + // ================================================================== + + complete: function () { + var self = this, + current = self.current, + slides = {}, + $el; + + if (self.isMoved() || !current.isLoaded) { + return; + } + + if (!current.isComplete) { + current.isComplete = true; + + current.$slide.siblings().trigger("onReset"); + + self.preload("inline"); + + // Trigger any CSS transiton inside the slide + forceRedraw(current.$slide); + + current.$slide.addClass("fancybox-slide--complete"); + + // Remove unnecessary slides + $.each(self.slides, function (key, slide) { + if (slide.pos >= self.currPos - 1 && slide.pos <= self.currPos + 1) { + slides[slide.pos] = slide; + } else if (slide) { + $.fancybox.stop(slide.$slide); + + slide.$slide.off().remove(); + } + }); + + self.slides = slides; + } + + self.isAnimating = false; + + self.updateCursor(); + + self.trigger("afterShow"); + + // Autoplay first html5 video/audio + if (!!current.opts.video.autoStart) { + current.$slide + .find("video,audio") + .filter(":visible:first") + .trigger("play") + .one("ended", function () { + if (Document.exitFullscreen) { + Document.exitFullscreen(); + } else if (this.webkitExitFullscreen) { + this.webkitExitFullscreen(); + } + + self.next(); + }); + } + + // Try to focus on the first focusable element + if (current.opts.autoFocus && current.contentType === "html") { + // Look for the first input with autofocus attribute + $el = current.$content.find("input[autofocus]:enabled:visible:first"); + + if ($el.length) { + $el.trigger("focus"); + } else { + self.focus(null, true); + } + } + + // Avoid jumping + current.$slide.scrollTop(0).scrollLeft(0); + }, + + // Preload next and previous slides + // ================================ + + preload: function (type) { + var self = this, + prev, + next; + + if (self.group.length < 2) { + return; + } + + next = self.slides[self.currPos + 1]; + prev = self.slides[self.currPos - 1]; + + if (prev && prev.type === type) { + self.loadSlide(prev); + } + + if (next && next.type === type) { + self.loadSlide(next); + } + }, + + // Try to find and focus on the first focusable element + // ==================================================== + + focus: function (e, firstRun) { + var self = this, + focusableStr = [ + "a[href]", + "area[href]", + 'input:not([disabled]):not([type="hidden"]):not([aria-hidden])', + "select:not([disabled]):not([aria-hidden])", + "textarea:not([disabled]):not([aria-hidden])", + "button:not([disabled]):not([aria-hidden])", + "iframe", + "object", + "embed", + "video", + "audio", + "[contenteditable]", + '[tabindex]:not([tabindex^="-"])' + ].join(","), + focusableItems, + focusedItemIndex; + + if (self.isClosing) { + return; + } + + if (e || !self.current || !self.current.isComplete) { + // Focus on any element inside fancybox + focusableItems = self.$refs.container.find("*:visible"); + } else { + // Focus inside current slide + focusableItems = self.current.$slide.find("*:visible" + (firstRun ? ":not(.fancybox-close-small)" : "")); + } + + focusableItems = focusableItems.filter(focusableStr).filter(function () { + return $(this).css("visibility") !== "hidden" && !$(this).hasClass("disabled"); + }); + + if (focusableItems.length) { + focusedItemIndex = focusableItems.index(document.activeElement); + + if (e && e.shiftKey) { + // Back tab + if (focusedItemIndex < 0 || focusedItemIndex == 0) { + e.preventDefault(); + + focusableItems.eq(focusableItems.length - 1).trigger("focus"); + } + } else { + // Outside or Forward tab + if (focusedItemIndex < 0 || focusedItemIndex == focusableItems.length - 1) { + if (e) { + e.preventDefault(); + } + + focusableItems.eq(0).trigger("focus"); + } + } + } else { + self.$refs.container.trigger("focus"); + } + }, + + // Activates current instance - brings container to the front and enables keyboard, + // notifies other instances about deactivating + // ================================================================================= + + activate: function () { + var self = this; + + // Deactivate all instances + $(".fancybox-container").each(function () { + var instance = $(this).data("FancyBox"); + + // Skip self and closing instances + if (instance && instance.id !== self.id && !instance.isClosing) { + instance.trigger("onDeactivate"); + + instance.removeEvents(); + + instance.isVisible = false; + } + }); + + self.isVisible = true; + + if (self.current || self.isIdle) { + self.update(); + + self.updateControls(); + } + + self.trigger("onActivate"); + + self.addEvents(); + }, + + // Start closing procedure + // This will start "zoom-out" animation if needed and clean everything up afterwards + // ================================================================================= + + close: function (e, d) { + var self = this, + current = self.current, + effect, + duration, + $content, + domRect, + opacity, + start, + end; + + var done = function () { + self.cleanUp(e); + }; + + if (self.isClosing) { + return false; + } + + self.isClosing = true; + + // If beforeClose callback prevents closing, make sure content is centered + if (self.trigger("beforeClose", e) === false) { + self.isClosing = false; + + requestAFrame(function () { + self.update(); + }); + + return false; + } + + // Remove all events + // If there are multiple instances, they will be set again by "activate" method + self.removeEvents(); + + $content = current.$content; + effect = current.opts.animationEffect; + duration = $.isNumeric(d) ? d : effect ? current.opts.animationDuration : 0; + + current.$slide.removeClass("fancybox-slide--complete fancybox-slide--next fancybox-slide--previous fancybox-animated"); + + if (e !== true) { + $.fancybox.stop(current.$slide); + } else { + effect = false; + } + + // Remove other slides + current.$slide + .siblings() + .trigger("onReset") + .remove(); + + // Trigger animations + if (duration) { + self.$refs.container + .removeClass("fancybox-is-open") + .addClass("fancybox-is-closing") + .css("transition-duration", duration + "ms"); + } + + // Clean up + self.hideLoading(current); + + self.hideControls(true); + + self.updateCursor(); + + // Check if possible to zoom-out + if ( + effect === "zoom" && + !($content && duration && current.type === "image" && !self.isMoved() && !current.hasError && (end = self.getThumbPos(current))) + ) { + effect = "fade"; + } + + if (effect === "zoom") { + $.fancybox.stop($content); + + domRect = $.fancybox.getTranslate($content); + + start = { + top: domRect.top, + left: domRect.left, + scaleX: domRect.width / end.width, + scaleY: domRect.height / end.height, + width: end.width, + height: end.height + }; + + // Check if we need to animate opacity + opacity = current.opts.zoomOpacity; + + if (opacity == "auto") { + opacity = Math.abs(current.width / current.height - end.width / end.height) > 0.1; + } + + if (opacity) { + end.opacity = 0; + } + + $.fancybox.setTranslate($content, start); + + forceRedraw($content); + + $.fancybox.animate($content, end, duration, done); + + return true; + } + + if (effect && duration) { + $.fancybox.animate( + current.$slide.addClass("fancybox-slide--previous").removeClass("fancybox-slide--current"), + "fancybox-animated fancybox-fx-" + effect, + duration, + done + ); + } else { + // If skip animation + if (e === true) { + setTimeout(done, duration); + } else { + done(); + } + } + + return true; + }, + + // Final adjustments after removing the instance + // ============================================= + + cleanUp: function (e) { + var self = this, + instance, + $focus = self.current.opts.$orig, + x, + y; + + self.current.$slide.trigger("onReset"); + + self.$refs.container.empty().remove(); + + self.trigger("afterClose", e); + + // Place back focus + if (!!self.current.opts.backFocus) { + if (!$focus || !$focus.length || !$focus.is(":visible")) { + $focus = self.$trigger; + } + + if ($focus && $focus.length) { + x = window.scrollX; + y = window.scrollY; + + $focus.trigger("focus"); + + $("html, body") + .scrollTop(y) + .scrollLeft(x); + } + } + + self.current = null; + + // Check if there are other instances + instance = $.fancybox.getInstance(); + + if (instance) { + instance.activate(); + } else { + $("body").removeClass("fancybox-active compensate-for-scrollbar"); + + $("#fancybox-style-noscroll").remove(); + } + }, + + // Call callback and trigger an event + // ================================== + + trigger: function (name, slide) { + var args = Array.prototype.slice.call(arguments, 1), + self = this, + obj = slide && slide.opts ? slide : self.current, + rez; + + if (obj) { + args.unshift(obj); + } else { + obj = self; + } + + args.unshift(self); + + if ($.isFunction(obj.opts[name])) { + rez = obj.opts[name].apply(obj, args); + } + + if (rez === false) { + return rez; + } + + if (name === "afterClose" || !self.$refs) { + $D.trigger(name + ".fb", args); + } else { + self.$refs.container.trigger(name + ".fb", args); + } + }, + + // Update infobar values, navigation button states and reveal caption + // ================================================================== + + updateControls: function () { + var self = this, + current = self.current, + index = current.index, + $container = self.$refs.container, + $caption = self.$refs.caption, + caption = current.opts.caption; + + // Recalculate content dimensions + current.$slide.trigger("refresh"); + + // Set caption + if (caption && caption.length) { + self.$caption = $caption; + + $caption + .children() + .eq(0) + .html(caption); + } else { + self.$caption = null; + } + + if (!self.hasHiddenControls && !self.isIdle) { + self.showControls(); + } + + // Update info and navigation elements + $container.find("[data-fancybox-count]").html(self.group.length); + $container.find("[data-fancybox-index]").html(index + 1); + + $container.find("[data-fancybox-prev]").prop("disabled", !current.opts.loop && index <= 0); + $container.find("[data-fancybox-next]").prop("disabled", !current.opts.loop && index >= self.group.length - 1); + + if (current.type === "image") { + // Re-enable buttons; update download button source + $container + .find("[data-fancybox-zoom]") + .show() + .end() + .find("[data-fancybox-download]") + .attr("href", current.opts.image.src || current.src) + .show(); + } else if (current.opts.toolbar) { + $container.find("[data-fancybox-download],[data-fancybox-zoom]").hide(); + } + + // Make sure focus is not on disabled button/element + if ($(document.activeElement).is(":hidden,[disabled]")) { + self.$refs.container.trigger("focus"); + } + }, + + // Hide toolbar and caption + // ======================== + + hideControls: function (andCaption) { + var self = this, + arr = ["infobar", "toolbar", "nav"]; + + if (andCaption || !self.current.opts.preventCaptionOverlap) { + arr.push("caption"); + } + + this.$refs.container.removeClass( + arr + .map(function (i) { + return "fancybox-show-" + i; + }) + .join(" ") + ); + + this.hasHiddenControls = true; + }, + + showControls: function () { + var self = this, + opts = self.current ? self.current.opts : self.opts, + $container = self.$refs.container; + + self.hasHiddenControls = false; + self.idleSecondsCounter = 0; + + $container + .toggleClass("fancybox-show-toolbar", !!(opts.toolbar && opts.buttons)) + .toggleClass("fancybox-show-infobar", !!(opts.infobar && self.group.length > 1)) + .toggleClass("fancybox-show-caption", !!self.$caption) + .toggleClass("fancybox-show-nav", !!(opts.arrows && self.group.length > 1)) + .toggleClass("fancybox-is-modal", !!opts.modal); + }, + + // Toggle toolbar and caption + // ========================== + + toggleControls: function () { + if (this.hasHiddenControls) { + this.showControls(); + } else { + this.hideControls(); + } + } + }); + + $.fancybox = { + version: "3.5.7", + defaults: defaults, + + // Get current instance and execute a command. + // + // Examples of usage: + // + // $instance = $.fancybox.getInstance(); + // $.fancybox.getInstance().jumpTo( 1 ); + // $.fancybox.getInstance( 'jumpTo', 1 ); + // $.fancybox.getInstance( function() { + // console.info( this.currIndex ); + // }); + // ====================================================== + + getInstance: function (command) { + var instance = $('.fancybox-container:not(".fancybox-is-closing"):last').data("FancyBox"), + args = Array.prototype.slice.call(arguments, 1); + + if (instance instanceof FancyBox) { + if ($.type(command) === "string") { + instance[command].apply(instance, args); + } else if ($.type(command) === "function") { + command.apply(instance, args); + } + + return instance; + } + + return false; + }, + + // Create new instance + // =================== + + open: function (items, opts, index) { + return new FancyBox(items, opts, index); + }, + + // Close current or all instances + // ============================== + + close: function (all) { + var instance = this.getInstance(); + + if (instance) { + instance.close(); + + // Try to find and close next instance + if (all === true) { + this.close(all); + } + } + }, + + // Close all instances and unbind all events + // ========================================= + + destroy: function () { + this.close(true); + + $D.add("body").off("click.fb-start", "**"); + }, + + // Try to detect mobile devices + // ============================ + + isMobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent), + + // Detect if 'translate3d' support is available + // ============================================ + + use3d: (function () { + var div = document.createElement("div"); + + return ( + window.getComputedStyle && + window.getComputedStyle(div) && + window.getComputedStyle(div).getPropertyValue("transform") && + !(document.documentMode && document.documentMode < 11) + ); + })(), + + // Helper function to get current visual state of an element + // returns array[ top, left, horizontal-scale, vertical-scale, opacity ] + // ===================================================================== + + getTranslate: function ($el) { + var domRect; + + if (!$el || !$el.length) { + return false; + } + + domRect = $el[0].getBoundingClientRect(); + + return { + top: domRect.top || 0, + left: domRect.left || 0, + width: domRect.width, + height: domRect.height, + opacity: parseFloat($el.css("opacity")) + }; + }, + + // Shortcut for setting "translate3d" properties for element + // Can set be used to set opacity, too + // ======================================================== + + setTranslate: function ($el, props) { + var str = "", + css = {}; + + if (!$el || !props) { + return; + } + + if (props.left !== undefined || props.top !== undefined) { + str = + (props.left === undefined ? $el.position().left : props.left) + + "px, " + + (props.top === undefined ? $el.position().top : props.top) + + "px"; + + if (this.use3d) { + str = "translate3d(" + str + ", 0px)"; + } else { + str = "translate(" + str + ")"; + } + } + + if (props.scaleX !== undefined && props.scaleY !== undefined) { + str += " scale(" + props.scaleX + ", " + props.scaleY + ")"; + } else if (props.scaleX !== undefined) { + str += " scaleX(" + props.scaleX + ")"; + } + + if (str.length) { + css.transform = str; + } + + if (props.opacity !== undefined) { + css.opacity = props.opacity; + } + + if (props.width !== undefined) { + css.width = props.width; + } + + if (props.height !== undefined) { + css.height = props.height; + } + + return $el.css(css); + }, + + // Simple CSS transition handler + // ============================= + + animate: function ($el, to, duration, callback, leaveAnimationName) { + var self = this, + from; + + if ($.isFunction(duration)) { + callback = duration; + duration = null; + } + + self.stop($el); + + from = self.getTranslate($el); + + $el.on(transitionEnd, function (e) { + // Skip events from child elements and z-index change + if (e && e.originalEvent && (!$el.is(e.originalEvent.target) || e.originalEvent.propertyName == "z-index")) { + return; + } + + self.stop($el); + + if ($.isNumeric(duration)) { + $el.css("transition-duration", ""); + } + + if ($.isPlainObject(to)) { + if (to.scaleX !== undefined && to.scaleY !== undefined) { + self.setTranslate($el, { + top: to.top, + left: to.left, + width: from.width * to.scaleX, + height: from.height * to.scaleY, + scaleX: 1, + scaleY: 1 + }); + } + } else if (leaveAnimationName !== true) { + $el.removeClass(to); + } + + if ($.isFunction(callback)) { + callback(e); + } + }); + + if ($.isNumeric(duration)) { + $el.css("transition-duration", duration + "ms"); + } + + // Start animation by changing CSS properties or class name + if ($.isPlainObject(to)) { + if (to.scaleX !== undefined && to.scaleY !== undefined) { + delete to.width; + delete to.height; + + if ($el.parent().hasClass("fancybox-slide--image")) { + $el.parent().addClass("fancybox-is-scaling"); + } + } + + $.fancybox.setTranslate($el, to); + } else { + $el.addClass(to); + } + + // Make sure that `transitionend` callback gets fired + $el.data( + "timer", + setTimeout(function () { + $el.trigger(transitionEnd); + }, duration + 33) + ); + }, + + stop: function ($el, callCallback) { + if ($el && $el.length) { + clearTimeout($el.data("timer")); + + if (callCallback) { + $el.trigger(transitionEnd); + } + + $el.off(transitionEnd).css("transition-duration", ""); + + $el.parent().removeClass("fancybox-is-scaling"); + } + } + }; + + // Default click handler for "fancyboxed" links + // ============================================ + + function _run(e, opts) { + var items = [], + index = 0, + $target, + value, + instance; + + // Avoid opening multiple times + if (e && e.isDefaultPrevented()) { + return; + } + + e.preventDefault(); + + opts = opts || {}; + + if (e && e.data) { + opts = mergeOpts(e.data.options, opts); + } + + $target = opts.$target || $(e.currentTarget).trigger("blur"); + instance = $.fancybox.getInstance(); + + if (instance && instance.$trigger && instance.$trigger.is($target)) { + return; + } + + if (opts.selector) { + items = $(opts.selector); + } else { + // Get all related items and find index for clicked one + value = $target.attr("data-fancybox") || ""; + + if (value) { + items = e.data ? e.data.items : []; + items = items.length ? items.filter('[data-fancybox="' + value + '"]') : $('[data-fancybox="' + value + '"]'); + } else { + items = [$target]; + } + } + + index = $(items).index($target); + + // Sometimes current item can not be found + if (index < 0) { + index = 0; + } + + instance = $.fancybox.open(items, opts, index); + + // Save last active element + instance.$trigger = $target; + } + + // Create a jQuery plugin + // ====================== + + $.fn.fancybox = function (options) { + var selector; + + options = options || {}; + selector = options.selector || false; + + if (selector) { + // Use body element instead of document so it executes first + $("body") + .off("click.fb-start", selector) + .on("click.fb-start", selector, { + options: options + }, _run); + } else { + this.off("click.fb-start").on( + "click.fb-start", { + items: this, + options: options + }, + _run + ); + } + + return this; + }; + + // Self initializing plugin for all elements having `data-fancybox` attribute + // ========================================================================== + + $D.on("click.fb-start", "[data-fancybox]", _run); + + // Enable "trigger elements" + // ========================= + + $D.on("click.fb-start", "[data-fancybox-trigger]", function (e) { + $('[data-fancybox="' + $(this).attr("data-fancybox-trigger") + '"]') + .eq($(this).attr("data-fancybox-index") || 0) + .trigger("click.fb-start", { + $trigger: $(this) + }); + }); + + // Track focus event for better accessibility styling + // ================================================== + (function () { + var buttonStr = ".fancybox-button", + focusStr = "fancybox-focus", + $pressed = null; + + $D.on("mousedown mouseup focus blur", buttonStr, function (e) { + switch (e.type) { + case "mousedown": + $pressed = $(this); + break; + case "mouseup": + $pressed = null; + break; + case "focusin": + $(buttonStr).removeClass(focusStr); + + if (!$(this).is($pressed) && !$(this).is("[disabled]")) { + $(this).addClass(focusStr); + } + break; + case "focusout": + $(buttonStr).removeClass(focusStr); + break; + } + }); + })(); +})(window, document, jQuery); +// ========================================================================== +// +// Media +// Adds additional media type support +// +// ========================================================================== +(function ($) { + "use strict"; + + // Object containing properties for each media type + var defaults = { + youtube: { + matcher: /(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(watch\?(.*&)?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*))(.*)/i, + params: { + autoplay: 1, + autohide: 1, + fs: 1, + rel: 0, + hd: 1, + wmode: "transparent", + enablejsapi: 1, + html5: 1 + }, + paramPlace: 8, + type: "iframe", + url: "https://www.youtube-nocookie.com/embed/$4", + thumb: "https://img.youtube.com/vi/$4/hqdefault.jpg" + }, + + vimeo: { + matcher: /^.+vimeo.com\/(.*\/)?([\d]+)(.*)?/, + params: { + autoplay: 1, + hd: 1, + show_title: 1, + show_byline: 1, + show_portrait: 0, + fullscreen: 1 + }, + paramPlace: 3, + type: "iframe", + url: "//player.vimeo.com/video/$2" + }, + + instagram: { + matcher: /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i, + type: "image", + url: "//$1/p/$2/media/?size=l" + }, + + // Examples: + // http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16 + // https://www.google.com/maps/@37.7852006,-122.4146355,14.65z + // https://www.google.com/maps/@52.2111123,2.9237542,6.61z?hl=en + // https://www.google.com/maps/place/Googleplex/@37.4220041,-122.0833494,17z/data=!4m5!3m4!1s0x0:0x6c296c66619367e0!8m2!3d37.4219998!4d-122.0840572 + gmap_place: { + matcher: /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(((maps\/(place\/(.*)\/)?\@(.*),(\d+.?\d+?)z))|(\?ll=))(.*)?/i, + type: "iframe", + url: function (rez) { + return ( + "//maps.google." + + rez[2] + + "/?ll=" + + (rez[9] ? rez[9] + "&z=" + Math.floor(rez[10]) + (rez[12] ? rez[12].replace(/^\//, "&") : "") : rez[12] + "").replace(/\?/, "&") + + "&output=" + + (rez[12] && rez[12].indexOf("layer=c") > 0 ? "svembed" : "embed") + ); + } + }, + + // Examples: + // https://www.google.com/maps/search/Empire+State+Building/ + // https://www.google.com/maps/search/?api=1&query=centurylink+field + // https://www.google.com/maps/search/?api=1&query=47.5951518,-122.3316393 + gmap_search: { + matcher: /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(maps\/search\/)(.*)/i, + type: "iframe", + url: function (rez) { + return "//maps.google." + rez[2] + "/maps?q=" + rez[5].replace("query=", "q=").replace("api=1", "") + "&output=embed"; + } + } + }; + + // Formats matching url to final form + var format = function (url, rez, params) { + if (!url) { + return; + } + + params = params || ""; + + if ($.type(params) === "object") { + params = $.param(params, true); + } + + $.each(rez, function (key, value) { + url = url.replace("$" + key, value || ""); + }); + + if (params.length) { + url += (url.indexOf("?") > 0 ? "&" : "?") + params; + } + + return url; + }; + + $(document).on("objectNeedsType.fb", function (e, instance, item) { + var url = item.src || "", + type = false, + media, + thumb, + rez, + params, + urlParams, + paramObj, + provider; + + media = $.extend(true, {}, defaults, item.opts.media); + + // Look for any matching media type + $.each(media, function (providerName, providerOpts) { + rez = url.match(providerOpts.matcher); + + if (!rez) { + return; + } + + type = providerOpts.type; + provider = providerName; + paramObj = {}; + + if (providerOpts.paramPlace && rez[providerOpts.paramPlace]) { + urlParams = rez[providerOpts.paramPlace]; + + if (urlParams[0] == "?") { + urlParams = urlParams.substring(1); + } + + urlParams = urlParams.split("&"); + + for (var m = 0; m < urlParams.length; ++m) { + var p = urlParams[m].split("=", 2); + + if (p.length == 2) { + paramObj[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " ")); + } + } + } + + params = $.extend(true, {}, providerOpts.params, item.opts[providerName], paramObj); + + url = + $.type(providerOpts.url) === "function" ? providerOpts.url.call(this, rez, params, item) : format(providerOpts.url, rez, params); + + thumb = + $.type(providerOpts.thumb) === "function" ? providerOpts.thumb.call(this, rez, params, item) : format(providerOpts.thumb, rez); + + if (providerName === "youtube") { + url = url.replace(/&t=((\d+)m)?(\d+)s/, function (match, p1, m, s) { + return "&start=" + ((m ? parseInt(m, 10) * 60 : 0) + parseInt(s, 10)); + }); + } else if (providerName === "vimeo") { + url = url.replace("&%23", "#"); + } + + return false; + }); + + // If it is found, then change content type and update the url + + if (type) { + if (!item.opts.thumb && !(item.opts.$thumb && item.opts.$thumb.length)) { + item.opts.thumb = thumb; + } + + if (type === "iframe") { + item.opts = $.extend(true, item.opts, { + iframe: { + preload: false, + attr: { + scrolling: "no" + } + } + }); + } + + $.extend(item, { + type: type, + src: url, + origSrc: item.src, + contentSource: provider, + contentType: type === "image" ? "image" : provider == "gmap_place" || provider == "gmap_search" ? "map" : "video" + }); + } else if (url) { + item.type = item.opts.defaultType; + } + }); + + // Load YouTube/Video API on request to detect when video finished playing + var VideoAPILoader = { + youtube: { + src: "https://www.youtube.com/iframe_api", + class: "YT", + loading: false, + loaded: false + }, + + vimeo: { + src: "https://player.vimeo.com/api/player.js", + class: "Vimeo", + loading: false, + loaded: false + }, + + load: function (vendor) { + var _this = this, + script; + + if (this[vendor].loaded) { + setTimeout(function () { + _this.done(vendor); + }); + return; + } + + if (this[vendor].loading) { + return; + } + + this[vendor].loading = true; + + script = document.createElement("script"); + script.type = "text/javascript"; + script.src = this[vendor].src; + + if (vendor === "youtube") { + window.onYouTubeIframeAPIReady = function () { + _this[vendor].loaded = true; + _this.done(vendor); + }; + } else { + script.onload = function () { + _this[vendor].loaded = true; + _this.done(vendor); + }; + } + + document.body.appendChild(script); + }, + done: function (vendor) { + var instance, $el, player; + + if (vendor === "youtube") { + delete window.onYouTubeIframeAPIReady; + } + + instance = $.fancybox.getInstance(); + + if (instance) { + $el = instance.current.$content.find("iframe"); + + if (vendor === "youtube" && YT !== undefined && YT) { + player = new YT.Player($el.attr("id"), { + events: { + onStateChange: function (e) { + if (e.data == 0) { + instance.next(); + } + } + } + }); + } else if (vendor === "vimeo" && Vimeo !== undefined && Vimeo) { + player = new Vimeo.Player($el); + + player.on("ended", function () { + instance.next(); + }); + } + } + } + }; + + $(document).on({ + "afterShow.fb": function (e, instance, current) { + if (instance.group.length > 1 && (current.contentSource === "youtube" || current.contentSource === "vimeo")) { + VideoAPILoader.load(current.contentSource); + } + } + }); +})(jQuery); +// ========================================================================== +// +// Guestures +// Adds touch guestures, handles click and tap events +// +// ========================================================================== +(function (window, document, $) { + "use strict"; + + var requestAFrame = (function () { + return ( + window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + // if all else fails, use setTimeout + function (callback) { + return window.setTimeout(callback, 1000 / 60); + } + ); + })(); + + var cancelAFrame = (function () { + return ( + window.cancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.mozCancelAnimationFrame || + window.oCancelAnimationFrame || + function (id) { + window.clearTimeout(id); + } + ); + })(); + + var getPointerXY = function (e) { + var result = []; + + e = e.originalEvent || e || window.e; + e = e.touches && e.touches.length ? e.touches : e.changedTouches && e.changedTouches.length ? e.changedTouches : [e]; + + for (var key in e) { + if (e[key].pageX) { + result.push({ + x: e[key].pageX, + y: e[key].pageY + }); + } else if (e[key].clientX) { + result.push({ + x: e[key].clientX, + y: e[key].clientY + }); + } + } + + return result; + }; + + var distance = function (point2, point1, what) { + if (!point1 || !point2) { + return 0; + } + + if (what === "x") { + return point2.x - point1.x; + } else if (what === "y") { + return point2.y - point1.y; + } + + return Math.sqrt(Math.pow(point2.x - point1.x, 2) + Math.pow(point2.y - point1.y, 2)); + }; + + var isClickable = function ($el) { + if ( + $el.is('a,area,button,[role="button"],input,label,select,summary,textarea,video,audio,iframe') || + $.isFunction($el.get(0).onclick) || + $el.data("selectable") + ) { + return true; + } + + // Check for attributes like data-fancybox-next or data-fancybox-close + for (var i = 0, atts = $el[0].attributes, n = atts.length; i < n; i++) { + if (atts[i].nodeName.substr(0, 14) === "data-fancybox-") { + return true; + } + } + + return false; + }; + + var hasScrollbars = function (el) { + var overflowY = window.getComputedStyle(el)["overflow-y"], + overflowX = window.getComputedStyle(el)["overflow-x"], + vertical = (overflowY === "scroll" || overflowY === "auto") && el.scrollHeight > el.clientHeight, + horizontal = (overflowX === "scroll" || overflowX === "auto") && el.scrollWidth > el.clientWidth; + + return vertical || horizontal; + }; + + var isScrollable = function ($el) { + var rez = false; + + while (true) { + rez = hasScrollbars($el.get(0)); + + if (rez) { + break; + } + + $el = $el.parent(); + + if (!$el.length || $el.hasClass("fancybox-stage") || $el.is("body")) { + break; + } + } + + return rez; + }; + + var Guestures = function (instance) { + var self = this; + + self.instance = instance; + + self.$bg = instance.$refs.bg; + self.$stage = instance.$refs.stage; + self.$container = instance.$refs.container; + + self.destroy(); + + self.$container.on("touchstart.fb.touch mousedown.fb.touch", $.proxy(self, "ontouchstart")); + }; + + Guestures.prototype.destroy = function () { + var self = this; + + self.$container.off(".fb.touch"); + + $(document).off(".fb.touch"); + + if (self.requestId) { + cancelAFrame(self.requestId); + self.requestId = null; + } + + if (self.tapped) { + clearTimeout(self.tapped); + self.tapped = null; + } + }; + + Guestures.prototype.ontouchstart = function (e) { + var self = this, + $target = $(e.target), + instance = self.instance, + current = instance.current, + $slide = current.$slide, + $content = current.$content, + isTouchDevice = e.type == "touchstart"; + + // Do not respond to both (touch and mouse) events + if (isTouchDevice) { + self.$container.off("mousedown.fb.touch"); + } + + // Ignore right click + if (e.originalEvent && e.originalEvent.button == 2) { + return; + } + + // Ignore taping on links, buttons, input elements + if (!$slide.length || !$target.length || isClickable($target) || isClickable($target.parent())) { + return; + } + // Ignore clicks on the scrollbar + if (!$target.is("img") && e.originalEvent.clientX > $target[0].clientWidth + $target.offset().left) { + return; + } + + // Ignore clicks while zooming or closing + if (!current || instance.isAnimating || current.$slide.hasClass("fancybox-animated")) { + e.stopPropagation(); + e.preventDefault(); + + return; + } + + self.realPoints = self.startPoints = getPointerXY(e); + + if (!self.startPoints.length) { + return; + } + + // Allow other scripts to catch touch event if "touch" is set to false + if (current.touch) { + e.stopPropagation(); + } + + self.startEvent = e; + + self.canTap = true; + self.$target = $target; + self.$content = $content; + self.opts = current.opts.touch; + + self.isPanning = false; + self.isSwiping = false; + self.isZooming = false; + self.isScrolling = false; + self.canPan = instance.canPan(); + + self.startTime = new Date().getTime(); + self.distanceX = self.distanceY = self.distance = 0; + + self.canvasWidth = Math.round($slide[0].clientWidth); + self.canvasHeight = Math.round($slide[0].clientHeight); + + self.contentLastPos = null; + self.contentStartPos = $.fancybox.getTranslate(self.$content) || { + top: 0, + left: 0 + }; + self.sliderStartPos = $.fancybox.getTranslate($slide); + + // Since position will be absolute, but we need to make it relative to the stage + self.stagePos = $.fancybox.getTranslate(instance.$refs.stage); + + self.sliderStartPos.top -= self.stagePos.top; + self.sliderStartPos.left -= self.stagePos.left; + + self.contentStartPos.top -= self.stagePos.top; + self.contentStartPos.left -= self.stagePos.left; + + $(document) + .off(".fb.touch") + .on(isTouchDevice ? "touchend.fb.touch touchcancel.fb.touch" : "mouseup.fb.touch mouseleave.fb.touch", $.proxy(self, "ontouchend")) + .on(isTouchDevice ? "touchmove.fb.touch" : "mousemove.fb.touch", $.proxy(self, "ontouchmove")); + + if ($.fancybox.isMobile) { + document.addEventListener("scroll", self.onscroll, true); + } + + // Skip if clicked outside the sliding area + if (!(self.opts || self.canPan) || !($target.is(self.$stage) || self.$stage.find($target).length)) { + if ($target.is(".fancybox-image")) { + e.preventDefault(); + } + + if (!($.fancybox.isMobile && $target.parents(".fancybox-caption").length)) { + return; + } + } + + self.isScrollable = isScrollable($target) || isScrollable($target.parent()); + + // Check if element is scrollable and try to prevent default behavior (scrolling) + if (!($.fancybox.isMobile && self.isScrollable)) { + e.preventDefault(); + } + + // One finger or mouse click - swipe or pan an image + if (self.startPoints.length === 1 || current.hasError) { + if (self.canPan) { + $.fancybox.stop(self.$content); + + self.isPanning = true; + } else { + self.isSwiping = true; + } + + self.$container.addClass("fancybox-is-grabbing"); + } + + // Two fingers - zoom image + if (self.startPoints.length === 2 && current.type === "image" && (current.isLoaded || current.$ghost)) { + self.canTap = false; + self.isSwiping = false; + self.isPanning = false; + + self.isZooming = true; + + $.fancybox.stop(self.$content); + + self.centerPointStartX = (self.startPoints[0].x + self.startPoints[1].x) * 0.5 - $(window).scrollLeft(); + self.centerPointStartY = (self.startPoints[0].y + self.startPoints[1].y) * 0.5 - $(window).scrollTop(); + + self.percentageOfImageAtPinchPointX = (self.centerPointStartX - self.contentStartPos.left) / self.contentStartPos.width; + self.percentageOfImageAtPinchPointY = (self.centerPointStartY - self.contentStartPos.top) / self.contentStartPos.height; + + self.startDistanceBetweenFingers = distance(self.startPoints[0], self.startPoints[1]); + } + }; + + Guestures.prototype.onscroll = function (e) { + var self = this; + + self.isScrolling = true; + + document.removeEventListener("scroll", self.onscroll, true); + }; + + Guestures.prototype.ontouchmove = function (e) { + var self = this; + + // Make sure user has not released over iframe or disabled element + if (e.originalEvent.buttons !== undefined && e.originalEvent.buttons === 0) { + self.ontouchend(e); + return; + } + + if (self.isScrolling) { + self.canTap = false; + return; + } + + self.newPoints = getPointerXY(e); + + if (!(self.opts || self.canPan) || !self.newPoints.length || !self.newPoints.length) { + return; + } + + if (!(self.isSwiping && self.isSwiping === true)) { + e.preventDefault(); + } + + self.distanceX = distance(self.newPoints[0], self.startPoints[0], "x"); + self.distanceY = distance(self.newPoints[0], self.startPoints[0], "y"); + + self.distance = distance(self.newPoints[0], self.startPoints[0]); + + // Skip false ontouchmove events (Chrome) + if (self.distance > 0) { + if (self.isSwiping) { + self.onSwipe(e); + } else if (self.isPanning) { + self.onPan(); + } else if (self.isZooming) { + self.onZoom(); + } + } + }; + + Guestures.prototype.onSwipe = function (e) { + var self = this, + instance = self.instance, + swiping = self.isSwiping, + left = self.sliderStartPos.left || 0, + angle; + + // If direction is not yet determined + if (swiping === true) { + // We need at least 10px distance to correctly calculate an angle + if (Math.abs(self.distance) > 10) { + self.canTap = false; + + if (instance.group.length < 2 && self.opts.vertical) { + self.isSwiping = "y"; + } else if (instance.isDragging || self.opts.vertical === false || (self.opts.vertical === "auto" && $(window).width() > 800)) { + self.isSwiping = "x"; + } else { + angle = Math.abs((Math.atan2(self.distanceY, self.distanceX) * 180) / Math.PI); + + self.isSwiping = angle > 45 && angle < 135 ? "y" : "x"; + } + + if (self.isSwiping === "y" && $.fancybox.isMobile && self.isScrollable) { + self.isScrolling = true; + + return; + } + + instance.isDragging = self.isSwiping; + + // Reset points to avoid jumping, because we dropped first swipes to calculate the angle + self.startPoints = self.newPoints; + + $.each(instance.slides, function (index, slide) { + var slidePos, stagePos; + + $.fancybox.stop(slide.$slide); + + slidePos = $.fancybox.getTranslate(slide.$slide); + stagePos = $.fancybox.getTranslate(instance.$refs.stage); + + slide.$slide + .css({ + transform: "", + opacity: "", + "transition-duration": "" + }) + .removeClass("fancybox-animated") + .removeClass(function (index, className) { + return (className.match(/(^|\s)fancybox-fx-\S+/g) || []).join(" "); + }); + + if (slide.pos === instance.current.pos) { + self.sliderStartPos.top = slidePos.top - stagePos.top; + self.sliderStartPos.left = slidePos.left - stagePos.left; + } + + $.fancybox.setTranslate(slide.$slide, { + top: slidePos.top - stagePos.top, + left: slidePos.left - stagePos.left + }); + }); + + // Stop slideshow + if (instance.SlideShow && instance.SlideShow.isActive) { + instance.SlideShow.stop(); + } + } + + return; + } + + // Sticky edges + if (swiping == "x") { + if ( + self.distanceX > 0 && + (self.instance.group.length < 2 || (self.instance.current.index === 0 && !self.instance.current.opts.loop)) + ) { + left = left + Math.pow(self.distanceX, 0.8); + } else if ( + self.distanceX < 0 && + (self.instance.group.length < 2 || + (self.instance.current.index === self.instance.group.length - 1 && !self.instance.current.opts.loop)) + ) { + left = left - Math.pow(-self.distanceX, 0.8); + } else { + left = left + self.distanceX; + } + } + + self.sliderLastPos = { + top: swiping == "x" ? 0 : self.sliderStartPos.top + self.distanceY, + left: left + }; + + if (self.requestId) { + cancelAFrame(self.requestId); + + self.requestId = null; + } + + self.requestId = requestAFrame(function () { + if (self.sliderLastPos) { + $.each(self.instance.slides, function (index, slide) { + var pos = slide.pos - self.instance.currPos; + + $.fancybox.setTranslate(slide.$slide, { + top: self.sliderLastPos.top, + left: self.sliderLastPos.left + pos * self.canvasWidth + pos * slide.opts.gutter + }); + }); + + self.$container.addClass("fancybox-is-sliding"); + } + }); + }; + + Guestures.prototype.onPan = function () { + var self = this; + + // Prevent accidental movement (sometimes, when tapping casually, finger can move a bit) + if (distance(self.newPoints[0], self.realPoints[0]) < ($.fancybox.isMobile ? 10 : 5)) { + self.startPoints = self.newPoints; + return; + } + + self.canTap = false; + + self.contentLastPos = self.limitMovement(); + + if (self.requestId) { + cancelAFrame(self.requestId); + } + + self.requestId = requestAFrame(function () { + $.fancybox.setTranslate(self.$content, self.contentLastPos); + }); + }; + + // Make panning sticky to the edges + Guestures.prototype.limitMovement = function () { + var self = this; + + var canvasWidth = self.canvasWidth; + var canvasHeight = self.canvasHeight; + + var distanceX = self.distanceX; + var distanceY = self.distanceY; + + var contentStartPos = self.contentStartPos; + + var currentOffsetX = contentStartPos.left; + var currentOffsetY = contentStartPos.top; + + var currentWidth = contentStartPos.width; + var currentHeight = contentStartPos.height; + + var minTranslateX, minTranslateY, maxTranslateX, maxTranslateY, newOffsetX, newOffsetY; + + if (currentWidth > canvasWidth) { + newOffsetX = currentOffsetX + distanceX; + } else { + newOffsetX = currentOffsetX; + } + + newOffsetY = currentOffsetY + distanceY; + + // Slow down proportionally to traveled distance + minTranslateX = Math.max(0, canvasWidth * 0.5 - currentWidth * 0.5); + minTranslateY = Math.max(0, canvasHeight * 0.5 - currentHeight * 0.5); + + maxTranslateX = Math.min(canvasWidth - currentWidth, canvasWidth * 0.5 - currentWidth * 0.5); + maxTranslateY = Math.min(canvasHeight - currentHeight, canvasHeight * 0.5 - currentHeight * 0.5); + + // -> + if (distanceX > 0 && newOffsetX > minTranslateX) { + newOffsetX = minTranslateX - 1 + Math.pow(-minTranslateX + currentOffsetX + distanceX, 0.8) || 0; + } + + // <- + if (distanceX < 0 && newOffsetX < maxTranslateX) { + newOffsetX = maxTranslateX + 1 - Math.pow(maxTranslateX - currentOffsetX - distanceX, 0.8) || 0; + } + + // \/ + if (distanceY > 0 && newOffsetY > minTranslateY) { + newOffsetY = minTranslateY - 1 + Math.pow(-minTranslateY + currentOffsetY + distanceY, 0.8) || 0; + } + + // /\ + if (distanceY < 0 && newOffsetY < maxTranslateY) { + newOffsetY = maxTranslateY + 1 - Math.pow(maxTranslateY - currentOffsetY - distanceY, 0.8) || 0; + } + + return { + top: newOffsetY, + left: newOffsetX + }; + }; + + Guestures.prototype.limitPosition = function (newOffsetX, newOffsetY, newWidth, newHeight) { + var self = this; + + var canvasWidth = self.canvasWidth; + var canvasHeight = self.canvasHeight; + + if (newWidth > canvasWidth) { + newOffsetX = newOffsetX > 0 ? 0 : newOffsetX; + newOffsetX = newOffsetX < canvasWidth - newWidth ? canvasWidth - newWidth : newOffsetX; + } else { + // Center horizontally + newOffsetX = Math.max(0, canvasWidth / 2 - newWidth / 2); + } + + if (newHeight > canvasHeight) { + newOffsetY = newOffsetY > 0 ? 0 : newOffsetY; + newOffsetY = newOffsetY < canvasHeight - newHeight ? canvasHeight - newHeight : newOffsetY; + } else { + // Center vertically + newOffsetY = Math.max(0, canvasHeight / 2 - newHeight / 2); + } + + return { + top: newOffsetY, + left: newOffsetX + }; + }; + + Guestures.prototype.onZoom = function () { + var self = this; + + // Calculate current distance between points to get pinch ratio and new width and height + var contentStartPos = self.contentStartPos; + + var currentWidth = contentStartPos.width; + var currentHeight = contentStartPos.height; + + var currentOffsetX = contentStartPos.left; + var currentOffsetY = contentStartPos.top; + + var endDistanceBetweenFingers = distance(self.newPoints[0], self.newPoints[1]); + + var pinchRatio = endDistanceBetweenFingers / self.startDistanceBetweenFingers; + + var newWidth = Math.floor(currentWidth * pinchRatio); + var newHeight = Math.floor(currentHeight * pinchRatio); + + // This is the translation due to pinch-zooming + var translateFromZoomingX = (currentWidth - newWidth) * self.percentageOfImageAtPinchPointX; + var translateFromZoomingY = (currentHeight - newHeight) * self.percentageOfImageAtPinchPointY; + + // Point between the two touches + var centerPointEndX = (self.newPoints[0].x + self.newPoints[1].x) / 2 - $(window).scrollLeft(); + var centerPointEndY = (self.newPoints[0].y + self.newPoints[1].y) / 2 - $(window).scrollTop(); + + // And this is the translation due to translation of the centerpoint + // between the two fingers + var translateFromTranslatingX = centerPointEndX - self.centerPointStartX; + var translateFromTranslatingY = centerPointEndY - self.centerPointStartY; + + // The new offset is the old/current one plus the total translation + var newOffsetX = currentOffsetX + (translateFromZoomingX + translateFromTranslatingX); + var newOffsetY = currentOffsetY + (translateFromZoomingY + translateFromTranslatingY); + + var newPos = { + top: newOffsetY, + left: newOffsetX, + scaleX: pinchRatio, + scaleY: pinchRatio + }; + + self.canTap = false; + + self.newWidth = newWidth; + self.newHeight = newHeight; + + self.contentLastPos = newPos; + + if (self.requestId) { + cancelAFrame(self.requestId); + } + + self.requestId = requestAFrame(function () { + $.fancybox.setTranslate(self.$content, self.contentLastPos); + }); + }; + + Guestures.prototype.ontouchend = function (e) { + var self = this; + + var swiping = self.isSwiping; + var panning = self.isPanning; + var zooming = self.isZooming; + var scrolling = self.isScrolling; + + self.endPoints = getPointerXY(e); + self.dMs = Math.max(new Date().getTime() - self.startTime, 1); + + self.$container.removeClass("fancybox-is-grabbing"); + + $(document).off(".fb.touch"); + + document.removeEventListener("scroll", self.onscroll, true); + + if (self.requestId) { + cancelAFrame(self.requestId); + + self.requestId = null; + } + + self.isSwiping = false; + self.isPanning = false; + self.isZooming = false; + self.isScrolling = false; + + self.instance.isDragging = false; + + if (self.canTap) { + return self.onTap(e); + } + + self.speed = 100; + + // Speed in px/ms + self.velocityX = (self.distanceX / self.dMs) * 0.5; + self.velocityY = (self.distanceY / self.dMs) * 0.5; + + if (panning) { + self.endPanning(); + } else if (zooming) { + self.endZooming(); + } else { + self.endSwiping(swiping, scrolling); + } + + return; + }; + + Guestures.prototype.endSwiping = function (swiping, scrolling) { + var self = this, + ret = false, + len = self.instance.group.length, + distanceX = Math.abs(self.distanceX), + canAdvance = swiping == "x" && len > 1 && ((self.dMs > 130 && distanceX > 10) || distanceX > 50), + speedX = 300; + + self.sliderLastPos = null; + + // Close if swiped vertically / navigate if horizontally + if (swiping == "y" && !scrolling && Math.abs(self.distanceY) > 50) { + // Continue vertical movement + $.fancybox.animate( + self.instance.current.$slide, { + top: self.sliderStartPos.top + self.distanceY + self.velocityY * 150, + opacity: 0 + }, + 200 + ); + ret = self.instance.close(true, 250); + } else if (canAdvance && self.distanceX > 0) { + ret = self.instance.previous(speedX); + } else if (canAdvance && self.distanceX < 0) { + ret = self.instance.next(speedX); + } + + if (ret === false && (swiping == "x" || swiping == "y")) { + self.instance.centerSlide(200); + } + + self.$container.removeClass("fancybox-is-sliding"); + }; + + // Limit panning from edges + // ======================== + Guestures.prototype.endPanning = function () { + var self = this, + newOffsetX, + newOffsetY, + newPos; + + if (!self.contentLastPos) { + return; + } + + if (self.opts.momentum === false || self.dMs > 350) { + newOffsetX = self.contentLastPos.left; + newOffsetY = self.contentLastPos.top; + } else { + // Continue movement + newOffsetX = self.contentLastPos.left + self.velocityX * 500; + newOffsetY = self.contentLastPos.top + self.velocityY * 500; + } + + newPos = self.limitPosition(newOffsetX, newOffsetY, self.contentStartPos.width, self.contentStartPos.height); + + newPos.width = self.contentStartPos.width; + newPos.height = self.contentStartPos.height; + + $.fancybox.animate(self.$content, newPos, 366); + }; + + Guestures.prototype.endZooming = function () { + var self = this; + + var current = self.instance.current; + + var newOffsetX, newOffsetY, newPos, reset; + + var newWidth = self.newWidth; + var newHeight = self.newHeight; + + if (!self.contentLastPos) { + return; + } + + newOffsetX = self.contentLastPos.left; + newOffsetY = self.contentLastPos.top; + + reset = { + top: newOffsetY, + left: newOffsetX, + width: newWidth, + height: newHeight, + scaleX: 1, + scaleY: 1 + }; + + // Reset scalex/scaleY values; this helps for perfomance and does not break animation + $.fancybox.setTranslate(self.$content, reset); + + if (newWidth < self.canvasWidth && newHeight < self.canvasHeight) { + self.instance.scaleToFit(150); + } else if (newWidth > current.width || newHeight > current.height) { + self.instance.scaleToActual(self.centerPointStartX, self.centerPointStartY, 150); + } else { + newPos = self.limitPosition(newOffsetX, newOffsetY, newWidth, newHeight); + + $.fancybox.animate(self.$content, newPos, 150); + } + }; + + Guestures.prototype.onTap = function (e) { + var self = this; + var $target = $(e.target); + + var instance = self.instance; + var current = instance.current; + + var endPoints = (e && getPointerXY(e)) || self.startPoints; + + var tapX = endPoints[0] ? endPoints[0].x - $(window).scrollLeft() - self.stagePos.left : 0; + var tapY = endPoints[0] ? endPoints[0].y - $(window).scrollTop() - self.stagePos.top : 0; + + var where; + + var process = function (prefix) { + var action = current.opts[prefix]; + + if ($.isFunction(action)) { + action = action.apply(instance, [current, e]); + } + + if (!action) { + return; + } + + switch (action) { + case "close": + instance.close(self.startEvent); + + break; + + case "toggleControls": + instance.toggleControls(); + + break; + + case "next": + instance.next(); + + break; + + case "nextOrClose": + if (instance.group.length > 1) { + instance.next(); + } else { + instance.close(self.startEvent); + } + + break; + + case "zoom": + if (current.type == "image" && (current.isLoaded || current.$ghost)) { + if (instance.canPan()) { + instance.scaleToFit(); + } else if (instance.isScaledDown()) { + instance.scaleToActual(tapX, tapY); + } else if (instance.group.length < 2) { + instance.close(self.startEvent); + } + } + + break; + } + }; + + // Ignore right click + if (e.originalEvent && e.originalEvent.button == 2) { + return; + } + + // Skip if clicked on the scrollbar + if (!$target.is("img") && tapX > $target[0].clientWidth + $target.offset().left) { + return; + } + + // Check where is clicked + if ($target.is(".fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-container")) { + where = "Outside"; + } else if ($target.is(".fancybox-slide")) { + where = "Slide"; + } else if ( + instance.current.$content && + instance.current.$content + .find($target) + .addBack() + .filter($target).length + ) { + where = "Content"; + } else { + return; + } + + // Check if this is a double tap + if (self.tapped) { + // Stop previously created single tap + clearTimeout(self.tapped); + self.tapped = null; + + // Skip if distance between taps is too big + if (Math.abs(tapX - self.tapX) > 50 || Math.abs(tapY - self.tapY) > 50) { + return this; + } + + // OK, now we assume that this is a double-tap + process("dblclick" + where); + } else { + // Single tap will be processed if user has not clicked second time within 300ms + // or there is no need to wait for double-tap + self.tapX = tapX; + self.tapY = tapY; + + if (current.opts["dblclick" + where] && current.opts["dblclick" + where] !== current.opts["click" + where]) { + self.tapped = setTimeout(function () { + self.tapped = null; + + if (!instance.isAnimating) { + process("click" + where); + } + }, 500); + } else { + process("click" + where); + } + } + + return this; + }; + + $(document) + .on("onActivate.fb", function (e, instance) { + if (instance && !instance.Guestures) { + instance.Guestures = new Guestures(instance); + } + }) + .on("beforeClose.fb", function (e, instance) { + if (instance && instance.Guestures) { + instance.Guestures.destroy(); + } + }); +})(window, document, jQuery); +// ========================================================================== +// +// SlideShow +// Enables slideshow functionality +// +// Example of usage: +// $.fancybox.getInstance().SlideShow.start() +// +// ========================================================================== +(function (document, $) { + "use strict"; + + $.extend(true, $.fancybox.defaults, { + btnTpl: { + slideShow: '" + }, + slideShow: { + autoStart: false, + speed: 3000, + progress: true + } + }); + + var SlideShow = function (instance) { + this.instance = instance; + this.init(); + }; + + $.extend(SlideShow.prototype, { + timer: null, + isActive: false, + $button: null, + + init: function () { + var self = this, + instance = self.instance, + opts = instance.group[instance.currIndex].opts.slideShow; + + self.$button = instance.$refs.toolbar.find("[data-fancybox-play]").on("click", function () { + self.toggle(); + }); + + if (instance.group.length < 2 || !opts) { + self.$button.hide(); + } else if (opts.progress) { + self.$progress = $('
').appendTo(instance.$refs.inner); + } + }, + + set: function (force) { + var self = this, + instance = self.instance, + current = instance.current; + + // Check if reached last element + if (current && (force === true || current.opts.loop || instance.currIndex < instance.group.length - 1)) { + if (self.isActive && current.contentType !== "video") { + if (self.$progress) { + $.fancybox.animate(self.$progress.show(), { + scaleX: 1 + }, current.opts.slideShow.speed); + } + + self.timer = setTimeout(function () { + if (!instance.current.opts.loop && instance.current.index == instance.group.length - 1) { + instance.jumpTo(0); + } else { + instance.next(); + } + }, current.opts.slideShow.speed); + } + } else { + self.stop(); + instance.idleSecondsCounter = 0; + instance.showControls(); + } + }, + + clear: function () { + var self = this; + + clearTimeout(self.timer); + + self.timer = null; + + if (self.$progress) { + self.$progress.removeAttr("style").hide(); + } + }, + + start: function () { + var self = this, + current = self.instance.current; + + if (current) { + self.$button + .attr("title", (current.opts.i18n[current.opts.lang] || current.opts.i18n.en).PLAY_STOP) + .removeClass("fancybox-button--play") + .addClass("fancybox-button--pause"); + + self.isActive = true; + + if (current.isComplete) { + self.set(true); + } + + self.instance.trigger("onSlideShowChange", true); + } + }, + + stop: function () { + var self = this, + current = self.instance.current; + + self.clear(); + + self.$button + .attr("title", (current.opts.i18n[current.opts.lang] || current.opts.i18n.en).PLAY_START) + .removeClass("fancybox-button--pause") + .addClass("fancybox-button--play"); + + self.isActive = false; + + self.instance.trigger("onSlideShowChange", false); + + if (self.$progress) { + self.$progress.removeAttr("style").hide(); + } + }, + + toggle: function () { + var self = this; + + if (self.isActive) { + self.stop(); + } else { + self.start(); + } + } + }); + + $(document).on({ + "onInit.fb": function (e, instance) { + if (instance && !instance.SlideShow) { + instance.SlideShow = new SlideShow(instance); + } + }, + + "beforeShow.fb": function (e, instance, current, firstRun) { + var SlideShow = instance && instance.SlideShow; + + if (firstRun) { + if (SlideShow && current.opts.slideShow.autoStart) { + SlideShow.start(); + } + } else if (SlideShow && SlideShow.isActive) { + SlideShow.clear(); + } + }, + + "afterShow.fb": function (e, instance, current) { + var SlideShow = instance && instance.SlideShow; + + if (SlideShow && SlideShow.isActive) { + SlideShow.set(); + } + }, + + "afterKeydown.fb": function (e, instance, current, keypress, keycode) { + var SlideShow = instance && instance.SlideShow; + + // "P" or Spacebar + if (SlideShow && current.opts.slideShow && (keycode === 80 || keycode === 32) && !$(document.activeElement).is("button,a,input")) { + keypress.preventDefault(); + + SlideShow.toggle(); + } + }, + + "beforeClose.fb onDeactivate.fb": function (e, instance) { + var SlideShow = instance && instance.SlideShow; + + if (SlideShow) { + SlideShow.stop(); + } + } + }); + + // Page Visibility API to pause slideshow when window is not active + $(document).on("visibilitychange", function () { + var instance = $.fancybox.getInstance(), + SlideShow = instance && instance.SlideShow; + + if (SlideShow && SlideShow.isActive) { + if (document.hidden) { + SlideShow.clear(); + } else { + SlideShow.set(); + } + } + }); +})(document, jQuery); +// ========================================================================== +// +// FullScreen +// Adds fullscreen functionality +// +// ========================================================================== +(function (document, $) { + "use strict"; + + // Collection of methods supported by user browser + var fn = (function () { + var fnMap = [ + ["requestFullscreen", "exitFullscreen", "fullscreenElement", "fullscreenEnabled", "fullscreenchange", "fullscreenerror"], + // new WebKit + [ + "webkitRequestFullscreen", + "webkitExitFullscreen", + "webkitFullscreenElement", + "webkitFullscreenEnabled", + "webkitfullscreenchange", + "webkitfullscreenerror" + ], + // old WebKit (Safari 5.1) + [ + "webkitRequestFullScreen", + "webkitCancelFullScreen", + "webkitCurrentFullScreenElement", + "webkitCancelFullScreen", + "webkitfullscreenchange", + "webkitfullscreenerror" + ], + [ + "mozRequestFullScreen", + "mozCancelFullScreen", + "mozFullScreenElement", + "mozFullScreenEnabled", + "mozfullscreenchange", + "mozfullscreenerror" + ], + ["msRequestFullscreen", "msExitFullscreen", "msFullscreenElement", "msFullscreenEnabled", "MSFullscreenChange", "MSFullscreenError"] + ]; + + var ret = {}; + + for (var i = 0; i < fnMap.length; i++) { + var val = fnMap[i]; + + if (val && val[1] in document) { + for (var j = 0; j < val.length; j++) { + ret[fnMap[0][j]] = val[j]; + } + + return ret; + } + } + + return false; + })(); + + if (fn) { + var FullScreen = { + request: function (elem) { + elem = elem || document.documentElement; + + elem[fn.requestFullscreen](elem.ALLOW_KEYBOARD_INPUT); + }, + exit: function () { + document[fn.exitFullscreen](); + }, + toggle: function (elem) { + elem = elem || document.documentElement; + + if (this.isFullscreen()) { + this.exit(); + } else { + this.request(elem); + } + }, + isFullscreen: function () { + return Boolean(document[fn.fullscreenElement]); + }, + enabled: function () { + return Boolean(document[fn.fullscreenEnabled]); + } + }; + + $.extend(true, $.fancybox.defaults, { + btnTpl: { + fullScreen: '" + }, + fullScreen: { + autoStart: false + } + }); + + $(document).on(fn.fullscreenchange, function () { + var isFullscreen = FullScreen.isFullscreen(), + instance = $.fancybox.getInstance(); + + if (instance) { + // If image is zooming, then force to stop and reposition properly + if (instance.current && instance.current.type === "image" && instance.isAnimating) { + instance.isAnimating = false; + + instance.update(true, true, 0); + + if (!instance.isComplete) { + instance.complete(); + } + } + + instance.trigger("onFullscreenChange", isFullscreen); + + instance.$refs.container.toggleClass("fancybox-is-fullscreen", isFullscreen); + + instance.$refs.toolbar + .find("[data-fancybox-fullscreen]") + .toggleClass("fancybox-button--fsenter", !isFullscreen) + .toggleClass("fancybox-button--fsexit", isFullscreen); + } + }); + } + + $(document).on({ + "onInit.fb": function (e, instance) { + var $container; + + if (!fn) { + instance.$refs.toolbar.find("[data-fancybox-fullscreen]").remove(); + + return; + } + + if (instance && instance.group[instance.currIndex].opts.fullScreen) { + $container = instance.$refs.container; + + $container.on("click.fb-fullscreen", "[data-fancybox-fullscreen]", function (e) { + e.stopPropagation(); + e.preventDefault(); + + FullScreen.toggle(); + }); + + if (instance.opts.fullScreen && instance.opts.fullScreen.autoStart === true) { + FullScreen.request(); + } + + // Expose API + instance.FullScreen = FullScreen; + } else if (instance) { + instance.$refs.toolbar.find("[data-fancybox-fullscreen]").hide(); + } + }, + + "afterKeydown.fb": function (e, instance, current, keypress, keycode) { + // "F" + if (instance && instance.FullScreen && keycode === 70) { + keypress.preventDefault(); + + instance.FullScreen.toggle(); + } + }, + + "beforeClose.fb": function (e, instance) { + if (instance && instance.FullScreen && instance.$refs.container.hasClass("fancybox-is-fullscreen")) { + FullScreen.exit(); + } + } + }); +})(document, jQuery); +// ========================================================================== +// +// Thumbs +// Displays thumbnails in a grid +// +// ========================================================================== +(function (document, $) { + "use strict"; + + var CLASS = "fancybox-thumbs", + CLASS_ACTIVE = CLASS + "-active"; + + // Make sure there are default values + $.fancybox.defaults = $.extend( + true, { + btnTpl: { + thumbs: '" + }, + thumbs: { + autoStart: false, // Display thumbnails on opening + hideOnClose: true, // Hide thumbnail grid when closing animation starts + parentEl: ".fancybox-container", // Container is injected into this element + axis: "y" // Vertical (y) or horizontal (x) scrolling + } + }, + $.fancybox.defaults + ); + + var FancyThumbs = function (instance) { + this.init(instance); + }; + + $.extend(FancyThumbs.prototype, { + $button: null, + $grid: null, + $list: null, + isVisible: false, + isActive: false, + + init: function (instance) { + var self = this, + group = instance.group, + enabled = 0; + + self.instance = instance; + self.opts = group[instance.currIndex].opts.thumbs; + + instance.Thumbs = self; + + self.$button = instance.$refs.toolbar.find("[data-fancybox-thumbs]"); + + // Enable thumbs if at least two group items have thumbnails + for (var i = 0, len = group.length; i < len; i++) { + if (group[i].thumb) { + enabled++; + } + + if (enabled > 1) { + break; + } + } + + if (enabled > 1 && !!self.opts) { + self.$button.removeAttr("style").on("click", function () { + self.toggle(); + }); + + self.isActive = true; + } else { + self.$button.hide(); + } + }, + + create: function () { + var self = this, + instance = self.instance, + parentEl = self.opts.parentEl, + list = [], + src; + + if (!self.$grid) { + // Create main element + self.$grid = $('
').appendTo( + instance.$refs.container + .find(parentEl) + .addBack() + .filter(parentEl) + ); + + // Add "click" event that performs gallery navigation + self.$grid.on("click", "a", function () { + instance.jumpTo($(this).attr("data-index")); + }); + } + + // Build the list + if (!self.$list) { + self.$list = $('
').appendTo(self.$grid); + } + + $.each(instance.group, function (i, item) { + src = item.thumb; + + if (!src && item.type === "image") { + src = item.src; + } + + list.push( + '" + ); + }); + + self.$list[0].innerHTML = list.join(""); + + if (self.opts.axis === "x") { + // Set fixed width for list element to enable horizontal scrolling + self.$list.width( + parseInt(self.$grid.css("padding-right"), 10) + + instance.group.length * + self.$list + .children() + .eq(0) + .outerWidth(true) + ); + } + }, + + focus: function (duration) { + var self = this, + $list = self.$list, + $grid = self.$grid, + thumb, + thumbPos; + + if (!self.instance.current) { + return; + } + + thumb = $list + .children() + .removeClass(CLASS_ACTIVE) + .filter('[data-index="' + self.instance.current.index + '"]') + .addClass(CLASS_ACTIVE); + + thumbPos = thumb.position(); + + // Check if need to scroll to make current thumb visible + if (self.opts.axis === "y" && (thumbPos.top < 0 || thumbPos.top > $list.height() - thumb.outerHeight())) { + $list.stop().animate({ + scrollTop: $list.scrollTop() + thumbPos.top + }, + duration + ); + } else if ( + self.opts.axis === "x" && + (thumbPos.left < $grid.scrollLeft() || thumbPos.left > $grid.scrollLeft() + ($grid.width() - thumb.outerWidth())) + ) { + $list + .parent() + .stop() + .animate({ + scrollLeft: thumbPos.left + }, + duration + ); + } + }, + + update: function () { + var that = this; + that.instance.$refs.container.toggleClass("fancybox-show-thumbs", this.isVisible); + + if (that.isVisible) { + if (!that.$grid) { + that.create(); + } + + that.instance.trigger("onThumbsShow"); + + that.focus(0); + } else if (that.$grid) { + that.instance.trigger("onThumbsHide"); + } + + // Update content position + that.instance.update(); + }, + + hide: function () { + this.isVisible = false; + this.update(); + }, + + show: function () { + this.isVisible = true; + this.update(); + }, + + toggle: function () { + this.isVisible = !this.isVisible; + this.update(); + } + }); + + $(document).on({ + "onInit.fb": function (e, instance) { + var Thumbs; + + if (instance && !instance.Thumbs) { + Thumbs = new FancyThumbs(instance); + + if (Thumbs.isActive && Thumbs.opts.autoStart === true) { + Thumbs.show(); + } + } + }, + + "beforeShow.fb": function (e, instance, item, firstRun) { + var Thumbs = instance && instance.Thumbs; + + if (Thumbs && Thumbs.isVisible) { + Thumbs.focus(firstRun ? 0 : 250); + } + }, + + "afterKeydown.fb": function (e, instance, current, keypress, keycode) { + var Thumbs = instance && instance.Thumbs; + + // "G" + if (Thumbs && Thumbs.isActive && keycode === 71) { + keypress.preventDefault(); + + Thumbs.toggle(); + } + }, + + "beforeClose.fb": function (e, instance) { + var Thumbs = instance && instance.Thumbs; + + if (Thumbs && Thumbs.isVisible && Thumbs.opts.hideOnClose !== false) { + Thumbs.$grid.hide(); + } + } + }); +})(document, jQuery); +//// ========================================================================== +// +// Share +// Displays simple form for sharing current url +// +// ========================================================================== +(function (document, $) { + "use strict"; + + $.extend(true, $.fancybox.defaults, { + btnTpl: { + share: '" + }, + share: { + url: function (instance, item) { + return ( + (!instance.currentHash && !(item.type === "inline" || item.type === "html") ? item.origSrc || item.src : false) || window.location + ); + }, + tpl: '
' + + "

{{SHARE}}

" + + "

" + + '' + + '' + + "Facebook" + + "" + + '' + + '' + + "Twitter" + + "" + + '' + + '' + + "Pinterest" + + "" + + "

" + + '

' + + "
" + } + }); + + function escapeHtml(string) { + var entityMap = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'", + "/": "/", + "`": "`", + "=": "=" + }; + + return String(string).replace(/[&<>"'`=\/]/g, function (s) { + return entityMap[s]; + }); + } + + $(document).on("click", "[data-fancybox-share]", function () { + var instance = $.fancybox.getInstance(), + current = instance.current || null, + url, + tpl; + + if (!current) { + return; + } + + if ($.type(current.opts.share.url) === "function") { + url = current.opts.share.url.apply(current, [instance, current]); + } + + tpl = current.opts.share.tpl + .replace(/\{\{media\}\}/g, current.type === "image" ? encodeURIComponent(current.src) : "") + .replace(/\{\{url\}\}/g, encodeURIComponent(url)) + .replace(/\{\{url_raw\}\}/g, escapeHtml(url)) + .replace(/\{\{descr\}\}/g, instance.$caption ? encodeURIComponent(instance.$caption.text()) : ""); + + $.fancybox.open({ + src: instance.translate(instance, tpl), + type: "html", + opts: { + touch: false, + animationEffect: false, + afterLoad: function (shareInstance, shareCurrent) { + // Close self if parent instance is closing + instance.$refs.container.one("beforeClose.fb", function () { + shareInstance.close(null, 0); + }); + + // Opening links in a popup window + shareCurrent.$content.find(".fancybox-share__button").click(function () { + window.open(this.href, "Share", "width=550, height=450"); + return false; + }); + }, + mobile: { + autoFocus: false + } + } + }); + }); +})(document, jQuery); +// ========================================================================== +// +// Hash +// Enables linking to each modal +// +// ========================================================================== +(function (window, document, $) { + "use strict"; + + // Simple $.escapeSelector polyfill (for jQuery prior v3) + if (!$.escapeSelector) { + $.escapeSelector = function (sel) { + var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; + var fcssescape = function (ch, asCodePoint) { + if (asCodePoint) { + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if (ch === "\0") { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }; + + return (sel + "").replace(rcssescape, fcssescape); + }; + } + + // Get info about gallery name and current index from url + function parseUrl() { + var hash = window.location.hash.substr(1), + rez = hash.split("-"), + index = rez.length > 1 && /^\+?\d+$/.test(rez[rez.length - 1]) ? parseInt(rez.pop(-1), 10) || 1 : 1, + gallery = rez.join("-"); + + return { + hash: hash, + /* Index is starting from 1 */ + index: index < 1 ? 1 : index, + gallery: gallery + }; + } + + // Trigger click evnt on links to open new fancyBox instance + function triggerFromUrl(url) { + if (url.gallery !== "") { + // If we can find element matching 'data-fancybox' atribute, + // then triggering click event should start fancyBox + $("[data-fancybox='" + $.escapeSelector(url.gallery) + "']") + .eq(url.index - 1) + .focus() + .trigger("click.fb-start"); + } + } + + // Get gallery name from current instance + function getGalleryID(instance) { + var opts, ret; + + if (!instance) { + return false; + } + + opts = instance.current ? instance.current.opts : instance.opts; + ret = opts.hash || (opts.$orig ? opts.$orig.data("fancybox") || opts.$orig.data("fancybox-trigger") : ""); + + return ret === "" ? false : ret; + } + + // Start when DOM becomes ready + $(function () { + // Check if user has disabled this module + if ($.fancybox.defaults.hash === false) { + return; + } + + // Update hash when opening/closing fancyBox + $(document).on({ + "onInit.fb": function (e, instance) { + var url, gallery; + + if (instance.group[instance.currIndex].opts.hash === false) { + return; + } + + url = parseUrl(); + gallery = getGalleryID(instance); + + // Make sure gallery start index matches index from hash + if (gallery && url.gallery && gallery == url.gallery) { + instance.currIndex = url.index - 1; + } + }, + + "beforeShow.fb": function (e, instance, current, firstRun) { + var gallery; + + if (!current || current.opts.hash === false) { + return; + } + + // Check if need to update window hash + gallery = getGalleryID(instance); + + if (!gallery) { + return; + } + + // Variable containing last hash value set by fancyBox + // It will be used to determine if fancyBox needs to close after hash change is detected + instance.currentHash = gallery + (instance.group.length > 1 ? "-" + (current.index + 1) : ""); + + // If current hash is the same (this instance most likely is opened by hashchange), then do nothing + if (window.location.hash === "#" + instance.currentHash) { + return; + } + + if (firstRun && !instance.origHash) { + instance.origHash = window.location.hash; + } + + if (instance.hashTimer) { + clearTimeout(instance.hashTimer); + } + + // Update hash + instance.hashTimer = setTimeout(function () { + if ("replaceState" in window.history) { + window.history[firstRun ? "pushState" : "replaceState"]({}, + document.title, + window.location.pathname + window.location.search + "#" + instance.currentHash + ); + + if (firstRun) { + instance.hasCreatedHistory = true; + } + } else { + window.location.hash = instance.currentHash; + } + + instance.hashTimer = null; + }, 300); + }, + + "beforeClose.fb": function (e, instance, current) { + if (!current || current.opts.hash === false) { + return; + } + + clearTimeout(instance.hashTimer); + + // Goto previous history entry + if (instance.currentHash && instance.hasCreatedHistory) { + window.history.back(); + } else if (instance.currentHash) { + if ("replaceState" in window.history) { + window.history.replaceState({}, document.title, window.location.pathname + window.location.search + (instance.origHash || "")); + } else { + window.location.hash = instance.origHash; + } + } + + instance.currentHash = null; + } + }); + + // Check if need to start/close after url has changed + $(window).on("hashchange.fb", function () { + var url = parseUrl(), + fb = null; + + // Find last fancyBox instance that has "hash" + $.each( + $(".fancybox-container") + .get() + .reverse(), + function (index, value) { + var tmp = $(value).data("FancyBox"); + + if (tmp && tmp.currentHash) { + fb = tmp; + return false; + } + } + ); + + if (fb) { + // Now, compare hash values + if (fb.currentHash !== url.gallery + "-" + url.index && !(url.index === 1 && fb.currentHash == url.gallery)) { + fb.currentHash = null; + + fb.close(); + } + } else if (url.gallery !== "") { + triggerFromUrl(url); + } + }); + + // Check current hash and trigger click event on matching element to start fancyBox, if needed + setTimeout(function () { + if (!$.fancybox.getInstance()) { + triggerFromUrl(parseUrl()); + } + }, 50); + }); +})(window, document, jQuery); +// ========================================================================== +// +// Wheel +// Basic mouse weheel support for gallery navigation +// +// ========================================================================== +(function (document, $) { + "use strict"; + + var prevTime = new Date().getTime(); + + $(document).on({ + "onInit.fb": function (e, instance, current) { + instance.$refs.stage.on("mousewheel DOMMouseScroll wheel MozMousePixelScroll", function (e) { + var current = instance.current, + currTime = new Date().getTime(); + + if (instance.group.length < 2 || current.opts.wheel === false || (current.opts.wheel === "auto" && current.type !== "image")) { + return; + } + + e.preventDefault(); + e.stopPropagation(); + + if (current.$slide.hasClass("fancybox-animated")) { + return; + } + + e = e.originalEvent || e; + + if (currTime - prevTime < 250) { + return; + } + + prevTime = currTime; + + instance[(-e.deltaY || -e.deltaX || e.wheelDelta || -e.detail) < 0 ? "next" : "previous"](); + }); + } + }); +})(document, jQuery); \ No newline at end of file diff --git a/view/js/fancybox/jquery.fancybox.min.css b/view/js/fancybox/jquery.fancybox.min.css new file mode 100644 index 000000000..7cc60b295 --- /dev/null +++ b/view/js/fancybox/jquery.fancybox.min.css @@ -0,0 +1 @@ +body.compensate-for-scrollbar{overflow:hidden}.fancybox-active{height:auto}.fancybox-is-hidden{left:-9999px;margin:0;position:absolute!important;top:-9999px;visibility:hidden}.fancybox-container{-webkit-backface-visibility:hidden;height:100%;left:0;outline:none;position:fixed;-webkit-tap-highlight-color:transparent;top:0;-ms-touch-action:manipulation;touch-action:manipulation;transform:translateZ(0);width:100%;z-index:99992}.fancybox-container *{box-sizing:border-box}.fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-stage{bottom:0;left:0;position:absolute;right:0;top:0}.fancybox-outer{-webkit-overflow-scrolling:touch;overflow-y:auto}.fancybox-bg{background:#1e1e1e;opacity:0;transition-duration:inherit;transition-property:opacity;transition-timing-function:cubic-bezier(.47,0,.74,.71)}.fancybox-is-open .fancybox-bg{opacity:.9;transition-timing-function:cubic-bezier(.22,.61,.36,1)}.fancybox-caption,.fancybox-infobar,.fancybox-navigation .fancybox-button,.fancybox-toolbar{direction:ltr;opacity:0;position:absolute;transition:opacity .25s ease,visibility 0s ease .25s;visibility:hidden;z-index:99997}.fancybox-show-caption .fancybox-caption,.fancybox-show-infobar .fancybox-infobar,.fancybox-show-nav .fancybox-navigation .fancybox-button,.fancybox-show-toolbar .fancybox-toolbar{opacity:1;transition:opacity .25s ease 0s,visibility 0s ease 0s;visibility:visible}.fancybox-infobar{color:#ccc;font-size:13px;-webkit-font-smoothing:subpixel-antialiased;height:44px;left:0;line-height:44px;min-width:44px;mix-blend-mode:difference;padding:0 10px;pointer-events:none;top:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fancybox-toolbar{right:0;top:0}.fancybox-stage{direction:ltr;overflow:visible;transform:translateZ(0);z-index:99994}.fancybox-is-open .fancybox-stage{overflow:hidden}.fancybox-slide{-webkit-backface-visibility:hidden;display:none;height:100%;left:0;outline:none;overflow:auto;-webkit-overflow-scrolling:touch;padding:44px;position:absolute;text-align:center;top:0;transition-property:transform,opacity;white-space:normal;width:100%;z-index:99994}.fancybox-slide:before{content:"";display:inline-block;font-size:0;height:100%;vertical-align:middle;width:0}.fancybox-is-sliding .fancybox-slide,.fancybox-slide--current,.fancybox-slide--next,.fancybox-slide--previous{display:block}.fancybox-slide--image{overflow:hidden;padding:44px 0}.fancybox-slide--image:before{display:none}.fancybox-slide--html{padding:6px}.fancybox-content{background:#fff;display:inline-block;margin:0;max-width:100%;overflow:auto;-webkit-overflow-scrolling:touch;padding:44px;position:relative;text-align:left;vertical-align:middle}.fancybox-slide--image .fancybox-content{animation-timing-function:cubic-bezier(.5,0,.14,1);-webkit-backface-visibility:hidden;background:transparent;background-repeat:no-repeat;background-size:100% 100%;left:0;max-width:none;overflow:visible;padding:0;position:absolute;top:0;transform-origin:top left;transition-property:transform,opacity;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:99995}.fancybox-can-zoomOut .fancybox-content{cursor:zoom-out}.fancybox-can-zoomIn .fancybox-content{cursor:zoom-in}.fancybox-can-pan .fancybox-content,.fancybox-can-swipe .fancybox-content{cursor:grab}.fancybox-is-grabbing .fancybox-content{cursor:grabbing}.fancybox-container [data-selectable=true]{cursor:text}.fancybox-image,.fancybox-spaceball{background:transparent;border:0;height:100%;left:0;margin:0;max-height:none;max-width:none;padding:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.fancybox-spaceball{z-index:1}.fancybox-slide--iframe .fancybox-content,.fancybox-slide--map .fancybox-content,.fancybox-slide--pdf .fancybox-content,.fancybox-slide--video .fancybox-content{height:100%;overflow:visible;padding:0;width:100%}.fancybox-slide--video .fancybox-content{background:#000}.fancybox-slide--map .fancybox-content{background:#e5e3df}.fancybox-slide--iframe .fancybox-content{background:#fff}.fancybox-iframe,.fancybox-video{background:transparent;border:0;display:block;height:100%;margin:0;overflow:hidden;padding:0;width:100%}.fancybox-iframe{left:0;position:absolute;top:0}.fancybox-error{background:#fff;cursor:default;max-width:400px;padding:40px;width:100%}.fancybox-error p{color:#444;font-size:16px;line-height:20px;margin:0;padding:0}.fancybox-button{background:rgba(30,30,30,.6);border:0;border-radius:0;box-shadow:none;cursor:pointer;display:inline-block;height:44px;margin:0;padding:10px;position:relative;transition:color .2s;vertical-align:top;visibility:inherit;width:44px}.fancybox-button,.fancybox-button:link,.fancybox-button:visited{color:#ccc}.fancybox-button:hover{color:#fff}.fancybox-button:focus{outline:none}.fancybox-button.fancybox-focus{outline:1px dotted}.fancybox-button[disabled],.fancybox-button[disabled]:hover{color:#888;cursor:default;outline:none}.fancybox-button div{height:100%}.fancybox-button svg{display:block;height:100%;overflow:visible;position:relative;width:100%}.fancybox-button svg path{fill:currentColor;stroke-width:0}.fancybox-button--fsenter svg:nth-child(2),.fancybox-button--fsexit svg:first-child,.fancybox-button--pause svg:first-child,.fancybox-button--play svg:nth-child(2){display:none}.fancybox-progress{background:#ff5268;height:2px;left:0;position:absolute;right:0;top:0;transform:scaleX(0);transform-origin:0;transition-property:transform;transition-timing-function:linear;z-index:99998}.fancybox-close-small{background:transparent;border:0;border-radius:0;color:#ccc;cursor:pointer;opacity:.8;padding:8px;position:absolute;right:-12px;top:-44px;z-index:401}.fancybox-close-small:hover{color:#fff;opacity:1}.fancybox-slide--html .fancybox-close-small{color:currentColor;padding:10px;right:0;top:0}.fancybox-slide--image.fancybox-is-scaling .fancybox-content{overflow:hidden}.fancybox-is-scaling .fancybox-close-small,.fancybox-is-zoomable.fancybox-can-pan .fancybox-close-small{display:none}.fancybox-navigation .fancybox-button{background-clip:content-box;height:100px;opacity:0;position:absolute;top:calc(50% - 50px);width:70px}.fancybox-navigation .fancybox-button div{padding:7px}.fancybox-navigation .fancybox-button--arrow_left{left:0;left:env(safe-area-inset-left);padding:31px 26px 31px 6px}.fancybox-navigation .fancybox-button--arrow_right{padding:31px 6px 31px 26px;right:0;right:env(safe-area-inset-right)}.fancybox-caption{background:linear-gradient(0deg,rgba(0,0,0,.85) 0,rgba(0,0,0,.3) 50%,rgba(0,0,0,.15) 65%,rgba(0,0,0,.075) 75.5%,rgba(0,0,0,.037) 82.85%,rgba(0,0,0,.019) 88%,transparent);bottom:0;color:#eee;font-size:14px;font-weight:400;left:0;line-height:1.5;padding:75px 44px 25px;pointer-events:none;right:0;text-align:center;z-index:99996}@supports (padding:max(0px)){.fancybox-caption{padding:75px max(44px,env(safe-area-inset-right)) max(25px,env(safe-area-inset-bottom)) max(44px,env(safe-area-inset-left))}}.fancybox-caption--separate{margin-top:-50px}.fancybox-caption__body{max-height:50vh;overflow:auto;pointer-events:all}.fancybox-caption a,.fancybox-caption a:link,.fancybox-caption a:visited{color:#ccc;text-decoration:none}.fancybox-caption a:hover{color:#fff;text-decoration:underline}.fancybox-loading{animation:a 1s linear infinite;background:transparent;border:4px solid #888;border-bottom-color:#fff;border-radius:50%;height:50px;left:50%;margin:-25px 0 0 -25px;opacity:.7;padding:0;position:absolute;top:50%;width:50px;z-index:99999}@keyframes a{to{transform:rotate(1turn)}}.fancybox-animated{transition-timing-function:cubic-bezier(0,0,.25,1)}.fancybox-fx-slide.fancybox-slide--previous{opacity:0;transform:translate3d(-100%,0,0)}.fancybox-fx-slide.fancybox-slide--next{opacity:0;transform:translate3d(100%,0,0)}.fancybox-fx-slide.fancybox-slide--current{opacity:1;transform:translateZ(0)}.fancybox-fx-fade.fancybox-slide--next,.fancybox-fx-fade.fancybox-slide--previous{opacity:0;transition-timing-function:cubic-bezier(.19,1,.22,1)}.fancybox-fx-fade.fancybox-slide--current{opacity:1}.fancybox-fx-zoom-in-out.fancybox-slide--previous{opacity:0;transform:scale3d(1.5,1.5,1.5)}.fancybox-fx-zoom-in-out.fancybox-slide--next{opacity:0;transform:scale3d(.5,.5,.5)}.fancybox-fx-zoom-in-out.fancybox-slide--current{opacity:1;transform:scaleX(1)}.fancybox-fx-rotate.fancybox-slide--previous{opacity:0;transform:rotate(-1turn)}.fancybox-fx-rotate.fancybox-slide--next{opacity:0;transform:rotate(1turn)}.fancybox-fx-rotate.fancybox-slide--current{opacity:1;transform:rotate(0deg)}.fancybox-fx-circular.fancybox-slide--previous{opacity:0;transform:scale3d(0,0,0) translate3d(-100%,0,0)}.fancybox-fx-circular.fancybox-slide--next{opacity:0;transform:scale3d(0,0,0) translate3d(100%,0,0)}.fancybox-fx-circular.fancybox-slide--current{opacity:1;transform:scaleX(1) translateZ(0)}.fancybox-fx-tube.fancybox-slide--previous{transform:translate3d(-100%,0,0) scale(.1) skew(-10deg)}.fancybox-fx-tube.fancybox-slide--next{transform:translate3d(100%,0,0) scale(.1) skew(10deg)}.fancybox-fx-tube.fancybox-slide--current{transform:translateZ(0) scale(1)}@media (max-height:576px){.fancybox-slide{padding-left:6px;padding-right:6px}.fancybox-slide--image{padding:6px 0}.fancybox-close-small{right:-6px}.fancybox-slide--image .fancybox-close-small{background:#4e4e4e;color:#f2f4f6;height:36px;opacity:1;padding:6px;right:0;top:0;width:36px}.fancybox-caption{padding-left:12px;padding-right:12px}@supports (padding:max(0px)){.fancybox-caption{padding-left:max(12px,env(safe-area-inset-left));padding-right:max(12px,env(safe-area-inset-right))}}}.fancybox-share{background:#f4f4f4;border-radius:3px;max-width:90%;padding:30px;text-align:center}.fancybox-share h1{color:#222;font-size:35px;font-weight:700;margin:0 0 20px}.fancybox-share p{margin:0;padding:0}.fancybox-share__button{border:0;border-radius:3px;display:inline-block;font-size:14px;font-weight:700;line-height:40px;margin:0 5px 10px;min-width:130px;padding:0 15px;text-decoration:none;transition:all .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}.fancybox-share__button:link,.fancybox-share__button:visited{color:#fff}.fancybox-share__button:hover{text-decoration:none}.fancybox-share__button--fb{background:#3b5998}.fancybox-share__button--fb:hover{background:#344e86}.fancybox-share__button--pt{background:#bd081d}.fancybox-share__button--pt:hover{background:#aa0719}.fancybox-share__button--tw{background:#1da1f2}.fancybox-share__button--tw:hover{background:#0d95e8}.fancybox-share__button svg{height:25px;margin-right:7px;position:relative;top:-1px;vertical-align:middle;width:25px}.fancybox-share__button svg path{fill:#fff}.fancybox-share__input{background:transparent;border:0;border-bottom:1px solid #d7d7d7;border-radius:0;color:#5d5b5b;font-size:14px;margin:10px 0 0;outline:none;padding:10px 15px;width:100%}.fancybox-thumbs{background:#ddd;bottom:0;display:none;margin:0;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;padding:2px 2px 4px;position:absolute;right:0;-webkit-tap-highlight-color:rgba(0,0,0,0);top:0;width:212px;z-index:99995}.fancybox-thumbs-x{overflow-x:auto;overflow-y:hidden}.fancybox-show-thumbs .fancybox-thumbs{display:block}.fancybox-show-thumbs .fancybox-inner{right:212px}.fancybox-thumbs__list{font-size:0;height:100%;list-style:none;margin:0;overflow-x:hidden;overflow-y:auto;padding:0;position:absolute;position:relative;white-space:nowrap;width:100%}.fancybox-thumbs-x .fancybox-thumbs__list{overflow:hidden}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar{width:7px}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-track{background:#fff;border-radius:10px;box-shadow:inset 0 0 6px rgba(0,0,0,.3)}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-thumb{background:#2a2a2a;border-radius:10px}.fancybox-thumbs__list a{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:rgba(0,0,0,.1);background-position:50%;background-repeat:no-repeat;background-size:cover;cursor:pointer;float:left;height:75px;margin:2px;max-height:calc(100% - 8px);max-width:calc(50% - 4px);outline:none;overflow:hidden;padding:0;position:relative;-webkit-tap-highlight-color:transparent;width:100px}.fancybox-thumbs__list a:before{border:6px solid #ff5268;bottom:0;content:"";left:0;opacity:0;position:absolute;right:0;top:0;transition:all .2s cubic-bezier(.25,.46,.45,.94);z-index:99991}.fancybox-thumbs__list a:focus:before{opacity:.5}.fancybox-thumbs__list a.fancybox-thumbs-active:before{opacity:1}@media (max-width:576px){.fancybox-thumbs{width:110px}.fancybox-show-thumbs .fancybox-inner{right:110px}.fancybox-thumbs__list a{max-width:calc(100% - 10px)}} \ No newline at end of file diff --git a/view/js/fancybox/jquery.fancybox.min.js b/view/js/fancybox/jquery.fancybox.min.js new file mode 100644 index 000000000..d5d10f6be --- /dev/null +++ b/view/js/fancybox/jquery.fancybox.min.js @@ -0,0 +1,13 @@ +// ================================================== +// fancyBox v3.5.7 +// +// Licensed GPLv3 for open source use +// or fancyBox Commercial License for commercial use +// +// http://fancyapps.com/fancybox/ +// Copyright 2019 fancyApps +// +// ================================================== +!function(t,e,n,o){"use strict";function i(t,e){var o,i,a,s=[],r=0;t&&t.isDefaultPrevented()||(t.preventDefault(),e=e||{},t&&t.data&&(e=h(t.data.options,e)),o=e.$target||n(t.currentTarget).trigger("blur"),(a=n.fancybox.getInstance())&&a.$trigger&&a.$trigger.is(o)||(e.selector?s=n(e.selector):(i=o.attr("data-fancybox")||"",i?(s=t.data?t.data.items:[],s=s.length?s.filter('[data-fancybox="'+i+'"]'):n('[data-fancybox="'+i+'"]')):s=[o]),r=n(s).index(o),r<0&&(r=0),a=n.fancybox.open(s,e,r),a.$trigger=o))}if(t.console=t.console||{info:function(t){}},n){if(n.fn.fancybox)return void console.info("fancyBox already initialized");var a={closeExisting:!1,loop:!1,gutter:50,keyboard:!0,preventCaptionOverlap:!0,arrows:!0,infobar:!0,smallBtn:"auto",toolbar:"auto",buttons:["zoom","slideShow","thumbs","close"],idleTime:3,protect:!1,modal:!1,image:{preload:!1},ajax:{settings:{data:{fancybox:!0}}},iframe:{tpl:'',preload:!0,css:{},attr:{scrolling:"auto"}},video:{tpl:'',format:"",autoStart:!0},defaultType:"image",animationEffect:"zoom",animationDuration:366,zoomOpacity:"auto",transitionEffect:"fade",transitionDuration:366,slideClass:"",baseClass:"",baseTpl:'',spinnerTpl:'
',errorTpl:'

{{ERROR}}

',btnTpl:{download:'',zoom:'',close:'',arrowLeft:'',arrowRight:'',smallBtn:''},parentEl:"body",hideScrollbar:!0,autoFocus:!0,backFocus:!0,trapFocus:!0,fullScreen:{autoStart:!1},touch:{vertical:!0,momentum:!0},hash:null,media:{},slideShow:{autoStart:!1,speed:3e3},thumbs:{autoStart:!1,hideOnClose:!0,parentEl:".fancybox-container",axis:"y"},wheel:"auto",onInit:n.noop,beforeLoad:n.noop,afterLoad:n.noop,beforeShow:n.noop,afterShow:n.noop,beforeClose:n.noop,afterClose:n.noop,onActivate:n.noop,onDeactivate:n.noop,clickContent:function(t,e){return"image"===t.type&&"zoom"},clickSlide:"close",clickOutside:"close",dblclickContent:!1,dblclickSlide:!1,dblclickOutside:!1,mobile:{preventCaptionOverlap:!1,idleTime:!1,clickContent:function(t,e){return"image"===t.type&&"toggleControls"},clickSlide:function(t,e){return"image"===t.type?"toggleControls":"close"},dblclickContent:function(t,e){return"image"===t.type&&"zoom"},dblclickSlide:function(t,e){return"image"===t.type&&"zoom"}},lang:"en",i18n:{en:{CLOSE:"Close",NEXT:"Next",PREV:"Previous",ERROR:"The requested content cannot be loaded.
Please try again later.",PLAY_START:"Start slideshow",PLAY_STOP:"Pause slideshow",FULL_SCREEN:"Full screen",THUMBS:"Thumbnails",DOWNLOAD:"Download",SHARE:"Share",ZOOM:"Zoom"},de:{CLOSE:"Schließen",NEXT:"Weiter",PREV:"Zurück",ERROR:"Die angeforderten Daten konnten nicht geladen werden.
Bitte versuchen Sie es später nochmal.",PLAY_START:"Diaschau starten",PLAY_STOP:"Diaschau beenden",FULL_SCREEN:"Vollbild",THUMBS:"Vorschaubilder",DOWNLOAD:"Herunterladen",SHARE:"Teilen",ZOOM:"Vergrößern"}}},s=n(t),r=n(e),c=0,l=function(t){return t&&t.hasOwnProperty&&t instanceof n},d=function(){return t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||function(e){return t.setTimeout(e,1e3/60)}}(),u=function(){return t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.mozCancelAnimationFrame||t.oCancelAnimationFrame||function(e){t.clearTimeout(e)}}(),f=function(){var t,n=e.createElement("fakeelement"),o={transition:"transitionend",OTransition:"oTransitionEnd",MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd"};for(t in o)if(void 0!==n.style[t])return o[t];return"transitionend"}(),p=function(t){return t&&t.length&&t[0].offsetHeight},h=function(t,e){var o=n.extend(!0,{},t,e);return n.each(e,function(t,e){n.isArray(e)&&(o[t]=e)}),o},g=function(t){var o,i;return!(!t||t.ownerDocument!==e)&&(n(".fancybox-container").css("pointer-events","none"),o={x:t.getBoundingClientRect().left+t.offsetWidth/2,y:t.getBoundingClientRect().top+t.offsetHeight/2},i=e.elementFromPoint(o.x,o.y)===t,n(".fancybox-container").css("pointer-events",""),i)},b=function(t,e,o){var i=this;i.opts=h({index:o},n.fancybox.defaults),n.isPlainObject(e)&&(i.opts=h(i.opts,e)),n.fancybox.isMobile&&(i.opts=h(i.opts,i.opts.mobile)),i.id=i.opts.id||++c,i.currIndex=parseInt(i.opts.index,10)||0,i.prevIndex=null,i.prevPos=null,i.currPos=0,i.firstRun=!0,i.group=[],i.slides={},i.addContent(t),i.group.length&&i.init()};n.extend(b.prototype,{init:function(){var o,i,a=this,s=a.group[a.currIndex],r=s.opts;r.closeExisting&&n.fancybox.close(!0),n("body").addClass("fancybox-active"),!n.fancybox.getInstance()&&!1!==r.hideScrollbar&&!n.fancybox.isMobile&&e.body.scrollHeight>t.innerHeight&&(n("head").append('"),n("body").addClass("compensate-for-scrollbar")),i="",n.each(r.buttons,function(t,e){i+=r.btnTpl[e]||""}),o=n(a.translate(a,r.baseTpl.replace("{{buttons}}",i).replace("{{arrows}}",r.btnTpl.arrowLeft+r.btnTpl.arrowRight))).attr("id","fancybox-container-"+a.id).addClass(r.baseClass).data("FancyBox",a).appendTo(r.parentEl),a.$refs={container:o},["bg","inner","infobar","toolbar","stage","caption","navigation"].forEach(function(t){a.$refs[t]=o.find(".fancybox-"+t)}),a.trigger("onInit"),a.activate(),a.jumpTo(a.currIndex)},translate:function(t,e){var n=t.opts.i18n[t.opts.lang]||t.opts.i18n.en;return e.replace(/\{\{(\w+)\}\}/g,function(t,e){return void 0===n[e]?t:n[e]})},addContent:function(t){var e,o=this,i=n.makeArray(t);n.each(i,function(t,e){var i,a,s,r,c,l={},d={};n.isPlainObject(e)?(l=e,d=e.opts||e):"object"===n.type(e)&&n(e).length?(i=n(e),d=i.data()||{},d=n.extend(!0,{},d,d.options),d.$orig=i,l.src=o.opts.src||d.src||i.attr("href"),l.type||l.src||(l.type="inline",l.src=e)):l={type:"html",src:e+""},l.opts=n.extend(!0,{},o.opts,d),n.isArray(d.buttons)&&(l.opts.buttons=d.buttons),n.fancybox.isMobile&&l.opts.mobile&&(l.opts=h(l.opts,l.opts.mobile)),a=l.type||l.opts.type,r=l.src||"",!a&&r&&((s=r.match(/\.(mp4|mov|ogv|webm)((\?|#).*)?$/i))?(a="video",l.opts.video.format||(l.opts.video.format="video/"+("ogv"===s[1]?"ogg":s[1]))):r.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i)?a="image":r.match(/\.(pdf)((\?|#).*)?$/i)?(a="iframe",l=n.extend(!0,l,{contentType:"pdf",opts:{iframe:{preload:!1}}})):"#"===r.charAt(0)&&(a="inline")),a?l.type=a:o.trigger("objectNeedsType",l),l.contentType||(l.contentType=n.inArray(l.type,["html","inline","ajax"])>-1?"html":l.type),l.index=o.group.length,"auto"==l.opts.smallBtn&&(l.opts.smallBtn=n.inArray(l.type,["html","inline","ajax"])>-1),"auto"===l.opts.toolbar&&(l.opts.toolbar=!l.opts.smallBtn),l.$thumb=l.opts.$thumb||null,l.opts.$trigger&&l.index===o.opts.index&&(l.$thumb=l.opts.$trigger.find("img:first"),l.$thumb.length&&(l.opts.$orig=l.opts.$trigger)),l.$thumb&&l.$thumb.length||!l.opts.$orig||(l.$thumb=l.opts.$orig.find("img:first")),l.$thumb&&!l.$thumb.length&&(l.$thumb=null),l.thumb=l.opts.thumb||(l.$thumb?l.$thumb[0].src:null),"function"===n.type(l.opts.caption)&&(l.opts.caption=l.opts.caption.apply(e,[o,l])),"function"===n.type(o.opts.caption)&&(l.opts.caption=o.opts.caption.apply(e,[o,l])),l.opts.caption instanceof n||(l.opts.caption=void 0===l.opts.caption?"":l.opts.caption+""),"ajax"===l.type&&(c=r.split(/\s+/,2),c.length>1&&(l.src=c.shift(),l.opts.filter=c.shift())),l.opts.modal&&(l.opts=n.extend(!0,l.opts,{trapFocus:!0,infobar:0,toolbar:0,smallBtn:0,keyboard:0,slideShow:0,fullScreen:0,thumbs:0,touch:0,clickContent:!1,clickSlide:!1,clickOutside:!1,dblclickContent:!1,dblclickSlide:!1,dblclickOutside:!1})),o.group.push(l)}),Object.keys(o.slides).length&&(o.updateControls(),(e=o.Thumbs)&&e.isActive&&(e.create(),e.focus()))},addEvents:function(){var e=this;e.removeEvents(),e.$refs.container.on("click.fb-close","[data-fancybox-close]",function(t){t.stopPropagation(),t.preventDefault(),e.close(t)}).on("touchstart.fb-prev click.fb-prev","[data-fancybox-prev]",function(t){t.stopPropagation(),t.preventDefault(),e.previous()}).on("touchstart.fb-next click.fb-next","[data-fancybox-next]",function(t){t.stopPropagation(),t.preventDefault(),e.next()}).on("click.fb","[data-fancybox-zoom]",function(t){e[e.isScaledDown()?"scaleToActual":"scaleToFit"]()}),s.on("orientationchange.fb resize.fb",function(t){t&&t.originalEvent&&"resize"===t.originalEvent.type?(e.requestId&&u(e.requestId),e.requestId=d(function(){e.update(t)})):(e.current&&"iframe"===e.current.type&&e.$refs.stage.hide(),setTimeout(function(){e.$refs.stage.show(),e.update(t)},n.fancybox.isMobile?600:250))}),r.on("keydown.fb",function(t){var o=n.fancybox?n.fancybox.getInstance():null,i=o.current,a=t.keyCode||t.which;if(9==a)return void(i.opts.trapFocus&&e.focus(t));if(!(!i.opts.keyboard||t.ctrlKey||t.altKey||t.shiftKey||n(t.target).is("input,textarea,video,audio,select")))return 8===a||27===a?(t.preventDefault(),void e.close(t)):37===a||38===a?(t.preventDefault(),void e.previous()):39===a||40===a?(t.preventDefault(),void e.next()):void e.trigger("afterKeydown",t,a)}),e.group[e.currIndex].opts.idleTime&&(e.idleSecondsCounter=0,r.on("mousemove.fb-idle mouseleave.fb-idle mousedown.fb-idle touchstart.fb-idle touchmove.fb-idle scroll.fb-idle keydown.fb-idle",function(t){e.idleSecondsCounter=0,e.isIdle&&e.showControls(),e.isIdle=!1}),e.idleInterval=t.setInterval(function(){++e.idleSecondsCounter>=e.group[e.currIndex].opts.idleTime&&!e.isDragging&&(e.isIdle=!0,e.idleSecondsCounter=0,e.hideControls())},1e3))},removeEvents:function(){var e=this;s.off("orientationchange.fb resize.fb"),r.off("keydown.fb .fb-idle"),this.$refs.container.off(".fb-close .fb-prev .fb-next"),e.idleInterval&&(t.clearInterval(e.idleInterval),e.idleInterval=null)},previous:function(t){return this.jumpTo(this.currPos-1,t)},next:function(t){return this.jumpTo(this.currPos+1,t)},jumpTo:function(t,e){var o,i,a,s,r,c,l,d,u,f=this,h=f.group.length;if(!(f.isDragging||f.isClosing||f.isAnimating&&f.firstRun)){if(t=parseInt(t,10),!(a=f.current?f.current.opts.loop:f.opts.loop)&&(t<0||t>=h))return!1;if(o=f.firstRun=!Object.keys(f.slides).length,r=f.current,f.prevIndex=f.currIndex,f.prevPos=f.currPos,s=f.createSlide(t),h>1&&((a||s.index0)&&f.createSlide(t-1)),f.current=s,f.currIndex=s.index,f.currPos=s.pos,f.trigger("beforeShow",o),f.updateControls(),s.forcedDuration=void 0,n.isNumeric(e)?s.forcedDuration=e:e=s.opts[o?"animationDuration":"transitionDuration"],e=parseInt(e,10),i=f.isMoved(s),s.$slide.addClass("fancybox-slide--current"),o)return s.opts.animationEffect&&e&&f.$refs.container.css("transition-duration",e+"ms"),f.$refs.container.addClass("fancybox-is-open").trigger("focus"),f.loadSlide(s),void f.preload("image");c=n.fancybox.getTranslate(r.$slide),l=n.fancybox.getTranslate(f.$refs.stage),n.each(f.slides,function(t,e){n.fancybox.stop(e.$slide,!0)}),r.pos!==s.pos&&(r.isComplete=!1),r.$slide.removeClass("fancybox-slide--complete fancybox-slide--current"),i?(u=c.left-(r.pos*c.width+r.pos*r.opts.gutter),n.each(f.slides,function(t,o){o.$slide.removeClass("fancybox-animated").removeClass(function(t,e){return(e.match(/(^|\s)fancybox-fx-\S+/g)||[]).join(" ")});var i=o.pos*c.width+o.pos*o.opts.gutter;n.fancybox.setTranslate(o.$slide,{top:0,left:i-l.left+u}),o.pos!==s.pos&&o.$slide.addClass("fancybox-slide--"+(o.pos>s.pos?"next":"previous")),p(o.$slide),n.fancybox.animate(o.$slide,{top:0,left:(o.pos-s.pos)*c.width+(o.pos-s.pos)*o.opts.gutter},e,function(){o.$slide.css({transform:"",opacity:""}).removeClass("fancybox-slide--next fancybox-slide--previous"),o.pos===f.currPos&&f.complete()})})):e&&s.opts.transitionEffect&&(d="fancybox-animated fancybox-fx-"+s.opts.transitionEffect,r.$slide.addClass("fancybox-slide--"+(r.pos>s.pos?"next":"previous")),n.fancybox.animate(r.$slide,d,e,function(){r.$slide.removeClass(d).removeClass("fancybox-slide--next fancybox-slide--previous")},!1)),s.isLoaded?f.revealContent(s):f.loadSlide(s),f.preload("image")}},createSlide:function(t){var e,o,i=this;return o=t%i.group.length,o=o<0?i.group.length+o:o,!i.slides[t]&&i.group[o]&&(e=n('
').appendTo(i.$refs.stage),i.slides[t]=n.extend(!0,{},i.group[o],{pos:t,$slide:e,isLoaded:!1}),i.updateSlide(i.slides[t])),i.slides[t]},scaleToActual:function(t,e,o){var i,a,s,r,c,l=this,d=l.current,u=d.$content,f=n.fancybox.getTranslate(d.$slide).width,p=n.fancybox.getTranslate(d.$slide).height,h=d.width,g=d.height;l.isAnimating||l.isMoved()||!u||"image"!=d.type||!d.isLoaded||d.hasError||(l.isAnimating=!0,n.fancybox.stop(u),t=void 0===t?.5*f:t,e=void 0===e?.5*p:e,i=n.fancybox.getTranslate(u),i.top-=n.fancybox.getTranslate(d.$slide).top,i.left-=n.fancybox.getTranslate(d.$slide).left,r=h/i.width,c=g/i.height,a=.5*f-.5*h,s=.5*p-.5*g,h>f&&(a=i.left*r-(t*r-t),a>0&&(a=0),ap&&(s=i.top*c-(e*c-e),s>0&&(s=0),se-.5&&(l=e),d>o-.5&&(d=o),"image"===t.type?(u.top=Math.floor(.5*(o-d))+parseFloat(c.css("paddingTop")),u.left=Math.floor(.5*(e-l))+parseFloat(c.css("paddingLeft"))):"video"===t.contentType&&(a=t.opts.width&&t.opts.height?l/d:t.opts.ratio||16/9,d>l/a?d=l/a:l>d*a&&(l=d*a)),u.width=l,u.height=d,u)},update:function(t){var e=this;n.each(e.slides,function(n,o){e.updateSlide(o,t)})},updateSlide:function(t,e){var o=this,i=t&&t.$content,a=t.width||t.opts.width,s=t.height||t.opts.height,r=t.$slide;o.adjustCaption(t),i&&(a||s||"video"===t.contentType)&&!t.hasError&&(n.fancybox.stop(i),n.fancybox.setTranslate(i,o.getFitPos(t)),t.pos===o.currPos&&(o.isAnimating=!1,o.updateCursor())),o.adjustLayout(t),r.length&&(r.trigger("refresh"),t.pos===o.currPos&&o.$refs.toolbar.add(o.$refs.navigation.find(".fancybox-button--arrow_right")).toggleClass("compensate-for-scrollbar",r.get(0).scrollHeight>r.get(0).clientHeight)),o.trigger("onUpdate",t,e)},centerSlide:function(t){var e=this,o=e.current,i=o.$slide;!e.isClosing&&o&&(i.siblings().css({transform:"",opacity:""}),i.parent().children().removeClass("fancybox-slide--previous fancybox-slide--next"),n.fancybox.animate(i,{top:0,left:0,opacity:1},void 0===t?0:t,function(){i.css({transform:"",opacity:""}),o.isComplete||e.complete()},!1))},isMoved:function(t){var e,o,i=t||this.current;return!!i&&(o=n.fancybox.getTranslate(this.$refs.stage),e=n.fancybox.getTranslate(i.$slide),!i.$slide.hasClass("fancybox-animated")&&(Math.abs(e.top-o.top)>.5||Math.abs(e.left-o.left)>.5))},updateCursor:function(t,e){var o,i,a=this,s=a.current,r=a.$refs.container;s&&!a.isClosing&&a.Guestures&&(r.removeClass("fancybox-is-zoomable fancybox-can-zoomIn fancybox-can-zoomOut fancybox-can-swipe fancybox-can-pan"),o=a.canPan(t,e),i=!!o||a.isZoomable(),r.toggleClass("fancybox-is-zoomable",i),n("[data-fancybox-zoom]").prop("disabled",!i),o?r.addClass("fancybox-can-pan"):i&&("zoom"===s.opts.clickContent||n.isFunction(s.opts.clickContent)&&"zoom"==s.opts.clickContent(s))?r.addClass("fancybox-can-zoomIn"):s.opts.touch&&(s.opts.touch.vertical||a.group.length>1)&&"video"!==s.contentType&&r.addClass("fancybox-can-swipe"))},isZoomable:function(){var t,e=this,n=e.current;if(n&&!e.isClosing&&"image"===n.type&&!n.hasError){if(!n.isLoaded)return!0;if((t=e.getFitPos(n))&&(n.width>t.width||n.height>t.height))return!0}return!1},isScaledDown:function(t,e){var o=this,i=!1,a=o.current,s=a.$content;return void 0!==t&&void 0!==e?i=t1.5||Math.abs(a.height-s.height)>1.5)),s},loadSlide:function(t){var e,o,i,a=this;if(!t.isLoading&&!t.isLoaded){if(t.isLoading=!0,!1===a.trigger("beforeLoad",t))return t.isLoading=!1,!1;switch(e=t.type,o=t.$slide,o.off("refresh").trigger("onReset").addClass(t.opts.slideClass),e){case"image":a.setImage(t);break;case"iframe":a.setIframe(t);break;case"html":a.setContent(t,t.src||t.content);break;case"video":a.setContent(t,t.opts.video.tpl.replace(/\{\{src\}\}/gi,t.src).replace("{{format}}",t.opts.videoFormat||t.opts.video.format||"").replace("{{poster}}",t.thumb||""));break;case"inline":n(t.src).length?a.setContent(t,n(t.src)):a.setError(t);break;case"ajax":a.showLoading(t),i=n.ajax(n.extend({},t.opts.ajax.settings,{url:t.src,success:function(e,n){"success"===n&&a.setContent(t,e)},error:function(e,n){e&&"abort"!==n&&a.setError(t)}})),o.one("onReset",function(){i.abort()});break;default:a.setError(t)}return!0}},setImage:function(t){var o,i=this;setTimeout(function(){var e=t.$image;i.isClosing||!t.isLoading||e&&e.length&&e[0].complete||t.hasError||i.showLoading(t)},50),i.checkSrcset(t),t.$content=n('
').addClass("fancybox-is-hidden").appendTo(t.$slide.addClass("fancybox-slide--image")),!1!==t.opts.preload&&t.opts.width&&t.opts.height&&t.thumb&&(t.width=t.opts.width,t.height=t.opts.height,o=e.createElement("img"),o.onerror=function(){n(this).remove(),t.$ghost=null},o.onload=function(){i.afterLoad(t)},t.$ghost=n(o).addClass("fancybox-image").appendTo(t.$content).attr("src",t.thumb)),i.setBigImage(t)},checkSrcset:function(e){var n,o,i,a,s=e.opts.srcset||e.opts.image.srcset;if(s){i=t.devicePixelRatio||1,a=t.innerWidth*i,o=s.split(",").map(function(t){var e={};return t.trim().split(/\s+/).forEach(function(t,n){var o=parseInt(t.substring(0,t.length-1),10);if(0===n)return e.url=t;o&&(e.value=o,e.postfix=t[t.length-1])}),e}),o.sort(function(t,e){return t.value-e.value});for(var r=0;r=a||"x"===c.postfix&&c.value>=i){n=c;break}}!n&&o.length&&(n=o[o.length-1]),n&&(e.src=n.url,e.width&&e.height&&"w"==n.postfix&&(e.height=e.width/e.height*n.value,e.width=n.value),e.opts.srcset=s)}},setBigImage:function(t){var o=this,i=e.createElement("img"),a=n(i);t.$image=a.one("error",function(){o.setError(t)}).one("load",function(){var e;t.$ghost||(o.resolveImageSlideSize(t,this.naturalWidth,this.naturalHeight),o.afterLoad(t)),o.isClosing||(t.opts.srcset&&(e=t.opts.sizes,e&&"auto"!==e||(e=(t.width/t.height>1&&s.width()/s.height()>1?"100":Math.round(t.width/t.height*100))+"vw"),a.attr("sizes",e).attr("srcset",t.opts.srcset)),t.$ghost&&setTimeout(function(){t.$ghost&&!o.isClosing&&t.$ghost.hide()},Math.min(300,Math.max(1e3,t.height/1600))),o.hideLoading(t))}).addClass("fancybox-image").attr("src",t.src).appendTo(t.$content),(i.complete||"complete"==i.readyState)&&a.naturalWidth&&a.naturalHeight?a.trigger("load"):i.error&&a.trigger("error")},resolveImageSlideSize:function(t,e,n){var o=parseInt(t.opts.width,10),i=parseInt(t.opts.height,10);t.width=e,t.height=n,o>0&&(t.width=o,t.height=Math.floor(o*n/e)),i>0&&(t.width=Math.floor(i*e/n),t.height=i)},setIframe:function(t){var e,o=this,i=t.opts.iframe,a=t.$slide;t.$content=n('
').css(i.css).appendTo(a),a.addClass("fancybox-slide--"+t.contentType),t.$iframe=e=n(i.tpl.replace(/\{rnd\}/g,(new Date).getTime())).attr(i.attr).appendTo(t.$content),i.preload?(o.showLoading(t),e.on("load.fb error.fb",function(e){this.isReady=1,t.$slide.trigger("refresh"),o.afterLoad(t)}),a.on("refresh.fb",function(){var n,o,s=t.$content,r=i.css.width,c=i.css.height;if(1===e[0].isReady){try{n=e.contents(),o=n.find("body")}catch(t){}o&&o.length&&o.children().length&&(a.css("overflow","visible"),s.css({width:"100%","max-width":"100%",height:"9999px"}),void 0===r&&(r=Math.ceil(Math.max(o[0].clientWidth,o.outerWidth(!0)))),s.css("width",r||"").css("max-width",""),void 0===c&&(c=Math.ceil(Math.max(o[0].clientHeight,o.outerHeight(!0)))),s.css("height",c||""),a.css("overflow","auto")),s.removeClass("fancybox-is-hidden")}})):o.afterLoad(t),e.attr("src",t.src),a.one("onReset",function(){try{n(this).find("iframe").hide().unbind().attr("src","//about:blank")}catch(t){}n(this).off("refresh.fb").empty(),t.isLoaded=!1,t.isRevealed=!1})},setContent:function(t,e){var o=this;o.isClosing||(o.hideLoading(t),t.$content&&n.fancybox.stop(t.$content),t.$slide.empty(),l(e)&&e.parent().length?((e.hasClass("fancybox-content")||e.parent().hasClass("fancybox-content"))&&e.parents(".fancybox-slide").trigger("onReset"),t.$placeholder=n("
").hide().insertAfter(e),e.css("display","inline-block")):t.hasError||("string"===n.type(e)&&(e=n("
").append(n.trim(e)).contents()),t.opts.filter&&(e=n("
").html(e).find(t.opts.filter))),t.$slide.one("onReset",function(){n(this).find("video,audio").trigger("pause"),t.$placeholder&&(t.$placeholder.after(e.removeClass("fancybox-content").hide()).remove(),t.$placeholder=null),t.$smallBtn&&(t.$smallBtn.remove(),t.$smallBtn=null),t.hasError||(n(this).empty(),t.isLoaded=!1,t.isRevealed=!1)}),n(e).appendTo(t.$slide),n(e).is("video,audio")&&(n(e).addClass("fancybox-video"),n(e).wrap("
"),t.contentType="video",t.opts.width=t.opts.width||n(e).attr("width"),t.opts.height=t.opts.height||n(e).attr("height")),t.$content=t.$slide.children().filter("div,form,main,video,audio,article,.fancybox-content").first(),t.$content.siblings().hide(),t.$content.length||(t.$content=t.$slide.wrapInner("
").children().first()),t.$content.addClass("fancybox-content"),t.$slide.addClass("fancybox-slide--"+t.contentType),o.afterLoad(t))},setError:function(t){t.hasError=!0,t.$slide.trigger("onReset").removeClass("fancybox-slide--"+t.contentType).addClass("fancybox-slide--error"),t.contentType="html",this.setContent(t,this.translate(t,t.opts.errorTpl)),t.pos===this.currPos&&(this.isAnimating=!1)},showLoading:function(t){var e=this;(t=t||e.current)&&!t.$spinner&&(t.$spinner=n(e.translate(e,e.opts.spinnerTpl)).appendTo(t.$slide).hide().fadeIn("fast"))},hideLoading:function(t){var e=this;(t=t||e.current)&&t.$spinner&&(t.$spinner.stop().remove(),delete t.$spinner)},afterLoad:function(t){var e=this;e.isClosing||(t.isLoading=!1,t.isLoaded=!0,e.trigger("afterLoad",t),e.hideLoading(t),!t.opts.smallBtn||t.$smallBtn&&t.$smallBtn.length||(t.$smallBtn=n(e.translate(t,t.opts.btnTpl.smallBtn)).appendTo(t.$content)),t.opts.protect&&t.$content&&!t.hasError&&(t.$content.on("contextmenu.fb",function(t){return 2==t.button&&t.preventDefault(),!0}),"image"===t.type&&n('
').appendTo(t.$content)),e.adjustCaption(t),e.adjustLayout(t),t.pos===e.currPos&&e.updateCursor(),e.revealContent(t))},adjustCaption:function(t){var e,n=this,o=t||n.current,i=o.opts.caption,a=o.opts.preventCaptionOverlap,s=n.$refs.caption,r=!1;s.toggleClass("fancybox-caption--separate",a),a&&i&&i.length&&(o.pos!==n.currPos?(e=s.clone().appendTo(s.parent()),e.children().eq(0).empty().html(i),r=e.outerHeight(!0),e.empty().remove()):n.$caption&&(r=n.$caption.outerHeight(!0)),o.$slide.css("padding-bottom",r||""))},adjustLayout:function(t){var e,n,o,i,a=this,s=t||a.current;s.isLoaded&&!0!==s.opts.disableLayoutFix&&(s.$content.css("margin-bottom",""),s.$content.outerHeight()>s.$slide.height()+.5&&(o=s.$slide[0].style["padding-bottom"],i=s.$slide.css("padding-bottom"),parseFloat(i)>0&&(e=s.$slide[0].scrollHeight,s.$slide.css("padding-bottom",0),Math.abs(e-s.$slide[0].scrollHeight)<1&&(n=i),s.$slide.css("padding-bottom",o))),s.$content.css("margin-bottom",n))},revealContent:function(t){var e,o,i,a,s=this,r=t.$slide,c=!1,l=!1,d=s.isMoved(t),u=t.isRevealed;return t.isRevealed=!0,e=t.opts[s.firstRun?"animationEffect":"transitionEffect"],i=t.opts[s.firstRun?"animationDuration":"transitionDuration"],i=parseInt(void 0===t.forcedDuration?i:t.forcedDuration,10),!d&&t.pos===s.currPos&&i||(e=!1),"zoom"===e&&(t.pos===s.currPos&&i&&"image"===t.type&&!t.hasError&&(l=s.getThumbPos(t))?c=s.getFitPos(t):e="fade"),"zoom"===e?(s.isAnimating=!0,c.scaleX=c.width/l.width,c.scaleY=c.height/l.height,a=t.opts.zoomOpacity,"auto"==a&&(a=Math.abs(t.width/t.height-l.width/l.height)>.1),a&&(l.opacity=.1,c.opacity=1),n.fancybox.setTranslate(t.$content.removeClass("fancybox-is-hidden"),l),p(t.$content),void n.fancybox.animate(t.$content,c,i,function(){s.isAnimating=!1,s.complete()})):(s.updateSlide(t),e?(n.fancybox.stop(r),o="fancybox-slide--"+(t.pos>=s.prevPos?"next":"previous")+" fancybox-animated fancybox-fx-"+e,r.addClass(o).removeClass("fancybox-slide--current"),t.$content.removeClass("fancybox-is-hidden"),p(r),"image"!==t.type&&t.$content.hide().show(0),void n.fancybox.animate(r,"fancybox-slide--current",i,function(){r.removeClass(o).css({transform:"",opacity:""}),t.pos===s.currPos&&s.complete()},!0)):(t.$content.removeClass("fancybox-is-hidden"),u||!d||"image"!==t.type||t.hasError||t.$content.hide().fadeIn("fast"),void(t.pos===s.currPos&&s.complete())))},getThumbPos:function(t){var e,o,i,a,s,r=!1,c=t.$thumb;return!(!c||!g(c[0]))&&(e=n.fancybox.getTranslate(c),o=parseFloat(c.css("border-top-width")||0),i=parseFloat(c.css("border-right-width")||0),a=parseFloat(c.css("border-bottom-width")||0),s=parseFloat(c.css("border-left-width")||0),r={top:e.top+o,left:e.left+s,width:e.width-i-s,height:e.height-o-a,scaleX:1,scaleY:1},e.width>0&&e.height>0&&r)},complete:function(){var t,e=this,o=e.current,i={};!e.isMoved()&&o.isLoaded&&(o.isComplete||(o.isComplete=!0,o.$slide.siblings().trigger("onReset"),e.preload("inline"),p(o.$slide),o.$slide.addClass("fancybox-slide--complete"),n.each(e.slides,function(t,o){o.pos>=e.currPos-1&&o.pos<=e.currPos+1?i[o.pos]=o:o&&(n.fancybox.stop(o.$slide),o.$slide.off().remove())}),e.slides=i),e.isAnimating=!1,e.updateCursor(),e.trigger("afterShow"),o.opts.video.autoStart&&o.$slide.find("video,audio").filter(":visible:first").trigger("play").one("ended",function(){Document.exitFullscreen?Document.exitFullscreen():this.webkitExitFullscreen&&this.webkitExitFullscreen(),e.next()}),o.opts.autoFocus&&"html"===o.contentType&&(t=o.$content.find("input[autofocus]:enabled:visible:first"),t.length?t.trigger("focus"):e.focus(null,!0)),o.$slide.scrollTop(0).scrollLeft(0))},preload:function(t){var e,n,o=this;o.group.length<2||(n=o.slides[o.currPos+1],e=o.slides[o.currPos-1],e&&e.type===t&&o.loadSlide(e),n&&n.type===t&&o.loadSlide(n))},focus:function(t,o){var i,a,s=this,r=["a[href]","area[href]",'input:not([disabled]):not([type="hidden"]):not([aria-hidden])',"select:not([disabled]):not([aria-hidden])","textarea:not([disabled]):not([aria-hidden])","button:not([disabled]):not([aria-hidden])","iframe","object","embed","video","audio","[contenteditable]",'[tabindex]:not([tabindex^="-"])'].join(",");s.isClosing||(i=!t&&s.current&&s.current.isComplete?s.current.$slide.find("*:visible"+(o?":not(.fancybox-close-small)":"")):s.$refs.container.find("*:visible"),i=i.filter(r).filter(function(){return"hidden"!==n(this).css("visibility")&&!n(this).hasClass("disabled")}),i.length?(a=i.index(e.activeElement),t&&t.shiftKey?(a<0||0==a)&&(t.preventDefault(),i.eq(i.length-1).trigger("focus")):(a<0||a==i.length-1)&&(t&&t.preventDefault(),i.eq(0).trigger("focus"))):s.$refs.container.trigger("focus"))},activate:function(){var t=this;n(".fancybox-container").each(function(){var e=n(this).data("FancyBox");e&&e.id!==t.id&&!e.isClosing&&(e.trigger("onDeactivate"),e.removeEvents(),e.isVisible=!1)}),t.isVisible=!0,(t.current||t.isIdle)&&(t.update(),t.updateControls()),t.trigger("onActivate"),t.addEvents()},close:function(t,e){var o,i,a,s,r,c,l,u=this,f=u.current,h=function(){u.cleanUp(t)};return!u.isClosing&&(u.isClosing=!0,!1===u.trigger("beforeClose",t)?(u.isClosing=!1,d(function(){u.update()}),!1):(u.removeEvents(),a=f.$content,o=f.opts.animationEffect,i=n.isNumeric(e)?e:o?f.opts.animationDuration:0,f.$slide.removeClass("fancybox-slide--complete fancybox-slide--next fancybox-slide--previous fancybox-animated"),!0!==t?n.fancybox.stop(f.$slide):o=!1,f.$slide.siblings().trigger("onReset").remove(),i&&u.$refs.container.removeClass("fancybox-is-open").addClass("fancybox-is-closing").css("transition-duration",i+"ms"),u.hideLoading(f),u.hideControls(!0),u.updateCursor(),"zoom"!==o||a&&i&&"image"===f.type&&!u.isMoved()&&!f.hasError&&(l=u.getThumbPos(f))||(o="fade"),"zoom"===o?(n.fancybox.stop(a),s=n.fancybox.getTranslate(a),c={top:s.top,left:s.left,scaleX:s.width/l.width,scaleY:s.height/l.height,width:l.width,height:l.height},r=f.opts.zoomOpacity, +"auto"==r&&(r=Math.abs(f.width/f.height-l.width/l.height)>.1),r&&(l.opacity=0),n.fancybox.setTranslate(a,c),p(a),n.fancybox.animate(a,l,i,h),!0):(o&&i?n.fancybox.animate(f.$slide.addClass("fancybox-slide--previous").removeClass("fancybox-slide--current"),"fancybox-animated fancybox-fx-"+o,i,h):!0===t?setTimeout(h,i):h(),!0)))},cleanUp:function(e){var o,i,a,s=this,r=s.current.opts.$orig;s.current.$slide.trigger("onReset"),s.$refs.container.empty().remove(),s.trigger("afterClose",e),s.current.opts.backFocus&&(r&&r.length&&r.is(":visible")||(r=s.$trigger),r&&r.length&&(i=t.scrollX,a=t.scrollY,r.trigger("focus"),n("html, body").scrollTop(a).scrollLeft(i))),s.current=null,o=n.fancybox.getInstance(),o?o.activate():(n("body").removeClass("fancybox-active compensate-for-scrollbar"),n("#fancybox-style-noscroll").remove())},trigger:function(t,e){var o,i=Array.prototype.slice.call(arguments,1),a=this,s=e&&e.opts?e:a.current;if(s?i.unshift(s):s=a,i.unshift(a),n.isFunction(s.opts[t])&&(o=s.opts[t].apply(s,i)),!1===o)return o;"afterClose"!==t&&a.$refs?a.$refs.container.trigger(t+".fb",i):r.trigger(t+".fb",i)},updateControls:function(){var t=this,o=t.current,i=o.index,a=t.$refs.container,s=t.$refs.caption,r=o.opts.caption;o.$slide.trigger("refresh"),r&&r.length?(t.$caption=s,s.children().eq(0).html(r)):t.$caption=null,t.hasHiddenControls||t.isIdle||t.showControls(),a.find("[data-fancybox-count]").html(t.group.length),a.find("[data-fancybox-index]").html(i+1),a.find("[data-fancybox-prev]").prop("disabled",!o.opts.loop&&i<=0),a.find("[data-fancybox-next]").prop("disabled",!o.opts.loop&&i>=t.group.length-1),"image"===o.type?a.find("[data-fancybox-zoom]").show().end().find("[data-fancybox-download]").attr("href",o.opts.image.src||o.src).show():o.opts.toolbar&&a.find("[data-fancybox-download],[data-fancybox-zoom]").hide(),n(e.activeElement).is(":hidden,[disabled]")&&t.$refs.container.trigger("focus")},hideControls:function(t){var e=this,n=["infobar","toolbar","nav"];!t&&e.current.opts.preventCaptionOverlap||n.push("caption"),this.$refs.container.removeClass(n.map(function(t){return"fancybox-show-"+t}).join(" ")),this.hasHiddenControls=!0},showControls:function(){var t=this,e=t.current?t.current.opts:t.opts,n=t.$refs.container;t.hasHiddenControls=!1,t.idleSecondsCounter=0,n.toggleClass("fancybox-show-toolbar",!(!e.toolbar||!e.buttons)).toggleClass("fancybox-show-infobar",!!(e.infobar&&t.group.length>1)).toggleClass("fancybox-show-caption",!!t.$caption).toggleClass("fancybox-show-nav",!!(e.arrows&&t.group.length>1)).toggleClass("fancybox-is-modal",!!e.modal)},toggleControls:function(){this.hasHiddenControls?this.showControls():this.hideControls()}}),n.fancybox={version:"3.5.7",defaults:a,getInstance:function(t){var e=n('.fancybox-container:not(".fancybox-is-closing"):last').data("FancyBox"),o=Array.prototype.slice.call(arguments,1);return e instanceof b&&("string"===n.type(t)?e[t].apply(e,o):"function"===n.type(t)&&t.apply(e,o),e)},open:function(t,e,n){return new b(t,e,n)},close:function(t){var e=this.getInstance();e&&(e.close(),!0===t&&this.close(t))},destroy:function(){this.close(!0),r.add("body").off("click.fb-start","**")},isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),use3d:function(){var n=e.createElement("div");return t.getComputedStyle&&t.getComputedStyle(n)&&t.getComputedStyle(n).getPropertyValue("transform")&&!(e.documentMode&&e.documentMode<11)}(),getTranslate:function(t){var e;return!(!t||!t.length)&&(e=t[0].getBoundingClientRect(),{top:e.top||0,left:e.left||0,width:e.width,height:e.height,opacity:parseFloat(t.css("opacity"))})},setTranslate:function(t,e){var n="",o={};if(t&&e)return void 0===e.left&&void 0===e.top||(n=(void 0===e.left?t.position().left:e.left)+"px, "+(void 0===e.top?t.position().top:e.top)+"px",n=this.use3d?"translate3d("+n+", 0px)":"translate("+n+")"),void 0!==e.scaleX&&void 0!==e.scaleY?n+=" scale("+e.scaleX+", "+e.scaleY+")":void 0!==e.scaleX&&(n+=" scaleX("+e.scaleX+")"),n.length&&(o.transform=n),void 0!==e.opacity&&(o.opacity=e.opacity),void 0!==e.width&&(o.width=e.width),void 0!==e.height&&(o.height=e.height),t.css(o)},animate:function(t,e,o,i,a){var s,r=this;n.isFunction(o)&&(i=o,o=null),r.stop(t),s=r.getTranslate(t),t.on(f,function(c){(!c||!c.originalEvent||t.is(c.originalEvent.target)&&"z-index"!=c.originalEvent.propertyName)&&(r.stop(t),n.isNumeric(o)&&t.css("transition-duration",""),n.isPlainObject(e)?void 0!==e.scaleX&&void 0!==e.scaleY&&r.setTranslate(t,{top:e.top,left:e.left,width:s.width*e.scaleX,height:s.height*e.scaleY,scaleX:1,scaleY:1}):!0!==a&&t.removeClass(e),n.isFunction(i)&&i(c))}),n.isNumeric(o)&&t.css("transition-duration",o+"ms"),n.isPlainObject(e)?(void 0!==e.scaleX&&void 0!==e.scaleY&&(delete e.width,delete e.height,t.parent().hasClass("fancybox-slide--image")&&t.parent().addClass("fancybox-is-scaling")),n.fancybox.setTranslate(t,e)):t.addClass(e),t.data("timer",setTimeout(function(){t.trigger(f)},o+33))},stop:function(t,e){t&&t.length&&(clearTimeout(t.data("timer")),e&&t.trigger(f),t.off(f).css("transition-duration",""),t.parent().removeClass("fancybox-is-scaling"))}},n.fn.fancybox=function(t){var e;return t=t||{},e=t.selector||!1,e?n("body").off("click.fb-start",e).on("click.fb-start",e,{options:t},i):this.off("click.fb-start").on("click.fb-start",{items:this,options:t},i),this},r.on("click.fb-start","[data-fancybox]",i),r.on("click.fb-start","[data-fancybox-trigger]",function(t){n('[data-fancybox="'+n(this).attr("data-fancybox-trigger")+'"]').eq(n(this).attr("data-fancybox-index")||0).trigger("click.fb-start",{$trigger:n(this)})}),function(){var t=null;r.on("mousedown mouseup focus blur",".fancybox-button",function(e){switch(e.type){case"mousedown":t=n(this);break;case"mouseup":t=null;break;case"focusin":n(".fancybox-button").removeClass("fancybox-focus"),n(this).is(t)||n(this).is("[disabled]")||n(this).addClass("fancybox-focus");break;case"focusout":n(".fancybox-button").removeClass("fancybox-focus")}})}()}}(window,document,jQuery),function(t){"use strict";var e={youtube:{matcher:/(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(watch\?(.*&)?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*))(.*)/i,params:{autoplay:1,autohide:1,fs:1,rel:0,hd:1,wmode:"transparent",enablejsapi:1,html5:1},paramPlace:8,type:"iframe",url:"https://www.youtube-nocookie.com/embed/$4",thumb:"https://img.youtube.com/vi/$4/hqdefault.jpg"},vimeo:{matcher:/^.+vimeo.com\/(.*\/)?([\d]+)(.*)?/,params:{autoplay:1,hd:1,show_title:1,show_byline:1,show_portrait:0,fullscreen:1},paramPlace:3,type:"iframe",url:"//player.vimeo.com/video/$2"},instagram:{matcher:/(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i,type:"image",url:"//$1/p/$2/media/?size=l"},gmap_place:{matcher:/(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(((maps\/(place\/(.*)\/)?\@(.*),(\d+.?\d+?)z))|(\?ll=))(.*)?/i,type:"iframe",url:function(t){return"//maps.google."+t[2]+"/?ll="+(t[9]?t[9]+"&z="+Math.floor(t[10])+(t[12]?t[12].replace(/^\//,"&"):""):t[12]+"").replace(/\?/,"&")+"&output="+(t[12]&&t[12].indexOf("layer=c")>0?"svembed":"embed")}},gmap_search:{matcher:/(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(maps\/search\/)(.*)/i,type:"iframe",url:function(t){return"//maps.google."+t[2]+"/maps?q="+t[5].replace("query=","q=").replace("api=1","")+"&output=embed"}}},n=function(e,n,o){if(e)return o=o||"","object"===t.type(o)&&(o=t.param(o,!0)),t.each(n,function(t,n){e=e.replace("$"+t,n||"")}),o.length&&(e+=(e.indexOf("?")>0?"&":"?")+o),e};t(document).on("objectNeedsType.fb",function(o,i,a){var s,r,c,l,d,u,f,p=a.src||"",h=!1;s=t.extend(!0,{},e,a.opts.media),t.each(s,function(e,o){if(c=p.match(o.matcher)){if(h=o.type,f=e,u={},o.paramPlace&&c[o.paramPlace]){d=c[o.paramPlace],"?"==d[0]&&(d=d.substring(1)),d=d.split("&");for(var i=0;i1&&("youtube"===n.contentSource||"vimeo"===n.contentSource)&&o.load(n.contentSource)}})}(jQuery),function(t,e,n){"use strict";var o=function(){return t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||function(e){return t.setTimeout(e,1e3/60)}}(),i=function(){return t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.mozCancelAnimationFrame||t.oCancelAnimationFrame||function(e){t.clearTimeout(e)}}(),a=function(e){var n=[];e=e.originalEvent||e||t.e,e=e.touches&&e.touches.length?e.touches:e.changedTouches&&e.changedTouches.length?e.changedTouches:[e];for(var o in e)e[o].pageX?n.push({x:e[o].pageX,y:e[o].pageY}):e[o].clientX&&n.push({x:e[o].clientX,y:e[o].clientY});return n},s=function(t,e,n){return e&&t?"x"===n?t.x-e.x:"y"===n?t.y-e.y:Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2)):0},r=function(t){if(t.is('a,area,button,[role="button"],input,label,select,summary,textarea,video,audio,iframe')||n.isFunction(t.get(0).onclick)||t.data("selectable"))return!0;for(var e=0,o=t[0].attributes,i=o.length;ee.clientHeight,a=("scroll"===o||"auto"===o)&&e.scrollWidth>e.clientWidth;return i||a},l=function(t){for(var e=!1;;){if(e=c(t.get(0)))break;if(t=t.parent(),!t.length||t.hasClass("fancybox-stage")||t.is("body"))break}return e},d=function(t){var e=this;e.instance=t,e.$bg=t.$refs.bg,e.$stage=t.$refs.stage,e.$container=t.$refs.container,e.destroy(),e.$container.on("touchstart.fb.touch mousedown.fb.touch",n.proxy(e,"ontouchstart"))};d.prototype.destroy=function(){var t=this;t.$container.off(".fb.touch"),n(e).off(".fb.touch"),t.requestId&&(i(t.requestId),t.requestId=null),t.tapped&&(clearTimeout(t.tapped),t.tapped=null)},d.prototype.ontouchstart=function(o){var i=this,c=n(o.target),d=i.instance,u=d.current,f=u.$slide,p=u.$content,h="touchstart"==o.type;if(h&&i.$container.off("mousedown.fb.touch"),(!o.originalEvent||2!=o.originalEvent.button)&&f.length&&c.length&&!r(c)&&!r(c.parent())&&(c.is("img")||!(o.originalEvent.clientX>c[0].clientWidth+c.offset().left))){if(!u||d.isAnimating||u.$slide.hasClass("fancybox-animated"))return o.stopPropagation(),void o.preventDefault();i.realPoints=i.startPoints=a(o),i.startPoints.length&&(u.touch&&o.stopPropagation(),i.startEvent=o,i.canTap=!0,i.$target=c,i.$content=p,i.opts=u.opts.touch,i.isPanning=!1,i.isSwiping=!1,i.isZooming=!1,i.isScrolling=!1,i.canPan=d.canPan(),i.startTime=(new Date).getTime(),i.distanceX=i.distanceY=i.distance=0,i.canvasWidth=Math.round(f[0].clientWidth),i.canvasHeight=Math.round(f[0].clientHeight),i.contentLastPos=null,i.contentStartPos=n.fancybox.getTranslate(i.$content)||{top:0,left:0},i.sliderStartPos=n.fancybox.getTranslate(f),i.stagePos=n.fancybox.getTranslate(d.$refs.stage),i.sliderStartPos.top-=i.stagePos.top,i.sliderStartPos.left-=i.stagePos.left,i.contentStartPos.top-=i.stagePos.top,i.contentStartPos.left-=i.stagePos.left,n(e).off(".fb.touch").on(h?"touchend.fb.touch touchcancel.fb.touch":"mouseup.fb.touch mouseleave.fb.touch",n.proxy(i,"ontouchend")).on(h?"touchmove.fb.touch":"mousemove.fb.touch",n.proxy(i,"ontouchmove")),n.fancybox.isMobile&&e.addEventListener("scroll",i.onscroll,!0),((i.opts||i.canPan)&&(c.is(i.$stage)||i.$stage.find(c).length)||(c.is(".fancybox-image")&&o.preventDefault(),n.fancybox.isMobile&&c.parents(".fancybox-caption").length))&&(i.isScrollable=l(c)||l(c.parent()),n.fancybox.isMobile&&i.isScrollable||o.preventDefault(),(1===i.startPoints.length||u.hasError)&&(i.canPan?(n.fancybox.stop(i.$content),i.isPanning=!0):i.isSwiping=!0,i.$container.addClass("fancybox-is-grabbing")),2===i.startPoints.length&&"image"===u.type&&(u.isLoaded||u.$ghost)&&(i.canTap=!1,i.isSwiping=!1,i.isPanning=!1,i.isZooming=!0,n.fancybox.stop(i.$content),i.centerPointStartX=.5*(i.startPoints[0].x+i.startPoints[1].x)-n(t).scrollLeft(),i.centerPointStartY=.5*(i.startPoints[0].y+i.startPoints[1].y)-n(t).scrollTop(),i.percentageOfImageAtPinchPointX=(i.centerPointStartX-i.contentStartPos.left)/i.contentStartPos.width,i.percentageOfImageAtPinchPointY=(i.centerPointStartY-i.contentStartPos.top)/i.contentStartPos.height,i.startDistanceBetweenFingers=s(i.startPoints[0],i.startPoints[1]))))}},d.prototype.onscroll=function(t){var n=this;n.isScrolling=!0,e.removeEventListener("scroll",n.onscroll,!0)},d.prototype.ontouchmove=function(t){var e=this;return void 0!==t.originalEvent.buttons&&0===t.originalEvent.buttons?void e.ontouchend(t):e.isScrolling?void(e.canTap=!1):(e.newPoints=a(t),void((e.opts||e.canPan)&&e.newPoints.length&&e.newPoints.length&&(e.isSwiping&&!0===e.isSwiping||t.preventDefault(),e.distanceX=s(e.newPoints[0],e.startPoints[0],"x"),e.distanceY=s(e.newPoints[0],e.startPoints[0],"y"),e.distance=s(e.newPoints[0],e.startPoints[0]),e.distance>0&&(e.isSwiping?e.onSwipe(t):e.isPanning?e.onPan():e.isZooming&&e.onZoom()))))},d.prototype.onSwipe=function(e){var a,s=this,r=s.instance,c=s.isSwiping,l=s.sliderStartPos.left||0;if(!0!==c)"x"==c&&(s.distanceX>0&&(s.instance.group.length<2||0===s.instance.current.index&&!s.instance.current.opts.loop)?l+=Math.pow(s.distanceX,.8):s.distanceX<0&&(s.instance.group.length<2||s.instance.current.index===s.instance.group.length-1&&!s.instance.current.opts.loop)?l-=Math.pow(-s.distanceX,.8):l+=s.distanceX),s.sliderLastPos={top:"x"==c?0:s.sliderStartPos.top+s.distanceY,left:l},s.requestId&&(i(s.requestId),s.requestId=null),s.requestId=o(function(){s.sliderLastPos&&(n.each(s.instance.slides,function(t,e){var o=e.pos-s.instance.currPos;n.fancybox.setTranslate(e.$slide,{top:s.sliderLastPos.top,left:s.sliderLastPos.left+o*s.canvasWidth+o*e.opts.gutter})}),s.$container.addClass("fancybox-is-sliding"))});else if(Math.abs(s.distance)>10){if(s.canTap=!1,r.group.length<2&&s.opts.vertical?s.isSwiping="y":r.isDragging||!1===s.opts.vertical||"auto"===s.opts.vertical&&n(t).width()>800?s.isSwiping="x":(a=Math.abs(180*Math.atan2(s.distanceY,s.distanceX)/Math.PI),s.isSwiping=a>45&&a<135?"y":"x"),"y"===s.isSwiping&&n.fancybox.isMobile&&s.isScrollable)return void(s.isScrolling=!0);r.isDragging=s.isSwiping,s.startPoints=s.newPoints,n.each(r.slides,function(t,e){var o,i;n.fancybox.stop(e.$slide),o=n.fancybox.getTranslate(e.$slide),i=n.fancybox.getTranslate(r.$refs.stage),e.$slide.css({transform:"",opacity:"","transition-duration":""}).removeClass("fancybox-animated").removeClass(function(t,e){return(e.match(/(^|\s)fancybox-fx-\S+/g)||[]).join(" ")}),e.pos===r.current.pos&&(s.sliderStartPos.top=o.top-i.top,s.sliderStartPos.left=o.left-i.left),n.fancybox.setTranslate(e.$slide,{top:o.top-i.top,left:o.left-i.left})}),r.SlideShow&&r.SlideShow.isActive&&r.SlideShow.stop()}},d.prototype.onPan=function(){var t=this;if(s(t.newPoints[0],t.realPoints[0])<(n.fancybox.isMobile?10:5))return void(t.startPoints=t.newPoints);t.canTap=!1,t.contentLastPos=t.limitMovement(),t.requestId&&i(t.requestId),t.requestId=o(function(){n.fancybox.setTranslate(t.$content,t.contentLastPos)})},d.prototype.limitMovement=function(){var t,e,n,o,i,a,s=this,r=s.canvasWidth,c=s.canvasHeight,l=s.distanceX,d=s.distanceY,u=s.contentStartPos,f=u.left,p=u.top,h=u.width,g=u.height;return i=h>r?f+l:f,a=p+d,t=Math.max(0,.5*r-.5*h),e=Math.max(0,.5*c-.5*g),n=Math.min(r-h,.5*r-.5*h),o=Math.min(c-g,.5*c-.5*g),l>0&&i>t&&(i=t-1+Math.pow(-t+f+l,.8)||0),l<0&&i0&&a>e&&(a=e-1+Math.pow(-e+p+d,.8)||0),d<0&&aa?(t=t>0?0:t,t=ts?(e=e>0?0:e,e=e1&&(o.dMs>130&&s>10||s>50);o.sliderLastPos=null,"y"==t&&!e&&Math.abs(o.distanceY)>50?(n.fancybox.animate(o.instance.current.$slide,{top:o.sliderStartPos.top+o.distanceY+150*o.velocityY,opacity:0},200),i=o.instance.close(!0,250)):r&&o.distanceX>0?i=o.instance.previous(300):r&&o.distanceX<0&&(i=o.instance.next(300)),!1!==i||"x"!=t&&"y"!=t||o.instance.centerSlide(200),o.$container.removeClass("fancybox-is-sliding")},d.prototype.endPanning=function(){var t,e,o,i=this;i.contentLastPos&&(!1===i.opts.momentum||i.dMs>350?(t=i.contentLastPos.left,e=i.contentLastPos.top):(t=i.contentLastPos.left+500*i.velocityX,e=i.contentLastPos.top+500*i.velocityY),o=i.limitPosition(t,e,i.contentStartPos.width,i.contentStartPos.height),o.width=i.contentStartPos.width,o.height=i.contentStartPos.height,n.fancybox.animate(i.$content,o,366))},d.prototype.endZooming=function(){var t,e,o,i,a=this,s=a.instance.current,r=a.newWidth,c=a.newHeight;a.contentLastPos&&(t=a.contentLastPos.left,e=a.contentLastPos.top,i={top:e,left:t,width:r,height:c,scaleX:1,scaleY:1},n.fancybox.setTranslate(a.$content,i),rs.width||c>s.height?a.instance.scaleToActual(a.centerPointStartX,a.centerPointStartY,150):(o=a.limitPosition(t,e,r,c),n.fancybox.animate(a.$content,o,150)))},d.prototype.onTap=function(e){var o,i=this,s=n(e.target),r=i.instance,c=r.current,l=e&&a(e)||i.startPoints,d=l[0]?l[0].x-n(t).scrollLeft()-i.stagePos.left:0,u=l[0]?l[0].y-n(t).scrollTop()-i.stagePos.top:0,f=function(t){var o=c.opts[t];if(n.isFunction(o)&&(o=o.apply(r,[c,e])),o)switch(o){case"close":r.close(i.startEvent);break;case"toggleControls":r.toggleControls();break;case"next":r.next();break;case"nextOrClose":r.group.length>1?r.next():r.close(i.startEvent);break;case"zoom":"image"==c.type&&(c.isLoaded||c.$ghost)&&(r.canPan()?r.scaleToFit():r.isScaledDown()?r.scaleToActual(d,u):r.group.length<2&&r.close(i.startEvent))}};if((!e.originalEvent||2!=e.originalEvent.button)&&(s.is("img")||!(d>s[0].clientWidth+s.offset().left))){if(s.is(".fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-container"))o="Outside";else if(s.is(".fancybox-slide"))o="Slide";else{if(!r.current.$content||!r.current.$content.find(s).addBack().filter(s).length)return;o="Content"}if(i.tapped){if(clearTimeout(i.tapped),i.tapped=null,Math.abs(d-i.tapX)>50||Math.abs(u-i.tapY)>50)return this;f("dblclick"+o)}else i.tapX=d,i.tapY=u,c.opts["dblclick"+o]&&c.opts["dblclick"+o]!==c.opts["click"+o]?i.tapped=setTimeout(function(){i.tapped=null,r.isAnimating||f("click"+o)},500):f("click"+o);return this}},n(e).on("onActivate.fb",function(t,e){e&&!e.Guestures&&(e.Guestures=new d(e))}).on("beforeClose.fb",function(t,e){e&&e.Guestures&&e.Guestures.destroy()})}(window,document,jQuery),function(t,e){"use strict";e.extend(!0,e.fancybox.defaults,{btnTpl:{slideShow:''},slideShow:{autoStart:!1,speed:3e3,progress:!0}});var n=function(t){this.instance=t,this.init()};e.extend(n.prototype,{timer:null,isActive:!1,$button:null,init:function(){var t=this,n=t.instance,o=n.group[n.currIndex].opts.slideShow;t.$button=n.$refs.toolbar.find("[data-fancybox-play]").on("click",function(){t.toggle()}),n.group.length<2||!o?t.$button.hide():o.progress&&(t.$progress=e('
').appendTo(n.$refs.inner))},set:function(t){var n=this,o=n.instance,i=o.current;i&&(!0===t||i.opts.loop||o.currIndex'},fullScreen:{autoStart:!1}}),e(t).on(n.fullscreenchange,function(){var t=o.isFullscreen(),n=e.fancybox.getInstance();n&&(n.current&&"image"===n.current.type&&n.isAnimating&&(n.isAnimating=!1,n.update(!0,!0,0),n.isComplete||n.complete()),n.trigger("onFullscreenChange",t),n.$refs.container.toggleClass("fancybox-is-fullscreen",t),n.$refs.toolbar.find("[data-fancybox-fullscreen]").toggleClass("fancybox-button--fsenter",!t).toggleClass("fancybox-button--fsexit",t))})}e(t).on({"onInit.fb":function(t,e){var i;if(!n)return void e.$refs.toolbar.find("[data-fancybox-fullscreen]").remove();e&&e.group[e.currIndex].opts.fullScreen?(i=e.$refs.container,i.on("click.fb-fullscreen","[data-fancybox-fullscreen]",function(t){t.stopPropagation(),t.preventDefault(),o.toggle()}),e.opts.fullScreen&&!0===e.opts.fullScreen.autoStart&&o.request(),e.FullScreen=o):e&&e.$refs.toolbar.find("[data-fancybox-fullscreen]").hide()},"afterKeydown.fb":function(t,e,n,o,i){e&&e.FullScreen&&70===i&&(o.preventDefault(),e.FullScreen.toggle())},"beforeClose.fb":function(t,e){e&&e.FullScreen&&e.$refs.container.hasClass("fancybox-is-fullscreen")&&o.exit()}})}(document,jQuery),function(t,e){"use strict";var n="fancybox-thumbs";e.fancybox.defaults=e.extend(!0,{btnTpl:{thumbs:''},thumbs:{autoStart:!1,hideOnClose:!0,parentEl:".fancybox-container",axis:"y"}},e.fancybox.defaults);var o=function(t){this.init(t)};e.extend(o.prototype,{$button:null,$grid:null,$list:null,isVisible:!1,isActive:!1,init:function(t){var e=this,n=t.group,o=0;e.instance=t,e.opts=n[t.currIndex].opts.thumbs,t.Thumbs=e,e.$button=t.$refs.toolbar.find("[data-fancybox-thumbs]");for(var i=0,a=n.length;i1));i++);o>1&&e.opts?(e.$button.removeAttr("style").on("click",function(){e.toggle()}),e.isActive=!0):e.$button.hide()},create:function(){var t,o=this,i=o.instance,a=o.opts.parentEl,s=[];o.$grid||(o.$grid=e('
').appendTo(i.$refs.container.find(a).addBack().filter(a)),o.$grid.on("click","a",function(){i.jumpTo(e(this).attr("data-index"))})),o.$list||(o.$list=e('
').appendTo(o.$grid)),e.each(i.group,function(e,n){t=n.thumb,t||"image"!==n.type||(t=n.src),s.push('")}),o.$list[0].innerHTML=s.join(""),"x"===o.opts.axis&&o.$list.width(parseInt(o.$grid.css("padding-right"),10)+i.group.length*o.$list.children().eq(0).outerWidth(!0))},focus:function(t){var e,n,o=this,i=o.$list,a=o.$grid;o.instance.current&&(e=i.children().removeClass("fancybox-thumbs-active").filter('[data-index="'+o.instance.current.index+'"]').addClass("fancybox-thumbs-active"),n=e.position(),"y"===o.opts.axis&&(n.top<0||n.top>i.height()-e.outerHeight())?i.stop().animate({scrollTop:i.scrollTop()+n.top},t):"x"===o.opts.axis&&(n.lefta.scrollLeft()+(a.width()-e.outerWidth()))&&i.parent().stop().animate({scrollLeft:n.left},t))},update:function(){var t=this;t.instance.$refs.container.toggleClass("fancybox-show-thumbs",this.isVisible),t.isVisible?(t.$grid||t.create(),t.instance.trigger("onThumbsShow"),t.focus(0)):t.$grid&&t.instance.trigger("onThumbsHide"),t.instance.update()},hide:function(){this.isVisible=!1,this.update()},show:function(){this.isVisible=!0,this.update()},toggle:function(){this.isVisible=!this.isVisible,this.update()}}),e(t).on({"onInit.fb":function(t,e){var n;e&&!e.Thumbs&&(n=new o(e),n.isActive&&!0===n.opts.autoStart&&n.show())},"beforeShow.fb":function(t,e,n,o){var i=e&&e.Thumbs;i&&i.isVisible&&i.focus(o?0:250)},"afterKeydown.fb":function(t,e,n,o,i){var a=e&&e.Thumbs;a&&a.isActive&&71===i&&(o.preventDefault(),a.toggle())},"beforeClose.fb":function(t,e){var n=e&&e.Thumbs;n&&n.isVisible&&!1!==n.opts.hideOnClose&&n.$grid.hide()}})}(document,jQuery),function(t,e){"use strict";function n(t){var e={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};return String(t).replace(/[&<>"'`=\/]/g,function(t){return e[t]})}e.extend(!0,e.fancybox.defaults,{btnTpl:{share:''},share:{url:function(t,e){return!t.currentHash&&"inline"!==e.type&&"html"!==e.type&&(e.origSrc||e.src)||window.location}, +tpl:''}}),e(t).on("click","[data-fancybox-share]",function(){var t,o,i=e.fancybox.getInstance(),a=i.current||null;a&&("function"===e.type(a.opts.share.url)&&(t=a.opts.share.url.apply(a,[i,a])),o=a.opts.share.tpl.replace(/\{\{media\}\}/g,"image"===a.type?encodeURIComponent(a.src):"").replace(/\{\{url\}\}/g,encodeURIComponent(t)).replace(/\{\{url_raw\}\}/g,n(t)).replace(/\{\{descr\}\}/g,i.$caption?encodeURIComponent(i.$caption.text()):""),e.fancybox.open({src:i.translate(i,o),type:"html",opts:{touch:!1,animationEffect:!1,afterLoad:function(t,e){i.$refs.container.one("beforeClose.fb",function(){t.close(null,0)}),e.$content.find(".fancybox-share__button").click(function(){return window.open(this.href,"Share","width=550, height=450"),!1})},mobile:{autoFocus:!1}}}))})}(document,jQuery),function(t,e,n){"use strict";function o(){var e=t.location.hash.substr(1),n=e.split("-"),o=n.length>1&&/^\+?\d+$/.test(n[n.length-1])?parseInt(n.pop(-1),10)||1:1,i=n.join("-");return{hash:e,index:o<1?1:o,gallery:i}}function i(t){""!==t.gallery&&n("[data-fancybox='"+n.escapeSelector(t.gallery)+"']").eq(t.index-1).focus().trigger("click.fb-start")}function a(t){var e,n;return!!t&&(e=t.current?t.current.opts:t.opts,""!==(n=e.hash||(e.$orig?e.$orig.data("fancybox")||e.$orig.data("fancybox-trigger"):""))&&n)}n.escapeSelector||(n.escapeSelector=function(t){return(t+"").replace(/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t})}),n(function(){!1!==n.fancybox.defaults.hash&&(n(e).on({"onInit.fb":function(t,e){var n,i;!1!==e.group[e.currIndex].opts.hash&&(n=o(),(i=a(e))&&n.gallery&&i==n.gallery&&(e.currIndex=n.index-1))},"beforeShow.fb":function(n,o,i,s){var r;i&&!1!==i.opts.hash&&(r=a(o))&&(o.currentHash=r+(o.group.length>1?"-"+(i.index+1):""),t.location.hash!=="#"+o.currentHash&&(s&&!o.origHash&&(o.origHash=t.location.hash),o.hashTimer&&clearTimeout(o.hashTimer),o.hashTimer=setTimeout(function(){"replaceState"in t.history?(t.history[s?"pushState":"replaceState"]({},e.title,t.location.pathname+t.location.search+"#"+o.currentHash),s&&(o.hasCreatedHistory=!0)):t.location.hash=o.currentHash,o.hashTimer=null},300)))},"beforeClose.fb":function(n,o,i){i&&!1!==i.opts.hash&&(clearTimeout(o.hashTimer),o.currentHash&&o.hasCreatedHistory?t.history.back():o.currentHash&&("replaceState"in t.history?t.history.replaceState({},e.title,t.location.pathname+t.location.search+(o.origHash||"")):t.location.hash=o.origHash),o.currentHash=null)}}),n(t).on("hashchange.fb",function(){var t=o(),e=null;n.each(n(".fancybox-container").get().reverse(),function(t,o){var i=n(o).data("FancyBox");if(i&&i.currentHash)return e=i,!1}),e?e.currentHash===t.gallery+"-"+t.index||1===t.index&&e.currentHash==t.gallery||(e.currentHash=null,e.close()):""!==t.gallery&&i(t)}),setTimeout(function(){n.fancybox.getInstance()||i(o())},50))})}(window,document,jQuery),function(t,e){"use strict";var n=(new Date).getTime();e(t).on({"onInit.fb":function(t,e,o){e.$refs.stage.on("mousewheel DOMMouseScroll wheel MozMousePixelScroll",function(t){var o=e.current,i=(new Date).getTime();e.group.length<2||!1===o.opts.wheel||"auto"===o.opts.wheel&&"image"!==o.type||(t.preventDefault(),t.stopPropagation(),o.$slide.hasClass("fancybox-animated")||(t=t.originalEvent||t,i-n<250||(n=i,e[(-t.deltaY||-t.deltaX||t.wheelDelta||-t.detail)<0?"next":"previous"]())))})}})}(document,jQuery); \ No newline at end of file diff --git a/view/js/vanillaEmojiPicker/LICENSE b/view/js/vanillaEmojiPicker/LICENSE new file mode 100644 index 000000000..e04d5d9d5 --- /dev/null +++ b/view/js/vanillaEmojiPicker/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 woody180 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/view/js/vanillaEmojiPicker/README.md b/view/js/vanillaEmojiPicker/README.md new file mode 100644 index 000000000..38ec2dcc7 --- /dev/null +++ b/view/js/vanillaEmojiPicker/README.md @@ -0,0 +1,39 @@ +# FG Emoji Picker - Emoji picker created with vanilla javascript +This is the simplest to use emoji picker built with vanilla javascript. + +![](./screenshot.png "Vanilla Javascript Emoji Picker") + +## Benefits: + +- It is only one .js file without css or other files +- There is no jQuery or other libraries +- Simplicity of usage +- Multiple textareas and triggers +- Draggable emoji picker container + +## Initialize + +Initialze plugin with ```new EmojiPicker({});``` + +## Options + +- Trigger - must be an array of objects. Inside object there are two properties. First is selector, and second - **insertInto** method to define where emoji going to be inserted. If there are multiple 'textarea's - you can provide array of selectors as well. Watch example below. +- Close button - **closeButton** method can be true of false depending on whether you want close button on emoji picker or not. +- specialButtons - takes color code to change special (move and close) button colors. + +``` +new EmojiPicker({ + trigger: [ + { + selector: '.first-btn', + insertInto: ['.one', '.two'] // If there is only one '.selector', than it can be used without array + }, + { + selector: '.second-btn', + insertInto: '.two' + } + ], + closeButton: true, + specialButtons: 'green' // #008000, rgba(0, 128, 0); +}); +``` diff --git a/view/js/vanillaEmojiPicker/index.html b/view/js/vanillaEmojiPicker/index.html new file mode 100644 index 000000000..dc6ebc1eb --- /dev/null +++ b/view/js/vanillaEmojiPicker/index.html @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + Document + + + + +
+
+ + +
+ +
+ + +
+ +
+ + + + + + + \ No newline at end of file diff --git a/view/js/vanillaEmojiPicker/indextest.html b/view/js/vanillaEmojiPicker/indextest.html new file mode 100644 index 000000000..60b053572 --- /dev/null +++ b/view/js/vanillaEmojiPicker/indextest.html @@ -0,0 +1,47 @@ + + + + + + + + + Document + + + + +
+ +
+
+
+ +
+ +
+ + + + + + + \ No newline at end of file diff --git a/view/js/vanillaEmojiPicker/screenshot.png b/view/js/vanillaEmojiPicker/screenshot.png new file mode 100644 index 000000000..5462501b0 Binary files /dev/null and b/view/js/vanillaEmojiPicker/screenshot.png differ diff --git a/view/js/vanillaEmojiPicker/vanillaEmojiPicker.js b/view/js/vanillaEmojiPicker/vanillaEmojiPicker.js new file mode 100644 index 000000000..f4055c378 --- /dev/null +++ b/view/js/vanillaEmojiPicker/vanillaEmojiPicker.js @@ -0,0 +1,7948 @@ +const EmojiPicker = function(options) { + + this.options = options; + this.trigger = this.options.trigger.map(item => item.selector); + this.insertInto = undefined; + let emojiesHTML = ''; + let categoriesHTML = ''; + let emojiList = undefined; + let moseMove = false; + const pickerWidth = this.options.closeButton ? 370 : 350; + const pickerHeight = 400; + + this.lib = function(el = undefined) { + + const isNodeList = (nodes) => { + var stringRepr = Object.prototype.toString.call(nodes); + + return typeof nodes === 'object' && + /^\[object (HTMLCollection|NodeList|Object)\]$/.test(stringRepr) && + (typeof nodes.length === 'number') && + (nodes.length === 0 || (typeof nodes[0] === "object" && nodes[0].nodeType > 0)); + } + + return { + + el: () => { + // Check if is node + if (!el) { + return undefined; + } else if (el.nodeName) { + return [el]; + } else if (isNodeList(el)) { + return Array.from(el) + } else if (typeof(el) === 'string' || typeof(el) === 'STRING') { + return Array.from(document.querySelectorAll(el)); + } else { + return undefined; + } + }, + + on(event, callback, classList = undefined) { + if (!classList) { + this.el().forEach(item => { + item.addEventListener(event, callback.bind(item)) + }) + } else { + this.el().forEach(item => { + item.addEventListener(event, (e) => { + if (e.target.closest(classList)) { + + let attr = undefined; + + if (Array.isArray(classList)) { + const stringifiedElem = e.target.outerHTML; + + const index = classList.findIndex(attr => stringifiedElem.includes(attr.slice(1))); + + attr = classList[index]; + } + + callback(e, attr) + } + }) + }) + } + }, + + css(params) { + for (const key in params) { + if (Object.hasOwnProperty.call(params, key)) { + const cssVal = params[key]; + this.el().forEach(el => el.style[key] = cssVal) + } + } + }, + + attr(param1, param2 = undefined) { + + if (!param2) { + return this.el()[0].getAttribute(param1) + } + this.el().forEach(el => el.setAttribute(param1, param2)) + }, + + removeAttr(param) { + this.el().forEach(el => el.removeAttribute(param)) + }, + + addClass(param) { + this.el().forEach(el => el.classList.add(param)) + }, + + removeClass(param) { + this.el().forEach(el => el.classList.remove(param)) + }, + + slug(str) { + return str + .toLowerCase() + .replace(/[^\u00BF-\u1FFF\u2C00-\uD7FF\w]+|[\_]+/ig, '-') + .replace(/ +/g,'-') + ; + }, + + remove(param) { + this.el().forEach(el => el.remove()) + }, + + val(param = undefined) { + let val; + + if (param === undefined) { + this.el().forEach(el => { + val = el.value; + }) + } else { + this.el().forEach(el => { + el.value = param; + }) + } + + return val; + }, + + text(msg = undefined) { + if (msg === undefined) { + return el.innerText; + } else { + this.el().forEach(el => { + el.innerText = msg; + }) + } + }, + + html(data = undefined) { + if (data === undefined) { + return el.innerHTML; + } else { + this.el().forEach(el => { + el.innerHTML = data; + }) + } + } + } + }; + + const emojiObj = { + 'People': [ + { + "emoji": "😀", + "title": "Grinning Face" + }, + { + "emoji": "😃", + "title": "Grinning Face with Big Eyes" + }, + { + "emoji": "😄", + "title": "Grinning Face with Smiling Eyes" + }, + { + "emoji": "😁", + "title": "Beaming Face with Smiling Eyes" + }, + { + "emoji": "😆", + "title": "Grinning Squinting Face" + }, + { + "emoji": "😅", + "title": "Grinning Face with Sweat" + }, + { + "emoji": "🤣", + "title": "Rolling on the Floor Laughing" + }, + { + "emoji": "😂", + "title": "Face with Tears of Joy" + }, + { + "emoji": "🙂", + "title": "Slightly Smiling Face" + }, + { + "emoji": "🙃", + "title": "Upside-Down Face" + }, + { + "emoji": "😉", + "title": "Winking Face" + }, + { + "emoji": "😊", + "title": "Smiling Face with Smiling Eyes" + }, + { + "emoji": "😇", + "title": "Smiling Face with Halo" + }, + { + "emoji": "🥰", + "title": "Smiling Face with Hearts" + }, + { + "emoji": "😍", + "title": "Smiling Face with Heart-Eyes" + }, + { + "emoji": "🤩", + "title": "Star-Struck" + }, + { + "emoji": "😘", + "title": "Face Blowing a Kiss" + }, + { + "emoji": "😗", + "title": "Kissing Face" + }, + { + "emoji": "☺️", + "title": "Smiling Face" + }, + { + "emoji": "😚", + "title": "Kissing Face with Closed Eyes" + }, + { + "emoji": "😙", + "title": "Kissing Face with Smiling Eyes" + }, + { + "emoji": "🥲", + "title": "Smiling Face with Tear" + }, + { + "emoji": "😋", + "title": "Face Savoring Food" + }, + { + "emoji": "😛", + "title": "Face with Tongue" + }, + { + "emoji": "😜", + "title": "Winking Face with Tongue" + }, + { + "emoji": "🤪", + "title": "Zany Face" + }, + { + "emoji": "😝", + "title": "Squinting Face with Tongue" + }, + { + "emoji": "🤑", + "title": "Money-Mouth Face" + }, + { + "emoji": "🤗", + "title": "Smiling Face with Open Hands" + }, + { + "emoji": "🤭", + "title": "Face with Hand Over Mouth" + }, + { + "emoji": "🤫", + "title": "Shushing Face" + }, + { + "emoji": "🤔", + "title": "Thinking Face" + }, + { + "emoji": "🤐", + "title": "Zipper-Mouth Face" + }, + { + "emoji": "🤨", + "title": "Face with Raised Eyebrow" + }, + { + "emoji": "😐", + "title": "Neutral Face" + }, + { + "emoji": "😑", + "title": "Expressionless Face" + }, + { + "emoji": "😶", + "title": "Face Without Mouth" + }, + { + "emoji": "😶‍🌫️", + "title": "Face in Clouds" + }, + { + "emoji": "😏", + "title": "Smirking Face" + }, + { + "emoji": "😒", + "title": "Unamused Face" + }, + { + "emoji": "🙄", + "title": "Face with Rolling Eyes" + }, + { + "emoji": "😬", + "title": "Grimacing Face" + }, + { + "emoji": "😮‍💨", + "title": "Face Exhaling" + }, + { + "emoji": "🤥", + "title": "Lying Face" + }, + { + "emoji": "😌", + "title": "Relieved Face" + }, + { + "emoji": "😔", + "title": "Pensive Face" + }, + { + "emoji": "😪", + "title": "Sleepy Face" + }, + { + "emoji": "🤤", + "title": "Drooling Face" + }, + { + "emoji": "😴", + "title": "Sleeping Face" + }, + { + "emoji": "😷", + "title": "Face with Medical Mask" + }, + { + "emoji": "🤒", + "title": "Face with Thermometer" + }, + { + "emoji": "🤕", + "title": "Face with Head-Bandage" + }, + { + "emoji": "🤢", + "title": "Nauseated Face" + }, + { + "emoji": "🤮", + "title": "Face Vomiting" + }, + { + "emoji": "🤧", + "title": "Sneezing Face" + }, + { + "emoji": "🥵", + "title": "Hot Face" + }, + { + "emoji": "🥶", + "title": "Cold Face" + }, + { + "emoji": "🥴", + "title": "Woozy Face" + }, + { + "emoji": "😵", + "title": "Face with Crossed-Out Eyes" + }, + { + "emoji": "😵‍💫", + "title": "Face with Spiral Eyes" + }, + { + "emoji": "🤯", + "title": "Exploding Head" + }, + { + "emoji": "🤠", + "title": "Cowboy Hat Face" + }, + { + "emoji": "🥳", + "title": "Partying Face" + }, + { + "emoji": "🥸", + "title": "Disguised Face" + }, + { + "emoji": "😎", + "title": "Smiling Face with Sunglasses" + }, + { + "emoji": "🤓", + "title": "Nerd Face" + }, + { + "emoji": "🧐", + "title": "Face with Monocle" + }, + { + "emoji": "😕", + "title": "Confused Face" + }, + { + "emoji": "😟", + "title": "Worried Face" + }, + { + "emoji": "🙁", + "title": "Slightly Frowning Face" + }, + { + "emoji": "☹️", + "title": "Frowning Face" + }, + { + "emoji": "😮", + "title": "Face with Open Mouth" + }, + { + "emoji": "😯", + "title": "Hushed Face" + }, + { + "emoji": "😲", + "title": "Astonished Face" + }, + { + "emoji": "😳", + "title": "Flushed Face" + }, + { + "emoji": "🥺", + "title": "Pleading Face" + }, + { + "emoji": "😦", + "title": "Frowning Face with Open Mouth" + }, + { + "emoji": "😧", + "title": "Anguished Face" + }, + { + "emoji": "😨", + "title": "Fearful Face" + }, + { + "emoji": "😰", + "title": "Anxious Face with Sweat" + }, + { + "emoji": "😥", + "title": "Sad but Relieved Face" + }, + { + "emoji": "😢", + "title": "Crying Face" + }, + { + "emoji": "😭", + "title": "Loudly Crying Face" + }, + { + "emoji": "😱", + "title": "Face Screaming in Fear" + }, + { + "emoji": "😖", + "title": "Confounded Face" + }, + { + "emoji": "😣", + "title": "Persevering Face" + }, + { + "emoji": "😞", + "title": "Disappointed Face" + }, + { + "emoji": "😓", + "title": "Downcast Face with Sweat" + }, + { + "emoji": "😩", + "title": "Weary Face" + }, + { + "emoji": "😫", + "title": "Tired Face" + }, + { + "emoji": "🥱", + "title": "Yawning Face" + }, + { + "emoji": "😤", + "title": "Face with Steam From Nose" + }, + { + "emoji": "😡", + "title": "Enraged Face" + }, + { + "emoji": "😠", + "title": "Angry Face" + }, + { + "emoji": "🤬", + "title": "Face with Symbols on Mouth" + }, + { + "emoji": "😈", + "title": "Smiling Face with Horns" + }, + { + "emoji": "👿", + "title": "Angry Face with Horns" + }, + { + "emoji": "💀", + "title": "Skull" + }, + { + "emoji": "☠️", + "title": "Skull and Crossbones" + }, + { + "emoji": "💩", + "title": "Pile of Poo" + }, + { + "emoji": "🤡", + "title": "Clown Face" + }, + { + "emoji": "👹", + "title": "Ogre" + }, + { + "emoji": "👺", + "title": "Goblin" + }, + { + "emoji": "👻", + "title": "Ghost" + }, + { + "emoji": "👽", + "title": "Alien" + }, + { + "emoji": "👾", + "title": "Alien Monster" + }, + { + "emoji": "🤖", + "title": "Robot" + }, + { + "emoji": "😺", + "title": "Grinning Cat" + }, + { + "emoji": "😸", + "title": "Grinning Cat with Smiling Eyes" + }, + { + "emoji": "😹", + "title": "Cat with Tears of Joy" + }, + { + "emoji": "😻", + "title": "Smiling Cat with Heart-Eyes" + }, + { + "emoji": "😼", + "title": "Cat with Wry Smile" + }, + { + "emoji": "😽", + "title": "Kissing Cat" + }, + { + "emoji": "🙀", + "title": "Weary Cat" + }, + { + "emoji": "😿", + "title": "Crying Cat" + }, + { + "emoji": "😾", + "title": "Pouting Cat" + }, + { + "emoji": "💋", + "title": "Kiss Mark" + }, + { + "emoji": "👋", + "title": "Waving Hand" + }, + { + "emoji": "🤚", + "title": "Raised Back of Hand" + }, + { + "emoji": "🖐️", + "title": "Hand with Fingers Splayed" + }, + { + "emoji": "✋", + "title": "Raised Hand" + }, + { + "emoji": "🖖", + "title": "Vulcan Salute" + }, + { + "emoji": "👌", + "title": "OK Hand" + }, + { + "emoji": "🤌", + "title": "Pinched Fingers" + }, + { + "emoji": "🤏", + "title": "Pinching Hand" + }, + { + "emoji": "✌️", + "title": "Victory Hand" + }, + { + "emoji": "🤞", + "title": "Crossed Fingers" + }, + { + "emoji": "🤟", + "title": "Love-You Gesture" + }, + { + "emoji": "🤘", + "title": "Sign of the Horns" + }, + { + "emoji": "🤙", + "title": "Call Me Hand" + }, + { + "emoji": "👈", + "title": "Backhand Index Pointing Left" + }, + { + "emoji": "👉", + "title": "Backhand Index Pointing Right" + }, + { + "emoji": "👆", + "title": "Backhand Index Pointing Up" + }, + { + "emoji": "🖕", + "title": "Middle Finger" + }, + { + "emoji": "👇", + "title": "Backhand Index Pointing Down" + }, + { + "emoji": "☝️", + "title": "Index Pointing Up" + }, + { + "emoji": "👍", + "title": "Thumbs Up" + }, + { + "emoji": "👎", + "title": "Thumbs Down" + }, + { + "emoji": "✊", + "title": "Raised Fist" + }, + { + "emoji": "👊", + "title": "Oncoming Fist" + }, + { + "emoji": "🤛", + "title": "Left-Facing Fist" + }, + { + "emoji": "🤜", + "title": "Right-Facing Fist" + }, + { + "emoji": "👏", + "title": "Clapping Hands" + }, + { + "emoji": "🙌", + "title": "Raising Hands" + }, + { + "emoji": "👐", + "title": "Open Hands" + }, + { + "emoji": "🤲", + "title": "Palms Up Together" + }, + { + "emoji": "🤝", + "title": "Handshake" + }, + { + "emoji": "🙏", + "title": "Folded Hands" + }, + { + "emoji": "✍️", + "title": "Writing Hand" + }, + { + "emoji": "💅", + "title": "Nail Polish" + }, + { + "emoji": "🤳", + "title": "Selfie" + }, + { + "emoji": "💪", + "title": "Flexed Biceps" + }, + { + "emoji": "🦾", + "title": "Mechanical Arm" + }, + { + "emoji": "🦿", + "title": "Mechanical Leg" + }, + { + "emoji": "🦵", + "title": "Leg" + }, + { + "emoji": "🦶", + "title": "Foot" + }, + { + "emoji": "👂", + "title": "Ear" + }, + { + "emoji": "🦻", + "title": "Ear with Hearing Aid" + }, + { + "emoji": "👃", + "title": "Nose" + }, + { + "emoji": "🧠", + "title": "Brain" + }, + { + "emoji": "🫀", + "title": "Anatomical Heart" + }, + { + "emoji": "🫁", + "title": "Lungs" + }, + { + "emoji": "🦷", + "title": "Tooth" + }, + { + "emoji": "🦴", + "title": "Bone" + }, + { + "emoji": "👀", + "title": "Eyes" + }, + { + "emoji": "👁️", + "title": "Eye" + }, + { + "emoji": "👅", + "title": "Tongue" + }, + { + "emoji": "👄", + "title": "Mouth" + }, + { + "emoji": "👶", + "title": "Baby" + }, + { + "emoji": "🧒", + "title": "Child" + }, + { + "emoji": "👦", + "title": "Boy" + }, + { + "emoji": "👧", + "title": "Girl" + }, + { + "emoji": "🧑", + "title": "Person" + }, + { + "emoji": "👱", + "title": "Person: Blond Hair" + }, + { + "emoji": "👨", + "title": "Man" + }, + { + "emoji": "🧔", + "title": "Person: Beard" + }, + { + "emoji": "👨‍🦰", + "title": "Man: Red Hair" + }, + { + "emoji": "👨‍🦱", + "title": "Man: Curly Hair" + }, + { + "emoji": "👨‍🦳", + "title": "Man: White Hair" + }, + { + "emoji": "👨‍🦲", + "title": "Man: Bald" + }, + { + "emoji": "👩", + "title": "Woman" + }, + { + "emoji": "👩‍🦰", + "title": "Woman: Red Hair" + }, + { + "emoji": "🧑‍🦰", + "title": "Person: Red Hair" + }, + { + "emoji": "👩‍🦱", + "title": "Woman: Curly Hair" + }, + { + "emoji": "🧑‍🦱", + "title": "Person: Curly Hair" + }, + { + "emoji": "👩‍🦳", + "title": "Woman: White Hair" + }, + { + "emoji": "🧑‍🦳", + "title": "Person: White Hair" + }, + { + "emoji": "👩‍🦲", + "title": "Woman: Bald" + }, + { + "emoji": "🧑‍🦲", + "title": "Person: Bald" + }, + { + "emoji": "👱‍♀️", + "title": "Woman: Blond Hair" + }, + { + "emoji": "👱‍♂️", + "title": "Man: Blond Hair" + }, + { + "emoji": "🧓", + "title": "Older Person" + }, + { + "emoji": "👴", + "title": "Old Man" + }, + { + "emoji": "👵", + "title": "Old Woman" + }, + { + "emoji": "🙍", + "title": "Person Frowning" + }, + { + "emoji": "🙍‍♂️", + "title": "Man Frowning" + }, + { + "emoji": "🙍‍♀️", + "title": "Woman Frowning" + }, + { + "emoji": "🙎", + "title": "Person Pouting" + }, + { + "emoji": "🙎‍♂️", + "title": "Man Pouting" + }, + { + "emoji": "🙎‍♀️", + "title": "Woman Pouting" + }, + { + "emoji": "🙅", + "title": "Person Gesturing No" + }, + { + "emoji": "🙅‍♂️", + "title": "Man Gesturing No" + }, + { + "emoji": "🙅‍♀️", + "title": "Woman Gesturing No" + }, + { + "emoji": "🙆", + "title": "Person Gesturing OK" + }, + { + "emoji": "🙆‍♂️", + "title": "Man Gesturing OK" + }, + { + "emoji": "🙆‍♀️", + "title": "Woman Gesturing OK" + }, + { + "emoji": "💁", + "title": "Person Tipping Hand" + }, + { + "emoji": "💁‍♂️", + "title": "Man Tipping Hand" + }, + { + "emoji": "💁‍♀️", + "title": "Woman Tipping Hand" + }, + { + "emoji": "🙋", + "title": "Person Raising Hand" + }, + { + "emoji": "🙋‍♂️", + "title": "Man Raising Hand" + }, + { + "emoji": "🙋‍♀️", + "title": "Woman Raising Hand" + }, + { + "emoji": "🧏", + "title": "Deaf Person" + }, + { + "emoji": "🧏‍♂️", + "title": "Deaf Man" + }, + { + "emoji": "🧏‍♀️", + "title": "Deaf Woman" + }, + { + "emoji": "🙇", + "title": "Person Bowing" + }, + { + "emoji": "🙇‍♂️", + "title": "Man Bowing" + }, + { + "emoji": "🙇‍♀️", + "title": "Woman Bowing" + }, + { + "emoji": "🤦", + "title": "Person Facepalming" + }, + { + "emoji": "🤦‍♂️", + "title": "Man Facepalming" + }, + { + "emoji": "🤦‍♀️", + "title": "Woman Facepalming" + }, + { + "emoji": "🤷", + "title": "Person Shrugging" + }, + { + "emoji": "🤷‍♂️", + "title": "Man Shrugging" + }, + { + "emoji": "🤷‍♀️", + "title": "Woman Shrugging" + }, + { + "emoji": "🧑‍⚕️", + "title": "Health Worker" + }, + { + "emoji": "👨‍⚕️", + "title": "Man Health Worker" + }, + { + "emoji": "👩‍⚕️", + "title": "Woman Health Worker" + }, + { + "emoji": "🧑‍🎓", + "title": "Student" + }, + { + "emoji": "👨‍🎓", + "title": "Man Student" + }, + { + "emoji": "👩‍🎓", + "title": "Woman Student" + }, + { + "emoji": "🧑‍🏫", + "title": "Teacher" + }, + { + "emoji": "👨‍🏫", + "title": "Man Teacher" + }, + { + "emoji": "👩‍🏫", + "title": "Woman Teacher" + }, + { + "emoji": "🧑‍⚖️", + "title": "Judge" + }, + { + "emoji": "👨‍⚖️", + "title": "Man Judge" + }, + { + "emoji": "👩‍⚖️", + "title": "Woman Judge" + }, + { + "emoji": "🧑‍🌾", + "title": "Farmer" + }, + { + "emoji": "👨‍🌾", + "title": "Man Farmer" + }, + { + "emoji": "👩‍🌾", + "title": "Woman Farmer" + }, + { + "emoji": "🧑‍🍳", + "title": "Cook" + }, + { + "emoji": "👨‍🍳", + "title": "Man Cook" + }, + { + "emoji": "👩‍🍳", + "title": "Woman Cook" + }, + { + "emoji": "🧑‍🔧", + "title": "Mechanic" + }, + { + "emoji": "👨‍🔧", + "title": "Man Mechanic" + }, + { + "emoji": "👩‍🔧", + "title": "Woman Mechanic" + }, + { + "emoji": "🧑‍🏭", + "title": "Factory Worker" + }, + { + "emoji": "👨‍🏭", + "title": "Man Factory Worker" + }, + { + "emoji": "👩‍🏭", + "title": "Woman Factory Worker" + }, + { + "emoji": "🧑‍💼", + "title": "Office Worker" + }, + { + "emoji": "👨‍💼", + "title": "Man Office Worker" + }, + { + "emoji": "👩‍💼", + "title": "Woman Office Worker" + }, + { + "emoji": "🧑‍🔬", + "title": "Scientist" + }, + { + "emoji": "👨‍🔬", + "title": "Man Scientist" + }, + { + "emoji": "👩‍🔬", + "title": "Woman Scientist" + }, + { + "emoji": "🧑‍💻", + "title": "Technologist" + }, + { + "emoji": "👨‍💻", + "title": "Man Technologist" + }, + { + "emoji": "👩‍💻", + "title": "Woman Technologist" + }, + { + "emoji": "🧑‍🎤", + "title": "Singer" + }, + { + "emoji": "👨‍🎤", + "title": "Man Singer" + }, + { + "emoji": "👩‍🎤", + "title": "Woman Singer" + }, + { + "emoji": "🧑‍🎨", + "title": "Artist" + }, + { + "emoji": "👨‍🎨", + "title": "Man Artist" + }, + { + "emoji": "👩‍🎨", + "title": "Woman Artist" + }, + { + "emoji": "🧑‍✈️", + "title": "Pilot" + }, + { + "emoji": "👨‍✈️", + "title": "Man Pilot" + }, + { + "emoji": "👩‍✈️", + "title": "Woman Pilot" + }, + { + "emoji": "🧑‍🚀", + "title": "Astronaut" + }, + { + "emoji": "👨‍🚀", + "title": "Man Astronaut" + }, + { + "emoji": "👩‍🚀", + "title": "Woman Astronaut" + }, + { + "emoji": "🧑‍🚒", + "title": "Firefighter" + }, + { + "emoji": "👨‍🚒", + "title": "Man Firefighter" + }, + { + "emoji": "👩‍🚒", + "title": "Woman Firefighter" + }, + { + "emoji": "👮", + "title": "Police Officer" + }, + { + "emoji": "👮‍♂️", + "title": "Man Police Officer" + }, + { + "emoji": "👮‍♀️", + "title": "Woman Police Officer" + }, + { + "emoji": "🕵️", + "title": "Detective" + }, + { + "emoji": "🕵️‍♂️", + "title": "Man Detective" + }, + { + "emoji": "🕵️‍♀️", + "title": "Woman Detective" + }, + { + "emoji": "💂", + "title": "Guard" + }, + { + "emoji": "💂‍♂️", + "title": "Man Guard" + }, + { + "emoji": "💂‍♀️", + "title": "Woman Guard" + }, + { + "emoji": "🥷", + "title": "Ninja" + }, + { + "emoji": "👷", + "title": "Construction Worker" + }, + { + "emoji": "👷‍♂️", + "title": "Man Construction Worker" + }, + { + "emoji": "👷‍♀️", + "title": "Woman Construction Worker" + }, + { + "emoji": "🤴", + "title": "Prince" + }, + { + "emoji": "👸", + "title": "Princess" + }, + { + "emoji": "👳", + "title": "Person Wearing Turban" + }, + { + "emoji": "👳‍♂️", + "title": "Man Wearing Turban" + }, + { + "emoji": "👳‍♀️", + "title": "Woman Wearing Turban" + }, + { + "emoji": "👲", + "title": "Person with Skullcap" + }, + { + "emoji": "🧕", + "title": "Woman with Headscarf" + }, + { + "emoji": "🤵", + "title": "Person in Tuxedo" + }, + { + "emoji": "🤵‍♂️", + "title": "Man in Tuxedo" + }, + { + "emoji": "🤵‍♀️", + "title": "Woman in Tuxedo" + }, + { + "emoji": "👰", + "title": "Person with Veil" + }, + { + "emoji": "👰‍♂️", + "title": "Man with Veil" + }, + { + "emoji": "👰‍♀️", + "title": "Woman with Veil" + }, + { + "emoji": "🤰", + "title": "Pregnant Woman" + }, + { + "emoji": "🤱", + "title": "Breast-Feeding" + }, + { + "emoji": "👩‍🍼", + "title": "Woman Feeding Baby" + }, + { + "emoji": "👨‍🍼", + "title": "Man Feeding Baby" + }, + { + "emoji": "🧑‍🍼", + "title": "Person Feeding Baby" + }, + { + "emoji": "👼", + "title": "Baby Angel" + }, + { + "emoji": "🎅", + "title": "Santa Claus" + }, + { + "emoji": "🤶", + "title": "Mrs. Claus" + }, + { + "emoji": "🧑‍🎄", + "title": "Mx Claus" + }, + { + "emoji": "🦸", + "title": "Superhero" + }, + { + "emoji": "🦸‍♂️", + "title": "Man Superhero" + }, + { + "emoji": "🦸‍♀️", + "title": "Woman Superhero" + }, + { + "emoji": "🦹", + "title": "Supervillain" + }, + { + "emoji": "🦹‍♂️", + "title": "Man Supervillain" + }, + { + "emoji": "🦹‍♀️", + "title": "Woman Supervillain" + }, + { + "emoji": "🧙", + "title": "Mage" + }, + { + "emoji": "🧙‍♂️", + "title": "Man Mage" + }, + { + "emoji": "🧙‍♀️", + "title": "Woman Mage" + }, + { + "emoji": "🧚", + "title": "Fairy" + }, + { + "emoji": "🧚‍♂️", + "title": "Man Fairy" + }, + { + "emoji": "🧚‍♀️", + "title": "Woman Fairy" + }, + { + "emoji": "🧛", + "title": "Vampire" + }, + { + "emoji": "🧛‍♂️", + "title": "Man Vampire" + }, + { + "emoji": "🧛‍♀️", + "title": "Woman Vampire" + }, + { + "emoji": "🧜", + "title": "Merperson" + }, + { + "emoji": "🧜‍♂️", + "title": "Merman" + }, + { + "emoji": "🧜‍♀️", + "title": "Mermaid" + }, + { + "emoji": "🧝", + "title": "Elf" + }, + { + "emoji": "🧝‍♂️", + "title": "Man Elf" + }, + { + "emoji": "🧝‍♀️", + "title": "Woman Elf" + }, + { + "emoji": "🧞", + "title": "Genie" + }, + { + "emoji": "🧞‍♂️", + "title": "Man Genie" + }, + { + "emoji": "🧞‍♀️", + "title": "Woman Genie" + }, + { + "emoji": "🧟", + "title": "Zombie" + }, + { + "emoji": "🧟‍♂️", + "title": "Man Zombie" + }, + { + "emoji": "🧟‍♀️", + "title": "Woman Zombie" + }, + { + "emoji": "💆", + "title": "Person Getting Massage" + }, + { + "emoji": "💆‍♂️", + "title": "Man Getting Massage" + }, + { + "emoji": "💆‍♀️", + "title": "Woman Getting Massage" + }, + { + "emoji": "💇", + "title": "Person Getting Haircut" + }, + { + "emoji": "💇‍♂️", + "title": "Man Getting Haircut" + }, + { + "emoji": "💇‍♀️", + "title": "Woman Getting Haircut" + }, + { + "emoji": "🚶", + "title": "Person Walking" + }, + { + "emoji": "🚶‍♂️", + "title": "Man Walking" + }, + { + "emoji": "🚶‍♀️", + "title": "Woman Walking" + }, + { + "emoji": "🧍", + "title": "Person Standing" + }, + { + "emoji": "🧍‍♂️", + "title": "Man Standing" + }, + { + "emoji": "🧍‍♀️", + "title": "Woman Standing" + }, + { + "emoji": "🧎", + "title": "Person Kneeling" + }, + { + "emoji": "🧎‍♂️", + "title": "Man Kneeling" + }, + { + "emoji": "🧎‍♀️", + "title": "Woman Kneeling" + }, + { + "emoji": "🧑‍🦯", + "title": "Person with White Cane" + }, + { + "emoji": "👨‍🦯", + "title": "Man with White Cane" + }, + { + "emoji": "👩‍🦯", + "title": "Woman with White Cane" + }, + { + "emoji": "🧑‍🦼", + "title": "Person in Motorized Wheelchair" + }, + { + "emoji": "👨‍🦼", + "title": "Man in Motorized Wheelchair" + }, + { + "emoji": "👩‍🦼", + "title": "Woman in Motorized Wheelchair" + }, + { + "emoji": "🧑‍🦽", + "title": "Person in Manual Wheelchair" + }, + { + "emoji": "👨‍🦽", + "title": "Man in Manual Wheelchair" + }, + { + "emoji": "👩‍🦽", + "title": "Woman in Manual Wheelchair" + }, + { + "emoji": "🏃", + "title": "Person Running" + }, + { + "emoji": "🏃‍♂️", + "title": "Man Running" + }, + { + "emoji": "🏃‍♀️", + "title": "Woman Running" + }, + { + "emoji": "💃", + "title": "Woman Dancing" + }, + { + "emoji": "🕺", + "title": "Man Dancing" + }, + { + "emoji": "🕴️", + "title": "Person in Suit Levitating" + }, + { + "emoji": "👯", + "title": "People with Bunny Ears" + }, + { + "emoji": "👯‍♂️", + "title": "Men with Bunny Ears" + }, + { + "emoji": "👯‍♀️", + "title": "Women with Bunny Ears" + }, + { + "emoji": "🧖", + "title": "Person in Steamy Room" + }, + { + "emoji": "🧖‍♂️", + "title": "Man in Steamy Room" + }, + { + "emoji": "🧖‍♀️", + "title": "Woman in Steamy Room" + }, + { + "emoji": "🧘", + "title": "Person in Lotus Position" + }, + { + "emoji": "🧑‍🤝‍🧑", + "title": "People Holding Hands" + }, + { + "emoji": "👭", + "title": "Women Holding Hands" + }, + { + "emoji": "👫", + "title": "Woman and Man Holding Hands" + }, + { + "emoji": "👬", + "title": "Men Holding Hands" + }, + { + "emoji": "💏", + "title": "Kiss" + }, + { + "emoji": "👩‍❤️‍💋‍👨", + "title": "Kiss: Woman, Man" + }, + { + "emoji": "👨‍❤️‍💋‍👨", + "title": "Kiss: Man, Man" + }, + { + "emoji": "👩‍❤️‍💋‍👩", + "title": "Kiss: Woman, Woman" + }, + { + "emoji": "💑", + "title": "Couple with Heart" + }, + { + "emoji": "👩‍❤️‍👨", + "title": "Couple with Heart: Woman, Man" + }, + { + "emoji": "👨‍❤️‍👨", + "title": "Couple with Heart: Man, Man" + }, + { + "emoji": "👩‍❤️‍👩", + "title": "Couple with Heart: Woman, Woman" + }, + { + "emoji": "👪", + "title": "Family" + }, + { + "emoji": "👨‍👩‍👦", + "title": "Family: Man, Woman, Boy" + }, + { + "emoji": "👨‍👩‍👧", + "title": "Family: Man, Woman, Girl" + }, + { + "emoji": "👨‍👩‍👧‍👦", + "title": "Family: Man, Woman, Girl, Boy" + }, + { + "emoji": "👨‍👩‍👦‍👦", + "title": "Family: Man, Woman, Boy, Boy" + }, + { + "emoji": "👨‍👩‍👧‍👧", + "title": "Family: Man, Woman, Girl, Girl" + }, + { + "emoji": "👨‍👨‍👦", + "title": "Family: Man, Man, Boy" + }, + { + "emoji": "👨‍👨‍👧", + "title": "Family: Man, Man, Girl" + }, + { + "emoji": "👨‍👨‍👧‍👦", + "title": "Family: Man, Man, Girl, Boy" + }, + { + "emoji": "👨‍👨‍👦‍👦", + "title": "Family: Man, Man, Boy, Boy" + }, + { + "emoji": "👨‍👨‍👧‍👧", + "title": "Family: Man, Man, Girl, Girl" + }, + { + "emoji": "👩‍👩‍👦", + "title": "Family: Woman, Woman, Boy" + }, + { + "emoji": "👩‍👩‍👧", + "title": "Family: Woman, Woman, Girl" + }, + { + "emoji": "👩‍👩‍👧‍👦", + "title": "Family: Woman, Woman, Girl, Boy" + }, + { + "emoji": "👩‍👩‍👦‍👦", + "title": "Family: Woman, Woman, Boy, Boy" + }, + { + "emoji": "👩‍👩‍👧‍👧", + "title": "Family: Woman, Woman, Girl, Girl" + }, + { + "emoji": "👨‍👦", + "title": "Family: Man, Boy" + }, + { + "emoji": "👨‍👦‍👦", + "title": "Family: Man, Boy, Boy" + }, + { + "emoji": "👨‍👧", + "title": "Family: Man, Girl" + }, + { + "emoji": "👨‍👧‍👦", + "title": "Family: Man, Girl, Boy" + }, + { + "emoji": "👨‍👧‍👧", + "title": "Family: Man, Girl, Girl" + }, + { + "emoji": "👩‍👦", + "title": "Family: Woman, Boy" + }, + { + "emoji": "👩‍👦‍👦", + "title": "Family: Woman, Boy, Boy" + }, + { + "emoji": "👩‍👧", + "title": "Family: Woman, Girl" + }, + { + "emoji": "👩‍👧‍👦", + "title": "Family: Woman, Girl, Boy" + }, + { + "emoji": "👩‍👧‍👧", + "title": "Family: Woman, Girl, Girl" + }, + { + "emoji": "🗣️", + "title": "Speaking Head" + }, + { + "emoji": "👤", + "title": "Bust in Silhouette" + }, + { + "emoji": "👥", + "title": "Busts in Silhouette" + }, + { + "emoji": "🫂", + "title": "People Hugging" + }, + { + "emoji": "👣", + "title": "Footprints" + }, + { + "emoji": "🧳", + "title": "Luggage" + }, + { + "emoji": "🌂", + "title": "Closed Umbrella" + }, + { + "emoji": "☂️", + "title": "Umbrella" + }, + { + "emoji": "🎃", + "title": "Jack-O-Lantern" + }, + { + "emoji": "🧵", + "title": "Thread" + }, + { + "emoji": "🧶", + "title": "Yarn" + }, + { + "emoji": "👓", + "title": "Glasses" + }, + { + "emoji": "🕶️", + "title": "Sunglasses" + }, + { + "emoji": "🥽", + "title": "Goggles" + }, + { + "emoji": "🥼", + "title": "Lab Coat" + }, + { + "emoji": "🦺", + "title": "Safety Vest" + }, + { + "emoji": "👔", + "title": "Necktie" + }, + { + "emoji": "👕", + "title": "T-Shirt" + }, + { + "emoji": "👖", + "title": "Jeans" + }, + { + "emoji": "🧣", + "title": "Scarf" + }, + { + "emoji": "🧤", + "title": "Gloves" + }, + { + "emoji": "🧥", + "title": "Coat" + }, + { + "emoji": "🧦", + "title": "Socks" + }, + { + "emoji": "👗", + "title": "Dress" + }, + { + "emoji": "👘", + "title": "Kimono" + }, + { + "emoji": "🥻", + "title": "Sari" + }, + { + "emoji": "🩱", + "title": "One-Piece Swimsuit" + }, + { + "emoji": "🩲", + "title": "Briefs" + }, + { + "emoji": "🩳", + "title": "Shorts" + }, + { + "emoji": "👙", + "title": "Bikini" + }, + { + "emoji": "👚", + "title": "Woman’s Clothes" + }, + { + "emoji": "👛", + "title": "Purse" + }, + { + "emoji": "👜", + "title": "Handbag" + }, + { + "emoji": "👝", + "title": "Clutch Bag" + }, + { + "emoji": "🎒", + "title": "Backpack" + }, + { + "emoji": "🩴", + "title": "Thong Sandal" + }, + { + "emoji": "👞", + "title": "Man’s Shoe" + }, + { + "emoji": "👟", + "title": "Running Shoe" + }, + { + "emoji": "🥾", + "title": "Hiking Boot" + }, + { + "emoji": "🥿", + "title": "Flat Shoe" + }, + { + "emoji": "👠", + "title": "High-Heeled Shoe" + }, + { + "emoji": "👡", + "title": "Woman’s Sandal" + }, + { + "emoji": "🩰", + "title": "Ballet Shoes" + }, + { + "emoji": "👢", + "title": "Woman’s Boot" + }, + { + "emoji": "👑", + "title": "Crown" + }, + { + "emoji": "👒", + "title": "Woman’s Hat" + }, + { + "emoji": "🎩", + "title": "Top Hat" + }, + { + "emoji": "🎓", + "title": "Graduation Cap" + }, + { + "emoji": "🧢", + "title": "Billed Cap" + }, + { + "emoji": "🪖", + "title": "Military Helmet" + }, + { + "emoji": "⛑️", + "title": "Rescue Worker’s Helmet" + }, + { + "emoji": "💄", + "title": "Lipstick" + }, + { + "emoji": "💍", + "title": "Ring" + }, + { + "emoji": "💼", + "title": "Briefcase" + }, + { + "emoji": "🩸", + "title": "Drop of Blood" + } + ], + 'Nature': [ + { + "emoji": "🙈", + "title": "See-No-Evil Monkey" + }, + { + "emoji": "🙉", + "title": "Hear-No-Evil Monkey" + }, + { + "emoji": "🙊", + "title": "Speak-No-Evil Monkey" + }, + { + "emoji": "💥", + "title": "Collision" + }, + { + "emoji": "💫", + "title": "Dizzy" + }, + { + "emoji": "💦", + "title": "Sweat Droplets" + }, + { + "emoji": "💨", + "title": "Dashing Away" + }, + { + "emoji": "🐵", + "title": "Monkey Face" + }, + { + "emoji": "🐒", + "title": "Monkey" + }, + { + "emoji": "🦍", + "title": "Gorilla" + }, + { + "emoji": "🦧", + "title": "Orangutan" + }, + { + "emoji": "🐶", + "title": "Dog Face" + }, + { + "emoji": "🐕", + "title": "Dog" + }, + { + "emoji": "🦮", + "title": "Guide Dog" + }, + { + "emoji": "🐕‍🦺", + "title": "Service Dog" + }, + { + "emoji": "🐩", + "title": "Poodle" + }, + { + "emoji": "🐺", + "title": "Wolf" + }, + { + "emoji": "🦊", + "title": "Fox" + }, + { + "emoji": "🦝", + "title": "Raccoon" + }, + { + "emoji": "🐱", + "title": "Cat Face" + }, + { + "emoji": "🐈", + "title": "Cat" + }, + { + "emoji": "🐈‍⬛", + "title": "Black Cat" + }, + { + "emoji": "🦁", + "title": "Lion" + }, + { + "emoji": "🐯", + "title": "Tiger Face" + }, + { + "emoji": "🐅", + "title": "Tiger" + }, + { + "emoji": "🐆", + "title": "Leopard" + }, + { + "emoji": "🐴", + "title": "Horse Face" + }, + { + "emoji": "🐎", + "title": "Horse" + }, + { + "emoji": "🦄", + "title": "Unicorn" + }, + { + "emoji": "🦓", + "title": "Zebra" + }, + { + "emoji": "🦌", + "title": "Deer" + }, + { + "emoji": "🦬", + "title": "Bison" + }, + { + "emoji": "🐮", + "title": "Cow Face" + }, + { + "emoji": "🐂", + "title": "Ox" + }, + { + "emoji": "🐃", + "title": "Water Buffalo" + }, + { + "emoji": "🐄", + "title": "Cow" + }, + { + "emoji": "🐷", + "title": "Pig Face" + }, + { + "emoji": "🐖", + "title": "Pig" + }, + { + "emoji": "🐗", + "title": "Boar" + }, + { + "emoji": "🐽", + "title": "Pig Nose" + }, + { + "emoji": "🐏", + "title": "Ram" + }, + { + "emoji": "🐑", + "title": "Ewe" + }, + { + "emoji": "🐐", + "title": "Goat" + }, + { + "emoji": "🐪", + "title": "Camel" + }, + { + "emoji": "🐫", + "title": "Two-Hump Camel" + }, + { + "emoji": "🦙", + "title": "Llama" + }, + { + "emoji": "🦒", + "title": "Giraffe" + }, + { + "emoji": "🐘", + "title": "Elephant" + }, + { + "emoji": "🦣", + "title": "Mammoth" + }, + { + "emoji": "🦏", + "title": "Rhinoceros" + }, + { + "emoji": "🦛", + "title": "Hippopotamus" + }, + { + "emoji": "🐭", + "title": "Mouse Face" + }, + { + "emoji": "🐁", + "title": "Mouse" + }, + { + "emoji": "🐀", + "title": "Rat" + }, + { + "emoji": "🐹", + "title": "Hamster" + }, + { + "emoji": "🐰", + "title": "Rabbit Face" + }, + { + "emoji": "🐇", + "title": "Rabbit" + }, + { + "emoji": "🐿️", + "title": "Chipmunk" + }, + { + "emoji": "🦫", + "title": "Beaver" + }, + { + "emoji": "🦔", + "title": "Hedgehog" + }, + { + "emoji": "🦇", + "title": "Bat" + }, + { + "emoji": "🐻", + "title": "Bear" + }, + { + "emoji": "🐻‍❄️", + "title": "Polar Bear" + }, + { + "emoji": "🐨", + "title": "Koala" + }, + { + "emoji": "🐼", + "title": "Panda" + }, + { + "emoji": "🦥", + "title": "Sloth" + }, + { + "emoji": "🦦", + "title": "Otter" + }, + { + "emoji": "🦨", + "title": "Skunk" + }, + { + "emoji": "🦘", + "title": "Kangaroo" + }, + { + "emoji": "🦡", + "title": "Badger" + }, + { + "emoji": "🐾", + "title": "Paw Prints" + }, + { + "emoji": "🦃", + "title": "Turkey" + }, + { + "emoji": "🐔", + "title": "Chicken" + }, + { + "emoji": "🐓", + "title": "Rooster" + }, + { + "emoji": "🐣", + "title": "Hatching Chick" + }, + { + "emoji": "🐤", + "title": "Baby Chick" + }, + { + "emoji": "🐥", + "title": "Front-Facing Baby Chick" + }, + { + "emoji": "🐦", + "title": "Bird" + }, + { + "emoji": "🐧", + "title": "Penguin" + }, + { + "emoji": "🕊️", + "title": "Dove" + }, + { + "emoji": "🦅", + "title": "Eagle" + }, + { + "emoji": "🦆", + "title": "Duck" + }, + { + "emoji": "🦢", + "title": "Swan" + }, + { + "emoji": "🦉", + "title": "Owl" + }, + { + "emoji": "🦤", + "title": "Dodo" + }, + { + "emoji": "🪶", + "title": "Feather" + }, + { + "emoji": "🦩", + "title": "Flamingo" + }, + { + "emoji": "🦚", + "title": "Peacock" + }, + { + "emoji": "🦜", + "title": "Parrot" + }, + { + "emoji": "🐸", + "title": "Frog" + }, + { + "emoji": "🐊", + "title": "Crocodile" + }, + { + "emoji": "🐢", + "title": "Turtle" + }, + { + "emoji": "🦎", + "title": "Lizard" + }, + { + "emoji": "🐍", + "title": "Snake" + }, + { + "emoji": "🐲", + "title": "Dragon Face" + }, + { + "emoji": "🐉", + "title": "Dragon" + }, + { + "emoji": "🦕", + "title": "Sauropod" + }, + { + "emoji": "🦖", + "title": "T-Rex" + }, + { + "emoji": "🐳", + "title": "Spouting Whale" + }, + { + "emoji": "🐋", + "title": "Whale" + }, + { + "emoji": "🐬", + "title": "Dolphin" + }, + { + "emoji": "🦭", + "title": "Seal" + }, + { + "emoji": "🐟", + "title": "Fish" + }, + { + "emoji": "🐠", + "title": "Tropical Fish" + }, + { + "emoji": "🐡", + "title": "Blowfish" + }, + { + "emoji": "🦈", + "title": "Shark" + }, + { + "emoji": "🐙", + "title": "Octopus" + }, + { + "emoji": "🐚", + "title": "Spiral Shell" + }, + { + "emoji": "🐌", + "title": "Snail" + }, + { + "emoji": "🦋", + "title": "Butterfly" + }, + { + "emoji": "🐛", + "title": "Bug" + }, + { + "emoji": "🐜", + "title": "Ant" + }, + { + "emoji": "🐝", + "title": "Honeybee" + }, + { + "emoji": "🪲", + "title": "Beetle" + }, + { + "emoji": "🐞", + "title": "Lady Beetle" + }, + { + "emoji": "🦗", + "title": "Cricket" + }, + { + "emoji": "🪳", + "title": "Cockroach" + }, + { + "emoji": "🕷️", + "title": "Spider" + }, + { + "emoji": "🕸️", + "title": "Spider Web" + }, + { + "emoji": "🦂", + "title": "Scorpion" + }, + { + "emoji": "🦟", + "title": "Mosquito" + }, + { + "emoji": "🪰", + "title": "Fly" + }, + { + "emoji": "🪱", + "title": "Worm" + }, + { + "emoji": "🦠", + "title": "Microbe" + }, + { + "emoji": "💐", + "title": "Bouquet" + }, + { + "emoji": "🌸", + "title": "Cherry Blossom" + }, + { + "emoji": "💮", + "title": "White Flower" + }, + { + "emoji": "🏵️", + "title": "Rosette" + }, + { + "emoji": "🌹", + "title": "Rose" + }, + { + "emoji": "🥀", + "title": "Wilted Flower" + }, + { + "emoji": "🌺", + "title": "Hibiscus" + }, + { + "emoji": "🌻", + "title": "Sunflower" + }, + { + "emoji": "🌼", + "title": "Blossom" + }, + { + "emoji": "🌷", + "title": "Tulip" + }, + { + "emoji": "🌱", + "title": "Seedling" + }, + { + "emoji": "🪴", + "title": "Potted Plant" + }, + { + "emoji": "🌲", + "title": "Evergreen Tree" + }, + { + "emoji": "🌳", + "title": "Deciduous Tree" + }, + { + "emoji": "🌴", + "title": "Palm Tree" + }, + { + "emoji": "🌵", + "title": "Cactus" + }, + { + "emoji": "🌾", + "title": "Sheaf of Rice" + }, + { + "emoji": "🌿", + "title": "Herb" + }, + { + "emoji": "☘️", + "title": "Shamrock" + }, + { + "emoji": "🍀", + "title": "Four Leaf Clover" + }, + { + "emoji": "🍁", + "title": "Maple Leaf" + }, + { + "emoji": "🍂", + "title": "Fallen Leaf" + }, + { + "emoji": "🍃", + "title": "Leaf Fluttering in Wind" + }, + { + "emoji": "🍄", + "title": "Mushroom" + }, + { + "emoji": "🌰", + "title": "Chestnut" + }, + { + "emoji": "🦀", + "title": "Crab" + }, + { + "emoji": "🦞", + "title": "Lobster" + }, + { + "emoji": "🦐", + "title": "Shrimp" + }, + { + "emoji": "🦑", + "title": "Squid" + }, + { + "emoji": "🌍", + "title": "Globe Showing Europe-Africa" + }, + { + "emoji": "🌎", + "title": "Globe Showing Americas" + }, + { + "emoji": "🌏", + "title": "Globe Showing Asia-Australia" + }, + { + "emoji": "🌐", + "title": "Globe with Meridians" + }, + { + "emoji": "🪨", + "title": "Rock" + }, + { + "emoji": "🌑", + "title": "New Moon" + }, + { + "emoji": "🌒", + "title": "Waxing Crescent Moon" + }, + { + "emoji": "🌓", + "title": "First Quarter Moon" + }, + { + "emoji": "🌔", + "title": "Waxing Gibbous Moon" + }, + { + "emoji": "🌕", + "title": "Full Moon" + }, + { + "emoji": "🌖", + "title": "Waning Gibbous Moon" + }, + { + "emoji": "🌗", + "title": "Last Quarter Moon" + }, + { + "emoji": "🌘", + "title": "Waning Crescent Moon" + }, + { + "emoji": "🌙", + "title": "Crescent Moon" + }, + { + "emoji": "🌚", + "title": "New Moon Face" + }, + { + "emoji": "🌛", + "title": "First Quarter Moon Face" + }, + { + "emoji": "🌜", + "title": "Last Quarter Moon Face" + }, + { + "emoji": "☀️", + "title": "Sun" + }, + { + "emoji": "🌝", + "title": "Full Moon Face" + }, + { + "emoji": "🌞", + "title": "Sun with Face" + }, + { + "emoji": "⭐", + "title": "Star" + }, + { + "emoji": "🌟", + "title": "Glowing Star" + }, + { + "emoji": "🌠", + "title": "Shooting Star" + }, + { + "emoji": "☁️", + "title": "Cloud" + }, + { + "emoji": "⛅", + "title": "Sun Behind Cloud" + }, + { + "emoji": "⛈️", + "title": "Cloud with Lightning and Rain" + }, + { + "emoji": "🌤️", + "title": "Sun Behind Small Cloud" + }, + { + "emoji": "🌥️", + "title": "Sun Behind Large Cloud" + }, + { + "emoji": "🌦️", + "title": "Sun Behind Rain Cloud" + }, + { + "emoji": "🌧️", + "title": "Cloud with Rain" + }, + { + "emoji": "🌨️", + "title": "Cloud with Snow" + }, + { + "emoji": "🌩️", + "title": "Cloud with Lightning" + }, + { + "emoji": "🌪️", + "title": "Tornado" + }, + { + "emoji": "🌫️", + "title": "Fog" + }, + { + "emoji": "🌬️", + "title": "Wind Face" + }, + { + "emoji": "🌈", + "title": "Rainbow" + }, + { + "emoji": "☂️", + "title": "Umbrella" + }, + { + "emoji": "☔", + "title": "Umbrella with Rain Drops" + }, + { + "emoji": "⚡", + "title": "High Voltage" + }, + { + "emoji": "❄️", + "title": "Snowflake" + }, + { + "emoji": "☃️", + "title": "Snowman" + }, + { + "emoji": "⛄", + "title": "Snowman Without Snow" + }, + { + "emoji": "☄️", + "title": "Comet" + }, + { + "emoji": "🔥", + "title": "Fire" + }, + { + "emoji": "💧", + "title": "Droplet" + }, + { + "emoji": "🌊", + "title": "Water Wave" + }, + { + "emoji": "🎄", + "title": "Christmas Tree" + }, + { + "emoji": "✨", + "title": "Sparkles" + }, + { + "emoji": "🎋", + "title": "Tanabata Tree" + }, + { + "emoji": "🎍", + "title": "Pine Decoration" + } + ], + 'Food-dring': [ + { + "emoji": "🍇", + "title": "Grapes" + }, + { + "emoji": "🍈", + "title": "Melon" + }, + { + "emoji": "🍉", + "title": "Watermelon" + }, + { + "emoji": "🍊", + "title": "Tangerine" + }, + { + "emoji": "🍋", + "title": "Lemon" + }, + { + "emoji": "🍌", + "title": "Banana" + }, + { + "emoji": "🍍", + "title": "Pineapple" + }, + { + "emoji": "🥭", + "title": "Mango" + }, + { + "emoji": "🍎", + "title": "Red Apple" + }, + { + "emoji": "🍏", + "title": "Green Apple" + }, + { + "emoji": "🍐", + "title": "Pear" + }, + { + "emoji": "🍑", + "title": "Peach" + }, + { + "emoji": "🍒", + "title": "Cherries" + }, + { + "emoji": "🍓", + "title": "Strawberry" + }, + { + "emoji": "🫐", + "title": "Blueberries" + }, + { + "emoji": "🥝", + "title": "Kiwi Fruit" + }, + { + "emoji": "🍅", + "title": "Tomato" + }, + { + "emoji": "🫒", + "title": "Olive" + }, + { + "emoji": "🥥", + "title": "Coconut" + }, + { + "emoji": "🥑", + "title": "Avocado" + }, + { + "emoji": "🍆", + "title": "Eggplant" + }, + { + "emoji": "🥔", + "title": "Potato" + }, + { + "emoji": "🥕", + "title": "Carrot" + }, + { + "emoji": "🌽", + "title": "Ear of Corn" + }, + { + "emoji": "🌶️", + "title": "Hot Pepper" + }, + { + "emoji": "🫑", + "title": "Bell Pepper" + }, + { + "emoji": "🥒", + "title": "Cucumber" + }, + { + "emoji": "🥬", + "title": "Leafy Green" + }, + { + "emoji": "🥦", + "title": "Broccoli" + }, + { + "emoji": "🧄", + "title": "Garlic" + }, + { + "emoji": "🧅", + "title": "Onion" + }, + { + "emoji": "🍄", + "title": "Mushroom" + }, + { + "emoji": "🥜", + "title": "Peanuts" + }, + { + "emoji": "🌰", + "title": "Chestnut" + }, + { + "emoji": "🍞", + "title": "Bread" + }, + { + "emoji": "🥐", + "title": "Croissant" + }, + { + "emoji": "🥖", + "title": "Baguette Bread" + }, + { + "emoji": "🫓", + "title": "Flatbread" + }, + { + "emoji": "🥨", + "title": "Pretzel" + }, + { + "emoji": "🥯", + "title": "Bagel" + }, + { + "emoji": "🥞", + "title": "Pancakes" + }, + { + "emoji": "🧇", + "title": "Waffle" + }, + { + "emoji": "🧀", + "title": "Cheese Wedge" + }, + { + "emoji": "🍖", + "title": "Meat on Bone" + }, + { + "emoji": "🍗", + "title": "Poultry Leg" + }, + { + "emoji": "🥩", + "title": "Cut of Meat" + }, + { + "emoji": "🥓", + "title": "Bacon" + }, + { + "emoji": "🍔", + "title": "Hamburger" + }, + { + "emoji": "🍟", + "title": "French Fries" + }, + { + "emoji": "🍕", + "title": "Pizza" + }, + { + "emoji": "🌭", + "title": "Hot Dog" + }, + { + "emoji": "🥪", + "title": "Sandwich" + }, + { + "emoji": "🌮", + "title": "Taco" + }, + { + "emoji": "🌯", + "title": "Burrito" + }, + { + "emoji": "🫔", + "title": "Tamale" + }, + { + "emoji": "🥙", + "title": "Stuffed Flatbread" + }, + { + "emoji": "🧆", + "title": "Falafel" + }, + { + "emoji": "🥚", + "title": "Egg" + }, + { + "emoji": "🍳", + "title": "Cooking" + }, + { + "emoji": "🥘", + "title": "Shallow Pan of Food" + }, + { + "emoji": "🍲", + "title": "Pot of Food" + }, + { + "emoji": "🫕", + "title": "Fondue" + }, + { + "emoji": "🥣", + "title": "Bowl with Spoon" + }, + { + "emoji": "🥗", + "title": "Green Salad" + }, + { + "emoji": "🍿", + "title": "Popcorn" + }, + { + "emoji": "🧈", + "title": "Butter" + }, + { + "emoji": "🧂", + "title": "Salt" + }, + { + "emoji": "🥫", + "title": "Canned Food" + }, + { + "emoji": "🍱", + "title": "Bento Box" + }, + { + "emoji": "🍘", + "title": "Rice Cracker" + }, + { + "emoji": "🍙", + "title": "Rice Ball" + }, + { + "emoji": "🍚", + "title": "Cooked Rice" + }, + { + "emoji": "🍛", + "title": "Curry Rice" + }, + { + "emoji": "🍜", + "title": "Steaming Bowl" + }, + { + "emoji": "🍝", + "title": "Spaghetti" + }, + { + "emoji": "🍠", + "title": "Roasted Sweet Potato" + }, + { + "emoji": "🍢", + "title": "Oden" + }, + { + "emoji": "🍣", + "title": "Sushi" + }, + { + "emoji": "🍤", + "title": "Fried Shrimp" + }, + { + "emoji": "🍥", + "title": "Fish Cake with Swirl" + }, + { + "emoji": "🥮", + "title": "Moon Cake" + }, + { + "emoji": "🍡", + "title": "Dango" + }, + { + "emoji": "🥟", + "title": "Dumpling" + }, + { + "emoji": "🥠", + "title": "Fortune Cookie" + }, + { + "emoji": "🥡", + "title": "Takeout Box" + }, + { + "emoji": "🦪", + "title": "Oyster" + }, + { + "emoji": "🍦", + "title": "Soft Ice Cream" + }, + { + "emoji": "🍧", + "title": "Shaved Ice" + }, + { + "emoji": "🍨", + "title": "Ice Cream" + }, + { + "emoji": "🍩", + "title": "Doughnut" + }, + { + "emoji": "🍪", + "title": "Cookie" + }, + { + "emoji": "🎂", + "title": "Birthday Cake" + }, + { + "emoji": "🍰", + "title": "Shortcake" + }, + { + "emoji": "🧁", + "title": "Cupcake" + }, + { + "emoji": "🥧", + "title": "Pie" + }, + { + "emoji": "🍫", + "title": "Chocolate Bar" + }, + { + "emoji": "🍬", + "title": "Candy" + }, + { + "emoji": "🍭", + "title": "Lollipop" + }, + { + "emoji": "🍮", + "title": "Custard" + }, + { + "emoji": "🍯", + "title": "Honey Pot" + }, + { + "emoji": "🍼", + "title": "Baby Bottle" + }, + { + "emoji": "🥛", + "title": "Glass of Milk" + }, + { + "emoji": "☕", + "title": "Hot Beverage" + }, + { + "emoji": "🫖", + "title": "Teapot" + }, + { + "emoji": "🍵", + "title": "Teacup Without Handle" + }, + { + "emoji": "🍶", + "title": "Sake" + }, + { + "emoji": "🍾", + "title": "Bottle with Popping Cork" + }, + { + "emoji": "🍷", + "title": "Wine Glass" + }, + { + "emoji": "🍸", + "title": "Cocktail Glass" + }, + { + "emoji": "🍹", + "title": "Tropical Drink" + }, + { + "emoji": "🍺", + "title": "Beer Mug" + }, + { + "emoji": "🍻", + "title": "Clinking Beer Mugs" + }, + { + "emoji": "🥂", + "title": "Clinking Glasses" + }, + { + "emoji": "🥃", + "title": "Tumbler Glass" + }, + { + "emoji": "🥤", + "title": "Cup with Straw" + }, + { + "emoji": "🧋", + "title": "Bubble Tea" + }, + { + "emoji": "🧃", + "title": "Beverage Box" + }, + { + "emoji": "🧉", + "title": "Mate" + }, + { + "emoji": "🧊", + "title": "Ice" + }, + { + "emoji": "🥢", + "title": "Chopsticks" + }, + { + "emoji": "🍽️", + "title": "Fork and Knife with Plate" + }, + { + "emoji": "🍴", + "title": "Fork and Knife" + }, + { + "emoji": "🥄", + "title": "Spoon" + } + ], + 'Activity': [ + { + "emoji": "🕴️", + "title": "Person in Suit Levitating" + }, + { + "emoji": "🧗", + "title": "Person Climbing" + }, + { + "emoji": "🧗‍♂️", + "title": "Man Climbing" + }, + { + "emoji": "🧗‍♀️", + "title": "Woman Climbing" + }, + { + "emoji": "🤺", + "title": "Person Fencing" + }, + { + "emoji": "🏇", + "title": "Horse Racing" + }, + { + "emoji": "⛷️", + "title": "Skier" + }, + { + "emoji": "🏂", + "title": "Snowboarder" + }, + { + "emoji": "🏌️", + "title": "Person Golfing" + }, + { + "emoji": "🏌️‍♂️", + "title": "Man Golfing" + }, + { + "emoji": "🏌️‍♀️", + "title": "Woman Golfing" + }, + { + "emoji": "🏄", + "title": "Person Surfing" + }, + { + "emoji": "🏄‍♂️", + "title": "Man Surfing" + }, + { + "emoji": "🏄‍♀️", + "title": "Woman Surfing" + }, + { + "emoji": "🚣", + "title": "Person Rowing Boat" + }, + { + "emoji": "🚣‍♂️", + "title": "Man Rowing Boat" + }, + { + "emoji": "🚣‍♀️", + "title": "Woman Rowing Boat" + }, + { + "emoji": "🏊", + "title": "Person Swimming" + }, + { + "emoji": "🏊‍♂️", + "title": "Man Swimming" + }, + { + "emoji": "🏊‍♀️", + "title": "Woman Swimming" + }, + { + "emoji": "⛹️", + "title": "Person Bouncing Ball" + }, + { + "emoji": "⛹️‍♂️", + "title": "Man Bouncing Ball" + }, + { + "emoji": "⛹️‍♀️", + "title": "Woman Bouncing Ball" + }, + { + "emoji": "🏋️", + "title": "Person Lifting Weights" + }, + { + "emoji": "🏋️‍♂️", + "title": "Man Lifting Weights" + }, + { + "emoji": "🏋️‍♀️", + "title": "Woman Lifting Weights" + }, + { + "emoji": "🚴", + "title": "Person Biking" + }, + { + "emoji": "🚴‍♂️", + "title": "Man Biking" + }, + { + "emoji": "🚴‍♀️", + "title": "Woman Biking" + }, + { + "emoji": "🚵", + "title": "Person Mountain Biking" + }, + { + "emoji": "🚵‍♂️", + "title": "Man Mountain Biking" + }, + { + "emoji": "🚵‍♀️", + "title": "Woman Mountain Biking" + }, + { + "emoji": "🤸", + "title": "Person Cartwheeling" + }, + { + "emoji": "🤸‍♂️", + "title": "Man Cartwheeling" + }, + { + "emoji": "🤸‍♀️", + "title": "Woman Cartwheeling" + }, + { + "emoji": "🤼", + "title": "People Wrestling" + }, + { + "emoji": "🤼‍♂️", + "title": "Men Wrestling" + }, + { + "emoji": "🤼‍♀️", + "title": "Women Wrestling" + }, + { + "emoji": "🤽", + "title": "Person Playing Water Polo" + }, + { + "emoji": "🤽‍♂️", + "title": "Man Playing Water Polo" + }, + { + "emoji": "🤽‍♀️", + "title": "Woman Playing Water Polo" + }, + { + "emoji": "🤾", + "title": "Person Playing Handball" + }, + { + "emoji": "🤾‍♂️", + "title": "Man Playing Handball" + }, + { + "emoji": "🤾‍♀️", + "title": "Woman Playing Handball" + }, + { + "emoji": "🤹", + "title": "Person Juggling" + }, + { + "emoji": "🤹‍♂️", + "title": "Man Juggling" + }, + { + "emoji": "🤹‍♀️", + "title": "Woman Juggling" + }, + { + "emoji": "🧘", + "title": "Person in Lotus Position" + }, + { + "emoji": "🧘‍♂️", + "title": "Man in Lotus Position" + }, + { + "emoji": "🧘‍♀️", + "title": "Woman in Lotus Position" + }, + { + "emoji": "🎪", + "title": "Circus Tent" + }, + { + "emoji": "🛹", + "title": "Skateboard" + }, + { + "emoji": "🛼", + "title": "Roller Skate" + }, + { + "emoji": "🛶", + "title": "Canoe" + }, + { + "emoji": "🎗️", + "title": "Reminder Ribbon" + }, + { + "emoji": "🎟️", + "title": "Admission Tickets" + }, + { + "emoji": "🎫", + "title": "Ticket" + }, + { + "emoji": "🎖️", + "title": "Military Medal" + }, + { + "emoji": "🏆", + "title": "Trophy" + }, + { + "emoji": "🏅", + "title": "Sports Medal" + }, + { + "emoji": "🥇", + "title": "1st Place Medal" + }, + { + "emoji": "🥈", + "title": "2nd Place Medal" + }, + { + "emoji": "🥉", + "title": "3rd Place Medal" + }, + { + "emoji": "⚽", + "title": "Soccer Ball" + }, + { + "emoji": "⚾", + "title": "Baseball" + }, + { + "emoji": "🥎", + "title": "Softball" + }, + { + "emoji": "🏀", + "title": "Basketball" + }, + { + "emoji": "🏐", + "title": "Volleyball" + }, + { + "emoji": "🏈", + "title": "American Football" + }, + { + "emoji": "🏉", + "title": "Rugby Football" + }, + { + "emoji": "🎾", + "title": "Tennis" + }, + { + "emoji": "🥏", + "title": "Flying Disc" + }, + { + "emoji": "🎳", + "title": "Bowling" + }, + { + "emoji": "🏏", + "title": "Cricket Game" + }, + { + "emoji": "🏑", + "title": "Field Hockey" + }, + { + "emoji": "🏒", + "title": "Ice Hockey" + }, + { + "emoji": "🥍", + "title": "Lacrosse" + }, + { + "emoji": "🏓", + "title": "Ping Pong" + }, + { + "emoji": "🏸", + "title": "Badminton" + }, + { + "emoji": "🥊", + "title": "Boxing Glove" + }, + { + "emoji": "🥋", + "title": "Martial Arts Uniform" + }, + { + "emoji": "🥅", + "title": "Goal Net" + }, + { + "emoji": "⛳", + "title": "Flag in Hole" + }, + { + "emoji": "⛸️", + "title": "Ice Skate" + }, + { + "emoji": "🎣", + "title": "Fishing Pole" + }, + { + "emoji": "🎽", + "title": "Running Shirt" + }, + { + "emoji": "🎿", + "title": "Skis" + }, + { + "emoji": "🛷", + "title": "Sled" + }, + { + "emoji": "🥌", + "title": "Curling Stone" + }, + { + "emoji": "🎯", + "title": "Bullseye" + }, + { + "emoji": "🎱", + "title": "Pool 8 Ball" + }, + { + "emoji": "🎮", + "title": "Video Game" + }, + { + "emoji": "🎰", + "title": "Slot Machine" + }, + { + "emoji": "🎲", + "title": "Game Die" + }, + { + "emoji": "🧩", + "title": "Puzzle Piece" + }, + { + "emoji": "♟️", + "title": "Chess Pawn" + }, + { + "emoji": "🎭", + "title": "Performing Arts" + }, + { + "emoji": "🎨", + "title": "Artist Palette" + }, + { + "emoji": "🧵", + "title": "Thread" + }, + { + "emoji": "🧶", + "title": "Yarn" + }, + { + "emoji": "🎼", + "title": "Musical Score" + }, + { + "emoji": "🎤", + "title": "Microphone" + }, + { + "emoji": "🎧", + "title": "Headphone" + }, + { + "emoji": "🎷", + "title": "Saxophone" + }, + { + "emoji": "🪗", + "title": "Accordion" + }, + { + "emoji": "🎸", + "title": "Guitar" + }, + { + "emoji": "🎹", + "title": "Musical Keyboard" + }, + { + "emoji": "🎺", + "title": "Trumpet" + }, + { + "emoji": "🎻", + "title": "Violin" + }, + { + "emoji": "🥁", + "title": "Drum" + }, + { + "emoji": "🪘", + "title": "Long Drum" + }, + { + "emoji": "🎬", + "title": "Clapper Board" + }, + { + "emoji": "🏹", + "title": "Bow and Arrow" + } + ], + 'Travel-places': [ + { + "emoji": "🚣", + "title": "Person Rowing Boat" + }, + { + "emoji": "🗾", + "title": "Map of Japan" + }, + { + "emoji": "🏔️", + "title": "Snow-Capped Mountain" + }, + { + "emoji": "⛰️", + "title": "Mountain" + }, + { + "emoji": "🌋", + "title": "Volcano" + }, + { + "emoji": "🗻", + "title": "Mount Fuji" + }, + { + "emoji": "🏕️", + "title": "Camping" + }, + { + "emoji": "🏖️", + "title": "Beach with Umbrella" + }, + { + "emoji": "🏜️", + "title": "Desert" + }, + { + "emoji": "🏝️", + "title": "Desert Island" + }, + { + "emoji": "🏞️", + "title": "National Park" + }, + { + "emoji": "🏟️", + "title": "Stadium" + }, + { + "emoji": "🏛️", + "title": "Classical Building" + }, + { + "emoji": "🏗️", + "title": "Building Construction" + }, + { + "emoji": "🛖", + "title": "Hut" + }, + { + "emoji": "🏘️", + "title": "Houses" + }, + { + "emoji": "🏚️", + "title": "Derelict House" + }, + { + "emoji": "🏠", + "title": "House" + }, + { + "emoji": "🏡", + "title": "House with Garden" + }, + { + "emoji": "🏢", + "title": "Office Building" + }, + { + "emoji": "🏣", + "title": "Japanese Post Office" + }, + { + "emoji": "🏤", + "title": "Post Office" + }, + { + "emoji": "🏥", + "title": "Hospital" + }, + { + "emoji": "🏦", + "title": "Bank" + }, + { + "emoji": "🏨", + "title": "Hotel" + }, + { + "emoji": "🏩", + "title": "Love Hotel" + }, + { + "emoji": "🏪", + "title": "Convenience Store" + }, + { + "emoji": "🏫", + "title": "School" + }, + { + "emoji": "🏬", + "title": "Department Store" + }, + { + "emoji": "🏭", + "title": "Factory" + }, + { + "emoji": "🏯", + "title": "Japanese Castle" + }, + { + "emoji": "🏰", + "title": "Castle" + }, + { + "emoji": "💒", + "title": "Wedding" + }, + { + "emoji": "🗼", + "title": "Tokyo Tower" + }, + { + "emoji": "🗽", + "title": "Statue of Liberty" + }, + { + "emoji": "⛪", + "title": "Church" + }, + { + "emoji": "🕌", + "title": "Mosque" + }, + { + "emoji": "🛕", + "title": "Hindu Temple" + }, + { + "emoji": "🕍", + "title": "Synagogue" + }, + { + "emoji": "⛩️", + "title": "Shinto Shrine" + }, + { + "emoji": "🕋", + "title": "Kaaba" + }, + { + "emoji": "⛲", + "title": "Fountain" + }, + { + "emoji": "⛺", + "title": "Tent" + }, + { + "emoji": "🌁", + "title": "Foggy" + }, + { + "emoji": "🌃", + "title": "Night with Stars" + }, + { + "emoji": "🏙️", + "title": "Cityscape" + }, + { + "emoji": "🌄", + "title": "Sunrise Over Mountains" + }, + { + "emoji": "🌅", + "title": "Sunrise" + }, + { + "emoji": "🌆", + "title": "Cityscape at Dusk" + }, + { + "emoji": "🌇", + "title": "Sunset" + }, + { + "emoji": "🌉", + "title": "Bridge at Night" + }, + { + "emoji": "🎠", + "title": "Carousel Horse" + }, + { + "emoji": "🎡", + "title": "Ferris Wheel" + }, + { + "emoji": "🎢", + "title": "Roller Coaster" + }, + { + "emoji": "🚂", + "title": "Locomotive" + }, + { + "emoji": "🚃", + "title": "Railway Car" + }, + { + "emoji": "🚄", + "title": "High-Speed Train" + }, + { + "emoji": "🚅", + "title": "Bullet Train" + }, + { + "emoji": "🚆", + "title": "Train" + }, + { + "emoji": "🚇", + "title": "Metro" + }, + { + "emoji": "🚈", + "title": "Light Rail" + }, + { + "emoji": "🚉", + "title": "Station" + }, + { + "emoji": "🚊", + "title": "Tram" + }, + { + "emoji": "🚝", + "title": "Monorail" + }, + { + "emoji": "🚞", + "title": "Mountain Railway" + }, + { + "emoji": "🚋", + "title": "Tram Car" + }, + { + "emoji": "🚌", + "title": "Bus" + }, + { + "emoji": "🚍", + "title": "Oncoming Bus" + }, + { + "emoji": "🚎", + "title": "Trolleybus" + }, + { + "emoji": "🚐", + "title": "Minibus" + }, + { + "emoji": "🚑", + "title": "Ambulance" + }, + { + "emoji": "🚒", + "title": "Fire Engine" + }, + { + "emoji": "🚓", + "title": "Police Car" + }, + { + "emoji": "🚔", + "title": "Oncoming Police Car" + }, + { + "emoji": "🚕", + "title": "Taxi" + }, + { + "emoji": "🚖", + "title": "Oncoming Taxi" + }, + { + "emoji": "🚗", + "title": "Automobile" + }, + { + "emoji": "🚘", + "title": "Oncoming Automobile" + }, + { + "emoji": "🚙", + "title": "Sport Utility Vehicle" + }, + { + "emoji": "🛻", + "title": "Pickup Truck" + }, + { + "emoji": "🚚", + "title": "Delivery Truck" + }, + { + "emoji": "🚛", + "title": "Articulated Lorry" + }, + { + "emoji": "🚜", + "title": "Tractor" + }, + { + "emoji": "🏎️", + "title": "Racing Car" + }, + { + "emoji": "🏍️", + "title": "Motorcycle" + }, + { + "emoji": "🛵", + "title": "Motor Scooter" + }, + { + "emoji": "🛺", + "title": "Auto Rickshaw" + }, + { + "emoji": "🚲", + "title": "Bicycle" + }, + { + "emoji": "🛴", + "title": "Kick Scooter" + }, + { + "emoji": "🚏", + "title": "Bus Stop" + }, + { + "emoji": "🛣️", + "title": "Motorway" + }, + { + "emoji": "🛤️", + "title": "Railway Track" + }, + { + "emoji": "⛽", + "title": "Fuel Pump" + }, + { + "emoji": "🚨", + "title": "Police Car Light" + }, + { + "emoji": "🚥", + "title": "Horizontal Traffic Light" + }, + { + "emoji": "🚦", + "title": "Vertical Traffic Light" + }, + { + "emoji": "🚧", + "title": "Construction" + }, + { + "emoji": "⚓", + "title": "Anchor" + }, + { + "emoji": "⛵", + "title": "Sailboat" + }, + { + "emoji": "🚤", + "title": "Speedboat" + }, + { + "emoji": "🛳️", + "title": "Passenger Ship" + }, + { + "emoji": "⛴️", + "title": "Ferry" + }, + { + "emoji": "🛥️", + "title": "Motor Boat" + }, + { + "emoji": "🚢", + "title": "Ship" + }, + { + "emoji": "✈️", + "title": "Airplane" + }, + { + "emoji": "🛩️", + "title": "Small Airplane" + }, + { + "emoji": "🛫", + "title": "Airplane Departure" + }, + { + "emoji": "🛬", + "title": "Airplane Arrival" + }, + { + "emoji": "🪂", + "title": "Parachute" + }, + { + "emoji": "💺", + "title": "Seat" + }, + { + "emoji": "🚁", + "title": "Helicopter" + }, + { + "emoji": "🚟", + "title": "Suspension Railway" + }, + { + "emoji": "🚠", + "title": "Mountain Cableway" + }, + { + "emoji": "🚡", + "title": "Aerial Tramway" + }, + { + "emoji": "🛰️", + "title": "Satellite" + }, + { + "emoji": "🚀", + "title": "Rocket" + }, + { + "emoji": "🛸", + "title": "Flying Saucer" + }, + { + "emoji": "🪐", + "title": "Ringed Planet" + }, + { + "emoji": "🌠", + "title": "Shooting Star" + }, + { + "emoji": "🌌", + "title": "Milky Way" + }, + { + "emoji": "⛱️", + "title": "Umbrella on Ground" + }, + { + "emoji": "🎆", + "title": "Fireworks" + }, + { + "emoji": "🎇", + "title": "Sparkler" + }, + { + "emoji": "🎑", + "title": "Moon Viewing Ceremony" + }, + { + "emoji": "💴", + "title": "Yen Banknote" + }, + { + "emoji": "💵", + "title": "Dollar Banknote" + }, + { + "emoji": "💶", + "title": "Euro Banknote" + }, + { + "emoji": "💷", + "title": "Pound Banknote" + }, + { + "emoji": "🗿", + "title": "Moai" + }, + { + "emoji": "🛂", + "title": "Passport Control" + }, + { + "emoji": "🛃", + "title": "Customs" + }, + { + "emoji": "🛄", + "title": "Baggage Claim" + }, + { + "emoji": "🛅", + "title": "Left Luggage" + } + ], + 'Objects': [ + { + "emoji": "💌", + "title": "Love Letter" + }, + { + "emoji": "🕳️", + "title": "Hole" + }, + { + "emoji": "💣", + "title": "Bomb" + }, + { + "emoji": "🛀", + "title": "Person Taking Bath" + }, + { + "emoji": "🛌", + "title": "Person in Bed" + }, + { + "emoji": "🔪", + "title": "Kitchen Knife" + }, + { + "emoji": "🏺", + "title": "Amphora" + }, + { + "emoji": "🗺️", + "title": "World Map" + }, + { + "emoji": "🧭", + "title": "Compass" + }, + { + "emoji": "🧱", + "title": "Brick" + }, + { + "emoji": "💈", + "title": "Barber Pole" + }, + { + "emoji": "🦽", + "title": "Manual Wheelchair" + }, + { + "emoji": "🦼", + "title": "Motorized Wheelchair" + }, + { + "emoji": "🛢️", + "title": "Oil Drum" + }, + { + "emoji": "🛎️", + "title": "Bellhop Bell" + }, + { + "emoji": "🧳", + "title": "Luggage" + }, + { + "emoji": "⌛", + "title": "Hourglass Done" + }, + { + "emoji": "⏳", + "title": "Hourglass Not Done" + }, + { + "emoji": "⌚", + "title": "Watch" + }, + { + "emoji": "⏰", + "title": "Alarm Clock" + }, + { + "emoji": "⏱️", + "title": "Stopwatch" + }, + { + "emoji": "⏲️", + "title": "Timer Clock" + }, + { + "emoji": "🕰️", + "title": "Mantelpiece Clock" + }, + { + "emoji": "🌡️", + "title": "Thermometer" + }, + { + "emoji": "⛱️", + "title": "Umbrella on Ground" + }, + { + "emoji": "🧨", + "title": "Firecracker" + }, + { + "emoji": "🎈", + "title": "Balloon" + }, + { + "emoji": "🎉", + "title": "Party Popper" + }, + { + "emoji": "🎊", + "title": "Confetti Ball" + }, + { + "emoji": "🎎", + "title": "Japanese Dolls" + }, + { + "emoji": "🎏", + "title": "Carp Streamer" + }, + { + "emoji": "🎐", + "title": "Wind Chime" + }, + { + "emoji": "🧧", + "title": "Red Envelope" + }, + { + "emoji": "🎀", + "title": "Ribbon" + }, + { + "emoji": "🎁", + "title": "Wrapped Gift" + }, + { + "emoji": "🤿", + "title": "Diving Mask" + }, + { + "emoji": "🪀", + "title": "Yo-Yo" + }, + { + "emoji": "🪁", + "title": "Kite" + }, + { + "emoji": "🔮", + "title": "Crystal Ball" + }, + { + "emoji": "🪄", + "title": "Magic Wand" + }, + { + "emoji": "🧿", + "title": "Nazar Amulet" + }, + { + "emoji": "🕹️", + "title": "Joystick" + }, + { + "emoji": "🧸", + "title": "Teddy Bear" + }, + { + "emoji": "🪅", + "title": "Piñata" + }, + { + "emoji": "🪆", + "title": "Nesting Dolls" + }, + { + "emoji": "🖼️", + "title": "Framed Picture" + }, + { + "emoji": "🧵", + "title": "Thread" + }, + { + "emoji": "🪡", + "title": "Sewing Needle" + }, + { + "emoji": "🧶", + "title": "Yarn" + }, + { + "emoji": "🪢", + "title": "Knot" + }, + { + "emoji": "🛍️", + "title": "Shopping Bags" + }, + { + "emoji": "📿", + "title": "Prayer Beads" + }, + { + "emoji": "💎", + "title": "Gem Stone" + }, + { + "emoji": "📯", + "title": "Postal Horn" + }, + { + "emoji": "🎙️", + "title": "Studio Microphone" + }, + { + "emoji": "🎚️", + "title": "Level Slider" + }, + { + "emoji": "🎛️", + "title": "Control Knobs" + }, + { + "emoji": "📻", + "title": "Radio" + }, + { + "emoji": "🪕", + "title": "Banjo" + }, + { + "emoji": "📱", + "title": "Mobile Phone" + }, + { + "emoji": "📲", + "title": "Mobile Phone with Arrow" + }, + { + "emoji": "☎️", + "title": "Telephone" + }, + { + "emoji": "📞", + "title": "Telephone Receiver" + }, + { + "emoji": "📟", + "title": "Pager" + }, + { + "emoji": "📠", + "title": "Fax Machine" + }, + { + "emoji": "🔋", + "title": "Battery" + }, + { + "emoji": "🔌", + "title": "Electric Plug" + }, + { + "emoji": "💻", + "title": "Laptop" + }, + { + "emoji": "🖥️", + "title": "Desktop Computer" + }, + { + "emoji": "🖨️", + "title": "Printer" + }, + { + "emoji": "⌨️", + "title": "Keyboard" + }, + { + "emoji": "🖱️", + "title": "Computer Mouse" + }, + { + "emoji": "🖲️", + "title": "Trackball" + }, + { + "emoji": "💽", + "title": "Computer Disk" + }, + { + "emoji": "💾", + "title": "Floppy Disk" + }, + { + "emoji": "💿", + "title": "Optical Disk" + }, + { + "emoji": "📀", + "title": "DVD" + }, + { + "emoji": "🧮", + "title": "Abacus" + }, + { + "emoji": "🎥", + "title": "Movie Camera" + }, + { + "emoji": "🎞️", + "title": "Film Frames" + }, + { + "emoji": "📽️", + "title": "Film Projector" + }, + { + "emoji": "📺", + "title": "Television" + }, + { + "emoji": "📷", + "title": "Camera" + }, + { + "emoji": "📸", + "title": "Camera with Flash" + }, + { + "emoji": "📹", + "title": "Video Camera" + }, + { + "emoji": "📼", + "title": "Videocassette" + }, + { + "emoji": "🔍", + "title": "Magnifying Glass Tilted Left" + }, + { + "emoji": "🔎", + "title": "Magnifying Glass Tilted Right" + }, + { + "emoji": "🕯️", + "title": "Candle" + }, + { + "emoji": "💡", + "title": "Light Bulb" + }, + { + "emoji": "🔦", + "title": "Flashlight" + }, + { + "emoji": "🏮", + "title": "Red Paper Lantern" + }, + { + "emoji": "🪔", + "title": "Diya Lamp" + }, + { + "emoji": "📔", + "title": "Notebook with Decorative Cover" + }, + { + "emoji": "📕", + "title": "Closed Book" + }, + { + "emoji": "📖", + "title": "Open Book" + }, + { + "emoji": "📗", + "title": "Green Book" + }, + { + "emoji": "📘", + "title": "Blue Book" + }, + { + "emoji": "📙", + "title": "Orange Book" + }, + { + "emoji": "📚", + "title": "Books" + }, + { + "emoji": "📓", + "title": "Notebook" + }, + { + "emoji": "📒", + "title": "Ledger" + }, + { + "emoji": "📃", + "title": "Page with Curl" + }, + { + "emoji": "📜", + "title": "Scroll" + }, + { + "emoji": "📄", + "title": "Page Facing Up" + }, + { + "emoji": "📰", + "title": "Newspaper" + }, + { + "emoji": "🗞️", + "title": "Rolled-Up Newspaper" + }, + { + "emoji": "📑", + "title": "Bookmark Tabs" + }, + { + "emoji": "🔖", + "title": "Bookmark" + }, + { + "emoji": "🏷️", + "title": "Label" + }, + { + "emoji": "💰", + "title": "Money Bag" + }, + { + "emoji": "🪙", + "title": "Coin" + }, + { + "emoji": "💴", + "title": "Yen Banknote" + }, + { + "emoji": "💵", + "title": "Dollar Banknote" + }, + { + "emoji": "💶", + "title": "Euro Banknote" + }, + { + "emoji": "💷", + "title": "Pound Banknote" + }, + { + "emoji": "💸", + "title": "Money with Wings" + }, + { + "emoji": "💳", + "title": "Credit Card" + }, + { + "emoji": "🧾", + "title": "Receipt" + }, + { + "emoji": "✉️", + "title": "Envelope" + }, + { + "emoji": "📧", + "title": "E-Mail" + }, + { + "emoji": "📨", + "title": "Incoming Envelope" + }, + { + "emoji": "📩", + "title": "Envelope with Arrow" + }, + { + "emoji": "📤", + "title": "Outbox Tray" + }, + { + "emoji": "📥", + "title": "Inbox Tray" + }, + { + "emoji": "📦", + "title": "Package" + }, + { + "emoji": "📫", + "title": "Closed Mailbox with Raised Flag" + }, + { + "emoji": "📪", + "title": "Closed Mailbox with Lowered Flag" + }, + { + "emoji": "📬", + "title": "Open Mailbox with Raised Flag" + }, + { + "emoji": "📭", + "title": "Open Mailbox with Lowered Flag" + }, + { + "emoji": "📮", + "title": "Postbox" + }, + { + "emoji": "🗳️", + "title": "Ballot Box with Ballot" + }, + { + "emoji": "✏️", + "title": "Pencil" + }, + { + "emoji": "✒️", + "title": "Black Nib" + }, + { + "emoji": "🖋️", + "title": "Fountain Pen" + }, + { + "emoji": "🖊️", + "title": "Pen" + }, + { + "emoji": "🖌️", + "title": "Paintbrush" + }, + { + "emoji": "🖍️", + "title": "Crayon" + }, + { + "emoji": "📝", + "title": "Memo" + }, + { + "emoji": "📁", + "title": "File Folder" + }, + { + "emoji": "📂", + "title": "Open File Folder" + }, + { + "emoji": "🗂️", + "title": "Card Index Dividers" + }, + { + "emoji": "📅", + "title": "Calendar" + }, + { + "emoji": "📆", + "title": "Tear-Off Calendar" + }, + { + "emoji": "🗒️", + "title": "Spiral Notepad" + }, + { + "emoji": "🗓️", + "title": "Spiral Calendar" + }, + { + "emoji": "📇", + "title": "Card Index" + }, + { + "emoji": "📈", + "title": "Chart Increasing" + }, + { + "emoji": "📉", + "title": "Chart Decreasing" + }, + { + "emoji": "📊", + "title": "Bar Chart" + }, + { + "emoji": "📋", + "title": "Clipboard" + }, + { + "emoji": "📌", + "title": "Pushpin" + }, + { + "emoji": "📍", + "title": "Round Pushpin" + }, + { + "emoji": "📎", + "title": "Paperclip" + }, + { + "emoji": "🖇️", + "title": "Linked Paperclips" + }, + { + "emoji": "📏", + "title": "Straight Ruler" + }, + { + "emoji": "📐", + "title": "Triangular Ruler" + }, + { + "emoji": "✂️", + "title": "Scissors" + }, + { + "emoji": "🗃️", + "title": "Card File Box" + }, + { + "emoji": "🗄️", + "title": "File Cabinet" + }, + { + "emoji": "🗑️", + "title": "Wastebasket" + }, + { + "emoji": "🔒", + "title": "Locked" + }, + { + "emoji": "🔓", + "title": "Unlocked" + }, + { + "emoji": "🔏", + "title": "Locked with Pen" + }, + { + "emoji": "🔐", + "title": "Locked with Key" + }, + { + "emoji": "🔑", + "title": "Key" + }, + { + "emoji": "🗝️", + "title": "Old Key" + }, + { + "emoji": "🔨", + "title": "Hammer" + }, + { + "emoji": "🪓", + "title": "Axe" + }, + { + "emoji": "⛏️", + "title": "Pick" + }, + { + "emoji": "⚒️", + "title": "Hammer and Pick" + }, + { + "emoji": "🛠️", + "title": "Hammer and Wrench" + }, + { + "emoji": "🗡️", + "title": "Dagger" + }, + { + "emoji": "⚔️", + "title": "Crossed Swords" + }, + { + "emoji": "🔫", + "title": "Water Pistol" + }, + { + "emoji": "🪃", + "title": "Boomerang" + }, + { + "emoji": "🛡️", + "title": "Shield" + }, + { + "emoji": "🪚", + "title": "Carpentry Saw" + }, + { + "emoji": "🔧", + "title": "Wrench" + }, + { + "emoji": "🪛", + "title": "Screwdriver" + }, + { + "emoji": "🔩", + "title": "Nut and Bolt" + }, + { + "emoji": "⚙️", + "title": "Gear" + }, + { + "emoji": "🗜️", + "title": "Clamp" + }, + { + "emoji": "⚖️", + "title": "Balance Scale" + }, + { + "emoji": "🦯", + "title": "White Cane" + }, + { + "emoji": "🔗", + "title": "Link" + }, + { + "emoji": "⛓️", + "title": "Chains" + }, + { + "emoji": "🪝", + "title": "Hook" + }, + { + "emoji": "🧰", + "title": "Toolbox" + }, + { + "emoji": "🧲", + "title": "Magnet" + }, + { + "emoji": "🪜", + "title": "Ladder" + }, + { + "emoji": "⚗️", + "title": "Alembic" + }, + { + "emoji": "🧪", + "title": "Test Tube" + }, + { + "emoji": "🧫", + "title": "Petri Dish" + }, + { + "emoji": "🧬", + "title": "DNA" + }, + { + "emoji": "🔬", + "title": "Microscope" + }, + { + "emoji": "🔭", + "title": "Telescope" + }, + { + "emoji": "📡", + "title": "Satellite Antenna" + }, + { + "emoji": "💉", + "title": "Syringe" + }, + { + "emoji": "🩸", + "title": "Drop of Blood" + }, + { + "emoji": "💊", + "title": "Pill" + }, + { + "emoji": "🩹", + "title": "Adhesive Bandage" + }, + { + "emoji": "🩺", + "title": "Stethoscope" + }, + { + "emoji": "🚪", + "title": "Door" + }, + { + "emoji": "🪞", + "title": "Mirror" + }, + { + "emoji": "🪟", + "title": "Window" + }, + { + "emoji": "🛏️", + "title": "Bed" + }, + { + "emoji": "🛋️", + "title": "Couch and Lamp" + }, + { + "emoji": "🪑", + "title": "Chair" + }, + { + "emoji": "🚽", + "title": "Toilet" + }, + { + "emoji": "🪠", + "title": "Plunger" + }, + { + "emoji": "🚿", + "title": "Shower" + }, + { + "emoji": "🛁", + "title": "Bathtub" + }, + { + "emoji": "🪤", + "title": "Mouse Trap" + }, + { + "emoji": "🪒", + "title": "Razor" + }, + { + "emoji": "🧴", + "title": "Lotion Bottle" + }, + { + "emoji": "🧷", + "title": "Safety Pin" + }, + { + "emoji": "🧹", + "title": "Broom" + }, + { + "emoji": "🧺", + "title": "Basket" + }, + { + "emoji": "🧻", + "title": "Roll of Paper" + }, + { + "emoji": "🪣", + "title": "Bucket" + }, + { + "emoji": "🧼", + "title": "Soap" + }, + { + "emoji": "🪥", + "title": "Toothbrush" + }, + { + "emoji": "🧽", + "title": "Sponge" + }, + { + "emoji": "🧯", + "title": "Fire Extinguisher" + }, + { + "emoji": "🛒", + "title": "Shopping Cart" + }, + { + "emoji": "🚬", + "title": "Cigarette" + }, + { + "emoji": "⚰️", + "title": "Coffin" + }, + { + "emoji": "🪦", + "title": "Headstone" + }, + { + "emoji": "⚱️", + "title": "Funeral Urn" + }, + { + "emoji": "🗿", + "title": "Moai" + }, + { + "emoji": "🪧", + "title": "Placard" + }, + { + "emoji": "🚰", + "title": "Potable Water" + } + ], + 'Symbols': [ + { + "emoji": "💘", + "title": "Heart with Arrow" + }, + { + "emoji": "💝", + "title": "Heart with Ribbon" + }, + { + "emoji": "💖", + "title": "Sparkling Heart" + }, + { + "emoji": "💗", + "title": "Growing Heart" + }, + { + "emoji": "💓", + "title": "Beating Heart" + }, + { + "emoji": "💞", + "title": "Revolving Hearts" + }, + { + "emoji": "💕", + "title": "Two Hearts" + }, + { + "emoji": "💟", + "title": "Heart Decoration" + }, + { + "emoji": "❣️", + "title": "Heart Exclamation" + }, + { + "emoji": "💔", + "title": "Broken Heart" + }, + { + "emoji": "❤️‍🔥", + "title": "Heart on Fire" + }, + { + "emoji": "❤️‍🩹", + "title": "Mending Heart" + }, + { + "emoji": "❤️", + "title": "Red Heart" + }, + { + "emoji": "🧡", + "title": "Orange Heart" + }, + { + "emoji": "💛", + "title": "Yellow Heart" + }, + { + "emoji": "💚", + "title": "Green Heart" + }, + { + "emoji": "💙", + "title": "Blue Heart" + }, + { + "emoji": "💜", + "title": "Purple Heart" + }, + { + "emoji": "🤎", + "title": "Brown Heart" + }, + { + "emoji": "🖤", + "title": "Black Heart" + }, + { + "emoji": "🤍", + "title": "White Heart" + }, + { + "emoji": "💯", + "title": "Hundred Points" + }, + { + "emoji": "💢", + "title": "Anger Symbol" + }, + { + "emoji": "💬", + "title": "Speech Balloon" + }, + { + "emoji": "👁️‍🗨️", + "title": "Eye in Speech Bubble" + }, + { + "emoji": "🗨️", + "title": "Left Speech Bubble" + }, + { + "emoji": "🗯️", + "title": "Right Anger Bubble" + }, + { + "emoji": "💭", + "title": "Thought Balloon" + }, + { + "emoji": "💤", + "title": "Zzz" + }, + { + "emoji": "💮", + "title": "White Flower" + }, + { + "emoji": "♨️", + "title": "Hot Springs" + }, + { + "emoji": "💈", + "title": "Barber Pole" + }, + { + "emoji": "🛑", + "title": "Stop Sign" + }, + { + "emoji": "🕛", + "title": "Twelve O’Clock" + }, + { + "emoji": "🕧", + "title": "Twelve-Thirty" + }, + { + "emoji": "🕐", + "title": "One O’Clock" + }, + { + "emoji": "🕜", + "title": "One-Thirty" + }, + { + "emoji": "🕑", + "title": "Two O’Clock" + }, + { + "emoji": "🕝", + "title": "Two-Thirty" + }, + { + "emoji": "🕒", + "title": "Three O’Clock" + }, + { + "emoji": "🕞", + "title": "Three-Thirty" + }, + { + "emoji": "🕓", + "title": "Four O’Clock" + }, + { + "emoji": "🕟", + "title": "Four-Thirty" + }, + { + "emoji": "🕔", + "title": "Five O’Clock" + }, + { + "emoji": "🕠", + "title": "Five-Thirty" + }, + { + "emoji": "🕕", + "title": "Six O’Clock" + }, + { + "emoji": "🕡", + "title": "Six-Thirty" + }, + { + "emoji": "🕖", + "title": "Seven O’Clock" + }, + { + "emoji": "🕢", + "title": "Seven-Thirty" + }, + { + "emoji": "🕗", + "title": "Eight O’Clock" + }, + { + "emoji": "🕣", + "title": "Eight-Thirty" + }, + { + "emoji": "🕘", + "title": "Nine O’Clock" + }, + { + "emoji": "🕤", + "title": "Nine-Thirty" + }, + { + "emoji": "🕙", + "title": "Ten O’Clock" + }, + { + "emoji": "🕥", + "title": "Ten-Thirty" + }, + { + "emoji": "🕚", + "title": "Eleven O’Clock" + }, + { + "emoji": "🕦", + "title": "Eleven-Thirty" + }, + { + "emoji": "🌀", + "title": "Cyclone" + }, + { + "emoji": "♠️", + "title": "Spade Suit" + }, + { + "emoji": "♥️", + "title": "Heart Suit" + }, + { + "emoji": "♦️", + "title": "Diamond Suit" + }, + { + "emoji": "♣️", + "title": "Club Suit" + }, + { + "emoji": "🃏", + "title": "Joker" + }, + { + "emoji": "🀄", + "title": "Mahjong Red Dragon" + }, + { + "emoji": "🎴", + "title": "Flower Playing Cards" + }, + { + "emoji": "🔇", + "title": "Muted Speaker" + }, + { + "emoji": "🔈", + "title": "Speaker Low Volume" + }, + { + "emoji": "🔉", + "title": "Speaker Medium Volume" + }, + { + "emoji": "🔊", + "title": "Speaker High Volume" + }, + { + "emoji": "📢", + "title": "Loudspeaker" + }, + { + "emoji": "📣", + "title": "Megaphone" + }, + { + "emoji": "📯", + "title": "Postal Horn" + }, + { + "emoji": "🔔", + "title": "Bell" + }, + { + "emoji": "🔕", + "title": "Bell with Slash" + }, + { + "emoji": "🎵", + "title": "Musical Note" + }, + { + "emoji": "🎶", + "title": "Musical Notes" + }, + { + "emoji": "💹", + "title": "Chart Increasing with Yen" + }, + { + "emoji": "🛗", + "title": "Elevator" + }, + { + "emoji": "🏧", + "title": "ATM Sign" + }, + { + "emoji": "🚮", + "title": "Litter in Bin Sign" + }, + { + "emoji": "🚰", + "title": "Potable Water" + }, + { + "emoji": "♿", + "title": "Wheelchair Symbol" + }, + { + "emoji": "🚹", + "title": "Men’s Room" + }, + { + "emoji": "🚺", + "title": "Women’s Room" + }, + { + "emoji": "🚻", + "title": "Restroom" + }, + { + "emoji": "🚼", + "title": "Baby Symbol" + }, + { + "emoji": "🚾", + "title": "Water Closet" + }, + { + "emoji": "⚠️", + "title": "Warning" + }, + { + "emoji": "🚸", + "title": "Children Crossing" + }, + { + "emoji": "⛔", + "title": "No Entry" + }, + { + "emoji": "🚫", + "title": "Prohibited" + }, + { + "emoji": "🚳", + "title": "No Bicycles" + }, + { + "emoji": "🚭", + "title": "No Smoking" + }, + { + "emoji": "🚯", + "title": "No Littering" + }, + { + "emoji": "🚱", + "title": "Non-Potable Water" + }, + { + "emoji": "🚷", + "title": "No Pedestrians" + }, + { + "emoji": "📵", + "title": "No Mobile Phones" + }, + { + "emoji": "🔞", + "title": "No One Under Eighteen" + }, + { + "emoji": "☢️", + "title": "Radioactive" + }, + { + "emoji": "☣️", + "title": "Biohazard" + }, + { + "emoji": "⬆️", + "title": "Up Arrow" + }, + { + "emoji": "↗️", + "title": "Up-Right Arrow" + }, + { + "emoji": "➡️", + "title": "Right Arrow" + }, + { + "emoji": "↘️", + "title": "Down-Right Arrow" + }, + { + "emoji": "⬇️", + "title": "Down Arrow" + }, + { + "emoji": "↙️", + "title": "Down-Left Arrow" + }, + { + "emoji": "⬅️", + "title": "Left Arrow" + }, + { + "emoji": "↖️", + "title": "Up-Left Arrow" + }, + { + "emoji": "↕️", + "title": "Up-Down Arrow" + }, + { + "emoji": "↔️", + "title": "Left-Right Arrow" + }, + { + "emoji": "↩️", + "title": "Right Arrow Curving Left" + }, + { + "emoji": "↪️", + "title": "Left Arrow Curving Right" + }, + { + "emoji": "⤴️", + "title": "Right Arrow Curving Up" + }, + { + "emoji": "⤵️", + "title": "Right Arrow Curving Down" + }, + { + "emoji": "🔃", + "title": "Clockwise Vertical Arrows" + }, + { + "emoji": "🔄", + "title": "Counterclockwise Arrows Button" + }, + { + "emoji": "🔙", + "title": "Back Arrow" + }, + { + "emoji": "🔚", + "title": "End Arrow" + }, + { + "emoji": "🔛", + "title": "On! Arrow" + }, + { + "emoji": "🔜", + "title": "Soon Arrow" + }, + { + "emoji": "🔝", + "title": "Top Arrow" + }, + { + "emoji": "🛐", + "title": "Place of Worship" + }, + { + "emoji": "⚛️", + "title": "Atom Symbol" + }, + { + "emoji": "🕉️", + "title": "Om" + }, + { + "emoji": "✡️", + "title": "Star of David" + }, + { + "emoji": "☸️", + "title": "Wheel of Dharma" + }, + { + "emoji": "☯️", + "title": "Yin Yang" + }, + { + "emoji": "✝️", + "title": "Latin Cross" + }, + { + "emoji": "☦️", + "title": "Orthodox Cross" + }, + { + "emoji": "☪️", + "title": "Star and Crescent" + }, + { + "emoji": "☮️", + "title": "Peace Symbol" + }, + { + "emoji": "🕎", + "title": "Menorah" + }, + { + "emoji": "🔯", + "title": "Dotted Six-Pointed Star" + }, + { + "emoji": "♈", + "title": "Aries" + }, + { + "emoji": "♉", + "title": "Taurus" + }, + { + "emoji": "♊", + "title": "Gemini" + }, + { + "emoji": "♋", + "title": "Cancer" + }, + { + "emoji": "♌", + "title": "Leo" + }, + { + "emoji": "♍", + "title": "Virgo" + }, + { + "emoji": "♎", + "title": "Libra" + }, + { + "emoji": "♏", + "title": "Scorpio" + }, + { + "emoji": "♐", + "title": "Sagittarius" + }, + { + "emoji": "♑", + "title": "Capricorn" + }, + { + "emoji": "♒", + "title": "Aquarius" + }, + { + "emoji": "♓", + "title": "Pisces" + }, + { + "emoji": "⛎", + "title": "Ophiuchus" + }, + { + "emoji": "🔀", + "title": "Shuffle Tracks Button" + }, + { + "emoji": "🔁", + "title": "Repeat Button" + }, + { + "emoji": "🔂", + "title": "Repeat Single Button" + }, + { + "emoji": "▶️", + "title": "Play Button" + }, + { + "emoji": "⏩", + "title": "Fast-Forward Button" + }, + { + "emoji": "⏭️", + "title": "Next Track Button" + }, + { + "emoji": "⏯️", + "title": "Play or Pause Button" + }, + { + "emoji": "◀️", + "title": "Reverse Button" + }, + { + "emoji": "⏪", + "title": "Fast Reverse Button" + }, + { + "emoji": "⏮️", + "title": "Last Track Button" + }, + { + "emoji": "🔼", + "title": "Upwards Button" + }, + { + "emoji": "⏫", + "title": "Fast Up Button" + }, + { + "emoji": "🔽", + "title": "Downwards Button" + }, + { + "emoji": "⏬", + "title": "Fast Down Button" + }, + { + "emoji": "⏸️", + "title": "Pause Button" + }, + { + "emoji": "⏹️", + "title": "Stop Button" + }, + { + "emoji": "⏺️", + "title": "Record Button" + }, + { + "emoji": "⏏️", + "title": "Eject Button" + }, + { + "emoji": "🎦", + "title": "Cinema" + }, + { + "emoji": "🔅", + "title": "Dim Button" + }, + { + "emoji": "🔆", + "title": "Bright Button" + }, + { + "emoji": "📶", + "title": "Antenna Bars" + }, + { + "emoji": "📳", + "title": "Vibration Mode" + }, + { + "emoji": "📴", + "title": "Mobile Phone Off" + }, + { + "emoji": "♀️", + "title": "Female Sign" + }, + { + "emoji": "♂️", + "title": "Male Sign" + }, + { + "emoji": "✖️", + "title": "Multiply" + }, + { + "emoji": "➕", + "title": "Plus" + }, + { + "emoji": "➖", + "title": "Minus" + }, + { + "emoji": "➗", + "title": "Divide" + }, + { + "emoji": "♾️", + "title": "Infinity" + }, + { + "emoji": "‼️", + "title": "‼ Double Exclamation Mark" + }, + { + "emoji": "⁉️", + "title": "⁉ Exclamation Question Mark" + }, + { + "emoji": "❓", + "title": "Red Question Mark" + }, + { + "emoji": "❔", + "title": "White Question Mark" + }, + { + "emoji": "❕", + "title": "White Exclamation Mark" + }, + { + "emoji": "❗", + "title": "Red Exclamation Mark" + }, + { + "emoji": "〰️", + "title": "〰 Wavy Dash" + }, + { + "emoji": "💱", + "title": "Currency Exchange" + }, + { + "emoji": "💲", + "title": "Heavy Dollar Sign" + }, + { + "emoji": "⚕️", + "title": "Medical Symbol" + }, + { + "emoji": "♻️", + "title": "Recycling Symbol" + }, + { + "emoji": "⚜️", + "title": "Fleur-de-lis" + }, + { + "emoji": "🔱", + "title": "Trident Emblem" + }, + { + "emoji": "📛", + "title": "Name Badge" + }, + { + "emoji": "🔰", + "title": "Japanese Symbol for Beginner" + }, + { + "emoji": "⭕", + "title": "Hollow Red Circle" + }, + { + "emoji": "✅", + "title": "Check Mark Button" + }, + { + "emoji": "☑️", + "title": "Check Box with Check" + }, + { + "emoji": "✔️", + "title": "Check Mark" + }, + { + "emoji": "❌", + "title": "Cross Mark" + }, + { + "emoji": "❎", + "title": "Cross Mark Button" + }, + { + "emoji": "➰", + "title": "Curly Loop" + }, + { + "emoji": "➿", + "title": "Double Curly Loop" + }, + { + "emoji": "〽️", + "title": "〽 Part Alternation Mark" + }, + { + "emoji": "✳️", + "title": "Eight-Spoked Asterisk" + }, + { + "emoji": "✴️", + "title": "Eight-Pointed Star" + }, + { + "emoji": "❇️", + "title": "Sparkle" + }, + { + "emoji": "©️", + "title": "Copyright" + }, + { + "emoji": "®️", + "title": "Registered" + }, + { + "emoji": "™️", + "title": "Trade Mark" + }, + { + "emoji": "#️⃣", + "title": "# Keycap Number Sign" + }, + { + "emoji": "*️⃣", + "title": "* Keycap Asterisk" + }, + { + "emoji": "0️⃣", + "title": "0 Keycap Digit Zero" + }, + { + "emoji": "1️⃣", + "title": "1 Keycap Digit One" + }, + { + "emoji": "2️⃣", + "title": "2 Keycap Digit Two" + }, + { + "emoji": "3️⃣", + "title": "3 Keycap Digit Three" + }, + { + "emoji": "4️⃣", + "title": "4 Keycap Digit Four" + }, + { + "emoji": "5️⃣", + "title": "5 Keycap Digit Five" + }, + { + "emoji": "6️⃣", + "title": "6 Keycap Digit Six" + }, + { + "emoji": "7️⃣", + "title": "7 Keycap Digit Seven" + }, + { + "emoji": "8️⃣", + "title": "8 Keycap Digit Eight" + }, + { + "emoji": "9️⃣", + "title": "9 Keycap Digit Nine" + }, + { + "emoji": "🔟", + "title": "Keycap: 10" + }, + { + "emoji": "🔠", + "title": "Input Latin Uppercase" + }, + { + "emoji": "🔡", + "title": "Input Latin Lowercase" + }, + { + "emoji": "🔢", + "title": "Input Numbers" + }, + { + "emoji": "🔣", + "title": "Input Symbols" + }, + { + "emoji": "🔤", + "title": "Input Latin Letters" + }, + { + "emoji": "🅰️", + "title": "A Button (Blood Type)" + }, + { + "emoji": "🆎", + "title": "AB Button (Blood Type)" + }, + { + "emoji": "🅱️", + "title": "B Button (Blood Type)" + }, + { + "emoji": "🆑", + "title": "CL Button" + }, + { + "emoji": "🆒", + "title": "Cool Button" + }, + { + "emoji": "🆓", + "title": "Free Button" + }, + { + "emoji": "ℹ️", + "title": "ℹ Information" + }, + { + "emoji": "🆔", + "title": "ID Button" + }, + { + "emoji": "Ⓜ️", + "title": "Circled M" + }, + { + "emoji": "🆕", + "title": "New Button" + }, + { + "emoji": "🆖", + "title": "NG Button" + }, + { + "emoji": "🅾️", + "title": "O Button (Blood Type)" + }, + { + "emoji": "🆗", + "title": "OK Button" + }, + { + "emoji": "🅿️", + "title": "P Button" + }, + { + "emoji": "🆘", + "title": "SOS Button" + }, + { + "emoji": "🆙", + "title": "Up! Button" + }, + { + "emoji": "🆚", + "title": "Vs Button" + }, + { + "emoji": "🈁", + "title": "Japanese “Here” Button" + }, + { + "emoji": "🈂️", + "title": "Japanese “Service Charge” Button" + }, + { + "emoji": "🈷️", + "title": "Japanese “Monthly Amount” Button" + }, + { + "emoji": "🈶", + "title": "Japanese “Not Free of Charge” Button" + }, + { + "emoji": "🈯", + "title": "Japanese “Reserved” Button" + }, + { + "emoji": "🉐", + "title": "Japanese “Bargain” Button" + }, + { + "emoji": "🈹", + "title": "Japanese “Discount” Button" + }, + { + "emoji": "🈚", + "title": "Japanese “Free of Charge” Button" + }, + { + "emoji": "🈲", + "title": "Japanese “Prohibited” Button" + }, + { + "emoji": "🉑", + "title": "Japanese “Acceptable” Button" + }, + { + "emoji": "🈸", + "title": "Japanese “Application” Button" + }, + { + "emoji": "🈴", + "title": "Japanese “Passing Grade” Button" + }, + { + "emoji": "🈳", + "title": "Japanese “Vacancy” Button" + }, + { + "emoji": "㊗️", + "title": "Japanese “Congratulations” Button" + }, + { + "emoji": "㊙️", + "title": "Japanese “Secret” Button" + }, + { + "emoji": "🈺", + "title": "Japanese “Open for Business” Button" + }, + { + "emoji": "🈵", + "title": "Japanese “No Vacancy” Button" + }, + { + "emoji": "🔴", + "title": "Red Circle" + }, + { + "emoji": "🟠", + "title": "Orange Circle" + }, + { + "emoji": "🟡", + "title": "Yellow Circle" + }, + { + "emoji": "🟢", + "title": "Green Circle" + }, + { + "emoji": "🔵", + "title": "Blue Circle" + }, + { + "emoji": "🟣", + "title": "Purple Circle" + }, + { + "emoji": "🟤", + "title": "Brown Circle" + }, + { + "emoji": "⚫", + "title": "Black Circle" + }, + { + "emoji": "⚪", + "title": "White Circle" + }, + { + "emoji": "🟥", + "title": "Red Square" + }, + { + "emoji": "🟧", + "title": "Orange Square" + }, + { + "emoji": "🟨", + "title": "Yellow Square" + }, + { + "emoji": "🟩", + "title": "Green Square" + }, + { + "emoji": "🟦", + "title": "Blue Square" + }, + { + "emoji": "🟪", + "title": "Purple Square" + }, + { + "emoji": "🟫", + "title": "Brown Square" + }, + { + "emoji": "⬛", + "title": "Black Large Square" + }, + { + "emoji": "⬜", + "title": "White Large Square" + }, + { + "emoji": "◼️", + "title": "Black Medium Square" + }, + { + "emoji": "◻️", + "title": "White Medium Square" + }, + { + "emoji": "◾", + "title": "Black Medium-Small Square" + }, + { + "emoji": "◽", + "title": "White Medium-Small Square" + }, + { + "emoji": "▪️", + "title": "Black Small Square" + }, + { + "emoji": "▫️", + "title": "White Small Square" + }, + { + "emoji": "🔶", + "title": "Large Orange Diamond" + }, + { + "emoji": "🔷", + "title": "Large Blue Diamond" + }, + { + "emoji": "🔸", + "title": "Small Orange Diamond" + }, + { + "emoji": "🔹", + "title": "Small Blue Diamond" + }, + { + "emoji": "🔺", + "title": "Red Triangle Pointed Up" + }, + { + "emoji": "🔻", + "title": "Red Triangle Pointed Down" + }, + { + "emoji": "💠", + "title": "Diamond with a Dot" + }, + { + "emoji": "🔘", + "title": "Radio Button" + }, + { + "emoji": "🔳", + "title": "White Square Button" + }, + { + "emoji": "🔲", + "title": "Black Square Button" + } + ], + 'Flags': [ + { + "emoji": "🏁", + "title": "Chequered Flag" + }, + { + "emoji": "🚩", + "title": "Triangular Flag" + }, + { + "emoji": "🎌", + "title": "Crossed Flags" + }, + { + "emoji": "🏴", + "title": "Black Flag" + }, + { + "emoji": "🏳️", + "title": "White Flag" + }, + { + "emoji": "🏳️‍🌈", + "title": "Rainbow Flag" + }, + { + "emoji": "🏳️‍⚧️", + "title": "Transgender Flag" + }, + { + "emoji": "🏴‍☠️", + "title": "Pirate Flag" + }, + { + "emoji": "🇦🇨", + "title": "Flag: Ascension Island" + }, + { + "emoji": "🇦🇩", + "title": "Flag: Andorra" + }, + { + "emoji": "🇦🇪", + "title": "Flag: United Arab Emirates" + }, + { + "emoji": "🇦🇫", + "title": "Flag: Afghanistan" + }, + { + "emoji": "🇦🇬", + "title": "Flag: Antigua & Barbuda" + }, + { + "emoji": "🇦🇮", + "title": "Flag: Anguilla" + }, + { + "emoji": "🇦🇱", + "title": "Flag: Albania" + }, + { + "emoji": "🇦🇲", + "title": "Flag: Armenia" + }, + { + "emoji": "🇦🇴", + "title": "Flag: Angola" + }, + { + "emoji": "🇦🇶", + "title": "Flag: Antarctica" + }, + { + "emoji": "🇦🇷", + "title": "Flag: Argentina" + }, + { + "emoji": "🇦🇸", + "title": "Flag: American Samoa" + }, + { + "emoji": "🇦🇹", + "title": "Flag: Austria" + }, + { + "emoji": "🇦🇺", + "title": "Flag: Australia" + }, + { + "emoji": "🇦🇼", + "title": "Flag: Aruba" + }, + { + "emoji": "🇦🇽", + "title": "Flag: Åland Islands" + }, + { + "emoji": "🇦🇿", + "title": "Flag: Azerbaijan" + }, + { + "emoji": "🇧🇦", + "title": "Flag: Bosnia & Herzegovina" + }, + { + "emoji": "🇧🇧", + "title": "Flag: Barbados" + }, + { + "emoji": "🇧🇩", + "title": "Flag: Bangladesh" + }, + { + "emoji": "🇧🇪", + "title": "Flag: Belgium" + }, + { + "emoji": "🇧🇫", + "title": "Flag: Burkina Faso" + }, + { + "emoji": "🇧🇬", + "title": "Flag: Bulgaria" + }, + { + "emoji": "🇧🇭", + "title": "Flag: Bahrain" + }, + { + "emoji": "🇧🇮", + "title": "Flag: Burundi" + }, + { + "emoji": "🇧🇯", + "title": "Flag: Benin" + }, + { + "emoji": "🇧🇱", + "title": "Flag: St. Barthélemy" + }, + { + "emoji": "🇧🇲", + "title": "Flag: Bermuda" + }, + { + "emoji": "🇧🇳", + "title": "Flag: Brunei" + }, + { + "emoji": "🇧🇴", + "title": "Flag: Bolivia" + }, + { + "emoji": "🇧🇶", + "title": "Flag: Caribbean Netherlands" + }, + { + "emoji": "🇧🇷", + "title": "Flag: Brazil" + }, + { + "emoji": "🇧🇸", + "title": "Flag: Bahamas" + }, + { + "emoji": "🇧🇹", + "title": "Flag: Bhutan" + }, + { + "emoji": "🇧🇻", + "title": "Flag: Bouvet Island" + }, + { + "emoji": "🇧🇼", + "title": "Flag: Botswana" + }, + { + "emoji": "🇧🇾", + "title": "Flag: Belarus" + }, + { + "emoji": "🇧🇿", + "title": "Flag: Belize" + }, + { + "emoji": "🇨🇦", + "title": "Flag: Canada" + }, + { + "emoji": "🇨🇨", + "title": "Flag: Cocos (Keeling) Islands" + }, + { + "emoji": "🇨🇩", + "title": "Flag: Congo - Kinshasa" + }, + { + "emoji": "🇨🇫", + "title": "Flag: Central African Republic" + }, + { + "emoji": "🇨🇬", + "title": "Flag: Congo - Brazzaville" + }, + { + "emoji": "🇨🇭", + "title": "Flag: Switzerland" + }, + { + "emoji": "🇨🇮", + "title": "Flag: Côte d’Ivoire" + }, + { + "emoji": "🇨🇰", + "title": "Flag: Cook Islands" + }, + { + "emoji": "🇨🇱", + "title": "Flag: Chile" + }, + { + "emoji": "🇨🇲", + "title": "Flag: Cameroon" + }, + { + "emoji": "🇨🇳", + "title": "Flag: China" + }, + { + "emoji": "🇨🇴", + "title": "Flag: Colombia" + }, + { + "emoji": "🇨🇵", + "title": "Flag: Clipperton Island" + }, + { + "emoji": "🇨🇷", + "title": "Flag: Costa Rica" + }, + { + "emoji": "🇨🇺", + "title": "Flag: Cuba" + }, + { + "emoji": "🇨🇻", + "title": "Flag: Cape Verde" + }, + { + "emoji": "🇨🇼", + "title": "Flag: Curaçao" + }, + { + "emoji": "🇨🇽", + "title": "Flag: Christmas Island" + }, + { + "emoji": "🇨🇾", + "title": "Flag: Cyprus" + }, + { + "emoji": "🇨🇿", + "title": "Flag: Czechia" + }, + { + "emoji": "🇩🇪", + "title": "Flag: Germany" + }, + { + "emoji": "🇩🇬", + "title": "Flag: Diego Garcia" + }, + { + "emoji": "🇩🇯", + "title": "Flag: Djibouti" + }, + { + "emoji": "🇩🇰", + "title": "Flag: Denmark" + }, + { + "emoji": "🇩🇲", + "title": "Flag: Dominica" + }, + { + "emoji": "🇩🇴", + "title": "Flag: Dominican Republic" + }, + { + "emoji": "🇩🇿", + "title": "Flag: Algeria" + }, + { + "emoji": "🇪🇦", + "title": "Flag: Ceuta & Melilla" + }, + { + "emoji": "🇪🇨", + "title": "Flag: Ecuador" + }, + { + "emoji": "🇪🇪", + "title": "Flag: Estonia" + }, + { + "emoji": "🇪🇬", + "title": "Flag: Egypt" + }, + { + "emoji": "🇪🇭", + "title": "Flag: Western Sahara" + }, + { + "emoji": "🇪🇷", + "title": "Flag: Eritrea" + }, + { + "emoji": "🇪🇸", + "title": "Flag: Spain" + }, + { + "emoji": "🇪🇹", + "title": "Flag: Ethiopia" + }, + { + "emoji": "🇪🇺", + "title": "Flag: European Union" + }, + { + "emoji": "🇫🇮", + "title": "Flag: Finland" + }, + { + "emoji": "🇫🇯", + "title": "Flag: Fiji" + }, + { + "emoji": "🇫🇰", + "title": "Flag: Falkland Islands" + }, + { + "emoji": "🇫🇲", + "title": "Flag: Micronesia" + }, + { + "emoji": "🇫🇴", + "title": "Flag: Faroe Islands" + }, + { + "emoji": "🇫🇷", + "title": "Flag: France" + }, + { + "emoji": "🇬🇦", + "title": "Flag: Gabon" + }, + { + "emoji": "🇬🇧", + "title": "Flag: United Kingdom" + }, + { + "emoji": "🇬🇩", + "title": "Flag: Grenada" + }, + { + "emoji": "🇬🇪", + "title": "Flag: Georgia" + }, + { + "emoji": "🇬🇫", + "title": "Flag: French Guiana" + }, + { + "emoji": "🇬🇬", + "title": "Flag: Guernsey" + }, + { + "emoji": "🇬🇭", + "title": "Flag: Ghana" + }, + { + "emoji": "🇬🇮", + "title": "Flag: Gibraltar" + }, + { + "emoji": "🇬🇱", + "title": "Flag: Greenland" + }, + { + "emoji": "🇬🇲", + "title": "Flag: Gambia" + }, + { + "emoji": "🇬🇳", + "title": "Flag: Guinea" + }, + { + "emoji": "🇬🇵", + "title": "Flag: Guadeloupe" + }, + { + "emoji": "🇬🇶", + "title": "Flag: Equatorial Guinea" + }, + { + "emoji": "🇬🇷", + "title": "Flag: Greece" + }, + { + "emoji": "🇬🇸", + "title": "Flag: South Georgia & South Sandwich Islands" + }, + { + "emoji": "🇬🇹", + "title": "Flag: Guatemala" + }, + { + "emoji": "🇬🇺", + "title": "Flag: Guam" + }, + { + "emoji": "🇬🇼", + "title": "Flag: Guinea-Bissau" + }, + { + "emoji": "🇬🇾", + "title": "Flag: Guyana" + }, + { + "emoji": "🇭🇰", + "title": "Flag: Hong Kong SAR China" + }, + { + "emoji": "🇭🇲", + "title": "Flag: Heard & McDonald Islands" + }, + { + "emoji": "🇭🇳", + "title": "Flag: Honduras" + }, + { + "emoji": "🇭🇷", + "title": "Flag: Croatia" + }, + { + "emoji": "🇭🇹", + "title": "Flag: Haiti" + }, + { + "emoji": "🇭🇺", + "title": "Flag: Hungary" + }, + { + "emoji": "🇮🇨", + "title": "Flag: Canary Islands" + }, + { + "emoji": "🇮🇩", + "title": "Flag: Indonesia" + }, + { + "emoji": "🇮🇪", + "title": "Flag: Ireland" + }, + { + "emoji": "🇮🇱", + "title": "Flag: Israel" + }, + { + "emoji": "🇮🇲", + "title": "Flag: Isle of Man" + }, + { + "emoji": "🇮🇳", + "title": "Flag: India" + }, + { + "emoji": "🇮🇴", + "title": "Flag: British Indian Ocean Territory" + }, + { + "emoji": "🇮🇶", + "title": "Flag: Iraq" + }, + { + "emoji": "🇮🇷", + "title": "Flag: Iran" + }, + { + "emoji": "🇮🇸", + "title": "Flag: Iceland" + }, + { + "emoji": "🇮🇹", + "title": "Flag: Italy" + }, + { + "emoji": "🇯🇪", + "title": "Flag: Jersey" + }, + { + "emoji": "🇯🇲", + "title": "Flag: Jamaica" + }, + { + "emoji": "🇯🇴", + "title": "Flag: Jordan" + }, + { + "emoji": "🇯🇵", + "title": "Flag: Japan" + }, + { + "emoji": "🇰🇪", + "title": "Flag: Kenya" + }, + { + "emoji": "🇰🇬", + "title": "Flag: Kyrgyzstan" + }, + { + "emoji": "🇰🇭", + "title": "Flag: Cambodia" + }, + { + "emoji": "🇰🇮", + "title": "Flag: Kiribati" + }, + { + "emoji": "🇰🇲", + "title": "Flag: Comoros" + }, + { + "emoji": "🇰🇳", + "title": "Flag: St. Kitts & Nevis" + }, + { + "emoji": "🇰🇵", + "title": "Flag: North Korea" + }, + { + "emoji": "🇰🇷", + "title": "Flag: South Korea" + }, + { + "emoji": "🇰🇼", + "title": "Flag: Kuwait" + }, + { + "emoji": "🇰🇾", + "title": "Flag: Cayman Islands" + }, + { + "emoji": "🇰🇿", + "title": "Flag: Kazakhstan" + }, + { + "emoji": "🇱🇦", + "title": "Flag: Laos" + }, + { + "emoji": "🇱🇧", + "title": "Flag: Lebanon" + }, + { + "emoji": "🇱🇨", + "title": "Flag: St. Lucia" + }, + { + "emoji": "🇱🇮", + "title": "Flag: Liechtenstein" + }, + { + "emoji": "🇱🇰", + "title": "Flag: Sri Lanka" + }, + { + "emoji": "🇱🇷", + "title": "Flag: Liberia" + }, + { + "emoji": "🇱🇸", + "title": "Flag: Lesotho" + }, + { + "emoji": "🇱🇹", + "title": "Flag: Lithuania" + }, + { + "emoji": "🇱🇺", + "title": "Flag: Luxembourg" + }, + { + "emoji": "🇱🇻", + "title": "Flag: Latvia" + }, + { + "emoji": "🇱🇾", + "title": "Flag: Libya" + }, + { + "emoji": "🇲🇦", + "title": "Flag: Morocco" + }, + { + "emoji": "🇲🇨", + "title": "Flag: Monaco" + }, + { + "emoji": "🇲🇩", + "title": "Flag: Moldova" + }, + { + "emoji": "🇲🇪", + "title": "Flag: Montenegro" + }, + { + "emoji": "🇲🇫", + "title": "Flag: St. Martin" + }, + { + "emoji": "🇲🇬", + "title": "Flag: Madagascar" + }, + { + "emoji": "🇲🇭", + "title": "Flag: Marshall Islands" + }, + { + "emoji": "🇲🇰", + "title": "Flag: North Macedonia" + }, + { + "emoji": "🇲🇱", + "title": "Flag: Mali" + }, + { + "emoji": "🇲🇲", + "title": "Flag: Myanmar (Burma)" + }, + { + "emoji": "🇲🇳", + "title": "Flag: Mongolia" + }, + { + "emoji": "🇲🇴", + "title": "Flag: Macao Sar China" + }, + { + "emoji": "🇲🇵", + "title": "Flag: Northern Mariana Islands" + }, + { + "emoji": "🇲🇶", + "title": "Flag: Martinique" + }, + { + "emoji": "🇲🇷", + "title": "Flag: Mauritania" + }, + { + "emoji": "🇲🇸", + "title": "Flag: Montserrat" + }, + { + "emoji": "🇲🇹", + "title": "Flag: Malta" + }, + { + "emoji": "🇲🇺", + "title": "Flag: Mauritius" + }, + { + "emoji": "🇲🇻", + "title": "Flag: Maldives" + }, + { + "emoji": "🇲🇼", + "title": "Flag: Malawi" + }, + { + "emoji": "🇲🇽", + "title": "Flag: Mexico" + }, + { + "emoji": "🇲🇾", + "title": "Flag: Malaysia" + }, + { + "emoji": "🇲🇿", + "title": "Flag: Mozambique" + }, + { + "emoji": "🇳🇦", + "title": "Flag: Namibia" + }, + { + "emoji": "🇳🇨", + "title": "Flag: New Caledonia" + }, + { + "emoji": "🇳🇪", + "title": "Flag: Niger" + }, + { + "emoji": "🇳🇫", + "title": "Flag: Norfolk Island" + }, + { + "emoji": "🇳🇬", + "title": "Flag: Nigeria" + }, + { + "emoji": "🇳🇮", + "title": "Flag: Nicaragua" + }, + { + "emoji": "🇳🇱", + "title": "Flag: Netherlands" + }, + { + "emoji": "🇳🇴", + "title": "Flag: Norway" + }, + { + "emoji": "🇳🇵", + "title": "Flag: Nepal" + }, + { + "emoji": "🇳🇷", + "title": "Flag: Nauru" + }, + { + "emoji": "🇳🇺", + "title": "Flag: Niue" + }, + { + "emoji": "🇳🇿", + "title": "Flag: New Zealand" + }, + { + "emoji": "🇴🇲", + "title": "Flag: Oman" + }, + { + "emoji": "🇵🇦", + "title": "Flag: Panama" + }, + { + "emoji": "🇵🇪", + "title": "Flag: Peru" + }, + { + "emoji": "🇵🇫", + "title": "Flag: French Polynesia" + }, + { + "emoji": "🇵🇬", + "title": "Flag: Papua New Guinea" + }, + { + "emoji": "🇵🇭", + "title": "Flag: Philippines" + }, + { + "emoji": "🇵🇰", + "title": "Flag: Pakistan" + }, + { + "emoji": "🇵🇱", + "title": "Flag: Poland" + }, + { + "emoji": "🇵🇲", + "title": "Flag: St. Pierre & Miquelon" + }, + { + "emoji": "🇵🇳", + "title": "Flag: Pitcairn Islands" + }, + { + "emoji": "🇵🇷", + "title": "Flag: Puerto Rico" + }, + { + "emoji": "🇵🇸", + "title": "Flag: Palestinian Territories" + }, + { + "emoji": "🇵🇹", + "title": "Flag: Portugal" + }, + { + "emoji": "🇵🇼", + "title": "Flag: Palau" + }, + { + "emoji": "🇵🇾", + "title": "Flag: Paraguay" + }, + { + "emoji": "🇶🇦", + "title": "Flag: Qatar" + }, + { + "emoji": "🇷🇪", + "title": "Flag: Réunion" + }, + { + "emoji": "🇷🇴", + "title": "Flag: Romania" + }, + { + "emoji": "🇷🇸", + "title": "Flag: Serbia" + }, + { + "emoji": "🇷🇺", + "title": "Flag: Russia" + }, + { + "emoji": "🇷🇼", + "title": "Flag: Rwanda" + }, + { + "emoji": "🇸🇦", + "title": "Flag: Saudi Arabia" + }, + { + "emoji": "🇸🇧", + "title": "Flag: Solomon Islands" + }, + { + "emoji": "🇸🇨", + "title": "Flag: Seychelles" + }, + { + "emoji": "🇸🇩", + "title": "Flag: Sudan" + }, + { + "emoji": "🇸🇪", + "title": "Flag: Sweden" + }, + { + "emoji": "🇸🇬", + "title": "Flag: Singapore" + }, + { + "emoji": "🇸🇭", + "title": "Flag: St. Helena" + }, + { + "emoji": "🇸🇮", + "title": "Flag: Slovenia" + }, + { + "emoji": "🇸🇯", + "title": "Flag: Svalbard & Jan Mayen" + }, + { + "emoji": "🇸🇰", + "title": "Flag: Slovakia" + }, + { + "emoji": "🇸🇱", + "title": "Flag: Sierra Leone" + }, + { + "emoji": "🇸🇲", + "title": "Flag: San Marino" + }, + { + "emoji": "🇸🇳", + "title": "Flag: Senegal" + }, + { + "emoji": "🇸🇴", + "title": "Flag: Somalia" + }, + { + "emoji": "🇸🇷", + "title": "Flag: Suriname" + }, + { + "emoji": "🇸🇸", + "title": "Flag: South Sudan" + }, + { + "emoji": "🇸🇹", + "title": "Flag: São Tomé & Príncipe" + }, + { + "emoji": "🇸🇻", + "title": "Flag: El Salvador" + }, + { + "emoji": "🇸🇽", + "title": "Flag: Sint Maarten" + }, + { + "emoji": "🇸🇾", + "title": "Flag: Syria" + }, + { + "emoji": "🇸🇿", + "title": "Flag: Eswatini" + }, + { + "emoji": "🇹🇦", + "title": "Flag: Tristan Da Cunha" + }, + { + "emoji": "🇹🇨", + "title": "Flag: Turks & Caicos Islands" + }, + { + "emoji": "🇹🇩", + "title": "Flag: Chad" + }, + { + "emoji": "🇹🇫", + "title": "Flag: French Southern Territories" + }, + { + "emoji": "🇹🇬", + "title": "Flag: Togo" + }, + { + "emoji": "🇹🇭", + "title": "Flag: Thailand" + }, + { + "emoji": "🇹🇯", + "title": "Flag: Tajikistan" + }, + { + "emoji": "🇹🇰", + "title": "Flag: Tokelau" + }, + { + "emoji": "🇹🇱", + "title": "Flag: Timor-Leste" + }, + { + "emoji": "🇹🇲", + "title": "Flag: Turkmenistan" + }, + { + "emoji": "🇹🇳", + "title": "Flag: Tunisia" + }, + { + "emoji": "🇹🇴", + "title": "Flag: Tonga" + }, + { + "emoji": "🇹🇷", + "title": "Flag: Turkey" + }, + { + "emoji": "🇹🇹", + "title": "Flag: Trinidad & Tobago" + }, + { + "emoji": "🇹🇻", + "title": "Flag: Tuvalu" + }, + { + "emoji": "🇹🇼", + "title": "Flag: Taiwan" + }, + { + "emoji": "🇹🇿", + "title": "Flag: Tanzania" + }, + { + "emoji": "🇺🇦", + "title": "Flag: Ukraine" + }, + { + "emoji": "🇺🇬", + "title": "Flag: Uganda" + }, + { + "emoji": "🇺🇲", + "title": "Flag: U.S. Outlying Islands" + }, + { + "emoji": "🇺🇳", + "title": "Flag: United Nations" + }, + { + "emoji": "🇺🇸", + "title": "Flag: United States" + }, + { + "emoji": "🇺🇾", + "title": "Flag: Uruguay" + }, + { + "emoji": "🇺🇿", + "title": "Flag: Uzbekistan" + }, + { + "emoji": "🇻🇦", + "title": "Flag: Vatican City" + }, + { + "emoji": "🇻🇨", + "title": "Flag: St. Vincent & Grenadines" + }, + { + "emoji": "🇻🇪", + "title": "Flag: Venezuela" + }, + { + "emoji": "🇻🇬", + "title": "Flag: British Virgin Islands" + }, + { + "emoji": "🇻🇮", + "title": "Flag: U.S. Virgin Islands" + }, + { + "emoji": "🇻🇳", + "title": "Flag: Vietnam" + }, + { + "emoji": "🇻🇺", + "title": "Flag: Vanuatu" + }, + { + "emoji": "🇼🇫", + "title": "Flag: Wallis & Futuna" + }, + { + "emoji": "🇼🇸", + "title": "Flag: Samoa" + }, + { + "emoji": "🇽🇰", + "title": "Flag: Kosovo" + }, + { + "emoji": "🇾🇪", + "title": "Flag: Yemen" + }, + { + "emoji": "🇾🇹", + "title": "Flag: Mayotte" + }, + { + "emoji": "🇿🇦", + "title": "Flag: South Africa" + }, + { + "emoji": "🇿🇲", + "title": "Flag: Zambia" + }, + { + "emoji": "🇿🇼", + "title": "Flag: Zimbabwe" + }, + { + "emoji": "🏴󠁧󠁢󠁥󠁮󠁧󠁿", + "title": "Flag: England" + }, + { + "emoji": "🏴󠁧󠁢󠁳󠁣󠁴󠁿", + "title": "Flag: Scotland" + }, + { + "emoji": "🏴󠁧󠁢󠁷󠁬󠁳󠁿", + "title": "Flag: Wales" + }, + { + "emoji": "🏴󠁵󠁳󠁴󠁸󠁿", + "title": "Flag for Texas (US-TX)" + } + ] + }; + + const categoryFlags = { + 'People': ' ', + 'Nature': ' ', + 'Food-dring': ' ', + 'Activity': '', + 'Travel-places': ' ', + 'Objects': ' ', + 'Symbols': ' ', + 'Flags': '' + }; + + const icons = { + search: ' ', + close: '', + move: ' ' + } + + + + + const functions = { + + styles: () => { + + const styles = ` + + `; + + document.head.insertAdjacentHTML('beforeend', styles); + }, + + + position: () => { + + const e = window.event; + const clickPosX = e.clientX; + const clickPosY = e.clientY; + const obj = {}; + + obj.left = clickPosX; + obj.top = clickPosY; + + return obj; + + }, + + + rePositioning: (picker) => { + picker.getBoundingClientRect().right > window.screen.availWidth ? picker.style.left = window.screen.availWidth - picker.offsetWidth + 'px' : false; + + if (window.innerHeight > pickerHeight) { + picker.getBoundingClientRect().bottom > window.innerHeight ? picker.style.top = window.innerHeight - picker.offsetHeight + 'px' : false; + } + }, + + + render: (e, attr) => { + // attr is empty in friendica, no idea why.. + if (!attr) attr='.emojis' + emojiList = undefined; + const index = this.options.trigger.findIndex(item => item.selector === attr); + this.insertInto = this.options.trigger[index].insertInto; + + const position = functions.position(); + + if (!emojiesHTML.length) { + + for (const key in emojiObj) { + if (emojiObj.hasOwnProperty.call(emojiObj, key)) { + const categoryObj = emojiObj[key]; + + + categoriesHTML += `
  • + ${categoryFlags[key]} +
  • `; + + emojiesHTML += `
    `; + emojiesHTML += `

    ${key}

    `; + categoryObj.forEach(ej => { + emojiesHTML += `
  • + ${ej.emoji} +
  • `; + }); + emojiesHTML += '
    '; + } + } + } + + + if (document.querySelector('.fg-emoji-container')) { + this.lib('.fg-emoji-container').remove(); + } + + + const picker = ` +
    + + + + +
    + + +
      + ${emojiesHTML} +
    +
    +
    + `; + + document.body.insertAdjacentHTML('beforeend', picker); + + functions.rePositioning(document.querySelector('.fg-emoji-container')); + + setTimeout(() => { + document.querySelector('.fg-emoji-picker-search input').focus(); + }, 500) + }, + + + closePicker: (e) => { + + e.preventDefault(); + + this.lib('.fg-emoji-container').remove(); + + moseMove = false; + }, + + + checkPickerExist(e) { + + if (document.querySelector('.fg-emoji-container') && !e.target.closest('.fg-emoji-container') && !moseMove) { + + functions.closePicker.call(this, e); + } + }, + + + setCaretPosition: (field, caretPos) => { + var elem = field + if (elem != null) { + if (elem.createTextRange) { + var range = elem.createTextRange(); + range.move('character', caretPos); + range.select(); + } else { + if (elem.selectionStart) { + elem.focus(); + elem.setSelectionRange(caretPos, caretPos); + } else { + elem.focus(); + } + } + } + }, + + + insert: e => { + + e.preventDefault(); + + const emoji = e.target.innerText.trim(); + const myField = document.querySelectorAll(this.insertInto); + const myValue = emoji; + + // Check if selector is an array + myField.forEach(myField => { + + if (document.selection) { + myField.focus(); + sel = document.selection.createRange(); + sel.text = myValue; + } else if (myField.selectionStart || myField.selectionStart == "0") { + const startPos = myField.selectionStart; + const endPos = myField.selectionEnd; + myField.value = myField.value.substring(0, startPos) + myValue + myField.value.substring(endPos, myField.value.length); + + functions.setCaretPosition(myField, startPos + 2) + + } else { + myField.value += myValue; + myField.focus() + } + + }) + }, + + + categoryNav: e => { + e.preventDefault(); + + const link = e.target.closest('a'); + + if (link.getAttribute('id') && link.getAttribute('id') === 'fg-emoji-picker-close-button') return false; + if (link.className.includes('fg-emoji-picker-move')) return false; + + const id = link.getAttribute('href'); + const emojiBody = document.querySelector('.fg-emoji-list'); + const destination = emojiBody.querySelector(`${id}`); + + this.lib('.fg-emoji-nav li').removeClass('emoji-picker-nav-active'); + link.closest('li').classList.add('emoji-picker-nav-active'); + + destination.scrollIntoView({behavior: "smooth", block: "start", inline: "nearest"}) + }, + + + search: e => { + + const val = e.target.value.trim(); + + if (!emojiList) { + emojiList = Array.from(document.querySelectorAll('.fg-emoji-picker-category-wrapper li')); + } + + emojiList.filter(emoji => { + if (!emoji.getAttribute('data-title').match(val)) { + emoji.style.display = 'none' + } else { + emoji.style.display = '' + } + }) + }, + + + mouseDown: e => { + e.preventDefault(); + moseMove = true; + }, + + mouseUp: e => { + e.preventDefault(); + moseMove = false; + }, + + mouseMove: e => { + + if (moseMove) { + e.preventDefault(); + const el = document.querySelector('.fg-emoji-container'); + el.style.left = e.clientX - 320 + 'px'; + el.style.top = e.clientY - 10 + 'px'; + } + } + }; + + + + const bindEvents = () => { + + this.lib(document.body).on('click', functions.closePicker, '#fg-emoji-picker-close-button'); + this.lib(document.body).on('click', functions.checkPickerExist); + this.lib(document.body).on('click', functions.render, this.trigger); + this.lib(document.body).on('click', functions.insert, '.fg-emoji-list a'); + this.lib(document.body).on('click', functions.categoryNav, '.fg-emoji-nav a'); + this.lib(document.body).on('input', functions.search, '.fg-emoji-picker-search input'); + this.lib(document).on('mousedown', functions.mouseDown, '#fg-emoji-picker-move'); + this.lib(document).on('mouseup', functions.mouseUp, '#fg-emoji-picker-move'); + this.lib(document).on('mousemove', functions.mouseMove); + }; + + + + (() => { + + // Start styles + functions.styles(); + + // Event functions + bindEvents.call(this); + + })() +} \ No newline at end of file diff --git a/view/js/vanillaEmojiPicker/vanillaEmojiPicker.min.js b/view/js/vanillaEmojiPicker/vanillaEmojiPicker.min.js new file mode 100644 index 000000000..1bd4eb30a --- /dev/null +++ b/view/js/vanillaEmojiPicker/vanillaEmojiPicker.min.js @@ -0,0 +1,202 @@ +const EmojiPicker=function(e){this.options=e,this.trigger=this.options.trigger.map(e=>e.selector),this.insertInto=void 0;let i="",t="",o,l=!1,a=this.options.closeButton?370:350;this.lib=function(e){let i=e=>{var i=Object.prototype.toString.call(e);return"object"==typeof e&&/^\[object (HTMLCollection|NodeList|Object)\]$/.test(i)&&"number"==typeof e.length&&(0===e.length||"object"==typeof e[0]&&e[0].nodeType>0)};return{el(){if(e)return e.nodeName?[e]:i(e)?Array.from(e):"string"==typeof e||"STRING"==typeof e?Array.from(document.querySelectorAll(e)):void 0},on(e,i,t){t?this.el().forEach(o=>{o.addEventListener(e,e=>{if(e.target.closest(t)){let o;if(Array.isArray(t)){let l=e.target.outerHTML,a=t.findIndex(e=>l.includes(e.slice(1)));o=t[a]}i(e,o)}})}):this.el().forEach(t=>{t.addEventListener(e,i.bind(t))})},css(e){for(let i in e)if(Object.hasOwnProperty.call(e,i)){let t=e[i];this.el().forEach(e=>e.style[i]=t)}},attr(e,i){if(!i)return this.el()[0].getAttribute(e);this.el().forEach(t=>t.setAttribute(e,i))},removeAttr(e){this.el().forEach(i=>i.removeAttribute(e))},addClass(e){this.el().forEach(i=>i.classList.add(e))},removeClass(e){this.el().forEach(i=>i.classList.remove(e))},slug:e=>e.toLowerCase().replace(/[^\u00BF-\u1FFF\u2C00-\uD7FF\w]+|[\_]+/ig,"-").replace(/ +/g,"-"),remove(e){this.el().forEach(e=>e.remove())},val(e){let i;return void 0===e?this.el().forEach(e=>{i=e.value}):this.el().forEach(i=>{i.value=e}),i},text(i){if(void 0===i)return e.innerText;this.el().forEach(e=>{e.innerText=i})},html(i){if(void 0===i)return e.innerHTML;this.el().forEach(e=>{e.innerHTML=i})}}};let m={People:[{emoji:"\uD83D\uDE00",title:"Grinning Face"},{emoji:"\uD83D\uDE03",title:"Grinning Face with Big Eyes"},{emoji:"\uD83D\uDE04",title:"Grinning Face with Smiling Eyes"},{emoji:"\uD83D\uDE01",title:"Beaming Face with Smiling Eyes"},{emoji:"\uD83D\uDE06",title:"Grinning Squinting Face"},{emoji:"\uD83D\uDE05",title:"Grinning Face with Sweat"},{emoji:"\uD83E\uDD23",title:"Rolling on the Floor Laughing"},{emoji:"\uD83D\uDE02",title:"Face with Tears of Joy"},{emoji:"\uD83D\uDE42",title:"Slightly Smiling Face"},{emoji:"\uD83D\uDE43",title:"Upside-Down Face"},{emoji:"\uD83D\uDE09",title:"Winking Face"},{emoji:"\uD83D\uDE0A",title:"Smiling Face with Smiling Eyes"},{emoji:"\uD83D\uDE07",title:"Smiling Face with Halo"},{emoji:"\uD83E\uDD70",title:"Smiling Face with Hearts"},{emoji:"\uD83D\uDE0D",title:"Smiling Face with Heart-Eyes"},{emoji:"\uD83E\uDD29",title:"Star-Struck"},{emoji:"\uD83D\uDE18",title:"Face Blowing a Kiss"},{emoji:"\uD83D\uDE17",title:"Kissing Face"},{emoji:"☺️",title:"Smiling Face"},{emoji:"\uD83D\uDE1A",title:"Kissing Face with Closed Eyes"},{emoji:"\uD83D\uDE19",title:"Kissing Face with Smiling Eyes"},{emoji:"\uD83E\uDD72",title:"Smiling Face with Tear"},{emoji:"\uD83D\uDE0B",title:"Face Savoring Food"},{emoji:"\uD83D\uDE1B",title:"Face with Tongue"},{emoji:"\uD83D\uDE1C",title:"Winking Face with Tongue"},{emoji:"\uD83E\uDD2A",title:"Zany Face"},{emoji:"\uD83D\uDE1D",title:"Squinting Face with Tongue"},{emoji:"\uD83E\uDD11",title:"Money-Mouth Face"},{emoji:"\uD83E\uDD17",title:"Smiling Face with Open Hands"},{emoji:"\uD83E\uDD2D",title:"Face with Hand Over Mouth"},{emoji:"\uD83E\uDD2B",title:"Shushing Face"},{emoji:"\uD83E\uDD14",title:"Thinking Face"},{emoji:"\uD83E\uDD10",title:"Zipper-Mouth Face"},{emoji:"\uD83E\uDD28",title:"Face with Raised Eyebrow"},{emoji:"\uD83D\uDE10",title:"Neutral Face"},{emoji:"\uD83D\uDE11",title:"Expressionless Face"},{emoji:"\uD83D\uDE36",title:"Face Without Mouth"},{emoji:"\uD83D\uDE36‍\uD83C\uDF2B️",title:"Face in Clouds"},{emoji:"\uD83D\uDE0F",title:"Smirking Face"},{emoji:"\uD83D\uDE12",title:"Unamused Face"},{emoji:"\uD83D\uDE44",title:"Face with Rolling Eyes"},{emoji:"\uD83D\uDE2C",title:"Grimacing Face"},{emoji:"\uD83D\uDE2E‍\uD83D\uDCA8",title:"Face Exhaling"},{emoji:"\uD83E\uDD25",title:"Lying Face"},{emoji:"\uD83D\uDE0C",title:"Relieved Face"},{emoji:"\uD83D\uDE14",title:"Pensive Face"},{emoji:"\uD83D\uDE2A",title:"Sleepy Face"},{emoji:"\uD83E\uDD24",title:"Drooling Face"},{emoji:"\uD83D\uDE34",title:"Sleeping Face"},{emoji:"\uD83D\uDE37",title:"Face with Medical Mask"},{emoji:"\uD83E\uDD12",title:"Face with Thermometer"},{emoji:"\uD83E\uDD15",title:"Face with Head-Bandage"},{emoji:"\uD83E\uDD22",title:"Nauseated Face"},{emoji:"\uD83E\uDD2E",title:"Face Vomiting"},{emoji:"\uD83E\uDD27",title:"Sneezing Face"},{emoji:"\uD83E\uDD75",title:"Hot Face"},{emoji:"\uD83E\uDD76",title:"Cold Face"},{emoji:"\uD83E\uDD74",title:"Woozy Face"},{emoji:"\uD83D\uDE35",title:"Face with Crossed-Out Eyes"},{emoji:"\uD83D\uDE35‍\uD83D\uDCAB",title:"Face with Spiral Eyes"},{emoji:"\uD83E\uDD2F",title:"Exploding Head"},{emoji:"\uD83E\uDD20",title:"Cowboy Hat Face"},{emoji:"\uD83E\uDD73",title:"Partying Face"},{emoji:"\uD83E\uDD78",title:"Disguised Face"},{emoji:"\uD83D\uDE0E",title:"Smiling Face with Sunglasses"},{emoji:"\uD83E\uDD13",title:"Nerd Face"},{emoji:"\uD83E\uDDD0",title:"Face with Monocle"},{emoji:"\uD83D\uDE15",title:"Confused Face"},{emoji:"\uD83D\uDE1F",title:"Worried Face"},{emoji:"\uD83D\uDE41",title:"Slightly Frowning Face"},{emoji:"☹️",title:"Frowning Face"},{emoji:"\uD83D\uDE2E",title:"Face with Open Mouth"},{emoji:"\uD83D\uDE2F",title:"Hushed Face"},{emoji:"\uD83D\uDE32",title:"Astonished Face"},{emoji:"\uD83D\uDE33",title:"Flushed Face"},{emoji:"\uD83E\uDD7A",title:"Pleading Face"},{emoji:"\uD83D\uDE26",title:"Frowning Face with Open Mouth"},{emoji:"\uD83D\uDE27",title:"Anguished Face"},{emoji:"\uD83D\uDE28",title:"Fearful Face"},{emoji:"\uD83D\uDE30",title:"Anxious Face with Sweat"},{emoji:"\uD83D\uDE25",title:"Sad but Relieved Face"},{emoji:"\uD83D\uDE22",title:"Crying Face"},{emoji:"\uD83D\uDE2D",title:"Loudly Crying Face"},{emoji:"\uD83D\uDE31",title:"Face Screaming in Fear"},{emoji:"\uD83D\uDE16",title:"Confounded Face"},{emoji:"\uD83D\uDE23",title:"Persevering Face"},{emoji:"\uD83D\uDE1E",title:"Disappointed Face"},{emoji:"\uD83D\uDE13",title:"Downcast Face with Sweat"},{emoji:"\uD83D\uDE29",title:"Weary Face"},{emoji:"\uD83D\uDE2B",title:"Tired Face"},{emoji:"\uD83E\uDD71",title:"Yawning Face"},{emoji:"\uD83D\uDE24",title:"Face with Steam From Nose"},{emoji:"\uD83D\uDE21",title:"Enraged Face"},{emoji:"\uD83D\uDE20",title:"Angry Face"},{emoji:"\uD83E\uDD2C",title:"Face with Symbols on Mouth"},{emoji:"\uD83D\uDE08",title:"Smiling Face with Horns"},{emoji:"\uD83D\uDC7F",title:"Angry Face with Horns"},{emoji:"\uD83D\uDC80",title:"Skull"},{emoji:"☠️",title:"Skull and Crossbones"},{emoji:"\uD83D\uDCA9",title:"Pile of Poo"},{emoji:"\uD83E\uDD21",title:"Clown Face"},{emoji:"\uD83D\uDC79",title:"Ogre"},{emoji:"\uD83D\uDC7A",title:"Goblin"},{emoji:"\uD83D\uDC7B",title:"Ghost"},{emoji:"\uD83D\uDC7D",title:"Alien"},{emoji:"\uD83D\uDC7E",title:"Alien Monster"},{emoji:"\uD83E\uDD16",title:"Robot"},{emoji:"\uD83D\uDE3A",title:"Grinning Cat"},{emoji:"\uD83D\uDE38",title:"Grinning Cat with Smiling Eyes"},{emoji:"\uD83D\uDE39",title:"Cat with Tears of Joy"},{emoji:"\uD83D\uDE3B",title:"Smiling Cat with Heart-Eyes"},{emoji:"\uD83D\uDE3C",title:"Cat with Wry Smile"},{emoji:"\uD83D\uDE3D",title:"Kissing Cat"},{emoji:"\uD83D\uDE40",title:"Weary Cat"},{emoji:"\uD83D\uDE3F",title:"Crying Cat"},{emoji:"\uD83D\uDE3E",title:"Pouting Cat"},{emoji:"\uD83D\uDC8B",title:"Kiss Mark"},{emoji:"\uD83D\uDC4B",title:"Waving Hand"},{emoji:"\uD83E\uDD1A",title:"Raised Back of Hand"},{emoji:"\uD83D\uDD90️",title:"Hand with Fingers Splayed"},{emoji:"✋",title:"Raised Hand"},{emoji:"\uD83D\uDD96",title:"Vulcan Salute"},{emoji:"\uD83D\uDC4C",title:"OK Hand"},{emoji:"\uD83E\uDD0C",title:"Pinched Fingers"},{emoji:"\uD83E\uDD0F",title:"Pinching Hand"},{emoji:"✌️",title:"Victory Hand"},{emoji:"\uD83E\uDD1E",title:"Crossed Fingers"},{emoji:"\uD83E\uDD1F",title:"Love-You Gesture"},{emoji:"\uD83E\uDD18",title:"Sign of the Horns"},{emoji:"\uD83E\uDD19",title:"Call Me Hand"},{emoji:"\uD83D\uDC48",title:"Backhand Index Pointing Left"},{emoji:"\uD83D\uDC49",title:"Backhand Index Pointing Right"},{emoji:"\uD83D\uDC46",title:"Backhand Index Pointing Up"},{emoji:"\uD83D\uDD95",title:"Middle Finger"},{emoji:"\uD83D\uDC47",title:"Backhand Index Pointing Down"},{emoji:"☝️",title:"Index Pointing Up"},{emoji:"\uD83D\uDC4D",title:"Thumbs Up"},{emoji:"\uD83D\uDC4E",title:"Thumbs Down"},{emoji:"✊",title:"Raised Fist"},{emoji:"\uD83D\uDC4A",title:"Oncoming Fist"},{emoji:"\uD83E\uDD1B",title:"Left-Facing Fist"},{emoji:"\uD83E\uDD1C",title:"Right-Facing Fist"},{emoji:"\uD83D\uDC4F",title:"Clapping Hands"},{emoji:"\uD83D\uDE4C",title:"Raising Hands"},{emoji:"\uD83D\uDC50",title:"Open Hands"},{emoji:"\uD83E\uDD32",title:"Palms Up Together"},{emoji:"\uD83E\uDD1D",title:"Handshake"},{emoji:"\uD83D\uDE4F",title:"Folded Hands"},{emoji:"✍️",title:"Writing Hand"},{emoji:"\uD83D\uDC85",title:"Nail Polish"},{emoji:"\uD83E\uDD33",title:"Selfie"},{emoji:"\uD83D\uDCAA",title:"Flexed Biceps"},{emoji:"\uD83E\uDDBE",title:"Mechanical Arm"},{emoji:"\uD83E\uDDBF",title:"Mechanical Leg"},{emoji:"\uD83E\uDDB5",title:"Leg"},{emoji:"\uD83E\uDDB6",title:"Foot"},{emoji:"\uD83D\uDC42",title:"Ear"},{emoji:"\uD83E\uDDBB",title:"Ear with Hearing Aid"},{emoji:"\uD83D\uDC43",title:"Nose"},{emoji:"\uD83E\uDDE0",title:"Brain"},{emoji:"\uD83E\uDEC0",title:"Anatomical Heart"},{emoji:"\uD83E\uDEC1",title:"Lungs"},{emoji:"\uD83E\uDDB7",title:"Tooth"},{emoji:"\uD83E\uDDB4",title:"Bone"},{emoji:"\uD83D\uDC40",title:"Eyes"},{emoji:"\uD83D\uDC41️",title:"Eye"},{emoji:"\uD83D\uDC45",title:"Tongue"},{emoji:"\uD83D\uDC44",title:"Mouth"},{emoji:"\uD83D\uDC76",title:"Baby"},{emoji:"\uD83E\uDDD2",title:"Child"},{emoji:"\uD83D\uDC66",title:"Boy"},{emoji:"\uD83D\uDC67",title:"Girl"},{emoji:"\uD83E\uDDD1",title:"Person"},{emoji:"\uD83D\uDC71",title:"Person: Blond Hair"},{emoji:"\uD83D\uDC68",title:"Man"},{emoji:"\uD83E\uDDD4",title:"Person: Beard"},{emoji:"\uD83D\uDC68‍\uD83E\uDDB0",title:"Man: Red Hair"},{emoji:"\uD83D\uDC68‍\uD83E\uDDB1",title:"Man: Curly Hair"},{emoji:"\uD83D\uDC68‍\uD83E\uDDB3",title:"Man: White Hair"},{emoji:"\uD83D\uDC68‍\uD83E\uDDB2",title:"Man: Bald"},{emoji:"\uD83D\uDC69",title:"Woman"},{emoji:"\uD83D\uDC69‍\uD83E\uDDB0",title:"Woman: Red Hair"},{emoji:"\uD83E\uDDD1‍\uD83E\uDDB0",title:"Person: Red Hair"},{emoji:"\uD83D\uDC69‍\uD83E\uDDB1",title:"Woman: Curly Hair"},{emoji:"\uD83E\uDDD1‍\uD83E\uDDB1",title:"Person: Curly Hair"},{emoji:"\uD83D\uDC69‍\uD83E\uDDB3",title:"Woman: White Hair"},{emoji:"\uD83E\uDDD1‍\uD83E\uDDB3",title:"Person: White Hair"},{emoji:"\uD83D\uDC69‍\uD83E\uDDB2",title:"Woman: Bald"},{emoji:"\uD83E\uDDD1‍\uD83E\uDDB2",title:"Person: Bald"},{emoji:"\uD83D\uDC71‍♀️",title:"Woman: Blond Hair"},{emoji:"\uD83D\uDC71‍♂️",title:"Man: Blond Hair"},{emoji:"\uD83E\uDDD3",title:"Older Person"},{emoji:"\uD83D\uDC74",title:"Old Man"},{emoji:"\uD83D\uDC75",title:"Old Woman"},{emoji:"\uD83D\uDE4D",title:"Person Frowning"},{emoji:"\uD83D\uDE4D‍♂️",title:"Man Frowning"},{emoji:"\uD83D\uDE4D‍♀️",title:"Woman Frowning"},{emoji:"\uD83D\uDE4E",title:"Person Pouting"},{emoji:"\uD83D\uDE4E‍♂️",title:"Man Pouting"},{emoji:"\uD83D\uDE4E‍♀️",title:"Woman Pouting"},{emoji:"\uD83D\uDE45",title:"Person Gesturing No"},{emoji:"\uD83D\uDE45‍♂️",title:"Man Gesturing No"},{emoji:"\uD83D\uDE45‍♀️",title:"Woman Gesturing No"},{emoji:"\uD83D\uDE46",title:"Person Gesturing OK"},{emoji:"\uD83D\uDE46‍♂️",title:"Man Gesturing OK"},{emoji:"\uD83D\uDE46‍♀️",title:"Woman Gesturing OK"},{emoji:"\uD83D\uDC81",title:"Person Tipping Hand"},{emoji:"\uD83D\uDC81‍♂️",title:"Man Tipping Hand"},{emoji:"\uD83D\uDC81‍♀️",title:"Woman Tipping Hand"},{emoji:"\uD83D\uDE4B",title:"Person Raising Hand"},{emoji:"\uD83D\uDE4B‍♂️",title:"Man Raising Hand"},{emoji:"\uD83D\uDE4B‍♀️",title:"Woman Raising Hand"},{emoji:"\uD83E\uDDCF",title:"Deaf Person"},{emoji:"\uD83E\uDDCF‍♂️",title:"Deaf Man"},{emoji:"\uD83E\uDDCF‍♀️",title:"Deaf Woman"},{emoji:"\uD83D\uDE47",title:"Person Bowing"},{emoji:"\uD83D\uDE47‍♂️",title:"Man Bowing"},{emoji:"\uD83D\uDE47‍♀️",title:"Woman Bowing"},{emoji:"\uD83E\uDD26",title:"Person Facepalming"},{emoji:"\uD83E\uDD26‍♂️",title:"Man Facepalming"},{emoji:"\uD83E\uDD26‍♀️",title:"Woman Facepalming"},{emoji:"\uD83E\uDD37",title:"Person Shrugging"},{emoji:"\uD83E\uDD37‍♂️",title:"Man Shrugging"},{emoji:"\uD83E\uDD37‍♀️",title:"Woman Shrugging"},{emoji:"\uD83E\uDDD1‍⚕️",title:"Health Worker"},{emoji:"\uD83D\uDC68‍⚕️",title:"Man Health Worker"},{emoji:"\uD83D\uDC69‍⚕️",title:"Woman Health Worker"},{emoji:"\uD83E\uDDD1‍\uD83C\uDF93",title:"Student"},{emoji:"\uD83D\uDC68‍\uD83C\uDF93",title:"Man Student"},{emoji:"\uD83D\uDC69‍\uD83C\uDF93",title:"Woman Student"},{emoji:"\uD83E\uDDD1‍\uD83C\uDFEB",title:"Teacher"},{emoji:"\uD83D\uDC68‍\uD83C\uDFEB",title:"Man Teacher"},{emoji:"\uD83D\uDC69‍\uD83C\uDFEB",title:"Woman Teacher"},{emoji:"\uD83E\uDDD1‍⚖️",title:"Judge"},{emoji:"\uD83D\uDC68‍⚖️",title:"Man Judge"},{emoji:"\uD83D\uDC69‍⚖️",title:"Woman Judge"},{emoji:"\uD83E\uDDD1‍\uD83C\uDF3E",title:"Farmer"},{emoji:"\uD83D\uDC68‍\uD83C\uDF3E",title:"Man Farmer"},{emoji:"\uD83D\uDC69‍\uD83C\uDF3E",title:"Woman Farmer"},{emoji:"\uD83E\uDDD1‍\uD83C\uDF73",title:"Cook"},{emoji:"\uD83D\uDC68‍\uD83C\uDF73",title:"Man Cook"},{emoji:"\uD83D\uDC69‍\uD83C\uDF73",title:"Woman Cook"},{emoji:"\uD83E\uDDD1‍\uD83D\uDD27",title:"Mechanic"},{emoji:"\uD83D\uDC68‍\uD83D\uDD27",title:"Man Mechanic"},{emoji:"\uD83D\uDC69‍\uD83D\uDD27",title:"Woman Mechanic"},{emoji:"\uD83E\uDDD1‍\uD83C\uDFED",title:"Factory Worker"},{emoji:"\uD83D\uDC68‍\uD83C\uDFED",title:"Man Factory Worker"},{emoji:"\uD83D\uDC69‍\uD83C\uDFED",title:"Woman Factory Worker"},{emoji:"\uD83E\uDDD1‍\uD83D\uDCBC",title:"Office Worker"},{emoji:"\uD83D\uDC68‍\uD83D\uDCBC",title:"Man Office Worker"},{emoji:"\uD83D\uDC69‍\uD83D\uDCBC",title:"Woman Office Worker"},{emoji:"\uD83E\uDDD1‍\uD83D\uDD2C",title:"Scientist"},{emoji:"\uD83D\uDC68‍\uD83D\uDD2C",title:"Man Scientist"},{emoji:"\uD83D\uDC69‍\uD83D\uDD2C",title:"Woman Scientist"},{emoji:"\uD83E\uDDD1‍\uD83D\uDCBB",title:"Technologist"},{emoji:"\uD83D\uDC68‍\uD83D\uDCBB",title:"Man Technologist"},{emoji:"\uD83D\uDC69‍\uD83D\uDCBB",title:"Woman Technologist"},{emoji:"\uD83E\uDDD1‍\uD83C\uDFA4",title:"Singer"},{emoji:"\uD83D\uDC68‍\uD83C\uDFA4",title:"Man Singer"},{emoji:"\uD83D\uDC69‍\uD83C\uDFA4",title:"Woman Singer"},{emoji:"\uD83E\uDDD1‍\uD83C\uDFA8",title:"Artist"},{emoji:"\uD83D\uDC68‍\uD83C\uDFA8",title:"Man Artist"},{emoji:"\uD83D\uDC69‍\uD83C\uDFA8",title:"Woman Artist"},{emoji:"\uD83E\uDDD1‍✈️",title:"Pilot"},{emoji:"\uD83D\uDC68‍✈️",title:"Man Pilot"},{emoji:"\uD83D\uDC69‍✈️",title:"Woman Pilot"},{emoji:"\uD83E\uDDD1‍\uD83D\uDE80",title:"Astronaut"},{emoji:"\uD83D\uDC68‍\uD83D\uDE80",title:"Man Astronaut"},{emoji:"\uD83D\uDC69‍\uD83D\uDE80",title:"Woman Astronaut"},{emoji:"\uD83E\uDDD1‍\uD83D\uDE92",title:"Firefighter"},{emoji:"\uD83D\uDC68‍\uD83D\uDE92",title:"Man Firefighter"},{emoji:"\uD83D\uDC69‍\uD83D\uDE92",title:"Woman Firefighter"},{emoji:"\uD83D\uDC6E",title:"Police Officer"},{emoji:"\uD83D\uDC6E‍♂️",title:"Man Police Officer"},{emoji:"\uD83D\uDC6E‍♀️",title:"Woman Police Officer"},{emoji:"\uD83D\uDD75️",title:"Detective"},{emoji:"\uD83D\uDD75️‍♂️",title:"Man Detective"},{emoji:"\uD83D\uDD75️‍♀️",title:"Woman Detective"},{emoji:"\uD83D\uDC82",title:"Guard"},{emoji:"\uD83D\uDC82‍♂️",title:"Man Guard"},{emoji:"\uD83D\uDC82‍♀️",title:"Woman Guard"},{emoji:"\uD83E\uDD77",title:"Ninja"},{emoji:"\uD83D\uDC77",title:"Construction Worker"},{emoji:"\uD83D\uDC77‍♂️",title:"Man Construction Worker"},{emoji:"\uD83D\uDC77‍♀️",title:"Woman Construction Worker"},{emoji:"\uD83E\uDD34",title:"Prince"},{emoji:"\uD83D\uDC78",title:"Princess"},{emoji:"\uD83D\uDC73",title:"Person Wearing Turban"},{emoji:"\uD83D\uDC73‍♂️",title:"Man Wearing Turban"},{emoji:"\uD83D\uDC73‍♀️",title:"Woman Wearing Turban"},{emoji:"\uD83D\uDC72",title:"Person with Skullcap"},{emoji:"\uD83E\uDDD5",title:"Woman with Headscarf"},{emoji:"\uD83E\uDD35",title:"Person in Tuxedo"},{emoji:"\uD83E\uDD35‍♂️",title:"Man in Tuxedo"},{emoji:"\uD83E\uDD35‍♀️",title:"Woman in Tuxedo"},{emoji:"\uD83D\uDC70",title:"Person with Veil"},{emoji:"\uD83D\uDC70‍♂️",title:"Man with Veil"},{emoji:"\uD83D\uDC70‍♀️",title:"Woman with Veil"},{emoji:"\uD83E\uDD30",title:"Pregnant Woman"},{emoji:"\uD83E\uDD31",title:"Breast-Feeding"},{emoji:"\uD83D\uDC69‍\uD83C\uDF7C",title:"Woman Feeding Baby"},{emoji:"\uD83D\uDC68‍\uD83C\uDF7C",title:"Man Feeding Baby"},{emoji:"\uD83E\uDDD1‍\uD83C\uDF7C",title:"Person Feeding Baby"},{emoji:"\uD83D\uDC7C",title:"Baby Angel"},{emoji:"\uD83C\uDF85",title:"Santa Claus"},{emoji:"\uD83E\uDD36",title:"Mrs. Claus"},{emoji:"\uD83E\uDDD1‍\uD83C\uDF84",title:"Mx Claus"},{emoji:"\uD83E\uDDB8",title:"Superhero"},{emoji:"\uD83E\uDDB8‍♂️",title:"Man Superhero"},{emoji:"\uD83E\uDDB8‍♀️",title:"Woman Superhero"},{emoji:"\uD83E\uDDB9",title:"Supervillain"},{emoji:"\uD83E\uDDB9‍♂️",title:"Man Supervillain"},{emoji:"\uD83E\uDDB9‍♀️",title:"Woman Supervillain"},{emoji:"\uD83E\uDDD9",title:"Mage"},{emoji:"\uD83E\uDDD9‍♂️",title:"Man Mage"},{emoji:"\uD83E\uDDD9‍♀️",title:"Woman Mage"},{emoji:"\uD83E\uDDDA",title:"Fairy"},{emoji:"\uD83E\uDDDA‍♂️",title:"Man Fairy"},{emoji:"\uD83E\uDDDA‍♀️",title:"Woman Fairy"},{emoji:"\uD83E\uDDDB",title:"Vampire"},{emoji:"\uD83E\uDDDB‍♂️",title:"Man Vampire"},{emoji:"\uD83E\uDDDB‍♀️",title:"Woman Vampire"},{emoji:"\uD83E\uDDDC",title:"Merperson"},{emoji:"\uD83E\uDDDC‍♂️",title:"Merman"},{emoji:"\uD83E\uDDDC‍♀️",title:"Mermaid"},{emoji:"\uD83E\uDDDD",title:"Elf"},{emoji:"\uD83E\uDDDD‍♂️",title:"Man Elf"},{emoji:"\uD83E\uDDDD‍♀️",title:"Woman Elf"},{emoji:"\uD83E\uDDDE",title:"Genie"},{emoji:"\uD83E\uDDDE‍♂️",title:"Man Genie"},{emoji:"\uD83E\uDDDE‍♀️",title:"Woman Genie"},{emoji:"\uD83E\uDDDF",title:"Zombie"},{emoji:"\uD83E\uDDDF‍♂️",title:"Man Zombie"},{emoji:"\uD83E\uDDDF‍♀️",title:"Woman Zombie"},{emoji:"\uD83D\uDC86",title:"Person Getting Massage"},{emoji:"\uD83D\uDC86‍♂️",title:"Man Getting Massage"},{emoji:"\uD83D\uDC86‍♀️",title:"Woman Getting Massage"},{emoji:"\uD83D\uDC87",title:"Person Getting Haircut"},{emoji:"\uD83D\uDC87‍♂️",title:"Man Getting Haircut"},{emoji:"\uD83D\uDC87‍♀️",title:"Woman Getting Haircut"},{emoji:"\uD83D\uDEB6",title:"Person Walking"},{emoji:"\uD83D\uDEB6‍♂️",title:"Man Walking"},{emoji:"\uD83D\uDEB6‍♀️",title:"Woman Walking"},{emoji:"\uD83E\uDDCD",title:"Person Standing"},{emoji:"\uD83E\uDDCD‍♂️",title:"Man Standing"},{emoji:"\uD83E\uDDCD‍♀️",title:"Woman Standing"},{emoji:"\uD83E\uDDCE",title:"Person Kneeling"},{emoji:"\uD83E\uDDCE‍♂️",title:"Man Kneeling"},{emoji:"\uD83E\uDDCE‍♀️",title:"Woman Kneeling"},{emoji:"\uD83E\uDDD1‍\uD83E\uDDAF",title:"Person with White Cane"},{emoji:"\uD83D\uDC68‍\uD83E\uDDAF",title:"Man with White Cane"},{emoji:"\uD83D\uDC69‍\uD83E\uDDAF",title:"Woman with White Cane"},{emoji:"\uD83E\uDDD1‍\uD83E\uDDBC",title:"Person in Motorized Wheelchair"},{emoji:"\uD83D\uDC68‍\uD83E\uDDBC",title:"Man in Motorized Wheelchair"},{emoji:"\uD83D\uDC69‍\uD83E\uDDBC",title:"Woman in Motorized Wheelchair"},{emoji:"\uD83E\uDDD1‍\uD83E\uDDBD",title:"Person in Manual Wheelchair"},{emoji:"\uD83D\uDC68‍\uD83E\uDDBD",title:"Man in Manual Wheelchair"},{emoji:"\uD83D\uDC69‍\uD83E\uDDBD",title:"Woman in Manual Wheelchair"},{emoji:"\uD83C\uDFC3",title:"Person Running"},{emoji:"\uD83C\uDFC3‍♂️",title:"Man Running"},{emoji:"\uD83C\uDFC3‍♀️",title:"Woman Running"},{emoji:"\uD83D\uDC83",title:"Woman Dancing"},{emoji:"\uD83D\uDD7A",title:"Man Dancing"},{emoji:"\uD83D\uDD74️",title:"Person in Suit Levitating"},{emoji:"\uD83D\uDC6F",title:"People with Bunny Ears"},{emoji:"\uD83D\uDC6F‍♂️",title:"Men with Bunny Ears"},{emoji:"\uD83D\uDC6F‍♀️",title:"Women with Bunny Ears"},{emoji:"\uD83E\uDDD6",title:"Person in Steamy Room"},{emoji:"\uD83E\uDDD6‍♂️",title:"Man in Steamy Room"},{emoji:"\uD83E\uDDD6‍♀️",title:"Woman in Steamy Room"},{emoji:"\uD83E\uDDD8",title:"Person in Lotus Position"},{emoji:"\uD83E\uDDD1‍\uD83E\uDD1D‍\uD83E\uDDD1",title:"People Holding Hands"},{emoji:"\uD83D\uDC6D",title:"Women Holding Hands"},{emoji:"\uD83D\uDC6B",title:"Woman and Man Holding Hands"},{emoji:"\uD83D\uDC6C",title:"Men Holding Hands"},{emoji:"\uD83D\uDC8F",title:"Kiss"},{emoji:"\uD83D\uDC69‍❤️‍\uD83D\uDC8B‍\uD83D\uDC68",title:"Kiss: Woman, Man"},{emoji:"\uD83D\uDC68‍❤️‍\uD83D\uDC8B‍\uD83D\uDC68",title:"Kiss: Man, Man"},{emoji:"\uD83D\uDC69‍❤️‍\uD83D\uDC8B‍\uD83D\uDC69",title:"Kiss: Woman, Woman"},{emoji:"\uD83D\uDC91",title:"Couple with Heart"},{emoji:"\uD83D\uDC69‍❤️‍\uD83D\uDC68",title:"Couple with Heart: Woman, Man"},{emoji:"\uD83D\uDC68‍❤️‍\uD83D\uDC68",title:"Couple with Heart: Man, Man"},{emoji:"\uD83D\uDC69‍❤️‍\uD83D\uDC69",title:"Couple with Heart: Woman, Woman"},{emoji:"\uD83D\uDC6A",title:"Family"},{emoji:"\uD83D\uDC68‍\uD83D\uDC69‍\uD83D\uDC66",title:"Family: Man, Woman, Boy"},{emoji:"\uD83D\uDC68‍\uD83D\uDC69‍\uD83D\uDC67",title:"Family: Man, Woman, Girl"},{emoji:"\uD83D\uDC68‍\uD83D\uDC69‍\uD83D\uDC67‍\uD83D\uDC66",title:"Family: Man, Woman, Girl, Boy"},{emoji:"\uD83D\uDC68‍\uD83D\uDC69‍\uD83D\uDC66‍\uD83D\uDC66",title:"Family: Man, Woman, Boy, Boy"},{emoji:"\uD83D\uDC68‍\uD83D\uDC69‍\uD83D\uDC67‍\uD83D\uDC67",title:"Family: Man, Woman, Girl, Girl"},{emoji:"\uD83D\uDC68‍\uD83D\uDC68‍\uD83D\uDC66",title:"Family: Man, Man, Boy"},{emoji:"\uD83D\uDC68‍\uD83D\uDC68‍\uD83D\uDC67",title:"Family: Man, Man, Girl"},{emoji:"\uD83D\uDC68‍\uD83D\uDC68‍\uD83D\uDC67‍\uD83D\uDC66",title:"Family: Man, Man, Girl, Boy"},{emoji:"\uD83D\uDC68‍\uD83D\uDC68‍\uD83D\uDC66‍\uD83D\uDC66",title:"Family: Man, Man, Boy, Boy"},{emoji:"\uD83D\uDC68‍\uD83D\uDC68‍\uD83D\uDC67‍\uD83D\uDC67",title:"Family: Man, Man, Girl, Girl"},{emoji:"\uD83D\uDC69‍\uD83D\uDC69‍\uD83D\uDC66",title:"Family: Woman, Woman, Boy"},{emoji:"\uD83D\uDC69‍\uD83D\uDC69‍\uD83D\uDC67",title:"Family: Woman, Woman, Girl"},{emoji:"\uD83D\uDC69‍\uD83D\uDC69‍\uD83D\uDC67‍\uD83D\uDC66",title:"Family: Woman, Woman, Girl, Boy"},{emoji:"\uD83D\uDC69‍\uD83D\uDC69‍\uD83D\uDC66‍\uD83D\uDC66",title:"Family: Woman, Woman, Boy, Boy"},{emoji:"\uD83D\uDC69‍\uD83D\uDC69‍\uD83D\uDC67‍\uD83D\uDC67",title:"Family: Woman, Woman, Girl, Girl"},{emoji:"\uD83D\uDC68‍\uD83D\uDC66",title:"Family: Man, Boy"},{emoji:"\uD83D\uDC68‍\uD83D\uDC66‍\uD83D\uDC66",title:"Family: Man, Boy, Boy"},{emoji:"\uD83D\uDC68‍\uD83D\uDC67",title:"Family: Man, Girl"},{emoji:"\uD83D\uDC68‍\uD83D\uDC67‍\uD83D\uDC66",title:"Family: Man, Girl, Boy"},{emoji:"\uD83D\uDC68‍\uD83D\uDC67‍\uD83D\uDC67",title:"Family: Man, Girl, Girl"},{emoji:"\uD83D\uDC69‍\uD83D\uDC66",title:"Family: Woman, Boy"},{emoji:"\uD83D\uDC69‍\uD83D\uDC66‍\uD83D\uDC66",title:"Family: Woman, Boy, Boy"},{emoji:"\uD83D\uDC69‍\uD83D\uDC67",title:"Family: Woman, Girl"},{emoji:"\uD83D\uDC69‍\uD83D\uDC67‍\uD83D\uDC66",title:"Family: Woman, Girl, Boy"},{emoji:"\uD83D\uDC69‍\uD83D\uDC67‍\uD83D\uDC67",title:"Family: Woman, Girl, Girl"},{emoji:"\uD83D\uDDE3️",title:"Speaking Head"},{emoji:"\uD83D\uDC64",title:"Bust in Silhouette"},{emoji:"\uD83D\uDC65",title:"Busts in Silhouette"},{emoji:"\uD83E\uDEC2",title:"People Hugging"},{emoji:"\uD83D\uDC63",title:"Footprints"},{emoji:"\uD83E\uDDF3",title:"Luggage"},{emoji:"\uD83C\uDF02",title:"Closed Umbrella"},{emoji:"☂️",title:"Umbrella"},{emoji:"\uD83C\uDF83",title:"Jack-O-Lantern"},{emoji:"\uD83E\uDDF5",title:"Thread"},{emoji:"\uD83E\uDDF6",title:"Yarn"},{emoji:"\uD83D\uDC53",title:"Glasses"},{emoji:"\uD83D\uDD76️",title:"Sunglasses"},{emoji:"\uD83E\uDD7D",title:"Goggles"},{emoji:"\uD83E\uDD7C",title:"Lab Coat"},{emoji:"\uD83E\uDDBA",title:"Safety Vest"},{emoji:"\uD83D\uDC54",title:"Necktie"},{emoji:"\uD83D\uDC55",title:"T-Shirt"},{emoji:"\uD83D\uDC56",title:"Jeans"},{emoji:"\uD83E\uDDE3",title:"Scarf"},{emoji:"\uD83E\uDDE4",title:"Gloves"},{emoji:"\uD83E\uDDE5",title:"Coat"},{emoji:"\uD83E\uDDE6",title:"Socks"},{emoji:"\uD83D\uDC57",title:"Dress"},{emoji:"\uD83D\uDC58",title:"Kimono"},{emoji:"\uD83E\uDD7B",title:"Sari"},{emoji:"\uD83E\uDE71",title:"One-Piece Swimsuit"},{emoji:"\uD83E\uDE72",title:"Briefs"},{emoji:"\uD83E\uDE73",title:"Shorts"},{emoji:"\uD83D\uDC59",title:"Bikini"},{emoji:"\uD83D\uDC5A",title:"Woman’s Clothes"},{emoji:"\uD83D\uDC5B",title:"Purse"},{emoji:"\uD83D\uDC5C",title:"Handbag"},{emoji:"\uD83D\uDC5D",title:"Clutch Bag"},{emoji:"\uD83C\uDF92",title:"Backpack"},{emoji:"\uD83E\uDE74",title:"Thong Sandal"},{emoji:"\uD83D\uDC5E",title:"Man’s Shoe"},{emoji:"\uD83D\uDC5F",title:"Running Shoe"},{emoji:"\uD83E\uDD7E",title:"Hiking Boot"},{emoji:"\uD83E\uDD7F",title:"Flat Shoe"},{emoji:"\uD83D\uDC60",title:"High-Heeled Shoe"},{emoji:"\uD83D\uDC61",title:"Woman’s Sandal"},{emoji:"\uD83E\uDE70",title:"Ballet Shoes"},{emoji:"\uD83D\uDC62",title:"Woman’s Boot"},{emoji:"\uD83D\uDC51",title:"Crown"},{emoji:"\uD83D\uDC52",title:"Woman’s Hat"},{emoji:"\uD83C\uDFA9",title:"Top Hat"},{emoji:"\uD83C\uDF93",title:"Graduation Cap"},{emoji:"\uD83E\uDDE2",title:"Billed Cap"},{emoji:"\uD83E\uDE96",title:"Military Helmet"},{emoji:"⛑️",title:"Rescue Worker’s Helmet"},{emoji:"\uD83D\uDC84",title:"Lipstick"},{emoji:"\uD83D\uDC8D",title:"Ring"},{emoji:"\uD83D\uDCBC",title:"Briefcase"},{emoji:"\uD83E\uDE78",title:"Drop of Blood"}],Nature:[{emoji:"\uD83D\uDE48",title:"See-No-Evil Monkey"},{emoji:"\uD83D\uDE49",title:"Hear-No-Evil Monkey"},{emoji:"\uD83D\uDE4A",title:"Speak-No-Evil Monkey"},{emoji:"\uD83D\uDCA5",title:"Collision"},{emoji:"\uD83D\uDCAB",title:"Dizzy"},{emoji:"\uD83D\uDCA6",title:"Sweat Droplets"},{emoji:"\uD83D\uDCA8",title:"Dashing Away"},{emoji:"\uD83D\uDC35",title:"Monkey Face"},{emoji:"\uD83D\uDC12",title:"Monkey"},{emoji:"\uD83E\uDD8D",title:"Gorilla"},{emoji:"\uD83E\uDDA7",title:"Orangutan"},{emoji:"\uD83D\uDC36",title:"Dog Face"},{emoji:"\uD83D\uDC15",title:"Dog"},{emoji:"\uD83E\uDDAE",title:"Guide Dog"},{emoji:"\uD83D\uDC15‍\uD83E\uDDBA",title:"Service Dog"},{emoji:"\uD83D\uDC29",title:"Poodle"},{emoji:"\uD83D\uDC3A",title:"Wolf"},{emoji:"\uD83E\uDD8A",title:"Fox"},{emoji:"\uD83E\uDD9D",title:"Raccoon"},{emoji:"\uD83D\uDC31",title:"Cat Face"},{emoji:"\uD83D\uDC08",title:"Cat"},{emoji:"\uD83D\uDC08‍⬛",title:"Black Cat"},{emoji:"\uD83E\uDD81",title:"Lion"},{emoji:"\uD83D\uDC2F",title:"Tiger Face"},{emoji:"\uD83D\uDC05",title:"Tiger"},{emoji:"\uD83D\uDC06",title:"Leopard"},{emoji:"\uD83D\uDC34",title:"Horse Face"},{emoji:"\uD83D\uDC0E",title:"Horse"},{emoji:"\uD83E\uDD84",title:"Unicorn"},{emoji:"\uD83E\uDD93",title:"Zebra"},{emoji:"\uD83E\uDD8C",title:"Deer"},{emoji:"\uD83E\uDDAC",title:"Bison"},{emoji:"\uD83D\uDC2E",title:"Cow Face"},{emoji:"\uD83D\uDC02",title:"Ox"},{emoji:"\uD83D\uDC03",title:"Water Buffalo"},{emoji:"\uD83D\uDC04",title:"Cow"},{emoji:"\uD83D\uDC37",title:"Pig Face"},{emoji:"\uD83D\uDC16",title:"Pig"},{emoji:"\uD83D\uDC17",title:"Boar"},{emoji:"\uD83D\uDC3D",title:"Pig Nose"},{emoji:"\uD83D\uDC0F",title:"Ram"},{emoji:"\uD83D\uDC11",title:"Ewe"},{emoji:"\uD83D\uDC10",title:"Goat"},{emoji:"\uD83D\uDC2A",title:"Camel"},{emoji:"\uD83D\uDC2B",title:"Two-Hump Camel"},{emoji:"\uD83E\uDD99",title:"Llama"},{emoji:"\uD83E\uDD92",title:"Giraffe"},{emoji:"\uD83D\uDC18",title:"Elephant"},{emoji:"\uD83E\uDDA3",title:"Mammoth"},{emoji:"\uD83E\uDD8F",title:"Rhinoceros"},{emoji:"\uD83E\uDD9B",title:"Hippopotamus"},{emoji:"\uD83D\uDC2D",title:"Mouse Face"},{emoji:"\uD83D\uDC01",title:"Mouse"},{emoji:"\uD83D\uDC00",title:"Rat"},{emoji:"\uD83D\uDC39",title:"Hamster"},{emoji:"\uD83D\uDC30",title:"Rabbit Face"},{emoji:"\uD83D\uDC07",title:"Rabbit"},{emoji:"\uD83D\uDC3F️",title:"Chipmunk"},{emoji:"\uD83E\uDDAB",title:"Beaver"},{emoji:"\uD83E\uDD94",title:"Hedgehog"},{emoji:"\uD83E\uDD87",title:"Bat"},{emoji:"\uD83D\uDC3B",title:"Bear"},{emoji:"\uD83D\uDC3B‍❄️",title:"Polar Bear"},{emoji:"\uD83D\uDC28",title:"Koala"},{emoji:"\uD83D\uDC3C",title:"Panda"},{emoji:"\uD83E\uDDA5",title:"Sloth"},{emoji:"\uD83E\uDDA6",title:"Otter"},{emoji:"\uD83E\uDDA8",title:"Skunk"},{emoji:"\uD83E\uDD98",title:"Kangaroo"},{emoji:"\uD83E\uDDA1",title:"Badger"},{emoji:"\uD83D\uDC3E",title:"Paw Prints"},{emoji:"\uD83E\uDD83",title:"Turkey"},{emoji:"\uD83D\uDC14",title:"Chicken"},{emoji:"\uD83D\uDC13",title:"Rooster"},{emoji:"\uD83D\uDC23",title:"Hatching Chick"},{emoji:"\uD83D\uDC24",title:"Baby Chick"},{emoji:"\uD83D\uDC25",title:"Front-Facing Baby Chick"},{emoji:"\uD83D\uDC26",title:"Bird"},{emoji:"\uD83D\uDC27",title:"Penguin"},{emoji:"\uD83D\uDD4A️",title:"Dove"},{emoji:"\uD83E\uDD85",title:"Eagle"},{emoji:"\uD83E\uDD86",title:"Duck"},{emoji:"\uD83E\uDDA2",title:"Swan"},{emoji:"\uD83E\uDD89",title:"Owl"},{emoji:"\uD83E\uDDA4",title:"Dodo"},{emoji:"\uD83E\uDEB6",title:"Feather"},{emoji:"\uD83E\uDDA9",title:"Flamingo"},{emoji:"\uD83E\uDD9A",title:"Peacock"},{emoji:"\uD83E\uDD9C",title:"Parrot"},{emoji:"\uD83D\uDC38",title:"Frog"},{emoji:"\uD83D\uDC0A",title:"Crocodile"},{emoji:"\uD83D\uDC22",title:"Turtle"},{emoji:"\uD83E\uDD8E",title:"Lizard"},{emoji:"\uD83D\uDC0D",title:"Snake"},{emoji:"\uD83D\uDC32",title:"Dragon Face"},{emoji:"\uD83D\uDC09",title:"Dragon"},{emoji:"\uD83E\uDD95",title:"Sauropod"},{emoji:"\uD83E\uDD96",title:"T-Rex"},{emoji:"\uD83D\uDC33",title:"Spouting Whale"},{emoji:"\uD83D\uDC0B",title:"Whale"},{emoji:"\uD83D\uDC2C",title:"Dolphin"},{emoji:"\uD83E\uDDAD",title:"Seal"},{emoji:"\uD83D\uDC1F",title:"Fish"},{emoji:"\uD83D\uDC20",title:"Tropical Fish"},{emoji:"\uD83D\uDC21",title:"Blowfish"},{emoji:"\uD83E\uDD88",title:"Shark"},{emoji:"\uD83D\uDC19",title:"Octopus"},{emoji:"\uD83D\uDC1A",title:"Spiral Shell"},{emoji:"\uD83D\uDC0C",title:"Snail"},{emoji:"\uD83E\uDD8B",title:"Butterfly"},{emoji:"\uD83D\uDC1B",title:"Bug"},{emoji:"\uD83D\uDC1C",title:"Ant"},{emoji:"\uD83D\uDC1D",title:"Honeybee"},{emoji:"\uD83E\uDEB2",title:"Beetle"},{emoji:"\uD83D\uDC1E",title:"Lady Beetle"},{emoji:"\uD83E\uDD97",title:"Cricket"},{emoji:"\uD83E\uDEB3",title:"Cockroach"},{emoji:"\uD83D\uDD77️",title:"Spider"},{emoji:"\uD83D\uDD78️",title:"Spider Web"},{emoji:"\uD83E\uDD82",title:"Scorpion"},{emoji:"\uD83E\uDD9F",title:"Mosquito"},{emoji:"\uD83E\uDEB0",title:"Fly"},{emoji:"\uD83E\uDEB1",title:"Worm"},{emoji:"\uD83E\uDDA0",title:"Microbe"},{emoji:"\uD83D\uDC90",title:"Bouquet"},{emoji:"\uD83C\uDF38",title:"Cherry Blossom"},{emoji:"\uD83D\uDCAE",title:"White Flower"},{emoji:"\uD83C\uDFF5️",title:"Rosette"},{emoji:"\uD83C\uDF39",title:"Rose"},{emoji:"\uD83E\uDD40",title:"Wilted Flower"},{emoji:"\uD83C\uDF3A",title:"Hibiscus"},{emoji:"\uD83C\uDF3B",title:"Sunflower"},{emoji:"\uD83C\uDF3C",title:"Blossom"},{emoji:"\uD83C\uDF37",title:"Tulip"},{emoji:"\uD83C\uDF31",title:"Seedling"},{emoji:"\uD83E\uDEB4",title:"Potted Plant"},{emoji:"\uD83C\uDF32",title:"Evergreen Tree"},{emoji:"\uD83C\uDF33",title:"Deciduous Tree"},{emoji:"\uD83C\uDF34",title:"Palm Tree"},{emoji:"\uD83C\uDF35",title:"Cactus"},{emoji:"\uD83C\uDF3E",title:"Sheaf of Rice"},{emoji:"\uD83C\uDF3F",title:"Herb"},{emoji:"☘️",title:"Shamrock"},{emoji:"\uD83C\uDF40",title:"Four Leaf Clover"},{emoji:"\uD83C\uDF41",title:"Maple Leaf"},{emoji:"\uD83C\uDF42",title:"Fallen Leaf"},{emoji:"\uD83C\uDF43",title:"Leaf Fluttering in Wind"},{emoji:"\uD83C\uDF44",title:"Mushroom"},{emoji:"\uD83C\uDF30",title:"Chestnut"},{emoji:"\uD83E\uDD80",title:"Crab"},{emoji:"\uD83E\uDD9E",title:"Lobster"},{emoji:"\uD83E\uDD90",title:"Shrimp"},{emoji:"\uD83E\uDD91",title:"Squid"},{emoji:"\uD83C\uDF0D",title:"Globe Showing Europe-Africa"},{emoji:"\uD83C\uDF0E",title:"Globe Showing Americas"},{emoji:"\uD83C\uDF0F",title:"Globe Showing Asia-Australia"},{emoji:"\uD83C\uDF10",title:"Globe with Meridians"},{emoji:"\uD83E\uDEA8",title:"Rock"},{emoji:"\uD83C\uDF11",title:"New Moon"},{emoji:"\uD83C\uDF12",title:"Waxing Crescent Moon"},{emoji:"\uD83C\uDF13",title:"First Quarter Moon"},{emoji:"\uD83C\uDF14",title:"Waxing Gibbous Moon"},{emoji:"\uD83C\uDF15",title:"Full Moon"},{emoji:"\uD83C\uDF16",title:"Waning Gibbous Moon"},{emoji:"\uD83C\uDF17",title:"Last Quarter Moon"},{emoji:"\uD83C\uDF18",title:"Waning Crescent Moon"},{emoji:"\uD83C\uDF19",title:"Crescent Moon"},{emoji:"\uD83C\uDF1A",title:"New Moon Face"},{emoji:"\uD83C\uDF1B",title:"First Quarter Moon Face"},{emoji:"\uD83C\uDF1C",title:"Last Quarter Moon Face"},{emoji:"☀️",title:"Sun"},{emoji:"\uD83C\uDF1D",title:"Full Moon Face"},{emoji:"\uD83C\uDF1E",title:"Sun with Face"},{emoji:"⭐",title:"Star"},{emoji:"\uD83C\uDF1F",title:"Glowing Star"},{emoji:"\uD83C\uDF20",title:"Shooting Star"},{emoji:"☁️",title:"Cloud"},{emoji:"⛅",title:"Sun Behind Cloud"},{emoji:"⛈️",title:"Cloud with Lightning and Rain"},{emoji:"\uD83C\uDF24️",title:"Sun Behind Small Cloud"},{emoji:"\uD83C\uDF25️",title:"Sun Behind Large Cloud"},{emoji:"\uD83C\uDF26️",title:"Sun Behind Rain Cloud"},{emoji:"\uD83C\uDF27️",title:"Cloud with Rain"},{emoji:"\uD83C\uDF28️",title:"Cloud with Snow"},{emoji:"\uD83C\uDF29️",title:"Cloud with Lightning"},{emoji:"\uD83C\uDF2A️",title:"Tornado"},{emoji:"\uD83C\uDF2B️",title:"Fog"},{emoji:"\uD83C\uDF2C️",title:"Wind Face"},{emoji:"\uD83C\uDF08",title:"Rainbow"},{emoji:"☂️",title:"Umbrella"},{emoji:"☔",title:"Umbrella with Rain Drops"},{emoji:"⚡",title:"High Voltage"},{emoji:"❄️",title:"Snowflake"},{emoji:"☃️",title:"Snowman"},{emoji:"⛄",title:"Snowman Without Snow"},{emoji:"☄️",title:"Comet"},{emoji:"\uD83D\uDD25",title:"Fire"},{emoji:"\uD83D\uDCA7",title:"Droplet"},{emoji:"\uD83C\uDF0A",title:"Water Wave"},{emoji:"\uD83C\uDF84",title:"Christmas Tree"},{emoji:"✨",title:"Sparkles"},{emoji:"\uD83C\uDF8B",title:"Tanabata Tree"},{emoji:"\uD83C\uDF8D",title:"Pine Decoration"}],"Food-dring":[{emoji:"\uD83C\uDF47",title:"Grapes"},{emoji:"\uD83C\uDF48",title:"Melon"},{emoji:"\uD83C\uDF49",title:"Watermelon"},{emoji:"\uD83C\uDF4A",title:"Tangerine"},{emoji:"\uD83C\uDF4B",title:"Lemon"},{emoji:"\uD83C\uDF4C",title:"Banana"},{emoji:"\uD83C\uDF4D",title:"Pineapple"},{emoji:"\uD83E\uDD6D",title:"Mango"},{emoji:"\uD83C\uDF4E",title:"Red Apple"},{emoji:"\uD83C\uDF4F",title:"Green Apple"},{emoji:"\uD83C\uDF50",title:"Pear"},{emoji:"\uD83C\uDF51",title:"Peach"},{emoji:"\uD83C\uDF52",title:"Cherries"},{emoji:"\uD83C\uDF53",title:"Strawberry"},{emoji:"\uD83E\uDED0",title:"Blueberries"},{emoji:"\uD83E\uDD5D",title:"Kiwi Fruit"},{emoji:"\uD83C\uDF45",title:"Tomato"},{emoji:"\uD83E\uDED2",title:"Olive"},{emoji:"\uD83E\uDD65",title:"Coconut"},{emoji:"\uD83E\uDD51",title:"Avocado"},{emoji:"\uD83C\uDF46",title:"Eggplant"},{emoji:"\uD83E\uDD54",title:"Potato"},{emoji:"\uD83E\uDD55",title:"Carrot"},{emoji:"\uD83C\uDF3D",title:"Ear of Corn"},{emoji:"\uD83C\uDF36️",title:"Hot Pepper"},{emoji:"\uD83E\uDED1",title:"Bell Pepper"},{emoji:"\uD83E\uDD52",title:"Cucumber"},{emoji:"\uD83E\uDD6C",title:"Leafy Green"},{emoji:"\uD83E\uDD66",title:"Broccoli"},{emoji:"\uD83E\uDDC4",title:"Garlic"},{emoji:"\uD83E\uDDC5",title:"Onion"},{emoji:"\uD83C\uDF44",title:"Mushroom"},{emoji:"\uD83E\uDD5C",title:"Peanuts"},{emoji:"\uD83C\uDF30",title:"Chestnut"},{emoji:"\uD83C\uDF5E",title:"Bread"},{emoji:"\uD83E\uDD50",title:"Croissant"},{emoji:"\uD83E\uDD56",title:"Baguette Bread"},{emoji:"\uD83E\uDED3",title:"Flatbread"},{emoji:"\uD83E\uDD68",title:"Pretzel"},{emoji:"\uD83E\uDD6F",title:"Bagel"},{emoji:"\uD83E\uDD5E",title:"Pancakes"},{emoji:"\uD83E\uDDC7",title:"Waffle"},{emoji:"\uD83E\uDDC0",title:"Cheese Wedge"},{emoji:"\uD83C\uDF56",title:"Meat on Bone"},{emoji:"\uD83C\uDF57",title:"Poultry Leg"},{emoji:"\uD83E\uDD69",title:"Cut of Meat"},{emoji:"\uD83E\uDD53",title:"Bacon"},{emoji:"\uD83C\uDF54",title:"Hamburger"},{emoji:"\uD83C\uDF5F",title:"French Fries"},{emoji:"\uD83C\uDF55",title:"Pizza"},{emoji:"\uD83C\uDF2D",title:"Hot Dog"},{emoji:"\uD83E\uDD6A",title:"Sandwich"},{emoji:"\uD83C\uDF2E",title:"Taco"},{emoji:"\uD83C\uDF2F",title:"Burrito"},{emoji:"\uD83E\uDED4",title:"Tamale"},{emoji:"\uD83E\uDD59",title:"Stuffed Flatbread"},{emoji:"\uD83E\uDDC6",title:"Falafel"},{emoji:"\uD83E\uDD5A",title:"Egg"},{emoji:"\uD83C\uDF73",title:"Cooking"},{emoji:"\uD83E\uDD58",title:"Shallow Pan of Food"},{emoji:"\uD83C\uDF72",title:"Pot of Food"},{emoji:"\uD83E\uDED5",title:"Fondue"},{emoji:"\uD83E\uDD63",title:"Bowl with Spoon"},{emoji:"\uD83E\uDD57",title:"Green Salad"},{emoji:"\uD83C\uDF7F",title:"Popcorn"},{emoji:"\uD83E\uDDC8",title:"Butter"},{emoji:"\uD83E\uDDC2",title:"Salt"},{emoji:"\uD83E\uDD6B",title:"Canned Food"},{emoji:"\uD83C\uDF71",title:"Bento Box"},{emoji:"\uD83C\uDF58",title:"Rice Cracker"},{emoji:"\uD83C\uDF59",title:"Rice Ball"},{emoji:"\uD83C\uDF5A",title:"Cooked Rice"},{emoji:"\uD83C\uDF5B",title:"Curry Rice"},{emoji:"\uD83C\uDF5C",title:"Steaming Bowl"},{emoji:"\uD83C\uDF5D",title:"Spaghetti"},{emoji:"\uD83C\uDF60",title:"Roasted Sweet Potato"},{emoji:"\uD83C\uDF62",title:"Oden"},{emoji:"\uD83C\uDF63",title:"Sushi"},{emoji:"\uD83C\uDF64",title:"Fried Shrimp"},{emoji:"\uD83C\uDF65",title:"Fish Cake with Swirl"},{emoji:"\uD83E\uDD6E",title:"Moon Cake"},{emoji:"\uD83C\uDF61",title:"Dango"},{emoji:"\uD83E\uDD5F",title:"Dumpling"},{emoji:"\uD83E\uDD60",title:"Fortune Cookie"},{emoji:"\uD83E\uDD61",title:"Takeout Box"},{emoji:"\uD83E\uDDAA",title:"Oyster"},{emoji:"\uD83C\uDF66",title:"Soft Ice Cream"},{emoji:"\uD83C\uDF67",title:"Shaved Ice"},{emoji:"\uD83C\uDF68",title:"Ice Cream"},{emoji:"\uD83C\uDF69",title:"Doughnut"},{emoji:"\uD83C\uDF6A",title:"Cookie"},{emoji:"\uD83C\uDF82",title:"Birthday Cake"},{emoji:"\uD83C\uDF70",title:"Shortcake"},{emoji:"\uD83E\uDDC1",title:"Cupcake"},{emoji:"\uD83E\uDD67",title:"Pie"},{emoji:"\uD83C\uDF6B",title:"Chocolate Bar"},{emoji:"\uD83C\uDF6C",title:"Candy"},{emoji:"\uD83C\uDF6D",title:"Lollipop"},{emoji:"\uD83C\uDF6E",title:"Custard"},{emoji:"\uD83C\uDF6F",title:"Honey Pot"},{emoji:"\uD83C\uDF7C",title:"Baby Bottle"},{emoji:"\uD83E\uDD5B",title:"Glass of Milk"},{emoji:"☕",title:"Hot Beverage"},{emoji:"\uD83E\uDED6",title:"Teapot"},{emoji:"\uD83C\uDF75",title:"Teacup Without Handle"},{emoji:"\uD83C\uDF76",title:"Sake"},{emoji:"\uD83C\uDF7E",title:"Bottle with Popping Cork"},{emoji:"\uD83C\uDF77",title:"Wine Glass"},{emoji:"\uD83C\uDF78",title:"Cocktail Glass"},{emoji:"\uD83C\uDF79",title:"Tropical Drink"},{emoji:"\uD83C\uDF7A",title:"Beer Mug"},{emoji:"\uD83C\uDF7B",title:"Clinking Beer Mugs"},{emoji:"\uD83E\uDD42",title:"Clinking Glasses"},{emoji:"\uD83E\uDD43",title:"Tumbler Glass"},{emoji:"\uD83E\uDD64",title:"Cup with Straw"},{emoji:"\uD83E\uDDCB",title:"Bubble Tea"},{emoji:"\uD83E\uDDC3",title:"Beverage Box"},{emoji:"\uD83E\uDDC9",title:"Mate"},{emoji:"\uD83E\uDDCA",title:"Ice"},{emoji:"\uD83E\uDD62",title:"Chopsticks"},{emoji:"\uD83C\uDF7D️",title:"Fork and Knife with Plate"},{emoji:"\uD83C\uDF74",title:"Fork and Knife"},{emoji:"\uD83E\uDD44",title:"Spoon"}],Activity:[{emoji:"\uD83D\uDD74️",title:"Person in Suit Levitating"},{emoji:"\uD83E\uDDD7",title:"Person Climbing"},{emoji:"\uD83E\uDDD7‍♂️",title:"Man Climbing"},{emoji:"\uD83E\uDDD7‍♀️",title:"Woman Climbing"},{emoji:"\uD83E\uDD3A",title:"Person Fencing"},{emoji:"\uD83C\uDFC7",title:"Horse Racing"},{emoji:"⛷️",title:"Skier"},{emoji:"\uD83C\uDFC2",title:"Snowboarder"},{emoji:"\uD83C\uDFCC️",title:"Person Golfing"},{emoji:"\uD83C\uDFCC️‍♂️",title:"Man Golfing"},{emoji:"\uD83C\uDFCC️‍♀️",title:"Woman Golfing"},{emoji:"\uD83C\uDFC4",title:"Person Surfing"},{emoji:"\uD83C\uDFC4‍♂️",title:"Man Surfing"},{emoji:"\uD83C\uDFC4‍♀️",title:"Woman Surfing"},{emoji:"\uD83D\uDEA3",title:"Person Rowing Boat"},{emoji:"\uD83D\uDEA3‍♂️",title:"Man Rowing Boat"},{emoji:"\uD83D\uDEA3‍♀️",title:"Woman Rowing Boat"},{emoji:"\uD83C\uDFCA",title:"Person Swimming"},{emoji:"\uD83C\uDFCA‍♂️",title:"Man Swimming"},{emoji:"\uD83C\uDFCA‍♀️",title:"Woman Swimming"},{emoji:"⛹️",title:"Person Bouncing Ball"},{emoji:"⛹️‍♂️",title:"Man Bouncing Ball"},{emoji:"⛹️‍♀️",title:"Woman Bouncing Ball"},{emoji:"\uD83C\uDFCB️",title:"Person Lifting Weights"},{emoji:"\uD83C\uDFCB️‍♂️",title:"Man Lifting Weights"},{emoji:"\uD83C\uDFCB️‍♀️",title:"Woman Lifting Weights"},{emoji:"\uD83D\uDEB4",title:"Person Biking"},{emoji:"\uD83D\uDEB4‍♂️",title:"Man Biking"},{emoji:"\uD83D\uDEB4‍♀️",title:"Woman Biking"},{emoji:"\uD83D\uDEB5",title:"Person Mountain Biking"},{emoji:"\uD83D\uDEB5‍♂️",title:"Man Mountain Biking"},{emoji:"\uD83D\uDEB5‍♀️",title:"Woman Mountain Biking"},{emoji:"\uD83E\uDD38",title:"Person Cartwheeling"},{emoji:"\uD83E\uDD38‍♂️",title:"Man Cartwheeling"},{emoji:"\uD83E\uDD38‍♀️",title:"Woman Cartwheeling"},{emoji:"\uD83E\uDD3C",title:"People Wrestling"},{emoji:"\uD83E\uDD3C‍♂️",title:"Men Wrestling"},{emoji:"\uD83E\uDD3C‍♀️",title:"Women Wrestling"},{emoji:"\uD83E\uDD3D",title:"Person Playing Water Polo"},{emoji:"\uD83E\uDD3D‍♂️",title:"Man Playing Water Polo"},{emoji:"\uD83E\uDD3D‍♀️",title:"Woman Playing Water Polo"},{emoji:"\uD83E\uDD3E",title:"Person Playing Handball"},{emoji:"\uD83E\uDD3E‍♂️",title:"Man Playing Handball"},{emoji:"\uD83E\uDD3E‍♀️",title:"Woman Playing Handball"},{emoji:"\uD83E\uDD39",title:"Person Juggling"},{emoji:"\uD83E\uDD39‍♂️",title:"Man Juggling"},{emoji:"\uD83E\uDD39‍♀️",title:"Woman Juggling"},{emoji:"\uD83E\uDDD8",title:"Person in Lotus Position"},{emoji:"\uD83E\uDDD8‍♂️",title:"Man in Lotus Position"},{emoji:"\uD83E\uDDD8‍♀️",title:"Woman in Lotus Position"},{emoji:"\uD83C\uDFAA",title:"Circus Tent"},{emoji:"\uD83D\uDEF9",title:"Skateboard"},{emoji:"\uD83D\uDEFC",title:"Roller Skate"},{emoji:"\uD83D\uDEF6",title:"Canoe"},{emoji:"\uD83C\uDF97️",title:"Reminder Ribbon"},{emoji:"\uD83C\uDF9F️",title:"Admission Tickets"},{emoji:"\uD83C\uDFAB",title:"Ticket"},{emoji:"\uD83C\uDF96️",title:"Military Medal"},{emoji:"\uD83C\uDFC6",title:"Trophy"},{emoji:"\uD83C\uDFC5",title:"Sports Medal"},{emoji:"\uD83E\uDD47",title:"1st Place Medal"},{emoji:"\uD83E\uDD48",title:"2nd Place Medal"},{emoji:"\uD83E\uDD49",title:"3rd Place Medal"},{emoji:"⚽",title:"Soccer Ball"},{emoji:"⚾",title:"Baseball"},{emoji:"\uD83E\uDD4E",title:"Softball"},{emoji:"\uD83C\uDFC0",title:"Basketball"},{emoji:"\uD83C\uDFD0",title:"Volleyball"},{emoji:"\uD83C\uDFC8",title:"American Football"},{emoji:"\uD83C\uDFC9",title:"Rugby Football"},{emoji:"\uD83C\uDFBE",title:"Tennis"},{emoji:"\uD83E\uDD4F",title:"Flying Disc"},{emoji:"\uD83C\uDFB3",title:"Bowling"},{emoji:"\uD83C\uDFCF",title:"Cricket Game"},{emoji:"\uD83C\uDFD1",title:"Field Hockey"},{emoji:"\uD83C\uDFD2",title:"Ice Hockey"},{emoji:"\uD83E\uDD4D",title:"Lacrosse"},{emoji:"\uD83C\uDFD3",title:"Ping Pong"},{emoji:"\uD83C\uDFF8",title:"Badminton"},{emoji:"\uD83E\uDD4A",title:"Boxing Glove"},{emoji:"\uD83E\uDD4B",title:"Martial Arts Uniform"},{emoji:"\uD83E\uDD45",title:"Goal Net"},{emoji:"⛳",title:"Flag in Hole"},{emoji:"⛸️",title:"Ice Skate"},{emoji:"\uD83C\uDFA3",title:"Fishing Pole"},{emoji:"\uD83C\uDFBD",title:"Running Shirt"},{emoji:"\uD83C\uDFBF",title:"Skis"},{emoji:"\uD83D\uDEF7",title:"Sled"},{emoji:"\uD83E\uDD4C",title:"Curling Stone"},{emoji:"\uD83C\uDFAF",title:"Bullseye"},{emoji:"\uD83C\uDFB1",title:"Pool 8 Ball"},{emoji:"\uD83C\uDFAE",title:"Video Game"},{emoji:"\uD83C\uDFB0",title:"Slot Machine"},{emoji:"\uD83C\uDFB2",title:"Game Die"},{emoji:"\uD83E\uDDE9",title:"Puzzle Piece"},{emoji:"♟️",title:"Chess Pawn"},{emoji:"\uD83C\uDFAD",title:"Performing Arts"},{emoji:"\uD83C\uDFA8",title:"Artist Palette"},{emoji:"\uD83E\uDDF5",title:"Thread"},{emoji:"\uD83E\uDDF6",title:"Yarn"},{emoji:"\uD83C\uDFBC",title:"Musical Score"},{emoji:"\uD83C\uDFA4",title:"Microphone"},{emoji:"\uD83C\uDFA7",title:"Headphone"},{emoji:"\uD83C\uDFB7",title:"Saxophone"},{emoji:"\uD83E\uDE97",title:"Accordion"},{emoji:"\uD83C\uDFB8",title:"Guitar"},{emoji:"\uD83C\uDFB9",title:"Musical Keyboard"},{emoji:"\uD83C\uDFBA",title:"Trumpet"},{emoji:"\uD83C\uDFBB",title:"Violin"},{emoji:"\uD83E\uDD41",title:"Drum"},{emoji:"\uD83E\uDE98",title:"Long Drum"},{emoji:"\uD83C\uDFAC",title:"Clapper Board"},{emoji:"\uD83C\uDFF9",title:"Bow and Arrow"}],"Travel-places":[{emoji:"\uD83D\uDEA3",title:"Person Rowing Boat"},{emoji:"\uD83D\uDDFE",title:"Map of Japan"},{emoji:"\uD83C\uDFD4️",title:"Snow-Capped Mountain"},{emoji:"⛰️",title:"Mountain"},{emoji:"\uD83C\uDF0B",title:"Volcano"},{emoji:"\uD83D\uDDFB",title:"Mount Fuji"},{emoji:"\uD83C\uDFD5️",title:"Camping"},{emoji:"\uD83C\uDFD6️",title:"Beach with Umbrella"},{emoji:"\uD83C\uDFDC️",title:"Desert"},{emoji:"\uD83C\uDFDD️",title:"Desert Island"},{emoji:"\uD83C\uDFDE️",title:"National Park"},{emoji:"\uD83C\uDFDF️",title:"Stadium"},{emoji:"\uD83C\uDFDB️",title:"Classical Building"},{emoji:"\uD83C\uDFD7️",title:"Building Construction"},{emoji:"\uD83D\uDED6",title:"Hut"},{emoji:"\uD83C\uDFD8️",title:"Houses"},{emoji:"\uD83C\uDFDA️",title:"Derelict House"},{emoji:"\uD83C\uDFE0",title:"House"},{emoji:"\uD83C\uDFE1",title:"House with Garden"},{emoji:"\uD83C\uDFE2",title:"Office Building"},{emoji:"\uD83C\uDFE3",title:"Japanese Post Office"},{emoji:"\uD83C\uDFE4",title:"Post Office"},{emoji:"\uD83C\uDFE5",title:"Hospital"},{emoji:"\uD83C\uDFE6",title:"Bank"},{emoji:"\uD83C\uDFE8",title:"Hotel"},{emoji:"\uD83C\uDFE9",title:"Love Hotel"},{emoji:"\uD83C\uDFEA",title:"Convenience Store"},{emoji:"\uD83C\uDFEB",title:"School"},{emoji:"\uD83C\uDFEC",title:"Department Store"},{emoji:"\uD83C\uDFED",title:"Factory"},{emoji:"\uD83C\uDFEF",title:"Japanese Castle"},{emoji:"\uD83C\uDFF0",title:"Castle"},{emoji:"\uD83D\uDC92",title:"Wedding"},{emoji:"\uD83D\uDDFC",title:"Tokyo Tower"},{emoji:"\uD83D\uDDFD",title:"Statue of Liberty"},{emoji:"⛪",title:"Church"},{emoji:"\uD83D\uDD4C",title:"Mosque"},{emoji:"\uD83D\uDED5",title:"Hindu Temple"},{emoji:"\uD83D\uDD4D",title:"Synagogue"},{emoji:"⛩️",title:"Shinto Shrine"},{emoji:"\uD83D\uDD4B",title:"Kaaba"},{emoji:"⛲",title:"Fountain"},{emoji:"⛺",title:"Tent"},{emoji:"\uD83C\uDF01",title:"Foggy"},{emoji:"\uD83C\uDF03",title:"Night with Stars"},{emoji:"\uD83C\uDFD9️",title:"Cityscape"},{emoji:"\uD83C\uDF04",title:"Sunrise Over Mountains"},{emoji:"\uD83C\uDF05",title:"Sunrise"},{emoji:"\uD83C\uDF06",title:"Cityscape at Dusk"},{emoji:"\uD83C\uDF07",title:"Sunset"},{emoji:"\uD83C\uDF09",title:"Bridge at Night"},{emoji:"\uD83C\uDFA0",title:"Carousel Horse"},{emoji:"\uD83C\uDFA1",title:"Ferris Wheel"},{emoji:"\uD83C\uDFA2",title:"Roller Coaster"},{emoji:"\uD83D\uDE82",title:"Locomotive"},{emoji:"\uD83D\uDE83",title:"Railway Car"},{emoji:"\uD83D\uDE84",title:"High-Speed Train"},{emoji:"\uD83D\uDE85",title:"Bullet Train"},{emoji:"\uD83D\uDE86",title:"Train"},{emoji:"\uD83D\uDE87",title:"Metro"},{emoji:"\uD83D\uDE88",title:"Light Rail"},{emoji:"\uD83D\uDE89",title:"Station"},{emoji:"\uD83D\uDE8A",title:"Tram"},{emoji:"\uD83D\uDE9D",title:"Monorail"},{emoji:"\uD83D\uDE9E",title:"Mountain Railway"},{emoji:"\uD83D\uDE8B",title:"Tram Car"},{emoji:"\uD83D\uDE8C",title:"Bus"},{emoji:"\uD83D\uDE8D",title:"Oncoming Bus"},{emoji:"\uD83D\uDE8E",title:"Trolleybus"},{emoji:"\uD83D\uDE90",title:"Minibus"},{emoji:"\uD83D\uDE91",title:"Ambulance"},{emoji:"\uD83D\uDE92",title:"Fire Engine"},{emoji:"\uD83D\uDE93",title:"Police Car"},{emoji:"\uD83D\uDE94",title:"Oncoming Police Car"},{emoji:"\uD83D\uDE95",title:"Taxi"},{emoji:"\uD83D\uDE96",title:"Oncoming Taxi"},{emoji:"\uD83D\uDE97",title:"Automobile"},{emoji:"\uD83D\uDE98",title:"Oncoming Automobile"},{emoji:"\uD83D\uDE99",title:"Sport Utility Vehicle"},{emoji:"\uD83D\uDEFB",title:"Pickup Truck"},{emoji:"\uD83D\uDE9A",title:"Delivery Truck"},{emoji:"\uD83D\uDE9B",title:"Articulated Lorry"},{emoji:"\uD83D\uDE9C",title:"Tractor"},{emoji:"\uD83C\uDFCE️",title:"Racing Car"},{emoji:"\uD83C\uDFCD️",title:"Motorcycle"},{emoji:"\uD83D\uDEF5",title:"Motor Scooter"},{emoji:"\uD83D\uDEFA",title:"Auto Rickshaw"},{emoji:"\uD83D\uDEB2",title:"Bicycle"},{emoji:"\uD83D\uDEF4",title:"Kick Scooter"},{emoji:"\uD83D\uDE8F",title:"Bus Stop"},{emoji:"\uD83D\uDEE3️",title:"Motorway"},{emoji:"\uD83D\uDEE4️",title:"Railway Track"},{emoji:"⛽",title:"Fuel Pump"},{emoji:"\uD83D\uDEA8",title:"Police Car Light"},{emoji:"\uD83D\uDEA5",title:"Horizontal Traffic Light"},{emoji:"\uD83D\uDEA6",title:"Vertical Traffic Light"},{emoji:"\uD83D\uDEA7",title:"Construction"},{emoji:"⚓",title:"Anchor"},{emoji:"⛵",title:"Sailboat"},{emoji:"\uD83D\uDEA4",title:"Speedboat"},{emoji:"\uD83D\uDEF3️",title:"Passenger Ship"},{emoji:"⛴️",title:"Ferry"},{emoji:"\uD83D\uDEE5️",title:"Motor Boat"},{emoji:"\uD83D\uDEA2",title:"Ship"},{emoji:"✈️",title:"Airplane"},{emoji:"\uD83D\uDEE9️",title:"Small Airplane"},{emoji:"\uD83D\uDEEB",title:"Airplane Departure"},{emoji:"\uD83D\uDEEC",title:"Airplane Arrival"},{emoji:"\uD83E\uDE82",title:"Parachute"},{emoji:"\uD83D\uDCBA",title:"Seat"},{emoji:"\uD83D\uDE81",title:"Helicopter"},{emoji:"\uD83D\uDE9F",title:"Suspension Railway"},{emoji:"\uD83D\uDEA0",title:"Mountain Cableway"},{emoji:"\uD83D\uDEA1",title:"Aerial Tramway"},{emoji:"\uD83D\uDEF0️",title:"Satellite"},{emoji:"\uD83D\uDE80",title:"Rocket"},{emoji:"\uD83D\uDEF8",title:"Flying Saucer"},{emoji:"\uD83E\uDE90",title:"Ringed Planet"},{emoji:"\uD83C\uDF20",title:"Shooting Star"},{emoji:"\uD83C\uDF0C",title:"Milky Way"},{emoji:"⛱️",title:"Umbrella on Ground"},{emoji:"\uD83C\uDF86",title:"Fireworks"},{emoji:"\uD83C\uDF87",title:"Sparkler"},{emoji:"\uD83C\uDF91",title:"Moon Viewing Ceremony"},{emoji:"\uD83D\uDCB4",title:"Yen Banknote"},{emoji:"\uD83D\uDCB5",title:"Dollar Banknote"},{emoji:"\uD83D\uDCB6",title:"Euro Banknote"},{emoji:"\uD83D\uDCB7",title:"Pound Banknote"},{emoji:"\uD83D\uDDFF",title:"Moai"},{emoji:"\uD83D\uDEC2",title:"Passport Control"},{emoji:"\uD83D\uDEC3",title:"Customs"},{emoji:"\uD83D\uDEC4",title:"Baggage Claim"},{emoji:"\uD83D\uDEC5",title:"Left Luggage"}],Objects:[{emoji:"\uD83D\uDC8C",title:"Love Letter"},{emoji:"\uD83D\uDD73️",title:"Hole"},{emoji:"\uD83D\uDCA3",title:"Bomb"},{emoji:"\uD83D\uDEC0",title:"Person Taking Bath"},{emoji:"\uD83D\uDECC",title:"Person in Bed"},{emoji:"\uD83D\uDD2A",title:"Kitchen Knife"},{emoji:"\uD83C\uDFFA",title:"Amphora"},{emoji:"\uD83D\uDDFA️",title:"World Map"},{emoji:"\uD83E\uDDED",title:"Compass"},{emoji:"\uD83E\uDDF1",title:"Brick"},{emoji:"\uD83D\uDC88",title:"Barber Pole"},{emoji:"\uD83E\uDDBD",title:"Manual Wheelchair"},{emoji:"\uD83E\uDDBC",title:"Motorized Wheelchair"},{emoji:"\uD83D\uDEE2️",title:"Oil Drum"},{emoji:"\uD83D\uDECE️",title:"Bellhop Bell"},{emoji:"\uD83E\uDDF3",title:"Luggage"},{emoji:"⌛",title:"Hourglass Done"},{emoji:"⏳",title:"Hourglass Not Done"},{emoji:"⌚",title:"Watch"},{emoji:"⏰",title:"Alarm Clock"},{emoji:"⏱️",title:"Stopwatch"},{emoji:"⏲️",title:"Timer Clock"},{emoji:"\uD83D\uDD70️",title:"Mantelpiece Clock"},{emoji:"\uD83C\uDF21️",title:"Thermometer"},{emoji:"⛱️",title:"Umbrella on Ground"},{emoji:"\uD83E\uDDE8",title:"Firecracker"},{emoji:"\uD83C\uDF88",title:"Balloon"},{emoji:"\uD83C\uDF89",title:"Party Popper"},{emoji:"\uD83C\uDF8A",title:"Confetti Ball"},{emoji:"\uD83C\uDF8E",title:"Japanese Dolls"},{emoji:"\uD83C\uDF8F",title:"Carp Streamer"},{emoji:"\uD83C\uDF90",title:"Wind Chime"},{emoji:"\uD83E\uDDE7",title:"Red Envelope"},{emoji:"\uD83C\uDF80",title:"Ribbon"},{emoji:"\uD83C\uDF81",title:"Wrapped Gift"},{emoji:"\uD83E\uDD3F",title:"Diving Mask"},{emoji:"\uD83E\uDE80",title:"Yo-Yo"},{emoji:"\uD83E\uDE81",title:"Kite"},{emoji:"\uD83D\uDD2E",title:"Crystal Ball"},{emoji:"\uD83E\uDE84",title:"Magic Wand"},{emoji:"\uD83E\uDDFF",title:"Nazar Amulet"},{emoji:"\uD83D\uDD79️",title:"Joystick"},{emoji:"\uD83E\uDDF8",title:"Teddy Bear"},{emoji:"\uD83E\uDE85",title:"Pi\xf1ata"},{emoji:"\uD83E\uDE86",title:"Nesting Dolls"},{emoji:"\uD83D\uDDBC️",title:"Framed Picture"},{emoji:"\uD83E\uDDF5",title:"Thread"},{emoji:"\uD83E\uDEA1",title:"Sewing Needle"},{emoji:"\uD83E\uDDF6",title:"Yarn"},{emoji:"\uD83E\uDEA2",title:"Knot"},{emoji:"\uD83D\uDECD️",title:"Shopping Bags"},{emoji:"\uD83D\uDCFF",title:"Prayer Beads"},{emoji:"\uD83D\uDC8E",title:"Gem Stone"},{emoji:"\uD83D\uDCEF",title:"Postal Horn"},{emoji:"\uD83C\uDF99️",title:"Studio Microphone"},{emoji:"\uD83C\uDF9A️",title:"Level Slider"},{emoji:"\uD83C\uDF9B️",title:"Control Knobs"},{emoji:"\uD83D\uDCFB",title:"Radio"},{emoji:"\uD83E\uDE95",title:"Banjo"},{emoji:"\uD83D\uDCF1",title:"Mobile Phone"},{emoji:"\uD83D\uDCF2",title:"Mobile Phone with Arrow"},{emoji:"☎️",title:"Telephone"},{emoji:"\uD83D\uDCDE",title:"Telephone Receiver"},{emoji:"\uD83D\uDCDF",title:"Pager"},{emoji:"\uD83D\uDCE0",title:"Fax Machine"},{emoji:"\uD83D\uDD0B",title:"Battery"},{emoji:"\uD83D\uDD0C",title:"Electric Plug"},{emoji:"\uD83D\uDCBB",title:"Laptop"},{emoji:"\uD83D\uDDA5️",title:"Desktop Computer"},{emoji:"\uD83D\uDDA8️",title:"Printer"},{emoji:"⌨️",title:"Keyboard"},{emoji:"\uD83D\uDDB1️",title:"Computer Mouse"},{emoji:"\uD83D\uDDB2️",title:"Trackball"},{emoji:"\uD83D\uDCBD",title:"Computer Disk"},{emoji:"\uD83D\uDCBE",title:"Floppy Disk"},{emoji:"\uD83D\uDCBF",title:"Optical Disk"},{emoji:"\uD83D\uDCC0",title:"DVD"},{emoji:"\uD83E\uDDEE",title:"Abacus"},{emoji:"\uD83C\uDFA5",title:"Movie Camera"},{emoji:"\uD83C\uDF9E️",title:"Film Frames"},{emoji:"\uD83D\uDCFD️",title:"Film Projector"},{emoji:"\uD83D\uDCFA",title:"Television"},{emoji:"\uD83D\uDCF7",title:"Camera"},{emoji:"\uD83D\uDCF8",title:"Camera with Flash"},{emoji:"\uD83D\uDCF9",title:"Video Camera"},{emoji:"\uD83D\uDCFC",title:"Videocassette"},{emoji:"\uD83D\uDD0D",title:"Magnifying Glass Tilted Left"},{emoji:"\uD83D\uDD0E",title:"Magnifying Glass Tilted Right"},{emoji:"\uD83D\uDD6F️",title:"Candle"},{emoji:"\uD83D\uDCA1",title:"Light Bulb"},{emoji:"\uD83D\uDD26",title:"Flashlight"},{emoji:"\uD83C\uDFEE",title:"Red Paper Lantern"},{emoji:"\uD83E\uDE94",title:"Diya Lamp"},{emoji:"\uD83D\uDCD4",title:"Notebook with Decorative Cover"},{emoji:"\uD83D\uDCD5",title:"Closed Book"},{emoji:"\uD83D\uDCD6",title:"Open Book"},{emoji:"\uD83D\uDCD7",title:"Green Book"},{emoji:"\uD83D\uDCD8",title:"Blue Book"},{emoji:"\uD83D\uDCD9",title:"Orange Book"},{emoji:"\uD83D\uDCDA",title:"Books"},{emoji:"\uD83D\uDCD3",title:"Notebook"},{emoji:"\uD83D\uDCD2",title:"Ledger"},{emoji:"\uD83D\uDCC3",title:"Page with Curl"},{emoji:"\uD83D\uDCDC",title:"Scroll"},{emoji:"\uD83D\uDCC4",title:"Page Facing Up"},{emoji:"\uD83D\uDCF0",title:"Newspaper"},{emoji:"\uD83D\uDDDE️",title:"Rolled-Up Newspaper"},{emoji:"\uD83D\uDCD1",title:"Bookmark Tabs"},{emoji:"\uD83D\uDD16",title:"Bookmark"},{emoji:"\uD83C\uDFF7️",title:"Label"},{emoji:"\uD83D\uDCB0",title:"Money Bag"},{emoji:"\uD83E\uDE99",title:"Coin"},{emoji:"\uD83D\uDCB4",title:"Yen Banknote"},{emoji:"\uD83D\uDCB5",title:"Dollar Banknote"},{emoji:"\uD83D\uDCB6",title:"Euro Banknote"},{emoji:"\uD83D\uDCB7",title:"Pound Banknote"},{emoji:"\uD83D\uDCB8",title:"Money with Wings"},{emoji:"\uD83D\uDCB3",title:"Credit Card"},{emoji:"\uD83E\uDDFE",title:"Receipt"},{emoji:"✉️",title:"Envelope"},{emoji:"\uD83D\uDCE7",title:"E-Mail"},{emoji:"\uD83D\uDCE8",title:"Incoming Envelope"},{emoji:"\uD83D\uDCE9",title:"Envelope with Arrow"},{emoji:"\uD83D\uDCE4",title:"Outbox Tray"},{emoji:"\uD83D\uDCE5",title:"Inbox Tray"},{emoji:"\uD83D\uDCE6",title:"Package"},{emoji:"\uD83D\uDCEB",title:"Closed Mailbox with Raised Flag"},{emoji:"\uD83D\uDCEA",title:"Closed Mailbox with Lowered Flag"},{emoji:"\uD83D\uDCEC",title:"Open Mailbox with Raised Flag"},{emoji:"\uD83D\uDCED",title:"Open Mailbox with Lowered Flag"},{emoji:"\uD83D\uDCEE",title:"Postbox"},{emoji:"\uD83D\uDDF3️",title:"Ballot Box with Ballot"},{emoji:"✏️",title:"Pencil"},{emoji:"✒️",title:"Black Nib"},{emoji:"\uD83D\uDD8B️",title:"Fountain Pen"},{emoji:"\uD83D\uDD8A️",title:"Pen"},{emoji:"\uD83D\uDD8C️",title:"Paintbrush"},{emoji:"\uD83D\uDD8D️",title:"Crayon"},{emoji:"\uD83D\uDCDD",title:"Memo"},{emoji:"\uD83D\uDCC1",title:"File Folder"},{emoji:"\uD83D\uDCC2",title:"Open File Folder"},{emoji:"\uD83D\uDDC2️",title:"Card Index Dividers"},{emoji:"\uD83D\uDCC5",title:"Calendar"},{emoji:"\uD83D\uDCC6",title:"Tear-Off Calendar"},{emoji:"\uD83D\uDDD2️",title:"Spiral Notepad"},{emoji:"\uD83D\uDDD3️",title:"Spiral Calendar"},{emoji:"\uD83D\uDCC7",title:"Card Index"},{emoji:"\uD83D\uDCC8",title:"Chart Increasing"},{emoji:"\uD83D\uDCC9",title:"Chart Decreasing"},{emoji:"\uD83D\uDCCA",title:"Bar Chart"},{emoji:"\uD83D\uDCCB",title:"Clipboard"},{emoji:"\uD83D\uDCCC",title:"Pushpin"},{emoji:"\uD83D\uDCCD",title:"Round Pushpin"},{emoji:"\uD83D\uDCCE",title:"Paperclip"},{emoji:"\uD83D\uDD87️",title:"Linked Paperclips"},{emoji:"\uD83D\uDCCF",title:"Straight Ruler"},{emoji:"\uD83D\uDCD0",title:"Triangular Ruler"},{emoji:"✂️",title:"Scissors"},{emoji:"\uD83D\uDDC3️",title:"Card File Box"},{emoji:"\uD83D\uDDC4️",title:"File Cabinet"},{emoji:"\uD83D\uDDD1️",title:"Wastebasket"},{emoji:"\uD83D\uDD12",title:"Locked"},{emoji:"\uD83D\uDD13",title:"Unlocked"},{emoji:"\uD83D\uDD0F",title:"Locked with Pen"},{emoji:"\uD83D\uDD10",title:"Locked with Key"},{emoji:"\uD83D\uDD11",title:"Key"},{emoji:"\uD83D\uDDDD️",title:"Old Key"},{emoji:"\uD83D\uDD28",title:"Hammer"},{emoji:"\uD83E\uDE93",title:"Axe"},{emoji:"⛏️",title:"Pick"},{emoji:"⚒️",title:"Hammer and Pick"},{emoji:"\uD83D\uDEE0️",title:"Hammer and Wrench"},{emoji:"\uD83D\uDDE1️",title:"Dagger"},{emoji:"⚔️",title:"Crossed Swords"},{emoji:"\uD83D\uDD2B",title:"Water Pistol"},{emoji:"\uD83E\uDE83",title:"Boomerang"},{emoji:"\uD83D\uDEE1️",title:"Shield"},{emoji:"\uD83E\uDE9A",title:"Carpentry Saw"},{emoji:"\uD83D\uDD27",title:"Wrench"},{emoji:"\uD83E\uDE9B",title:"Screwdriver"},{emoji:"\uD83D\uDD29",title:"Nut and Bolt"},{emoji:"⚙️",title:"Gear"},{emoji:"\uD83D\uDDDC️",title:"Clamp"},{emoji:"⚖️",title:"Balance Scale"},{emoji:"\uD83E\uDDAF",title:"White Cane"},{emoji:"\uD83D\uDD17",title:"Link"},{emoji:"⛓️",title:"Chains"},{emoji:"\uD83E\uDE9D",title:"Hook"},{emoji:"\uD83E\uDDF0",title:"Toolbox"},{emoji:"\uD83E\uDDF2",title:"Magnet"},{emoji:"\uD83E\uDE9C",title:"Ladder"},{emoji:"⚗️",title:"Alembic"},{emoji:"\uD83E\uDDEA",title:"Test Tube"},{emoji:"\uD83E\uDDEB",title:"Petri Dish"},{emoji:"\uD83E\uDDEC",title:"DNA"},{emoji:"\uD83D\uDD2C",title:"Microscope"},{emoji:"\uD83D\uDD2D",title:"Telescope"},{emoji:"\uD83D\uDCE1",title:"Satellite Antenna"},{emoji:"\uD83D\uDC89",title:"Syringe"},{emoji:"\uD83E\uDE78",title:"Drop of Blood"},{emoji:"\uD83D\uDC8A",title:"Pill"},{emoji:"\uD83E\uDE79",title:"Adhesive Bandage"},{emoji:"\uD83E\uDE7A",title:"Stethoscope"},{emoji:"\uD83D\uDEAA",title:"Door"},{emoji:"\uD83E\uDE9E",title:"Mirror"},{emoji:"\uD83E\uDE9F",title:"Window"},{emoji:"\uD83D\uDECF️",title:"Bed"},{emoji:"\uD83D\uDECB️",title:"Couch and Lamp"},{emoji:"\uD83E\uDE91",title:"Chair"},{emoji:"\uD83D\uDEBD",title:"Toilet"},{emoji:"\uD83E\uDEA0",title:"Plunger"},{emoji:"\uD83D\uDEBF",title:"Shower"},{emoji:"\uD83D\uDEC1",title:"Bathtub"},{emoji:"\uD83E\uDEA4",title:"Mouse Trap"},{emoji:"\uD83E\uDE92",title:"Razor"},{emoji:"\uD83E\uDDF4",title:"Lotion Bottle"},{emoji:"\uD83E\uDDF7",title:"Safety Pin"},{emoji:"\uD83E\uDDF9",title:"Broom"},{emoji:"\uD83E\uDDFA",title:"Basket"},{emoji:"\uD83E\uDDFB",title:"Roll of Paper"},{emoji:"\uD83E\uDEA3",title:"Bucket"},{emoji:"\uD83E\uDDFC",title:"Soap"},{emoji:"\uD83E\uDEA5",title:"Toothbrush"},{emoji:"\uD83E\uDDFD",title:"Sponge"},{emoji:"\uD83E\uDDEF",title:"Fire Extinguisher"},{emoji:"\uD83D\uDED2",title:"Shopping Cart"},{emoji:"\uD83D\uDEAC",title:"Cigarette"},{emoji:"⚰️",title:"Coffin"},{emoji:"\uD83E\uDEA6",title:"Headstone"},{emoji:"⚱️",title:"Funeral Urn"},{emoji:"\uD83D\uDDFF",title:"Moai"},{emoji:"\uD83E\uDEA7",title:"Placard"},{emoji:"\uD83D\uDEB0",title:"Potable Water"}],Symbols:[{emoji:"\uD83D\uDC98",title:"Heart with Arrow"},{emoji:"\uD83D\uDC9D",title:"Heart with Ribbon"},{emoji:"\uD83D\uDC96",title:"Sparkling Heart"},{emoji:"\uD83D\uDC97",title:"Growing Heart"},{emoji:"\uD83D\uDC93",title:"Beating Heart"},{emoji:"\uD83D\uDC9E",title:"Revolving Hearts"},{emoji:"\uD83D\uDC95",title:"Two Hearts"},{emoji:"\uD83D\uDC9F",title:"Heart Decoration"},{emoji:"❣️",title:"Heart Exclamation"},{emoji:"\uD83D\uDC94",title:"Broken Heart"},{emoji:"❤️‍\uD83D\uDD25",title:"Heart on Fire"},{emoji:"❤️‍\uD83E\uDE79",title:"Mending Heart"},{emoji:"❤️",title:"Red Heart"},{emoji:"\uD83E\uDDE1",title:"Orange Heart"},{emoji:"\uD83D\uDC9B",title:"Yellow Heart"},{emoji:"\uD83D\uDC9A",title:"Green Heart"},{emoji:"\uD83D\uDC99",title:"Blue Heart"},{emoji:"\uD83D\uDC9C",title:"Purple Heart"},{emoji:"\uD83E\uDD0E",title:"Brown Heart"},{emoji:"\uD83D\uDDA4",title:"Black Heart"},{emoji:"\uD83E\uDD0D",title:"White Heart"},{emoji:"\uD83D\uDCAF",title:"Hundred Points"},{emoji:"\uD83D\uDCA2",title:"Anger Symbol"},{emoji:"\uD83D\uDCAC",title:"Speech Balloon"},{emoji:"\uD83D\uDC41️‍\uD83D\uDDE8️",title:"Eye in Speech Bubble"},{emoji:"\uD83D\uDDE8️",title:"Left Speech Bubble"},{emoji:"\uD83D\uDDEF️",title:"Right Anger Bubble"},{emoji:"\uD83D\uDCAD",title:"Thought Balloon"},{emoji:"\uD83D\uDCA4",title:"Zzz"},{emoji:"\uD83D\uDCAE",title:"White Flower"},{emoji:"♨️",title:"Hot Springs"},{emoji:"\uD83D\uDC88",title:"Barber Pole"},{emoji:"\uD83D\uDED1",title:"Stop Sign"},{emoji:"\uD83D\uDD5B",title:"Twelve O’Clock"},{emoji:"\uD83D\uDD67",title:"Twelve-Thirty"},{emoji:"\uD83D\uDD50",title:"One O’Clock"},{emoji:"\uD83D\uDD5C",title:"One-Thirty"},{emoji:"\uD83D\uDD51",title:"Two O’Clock"},{emoji:"\uD83D\uDD5D",title:"Two-Thirty"},{emoji:"\uD83D\uDD52",title:"Three O’Clock"},{emoji:"\uD83D\uDD5E",title:"Three-Thirty"},{emoji:"\uD83D\uDD53",title:"Four O’Clock"},{emoji:"\uD83D\uDD5F",title:"Four-Thirty"},{emoji:"\uD83D\uDD54",title:"Five O’Clock"},{emoji:"\uD83D\uDD60",title:"Five-Thirty"},{emoji:"\uD83D\uDD55",title:"Six O’Clock"},{emoji:"\uD83D\uDD61",title:"Six-Thirty"},{emoji:"\uD83D\uDD56",title:"Seven O’Clock"},{emoji:"\uD83D\uDD62",title:"Seven-Thirty"},{emoji:"\uD83D\uDD57",title:"Eight O’Clock"},{emoji:"\uD83D\uDD63",title:"Eight-Thirty"},{emoji:"\uD83D\uDD58",title:"Nine O’Clock"},{emoji:"\uD83D\uDD64",title:"Nine-Thirty"},{emoji:"\uD83D\uDD59",title:"Ten O’Clock"},{emoji:"\uD83D\uDD65",title:"Ten-Thirty"},{emoji:"\uD83D\uDD5A",title:"Eleven O’Clock"},{emoji:"\uD83D\uDD66",title:"Eleven-Thirty"},{emoji:"\uD83C\uDF00",title:"Cyclone"},{emoji:"♠️",title:"Spade Suit"},{emoji:"♥️",title:"Heart Suit"},{emoji:"♦️",title:"Diamond Suit"},{emoji:"♣️",title:"Club Suit"},{emoji:"\uD83C\uDCCF",title:"Joker"},{emoji:"\uD83C\uDC04",title:"Mahjong Red Dragon"},{emoji:"\uD83C\uDFB4",title:"Flower Playing Cards"},{emoji:"\uD83D\uDD07",title:"Muted Speaker"},{emoji:"\uD83D\uDD08",title:"Speaker Low Volume"},{emoji:"\uD83D\uDD09",title:"Speaker Medium Volume"},{emoji:"\uD83D\uDD0A",title:"Speaker High Volume"},{emoji:"\uD83D\uDCE2",title:"Loudspeaker"},{emoji:"\uD83D\uDCE3",title:"Megaphone"},{emoji:"\uD83D\uDCEF",title:"Postal Horn"},{emoji:"\uD83D\uDD14",title:"Bell"},{emoji:"\uD83D\uDD15",title:"Bell with Slash"},{emoji:"\uD83C\uDFB5",title:"Musical Note"},{emoji:"\uD83C\uDFB6",title:"Musical Notes"},{emoji:"\uD83D\uDCB9",title:"Chart Increasing with Yen"},{emoji:"\uD83D\uDED7",title:"Elevator"},{emoji:"\uD83C\uDFE7",title:"ATM Sign"},{emoji:"\uD83D\uDEAE",title:"Litter in Bin Sign"},{emoji:"\uD83D\uDEB0",title:"Potable Water"},{emoji:"♿",title:"Wheelchair Symbol"},{emoji:"\uD83D\uDEB9",title:"Men’s Room"},{emoji:"\uD83D\uDEBA",title:"Women’s Room"},{emoji:"\uD83D\uDEBB",title:"Restroom"},{emoji:"\uD83D\uDEBC",title:"Baby Symbol"},{emoji:"\uD83D\uDEBE",title:"Water Closet"},{emoji:"⚠️",title:"Warning"},{emoji:"\uD83D\uDEB8",title:"Children Crossing"},{emoji:"⛔",title:"No Entry"},{emoji:"\uD83D\uDEAB",title:"Prohibited"},{emoji:"\uD83D\uDEB3",title:"No Bicycles"},{emoji:"\uD83D\uDEAD",title:"No Smoking"},{emoji:"\uD83D\uDEAF",title:"No Littering"},{emoji:"\uD83D\uDEB1",title:"Non-Potable Water"},{emoji:"\uD83D\uDEB7",title:"No Pedestrians"},{emoji:"\uD83D\uDCF5",title:"No Mobile Phones"},{emoji:"\uD83D\uDD1E",title:"No One Under Eighteen"},{emoji:"☢️",title:"Radioactive"},{emoji:"☣️",title:"Biohazard"},{emoji:"⬆️",title:"Up Arrow"},{emoji:"↗️",title:"Up-Right Arrow"},{emoji:"➡️",title:"Right Arrow"},{emoji:"↘️",title:"Down-Right Arrow"},{emoji:"⬇️",title:"Down Arrow"},{emoji:"↙️",title:"Down-Left Arrow"},{emoji:"⬅️",title:"Left Arrow"},{emoji:"↖️",title:"Up-Left Arrow"},{emoji:"↕️",title:"Up-Down Arrow"},{emoji:"↔️",title:"Left-Right Arrow"},{emoji:"↩️",title:"Right Arrow Curving Left"},{emoji:"↪️",title:"Left Arrow Curving Right"},{emoji:"⤴️",title:"Right Arrow Curving Up"},{emoji:"⤵️",title:"Right Arrow Curving Down"},{emoji:"\uD83D\uDD03",title:"Clockwise Vertical Arrows"},{emoji:"\uD83D\uDD04",title:"Counterclockwise Arrows Button"},{emoji:"\uD83D\uDD19",title:"Back Arrow"},{emoji:"\uD83D\uDD1A",title:"End Arrow"},{emoji:"\uD83D\uDD1B",title:"On! Arrow"},{emoji:"\uD83D\uDD1C",title:"Soon Arrow"},{emoji:"\uD83D\uDD1D",title:"Top Arrow"},{emoji:"\uD83D\uDED0",title:"Place of Worship"},{emoji:"⚛️",title:"Atom Symbol"},{emoji:"\uD83D\uDD49️",title:"Om"},{emoji:"✡️",title:"Star of David"},{emoji:"☸️",title:"Wheel of Dharma"},{emoji:"☯️",title:"Yin Yang"},{emoji:"✝️",title:"Latin Cross"},{emoji:"☦️",title:"Orthodox Cross"},{emoji:"☪️",title:"Star and Crescent"},{emoji:"☮️",title:"Peace Symbol"},{emoji:"\uD83D\uDD4E",title:"Menorah"},{emoji:"\uD83D\uDD2F",title:"Dotted Six-Pointed Star"},{emoji:"♈",title:"Aries"},{emoji:"♉",title:"Taurus"},{emoji:"♊",title:"Gemini"},{emoji:"♋",title:"Cancer"},{emoji:"♌",title:"Leo"},{emoji:"♍",title:"Virgo"},{emoji:"♎",title:"Libra"},{emoji:"♏",title:"Scorpio"},{emoji:"♐",title:"Sagittarius"},{emoji:"♑",title:"Capricorn"},{emoji:"♒",title:"Aquarius"},{emoji:"♓",title:"Pisces"},{emoji:"⛎",title:"Ophiuchus"},{emoji:"\uD83D\uDD00",title:"Shuffle Tracks Button"},{emoji:"\uD83D\uDD01",title:"Repeat Button"},{emoji:"\uD83D\uDD02",title:"Repeat Single Button"},{emoji:"▶️",title:"Play Button"},{emoji:"⏩",title:"Fast-Forward Button"},{emoji:"⏭️",title:"Next Track Button"},{emoji:"⏯️",title:"Play or Pause Button"},{emoji:"◀️",title:"Reverse Button"},{emoji:"⏪",title:"Fast Reverse Button"},{emoji:"⏮️",title:"Last Track Button"},{emoji:"\uD83D\uDD3C",title:"Upwards Button"},{emoji:"⏫",title:"Fast Up Button"},{emoji:"\uD83D\uDD3D",title:"Downwards Button"},{emoji:"⏬",title:"Fast Down Button"},{emoji:"⏸️",title:"Pause Button"},{emoji:"⏹️",title:"Stop Button"},{emoji:"⏺️",title:"Record Button"},{emoji:"⏏️",title:"Eject Button"},{emoji:"\uD83C\uDFA6",title:"Cinema"},{emoji:"\uD83D\uDD05",title:"Dim Button"},{emoji:"\uD83D\uDD06",title:"Bright Button"},{emoji:"\uD83D\uDCF6",title:"Antenna Bars"},{emoji:"\uD83D\uDCF3",title:"Vibration Mode"},{emoji:"\uD83D\uDCF4",title:"Mobile Phone Off"},{emoji:"♀️",title:"Female Sign"},{emoji:"♂️",title:"Male Sign"},{emoji:"✖️",title:"Multiply"},{emoji:"➕",title:"Plus"},{emoji:"➖",title:"Minus"},{emoji:"➗",title:"Divide"},{emoji:"♾️",title:"Infinity"},{emoji:"‼️",title:"‼ Double Exclamation Mark"},{emoji:"⁉️",title:"⁉ Exclamation Question Mark"},{emoji:"❓",title:"Red Question Mark"},{emoji:"❔",title:"White Question Mark"},{emoji:"❕",title:"White Exclamation Mark"},{emoji:"❗",title:"Red Exclamation Mark"},{emoji:"〰️",title:"〰 Wavy Dash"},{emoji:"\uD83D\uDCB1",title:"Currency Exchange"},{emoji:"\uD83D\uDCB2",title:"Heavy Dollar Sign"},{emoji:"⚕️",title:"Medical Symbol"},{emoji:"♻️",title:"Recycling Symbol"},{emoji:"⚜️",title:"Fleur-de-lis"},{emoji:"\uD83D\uDD31",title:"Trident Emblem"},{emoji:"\uD83D\uDCDB",title:"Name Badge"},{emoji:"\uD83D\uDD30",title:"Japanese Symbol for Beginner"},{emoji:"⭕",title:"Hollow Red Circle"},{emoji:"✅",title:"Check Mark Button"},{emoji:"☑️",title:"Check Box with Check"},{emoji:"✔️",title:"Check Mark"},{emoji:"❌",title:"Cross Mark"},{emoji:"❎",title:"Cross Mark Button"},{emoji:"➰",title:"Curly Loop"},{emoji:"➿",title:"Double Curly Loop"},{emoji:"〽️",title:"〽 Part Alternation Mark"},{emoji:"✳️",title:"Eight-Spoked Asterisk"},{emoji:"✴️",title:"Eight-Pointed Star"},{emoji:"❇️",title:"Sparkle"},{emoji:"\xa9️",title:"Copyright"},{emoji:"\xae️",title:"Registered"},{emoji:"™️",title:"Trade Mark"},{emoji:"#️⃣",title:"# Keycap Number Sign"},{emoji:"*️⃣",title:"* Keycap Asterisk"},{emoji:"0️⃣",title:"0 Keycap Digit Zero"},{emoji:"1️⃣",title:"1 Keycap Digit One"},{emoji:"2️⃣",title:"2 Keycap Digit Two"},{emoji:"3️⃣",title:"3 Keycap Digit Three"},{emoji:"4️⃣",title:"4 Keycap Digit Four"},{emoji:"5️⃣",title:"5 Keycap Digit Five"},{emoji:"6️⃣",title:"6 Keycap Digit Six"},{emoji:"7️⃣",title:"7 Keycap Digit Seven"},{emoji:"8️⃣",title:"8 Keycap Digit Eight"},{emoji:"9️⃣",title:"9 Keycap Digit Nine"},{emoji:"\uD83D\uDD1F",title:"Keycap: 10"},{emoji:"\uD83D\uDD20",title:"Input Latin Uppercase"},{emoji:"\uD83D\uDD21",title:"Input Latin Lowercase"},{emoji:"\uD83D\uDD22",title:"Input Numbers"},{emoji:"\uD83D\uDD23",title:"Input Symbols"},{emoji:"\uD83D\uDD24",title:"Input Latin Letters"},{emoji:"\uD83C\uDD70️",title:"A Button (Blood Type)"},{emoji:"\uD83C\uDD8E",title:"AB Button (Blood Type)"},{emoji:"\uD83C\uDD71️",title:"B Button (Blood Type)"},{emoji:"\uD83C\uDD91",title:"CL Button"},{emoji:"\uD83C\uDD92",title:"Cool Button"},{emoji:"\uD83C\uDD93",title:"Free Button"},{emoji:"ℹ️",title:"ℹ Information"},{emoji:"\uD83C\uDD94",title:"ID Button"},{emoji:"Ⓜ️",title:"Circled M"},{emoji:"\uD83C\uDD95",title:"New Button"},{emoji:"\uD83C\uDD96",title:"NG Button"},{emoji:"\uD83C\uDD7E️",title:"O Button (Blood Type)"},{emoji:"\uD83C\uDD97",title:"OK Button"},{emoji:"\uD83C\uDD7F️",title:"P Button"},{emoji:"\uD83C\uDD98",title:"SOS Button"},{emoji:"\uD83C\uDD99",title:"Up! Button"},{emoji:"\uD83C\uDD9A",title:"Vs Button"},{emoji:"\uD83C\uDE01",title:"Japanese “Here” Button"},{emoji:"\uD83C\uDE02️",title:"Japanese “Service Charge” Button"},{emoji:"\uD83C\uDE37️",title:"Japanese “Monthly Amount” Button"},{emoji:"\uD83C\uDE36",title:"Japanese “Not Free of Charge” Button"},{emoji:"\uD83C\uDE2F",title:"Japanese “Reserved” Button"},{emoji:"\uD83C\uDE50",title:"Japanese “Bargain” Button"},{emoji:"\uD83C\uDE39",title:"Japanese “Discount” Button"},{emoji:"\uD83C\uDE1A",title:"Japanese “Free of Charge” Button"},{emoji:"\uD83C\uDE32",title:"Japanese “Prohibited” Button"},{emoji:"\uD83C\uDE51",title:"Japanese “Acceptable” Button"},{emoji:"\uD83C\uDE38",title:"Japanese “Application” Button"},{emoji:"\uD83C\uDE34",title:"Japanese “Passing Grade” Button"},{emoji:"\uD83C\uDE33",title:"Japanese “Vacancy” Button"},{emoji:"㊗️",title:"Japanese “Congratulations” Button"},{emoji:"㊙️",title:"Japanese “Secret” Button"},{emoji:"\uD83C\uDE3A",title:"Japanese “Open for Business” Button"},{emoji:"\uD83C\uDE35",title:"Japanese “No Vacancy” Button"},{emoji:"\uD83D\uDD34",title:"Red Circle"},{emoji:"\uD83D\uDFE0",title:"Orange Circle"},{emoji:"\uD83D\uDFE1",title:"Yellow Circle"},{emoji:"\uD83D\uDFE2",title:"Green Circle"},{emoji:"\uD83D\uDD35",title:"Blue Circle"},{emoji:"\uD83D\uDFE3",title:"Purple Circle"},{emoji:"\uD83D\uDFE4",title:"Brown Circle"},{emoji:"⚫",title:"Black Circle"},{emoji:"⚪",title:"White Circle"},{emoji:"\uD83D\uDFE5",title:"Red Square"},{emoji:"\uD83D\uDFE7",title:"Orange Square"},{emoji:"\uD83D\uDFE8",title:"Yellow Square"},{emoji:"\uD83D\uDFE9",title:"Green Square"},{emoji:"\uD83D\uDFE6",title:"Blue Square"},{emoji:"\uD83D\uDFEA",title:"Purple Square"},{emoji:"\uD83D\uDFEB",title:"Brown Square"},{emoji:"⬛",title:"Black Large Square"},{emoji:"⬜",title:"White Large Square"},{emoji:"◼️",title:"Black Medium Square"},{emoji:"◻️",title:"White Medium Square"},{emoji:"◾",title:"Black Medium-Small Square"},{emoji:"◽",title:"White Medium-Small Square"},{emoji:"▪️",title:"Black Small Square"},{emoji:"▫️",title:"White Small Square"},{emoji:"\uD83D\uDD36",title:"Large Orange Diamond"},{emoji:"\uD83D\uDD37",title:"Large Blue Diamond"},{emoji:"\uD83D\uDD38",title:"Small Orange Diamond"},{emoji:"\uD83D\uDD39",title:"Small Blue Diamond"},{emoji:"\uD83D\uDD3A",title:"Red Triangle Pointed Up"},{emoji:"\uD83D\uDD3B",title:"Red Triangle Pointed Down"},{emoji:"\uD83D\uDCA0",title:"Diamond with a Dot"},{emoji:"\uD83D\uDD18",title:"Radio Button"},{emoji:"\uD83D\uDD33",title:"White Square Button"},{emoji:"\uD83D\uDD32",title:"Black Square Button"}],Flags:[{emoji:"\uD83C\uDFC1",title:"Chequered Flag"},{emoji:"\uD83D\uDEA9",title:"Triangular Flag"},{emoji:"\uD83C\uDF8C",title:"Crossed Flags"},{emoji:"\uD83C\uDFF4",title:"Black Flag"},{emoji:"\uD83C\uDFF3️",title:"White Flag"},{emoji:"\uD83C\uDFF3️‍\uD83C\uDF08",title:"Rainbow Flag"},{emoji:"\uD83C\uDFF3️‍⚧️",title:"Transgender Flag"},{emoji:"\uD83C\uDFF4‍☠️",title:"Pirate Flag"},{emoji:"\uD83C\uDDE6\uD83C\uDDE8",title:"Flag: Ascension Island"},{emoji:"\uD83C\uDDE6\uD83C\uDDE9",title:"Flag: Andorra"},{emoji:"\uD83C\uDDE6\uD83C\uDDEA",title:"Flag: United Arab Emirates"},{emoji:"\uD83C\uDDE6\uD83C\uDDEB",title:"Flag: Afghanistan"},{emoji:"\uD83C\uDDE6\uD83C\uDDEC",title:"Flag: Antigua & Barbuda"},{emoji:"\uD83C\uDDE6\uD83C\uDDEE",title:"Flag: Anguilla"},{emoji:"\uD83C\uDDE6\uD83C\uDDF1",title:"Flag: Albania"},{emoji:"\uD83C\uDDE6\uD83C\uDDF2",title:"Flag: Armenia"},{emoji:"\uD83C\uDDE6\uD83C\uDDF4",title:"Flag: Angola"},{emoji:"\uD83C\uDDE6\uD83C\uDDF6",title:"Flag: Antarctica"},{emoji:"\uD83C\uDDE6\uD83C\uDDF7",title:"Flag: Argentina"},{emoji:"\uD83C\uDDE6\uD83C\uDDF8",title:"Flag: American Samoa"},{emoji:"\uD83C\uDDE6\uD83C\uDDF9",title:"Flag: Austria"},{emoji:"\uD83C\uDDE6\uD83C\uDDFA",title:"Flag: Australia"},{emoji:"\uD83C\uDDE6\uD83C\uDDFC",title:"Flag: Aruba"},{emoji:"\uD83C\uDDE6\uD83C\uDDFD",title:"Flag: \xc5land Islands"},{emoji:"\uD83C\uDDE6\uD83C\uDDFF",title:"Flag: Azerbaijan"},{emoji:"\uD83C\uDDE7\uD83C\uDDE6",title:"Flag: Bosnia & Herzegovina"},{emoji:"\uD83C\uDDE7\uD83C\uDDE7",title:"Flag: Barbados"},{emoji:"\uD83C\uDDE7\uD83C\uDDE9",title:"Flag: Bangladesh"},{emoji:"\uD83C\uDDE7\uD83C\uDDEA",title:"Flag: Belgium"},{emoji:"\uD83C\uDDE7\uD83C\uDDEB",title:"Flag: Burkina Faso"},{emoji:"\uD83C\uDDE7\uD83C\uDDEC",title:"Flag: Bulgaria"},{emoji:"\uD83C\uDDE7\uD83C\uDDED",title:"Flag: Bahrain"},{emoji:"\uD83C\uDDE7\uD83C\uDDEE",title:"Flag: Burundi"},{emoji:"\uD83C\uDDE7\uD83C\uDDEF",title:"Flag: Benin"},{emoji:"\uD83C\uDDE7\uD83C\uDDF1",title:"Flag: St. Barth\xe9lemy"},{emoji:"\uD83C\uDDE7\uD83C\uDDF2",title:"Flag: Bermuda"},{emoji:"\uD83C\uDDE7\uD83C\uDDF3",title:"Flag: Brunei"},{emoji:"\uD83C\uDDE7\uD83C\uDDF4",title:"Flag: Bolivia"},{emoji:"\uD83C\uDDE7\uD83C\uDDF6",title:"Flag: Caribbean Netherlands"},{emoji:"\uD83C\uDDE7\uD83C\uDDF7",title:"Flag: Brazil"},{emoji:"\uD83C\uDDE7\uD83C\uDDF8",title:"Flag: Bahamas"},{emoji:"\uD83C\uDDE7\uD83C\uDDF9",title:"Flag: Bhutan"},{emoji:"\uD83C\uDDE7\uD83C\uDDFB",title:"Flag: Bouvet Island"},{emoji:"\uD83C\uDDE7\uD83C\uDDFC",title:"Flag: Botswana"},{emoji:"\uD83C\uDDE7\uD83C\uDDFE",title:"Flag: Belarus"},{emoji:"\uD83C\uDDE7\uD83C\uDDFF",title:"Flag: Belize"},{emoji:"\uD83C\uDDE8\uD83C\uDDE6",title:"Flag: Canada"},{emoji:"\uD83C\uDDE8\uD83C\uDDE8",title:"Flag: Cocos (Keeling) Islands"},{emoji:"\uD83C\uDDE8\uD83C\uDDE9",title:"Flag: Congo - Kinshasa"},{emoji:"\uD83C\uDDE8\uD83C\uDDEB",title:"Flag: Central African Republic"},{emoji:"\uD83C\uDDE8\uD83C\uDDEC",title:"Flag: Congo - Brazzaville"},{emoji:"\uD83C\uDDE8\uD83C\uDDED",title:"Flag: Switzerland"},{emoji:"\uD83C\uDDE8\uD83C\uDDEE",title:"Flag: C\xf4te d’Ivoire"},{emoji:"\uD83C\uDDE8\uD83C\uDDF0",title:"Flag: Cook Islands"},{emoji:"\uD83C\uDDE8\uD83C\uDDF1",title:"Flag: Chile"},{emoji:"\uD83C\uDDE8\uD83C\uDDF2",title:"Flag: Cameroon"},{emoji:"\uD83C\uDDE8\uD83C\uDDF3",title:"Flag: China"},{emoji:"\uD83C\uDDE8\uD83C\uDDF4",title:"Flag: Colombia"},{emoji:"\uD83C\uDDE8\uD83C\uDDF5",title:"Flag: Clipperton Island"},{emoji:"\uD83C\uDDE8\uD83C\uDDF7",title:"Flag: Costa Rica"},{emoji:"\uD83C\uDDE8\uD83C\uDDFA",title:"Flag: Cuba"},{emoji:"\uD83C\uDDE8\uD83C\uDDFB",title:"Flag: Cape Verde"},{emoji:"\uD83C\uDDE8\uD83C\uDDFC",title:"Flag: Cura\xe7ao"},{emoji:"\uD83C\uDDE8\uD83C\uDDFD",title:"Flag: Christmas Island"},{emoji:"\uD83C\uDDE8\uD83C\uDDFE",title:"Flag: Cyprus"},{emoji:"\uD83C\uDDE8\uD83C\uDDFF",title:"Flag: Czechia"},{emoji:"\uD83C\uDDE9\uD83C\uDDEA",title:"Flag: Germany"},{emoji:"\uD83C\uDDE9\uD83C\uDDEC",title:"Flag: Diego Garcia"},{emoji:"\uD83C\uDDE9\uD83C\uDDEF",title:"Flag: Djibouti"},{emoji:"\uD83C\uDDE9\uD83C\uDDF0",title:"Flag: Denmark"},{emoji:"\uD83C\uDDE9\uD83C\uDDF2",title:"Flag: Dominica"},{emoji:"\uD83C\uDDE9\uD83C\uDDF4",title:"Flag: Dominican Republic"},{emoji:"\uD83C\uDDE9\uD83C\uDDFF",title:"Flag: Algeria"},{emoji:"\uD83C\uDDEA\uD83C\uDDE6",title:"Flag: Ceuta & Melilla"},{emoji:"\uD83C\uDDEA\uD83C\uDDE8",title:"Flag: Ecuador"},{emoji:"\uD83C\uDDEA\uD83C\uDDEA",title:"Flag: Estonia"},{emoji:"\uD83C\uDDEA\uD83C\uDDEC",title:"Flag: Egypt"},{emoji:"\uD83C\uDDEA\uD83C\uDDED",title:"Flag: Western Sahara"},{emoji:"\uD83C\uDDEA\uD83C\uDDF7",title:"Flag: Eritrea"},{emoji:"\uD83C\uDDEA\uD83C\uDDF8",title:"Flag: Spain"},{emoji:"\uD83C\uDDEA\uD83C\uDDF9",title:"Flag: Ethiopia"},{emoji:"\uD83C\uDDEA\uD83C\uDDFA",title:"Flag: European Union"},{emoji:"\uD83C\uDDEB\uD83C\uDDEE",title:"Flag: Finland"},{emoji:"\uD83C\uDDEB\uD83C\uDDEF",title:"Flag: Fiji"},{emoji:"\uD83C\uDDEB\uD83C\uDDF0",title:"Flag: Falkland Islands"},{emoji:"\uD83C\uDDEB\uD83C\uDDF2",title:"Flag: Micronesia"},{emoji:"\uD83C\uDDEB\uD83C\uDDF4",title:"Flag: Faroe Islands"},{emoji:"\uD83C\uDDEB\uD83C\uDDF7",title:"Flag: France"},{emoji:"\uD83C\uDDEC\uD83C\uDDE6",title:"Flag: Gabon"},{emoji:"\uD83C\uDDEC\uD83C\uDDE7",title:"Flag: United Kingdom"},{emoji:"\uD83C\uDDEC\uD83C\uDDE9",title:"Flag: Grenada"},{emoji:"\uD83C\uDDEC\uD83C\uDDEA",title:"Flag: Georgia"},{emoji:"\uD83C\uDDEC\uD83C\uDDEB",title:"Flag: French Guiana"},{emoji:"\uD83C\uDDEC\uD83C\uDDEC",title:"Flag: Guernsey"},{emoji:"\uD83C\uDDEC\uD83C\uDDED",title:"Flag: Ghana"},{emoji:"\uD83C\uDDEC\uD83C\uDDEE",title:"Flag: Gibraltar"},{emoji:"\uD83C\uDDEC\uD83C\uDDF1",title:"Flag: Greenland"},{emoji:"\uD83C\uDDEC\uD83C\uDDF2",title:"Flag: Gambia"},{emoji:"\uD83C\uDDEC\uD83C\uDDF3",title:"Flag: Guinea"},{emoji:"\uD83C\uDDEC\uD83C\uDDF5",title:"Flag: Guadeloupe"},{emoji:"\uD83C\uDDEC\uD83C\uDDF6",title:"Flag: Equatorial Guinea"},{emoji:"\uD83C\uDDEC\uD83C\uDDF7",title:"Flag: Greece"},{emoji:"\uD83C\uDDEC\uD83C\uDDF8",title:"Flag: South Georgia & South Sandwich Islands"},{emoji:"\uD83C\uDDEC\uD83C\uDDF9",title:"Flag: Guatemala"},{emoji:"\uD83C\uDDEC\uD83C\uDDFA",title:"Flag: Guam"},{emoji:"\uD83C\uDDEC\uD83C\uDDFC",title:"Flag: Guinea-Bissau"},{emoji:"\uD83C\uDDEC\uD83C\uDDFE",title:"Flag: Guyana"},{emoji:"\uD83C\uDDED\uD83C\uDDF0",title:"Flag: Hong Kong SAR China"},{emoji:"\uD83C\uDDED\uD83C\uDDF2",title:"Flag: Heard & McDonald Islands"},{emoji:"\uD83C\uDDED\uD83C\uDDF3",title:"Flag: Honduras"},{emoji:"\uD83C\uDDED\uD83C\uDDF7",title:"Flag: Croatia"},{emoji:"\uD83C\uDDED\uD83C\uDDF9",title:"Flag: Haiti"},{emoji:"\uD83C\uDDED\uD83C\uDDFA",title:"Flag: Hungary"},{emoji:"\uD83C\uDDEE\uD83C\uDDE8",title:"Flag: Canary Islands"},{emoji:"\uD83C\uDDEE\uD83C\uDDE9",title:"Flag: Indonesia"},{emoji:"\uD83C\uDDEE\uD83C\uDDEA",title:"Flag: Ireland"},{emoji:"\uD83C\uDDEE\uD83C\uDDF1",title:"Flag: Israel"},{emoji:"\uD83C\uDDEE\uD83C\uDDF2",title:"Flag: Isle of Man"},{emoji:"\uD83C\uDDEE\uD83C\uDDF3",title:"Flag: India"},{emoji:"\uD83C\uDDEE\uD83C\uDDF4",title:"Flag: British Indian Ocean Territory"},{emoji:"\uD83C\uDDEE\uD83C\uDDF6",title:"Flag: Iraq"},{emoji:"\uD83C\uDDEE\uD83C\uDDF7",title:"Flag: Iran"},{emoji:"\uD83C\uDDEE\uD83C\uDDF8",title:"Flag: Iceland"},{emoji:"\uD83C\uDDEE\uD83C\uDDF9",title:"Flag: Italy"},{emoji:"\uD83C\uDDEF\uD83C\uDDEA",title:"Flag: Jersey"},{emoji:"\uD83C\uDDEF\uD83C\uDDF2",title:"Flag: Jamaica"},{emoji:"\uD83C\uDDEF\uD83C\uDDF4",title:"Flag: Jordan"},{emoji:"\uD83C\uDDEF\uD83C\uDDF5",title:"Flag: Japan"},{emoji:"\uD83C\uDDF0\uD83C\uDDEA",title:"Flag: Kenya"},{emoji:"\uD83C\uDDF0\uD83C\uDDEC",title:"Flag: Kyrgyzstan"},{emoji:"\uD83C\uDDF0\uD83C\uDDED",title:"Flag: Cambodia"},{emoji:"\uD83C\uDDF0\uD83C\uDDEE",title:"Flag: Kiribati"},{emoji:"\uD83C\uDDF0\uD83C\uDDF2",title:"Flag: Comoros"},{emoji:"\uD83C\uDDF0\uD83C\uDDF3",title:"Flag: St. Kitts & Nevis"},{emoji:"\uD83C\uDDF0\uD83C\uDDF5",title:"Flag: North Korea"},{emoji:"\uD83C\uDDF0\uD83C\uDDF7",title:"Flag: South Korea"},{emoji:"\uD83C\uDDF0\uD83C\uDDFC",title:"Flag: Kuwait"},{emoji:"\uD83C\uDDF0\uD83C\uDDFE",title:"Flag: Cayman Islands"},{emoji:"\uD83C\uDDF0\uD83C\uDDFF",title:"Flag: Kazakhstan"},{emoji:"\uD83C\uDDF1\uD83C\uDDE6",title:"Flag: Laos"},{emoji:"\uD83C\uDDF1\uD83C\uDDE7",title:"Flag: Lebanon"},{emoji:"\uD83C\uDDF1\uD83C\uDDE8",title:"Flag: St. Lucia"},{emoji:"\uD83C\uDDF1\uD83C\uDDEE",title:"Flag: Liechtenstein"},{emoji:"\uD83C\uDDF1\uD83C\uDDF0",title:"Flag: Sri Lanka"},{emoji:"\uD83C\uDDF1\uD83C\uDDF7",title:"Flag: Liberia"},{emoji:"\uD83C\uDDF1\uD83C\uDDF8",title:"Flag: Lesotho"},{emoji:"\uD83C\uDDF1\uD83C\uDDF9",title:"Flag: Lithuania"},{emoji:"\uD83C\uDDF1\uD83C\uDDFA",title:"Flag: Luxembourg"},{emoji:"\uD83C\uDDF1\uD83C\uDDFB",title:"Flag: Latvia"},{emoji:"\uD83C\uDDF1\uD83C\uDDFE",title:"Flag: Libya"},{emoji:"\uD83C\uDDF2\uD83C\uDDE6",title:"Flag: Morocco"},{emoji:"\uD83C\uDDF2\uD83C\uDDE8",title:"Flag: Monaco"},{emoji:"\uD83C\uDDF2\uD83C\uDDE9",title:"Flag: Moldova"},{emoji:"\uD83C\uDDF2\uD83C\uDDEA",title:"Flag: Montenegro"},{emoji:"\uD83C\uDDF2\uD83C\uDDEB",title:"Flag: St. Martin"},{emoji:"\uD83C\uDDF2\uD83C\uDDEC",title:"Flag: Madagascar"},{emoji:"\uD83C\uDDF2\uD83C\uDDED",title:"Flag: Marshall Islands"},{emoji:"\uD83C\uDDF2\uD83C\uDDF0",title:"Flag: North Macedonia"},{emoji:"\uD83C\uDDF2\uD83C\uDDF1",title:"Flag: Mali"},{emoji:"\uD83C\uDDF2\uD83C\uDDF2",title:"Flag: Myanmar (Burma)"},{emoji:"\uD83C\uDDF2\uD83C\uDDF3",title:"Flag: Mongolia"},{emoji:"\uD83C\uDDF2\uD83C\uDDF4",title:"Flag: Macao Sar China"},{emoji:"\uD83C\uDDF2\uD83C\uDDF5",title:"Flag: Northern Mariana Islands"},{emoji:"\uD83C\uDDF2\uD83C\uDDF6",title:"Flag: Martinique"},{emoji:"\uD83C\uDDF2\uD83C\uDDF7",title:"Flag: Mauritania"},{emoji:"\uD83C\uDDF2\uD83C\uDDF8",title:"Flag: Montserrat"},{emoji:"\uD83C\uDDF2\uD83C\uDDF9",title:"Flag: Malta"},{emoji:"\uD83C\uDDF2\uD83C\uDDFA",title:"Flag: Mauritius"},{emoji:"\uD83C\uDDF2\uD83C\uDDFB",title:"Flag: Maldives"},{emoji:"\uD83C\uDDF2\uD83C\uDDFC",title:"Flag: Malawi"},{emoji:"\uD83C\uDDF2\uD83C\uDDFD",title:"Flag: Mexico"},{emoji:"\uD83C\uDDF2\uD83C\uDDFE",title:"Flag: Malaysia"},{emoji:"\uD83C\uDDF2\uD83C\uDDFF",title:"Flag: Mozambique"},{emoji:"\uD83C\uDDF3\uD83C\uDDE6",title:"Flag: Namibia"},{emoji:"\uD83C\uDDF3\uD83C\uDDE8",title:"Flag: New Caledonia"},{emoji:"\uD83C\uDDF3\uD83C\uDDEA",title:"Flag: Niger"},{emoji:"\uD83C\uDDF3\uD83C\uDDEB",title:"Flag: Norfolk Island"},{emoji:"\uD83C\uDDF3\uD83C\uDDEC",title:"Flag: Nigeria"},{emoji:"\uD83C\uDDF3\uD83C\uDDEE",title:"Flag: Nicaragua"},{emoji:"\uD83C\uDDF3\uD83C\uDDF1",title:"Flag: Netherlands"},{emoji:"\uD83C\uDDF3\uD83C\uDDF4",title:"Flag: Norway"},{emoji:"\uD83C\uDDF3\uD83C\uDDF5",title:"Flag: Nepal"},{emoji:"\uD83C\uDDF3\uD83C\uDDF7",title:"Flag: Nauru"},{emoji:"\uD83C\uDDF3\uD83C\uDDFA",title:"Flag: Niue"},{emoji:"\uD83C\uDDF3\uD83C\uDDFF",title:"Flag: New Zealand"},{emoji:"\uD83C\uDDF4\uD83C\uDDF2",title:"Flag: Oman"},{emoji:"\uD83C\uDDF5\uD83C\uDDE6",title:"Flag: Panama"},{emoji:"\uD83C\uDDF5\uD83C\uDDEA",title:"Flag: Peru"},{emoji:"\uD83C\uDDF5\uD83C\uDDEB",title:"Flag: French Polynesia"},{emoji:"\uD83C\uDDF5\uD83C\uDDEC",title:"Flag: Papua New Guinea"},{emoji:"\uD83C\uDDF5\uD83C\uDDED",title:"Flag: Philippines"},{emoji:"\uD83C\uDDF5\uD83C\uDDF0",title:"Flag: Pakistan"},{emoji:"\uD83C\uDDF5\uD83C\uDDF1",title:"Flag: Poland"},{emoji:"\uD83C\uDDF5\uD83C\uDDF2",title:"Flag: St. Pierre & Miquelon"},{emoji:"\uD83C\uDDF5\uD83C\uDDF3",title:"Flag: Pitcairn Islands"},{emoji:"\uD83C\uDDF5\uD83C\uDDF7",title:"Flag: Puerto Rico"},{emoji:"\uD83C\uDDF5\uD83C\uDDF8",title:"Flag: Palestinian Territories"},{emoji:"\uD83C\uDDF5\uD83C\uDDF9",title:"Flag: Portugal"},{emoji:"\uD83C\uDDF5\uD83C\uDDFC",title:"Flag: Palau"},{emoji:"\uD83C\uDDF5\uD83C\uDDFE",title:"Flag: Paraguay"},{emoji:"\uD83C\uDDF6\uD83C\uDDE6",title:"Flag: Qatar"},{emoji:"\uD83C\uDDF7\uD83C\uDDEA",title:"Flag: R\xe9union"},{emoji:"\uD83C\uDDF7\uD83C\uDDF4",title:"Flag: Romania"},{emoji:"\uD83C\uDDF7\uD83C\uDDF8",title:"Flag: Serbia"},{emoji:"\uD83C\uDDF7\uD83C\uDDFA",title:"Flag: Russia"},{emoji:"\uD83C\uDDF7\uD83C\uDDFC",title:"Flag: Rwanda"},{emoji:"\uD83C\uDDF8\uD83C\uDDE6",title:"Flag: Saudi Arabia"},{emoji:"\uD83C\uDDF8\uD83C\uDDE7",title:"Flag: Solomon Islands"},{emoji:"\uD83C\uDDF8\uD83C\uDDE8",title:"Flag: Seychelles"},{emoji:"\uD83C\uDDF8\uD83C\uDDE9",title:"Flag: Sudan"},{emoji:"\uD83C\uDDF8\uD83C\uDDEA",title:"Flag: Sweden"},{emoji:"\uD83C\uDDF8\uD83C\uDDEC",title:"Flag: Singapore"},{emoji:"\uD83C\uDDF8\uD83C\uDDED",title:"Flag: St. Helena"},{emoji:"\uD83C\uDDF8\uD83C\uDDEE",title:"Flag: Slovenia"},{emoji:"\uD83C\uDDF8\uD83C\uDDEF",title:"Flag: Svalbard & Jan Mayen"},{emoji:"\uD83C\uDDF8\uD83C\uDDF0",title:"Flag: Slovakia"},{emoji:"\uD83C\uDDF8\uD83C\uDDF1",title:"Flag: Sierra Leone"},{emoji:"\uD83C\uDDF8\uD83C\uDDF2",title:"Flag: San Marino"},{emoji:"\uD83C\uDDF8\uD83C\uDDF3",title:"Flag: Senegal"},{emoji:"\uD83C\uDDF8\uD83C\uDDF4",title:"Flag: Somalia"},{emoji:"\uD83C\uDDF8\uD83C\uDDF7",title:"Flag: Suriname"},{emoji:"\uD83C\uDDF8\uD83C\uDDF8",title:"Flag: South Sudan"},{emoji:"\uD83C\uDDF8\uD83C\uDDF9",title:"Flag: S\xe3o Tom\xe9 & Pr\xedncipe"},{emoji:"\uD83C\uDDF8\uD83C\uDDFB",title:"Flag: El Salvador"},{emoji:"\uD83C\uDDF8\uD83C\uDDFD",title:"Flag: Sint Maarten"},{emoji:"\uD83C\uDDF8\uD83C\uDDFE",title:"Flag: Syria"},{emoji:"\uD83C\uDDF8\uD83C\uDDFF",title:"Flag: Eswatini"},{emoji:"\uD83C\uDDF9\uD83C\uDDE6",title:"Flag: Tristan Da Cunha"},{emoji:"\uD83C\uDDF9\uD83C\uDDE8",title:"Flag: Turks & Caicos Islands"},{emoji:"\uD83C\uDDF9\uD83C\uDDE9",title:"Flag: Chad"},{emoji:"\uD83C\uDDF9\uD83C\uDDEB",title:"Flag: French Southern Territories"},{emoji:"\uD83C\uDDF9\uD83C\uDDEC",title:"Flag: Togo"},{emoji:"\uD83C\uDDF9\uD83C\uDDED",title:"Flag: Thailand"},{emoji:"\uD83C\uDDF9\uD83C\uDDEF",title:"Flag: Tajikistan"},{emoji:"\uD83C\uDDF9\uD83C\uDDF0",title:"Flag: Tokelau"},{emoji:"\uD83C\uDDF9\uD83C\uDDF1",title:"Flag: Timor-Leste"},{emoji:"\uD83C\uDDF9\uD83C\uDDF2",title:"Flag: Turkmenistan"},{emoji:"\uD83C\uDDF9\uD83C\uDDF3",title:"Flag: Tunisia"},{emoji:"\uD83C\uDDF9\uD83C\uDDF4",title:"Flag: Tonga"},{emoji:"\uD83C\uDDF9\uD83C\uDDF7",title:"Flag: Turkey"},{emoji:"\uD83C\uDDF9\uD83C\uDDF9",title:"Flag: Trinidad & Tobago"},{emoji:"\uD83C\uDDF9\uD83C\uDDFB",title:"Flag: Tuvalu"},{emoji:"\uD83C\uDDF9\uD83C\uDDFC",title:"Flag: Taiwan"},{emoji:"\uD83C\uDDF9\uD83C\uDDFF",title:"Flag: Tanzania"},{emoji:"\uD83C\uDDFA\uD83C\uDDE6",title:"Flag: Ukraine"},{emoji:"\uD83C\uDDFA\uD83C\uDDEC",title:"Flag: Uganda"},{emoji:"\uD83C\uDDFA\uD83C\uDDF2",title:"Flag: U.S. Outlying Islands"},{emoji:"\uD83C\uDDFA\uD83C\uDDF3",title:"Flag: United Nations"},{emoji:"\uD83C\uDDFA\uD83C\uDDF8",title:"Flag: United States"},{emoji:"\uD83C\uDDFA\uD83C\uDDFE",title:"Flag: Uruguay"},{emoji:"\uD83C\uDDFA\uD83C\uDDFF",title:"Flag: Uzbekistan"},{emoji:"\uD83C\uDDFB\uD83C\uDDE6",title:"Flag: Vatican City"},{emoji:"\uD83C\uDDFB\uD83C\uDDE8",title:"Flag: St. Vincent & Grenadines"},{emoji:"\uD83C\uDDFB\uD83C\uDDEA",title:"Flag: Venezuela"},{emoji:"\uD83C\uDDFB\uD83C\uDDEC",title:"Flag: British Virgin Islands"},{emoji:"\uD83C\uDDFB\uD83C\uDDEE",title:"Flag: U.S. Virgin Islands"},{emoji:"\uD83C\uDDFB\uD83C\uDDF3",title:"Flag: Vietnam"},{emoji:"\uD83C\uDDFB\uD83C\uDDFA",title:"Flag: Vanuatu"},{emoji:"\uD83C\uDDFC\uD83C\uDDEB",title:"Flag: Wallis & Futuna"},{emoji:"\uD83C\uDDFC\uD83C\uDDF8",title:"Flag: Samoa"},{emoji:"\uD83C\uDDFD\uD83C\uDDF0",title:"Flag: Kosovo"},{emoji:"\uD83C\uDDFE\uD83C\uDDEA",title:"Flag: Yemen"},{emoji:"\uD83C\uDDFE\uD83C\uDDF9",title:"Flag: Mayotte"},{emoji:"\uD83C\uDDFF\uD83C\uDDE6",title:"Flag: South Africa"},{emoji:"\uD83C\uDDFF\uD83C\uDDF2",title:"Flag: Zambia"},{emoji:"\uD83C\uDDFF\uD83C\uDDFC",title:"Flag: Zimbabwe"},{emoji:"\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67\uDB40\uDC7F",title:"Flag: England"},{emoji:"\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74\uDB40\uDC7F",title:"Flag: Scotland"},{emoji:"\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73\uDB40\uDC7F",title:"Flag: Wales"},{emoji:"\uD83C\uDFF4\uDB40\uDC75\uDB40\uDC73\uDB40\uDC74\uDB40\uDC78\uDB40\uDC7F",title:"Flag for Texas (US-TX)"}]},n={People:' ',Nature:' ',"Food-dring":' ',Activity:'',"Travel-places":' ',Objects:' ',Symbols:' ',Flags:''},j={search:' ',close:'',move:' '},r={styles:()=>{let e=` + + `;document.head.insertAdjacentHTML("beforeend",e)},position(){let e=window.event,i=e.clientX,t=e.clientY,o={};return o.left=i,o.top=t,o},rePositioning(e){e.getBoundingClientRect().right>window.screen.availWidth&&(e.style.left=window.screen.availWidth-e.offsetWidth+"px"),window.innerHeight>400&&e.getBoundingClientRect().bottom>window.innerHeight&&(e.style.top=window.innerHeight-e.offsetHeight+"px")},render:(e,l)=>{l||(l=".emojis"),o=void 0;let a=this.options.trigger.findIndex(e=>e.selector===l);this.insertInto=this.options.trigger[a].insertInto;let g=r.position();if(!i.length){for(let s in m)if(m.hasOwnProperty.call(m,s)){let _=m[s];t+=`
  • + ${n[s]} +
  • `,i+=`
    `,i+=`

    ${s}

    `,_.forEach(e=>{i+=`
  • + ${e.emoji} +
  • `}),i+="
    "}}document.querySelector(".fg-emoji-container")&&this.lib(".fg-emoji-container").remove();let c=` +
    + + + + +
    + + +
      + ${i} +
    +
    +
    + `;document.body.insertAdjacentHTML("beforeend",c),r.rePositioning(document.querySelector(".fg-emoji-container")),setTimeout(()=>{document.querySelector(".fg-emoji-picker-search input").focus()},500)},closePicker:e=>{e.preventDefault(),this.lib(".fg-emoji-container").remove(),l=!1},checkPickerExist(e){!document.querySelector(".fg-emoji-container")||e.target.closest(".fg-emoji-container")||l||r.closePicker.call(this,e)},setCaretPosition(e,i){var t=e;if(null!=t){if(t.createTextRange){var o=t.createTextRange();o.move("character",i),o.select()}else t.selectionStart?(t.focus(),t.setSelectionRange(i,i)):t.focus()}},insert:e=>{e.preventDefault();let i=e.target.innerText.trim(),t=document.querySelectorAll(this.insertInto),o=i;t.forEach(e=>{if(document.selection)e.focus(),(sel=document.selection.createRange()).text=o;else if(e.selectionStart||"0"==e.selectionStart){let i=e.selectionStart,t=e.selectionEnd;e.value=e.value.substring(0,i)+o+e.value.substring(t,e.value.length),r.setCaretPosition(e,i+2)}else e.value+=o,e.focus()})},categoryNav:e=>{e.preventDefault();let i=e.target.closest("a");if(i.getAttribute("id")&&"fg-emoji-picker-close-button"===i.getAttribute("id")||i.className.includes("fg-emoji-picker-move"))return!1;let t=i.getAttribute("href"),o=document.querySelector(".fg-emoji-list"),l=o.querySelector(`${t}`);this.lib(".fg-emoji-nav li").removeClass("emoji-picker-nav-active"),i.closest("li").classList.add("emoji-picker-nav-active"),l.scrollIntoView({behavior:"smooth",block:"start",inline:"nearest"})},search(e){let i=e.target.value.trim();o||(o=Array.from(document.querySelectorAll(".fg-emoji-picker-category-wrapper li"))),o.filter(e=>{e.getAttribute("data-title").match(i)?e.style.display="":e.style.display="none"})},mouseDown(e){e.preventDefault(),l=!0},mouseUp(e){e.preventDefault(),l=!1},mouseMove(e){if(l){e.preventDefault();let i=document.querySelector(".fg-emoji-container");i.style.left=e.clientX-320+"px",i.style.top=e.clientY-10+"px"}}},g=()=>{this.lib(document.body).on("click",r.closePicker,"#fg-emoji-picker-close-button"),this.lib(document.body).on("click",r.checkPickerExist),this.lib(document.body).on("click",r.render,this.trigger),this.lib(document.body).on("click",r.insert,".fg-emoji-list a"),this.lib(document.body).on("click",r.categoryNav,".fg-emoji-nav a"),this.lib(document.body).on("input",r.search,".fg-emoji-picker-search input"),this.lib(document).on("mousedown",r.mouseDown,"#fg-emoji-picker-move"),this.lib(document).on("mouseup",r.mouseUp,"#fg-emoji-picker-move"),this.lib(document).on("mousemove",r.mouseMove)};(()=>{r.styles(),g.call(this)})()}; \ No newline at end of file diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po index 63aa39b24..635014967 100644 --- a/view/lang/C/messages.po +++ b/view/lang/C/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 2023.06-dev\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-23 21:21+0000\n" +"POT-Creation-Date: 2023-05-04 10:54+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -292,7 +292,7 @@ msgid "Insert web link" msgstr "" #: mod/message.php:202 mod/message.php:358 mod/photos.php:1291 -#: src/Content/Conversation.php:389 src/Content/Conversation.php:733 +#: src/Content/Conversation.php:390 src/Content/Conversation.php:734 #: src/Module/Item/Compose.php:204 src/Module/Post/Edit.php:145 #: src/Module/Profile/UnkMail.php:154 src/Object/Post.php:550 msgid "Please wait" @@ -475,8 +475,8 @@ msgstr "" msgid "Do not show a status post for this upload" msgstr "" -#: mod/photos.php:733 mod/photos.php:1093 src/Content/Conversation.php:391 -#: src/Module/Calendar/Event/Form.php:253 src/Module/Post/Edit.php:182 +#: mod/photos.php:733 mod/photos.php:1093 src/Content/Conversation.php:392 +#: src/Module/Calendar/Event/Form.php:253 src/Module/Post/Edit.php:183 msgid "Permissions" msgstr "" @@ -488,7 +488,7 @@ msgstr "" msgid "Delete Album" msgstr "" -#: mod/photos.php:798 mod/photos.php:899 src/Content/Conversation.php:407 +#: mod/photos.php:798 mod/photos.php:899 src/Content/Conversation.php:408 #: src/Module/Contact/Follow.php:173 src/Module/Contact/Revoke.php:109 #: src/Module/Contact/Unfollow.php:126 #: src/Module/Media/Attachment/Browser.php:77 @@ -606,9 +606,9 @@ msgid "Comment" msgstr "" #: mod/photos.php:1139 mod/photos.php:1195 mod/photos.php:1269 -#: src/Content/Conversation.php:404 src/Module/Calendar/Event/Form.php:248 +#: src/Content/Conversation.php:405 src/Module/Calendar/Event/Form.php:248 #: src/Module/Item/Compose.php:199 src/Module/Post/Edit.php:165 -#: src/Object/Post.php:1074 +#: src/Object/Post.php:1075 msgid "Preview" msgstr "" @@ -617,11 +617,11 @@ msgstr "" msgid "Loading..." msgstr "" -#: mod/photos.php:1226 src/Content/Conversation.php:649 src/Object/Post.php:257 +#: mod/photos.php:1226 src/Content/Conversation.php:650 src/Object/Post.php:257 msgid "Select" msgstr "" -#: mod/photos.php:1227 src/Content/Conversation.php:650 +#: mod/photos.php:1227 src/Content/Conversation.php:651 #: src/Module/Moderation/Users/Active.php:136 #: src/Module/Moderation/Users/Blocked.php:136 #: src/Module/Moderation/Users/Index.php:151 @@ -1213,7 +1213,7 @@ msgid "Visible to everybody" msgstr "" #: src/Content/Conversation.php:329 src/Module/Item/Compose.php:198 -#: src/Object/Post.php:1073 +#: src/Object/Post.php:1074 msgid "Please enter a image/video/audio/webpage URL:" msgstr "" @@ -1277,197 +1277,202 @@ msgstr "" msgid "Quote" msgstr "" -#: src/Content/Conversation.php:368 src/Module/Item/Compose.php:194 -#: src/Module/Post/Edit.php:175 src/Object/Post.php:1069 +#: src/Content/Conversation.php:368 src/Module/Post/Edit.php:175 +#: src/Object/Post.php:1069 +msgid "Add emojis" +msgstr "" + +#: src/Content/Conversation.php:369 src/Module/Item/Compose.php:194 +#: src/Module/Post/Edit.php:176 src/Object/Post.php:1070 msgid "Code" msgstr "" -#: src/Content/Conversation.php:369 src/Module/Item/Compose.php:195 -#: src/Object/Post.php:1070 +#: src/Content/Conversation.php:370 src/Module/Item/Compose.php:195 +#: src/Object/Post.php:1071 msgid "Image" msgstr "" -#: src/Content/Conversation.php:370 src/Module/Item/Compose.php:196 -#: src/Module/Post/Edit.php:176 src/Object/Post.php:1071 +#: src/Content/Conversation.php:371 src/Module/Item/Compose.php:196 +#: src/Module/Post/Edit.php:177 src/Object/Post.php:1072 msgid "Link" msgstr "" -#: src/Content/Conversation.php:371 src/Module/Item/Compose.php:197 -#: src/Module/Post/Edit.php:177 src/Object/Post.php:1072 +#: src/Content/Conversation.php:372 src/Module/Item/Compose.php:197 +#: src/Module/Post/Edit.php:178 src/Object/Post.php:1073 msgid "Link or Media" msgstr "" -#: src/Content/Conversation.php:372 +#: src/Content/Conversation.php:373 msgid "Video" msgstr "" -#: src/Content/Conversation.php:373 src/Module/Item/Compose.php:200 +#: src/Content/Conversation.php:374 src/Module/Item/Compose.php:200 #: src/Module/Post/Edit.php:141 msgid "Set your location" msgstr "" -#: src/Content/Conversation.php:374 src/Module/Post/Edit.php:142 +#: src/Content/Conversation.php:375 src/Module/Post/Edit.php:142 msgid "set location" msgstr "" -#: src/Content/Conversation.php:375 src/Module/Post/Edit.php:143 +#: src/Content/Conversation.php:376 src/Module/Post/Edit.php:143 msgid "Clear browser location" msgstr "" -#: src/Content/Conversation.php:376 src/Module/Post/Edit.php:144 +#: src/Content/Conversation.php:377 src/Module/Post/Edit.php:144 msgid "clear location" msgstr "" -#: src/Content/Conversation.php:378 src/Module/Item/Compose.php:205 +#: src/Content/Conversation.php:379 src/Module/Item/Compose.php:205 #: src/Module/Post/Edit.php:157 msgid "Set title" msgstr "" -#: src/Content/Conversation.php:380 src/Module/Item/Compose.php:206 +#: src/Content/Conversation.php:381 src/Module/Item/Compose.php:206 #: src/Module/Post/Edit.php:159 msgid "Categories (comma-separated list)" msgstr "" -#: src/Content/Conversation.php:385 src/Module/Item/Compose.php:222 +#: src/Content/Conversation.php:386 src/Module/Item/Compose.php:222 msgid "Scheduled at" msgstr "" -#: src/Content/Conversation.php:390 src/Module/Post/Edit.php:146 +#: src/Content/Conversation.php:391 src/Module/Post/Edit.php:146 msgid "Permission settings" msgstr "" -#: src/Content/Conversation.php:400 src/Module/Post/Edit.php:155 +#: src/Content/Conversation.php:401 src/Module/Post/Edit.php:155 msgid "Public post" msgstr "" -#: src/Content/Conversation.php:414 src/Content/Widget/VCard.php:113 +#: src/Content/Conversation.php:415 src/Content/Widget/VCard.php:113 #: src/Model/Profile.php:469 src/Module/Admin/Logs/View.php:92 -#: src/Module/Post/Edit.php:180 +#: src/Module/Post/Edit.php:181 msgid "Message" msgstr "" -#: src/Content/Conversation.php:415 src/Module/Post/Edit.php:181 +#: src/Content/Conversation.php:416 src/Module/Post/Edit.php:182 #: src/Module/Settings/TwoFactor/Trusted.php:140 msgid "Browser" msgstr "" -#: src/Content/Conversation.php:417 src/Module/Post/Edit.php:184 +#: src/Content/Conversation.php:418 src/Module/Post/Edit.php:185 msgid "Open Compose page" msgstr "" -#: src/Content/Conversation.php:677 src/Object/Post.php:244 +#: src/Content/Conversation.php:678 src/Object/Post.php:244 msgid "Pinned item" msgstr "" -#: src/Content/Conversation.php:693 src/Object/Post.php:496 +#: src/Content/Conversation.php:694 src/Object/Post.php:496 #: src/Object/Post.php:497 #, php-format msgid "View %s's profile @ %s" msgstr "" -#: src/Content/Conversation.php:706 src/Object/Post.php:484 +#: src/Content/Conversation.php:707 src/Object/Post.php:484 msgid "Categories:" msgstr "" -#: src/Content/Conversation.php:707 src/Object/Post.php:485 +#: src/Content/Conversation.php:708 src/Object/Post.php:485 msgid "Filed under:" msgstr "" -#: src/Content/Conversation.php:715 src/Object/Post.php:510 +#: src/Content/Conversation.php:716 src/Object/Post.php:510 #, php-format msgid "%s from %s" msgstr "" -#: src/Content/Conversation.php:731 +#: src/Content/Conversation.php:732 msgid "View in context" msgstr "" -#: src/Content/Conversation.php:796 +#: src/Content/Conversation.php:797 msgid "remove" msgstr "" -#: src/Content/Conversation.php:800 +#: src/Content/Conversation.php:801 msgid "Delete Selected Items" msgstr "" -#: src/Content/Conversation.php:865 src/Content/Conversation.php:868 -#: src/Content/Conversation.php:871 src/Content/Conversation.php:874 -#: src/Content/Conversation.php:877 +#: src/Content/Conversation.php:866 src/Content/Conversation.php:869 +#: src/Content/Conversation.php:872 src/Content/Conversation.php:875 +#: src/Content/Conversation.php:878 #, php-format msgid "You had been addressed (%s)." msgstr "" -#: src/Content/Conversation.php:880 +#: src/Content/Conversation.php:881 #, php-format msgid "You are following %s." msgstr "" -#: src/Content/Conversation.php:883 +#: src/Content/Conversation.php:884 msgid "You subscribed to one or more tags in this post." msgstr "" -#: src/Content/Conversation.php:896 +#: src/Content/Conversation.php:897 #, php-format msgid "%s reshared this." msgstr "" -#: src/Content/Conversation.php:898 +#: src/Content/Conversation.php:899 msgid "Reshared" msgstr "" -#: src/Content/Conversation.php:898 +#: src/Content/Conversation.php:899 #, php-format msgid "Reshared by %s <%s>" msgstr "" -#: src/Content/Conversation.php:901 +#: src/Content/Conversation.php:902 #, php-format msgid "%s is participating in this thread." msgstr "" -#: src/Content/Conversation.php:904 +#: src/Content/Conversation.php:905 msgid "Stored for general reasons" msgstr "" -#: src/Content/Conversation.php:907 +#: src/Content/Conversation.php:908 msgid "Global post" msgstr "" -#: src/Content/Conversation.php:910 +#: src/Content/Conversation.php:911 msgid "Sent via an relay server" msgstr "" -#: src/Content/Conversation.php:910 +#: src/Content/Conversation.php:911 #, php-format msgid "Sent via the relay server %s <%s>" msgstr "" -#: src/Content/Conversation.php:913 +#: src/Content/Conversation.php:914 msgid "Fetched" msgstr "" -#: src/Content/Conversation.php:913 +#: src/Content/Conversation.php:914 #, php-format msgid "Fetched because of %s <%s>" msgstr "" -#: src/Content/Conversation.php:916 +#: src/Content/Conversation.php:917 msgid "Stored because of a child post to complete this thread." msgstr "" -#: src/Content/Conversation.php:919 +#: src/Content/Conversation.php:920 msgid "Local delivery" msgstr "" -#: src/Content/Conversation.php:922 +#: src/Content/Conversation.php:923 msgid "Stored because of your activity (like, comment, star, ...)" msgstr "" -#: src/Content/Conversation.php:925 +#: src/Content/Conversation.php:926 msgid "Distributed" msgstr "" -#: src/Content/Conversation.php:928 +#: src/Content/Conversation.php:929 msgid "Pushed to us" msgstr "" @@ -1601,57 +1606,57 @@ msgstr "" msgid "show more" msgstr "" -#: src/Content/Item.php:326 src/Model/Item.php:2922 +#: src/Content/Item.php:327 src/Model/Item.php:2927 msgid "event" msgstr "" -#: src/Content/Item.php:329 src/Content/Item.php:339 +#: src/Content/Item.php:330 src/Content/Item.php:340 msgid "status" msgstr "" -#: src/Content/Item.php:335 src/Model/Item.php:2924 +#: src/Content/Item.php:336 src/Model/Item.php:2929 #: src/Module/Post/Tag/Add.php:123 msgid "photo" msgstr "" -#: src/Content/Item.php:349 src/Module/Post/Tag/Add.php:141 +#: src/Content/Item.php:350 src/Module/Post/Tag/Add.php:141 #, php-format msgid "%1$s tagged %2$s's %3$s with %4$s" msgstr "" -#: src/Content/Item.php:419 view/theme/frio/theme.php:262 +#: src/Content/Item.php:420 view/theme/frio/theme.php:262 msgid "Follow Thread" msgstr "" -#: src/Content/Item.php:420 src/Model/Contact.php:1204 +#: src/Content/Item.php:421 src/Model/Contact.php:1204 msgid "View Status" msgstr "" -#: src/Content/Item.php:421 src/Content/Item.php:441 src/Model/Contact.php:1148 +#: src/Content/Item.php:422 src/Content/Item.php:442 src/Model/Contact.php:1148 #: src/Model/Contact.php:1196 src/Model/Contact.php:1205 #: src/Module/Directory.php:157 src/Module/Settings/Profile/Index.php:233 msgid "View Profile" msgstr "" -#: src/Content/Item.php:422 src/Model/Contact.php:1206 +#: src/Content/Item.php:423 src/Model/Contact.php:1206 msgid "View Photos" msgstr "" -#: src/Content/Item.php:423 src/Model/Contact.php:1197 +#: src/Content/Item.php:424 src/Model/Contact.php:1197 #: src/Model/Contact.php:1207 msgid "Network Posts" msgstr "" -#: src/Content/Item.php:424 src/Model/Contact.php:1198 +#: src/Content/Item.php:425 src/Model/Contact.php:1198 #: src/Model/Contact.php:1208 msgid "View Contact" msgstr "" -#: src/Content/Item.php:425 src/Model/Contact.php:1209 +#: src/Content/Item.php:426 src/Model/Contact.php:1209 msgid "Send PM" msgstr "" -#: src/Content/Item.php:426 src/Module/Contact.php:439 +#: src/Content/Item.php:427 src/Module/Contact.php:439 #: src/Module/Contact/Profile.php:477 #: src/Module/Moderation/Blocklist/Contact.php:116 #: src/Module/Moderation/Users/Active.php:137 @@ -1659,7 +1664,7 @@ msgstr "" msgid "Block" msgstr "" -#: src/Content/Item.php:427 src/Module/Contact.php:440 +#: src/Content/Item.php:428 src/Module/Contact.php:440 #: src/Module/Contact/Profile.php:485 #: src/Module/Notifications/Introductions.php:134 #: src/Module/Notifications/Introductions.php:206 @@ -1667,22 +1672,22 @@ msgstr "" msgid "Ignore" msgstr "" -#: src/Content/Item.php:428 src/Module/Contact.php:441 +#: src/Content/Item.php:429 src/Module/Contact.php:441 #: src/Module/Contact/Profile.php:493 msgid "Collapse" msgstr "" -#: src/Content/Item.php:432 src/Object/Post.php:465 +#: src/Content/Item.php:433 src/Object/Post.php:465 msgid "Languages" msgstr "" -#: src/Content/Item.php:438 src/Content/Widget.php:80 +#: src/Content/Item.php:439 src/Content/Widget.php:80 #: src/Model/Contact.php:1199 src/Model/Contact.php:1210 #: src/Module/Contact/Follow.php:167 view/theme/vier/theme.php:196 msgid "Connect/Follow" msgstr "" -#: src/Content/Item.php:863 +#: src/Content/Item.php:864 msgid "Unable to fetch user." msgstr "" @@ -2015,8 +2020,8 @@ msgid "" "%2$s %3$s" msgstr "" -#: src/Content/Text/BBCode.php:956 src/Model/Item.php:3607 -#: src/Model/Item.php:3613 src/Model/Item.php:3614 +#: src/Content/Text/BBCode.php:956 src/Model/Item.php:3645 +#: src/Model/Item.php:3651 src/Model/Item.php:3652 msgid "Link to source" msgstr "" @@ -2119,7 +2124,7 @@ msgstr "" msgid "Local Directory" msgstr "" -#: src/Content/Widget.php:215 src/Model/Group.php:587 +#: src/Content/Widget.php:215 src/Model/Group.php:596 #: src/Module/Contact.php:394 src/Module/Welcome.php:76 msgid "Groups" msgstr "" @@ -2975,68 +2980,68 @@ msgstr "" msgid "Forum" msgstr "" -#: src/Model/Contact.php:2947 +#: src/Model/Contact.php:2952 msgid "Disallowed profile URL." msgstr "" -#: src/Model/Contact.php:2952 src/Module/Friendica.php:83 +#: src/Model/Contact.php:2957 src/Module/Friendica.php:83 msgid "Blocked domain" msgstr "" -#: src/Model/Contact.php:2957 +#: src/Model/Contact.php:2962 msgid "Connect URL missing." msgstr "" -#: src/Model/Contact.php:2966 +#: src/Model/Contact.php:2971 msgid "" "The contact could not be added. Please check the relevant network " "credentials in your Settings -> Social Networks page." msgstr "" -#: src/Model/Contact.php:2984 +#: src/Model/Contact.php:2989 #, php-format msgid "Expected network %s does not match actual network %s" msgstr "" -#: src/Model/Contact.php:3001 +#: src/Model/Contact.php:3006 msgid "The profile address specified does not provide adequate information." msgstr "" -#: src/Model/Contact.php:3003 +#: src/Model/Contact.php:3008 msgid "No compatible communication protocols or feeds were discovered." msgstr "" -#: src/Model/Contact.php:3006 +#: src/Model/Contact.php:3011 msgid "An author or name was not found." msgstr "" -#: src/Model/Contact.php:3009 +#: src/Model/Contact.php:3014 msgid "No browser URL could be matched to this address." msgstr "" -#: src/Model/Contact.php:3012 +#: src/Model/Contact.php:3017 msgid "" "Unable to match @-style Identity Address with a known protocol or email " "contact." msgstr "" -#: src/Model/Contact.php:3013 +#: src/Model/Contact.php:3018 msgid "Use mailto: in front of address to force email check." msgstr "" -#: src/Model/Contact.php:3019 +#: src/Model/Contact.php:3024 msgid "" "The profile address specified belongs to a network which has been disabled " "on this site." msgstr "" -#: src/Model/Contact.php:3024 +#: src/Model/Contact.php:3029 msgid "" "Limited profile. This person will be unable to receive direct/personal " "notifications from you." msgstr "" -#: src/Model/Contact.php:3089 +#: src/Model/Contact.php:3094 msgid "Unable to retrieve contact information." msgstr "" @@ -3148,40 +3153,40 @@ msgid "" "not what you intended, please create another group with a different name." msgstr "" -#: src/Model/Group.php:503 +#: src/Model/Group.php:512 msgid "Default privacy group for new contacts" msgstr "" -#: src/Model/Group.php:535 +#: src/Model/Group.php:544 msgid "Everybody" msgstr "" -#: src/Model/Group.php:554 +#: src/Model/Group.php:563 msgid "edit" msgstr "" -#: src/Model/Group.php:586 +#: src/Model/Group.php:595 msgid "add" msgstr "" -#: src/Model/Group.php:591 +#: src/Model/Group.php:600 msgid "Edit group" msgstr "" -#: src/Model/Group.php:592 src/Module/Group.php:192 +#: src/Model/Group.php:601 src/Module/Group.php:192 msgid "Contacts not in any group" msgstr "" -#: src/Model/Group.php:594 +#: src/Model/Group.php:603 msgid "Create a new group" msgstr "" -#: src/Model/Group.php:595 src/Module/Group.php:177 src/Module/Group.php:200 +#: src/Model/Group.php:604 src/Module/Group.php:177 src/Module/Group.php:200 #: src/Module/Group.php:275 msgid "Group Name: " msgstr "" -#: src/Model/Group.php:596 +#: src/Model/Group.php:605 msgid "Edit groups" msgstr "" @@ -3190,76 +3195,76 @@ msgstr "" msgid "Detected languages in this post:\\n%s" msgstr "" -#: src/Model/Item.php:2926 +#: src/Model/Item.php:2931 msgid "activity" msgstr "" -#: src/Model/Item.php:2928 +#: src/Model/Item.php:2933 msgid "comment" msgstr "" -#: src/Model/Item.php:2931 src/Module/Post/Tag/Add.php:123 +#: src/Model/Item.php:2936 src/Module/Post/Tag/Add.php:123 msgid "post" msgstr "" -#: src/Model/Item.php:3093 +#: src/Model/Item.php:3105 #, php-format msgid "%s is blocked" msgstr "" -#: src/Model/Item.php:3095 +#: src/Model/Item.php:3107 #, php-format msgid "%s is ignored" msgstr "" -#: src/Model/Item.php:3097 +#: src/Model/Item.php:3109 #, php-format msgid "Content from %s is collapsed" msgstr "" -#: src/Model/Item.php:3101 +#: src/Model/Item.php:3113 #, php-format msgid "Content warning: %s" msgstr "" -#: src/Model/Item.php:3519 +#: src/Model/Item.php:3557 msgid "bytes" msgstr "" -#: src/Model/Item.php:3550 +#: src/Model/Item.php:3588 #, php-format msgid "%2$s (%3$d%%, %1$d vote)" msgid_plural "%2$s (%3$d%%, %1$d votes)" msgstr[0] "" msgstr[1] "" -#: src/Model/Item.php:3552 +#: src/Model/Item.php:3590 #, php-format msgid "%2$s (%1$d vote)" msgid_plural "%2$s (%1$d votes)" msgstr[0] "" msgstr[1] "" -#: src/Model/Item.php:3557 +#: src/Model/Item.php:3595 #, php-format msgid "%d voter. Poll end: %s" msgid_plural "%d voters. Poll end: %s" msgstr[0] "" msgstr[1] "" -#: src/Model/Item.php:3559 +#: src/Model/Item.php:3597 #, php-format msgid "%d voter." msgid_plural "%d voters." msgstr[0] "" msgstr[1] "" -#: src/Model/Item.php:3561 +#: src/Model/Item.php:3599 #, php-format msgid "Poll end: %s" msgstr "" -#: src/Model/Item.php:3595 src/Model/Item.php:3596 +#: src/Model/Item.php:3633 src/Model/Item.php:3634 msgid "View on separate page" msgstr "" diff --git a/view/templates/content/image.tpl b/view/templates/content/image.tpl index 92a37915f..00b1aac10 100644 --- a/view/templates/content/image.tpl +++ b/view/templates/content/image.tpl @@ -1,5 +1,5 @@ {{if $image.preview}} -{{$image.attachment.description}} +{{$image.attachment.description}} {{else}} {{$image.attachment.description}} {{/if}} diff --git a/view/templates/head.tpl b/view/templates/head.tpl index 0b2563644..a06d51f7c 100644 --- a/view/templates/head.tpl +++ b/view/templates/head.tpl @@ -7,6 +7,7 @@ + {{foreach $stylesheets as $stylesheetUrl => $media}} @@ -44,6 +45,8 @@ + + + diff --git a/view/theme/frio/js/modal.js b/view/theme/frio/js/modal.js index 93092fa26..e6e1e6512 100644 --- a/view/theme/frio/js/modal.js +++ b/view/theme/frio/js/modal.js @@ -29,33 +29,6 @@ $(document).ready(function () { } }); - // Add Colorbox for viewing Network page images. - //var cBoxClasses = new Array(); - $("body").on("click", ".wall-item-body a img", function () { - var aElem = $(this).parent(); - var imgHref = aElem.attr("href"); - - // We need to make sure we only put a Colorbox on links to Friendica images. - // We'll try to do this by looking for links of the form - // .../photo/ab803d8eg08daf85023adfec08 (with nothing more following), in hopes - // that will be unique enough. - if (imgHref.match(/\/photo\/[a-fA-F0-9]+(-[0-9]\.[\w]+?)?$/)) { - // Add a unique class to all the images of a certain post, to allow scrolling through - var cBoxClass = $(this).closest(".wall-item-body").attr("id") + "-lightbox"; - $(this).addClass(cBoxClass); - - // if( $.inArray(cBoxClass, cBoxClasses) < 0 ) { - // cBoxClasses.push(cBoxClass); - // } - - aElem.colorbox({ - maxHeight: "90%", - photo: true, // Colorbox doesn't recognize a URL that don't end in .jpg, etc. as a photo. - rel: cBoxClass, //$(this).attr("class").match(/wall-item-body-[\d]+-lightbox/)[0]. - }); - } - }); - // Navbar login. $("body").on("click", "#nav-login", function (e) { e.preventDefault(); diff --git a/view/theme/frio/templates/head.tpl b/view/theme/frio/templates/head.tpl index 36b6deb07..300cb7d1d 100644 --- a/view/theme/frio/templates/head.tpl +++ b/view/theme/frio/templates/head.tpl @@ -49,6 +49,10 @@ type="text/css" media="screen" /> + + {{* own css files *}} + + + {{* Include the strings which are needed for some js functions (e.g. translation) They are loaded into the html so that js functions can use them *}} diff --git a/view/theme/frio/templates/jot.tpl b/view/theme/frio/templates/jot.tpl index 09ca31853..cf62a89f6 100644 --- a/view/theme/frio/templates/jot.tpl +++ b/view/theme/frio/templates/jot.tpl @@ -108,6 +108,7 @@
  • +
  • @@ -182,3 +183,16 @@ can load different content into the jot modal (e.g. the item edit jot) + diff --git a/view/theme/vier/dark.css b/view/theme/vier/dark.css index ba48bc610..63b937928 100644 --- a/view/theme/vier/dark.css +++ b/view/theme/vier/dark.css @@ -51,7 +51,7 @@ body, section, blockquote, blockquote.shared_content, #profile-jot-form, } #profile-jot-acl-wrapper, #event-notice, #event-wrapper, -#cboxLoadedContent, .contact-photo-menu, #contact-edit-status-wrapper { +.contact-photo-menu, #contact-edit-status-wrapper { background-color: #252C33 !important; } diff --git a/view/theme/vier/mobile.css b/view/theme/vier/mobile.css index 7370f5ca2..ddbf62e9f 100644 --- a/view/theme/vier/mobile.css +++ b/view/theme/vier/mobile.css @@ -227,8 +227,6 @@ aside.show { #profile-jot-acl-wrapper, #profile-jot-acl-wrapper * { box-sizing: border-box; } #acl-wrapper { width: 100%; float: none; } /* flexbox for ACL window */ -#cboxLoadedContent, -#cboxLoadedContent > div, #acl-wrapper { display: -ms-Flexbox !important; -ms-box-orient: vertical;