diff --git a/public/css/accounts.css b/public/css/accounts.css new file mode 100644 index 0000000000000000000000000000000000000000..e5414bf59a2f746d287e8a866aef028cb01358ea --- /dev/null +++ b/public/css/accounts.css @@ -0,0 +1,5 @@ +.userAccount { + border: 1px solid var(--SmartThemeBorderColor); + padding: 5px 10px; + border-radius: 5px; +} diff --git a/public/css/animations.css b/public/css/animations.css new file mode 100644 index 0000000000000000000000000000000000000000..2477fe46a5dc74ac77eb250e2b32811a35c6f732 --- /dev/null +++ b/public/css/animations.css @@ -0,0 +1,121 @@ +/* Fade animations with opacity */ +@keyframes fade-in { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@keyframes fade-out { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +/* Pop animations with opacity and vertical scaling */ +@keyframes pop-in { + 0% { + opacity: 0; + transform: scaleY(0); + } + + /* Make the scaling faster on pop-in, otherwise it looks a bit weird */ + 33% { + transform: scaleY(1); + } + + 100% { + opacity: 1; + transform: scaleY(1); + } +} + +@keyframes pop-out { + 0% { + opacity: 1; + transform: scaleY(1); + } + + 66% { + transform: scaleY(1); + } + + 100% { + opacity: 0; + transform: scaleY(0); + } +} + +/* Flashing for highlighting animation */ +@keyframes flash { + 0%, 50%, 100% { + opacity: 1; + } + + 25%, 75% { + opacity: 0.2; + } +} + +/* Pulsing highlight, slightly resizing the element */ +@keyframes pulse { + from { + transform: scale(1); + filter: brightness(1.1); + } + + to { + transform: scale(1.01); + filter: brightness(1.3); + } +} + +/* Ellipsis animation */ +@keyframes ellipsis { + 0% { + content: "" + } + + 25% { + content: "." + } + + 50% { + content: ".." + } + + 75% { + content: "..." + } +} + +/* HEINOUS */ +@keyframes infinite-spinning { + from { + transform: rotate(0deg); + } + + to { + transform: rotate(360deg); + } +} + +/* STscript animation */ +@keyframes script_progress_pulse { + + 0%, + 100% { + border-top-color: var(--progColor); + } + + 50% { + border-top-color: var(--progFlashColor); + } +} diff --git a/public/css/brands.min.css b/public/css/brands.min.css new file mode 100644 index 0000000000000000000000000000000000000000..3e7076057c7538e9270ac4766de21da251ae771d --- /dev/null +++ b/public/css/brands.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-jxl:before{content:"\e67b"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before,.fa-square-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-web-awesome:before{content:"\e682"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-square-web-awesome-stroke:before{content:"\e684"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-square-upwork:before{content:"\e67c"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-square-web-awesome:before{content:"\e683"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-bluesky:before{content:"\e671"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"} \ No newline at end of file diff --git a/public/css/bright.min.css b/public/css/bright.min.css new file mode 100644 index 0000000000000000000000000000000000000000..0e104ef8247099add3d0e0d83eb1e4613f81535a --- /dev/null +++ b/public/css/bright.min.css @@ -0,0 +1,7 @@ +/*! + Theme: Bright + Author: Chris Kempson (http://chriskempson.com) + License: ~ MIT (or more permissive) [via base16-schemes-source] + Maintainer: @highlightjs/core-team + Version: 2021.09.0 +*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#e0e0e0;background:#000}.hljs ::selection,.hljs::selection{background-color:#505050;color:#e0e0e0}.hljs-comment{color:#b0b0b0}.hljs-tag{color:#d0d0d0}.hljs-operator,.hljs-punctuation,.hljs-subst{color:#e0e0e0}.hljs-operator{opacity:.7}.hljs-bullet,.hljs-deletion,.hljs-name,.hljs-selector-tag,.hljs-template-variable,.hljs-variable{color:#fb0120}.hljs-attr,.hljs-link,.hljs-literal,.hljs-number,.hljs-symbol,.hljs-variable.constant_{color:#fc6d24}.hljs-class .hljs-title,.hljs-title,.hljs-title.class_{color:#fda331}.hljs-strong{font-weight:700;color:#fda331}.hljs-addition,.hljs-code,.hljs-string,.hljs-title.class_.inherited__{color:#a1c659}.hljs-built_in,.hljs-doctag,.hljs-keyword.hljs-atrule,.hljs-quote,.hljs-regexp{color:#76c7b7}.hljs-attribute,.hljs-function .hljs-title,.hljs-section,.hljs-title.function_,.ruby .hljs-property{color:#6fb3d2}.diff .hljs-meta,.hljs-keyword,.hljs-template-tag,.hljs-type{color:#d381c3}.hljs-emphasis{color:#d381c3;font-style:italic}.hljs-meta,.hljs-meta .hljs-keyword,.hljs-meta .hljs-string{color:#be643c}.hljs-meta .hljs-keyword,.hljs-meta-keyword{font-weight:700} \ No newline at end of file diff --git a/public/css/character-group-overlay.css b/public/css/character-group-overlay.css new file mode 100644 index 0000000000000000000000000000000000000000..5327694a85d0a3cd097918dc80645c76b9db9126 --- /dev/null +++ b/public/css/character-group-overlay.css @@ -0,0 +1,104 @@ + +#rm_print_characters_block.group_overlay_mode_select .character_select { + transition: background-color 0.4s ease; + background-color: rgba(170, 170, 170, 0.15); +} + +#rm_print_characters_block.group_overlay_mode_select .bogus_folder_select, +#rm_print_characters_block.group_overlay_mode_select .group_select { + cursor: auto; + filter: saturate(0.3); +} + +#rm_print_characters_block.group_overlay_mode_select .bogus_folder_select:hover, +#rm_print_characters_block.group_overlay_mode_select .group_select:hover { + background: none; +} + +#rm_print_characters_block.group_overlay_mode_select .character_select input.bulk_select_checkbox { + display: none !important; +} + +#rm_print_characters_block.group_overlay_mode_select .character_select.character_selected { + background-color: var(--SmartThemeQuoteColor); +} + +#rm_print_characters_block.group_overlay_mode_select .character_select .bulk_select_checkbox { + visibility: hidden; + height: 0 !important; +} + +#character_context_menu.hidden { display: none; } +#character_context_menu { + position: absolute; + padding: 3px; + z-index: 9998; + background-color: var(--black90a); + border: 1px solid var(--black90a); + border-radius: 10px; +} + +#character_context_menu ul li button { + border: 0; + border-bottom-color: currentcolor; + color: var(--SmartThemeQuoteColor); + background-color: transparent; + font-weight: bold; + font-size: 1em; + padding: 0.5em; + border-bottom: 1px dotted var(--SmartThemeQuoteColor); + width: 100%; + cursor: pointer; +} + +#character_context_menu ul li button:hover { + background-color: var(--SmartThemeBlurTintColor); +} + +#character_context_menu ul li:last-child button { + border-bottom: 0; +} + +#character_context_menu ul li #character_context_menu_delete { + color: var(--fullred); +} + +#character_context_menu ul { + list-style-type: none; + padding: 0; + margin: 0; +} + +#character_context_menu .character_context_menu_separator { + height: 1px; + background-color: var(--SmartThemeBotMesBlurTintColor); +} + +#character_context_menu li:hover { + background-color: var(--SmartThemeBotMesBlurTintColor); +} + +#bulkEditButton.bulk_edit_overlay_active { + color: var(--golden); +} + +#bulk_tag_shadow_popup { + backdrop-filter: blur(calc(var(--SmartThemeBlurStrength) * 2)); + -webkit-backdrop-filter: blur(calc(var(--SmartThemeBlurStrength) * 2)); + background-color: var(--black30a); + position: absolute; + width: 100%; + height: 100vh; + height: 100dvh; + z-index: 9998; + top: 0; +} + +#bulk_tag_shadow_popup #bulk_tag_popup { + padding: 1em; +} + +#bulk_tag_shadow_popup #bulk_tag_popup #dialogue_popup_controls .menu_button { + width: unset; + padding: 0.25em; +} diff --git a/public/css/cropper.min.css b/public/css/cropper.min.css new file mode 100644 index 0000000000000000000000000000000000000000..e97743ad00e3ee2f10eed53e9c1acb3257422531 --- /dev/null +++ b/public/css/cropper.min.css @@ -0,0 +1,9 @@ +/*! + * Cropper.js v1.5.13 + * https://fengyuanchen.github.io/cropperjs + * + * Copyright 2015-present Chen Fengyuan + * Released under the MIT license + * + * Date: 2022-11-20T05:30:43.444Z + */.cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.cropper-container img{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:rgba(51,153,255,.75);overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:" ";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC")}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed} \ No newline at end of file diff --git a/public/css/extensions-panel.css b/public/css/extensions-panel.css new file mode 100644 index 0000000000000000000000000000000000000000..da005bd709a821e24ff1e71d392dc9814584c471 --- /dev/null +++ b/public/css/extensions-panel.css @@ -0,0 +1,107 @@ +/* Extensions */ +#extensions_url { + display: block; +} + +.extensions_block input[type="submit"]:hover { + background-color: green; +} + +.extensions_block input[type="checkbox"], +.extensions_block input[type="radio"] { + margin-left: 10px; + margin-right: 10px; +} + +label[for="extensions_autoconnect"] { + display: flex; + align-items: center; + margin: 0 !important; +} + +.extensions_url_block { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; +} + +.extensions_url_block h4 { + display: inline; +} + +.extensions_block { + clear: both; + padding: 0.05px; +} + +.extensions_info { + text-align: left; +} + +.extensions_info h3 { + margin-bottom: 0.5em; +} + +.extensions_info h4 { + margin-bottom: 0.5em; +} + +.extensions_info p { + margin-bottom: 0.5em; + margin-left: 1em; +} + +.extensions_info .disabled { + color: lightgray; +} + +.extensions_info .toggle_enable { + color: lightgreen; +} + +.extensions_info .toggle_disable { + color: rgb(238, 144, 144); +} + +.extensions_info .extension_enabled { + color: green; +} + +.extensions_info .extension_disabled { + color: lightgray; +} + +.extensions_info .extension_missing { + color: gray; +} + +input.extension_missing[type="checkbox"] { + opacity: 0.5; +} + +#extensions_list .disabled { + text-decoration: line-through; + color: lightgray; +} + +.update-button { + margin-right: 10px; + display: inline-flex; +} + +/* Fixes order of settings for extensions */ +#extensions_settings, +#extensions_settings2 { + display: flex; + flex-direction: column; +} + +/* Fixes order of settings for extensions */ +.extension_container { + display: contents; +} + +#extensionsMenu>div.extension_container:empty { + display: none; +} diff --git a/public/css/file-form.css b/public/css/file-form.css new file mode 100644 index 0000000000000000000000000000000000000000..67801ba30e87a0d972fec59e0a15917915b3616b --- /dev/null +++ b/public/css/file-form.css @@ -0,0 +1,57 @@ +.file_attached { + display: flex; + min-width: 150px; + max-width: calc(var(--sheldWidth) * 0.9); + flex-direction: row; + gap: 10px; + align-items: center; + margin: 0.25em auto; + padding: 0 0.75em; + border: 2px solid var(--SmartThemeBorderColor); + border-radius: 15px; + background-color: var(--white20a); +} + +.mes_file_container { + cursor: default; + display: flex; + gap: 15px; + align-items: center; + width: fit-content; + max-width: 100%; + background-color: var(--white20a); + border: 2px solid var(--SmartThemeBorderColor); + padding: 0.5em 1em; + border-radius: 15px; +} + +.mes_file_container .right_menu_button { + padding-right: 0; +} + +.mes_file_container .mes_file_size, +.file_attached .file_size { + font-size: 0.9em; + color: var(--SmartThemeQuoteColor); +} + +.file_attached .file_name, +.mes_file_container .mes_file_name { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +#file_form { + display: flex; + width: 100%; +} + +.file_modal { + width: 100%; + height: 100%; + overflow-y: auto; + display: flex; + text-align: left; +} diff --git a/public/css/fontawesome.min.css b/public/css/fontawesome.min.css new file mode 100644 index 0000000000000000000000000000000000000000..7e1c2541d760ff7b5295e0d44842ee462efa7598 --- /dev/null +++ b/public/css/fontawesome.min.css @@ -0,0 +1,9 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-duration:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,0));transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} + +.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-table-cells-column-lock:before{content:"\e678"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-table-cells-row-lock:before{content:"\e67a"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"} +.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0} \ No newline at end of file diff --git a/public/css/group-avatars.css b/public/css/group-avatars.css new file mode 100644 index 0000000000000000000000000000000000000000..96f01e66e90f4fccd4ef79126bca62e4849f8172 --- /dev/null +++ b/public/css/group-avatars.css @@ -0,0 +1,91 @@ +.avatar_collage { + border-radius: 50%; + position: relative; + overflow: hidden; +} + +.avatar_collage img { + position: absolute; + overflow: hidden; +} + +.collage_2 .img_1 { + left: 0; + top: 0; + max-width: 50%; + max-height: 100%; + width: 50%; + height: 100%; +} + +.collage_2 .img_2 { + left: 50%; + top: 0; + max-width: 50%; + max-height: 100%; + width: 50%; + height: 100%; +} + +.collage_3 .img_1 { + left: 0; + top: 0; + max-width: 50%; + max-height: 50%; + width: 50%; + height: 50%; +} + +.collage_3 .img_2 { + left: 50%; + top: 0; + max-width: 50%; + max-height: 50%; + width: 50%; + height: 50%; +} + +.collage_3 .img_3 { + left: 0; + top: 50%; + max-width: 100%; + max-height: 50%; + width: 100%; + height: 50%; +} + +.collage_4 .img_1 { + left: 0; + top: 0; + max-width: 50%; + max-height: 50%; + width: 50%; + height: 50%; +} + +.collage_4 .img_2 { + left: 50%; + top: 0; + max-width: 50%; + max-height: 50%; + width: 50%; + height: 50%; +} + +.collage_4 .img_3 { + left: 0; + top: 50%; + max-width: 50%; + max-height: 50%; + width: 50%; + height: 50%; +} + +.collage_4 .img_4 { + left: 50%; + top: 50%; + max-width: 50%; + max-height: 50%; + width: 50%; + height: 50%; +} \ No newline at end of file diff --git a/public/css/jquery-ui.min.css b/public/css/jquery-ui.min.css new file mode 100644 index 0000000000000000000000000000000000000000..ab54bc66190bb19f111fdb272b6a0692fca1555b --- /dev/null +++ b/public/css/jquery-ui.min.css @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.13.2 - 2022-07-14 +* http://jqueryui.com +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?bgShadowXPos=&bgOverlayXPos=&bgErrorXPos=&bgHighlightXPos=&bgContentXPos=&bgHeaderXPos=&bgActiveXPos=&bgHoverXPos=&bgDefaultXPos=&bgShadowYPos=&bgOverlayYPos=&bgErrorYPos=&bgHighlightYPos=&bgContentYPos=&bgHeaderYPos=&bgActiveYPos=&bgHoverYPos=&bgDefaultYPos=&bgShadowRepeat=&bgOverlayRepeat=&bgErrorRepeat=&bgHighlightRepeat=&bgContentRepeat=&bgHeaderRepeat=&bgActiveRepeat=&bgHoverRepeat=&bgDefaultRepeat=&iconsHover=url(%22images%2Fui-icons_555555_256x240.png%22)&iconsHighlight=url(%22images%2Fui-icons_777620_256x240.png%22)&iconsHeader=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsError=url(%22images%2Fui-icons_cc0000_256x240.png%22)&iconsDefault=url(%22images%2Fui-icons_777777_256x240.png%22)&iconsContent=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsActive=url(%22images%2Fui-icons_ffffff_256x240.png%22)&bgImgUrlShadow=&bgImgUrlOverlay=&bgImgUrlHover=&bgImgUrlHighlight=&bgImgUrlHeader=&bgImgUrlError=&bgImgUrlDefault=&bgImgUrlContent=&bgImgUrlActive=&opacityFilterShadow=Alpha(Opacity%3D30)&opacityFilterOverlay=Alpha(Opacity%3D30)&opacityShadowPerc=30&opacityOverlayPerc=30&iconColorHover=%23555555&iconColorHighlight=%23777620&iconColorHeader=%23444444&iconColorError=%23cc0000&iconColorDefault=%23777777&iconColorContent=%23444444&iconColorActive=%23ffffff&bgImgOpacityShadow=0&bgImgOpacityOverlay=0&bgImgOpacityError=95&bgImgOpacityHighlight=55&bgImgOpacityContent=75&bgImgOpacityHeader=75&bgImgOpacityActive=65&bgImgOpacityHover=75&bgImgOpacityDefault=75&bgTextureShadow=flat&bgTextureOverlay=flat&bgTextureError=flat&bgTextureHighlight=flat&bgTextureContent=flat&bgTextureHeader=flat&bgTextureActive=flat&bgTextureHover=flat&bgTextureDefault=flat&cornerRadius=3px&fwDefault=normal&ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&cornerRadiusShadow=8px&thicknessShadow=5px&offsetLeftShadow=0px&offsetTopShadow=0px&opacityShadow=.3&bgColorShadow=%23666666&opacityOverlay=.3&bgColorOverlay=%23aaaaaa&fcError=%235f3f3f&borderColorError=%23f1a899&bgColorError=%23fddfdf&fcHighlight=%23777620&borderColorHighlight=%23dad55e&bgColorHighlight=%23fffa90&fcContent=%23333333&borderColorContent=%23dddddd&bgColorContent=%23ffffff&fcHeader=%23333333&borderColorHeader=%23dddddd&bgColorHeader=%23e9e9e9&fcActive=%23ffffff&borderColorActive=%23003eff&bgColorActive=%23007fff&fcHover=%232b2b2b&borderColorHover=%23cccccc&bgColorHover=%23ededed&fcDefault=%23454545&borderColorDefault=%23c5c5c5&bgColorDefault=%23f6f6f6 +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;-ms-filter:"alpha(opacity=0)"}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;-ms-filter:"alpha(opacity=25)";opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:pointer;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;-ms-filter:"alpha(opacity=70)";font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;-ms-filter:"alpha(opacity=35)";background-image:none}.ui-state-disabled .ui-icon{-ms-filter:"alpha(opacity=35)"}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank.ui-icon-blank.ui-icon-blank{background-image:none}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.003;-ms-filter:Alpha(Opacity=.3)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666} \ No newline at end of file diff --git a/public/css/loader.css b/public/css/loader.css new file mode 100644 index 0000000000000000000000000000000000000000..acf82613d055b2860c71610c5dac1d95e11d8b87 --- /dev/null +++ b/public/css/loader.css @@ -0,0 +1,31 @@ +#preloader { + position: fixed; + margin: 0; + padding: 0; + top: 0; + left: 0; + z-index: 999999; + width: 100vw; + height: 100vh; + width: 100dvw; + height: 100dvh; + background-color: var(--SmartThemeBlurTintColor); + color: var(--SmartThemeBodyColor); + /*for some reason the full screen blur does not work on iOS*/ + backdrop-filter: blur(30px); + opacity: 1; +} + +#load-spinner { + --spinner-size: 2em; + transition: all 300ms ease-out; + opacity: 1; + top: calc(50% - var(--spinner-size) / 2); + left: calc(50% - var(--spinner-size) / 2); + position: absolute; + width: var(--spinner-size); + height: var(--spinner-size); + display: flex; + align-items: center; + justify-content: center; +} diff --git a/public/css/login.css b/public/css/login.css new file mode 100644 index 0000000000000000000000000000000000000000..94f8e995323baccf9719cc08a4bcf1df1454a647 --- /dev/null +++ b/public/css/login.css @@ -0,0 +1,44 @@ +body.login #shadow_popup { + opacity: 1; + display: flex; +} + +body.login .logo { + max-width: 30px; +} + +body.login #logoBlock { + align-items: center; + margin: 0 auto; + gap: 10px; +} + +body.login .userSelect { + display: flex; + flex-direction: column; + color: var(--SmartThemeBodyColor); + border: 1px solid var(--SmartThemeBorderColor); + border-radius: 5px; + padding: 3px 5px; + width: 30%; + cursor: pointer; + margin: 5px 0; + transition: background-color 0.15s ease-in-out; + display: flex; + align-items: center; + justify-content: center; + text-align: center; + overflow: hidden; +} + +body.login .userSelect .userName, +body.login .userSelect .userHandle { + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +body.login .userSelect:hover { + background-color: var(--black30a); +} diff --git a/public/css/logprobs.css b/public/css/logprobs.css new file mode 100644 index 0000000000000000000000000000000000000000..0cea4f67f978e1cc89d2bb62af669182156178fe --- /dev/null +++ b/public/css/logprobs.css @@ -0,0 +1,135 @@ +#logprobsViewer { + overflow-y: auto; + max-width: 90dvw; + max-height: 90dvh; + min-width: 100px; + min-height: 50px; + border-radius: 10px; + border: 1px solid var(--SmartThemeBorderColor); + position: fixed; + padding: 10px; + display: none; + flex-direction: column; + box-shadow: 0 0 10px var(--black70a); + z-index: 3000; + left: 0; + top: 0; + margin: 0; + right: unset; + width: calc(((100dvw - var(--sheldWidth)) / 2) - 1px); +} + +.logprobs_panel_header { + display: flex; + justify-content: space-between; + align-items: center; +} + +.logprobs_panel_title { + font-weight: bold; +} + +.logprobs_panel_controls { + display: flex; + align-items: center; +} + +.logprobs_panel_content { + overflow-y: auto; +} + +.logprobs_panel_control_button { + width: 25px; + height: 25px; + margin-left: 5px; + opacity: 0.5; + transition: all 250ms; + position: unset !important; +} + +.logprobs_panel_control_button:hover { + opacity: 1; + cursor: pointer; +} + +#logprobs_generation_output { + user-select: none; + height: 100%; + overflow-y: auto; +} + +.logprobs_empty_state { + display: flex; + justify-content: center; + align-items: center; + opacity: 0.5; + min-height: 100px; + text-align: center; +} + +.logprobs_output_prefix { + opacity: 0.5; +} + +.logprobs_candidate_list { + grid-row-start: 3; + grid-row-end: 4; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); + gap: 2px; + padding: 2px; + border-top: 1px solid var(--SmartThemeBodyColor); + text-align: center; +} + +.logprobs_top_candidate { + border: none; + background-color: transparent; + color: inherit; + font: inherit; +} + +.logprobs_top_candidate:not([disabled]) { + cursor: pointer; +} + +.logprobs_top_candidate.selected { + background-color: rgba(0, 255, 0, 0.2); + font-weight: bold; +} + +.logprobs_top_candidate:not([disabled]):hover { + background-color: rgba(0, 0, 0, 0.3); +} + +.logprobs_tint_0 { + background-color: rgba(255, 255, 0, 0.05); +} + +.logprobs_tint_0:hover, .logprobs_tint_0.selected { + background-color: rgba(255, 255, 0, 0.4); +} + +.logprobs_tint_1 { + background-color: rgba(255, 0, 255, 0.05); +} + +.logprobs_tint_1:hover, .logprobs_tint_1.selected { + background-color: rgba(255, 0, 255, 0.4); +} + +.logprobs_tint_2 { + background-color: rgba(0, 255, 255, 0.05); +} + +.logprobs_tint_2:hover, .logprobs_tint_2.selected { + background-color: rgba(0, 255, 255, 0.4); +} + +.logprobs_tint_3 { + background-color: rgba(50, 205, 50, 0.05); +} + +.logprobs_tint_3:hover, .logprobs_tint_3.selected { + background-color: rgba(50, 205, 50, 0.4); +} diff --git a/public/css/mobile-styles.css b/public/css/mobile-styles.css new file mode 100644 index 0000000000000000000000000000000000000000..a368167256d97d47c54f39e40bab53cd3d673c10 --- /dev/null +++ b/public/css/mobile-styles.css @@ -0,0 +1,506 @@ +/*will apply to anything 1000px or less. this catches ipads, horizontal phones, and vertical phones)*/ +@media screen and (max-width: 1000px) { + + #send_form.compact #leftSendForm, + #send_form.compact #rightSendForm { + flex-wrap: nowrap; + width: unset; + } + + #sheldWidthToggleBlock { + display: none; + } + + .bg_button { + font-size: 15px; + } + + .mes_text img { + width: 100%; + } + + #extensions_settings, + #extensions_settings2 { + width: 100% !important; + min-width: 100% !important; + } + + body:not(.waifuMode) .zoomed_avatar { + min-width: 100px; + min-height: 100px; + position: absolute; + padding: 0; + filter: drop-shadow(2px 2px 2px #51515199); + z-index: 30; + overflow: hidden; + right: 0; + width: fit-content; + max-height: calc(60vh - 60px); + max-height: calc(60dvh - 60px); + max-width: 90vw; + max-width: 90dvw; + left: 50%; + top: 50%; + transform: translateX(-50%) translateY(-50%); + align-items: center; + justify-content: center; + height: fit-content; + width: 100%; + } + + .zoomed_avatar .dragClose { + display: unset; + } + + /* .world_entry_thin_controls, */ + #persona-management-block, + #character_popup .flex-container { + flex-direction: column; + } + + #WIMultiSelector { + align-self: normal; + } + + .WIEntryContentAndMemo { + flex-flow: column; + } + + .WIEntryContentAndMemo .world_entry_thin_controls { + width: 100%; + } + + .world_entry_form_control.world_entry_form_horizontal { + /* flex-direction: column; */ + align-items: flex-start; + row-gap: 0.5rem; + } + + .world_entry_form_control.world_entry_form_horizontal .world_popup_expander { + display: none; + } + + .world_entry .inline-drawer-toggle { + padding-bottom: 5px; + } + + #worldInfoScanningCheckboxes { + flex-flow: row; + flex-wrap: wrap; + } + + body { + touch-action: none; + overflow: hidden; + position: fixed; + + } + + .world_entry_form_control { + /* width: 100%; */ + } + + .drawer-content { + min-width: unset; + width: 100%; + max-height: calc(100vh - 45px); + max-height: calc(100dvh - 45px); + position: fixed; + left: 0; + top: 5px; + border: 1px solid var(--SmartThemeBorderColor); + } + + .drawer-content .floating_panel_maximize, + .drawer-content .inline-drawer-maximize { + display: none; + } + + #select_chat_popup { + align-items: start; + height: min-content; + align-content: start; + max-width: unset; + } + + #wiActivationSettings, + #wiTopBlock { + flex-direction: column; + } + + #top-settings-holder, + #top-bar { + position: fixed; + width: 100vw; + width: 100dvw; + } + + #bg1, + #bg_custom { + height: 100vh !important; + height: 100dvh !important; + width: 100vw !important; + width: 100dvw !important; + background-position: center; + + } + + + #sheld, + #character_popup, + .drawer-content { + width: 100% !important; + margin: 0 auto; + max-width: 100%; + left: 0 !important; + resize: none !important; + top: var(--topBarBlockSize); + } + + .wi-settings { + flex-direction: column; + gap: 5px !important; + } + + .WIEntryTitleAndStatus, + .WIEntryHeaderControls { + width: 100%; + } + + #WIEntryHeaderTitlesPC { + display: none; + } + + .WIEntryHeaderTitleMobile { + display: block !important; + } + + #character_popup, + #world_popup { + overflow-y: auto; + } + + #character_popup, + #send_form { + border: 1px solid var(--SmartThemeBorderColor); + backdrop-filter: blur(calc(var(--SmartThemeBlurStrength) * 2)); + max-width: 100dvw; + } + + #chat { + border-left: 1px solid var(--SmartThemeBorderColor); + border-right: 1px solid var(--SmartThemeBorderColor); + border-bottom: 1px solid var(--SmartThemeBorderColor); + align-items: start; + align-content: start; + overflow-y: auto; + overflow-x: hidden + } + + .mes_buttons { + font-size: calc(var(--mainFontSize)*1.2); + } + + .drag-grabber, + .pull-tab { + display: none !important; + + } + + #showRawPrompt, + #copyPromptToClipboard, + #groupCurrentMemberPopoutButton, + #summaryExtensionPopoutButton { + display: none; + } + + #right-nav-panel, + #left-nav-panel, + #floatingPrompt, + #cfgConfig, + #logprobsViewer, + #movingDivs>div { + /* 100vh are fallback units for browsers that don't support dvh */ + height: calc(100vh - 45px); + height: calc(100dvh - 45px); + min-width: 100% !important; + width: 100% !important; + max-width: 100% !important; + overflow-y: hidden; + border-left: 1px solid var(--SmartThemeBorderColor); + border-right: 1px solid var(--SmartThemeBorderColor); + border-bottom: 1px solid var(--SmartThemeBorderColor); + border-radius: 0 0 20px 20px; + top: var(--topBarBlockSize) !important; + left: 0 !important; + backdrop-filter: blur(calc(var(--SmartThemeBlurStrength) * 2)); + } + + /* + #right-nav-panel { + padding-right: 15px; + } + */ + + #floatingPrompt, + #cfgConfig, + #logprobsViewer, + #movingDivs>div { + height: min-content; + } + + #right-nav-panel h4 { + margin: 5px auto; + } + + #result_info { + font-size: calc(var(--mainFontSize) - .1rem); + } + + /* .avatar_div { + margin-top: 5px; + } */ + + #character_popup { + width: 100%; + border-radius: 0 0 20px 20px; + margin-top: 0px; + height: calc(100% - var(--topBarBlockSize)); + } + + .drawer25pWidth { + flex-basis: max(calc(100% / 4 - 10px), 190px); + } + + .drawer33pWidth { + flex-basis: max(calc(100% / 3 - 10px), 190px); + } + + .expression-holder { + display: none; + } + + body.waifuMode #sheld { + height: 40vh; + height: 40dvh; + top: 60vh; + top: 60dvh; + bottom: 0 !important; + } + + body:not(.waifuMode) #expression-wrapper { + visibility: hidden; + } + + #visual-novel-wrapper { + position: unset !important; + } + + body.waifuMode .expression-holder { + /*display: inline;*/ + + max-width: 100vw; + height: 100vh; + width: max-content; + margin: 0 auto; + position: absolute; + left: 0; + right: 0; + filter: drop-shadow(2px 2px 2px #51515199); + z-index: 1 !important; + } + + body.waifuMode img.expression { + object-fit: cover; + } + + body.waifuMode .zoomed_avatar_container { + height: 100%; + } + + body.waifuMode .zoomed_avatar { + width: fit-content; + max-height: calc(60vh - 60px); + max-height: calc(60dvh - 60px); + max-width: 90vw; + max-width: 90dvw; + } + + .scrollableInner { + overflow-y: auto; + overflow-x: hidden; + max-height: calc(100vh - 90px); + max-height: calc(100dvh - 90px); + } + + .horde_multiple_hint { + display: none; + } + + .bg_list { + width: unset; + } +} + +@media screen and (min-width: 1001px) { + + #PygOverrides, + #ContextFormatting, + #UI-Theme-Block, + #UI-Customization, + #power-user-options-block { + flex: 1; + } +} + +/*landscape mode phones and ipads*/ +@media screen and (max-width: 1000px) and (orientation: landscape) { + body.waifuMode img.expression { + object-fit: contain; + } + + .tag.excluded:after { + top: unset; + bottom: unset; + } + + body:not(.waifuMode) .zoomed_avatar { + max-height: calc(60vh - 60px); + max-height: calc(60dvh - 60px); + max-width: 90vw; + max-width: 90dvw; + left: 50%; + top: 50%; + transform: translateX(-50%) translateY(-50%); + align-items: center; + justify-content: center; + height: fit-content; + width: 100%; + } +} + +/*portrait mode phones*/ +@media screen and (max-width: 450px) { + + body:not(.waifuMode) .zoomed_avatar { + min-width: 100px; + min-height: 100px; + max-height: 50vh; + max-width: 90vw; + position: absolute; + padding: 0; + filter: drop-shadow(2px 2px 2px #51515199); + z-index: 30; + overflow: hidden; + display: none; + right: 0; + left: 50%; + top: 50%; + transform: translateX(-50%) translateY(-50%); + align-items: center; + justify-content: center; + height: fit-content; + width: 100%; + } + + .drawer25pWidth { + flex-basis: max(calc(100% / 2 - 10px), 180px); + } + + .drawer33pWidth { + flex-basis: max(calc(100% / 2 - 10px), 180px); + } + + .BGSampleTitle { + display: none; + } + + .tag.excluded:after { + top: unset; + bottom: unset; + } + + + #leftSendForm, + #rightSendForm { + width: 1.15em; + flex-wrap: wrap; + height: unset; + } +} + +/*iOS specific*/ +@supports (-webkit-touch-callout: none) { + body { + margin: 0 auto; + } + + #top-bar { + width: 100vw; + } + + #sheld { + margin: unset; + padding: unset; + width: unset; + height: unset; + min-width: unset; + max-width: unset; + min-height: unset; + max-height: unset; + width: 100vw; + width: 100dvw; + height: calc(100vh - 36px); + height: calc(100dvh - 36px); + padding-right: max(env(safe-area-inset-right), 0px); + padding-left: max(env(safe-area-inset-left), 0px); + padding-bottom: 0; + } + + body.PWA #sheld { + padding-right: max(env(safe-area-inset-right), 2px); + padding-left: max(env(safe-area-inset-left), 2px); + padding-bottom: max(env(safe-area-inset-bottom), 15px); + + } + + #character_popup, + #world_popup, + #left-nav-panel, + #right-nav-panel, + .drawer-content { + width: unset; + height: unset; + min-width: unset; + max-width: unset; + min-height: unset; + max-height: unset; + backdrop-filter: blur(calc(var(--SmartThemeBlurStrength) * 2)); + left: 0; + right: 0; + top: 0; + margin: 0 auto; + height: calc(100vh - 70px); + height: calc(100dvh - 70px); + width: calc(100% - 5px); + max-height: calc(100vh - 70px); + max-height: calc(100dvh - 70px); + max-width: calc(100% - 5px); + + } + + #character_popup, + #world_popup, + .drawer-content { + margin-top: 36px; + } + + .scrollableInner { + overflow-y: auto; + overflow-x: hidden; + } + + #horde_model { + height: unset; + } +} diff --git a/public/css/popup-safari-fix.css b/public/css/popup-safari-fix.css new file mode 100644 index 0000000000000000000000000000000000000000..e9dbdc7f922003de66d4f45266773e0dc935e415 --- /dev/null +++ b/public/css/popup-safari-fix.css @@ -0,0 +1,11 @@ +/* iPhone copium land */ +body.safari .popup .popup-body:has(.maximized_textarea), +body.safari .popup.large_dialogue_popup .popup-body { + height: 100%; +} + +body.safari .popup .popup-body { + height: fit-content; + max-height: 90vh; + max-height: 90dvh; +} diff --git a/public/css/popup.css b/public/css/popup.css new file mode 100644 index 0000000000000000000000000000000000000000..6809d72487f29a1286f034c6d71a81b951615fac --- /dev/null +++ b/public/css/popup.css @@ -0,0 +1,184 @@ +@import url('./popup-safari-fix.css'); + +dialog { + color: var(--SmartThemeBodyColor); +} + +/* Closed state of the dialog */ +.popup { + width: 500px; + text-align: center; + box-shadow: 0px 0px 14px var(--black70a); + border: 1px solid var(--SmartThemeBorderColor); + padding: 4px 14px; + background-color: var(--SmartThemeBlurTintColor); + border-radius: 10px; + display: flex; + flex-direction: column; + + max-height: calc(100dvh - 2em); + max-width: calc(100dvw - 2em); + min-height: fit-content; + + /* Overflow visible so elements (like toasts) can appear outside of the dialog. '.popup-body' is hiding overflow for the real content. */ + overflow: visible; + + /* Fix weird animation issue with font-scaling during popup open */ + backface-visibility: hidden; + transform: translateZ(0); + -webkit-font-smoothing: subpixel-antialiased; + + /* Variables setup */ + --popup-animation-speed: var(--animation-duration-slow); +} + +/** Popup styles applied to the main popup */ +.popup--animation-fast { --popup-animation-speed: var(--animation-duration); } +.popup--animation-slow { --popup-animation-speed: var(--animation-duration-slow); } +.popup--animation-none { --popup-animation-speed: 0ms; } + +/* Styling of main popup elements */ +.popup .popup-body { + display: flex; + flex-direction: column; + overflow: hidden; + width: 100%; + height: 100%; + padding: 1px; +} + +.popup .popup-content { + margin-top: 10px; + padding: 0 8px; + overflow: hidden; + flex-grow: 1; +} + +.popup .popup-content h3:first-child { + /* No double spacing for the first heading needed, the .popup-content already has margin */ + margin-top: 0px; +} + +.popup.vertical_scrolling_dialogue_popup .popup-content { + overflow-y: auto; +} + +.popup.horizontal_scrolling_dialogue_popup .popup-content { + overflow-x: auto; +} + +/* Opening animation */ +.popup[opening] { + animation: pop-in var(--popup-animation-speed) ease-in-out; +} + +.popup[opening]::backdrop { + animation: fade-in var(--popup-animation-speed) ease-in-out; +} + +/* Open state of the dialog */ +.popup[open] { + color: var(--SmartThemeBodyColor); +} + +.popup[open]::backdrop { + backdrop-filter: blur(calc(var(--SmartThemeBlurStrength) * 2)); + -webkit-backdrop-filter: blur(calc(var(--SmartThemeBlurStrength) * 2)); + background-color: var(--black30a); +} + +body.no-blur .popup[open]::backdrop { + backdrop-filter: none; + -webkit-backdrop-filter: none; +} + +/* Closing animation */ +.popup[closing] { + animation: pop-out var(--popup-animation-speed) ease-in-out; +} + +.popup[closing]::backdrop { + animation: fade-out var(--popup-animation-speed) ease-in-out; +} + +.popup #toast-container { + /* Fix toastr in dialogs by actually placing it at the top of the screen via transform */ + height: 100dvh; + top: calc(50% + var(--topBarBlockSize)); + left: 50%; + transform: translate(-50%, -50%); + + /* Fix text align, popups are centered by default. toasts should not. */ + text-align: left; +} + +.popup-crop-wrap { + margin: 10px auto; + max-height: 75vh; + max-height: 75dvh; + max-width: 100%; +} + +.popup-crop-wrap img { + max-width: 100%; + /* This rule is very important, please do not ignore this! */ +} + +.popup-inputs { + margin-top: 10px; + font-size: smaller; + opacity: 0.7; +} + +.popup-input { + margin-top: 10px; +} + +.popup-controls { + margin-top: 10px; + display: flex; + align-self: center; + gap: 20px; +} + +.menu_button.menu_button_default { + box-shadow: 0 0 5px var(--white20a); +} + +.menu_button.popup-button-ok { + background-color: var(--crimson70a); +} + +.menu_button.popup-button-ok:hover { + background-color: var(--crimson-hover); +} + +.popup-controls .menu_button { + /* Popup buttons should not scale to smallest size, otherwise they will always break to multiline if multiple words */ + width: unset; + + /* Fix weird animation issue with fonts on brightness filter */ + backface-visibility: hidden; + transform: translateZ(0); + -webkit-font-smoothing: subpixel-antialiased; +} + +.popup-controls .menu_button:hover:focus-visible { + filter: brightness(1.3) saturate(1.3); +} + +.popup .popup-button-close { + position: absolute; + top: -6px; + right: -6px; + width: 24px; + height: 24px; + font-size: 20px; + padding: 2px 3px 3px 2px; + + filter: brightness(0.8); + + /* Fix weird animation issue with font-scaling during popup open */ + backface-visibility: hidden; +} + diff --git a/public/css/promptmanager.css b/public/css/promptmanager.css new file mode 100644 index 0000000000000000000000000000000000000000..5370a98e84f2bcb35cfc63c10431364942cc59a4 --- /dev/null +++ b/public/css/promptmanager.css @@ -0,0 +1,318 @@ +#completion_prompt_manager .caution { + color: var(--fullred); +} + +#completion_prompt_manager #completion_prompt_manager_list { + display: flex; + flex-direction: column; + min-height: 300px; +} + +#completion_prompt_manager .completion_prompt_manager_list_separator hr { + grid-column-start: 1; + grid-column-end: 4; + width: 100%; + margin: 0.5em 0; + background-image: linear-gradient(90deg, var(--transparent), var(--SmartThemeBorderColor), var(--transparent)); + min-height: 1px; +} + +#completion_prompt_manager #completion_prompt_manager_list li { + display: grid; + grid-template-columns: 4fr 80px 45px; + margin-bottom: 0.5em; + width: 100% +} + +#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt .completion_prompt_manager_prompt_name .fa-solid { + color: var(--white50a); +} + +#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt_invisible { + display: none; +} + +#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt_visible { + display: grid; +} + + +#completion_prompt_manager #completion_prompt_manager_list li.completion_prompt_manager_list_head .prompt_manager_prompt_tokens, +#completion_prompt_manager #completion_prompt_manager_list li.completion_prompt_manager_prompt .prompt_manager_prompt_tokens { + font-size: calc(var(--mainFontSize)*0.9); + text-align: right; +} + +#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt .prompt_manager_prompt_controls { + text-align: right; +} + +#completion_prompt_manager .completion_prompt_manager_list_head { + padding: 0.5em 0.5em 0; +} + +#completion_prompt_manager #completion_prompt_manager_list li.completion_prompt_manager_prompt { + align-items: center; + padding: 0.5em; + border: 1px solid var(--SmartThemeBorderColor); +} + +#completion_prompt_manager #completion_prompt_manager_list li.completion_prompt_manager_prompt .prompt_manager_prompt_controls { + display: flex; + justify-content: space-between; + font-size: calc(var(--mainFontSize)*1.2); +} + +#completion_prompt_manager #completion_prompt_manager_list li.completion_prompt_manager_prompt .prompt_manager_prompt_controls span { + display: flex; + height: 18px; + width: 18px; +} + +#completion_prompt_manager #completion_prompt_manager_list li.completion_prompt_manager_prompt span span span { + flex-direction: column; + justify-content: center; + margin-left: 0.25em; + cursor: pointer; + transition: 0.3s ease-in-out; + height: 20px; + width: 20px; + filter: drop-shadow(0px 0px 2px black); + opacity: 0.4; +} + +#completion_prompt_manager #completion_prompt_manager_list li.completion_prompt_manager_prompt span span:hover { + opacity: 1; +} + +#completion_prompt_manager_popup #completion_prompt_manager_popup_edit, +#completion_prompt_manager_popup #completion_prompt_manager_popup_chathistory_edit, +#completion_prompt_manager_popup #completion_prompt_manager_popup_dialogueexamples_edit, +#completion_prompt_manager_popup #completion_prompt_manager_popup_inspect { + display: none; + padding: 0.5em; +} + +#completion_prompt_manager_popup .completion_prompt_manager_popup_entry { + padding: 1em; + margin-top: 2em; +} + +#completion_prompt_manager_popup #completion_prompt_manager_popup_inspect .completion_prompt_manager_popup_entry { + padding: 1em; +} + +#completion_prompt_manager_popup #completion_prompt_manager_popup_entry_form_inspect_list { + margin-top: 1em; +} + +#completion_prompt_manager_popup .completion_prompt_manager_prompt { + margin: 1em 0; + padding: 0.5em; + border: 1px solid var(--SmartThemeBorderColor); +} + +#completion_prompt_manager_popup .completion_prompt_manager_popup_header { + display: flex; + justify-content: space-between; + align-items: center; +} + +#completion_prompt_manager_popup #completion_prompt_manager_popup_close_button { + font-size: 1em; + padding: 0.5em; +} + +.completion_prompt_manager_popup_entry_form_control { + margin-top: 1em; +} + +#prompt-manager-reset-character, +#completion_prompt_manager_popup .completion_prompt_manager_popup_entry_form_footer #completion_prompt_manager_popup_entry_form_reset { + color: rgb(220 173 16); +} + +#completion_prompt_manager_popup .completion_prompt_manager_popup_entry_form_footer #completion_prompt_manager_popup_entry_form_close, +#completion_prompt_manager_popup .completion_prompt_manager_popup_entry_form_footer #completion_prompt_manager_popup_entry_form_reset, +#completion_prompt_manager_popup .completion_prompt_manager_popup_entry_form_footer #completion_prompt_manager_popup_entry_form_save { + font-size: 1.25em; + padding: 0.5em; +} + +#completion_prompt_manager_popup .completion_prompt_manager_popup_entry_form_control #completion_prompt_manager_popup_entry_form_prompt { + min-height: 200px; +} + +#completion_prompt_manager_popup .completion_prompt_manager_popup_entry .completion_prompt_manager_popup_entry_form_footer { + display: flex; + justify-content: space-between; + margin-top: 1em; +} + +#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt_draggable { + cursor: grab; +} + +#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt_name { + white-space: nowrap; + overflow: hidden; +} + +#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt_name .prompt-manager-inspect-action { + color: var(--SmartThemeBodyColor); + cursor: pointer; +} + +#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt_name .prompt-manager-inspect-action:hover { + text-decoration: underline; +} + +#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt_disabled .completion_prompt_manager_prompt_name, +#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt_disabled .completion_prompt_manager_prompt_name .prompt-manager-inspect-action { + color: var(--white30a); +} + +#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt:not(.completion_prompt_manager_prompt_disabled) .prompt-manager-toggle-action { + color: var(--SmartThemeQuoteColor); +} + +#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt.completion_prompt_manager_prompt_disabled { + border: 1px solid var(--white20a); +} + +#completion_prompt_manager #completion_prompt_manager_list li.completion_prompt_manager_prompt .mes_edit { + margin-left: 0.5em; +} + +#completion_prompt_manager .completion_prompt_manager_error { + padding: 1em; + border: 3px solid var(--fullred); + margin-top: 1em; + margin-bottom: 0.5em; +} + +#completion_prompt_manager .completion_prompt_manager_header { + display: flex; + flex-direction: row; + justify-content: space-between; + color: var(--white50a); + margin-top: 0.5em; + padding: 0 0.25em; + width: 100% +} + +#completion_prompt_manager .completion_prompt_manager_header div { + margin-top: 0.5em; + width: fit-content; +} + +#completion_prompt_manager .completion_prompt_manager_header_advanced { + display: flex; + margin-right: 0.25em; +} + +#completion_prompt_manager .completion_prompt_manager_header_advanced span { + flex-direction: column; + justify-content: center; + margin-left: 0.25em; + transition: 0.3s ease-in-out; + filter: drop-shadow(0px 0px 2px black); +} + +#completion_prompt_manager .completion_prompt_manager_header_advanced span.fa-solid { + display: inherit; +} + +#completion_prompt_manager .completion_prompt_manager_footer { + display: flex; + flex-direction: row; + justify-content: flex-end; + gap: 0.25em; + padding: 0 0.25em; + width: 100% +} + +#completion_prompt_manager .completion_prompt_manager_footer a { + font-size: 12px; +} + +#completion_prompt_manager .completion_prompt_manager_important a { + font-weight: 600; +} + +#completion_prompt_manager #completion_prompt_manager_list .completion_prompt_manager_prompt .completion_prompt_manager_prompt_name .fa-solid.prompt-manager-overridden { + margin-left: 5px; + color: var(--SmartThemeQuoteColor); + cursor: pointer; + opacity: 0.8; +} + +#completion_prompt_manager_footer_append_prompt { + font-size: 16px; +} + +#prompt-manager-export-format-popup { + padding: 0.25em; + display: none; +} + +#prompt-manager-export-format-popup[data-show] { + display: block; +} + +#completion_prompt_manager_popup { + margin-top: 0; +} + +#completion_prompt_manager_popup { + overflow-y: auto; + height: calc(100% - var(--topBarBlockSize)); + position: absolute; + margin-left: auto; + margin-right: auto; + left: 0; + right: 0; + top: var(--topBarBlockSize); + box-shadow: 0 0 2px rgba(0, 0, 0, 0.5); + padding: 1em; + border: 1px solid var(--SmartThemeBorderColor); + flex-direction: column; + z-index: 3010 !important; + border-radius: 0 0 20px 20px; + background-color: var(--SmartThemeBlurTintColor); +} + +#prompt-manager-export-format-popup { + display: none; +} + +.prompt-manager-export-format-popup-flex { + display: flex; + flex-direction: column; +} + +.prompt-manager-export-format-popup-flex .row { + display: flex; + justify-content: space-between; +} + +.prompt-manager-export-format-popup-flex a, +.prompt-manager-export-format-popup-flex span { + display: flex; + margin: auto 0; + justify-content: space-between; +} + +#prompt-manager-export-format-popup span { + font-size: 16px; +} + +@media screen and (max-width: 412px) { + #completion_prompt_manager_popup { + max-width: 100%; + } + + #completion_prompt_manager #completion_prompt_manager_list li.completion_prompt_manager_prompt span span span { + margin-left: 0.5em; + } +} diff --git a/public/css/rm-groups.css b/public/css/rm-groups.css new file mode 100644 index 0000000000000000000000000000000000000000..499f59873c2ddda2069e844b03132a0a2d4fc0aa --- /dev/null +++ b/public/css/rm-groups.css @@ -0,0 +1,236 @@ +/* GROUP CHATS */ + +.group_pagination { + display: flex; + justify-content: center; + align-items: center; +} + +#rm_group_chats_block .tag.filterByGroups { + display: none; +} + +#rm_button_group_chats h2 { + margin-top: auto; + margin-bottom: auto; + color: rgb(188, 193, 200, 1); + border: 1px solid var(--SmartThemeBorderColor); + ; + background-color: rgba(0, 0, 0, 0.3); + padding: 6px; + border-radius: 10px; +} + +#rm_group_chats_block { + display: none; + align-items: flex-start; + padding: 0 5px; + overflow-y: auto; +} + +#rm_group_chats_block h3, +#rm_group_chats_block h5 { + margin-top: 5px; + margin-bottom: 5px; +} + +#rm_group_buttons>div { + display: flex; + flex-direction: column; +} + +#rm_group_buttons .checkbox { + display: flex; +} + +#rm_group_buttons .checkbox h4 { + display: inline-block; +} + +#rm_group_buttons>input { + + cursor: pointer; + user-select: none; +} + +#rm_group_buttons>input:disabled { + filter: brightness(0.3); + cursor: unset; +} + +#rm_group_buttons textarea { + margin: 0px; + min-width: 200px; +} + +#rm_group_members, +#rm_group_add_members { + margin-top: 0.25rem; + margin-bottom: 0.5rem; + border: 1px solid var(--SmartThemeBorderColor); + border-radius: 10px; + background-color: var(--black30a); + padding: 2px; +} + +#rm_group_buttons_expander { + flex-grow: 1; +} + +#rm_group_delete { + color: rgb(190, 0, 0); +} + +#rm_group_members:empty { + width: 100%; + padding: 0.5em 0; +} + +#rm_group_members:empty::before { + content: 'Group is empty'; + + font-weight: bolder; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + opacity: 0.8; +} + +#rm_group_add_members:empty { + width: 100%; +} + +#rm_group_add_members_header { + display: flex; + flex-direction: row; + width: 100%; + column-gap: 10px; +} + +#rm_group_add_members_header input { + flex: 1; + width: 100%; +} + +#rm_group_add_members:empty::before { + content: 'No characters available'; + + font-weight: bolder; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + opacity: 0.8; +} + +.group_member_icon { + display: flex; + column-gap: 10px; + align-items: center; + justify-content: end; + flex-grow: 1; +} + +.group_member { + display: flex; + flex-direction: row; + align-items: center; + width: 100%; + padding: 5px; + border-radius: 10px; +} + +.group_member .group_member_name { + flex-grow: 1; + margin-left: 10px; + overflow: hidden; + text-overflow: ellipsis; + width: calc(100% - 110px); + display: flex; + gap: 5px; + height: 100%; + flex-direction: column; + justify-content: center; +} + +.group_member_icon .flex-container { + gap: 0px; +} + +#rm_group_members .right_menu_button, +#rm_group_add_members .right_menu_button { + padding: 0px; + height: 20px; + display: flex; + align-items: center; +} + +#rm_group_members .right_menu_button[data-action="speak"], +#rm_group_members .group_member:not(.disabled) .right_menu_button[data-action="disable"] { + opacity: 0.4; + filter: brightness(0.5); + transition: all 0.2s ease-in-out; +} + +/* #rm_group_members .right_menu_button[data-action="speak"]:hover, */ +#rm_group_members .group_member:not(.disabled) .right_menu_button[data-action="disable"]:hover { + opacity: inherit; + filter: drop-shadow(0px 0px 5px rgb(243, 166, 65)); +} + +#rm_group_members .group_member.disabled .right_menu_button[data-action="enable"] { + filter: drop-shadow(0px 0px 5px rgb(243, 166, 65)); +} + + +#rm_group_members .right_menu_button[data-action="speak"]:hover { + opacity: inherit; + filter: drop-shadow(0px 0px 5px rgb(153, 255, 153)); +} + +/* Rules for icon display */ +#rm_group_add_members .right_menu_button:not([data-action="add"], [data-action="view"]), +#rm_group_members .right_menu_button[data-action="add"], +#rm_group_members .group_member.disabled .right_menu_button[data-action="disable"], +#rm_group_members .group_member:not(.disabled) .right_menu_button[data-action="enable"] { + display: none; +} + +.group_select { + display: flex; + flex-direction: row; + padding: 5px; + border-radius: 10px; + cursor: pointer; +} + +.group_select:hover { + background-color: var(--white30a); +} + +.group_select .avatar { + flex: 0; +} + +.group_select .group_icon { + width: 20px; + height: 20px; + margin: 0 10px; +} + +.group_select .group_fav_icon { + filter: drop-shadow(0px 0px 1px black); + color: #c5b457; + font-size: 12px; + order: -1; + margin-left: -18px; + margin-top: 3px; +} + +.group_member .avatar { + flex-shrink: 0; + flex-basis: auto; +} diff --git a/public/css/select2-overrides.css b/public/css/select2-overrides.css new file mode 100644 index 0000000000000000000000000000000000000000..01577846ed657b18ecf89446e0bc607789a25149 --- /dev/null +++ b/public/css/select2-overrides.css @@ -0,0 +1,270 @@ +/* Customize the Select2 container */ +.select2-container { + color: var(--SmartThemeBodyColor); +} + +/* Customize the dropdown */ +.select2-dropdown { + background-color: var(--SmartThemeBlurTintColor); + border: 1px solid var(--SmartThemeBorderColor) !important; + border-radius: 10px; + box-shadow: 0 0 5px black; + text-shadow: 0px 0px calc(var(--shadowWidth) * 1px) var(--SmartThemeShadowColor); + backdrop-filter: blur(calc(var(--SmartThemeBlurStrength)*2)); + color: var(--SmartThemeBodyColor); + z-index: 40000; +} + +.select2-selection__clear { + color: var(--SmartThemeBodyColor); +} + +.select2-container .select2-search__field { + opacity: 0.8; +} + +.select2-selection--single .select2-selection__placeholder { + color: var(--SmartThemeEmColor); +} + +.select2-container--classic .select2-selection--single .select2-selection__placeholder { + color: var(--SmartThemeEmColor); +} + +.select2-container .select2-selection--single .select2-selection__rendered { + color: var(--SmartThemeBodyColor); + line-height: revert; + padding-left: unset; +} + +.select2-container .select2-results>.select2-results__options { + max-height: 300px; +} + +.select2-container .select2-selection--multiple .select2-selection__choice__remove { + padding: revert; + border-right: 1px solid var(--SmartThemeBorderColor); + font-size: 1.1em; +} + +.select2-container .select2-selection--multiple .select2-selection__choice__display { + padding-left: 5px; +} + +/* Customize the search input */ +.select2-search__field { + background-color: var(--black30a); + color: var(--SmartThemeBodyColor); + border: 1px solid var(--SmartThemeBorderColor); + border-radius: 7px; + font-family: var(--mainFontFamily); + padding: 3px 5px; +} + +/* Customize the selected option */ +.select2-selection--single { + border: 1px solid var(--SmartThemeShadowColor); + border-radius: 4px; + background-color: var(--SmartThemeBlurTintColor); +} + +/* Customize the selected option text */ +.select2-selection__rendered { + color: var(--SmartThemeBodyColor); +} + +/* Customize the option list item */ +.select2-results__option { + color: var(--SmartThemeBodyColor); + background-color: var(--SmartThemeBodyColor); +} + +.select2-container .select2-selection--multiple, +.select2-container .select2-selection--single { + background-color: var(--black30a); + color: var(--SmartThemeBodyColor); + border: 1px solid var(--SmartThemeBorderColor); + border-radius: 7px; + font-family: var(--mainFontFamily); + padding: 3px 5px; +} + +.select2-container.select2-container--focus .select2-selection--multiple, +.select2-container.select2-container--focus .select2-selection--single { + border: 1px solid var(--SmartThemeBorderColor); +} + +.select2-container .select2-selection--multiple .select2-selection__choice, +.select2-container .select2-selection--single .select2-selection__choice { + border-radius: 5px; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + color: var(--SmartThemeBodyColor); + background-color: var(--black30a); + border-color: var(--SmartThemeBorderColor); + font-size: calc(var(--mainFontSize) - 5%); + text-shadow: none !important; +} + +.select2-results .select2-results__option--selectable { + background-color: unset; + color: var(--SmartThemeBodyColor); + opacity: 0.5; + transition: opacity 200ms ease-in-out; + position: relative; +} + +.select2-results .select2-results__option--group { + color: var(--SmartThemeBodyColor); + background-color: var(--SmartThemeBlurTintColor); + position: relative; +} + +/* Customize the hovered option list item */ +.select2-results .select2-results__option--highlighted.select2-results__option--selectable { + color: var(--SmartThemeBodyColor); + background-color: unset; + opacity: 1; +} + +.select2-results__option.select2-results__option--group::before { + display: none; +} + +/* Customize the option list item */ +.select2-results__option { + padding-left: 30px; + /* Add some padding to make room for the checkbox */ +} + +.select2-results .select2-results__option--group .select2-results__options--nested .select2-results__option { + padding-left: 2em; +} + +/* Add the custom checkbox */ +.select2-results__option::before { + content: ''; + display: inline-block; + position: absolute; + left: 6px; + top: 50%; + margin-top: -7px; + width: 14px; + height: 14px; + border: 1px solid var(--SmartThemeBorderColor); + background-color: var(--SmartThemeBlurTintColor); + border-radius: 2px; +} + +.select2-container .select2-selection--multiple .select2-selection__choice__remove, +.select2-container .select2-selection--single .select2-selection__choice__remove { + color: var(--SmartThemeBodyColor); +} + +/* Add the custom checkbox checkmark */ +.select2-results__option--selected.select2-results__option::before { + content: '\2713'; + font-weight: bold; + color: var(--SmartThemeBodyColor); + background-color: var(--SmartThemeBlurTintColor); + text-align: center; + line-height: 14px; +} + +.select2-results__option.select2-results__message { + background-color: inherit; +} + +.select2-results__option.select2-results__message::before { + display: none; +} + +.select2-selection__choice__display { + /* Fix weird alignment of the inside block */ + margin-left: 3px; + margin-right: 1px; +} + +/* Styling for choice remove icon */ +span.select2.select2-container .select2-selection__choice__remove { + cursor: pointer; + transition: background-color 0.3s; + color: var(--SmartThemeBodyColor); + background-color: var(--black50a); +} + +span.select2.select2-container .select2-selection__choice__remove:hover { + color: var(--SmartThemeBodyColor); + background-color: var(--white30a); +} + +/* Custom class to support styling to show clickable choice options */ +.select2_choice_clickable+span.select2-container .select2-selection__choice__display { + cursor: pointer; +} + +.select2_choice_clickable_buttonstyle+span.select2-container .select2-selection__choice__display { + cursor: pointer; + transition: background-color 0.3s; + color: var(--SmartThemeBodyColor); + background-color: var(--black50a); + white-space: break-spaces; + word-break: break-all; +} + +.select2_choice_clickable_buttonstyle+span.select2-container .select2-selection__choice__display:hover { + background-color: var(--white30a); +} + +/* Custom class to support same line multi inputs of select2 controls */ +.select2_multi_sameline+span.select2-container .select2-selection--multiple { + display: flex; + flex-wrap: wrap; +} + +.select2_multi_sameline+span.select2-container .select2-selection--multiple .select2-search--inline { + /* Allow search placeholder to take up all space if needed */ + flex-grow: 1; +} + +.select2_multi_sameline+span.select2-container .select2-selection--multiple .select2-selection__rendered { + /* Fix weird styling choice or huge margin around selected options */ + margin-block-start: 2px; + margin-block-end: 2px; + display: flex; + align-items: center; + flex-wrap: wrap; + row-gap: 5px; +} + +.select2_multi_sameline+span.select2-container .select2-selection--multiple .select2-selection__choice { + margin-top: 0px; +} + +.select2_multi_sameline+span.select2-container .select2-selection--multiple .select2-search__field { + /* Min height to reserve spacing */ + min-height: calc(var(--mainFontSize) + 13px); + /* Min width to be clickable */ + min-width: 4em; + align-content: center; + /* Fix search textarea alignment issue with UL elements */ + margin-top: 0px; + height: unset; + /* Prevent height from jumping around when input is focused */ + line-height: 1; +} + +.select2_multi_sameline+span.select2-container .select2-selection--multiple .select2-selection__rendered { + /* Min height to reserve spacing */ + min-height: calc(var(--mainFontSize) + 13px); +} + +/* Make search bar invisible unless the select2 is active, to save space */ +.select2_multi_sameline+span.select2-container .select2-selection--multiple .select2-search--inline { + height: 1px; +} + +.select2_multi_sameline+span.select2-container.select2-container--focus .select2-selection--multiple .select2-search--inline { + height: unset; +} diff --git a/public/css/select2.min.css b/public/css/select2.min.css new file mode 100644 index 0000000000000000000000000000000000000000..39a4547ff6bf750e7be6a5345138436a31215390 --- /dev/null +++ b/public/css/select2.min.css @@ -0,0 +1 @@ +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{background-color:transparent;border:none;font-size:1em}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline;list-style:none;padding:0}.select2-container .select2-selection--multiple .select2-selection__clear{background-color:transparent;border:none;font-size:1em}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;margin-left:5px;padding:0;max-width:100%;resize:none;height:18px;vertical-align:bottom;font-family:sans-serif;overflow:hidden;word-break:keep-all}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option--selectable{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;height:26px;margin-right:20px;padding-right:0px}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;padding-bottom:5px;padding-right:5px;position:relative}.select2-container--default .select2-selection--multiple.select2-selection--clearable{padding-right:25px}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;font-weight:bold;height:20px;margin-right:10px;margin-top:5px;position:absolute;right:0;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:inline-block;margin-left:5px;margin-top:5px;padding:0;padding-left:20px;position:relative;max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom;white-space:nowrap}.select2-container--default .select2-selection--multiple .select2-selection__choice__display{cursor:default;padding-left:2px;padding-right:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{background-color:transparent;border:none;border-right:1px solid #aaa;border-top-left-radius:4px;border-bottom-left-radius:4px;color:#999;cursor:pointer;font-size:1em;font-weight:bold;padding:0 4px;position:absolute;left:0;top:0}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover,.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:focus{background-color:#f1f1f1;color:#333;outline:none}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__display{padding-left:5px;padding-right:2px}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{border-left:1px solid #aaa;border-right:none;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:4px;border-bottom-right-radius:4px}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__clear{float:left;margin-left:10px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--group{padding:0}.select2-container--default .select2-results__option--disabled{color:#999}.select2-container--default .select2-results__option--selected{background-color:#ddd}.select2-container--default .select2-results__option--highlighted.select2-results__option--selectable{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;height:26px;margin-right:20px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0;padding-bottom:5px;padding-right:5px}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;display:inline-block;margin-left:5px;margin-top:5px;padding:0}.select2-container--classic .select2-selection--multiple .select2-selection__choice__display{cursor:default;padding-left:2px;padding-right:5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{background-color:transparent;border:none;border-top-left-radius:4px;border-bottom-left-radius:4px;color:#888;cursor:pointer;font-size:1em;font-weight:bold;padding:0 4px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555;outline:none}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__display{padding-left:5px;padding-right:2px}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:4px;border-bottom-right-radius:4px}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option--group{padding:0}.select2-container--classic .select2-results__option--disabled{color:grey}.select2-container--classic .select2-results__option--highlighted.select2-results__option--selectable{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/public/css/solid.min.css b/public/css/solid.min.css new file mode 100644 index 0000000000000000000000000000000000000000..e7d97d261527801d14db9d51d33d1e507a92eacc --- /dev/null +++ b/public/css/solid.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900} \ No newline at end of file diff --git a/public/css/st-tailwind.css b/public/css/st-tailwind.css new file mode 100644 index 0000000000000000000000000000000000000000..d43bd8e018e92de2488b44063b8ed1800704b8e7 --- /dev/null +++ b/public/css/st-tailwind.css @@ -0,0 +1,606 @@ +.text_warning { + color: rgb(220 173 16); +} + +.text_danger { + color: var(--fullred); +} + +.highlighted { + color: black; + background-color: yellow; + text-shadow: none !important; +} + +.m-t-0 { + margin-top: 0; +} + +.m-t-1 { + margin-top: 1em; +} + +.m-t-2 { + margin-top: 2em; +} + +.m-t-3 { + margin-top: 3em; +} + +.m-t-4 { + margin-top: 4em; +} + +.m-t-5 { + margin-top: 5em; +} + +.m-b-1 { + margin-bottom: 1em; +} + +.m-b-2 { + margin-bottom: 2em; +} + +.m-b-3 { + margin-bottom: 3em; +} + +.m-b-4 { + margin-bottom: 4em; +} + +.m-b-5 { + margin-bottom: 5em; +} + +.tooltip { + cursor: help; +} + +.margin-bot-10px, +.marginBot10 { + margin-bottom: 10px !important; +} + +.marginTop10 { + margin-top: 10px !important; +} + +.marginBot5 { + margin-bottom: 5px !important; +} + +.marginTop5 { + margin-top: 5px !important; +} + +.marginTopBot5 { + margin-top: 5px !important; + margin-bottom: 5px !important; +} + +.margin5 { + margin: 5px; +} + +.marginLeft5 { + margin-left: 5px; +} + +.overflowYAuto { + overflow-y: auto; +} + +.heightMinContent { + height: min-content; +} + +.justifySpaceBetween { + justify-content: space-between; +} + +.justifySpaceEvenly { + justify-content: space-evenly; +} + +.justifySpaceAround { + justify-content: space-around; +} + +.alignitemsflexstart { + align-items: flex-start !important; +} + +.alignItemsFlexEnd { + align-items: flex-end !important; +} + +.alignItemsBaseline { + align-items: baseline !important; +} + +.alignSelfStart { + align-self: start; +} + +.gap0 { + gap: 0 !important; +} + +.gap3px { + gap: 3px !important; +} + +.gap5px { + gap: 5px !important; +} + +.gap10px { + gap: 10px !important; +} + +.gap10h20v { + gap: 10px 20px !important; +} + +.gap10h5v { + gap: 5px 10px !important; +} + +.wide10pMinFit { + width: 10%; + min-width: fit-content; +} + +.wide100pLess70px { + width: calc(100% - 70px); +} + +.wideMax100px { + max-width: 100px; +} + +.width100px { + width: 100px; +} + +.widthUnset { + width: unset; +} + +.no-border { + border: none !important; +} + +.no-shadow { + box-shadow: none !important; +} + +.height100p { + height: 100%; +} + +.height100pSpaceEvenly { + align-content: space-evenly; + height: 100%; +} + +.height32px { + height: 32px; +} + +.TxtLrgBoldCenter { + text-align: center; + font-size: large; + font-weight: 600; +} + +.textAlignCenter { + text-align: center; +} + +.margin-right-10px { + margin-right: 10px; +} + + +.success { + color: green; +} + +.failure { + color: red; +} + +.optional { + color: lightgray; +} + +.monospace { + font-family: var(--monoFontFamily); +} + +.expander { + flex-grow: 1; +} + +.redOverlayGlow { + color: #800; + opacity: 0.8 !important; + text-shadow: none !important; +} + +.width100p { + width: 100%; +} + +.flex { + display: flex; +} + +.flexBasis100p { + flex-basis: 100%; +} + +.flexBasis50p { + flex-basis: 50% +} + +.flexBasis25p { + flex-basis: 25% +} + +.flexBasis200px { + flex-basis: 200px +} + +.flexBasis48p { + flex-basis: 48% +} + +.flexBasis30p { + flex-basis: 30%; +} + +.flex-container { + display: flex; + gap: 5px; + flex-wrap: wrap; +} + +.flexNoGap { + gap: unset !important; +} + +.flexGrow { + flex-grow: 1; +} + +.flexShrink { + flex-shrink: 1 +} + +.flexWrap { + flex-wrap: wrap; +} + +.flexnowrap, +.flexNoWrap { + flex-wrap: nowrap; +} + +.inline-flex { + display: inline-flex; +} + +.inline-block { + display: inline-block; +} + +.alignitemscenter, +.alignItemsCenter { + align-items: center; +} + +.alignitemsstart, +.alignItemsStart { + align-items: start; +} + +.overflow-hidden { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.maxWidth200px { + max-width: 200px; +} + +.alignContentFlexStart { + align-content: flex-start; +} + +.alignContentCenter { + align-content: center; +} + +.overflowHidden { + overflow: hidden; +} + +.padding0 { + padding: 0; +} + +.padding5 { + padding: 5px; +} + +.padding10 { + padding: 10px; +} + +.margin0 { + margin: 0; +} + +.margin0auto { + margin: 0 auto; +} + +.margin-r5 { + margin-right: 5px; +} + +.margin-r2 { + margin-right: 2px; +} + +.flex0 { + flex: 0; +} + +.flex1 { + flex: 1; +} + +.flex2 { + flex: 2 !important; +} + +.flex3 { + flex: 3; +} + +.flex4 { + flex: 4; +} + +.flexFlowColumn { + flex-flow: column; +} + +.flexFlowRow { + flex-flow: row; +} + +.wideMinContent { + width: min-content; +} + +.flexWide50p { + flex: 50%; +} + +.wide25p { + width: 25%; +} + +.wide30p { + width: 30% !important; +} + +.justifyLeft { + text-align: start; + justify-content: left; + margin-left: unset; +} + +.justifyCenter { + justify-content: center; + margin: 0 auto; +} + +.justifyContentSpaceAround { + justify-content: space-around; +} + +.justifyContentFlexStart { + justify-content: flex-start; +} + +.justifyContentFlexEnd { + justify-content: flex-end; +} + +.spaceEvenly { + justify-content: space-evenly; +} + +.spaceBetween { + justify-content: space-between; +} + +.widthNatural { + width: unset !important; + min-width: unset !important; + max-width: unset !important; +} + +.widthFreeExpand { + width: -webkit-fill-available; + width: -moz-available; +} + +.wide100p { + width: 100%; +} + +.wide50p { + width: 50%; +} + +.wide50px { + width: 50px; +} + +.indent20p { + margin-left: 20px; +} + +/*used to fix smallness of certain FontAwesome glyph which break button squareness*/ +/*currently used on: CharList Import*/ + +.faSmallFontSquareFix { + font-size: calc(var(--mainFontSize) *1.25); + width: calc(var(--mainFontSize) *1.95); +} + +.textarea_compact { + font-size: calc(var(--mainFontSize) * 0.95); + line-height: 1.2; +} + +.custom-katex-html, +.katex-html { + display: none; +} + +.hoverglow { + transition: opacity 200ms; +} + +.hoverglow:hover { + opacity: 1 !important; + cursor: pointer; +} + +input:disabled, +textarea:disabled { + cursor: not-allowed; + filter: brightness(0.5); +} + +.debug-red { + border: 1px solid red !important; +} + +.debug-yellow { + border: 1px solid yellow !important; +} + +.debug-green { + border: 1px solid green !important; +} + +.debug-blue { + border: 1px solid blue !important; +} + +.debug-purple { + border: 1px solid purple !important; +} + +.fontsize120p { + font-size: calc(var(--mainFontSize) * 1.2) !important; +} + +.fontsize90p { + font-size: calc(var(--mainFontSize) * 0.9) !important; +} + +.fontsize80p { + font-size: calc(var(--mainFontSize) * 0.8) !important; +} + +.fontsize60p { + font-size: calc(var(--mainFontSize) * 0.6) !important; +} + +.paddingBottom5px { + padding: unset; + padding-bottom: 5px; +} + +.paddingTopBot5 { + padding: 5px 0; +} + +.paddingLeftRight5 { + padding: 0 5px; +} + +.heightFitContent { + height: fit-content; +} + +.widthFitContent { + width: fit-content; + min-width: fit-content; +} + +.flexGap5 { + gap: 5px; +} + +.flexGap10 { + gap: 10px; +} + +.opacity50p { + opacity: 0.5 +} + +.grayscale { + filter: grayscale(100%); +} + +.opacity1 { + opacity: 1 !important; +} + +.circleborder30px { + right: 30px; + top: 10px; + position: absolute; + border: 1px solid var(--SmartThemeBodyColor); + border-radius: 100%; + aspect-ratio: 1 / 1; + height: 30px; + text-align: center; + padding: 5px; +} + +ul.li-padding-b-1 li { + padding-bottom: 1em; +} + +ul.li-padding-b-2 li { + padding-bottom: 2em; +} + +ul.li-padding-b-5 li { + padding-bottom: 5em; +} + +ul.li-padding-bot5 li { + padding-bottom: 5px; +} + +ul.li-padding-bot10 li { + padding-bottom: 10px; +} diff --git a/public/css/tags.css b/public/css/tags.css new file mode 100644 index 0000000000000000000000000000000000000000..fb2c165fedd8c8ddcf944ba330faf16e9c628e0d --- /dev/null +++ b/public/css/tags.css @@ -0,0 +1,286 @@ +#bulk_tags_div, +#tags_div { + min-width: 0; +} + +.tag_controls { + display: flex; + flex-direction: row; + gap: 5px; + align-items: center; +} + +.tag_view_item { + display: flex; + flex-direction: row; + align-items: center; + gap: 6px; + margin-bottom: 5px; +} + +.tag_view_name { + text-align: left; +} + +.tag_view_counter { + text-align: right; + flex: 1; +} + +.tag_view_color_picker { + position: relative; +} + +.tag_view_color_picker .link_icon { + position: absolute; + top: 50%; + right: 0px; + opacity: 0.5; +} + +.tag_delete { + padding: 2px 4px; + color: var(--SmartThemeBodyColor) !important; +} + +.tag { + border-radius: 5px; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + color: var(--SmartThemeBodyColor); + background-color: var(--black30a); + border-color: var(--white50a); + padding: 0.1rem 0.2rem; + font-size: calc(var(--mainFontSize) - 5%); + display: flex; + flex-direction: row; + align-items: center; + position: relative; + gap: 10px; + width: fit-content; + min-width: 0; + text-shadow: none !important; +} + +.rm_tag_filter .tag:not(.actionable) { + display: none; +} + +.tag.actionable { + border-radius: 50%; + aspect-ratio: 1 / 1; + min-height: calc(var(--mainFontSize) * 2); + min-width: calc(var(--mainFontSize) * 2); + font-size: calc(var(--mainFontSize) * 1); + padding: 0; + display: flex; + justify-content: center; + align-items: center; +} + +.tag.actionable.clearAllFilters { + border: 0; + background: none; +} + +.tag.placeholder-expander { + cursor: alias; + border: 0; +} + +.tagListHint { + align-self: center; + display: flex; + margin-right: 10px; +} + +.tag_remove { + cursor: pointer; +} + +.tags { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + gap: 0.2rem; + align-items: flex-end; +} + +#bulkTagsList, +#tagList.tags { + margin: 5px 0; +} + +#bulkTagsList, +#tagList .tag, +#groupTagList .tag { + opacity: 0.6; +} + +#tagList .tag:has(.tag_remove:hover) { + opacity: 1; +} + +#tagList .tag:has(.tag_remove:hover) .tag_name { + opacity: 0.6; +} + +.tags.tags_inline { + opacity: 0.6; + column-gap: 0.2rem; + row-gap: 0.2rem; + justify-content: flex-start; + max-height: 66%; + overflow: hidden; + flex-basis: 100%; +} + +.tag_name { + text-overflow: ellipsis; + overflow: hidden; + text-align: left; + white-space: nowrap; + text-shadow: none !important; +} + +.tags_inline .tag { + font-size: calc(var(--mainFontSize) - 15%); + padding: 0 0.15rem; +} + +.rm_tag_controls { + display: flex; + column-gap: 10px; + row-gap: 5px; + flex-direction: row; + flex-wrap: wrap; + align-items: flex-start; + margin: 5px; +} + +.rm_tag_filter .tag { + cursor: pointer; + opacity: 0.6; + filter: brightness(0.8); +} + +.rm_tag_filter .tag.actionable { + transition: opacity 200ms; +} + +.rm_tag_filter .tag:hover { + opacity: 1; + filter: brightness(1); +} + +.tags_view { + margin: 0; + aspect-ratio: 1 / 1; +} + +.tag.selected { + opacity: 1 !important; + filter: none !important; +} + +.tag.excluded { + opacity: 1 !important; + filter: saturate(0.4) !important; + border: 1px solid red; +} + +.tag.excluded::after { + position: absolute; + height: calc(var(--mainFontSize)*1.5); + left: 0; + right: 0; + content: "\d7"; + pointer-events: none; + font-size: calc(var(--mainFontSize) *3); + color: red; + line-height: calc(var(--mainFontSize)*1.3); + text-align: center; + text-shadow: 1px 1px 0px black, + -1px -1px 0px black, + -1px 1px 0px black, + 1px -1px 0px black; + opacity: 1; +} + +.tag_as_folder.right_menu_button { + filter: brightness(75%) saturate(0.6); +} + +.tag_as_folder.right_menu_button:hover, +.tag_as_folder.right_menu_button.flash { + filter: brightness(150%) saturate(0.6); +} + +.tag_as_folder.right_menu_button.no_folder { + filter: brightness(25%) saturate(0.25); +} + +.tag_as_folder.right_menu_button .tag_folder_indicator { + position: absolute; + top: calc(var(--mainFontSize) * -0.5); + right: calc(var(--mainFontSize) * -0.5); + font-size: calc(var(--mainFontSize) * 1); + line-height: calc(var(--mainFontSize) * 1.3); + text-align: center; + text-shadow: 1px 1px 0px black, + -1px -1px 0px black, + -1px 1px 0px black, + 1px -1px 0px black; + opacity: 1; +} + +.tag.indicator::after { + position: absolute; + top: calc(var(--mainFontSize) * -0.5); + right: -2px; + content: "\25CF"; + font-size: calc(var(--mainFontSize) * 1); + color: var(--SmartThemeBodyColor); + line-height: calc(var(--mainFontSize) * 1.3); + text-align: center; + text-shadow: 1px 1px 0px black, + -1px -1px 0px black, + -1px 1px 0px black, + 1px -1px 0px black; + opacity: 1; +} + +.rm_tag_bogus_drilldown { + height: calc(var(--mainFontSize)* 2 - 2); +} + +.rm_tag_bogus_drilldown .tag:not(:first-child) { + position: relative; + margin-left: 1em; +} + +.rm_tag_bogus_drilldown .tag:not(:first-child)::before { + font-family: 'Font Awesome 6 Free'; + content: "\f054"; + position: absolute; + left: -1em; + top: auto; + color: var(--SmartThemeBodyColor); + text-shadow: 1px 1px 0px black, + -1px -1px 0px black, + -1px 1px 0px black, + 1px -1px 0px black; + opacity: 1; +} + +.bogus_folder_select_back .avatar { + display: none !important; +} + +.bogus_folder_select_back .bogus_folder_back_placeholder { + min-height: calc(var(--mainFontSize)*2); + width: var(--avatar-base-width); + justify-content: center; +} diff --git a/public/css/toastr.min.css b/public/css/toastr.min.css new file mode 100644 index 0000000000000000000000000000000000000000..643135ea0afb93b8dd90bfb697e693990a89fec9 --- /dev/null +++ b/public/css/toastr.min.css @@ -0,0 +1 @@ +/* * Note that this is toastr v2.1.3, the "latest" version in url has no more maintenance, * please go to https://cdnjs.com/libraries/toastr.js and pick a certain version you want to use, * make sure you copy the url from the website since the url may change between versions. * */ .toast-title{font-weight:700}.toast-message{-ms-word-wrap:break-word;word-wrap:break-word}.toast-message a,.toast-message label{color:#FFF}.toast-message a:hover{color:#CCC;text-decoration:none}.toast-close-button{position:relative;right:-.3em;top:-.3em;float:right;font-size:20px;font-weight:700;color:#FFF;-webkit-text-shadow:0 1px 0 #fff;text-shadow:0 1px 0 #fff;opacity:.8;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);filter:alpha(opacity=80);line-height:1}.toast-close-button:focus,.toast-close-button:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40)}.rtl .toast-close-button{left:-.3em;float:left;right:.3em}button.toast-close-button{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.toast-top-center{top:0;right:0;width:100%}.toast-bottom-center{bottom:0;right:0;width:100%}.toast-top-full-width{top:0;right:0;width:100%}.toast-bottom-full-width{bottom:0;right:0;width:100%}.toast-top-left{top:12px;left:12px}.toast-top-right{top:12px;right:12px}.toast-bottom-right{right:12px;bottom:12px}.toast-bottom-left{bottom:12px;left:12px}#toast-container{position:fixed;z-index:999999;pointer-events:none}#toast-container *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#toast-container>div{position:relative;pointer-events:auto;overflow:hidden;margin:0 0 6px;padding:15px 15px 15px 50px;width:300px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-position:15px center;background-repeat:no-repeat;-moz-box-shadow:0 0 12px #999;-webkit-box-shadow:0 0 12px #999;box-shadow:0 0 12px #999;color:#FFF;opacity:.8;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);filter:alpha(opacity=80)}#toast-container>div.rtl{direction:rtl;padding:15px 50px 15px 15px;background-position:right 15px center}#toast-container>div:hover{-moz-box-shadow:0 0 12px #000;-webkit-box-shadow:0 0 12px #000;box-shadow:0 0 12px #000;opacity:1;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);filter:alpha(opacity=100);cursor:pointer}#toast-container>.toast-info{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=)!important}#toast-container>.toast-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=)!important}#toast-container>.toast-success{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==)!important}#toast-container>.toast-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=)!important}#toast-container.toast-bottom-center>div,#toast-container.toast-top-center>div{width:300px;margin-left:auto;margin-right:auto}#toast-container.toast-bottom-full-width>div,#toast-container.toast-top-full-width>div{width:96%;margin-left:auto;margin-right:auto}.toast{background-color:#030303}.toast-success{background-color:#51A351}.toast-error{background-color:#BD362F}.toast-info{background-color:#2F96B4}.toast-warning{background-color:#F89406}.toast-progress{position:absolute;left:0;bottom:0;height:4px;background-color:#000;opacity:.4;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40)}@media all and (max-width:240px){#toast-container>div{padding:8px 8px 8px 50px;width:11em}#toast-container>div.rtl{padding:8px 50px 8px 8px}#toast-container .toast-close-button{right:-.2em;top:-.2em}#toast-container .rtl .toast-close-button{left:-.2em;right:.2em}}@media all and (min-width:241px) and (max-width:480px){#toast-container>div{padding:8px 8px 8px 50px;width:18em}#toast-container>div.rtl{padding:8px 50px 8px 8px}#toast-container .toast-close-button{right:-.2em;top:-.2em}#toast-container .rtl .toast-close-button{left:-.2em;right:.2em}}@media all and (min-width:481px) and (max-width:768px){#toast-container>div{padding:15px 15px 15px 50px;width:25em}#toast-container>div.rtl{padding:15px 50px 15px 15px}} \ No newline at end of file diff --git a/public/css/toggle-dependent.css b/public/css/toggle-dependent.css new file mode 100644 index 0000000000000000000000000000000000000000..ef457ee259fc003b6122d7d26ca73b3449d86370 --- /dev/null +++ b/public/css/toggle-dependent.css @@ -0,0 +1,457 @@ +:root { + --big-avatar-height-factor: 1.8; + --big-avatar-width-factor: 1.2; + --big-avatar-border-factor: 5; +} + +body.tts .mes[is_system="true"] .mes_narrate { + display: none; +} + +body.sd .sd_message_gen, +body.translate .mes_translate, +body.tts .mes_narrate { + display: inline-block; +} + +body:not(.tts) #ttsExtensionNarrateAll { + display: none; +} + +body.no-hotswap .hotswap, +body.no-timer .mes_timer, +body.no-timestamps .timestamp, +body.no-tokenCount .tokenCounterDisplay, +body.no-mesIDDisplay .mesIDDisplay, +body.no-modelIcons .icon-svg, +body.hideChatAvatars .mesAvatarWrapper .avatar { + display: none !important; +} + +body.hideChatAvatars .last_mes { + padding-bottom: 40px !important; +} + +body.square-avatars .avatar, +body.square-avatars .avatar img { + border-radius: var(--avatar-base-border-radius) !important; +} + +/*char list grid mode*/ + +body.charListGrid #rm_print_characters_block { + display: flex; + gap: 5px; + flex-wrap: wrap; + flex-direction: row; + justify-content: space-around; + align-content: flex-start; +} + +body.charListGrid #rm_print_characters_block .bogus_folder_select, +body.charListGrid #rm_print_characters_block .character_select, +body.charListGrid #rm_print_characters_block .group_select, +#user_avatar_block.gridView .avatar-container { + width: 30%; + align-items: flex-start; + height: min-content; + flex-direction: column; + overflow: hidden; + max-width: 100px; +} + +/* Save a bit of space here */ +body.charListGrid #rm_print_characters_block .character_name_block { + gap: 0; + margin-bottom: 0; +} + +body.charListGrid #rm_print_characters_block .bogus_folder_select .ch_name, +body.charListGrid #rm_print_characters_block .bogus_folder_select .bogus_folder_counter, +body.charListGrid #rm_print_characters_block .character_select .ch_name, +body.charListGrid #rm_print_characters_block .group_select .ch_name, +body.charListGrid #rm_print_characters_block .group_select .group_select_counter, +#user_avatar_block.gridView .avatar-container .ch_name, +#user_avatar_block.gridView .avatar-container .bogus_folder_counter, +#user_avatar_block.gridView .avatar-container .group_select_counter { + width: 100%; + max-width: 100px; + text-align: center; + font-size: calc(var(--mainFontSize) * .8); +} + +body.charListGrid #rm_print_characters_block .bogus_folder_select .character_name_block, +body.charListGrid #rm_print_characters_block .character_select .character_name_block, +body.charListGrid #rm_print_characters_block .group_select .group_name_block, +#user_avatar_block.gridView .avatar-container .character_name_block { + width: 100%; + flex-direction: column; +} + +#user_avatar_block.gridView .avatar-container .avatar-buttons { + flex-wrap: wrap; + justify-content: space-evenly; +} + +body.charListGrid #rm_print_characters_block .bogus_folder_select .character_select_container, +body.charListGrid #rm_print_characters_block .character_select .character_select_container, +body.charListGrid #rm_print_characters_block .group_select .group_select_container, +#user_avatar_block.gridView .avatar-container .character_select_container, +#user_avatar_block.gridView .avatar-container .group_select_container { + width: 100%; + justify-content: center; + max-width: 100px; +} + +body.charListGrid #rm_print_characters_block .group_select { + width: 30%; + height: min-content; + align-items: center !important; + flex-direction: column; + overflow: hidden; + max-width: 100px; +} + +body.charListGrid #rm_print_characters_block .group_select .group_name_block { + width: 100%; +} + +body.charListGrid #rm_print_characters_block .ch_description, +body.charListGrid #rm_print_characters_block .tags_inline, +body.charListGrid #rm_print_characters_block .group_select_block_list, +body.charListGrid #rm_print_characters_block .ch_avatar_url, +body.charListGrid #rm_print_characters_block .character_version, +body.charListGrid #rm_print_characters_block .character_name_block_sub_line, +#user_avatar_block.gridView .avatar-container .ch_description, +body.charListGrid #rm_print_characters_block .bogus_folder_select_back .bogus_folder_back_placeholder { + display: none; +} + +body.charListGrid #rm_print_characters_block .bogus_folder_select_back .avatar { + display: flex !important; +} + +/* Hack for keeping the spacing */ +/* +body.charListGrid #rm_print_characters_block .ch_add_placeholder { + display: flex !important; + opacity: 0; +} +*/ + +body.charListGrid #rm_print_characters_block .ch_additional_info { + display: none; +} + +/*big avatars mode page-wide changes*/ + +body.big-avatars .character_select .avatar, +body.big-avatars .group_select .avatar, +body.big-avatars .bogus_folder_select .avatar { + flex: unset; +} + +body.big-avatars .avatar { + width: calc(var(--avatar-base-width) * var(--big-avatar-width-factor)); + height: calc(var(--avatar-base-height) * var(--big-avatar-height-factor)); + /* width: unset; */ + border-style: none; + display: flex; + justify-content: center; + flex-direction: column; + align-items: center; + /* align-self: unset; */ + overflow: visible; + border-radius: calc(var(--avatar-base-border-radius) * var(--big-avatar-border-factor)); +} + +body.big-avatars #user_avatar_block .avatar, +body.big-avatars #user_avatar_block .avatar_upload { + width: calc(var(--avatar-base-width) * var(--big-avatar-width-factor)); + height: calc(var(--avatar-base-height) * var(--big-avatar-height-factor)); + border-radius: calc(var(--avatar-base-border-radius) * var(--big-avatar-border-factor)); +} + +body.big-avatars #user_avatar_block .avatar img { + width: calc(var(--avatar-base-width) * var(--big-avatar-width-factor)); + height: calc(var(--avatar-base-height) * var(--big-avatar-height-factor)); +} + +body.big-avatars .avatar img { + width: calc(var(--avatar-base-width) * var(--big-avatar-width-factor)); + height: calc(var(--avatar-base-height) * var(--big-avatar-height-factor)); + object-fit: cover; + object-position: center; + border: 1px solid var(--SmartThemeBorderColor); + border-radius: calc(var(--avatar-base-border-radius) * var(--big-avatar-border-factor)); +} + +body.big-avatars .bogus_folder_select_back .bogus_folder_back_placeholder { + width: calc(var(--avatar-base-width) * var(--big-avatar-width-factor)); +} + +body:not(.big-avatars) .avatar_collage { + min-width: var(--avatar-base-width); + aspect-ratio: 1 / 1; +} + +body:not(.big-avatars) .avatar_collage img { + border-radius: 0% !important; +} + +body.big-avatars .avatar_collage { + min-width: calc(var(--avatar-base-width) * var(--big-avatar-width-factor)); + max-width: calc(var(--avatar-base-width) * var(--big-avatar-width-factor)); + aspect-ratio: 2 / 3; +} + +body.big-avatars .ch_description, +body.big-avatars .avatar-container .ch_description { + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + white-space: pre-line; + text-overflow: unset; +} + +body.big-avatars .avatars_inline_small .avatar, +body.big-avatars .avatars_inline_small .avatar img { + width: calc(var(--avatar-base-width) * var(--big-avatar-width-factor) * var(--inline-avatar-small-factor)); + height: calc(var(--avatar-base-height) * var(--big-avatar-height-factor) * var(--inline-avatar-small-factor)); +} + +body.big-avatars .avatars_inline { + max-height: calc(var(--avatar-base-height) * var(--big-avatar-height-factor) + 2 * var(--avatar-base-border-radius)); +} + +body.big-avatars .avatars_inline.avatars_inline_small { + height: calc(var(--avatar-base-height) * var(--big-avatar-height-factor) * var(--inline-avatar-small-factor) + 2 * var(--avatar-base-border-radius)); +} + +body:not(.big-avatars) .avatars_inline_small .avatar_collage { + min-width: calc(var(--avatar-base-width) * var(--inline-avatar-small-factor)); +} + +body.big-avatars .avatars_inline_small .avatar_collage { + min-width: calc(var(--avatar-base-width) * var(--big-avatar-width-factor) * var(--inline-avatar-small-factor)); + max-width: calc(var(--avatar-base-width) * var(--big-avatar-width-factor) * var(--inline-avatar-small-factor)); +} + +/* border radius for big avatars collages */ + +body.big-avatars .collage_2 .img_1 { + border-radius: calc(var(--avatar-base-border-radius) * var(--big-avatar-border-factor)) 0 0 calc(var(--avatar-base-border-radius) * var(--big-avatar-border-factor)) !important; +} + +body.big-avatars .collage_2 .img_2 { + border-radius: 0 calc(var(--avatar-base-border-radius) * var(--big-avatar-border-factor)) calc(var(--avatar-base-border-radius) * var(--big-avatar-border-factor)) 0 !important; +} + +body.big-avatars .collage_3 .img_1 { + border-radius: calc(var(--avatar-base-border-radius) * var(--big-avatar-border-factor)) 0 0 0 !important; +} + +body.big-avatars .collage_3 .img_2 { + border-radius: 0 calc(var(--avatar-base-border-radius) * var(--big-avatar-border-factor)) 0 0 !important; +} + +body.big-avatars .collage_3 .img_3 { + border-radius: 0 0 calc(var(--avatar-base-border-radius) * var(--big-avatar-border-factor)) calc(var(--avatar-base-border-radius) * var(--big-avatar-border-factor)) !important; +} + +body.big-avatars .collage_4 .img_1 { + border-radius: calc(var(--avatar-base-border-radius) * var(--big-avatar-border-factor)) 0 0 0 !important; +} + +body.big-avatars .collage_4 .img_2 { + border-radius: 0 calc(var(--avatar-base-border-radius) * var(--big-avatar-border-factor)) 0 0 !important; +} + +body.big-avatars .collage_4 .img_3 { + border-radius: 0 0 0 calc(var(--avatar-base-border-radius) * var(--big-avatar-border-factor)) !important; +} + +body.big-avatars .collage_4 .img_4 { + border-radius: 0 0 calc(var(--avatar-base-border-radius) * var(--big-avatar-border-factor)) 0 !important; +} + + + +/*bubble chat style*/ + +body.bubblechat .mes { + padding: 10px; + border-radius: 10px; + background-color: var(--SmartThemeBotMesBlurTintColor); + margin-bottom: 5px; + border: 1px solid var(--SmartThemeBorderColor); +} + +body.bubblechat .mes[is_user="true"] { + background-color: var(--SmartThemeUserMesBlurTintColor); +} + + +/* Document Style */ + +body.documentstyle #chat .mes:not(.last_mes) { + padding: 5px 10px 0px 10px; +} + +body.documentstyle .last_mes { + padding-top: 0; +} + +body.documentstyle #chat .mes .mes_text { + padding: 0; +} + +body.documentstyle #chat .mes .mes_block { + margin-right: 30px; +} + +body.documentstyle #chat .mes .mes_text { + margin-left: 20px; +} + +body.documentstyle #chat .last_mes .mes_text { + margin-left: 20px; + min-height: 70px; +} + +body.documentstyle #chat .last_mes:has(> .del_checkbox[style*="display: block"]) .mes_text { + margin-left: 0px; +} + +body.documentstyle #chat .last_mes .swipe_left { + left: 5px; +} + +body.documentstyle #chat .mes .mesAvatarWrapper, +body.documentstyle #chat .mes .mes_block .ch_name .name_text, +body.documentstyle #chat .mes .mes_block .ch_name .timestamp, +body.documentstyle .mes:not(.last_mes) .ch_name .mes_buttons { + display: none !important; +} + +/*FastUI blur removal*/ + +body.no-blur * { + backdrop-filter: unset !important; +} + +body.no-blur #send_form.no-connection { + background-color: rgba(100, 0, 0, 0.9) !important; +} + +body.no-blur #bg1, +body.no-blur #bg_custom { + filter: unset; + +} + +body.no-blur #top-bar, +body.no-blur #send_form { + background-color: var(--SmartThemeBlurTintColor) !important; +} + +/* wAIfu mode*/ + +body.waifuMode #top-bar { + border-radius: 0 0 20px 20px; + border: 1px solid var(--SmartThemeBorderColor); +} + +body.waifuMode #sheld { + height: 40vh; + height: 40dvh; + top: calc(100% - 40vh); + bottom: 0; +} + +body.waifuMode #chat { + border-top: 1px solid var(--SmartThemeBorderColor); + border-radius: 20px 20px 0 0; +} + +body.waifuMode #expression-wrapper { + justify-content: center; +} + +body.waifuMode .expression-holder { + max-height: 90vh; + max-width: 90vw; + height: 90vh; + width: fit-content; + bottom: 0; + filter: drop-shadow(2px 2px 2px #51515199); + z-index: 2; + margin: 0 auto; + left: 0; + right: 0; +} + +body.waifuMode .zoomed_avatar { + min-width: 100px; + min-height: 100px; + max-height: 90vh; + max-width: 90vh; + width: calc((100vw - var(--sheldWidth)) /2); + position: absolute; + padding: 0; + filter: drop-shadow(2px 2px 2px #51515199); + z-index: 29; + overflow: hidden; + display: none; + left: 0; + right: 0; + margin: 0 auto; + top: 50px; + aspect-ratio: 2 / 3; + height: auto; +} + +/* movingUI*/ + +body.movingUI .drag-grabber { + display: inline; +} + +body.movingUI #sheld, +body.movingUI .drawer-content, +body.movingUI #expression-holder, +body.movingUI .zoomed_avatar, +body.movingUI .draggable, +body.movingUI #floatingPrompt { + resize: both; +} + +#expression-image.default, +#expression-holder:has(.default) { + height: 120px; + margin-top: 0; + top: 50px; + justify-content: center; +} + +/*No Text Shadows Mode*/ + +body.noShadows * { + text-shadow: none !important; +} + +body.expandMessageActions .mes .mes_buttons .extraMesButtons { + display: inherit !important; +} + +body.expandMessageActions .mes .mes_buttons .extraMesButtonsHint { + display: none !important; +} + +#smooth_streaming:not(:checked)~#smooth_streaming_speed_control { + display: none; +} + +#smooth_streaming:checked~#smooth_streaming_speed_control { + display: block; +} \ No newline at end of file diff --git a/public/css/world-info.css b/public/css/world-info.css new file mode 100644 index 0000000000000000000000000000000000000000..3da519c0225a3fd5fd16d4f3e5c89ed88c81c820 --- /dev/null +++ b/public/css/world-info.css @@ -0,0 +1,276 @@ +.world_info_select_block { + display: flex; + flex-direction: row; + align-items: baseline; + gap: 5px; +} + +.budget_cap_note { + flex-basis: 100%; + line-height: 0.1; +} + +#world_popup { + min-height: 100px; + min-width: 100px; + left: 0; + right: 0; + flex-direction: column; + z-index: 3010; + overflow-y: hidden; +} + +.WIEntryContentAndMemo { + width: 100% !important; + flex-wrap: nowrap !important; +} + +.WIEntryContentAndMemo .world_entry_thin_controls { + flex: 1; +} + +#world_popup_bottom_holder { + display: flex; + flex-flow: row; + justify-content: space-evenly; + align-items: center; +} + +#world_popup_bottom_holder div { + width: fit-content; + user-select: none; +} + +#form_rename_world { + display: flex; + align-items: center; + gap: 5px; +} + +.world_popup_expander { + flex-grow: 1; +} + +#world_popup_entries_list { + flex-grow: 1; + overflow-y: auto; +} + +#world_popup_entries_list:empty { + width: 100%; + height: 100%; +} + +#world_popup_entries_list:empty::before { + content: 'No entries found.'; + font-size: calc(var(--mainFontSize) + .1rem); + font-weight: bolder; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + opacity: 0.8; +} + +.world_entry_form_control { + display: flex; + flex-direction: column; + position: relative; +} + +.world_entry_form_control .keyprimarytextpole, +.world_entry_form_control .keysecondarytextpole { + padding-right: 25px; +} + +.world_entry_thin_controls { + display: flex; + flex-direction: row; +} + +/* .world_entry_thin_controls>div { + flex: 1; +} */ + +.world_entry_form_control label h4 { + margin-bottom: 0; + margin-top: 0; +} + +.world_entry_form_control label h5 { + margin-top: 3px; + margin-bottom: 3px; +} + +.world_entry_form_control textarea { + height: auto; + margin-top: 0; + margin-bottom: 0; + min-height: calc(var(--mainFontSize) + 14px); +} + +.delete_entry_button { + height: min-content; +} + +.world_entry_form_control.world_entry_form_horizontal { + flex-direction: row; + align-items: center; + flex-wrap: wrap; +} + +.world_entry .inline-drawer-header { + cursor: initial; +} + +.world_entry .killSwitch { + cursor: pointer; +} + +.world_entry_form_control input[type=button] { + cursor: pointer; +} + +.world_entry_form_horizontal h5 { + margin: 0 1rem; +} + +.world_entry_form_control .checkbox { + align-items: center; + display: flex; + flex-direction: row; + column-gap: 10px; +} + +.world_entry_form_control .checkbox h4 { + margin: 0; + display: inline-block; +} + +.world_entry_form_radios label { + margin-left: 0; +} + +.world_entry_form_radios h4 { + display: inline; +} + +#world_popup h5 { + color: var(--grey70); +} + +/* possible place for WI Entry header styling */ +/* .world_entry_form .inline-drawer-header { + background-color: var(--SmartThemeShadowColor); +} */ + +#world_editor_select { + text-overflow: ellipsis; + white-space: nowrap; + width: 10em; +} + +#world_info_search { + width: 10em; + min-width: 10em; + flex-grow: 1; +} + +#world_info_sort_order { + width: 7em; +} + +.world_entry .killSwitch.fa-toggle-on { + color: var(--SmartThemeQuoteColor); +} + +.wi-card-entry { + border: 1px solid; + border-color: var(--SmartThemeBorderColor); + border-radius: 10px; + padding: 0 5px; + margin-bottom: 1px; +} + +.world_entry { + transition: opacity 500ms; +} + +.disabledWIEntry { + opacity: 0.4; + filter: grayscale(1); +} + +.disabledWIEntry:not(input):hover { + opacity: 1; + filter: grayscale(0.5); +} + +.height32px { + height: 32px; +} + +.WIEntryHeaderTitleMobile { + display: none; +} + +span.select2-container .select2-selection__choice__display:has(> .regex_item), +span.select2-container .select2-results__option:has(> .result_block .regex_item) { + background-color: #D27D2D30; +} + +.regex_item .regex_icon { + background-color: var(--black30a); + color: var(--SmartThemeBodyColor); + border: 1px solid var(--SmartThemeBorderColor); + border-radius: 7px; + font-weight: bold; + font-size: calc(var(--mainFontSize) * 0.75); + padding: 0px 3px; + position: relative; + top: -1px; + margin-right: 3px; +} + +.select2-results__option .regex_item .regex_icon { + margin-right: 6px; +} + +.select2-results__option .item_count { + margin-left: 10px; + float: right; +} + +select.keyselect+span.select2-container .select2-selection--multiple { + padding-right: 30px; +} + +.switch_input_type_icon { + cursor: pointer; + font-weight: bold; + height: 20px; + width: fit-content; + margin-right: 5px; + margin-top: calc(5px + var(--mainFontSize)); + position: absolute; + right: 0; + padding: 1px; + + background-color: transparent; + border: none; + font-size: 1em; + + opacity: 0.5; + color: var(--SmartThemeBodyColor); + transition: opacity 0.3s; +} + +.switch_input_type_icon:hover { + opacity: 1; +} + +#wiCheckboxes { + align-self: center; + width: 100%; +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6a1844535037f293800129d65e118ba7d0daf939 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/global.d.ts b/public/global.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..c8bfe14c2daabf431f49709267f633cbe4c7193a --- /dev/null +++ b/public/global.d.ts @@ -0,0 +1,1408 @@ +// Global namespace modules +declare var DOMPurify; +declare var droll; +declare var Handlebars; +declare var hljs; +declare var localforage; +declare var pdfjsLib; +declare var Popper; +declare var showdown; +declare var showdownKatex; +declare var SVGInject; +declare var Readability; +declare var isProbablyReaderable; +declare var ePub; +declare var ai; + +declare var SillyTavern: { + getContext(): any; + llm: any; +}; + +// Jquery plugins +interface JQuery { + nanogallery2(options?: any): JQuery; + nanogallery2(method: string, options?: any): JQuery; + pagination(method: 'getCurrentPageNum'): number; + pagination(method: string, options?: any): JQuery; + pagination(options?: any): JQuery; + transition(options?: any, complete?: function): JQuery; + autocomplete(options?: any): JQuery; + autocomplete(method: string, options?: any): JQuery; + slider(options?: any): JQuery; + slider(method: string, func: string, options?: any): JQuery; + cropper(options?: any): JQuery; + izoomify(options?: any): JQuery; + + //#region select2 + + /** + * Initializes or modifies a select2 instance with provided options + * + * @param options - Configuration options for the select2 instance + * @returns The jQuery object for chaining + */ + select2(options?: Select2Options): JQuery; + + /** + * Retrieves data currently selected in the select2 instance + * + * @param field - A string specifying the 'data' method + * @returns An array of selected items + */ + select2(field: 'data'): any[]; + + /** + * Calls the specified select2 method + * + * @param method - The name of the select2 method to invoke + * @returns The jQuery object for chaining + */ + select2(method: 'open' | 'close' | 'destroy' | 'focus' | 'val', value?: any): JQuery; + + //#endregion + + //#region sortable + + /** + * Initializes or updates a sortable instance with the provided options + * + * @param options - Configuration options for the sortable instance + * @returns The jQuery object for chaining + */ + sortable(options?: SortableOptions): JQuery; + + /** + * Calls a sortable method to perform actions on the instance + * + * @param method - The name of the sortable method to invoke + * @returns The jQuery object for chaining + */ + sortable(method: 'destroy' | 'disable' | 'enable' | 'refresh' | 'toArray'): JQuery; + + /** + * Retrieves the sortable's instance object. If the element does not have an associated instance, undefined is returned. + * + * @returns The instance of the sortable object + */ + sortable(method: 'instance'): object; + + /** + * Retrieves the current option value for the specified option + * + * @param method - The string 'option' to retrieve an option value + * @param optionName - The name of the option to retrieve + * @returns The value of the specified option + */ + sortable(method: 'option', optionName: string): any; + + /** + * Sets the value of the specified option + * + * @param method - The string 'option' to set an option value + * @param optionName - The name of the option to set + * @param value - The value to assign to the option + * @returns The jQuery object for chaining + */ + sortable(method: 'option', optionName: string, value: any): JQuery; + + /** + * Sets multiple options using an object + * + * @param method - The string 'option' to set options + * @param options - An object containing multiple option key-value pairs + * @returns The jQuery object for chaining + */ + sortable(method: 'option', options: SortableOptions): JQuery; + + //#endregion +} + +//#region Fuse + +/** + * Fuse.js provides fast and flexible fuzzy searching + * @constructor + * @param list - The list of items to search through + * @param options - Configuration options for the search algorithm + */ +declare var Fuse: { + new(list: any[], options?: FuseOptions): FuseInstance; +}; + +/** Instead of providing a (nested) key as a string, an object can be defined that can specify weight and a custom get function */ +interface FuseKey { + /** + * The name of they key. Supports nested paths. + */ + name: string; + /** + * You can allocate a weight to keys to give them higher (or lower) values in search results. The weight value has to be greater than 0. When a weight isn't provided, it will default to 1. + * @default 1 + */ + weight?: number; + /** + * Function to retrieve an object's value at the specified path. The default searches nested paths. + * @default (obj: T, path: string | string[]) => string | string[] + */ + getFn?: (any) => string; +} + +/** Configuration options for the Fuse search algorithm */ +interface FuseOptions { + /** + * List of keys that will be searched. Supports nested paths, weighted search, and searching in arrays of strings and objects. + * @default [] + */ + keys?: string[] | FuseKey[]; + + /** + * How much distance one character can be from another to be considered a match. + * @default 100 + */ + distance?: number; + + /** + * At what point the match algorithm gives up. A threshold of 0.0 requires a perfect match, while 1.0 matches everything. + * @default 0.6 + */ + threshold?: number; + + /** + * Whether the score should be included in the result set. A score of 0 indicates a perfect match, while a score of 1 indicates a complete mismatch. + * @default false + */ + includeScore?: boolean; + + /** + * Indicates whether comparisons should be case-sensitive. + * @default false + */ + isCaseSensitive?: boolean; + + /** + * Whether the matches should be included in the result set. When true, each record in the result set will include the indices of matched characters. + * @default false + */ + includeMatches?: boolean; + + /** + * Only matches whose length exceeds this value will be returned. + * @default 1 + */ + minMatchCharLength?: number; + + /** + * Whether to sort the result list by score. + * @default true + */ + shouldSort?: boolean; + + /** + * When true, the matching function will continue to the end of a search pattern even if a perfect match has already been found. + * @default false + */ + findAllMatches?: boolean; + + /** + * Determines approximately where in the text the pattern is expected to be found. + * @default 0 + */ + location?: number; + + /** + * When true, search will ignore location and distance, so it won't matter where in the string the pattern appears. + * @default false + */ + ignoreLocation?: boolean; + + /** + * When true, it enables the use of Unix-like search commands. + * @default false + */ + useExtendedSearch?: boolean; + + /** + * Function to retrieve an object's value at the specified path. The default searches nested paths. + * @default (obj: T, path: string | string[]) => string | string[] + */ + getFn?: (obj: any, path: string | string[]) => string | string[]; + + /** + * Function to sort the results. The default sorts by ascending relevance score. + * @default (a, b) => number + */ + sortFn?: (a: any, b: any) => number; + + /** + * When true, the calculation for the relevance score will ignore the field-length norm. + * @default false + */ + ignoreFieldNorm?: boolean; + + /** + * Determines how much the field-length norm affects scoring. 0 is equivalent to ignoring the field-length norm, while higher values increase the effect. + * @default 1 + */ + fieldNormWeight?: number; +} + + +/** Represents an individual Fuse search result */ +interface FuseResult { + /** The original item that was matched */ + item: any; + /** The index of the item from the original input collection that was searched */ + refIndex: number; + /** The search score, where 0 is a perfect match and 1 is the worst */ + score?: number; + /** Optional list of matched search keys */ + matches?: Array<{ key: string; indices: [number, number][] }>; +} + +/** Represents a Fuse instance, used for performing searches */ +interface FuseInstance { + /** + * Searches through the list using the specified query. + * @param query - The search term or phrase to use + * @returns An array of search results matching the query + */ + search(query: string): FuseResult[]; +} + +//#endregion + +//#region select2 + +/** Options for configuring a select2 instance */ +interface Select2Options { + /** + * Provides support for ajax data sources + * @param params - Parameters including the search term + * @param callback - A callback function to handle the results + * @default null + */ + ajax?: { + url: string; + dataType?: string; + delay?: number; + data?: (params: any) => any; + processResults?: (data: any, params: any) => any; + } | { transport: (params, success, failure) => any }; + + /** + * Provides support for clearable selections + * @default false + */ + allowClear?: boolean; + + /** + * See Using Select2 with AMD or CommonJS loaders + * @default './i18n/' + */ + amdLanguageBase?: string; + + /** + * Controls whether the dropdown is closed after a selection is made + * @default true + */ + closeOnSelect?: boolean; + + /** + * Allows rendering dropdown options from an array + * @default null + */ + data?: object[]; + + /** + * Used to override the built-in DataAdapter + * @default SelectAdapter + */ + dataAdapter?: SelectAdapter; + + /** + * Enable debugging messages in the browser console + * @default false + */ + debug?: boolean; + + /** + * Sets the dir attribute on the selection and dropdown containers to indicate the direction of the text + * @default 'ltr' + */ + dir?: string; + + /** + * When set to true, the select control will be disabled + * @default false + */ + disabled?: boolean; + + /** + * Used to override the built-in DropdownAdapter + * @default DropdownAdapter + */ + dropdownAdapter?: DropdownAdapter; + + /** + * @default false + */ + dropdownAutoWidth?: boolean; + + /** + * Adds additional CSS classes to the dropdown container. The helper :all: can be used to add all CSS classes present on the original element + * @default '' + */ + selectionCssClass?: string; + + /** + * Implements automatic selection when the dropdown is closed + * @default false + */ + selectOnClose?: boolean; + + sorter?: function; + + /** + * When set to `true`, allows the user to create new tags that aren't pre-populated + * Used to enable free text responses + * @default false + */ + tags?: boolean | object[]; + + /** + * Customizes the way that search results are rendered + * @param item - The item object to format + * @returns The formatted representation + * @default null + */ + templateResult?: (item: any) => JQuery | string; + + /** + * Customizes the way that selections are rendered + * @param item - The selected item object to format + * @returns The formatted representation + * @default null + */ + templateSelection?: (item: any) => JQuery | string; + + /** + * Allows you to set the theme + * @default 'default' + */ + theme?: string; + + /** + * A callback that handles automatic tokenization of free-text entry + * @default null + */ + tokenizer?: (input: { _type: string, term: string }, selection: { options: object }, callback: (Select2Option) => any) => { term: string }; + + /** + * The list of characters that should be used as token separators + * @default null + */ + tokenSeparators?: string[]; + + /** + * Supports customization of the container width + * @default 'resolve' + */ + width?: string; + + /** + * If true, resolves issue for multiselects using closeOnSelect: false that caused the list of results to scroll to the first selection after each select/unselect + * @default false + */ + scrollAfterSelect?: boolean; + + /** + * Extends Select2 v4 plugin by adding an option to set a placeholder for the 'search' input field + * [Custom Field] + * @default '' + */ + searchInputPlaceholder?: string; + + /** + * Extends select2 plugin by adding a custom css class for the 'searcH' input field + * [Custom Field] + * @default '' + */ + searchInputCssClass?: string; +} + +//#endregion + +//#region sortable + +/** Options for configuring a sortable instance */ +interface SortableOptions { + /** + * When set, prevents the sortable items from being dragged unless clicked with a delay + * @default 0 + */ + delay?: number; + + /** + * Class name for elements to handle sorting. Elements with this class can be dragged to sort. + * @default '' + */ + handle?: string; + + /** + * Whether to allow sorting between different connected lists + * @default false + */ + connectWith?: string | boolean; + + /** + * Function called when sorting starts + * @param event - The event object + * @param ui - The UI object containing the helper and position information + */ + start?: (event: Event, ui: SortableUI) => void; + + /** + * Function called when sorting stops + * @param event - The event object + * @param ui - The UI object containing the helper and position information + */ + stop?: (event: Event, ui: SortableUI) => void; + + /** + * Function called when sorting updates + * @param event - The event object + * @param ui - The UI object containing the helper and position information + */ + update?: (event: Event, ui: SortableUI) => void; + + /** + * Specifies which items inside the element should be sortable + * @default '> *' + */ + items?: string; +} + +/** UI object passed to sortable event handlers */ +interface SortableUI { + /** jQuery object representing the helper element */ + helper: JQuery; + /** The current position of the helper element */ + position: { top: number; left: number }; + /** Original position of the helper element */ + originalPosition: { top: number; left: number }; + /** jQuery object representing the item being sorted */ + item: JQuery; + /** The placeholder element used during sorting */ + placeholder: JQuery; +} + +//#endregion + +// MIT Licence. Copied from: +// https://github.com/moment/moment/blob/develop/ts3.1-typings/moment.d.ts +/** + * @param strict Strict parsing disables the deprecated fallback to the native Date constructor when + * parsing a string. + */ +declare function moment(inp?: moment.MomentInput, strict?: boolean): moment.Moment; +/** + * @param strict Strict parsing requires that the format and input match exactly, including delimiters. + * Strict parsing is frequently the best parsing option. For more information about choosing strict vs + * forgiving parsing, see the [parsing guide](https://momentjs.com/guides/#/parsing/). + */ +declare function moment(inp?: moment.MomentInput, format?: moment.MomentFormatSpecification, strict?: boolean): moment.Moment; +/** + * @param strict Strict parsing requires that the format and input match exactly, including delimiters. + * Strict parsing is frequently the best parsing option. For more information about choosing strict vs + * forgiving parsing, see the [parsing guide](https://momentjs.com/guides/#/parsing/). + */ +declare function moment(inp?: moment.MomentInput, format?: moment.MomentFormatSpecification, language?: string, strict?: boolean): moment.Moment; + +declare namespace moment { + type RelativeTimeKey = 's' | 'ss' | 'm' | 'mm' | 'h' | 'hh' | 'd' | 'dd' | 'w' | 'ww' | 'M' | 'MM' | 'y' | 'yy'; + type CalendarKey = 'sameDay' | 'nextDay' | 'lastDay' | 'nextWeek' | 'lastWeek' | 'sameElse' | string; + type LongDateFormatKey = 'LTS' | 'LT' | 'L' | 'LL' | 'LLL' | 'LLLL' | 'lts' | 'lt' | 'l' | 'll' | 'lll' | 'llll'; + + interface Locale { + calendar(key?: CalendarKey, m?: Moment, now?: Moment): string; + + longDateFormat(key: LongDateFormatKey): string; + invalidDate(): string; + ordinal(n: number): string; + + preparse(inp: string): string; + postformat(inp: string): string; + relativeTime(n: number, withoutSuffix: boolean, + key: RelativeTimeKey, isFuture: boolean): string; + pastFuture(diff: number, absRelTime: string): string; + set(config: Object): void; + + months(): string[]; + months(m: Moment, format?: string): string; + monthsShort(): string[]; + monthsShort(m: Moment, format?: string): string; + monthsParse(monthName: string, format: string, strict: boolean): number; + monthsRegex(strict: boolean): RegExp; + monthsShortRegex(strict: boolean): RegExp; + + week(m: Moment): number; + firstDayOfYear(): number; + firstDayOfWeek(): number; + + weekdays(): string[]; + weekdays(m: Moment, format?: string): string; + weekdaysMin(): string[]; + weekdaysMin(m: Moment): string; + weekdaysShort(): string[]; + weekdaysShort(m: Moment): string; + weekdaysParse(weekdayName: string, format: string, strict: boolean): number; + weekdaysRegex(strict: boolean): RegExp; + weekdaysShortRegex(strict: boolean): RegExp; + weekdaysMinRegex(strict: boolean): RegExp; + + isPM(input: string): boolean; + meridiem(hour: number, minute: number, isLower: boolean): string; + } + + interface StandaloneFormatSpec { + format: string[]; + standalone: string[]; + isFormat?: RegExp; + } + + interface WeekSpec { + dow: number; + doy?: number; + } + + type CalendarSpecVal = string | ((m?: MomentInput, now?: Moment) => string); + interface CalendarSpec { + sameDay?: CalendarSpecVal; + nextDay?: CalendarSpecVal; + lastDay?: CalendarSpecVal; + nextWeek?: CalendarSpecVal; + lastWeek?: CalendarSpecVal; + sameElse?: CalendarSpecVal; + + // any additional properties might be used with moment.calendarFormat + [x: string]: CalendarSpecVal | undefined; + } + + type RelativeTimeSpecVal = ( + string | + ((n: number, withoutSuffix: boolean, + key: RelativeTimeKey, isFuture: boolean) => string) + ); + type RelativeTimeFuturePastVal = string | ((relTime: string) => string); + + interface RelativeTimeSpec { + future?: RelativeTimeFuturePastVal; + past?: RelativeTimeFuturePastVal; + s?: RelativeTimeSpecVal; + ss?: RelativeTimeSpecVal; + m?: RelativeTimeSpecVal; + mm?: RelativeTimeSpecVal; + h?: RelativeTimeSpecVal; + hh?: RelativeTimeSpecVal; + d?: RelativeTimeSpecVal; + dd?: RelativeTimeSpecVal; + w?: RelativeTimeSpecVal; + ww?: RelativeTimeSpecVal; + M?: RelativeTimeSpecVal; + MM?: RelativeTimeSpecVal; + y?: RelativeTimeSpecVal; + yy?: RelativeTimeSpecVal; + } + + interface LongDateFormatSpec { + LTS: string; + LT: string; + L: string; + LL: string; + LLL: string; + LLLL: string; + + // lets forget for a sec that any upper/lower permutation will also work + lts?: string; + lt?: string; + l?: string; + ll?: string; + lll?: string; + llll?: string; + } + + type MonthWeekdayFn = (momentToFormat: Moment, format?: string) => string; + type WeekdaySimpleFn = (momentToFormat: Moment) => string; + + interface LocaleSpecification { + months?: string[] | StandaloneFormatSpec | MonthWeekdayFn; + monthsShort?: string[] | StandaloneFormatSpec | MonthWeekdayFn; + + weekdays?: string[] | StandaloneFormatSpec | MonthWeekdayFn; + weekdaysShort?: string[] | StandaloneFormatSpec | WeekdaySimpleFn; + weekdaysMin?: string[] | StandaloneFormatSpec | WeekdaySimpleFn; + + meridiemParse?: RegExp; + meridiem?: (hour: number, minute:number, isLower: boolean) => string; + + isPM?: (input: string) => boolean; + + longDateFormat?: LongDateFormatSpec; + calendar?: CalendarSpec; + relativeTime?: RelativeTimeSpec; + invalidDate?: string; + ordinal?: (n: number) => string; + ordinalParse?: RegExp; + + week?: WeekSpec; + + // Allow anything: in general any property that is passed as locale spec is + // put in the locale object so it can be used by locale functions + [x: string]: any; + } + + interface MomentObjectOutput { + years: number; + /* One digit */ + months: number; + /* Day of the month */ + date: number; + hours: number; + minutes: number; + seconds: number; + milliseconds: number; + } + interface argThresholdOpts { + ss?: number; + s?: number; + m?: number; + h?: number; + d?: number; + w?: number | null; + M?: number; + } + + interface Duration { + clone(): Duration; + + humanize(argWithSuffix?: boolean, argThresholds?: argThresholdOpts): string; + + humanize(argThresholds?: argThresholdOpts): string; + + abs(): Duration; + + as(units: unitOfTime.Base): number; + get(units: unitOfTime.Base): number; + + milliseconds(): number; + asMilliseconds(): number; + + seconds(): number; + asSeconds(): number; + + minutes(): number; + asMinutes(): number; + + hours(): number; + asHours(): number; + + days(): number; + asDays(): number; + + weeks(): number; + asWeeks(): number; + + months(): number; + asMonths(): number; + + years(): number; + asYears(): number; + + add(inp?: DurationInputArg1, unit?: DurationInputArg2): Duration; + subtract(inp?: DurationInputArg1, unit?: DurationInputArg2): Duration; + + locale(): string; + locale(locale: LocaleSpecifier): Duration; + localeData(): Locale; + + toISOString(): string; + toJSON(): string; + + isValid(): boolean; + + /** + * @deprecated since version 2.8.0 + */ + lang(locale: LocaleSpecifier): Moment; + /** + * @deprecated since version 2.8.0 + */ + lang(): Locale; + /** + * @deprecated + */ + toIsoString(): string; + } + + interface MomentRelativeTime { + future: any; + past: any; + s: any; + ss: any; + m: any; + mm: any; + h: any; + hh: any; + d: any; + dd: any; + M: any; + MM: any; + y: any; + yy: any; + } + + interface MomentLongDateFormat { + L: string; + LL: string; + LLL: string; + LLLL: string; + LT: string; + LTS: string; + + l?: string; + ll?: string; + lll?: string; + llll?: string; + lt?: string; + lts?: string; + } + + interface MomentParsingFlags { + empty: boolean; + unusedTokens: string[]; + unusedInput: string[]; + overflow: number; + charsLeftOver: number; + nullInput: boolean; + invalidMonth: string | null; + invalidFormat: boolean; + userInvalidated: boolean; + iso: boolean; + parsedDateParts: any[]; + meridiem: string | null; + } + + interface MomentParsingFlagsOpt { + empty?: boolean; + unusedTokens?: string[]; + unusedInput?: string[]; + overflow?: number; + charsLeftOver?: number; + nullInput?: boolean; + invalidMonth?: string; + invalidFormat?: boolean; + userInvalidated?: boolean; + iso?: boolean; + parsedDateParts?: any[]; + meridiem?: string | null; + } + + interface MomentBuiltinFormat { + __momentBuiltinFormatBrand: any; + } + + type MomentFormatSpecification = string | MomentBuiltinFormat | (string | MomentBuiltinFormat)[]; + + namespace unitOfTime { + type Base = ( + "year" | "years" | "y" | + "month" | "months" | "M" | + "week" | "weeks" | "w" | + "day" | "days" | "d" | + "hour" | "hours" | "h" | + "minute" | "minutes" | "m" | + "second" | "seconds" | "s" | + "millisecond" | "milliseconds" | "ms" + ); + + type _quarter = "quarter" | "quarters" | "Q"; + type _isoWeek = "isoWeek" | "isoWeeks" | "W"; + type _date = "date" | "dates" | "D"; + type DurationConstructor = Base | _quarter; + + type DurationAs = Base; + + type StartOf = Base | _quarter | _isoWeek | _date | null; + + type Diff = Base | _quarter; + + type MomentConstructor = Base | _date; + + type All = Base | _quarter | _isoWeek | _date | + "weekYear" | "weekYears" | "gg" | + "isoWeekYear" | "isoWeekYears" | "GG" | + "dayOfYear" | "dayOfYears" | "DDD" | + "weekday" | "weekdays" | "e" | + "isoWeekday" | "isoWeekdays" | "E"; + } + + interface MomentInputObject { + years?: number; + year?: number; + y?: number; + + months?: number; + month?: number; + M?: number; + + days?: number; + day?: number; + d?: number; + + dates?: number; + date?: number; + D?: number; + + hours?: number; + hour?: number; + h?: number; + + minutes?: number; + minute?: number; + m?: number; + + seconds?: number; + second?: number; + s?: number; + + milliseconds?: number; + millisecond?: number; + ms?: number; + } + + interface DurationInputObject extends MomentInputObject { + quarters?: number; + quarter?: number; + Q?: number; + + weeks?: number; + week?: number; + w?: number; + } + + interface MomentSetObject extends MomentInputObject { + weekYears?: number; + weekYear?: number; + gg?: number; + + isoWeekYears?: number; + isoWeekYear?: number; + GG?: number; + + quarters?: number; + quarter?: number; + Q?: number; + + weeks?: number; + week?: number; + w?: number; + + isoWeeks?: number; + isoWeek?: number; + W?: number; + + dayOfYears?: number; + dayOfYear?: number; + DDD?: number; + + weekdays?: number; + weekday?: number; + e?: number; + + isoWeekdays?: number; + isoWeekday?: number; + E?: number; + } + + interface FromTo { + from: MomentInput; + to: MomentInput; + } + + type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | null | undefined; + type DurationInputArg1 = Duration | number | string | FromTo | DurationInputObject | null | undefined; + type DurationInputArg2 = unitOfTime.DurationConstructor; + type LocaleSpecifier = string | Moment | Duration | string[] | boolean; + + interface MomentCreationData { + input: MomentInput; + format?: MomentFormatSpecification; + locale: Locale; + isUTC: boolean; + strict?: boolean; + } + + interface Moment extends Object { + format(format?: string): string; + + startOf(unitOfTime: unitOfTime.StartOf): Moment; + endOf(unitOfTime: unitOfTime.StartOf): Moment; + + add(amount?: DurationInputArg1, unit?: DurationInputArg2): Moment; + /** + * @deprecated reverse syntax + */ + add(unit: unitOfTime.DurationConstructor, amount: number|string): Moment; + + subtract(amount?: DurationInputArg1, unit?: DurationInputArg2): Moment; + /** + * @deprecated reverse syntax + */ + subtract(unit: unitOfTime.DurationConstructor, amount: number|string): Moment; + + calendar(): string; + calendar(formats: CalendarSpec): string; + calendar(time?: MomentInput, formats?: CalendarSpec): string; + + clone(): Moment; + + /** + * @return Unix timestamp in milliseconds + */ + valueOf(): number; + + // current date/time in local mode + local(keepLocalTime?: boolean): Moment; + isLocal(): boolean; + + // current date/time in UTC mode + utc(keepLocalTime?: boolean): Moment; + isUTC(): boolean; + /** + * @deprecated use isUTC + */ + isUtc(): boolean; + + parseZone(): Moment; + isValid(): boolean; + invalidAt(): number; + + hasAlignedHourOffset(other?: MomentInput): boolean; + + creationData(): MomentCreationData; + parsingFlags(): MomentParsingFlags; + + year(y: number): Moment; + year(): number; + /** + * @deprecated use year(y) + */ + years(y: number): Moment; + /** + * @deprecated use year() + */ + years(): number; + quarter(): number; + quarter(q: number): Moment; + quarters(): number; + quarters(q: number): Moment; + month(M: number|string): Moment; + month(): number; + /** + * @deprecated use month(M) + */ + months(M: number|string): Moment; + /** + * @deprecated use month() + */ + months(): number; + day(d: number|string): Moment; + day(): number; + days(d: number|string): Moment; + days(): number; + date(d: number): Moment; + date(): number; + /** + * @deprecated use date(d) + */ + dates(d: number): Moment; + /** + * @deprecated use date() + */ + dates(): number; + hour(h: number): Moment; + hour(): number; + hours(h: number): Moment; + hours(): number; + minute(m: number): Moment; + minute(): number; + minutes(m: number): Moment; + minutes(): number; + second(s: number): Moment; + second(): number; + seconds(s: number): Moment; + seconds(): number; + millisecond(ms: number): Moment; + millisecond(): number; + milliseconds(ms: number): Moment; + milliseconds(): number; + weekday(): number; + weekday(d: number): Moment; + isoWeekday(): number; + isoWeekday(d: number|string): Moment; + weekYear(): number; + weekYear(d: number): Moment; + isoWeekYear(): number; + isoWeekYear(d: number): Moment; + week(): number; + week(d: number): Moment; + weeks(): number; + weeks(d: number): Moment; + isoWeek(): number; + isoWeek(d: number): Moment; + isoWeeks(): number; + isoWeeks(d: number): Moment; + weeksInYear(): number; + isoWeeksInYear(): number; + isoWeeksInISOWeekYear(): number; + dayOfYear(): number; + dayOfYear(d: number): Moment; + + from(inp: MomentInput, suffix?: boolean): string; + to(inp: MomentInput, suffix?: boolean): string; + fromNow(withoutSuffix?: boolean): string; + toNow(withoutPrefix?: boolean): string; + + diff(b: MomentInput, unitOfTime?: unitOfTime.Diff, precise?: boolean): number; + + toArray(): [number, number, number, number, number, number, number]; + toDate(): Date; + toISOString(keepOffset?: boolean): string; + inspect(): string; + toJSON(): string; + unix(): number; + + isLeapYear(): boolean; + /** + * @deprecated in favor of utcOffset + */ + zone(): number; + zone(b: number|string): Moment; + utcOffset(): number; + utcOffset(b: number|string, keepLocalTime?: boolean): Moment; + isUtcOffset(): boolean; + daysInMonth(): number; + isDST(): boolean; + + zoneAbbr(): string; + zoneName(): string; + + isBefore(inp?: MomentInput, granularity?: unitOfTime.StartOf): boolean; + isAfter(inp?: MomentInput, granularity?: unitOfTime.StartOf): boolean; + isSame(inp?: MomentInput, granularity?: unitOfTime.StartOf): boolean; + isSameOrAfter(inp?: MomentInput, granularity?: unitOfTime.StartOf): boolean; + isSameOrBefore(inp?: MomentInput, granularity?: unitOfTime.StartOf): boolean; + isBetween(a: MomentInput, b: MomentInput, granularity?: unitOfTime.StartOf, inclusivity?: "()" | "[)" | "(]" | "[]"): boolean; + + /** + * @deprecated as of 2.8.0, use locale + */ + lang(language: LocaleSpecifier): Moment; + /** + * @deprecated as of 2.8.0, use locale + */ + lang(): Locale; + + locale(): string; + locale(locale: LocaleSpecifier): Moment; + + localeData(): Locale; + + /** + * @deprecated no reliable implementation + */ + isDSTShifted(): boolean; + + // NOTE(constructor): Same as moment constructor + /** + * @deprecated as of 2.7.0, use moment.min/max + */ + max(inp?: MomentInput, format?: MomentFormatSpecification, strict?: boolean): Moment; + /** + * @deprecated as of 2.7.0, use moment.min/max + */ + max(inp?: MomentInput, format?: MomentFormatSpecification, language?: string, strict?: boolean): Moment; + + // NOTE(constructor): Same as moment constructor + /** + * @deprecated as of 2.7.0, use moment.min/max + */ + min(inp?: MomentInput, format?: MomentFormatSpecification, strict?: boolean): Moment; + /** + * @deprecated as of 2.7.0, use moment.min/max + */ + min(inp?: MomentInput, format?: MomentFormatSpecification, language?: string, strict?: boolean): Moment; + + get(unit: unitOfTime.All): number; + set(unit: unitOfTime.All, value: number): Moment; + set(objectLiteral: MomentSetObject): Moment; + + toObject(): MomentObjectOutput; + } + + export var version: string; + export var fn: Moment; + + // NOTE(constructor): Same as moment constructor + /** + * @param strict Strict parsing disables the deprecated fallback to the native Date constructor when + * parsing a string. + */ + export function utc(inp?: MomentInput, strict?: boolean): Moment; + /** + * @param strict Strict parsing requires that the format and input match exactly, including delimiters. + * Strict parsing is frequently the best parsing option. For more information about choosing strict vs + * forgiving parsing, see the [parsing guide](https://momentjs.com/guides/#/parsing/). + */ + export function utc(inp?: MomentInput, format?: MomentFormatSpecification, strict?: boolean): Moment; + /** + * @param strict Strict parsing requires that the format and input match exactly, including delimiters. + * Strict parsing is frequently the best parsing option. For more information about choosing strict vs + * forgiving parsing, see the [parsing guide](https://momentjs.com/guides/#/parsing/). + */ + export function utc(inp?: MomentInput, format?: MomentFormatSpecification, language?: string, strict?: boolean): Moment; + + export function unix(timestamp: number): Moment; + + export function invalid(flags?: MomentParsingFlagsOpt): Moment; + export function isMoment(m: any): m is Moment; + export function isDate(m: any): m is Date; + export function isDuration(d: any): d is Duration; + + /** + * @deprecated in 2.8.0 + */ + export function lang(language?: string): string; + /** + * @deprecated in 2.8.0 + */ + export function lang(language?: string, definition?: Locale): string; + + export function locale(language?: string): string; + export function locale(language?: string[]): string; + export function locale(language?: string, definition?: LocaleSpecification | null | undefined): string; + + export function localeData(key?: string | string[]): Locale; + + export function duration(inp?: DurationInputArg1, unit?: DurationInputArg2): Duration; + + // NOTE(constructor): Same as moment constructor + export function parseZone(inp?: MomentInput, format?: MomentFormatSpecification, strict?: boolean): Moment; + export function parseZone(inp?: MomentInput, format?: MomentFormatSpecification, language?: string, strict?: boolean): Moment; + + export function months(): string[]; + export function months(index: number): string; + export function months(format: string): string[]; + export function months(format: string, index: number): string; + export function monthsShort(): string[]; + export function monthsShort(index: number): string; + export function monthsShort(format: string): string[]; + export function monthsShort(format: string, index: number): string; + + export function weekdays(): string[]; + export function weekdays(index: number): string; + export function weekdays(format: string): string[]; + export function weekdays(format: string, index: number): string; + export function weekdays(localeSorted: boolean): string[]; + export function weekdays(localeSorted: boolean, index: number): string; + export function weekdays(localeSorted: boolean, format: string): string[]; + export function weekdays(localeSorted: boolean, format: string, index: number): string; + export function weekdaysShort(): string[]; + export function weekdaysShort(index: number): string; + export function weekdaysShort(format: string): string[]; + export function weekdaysShort(format: string, index: number): string; + export function weekdaysShort(localeSorted: boolean): string[]; + export function weekdaysShort(localeSorted: boolean, index: number): string; + export function weekdaysShort(localeSorted: boolean, format: string): string[]; + export function weekdaysShort(localeSorted: boolean, format: string, index: number): string; + export function weekdaysMin(): string[]; + export function weekdaysMin(index: number): string; + export function weekdaysMin(format: string): string[]; + export function weekdaysMin(format: string, index: number): string; + export function weekdaysMin(localeSorted: boolean): string[]; + export function weekdaysMin(localeSorted: boolean, index: number): string; + export function weekdaysMin(localeSorted: boolean, format: string): string[]; + export function weekdaysMin(localeSorted: boolean, format: string, index: number): string; + + export function min(moments: Moment[]): Moment; + export function min(...moments: Moment[]): Moment; + export function max(moments: Moment[]): Moment; + export function max(...moments: Moment[]): Moment; + + /** + * Returns unix time in milliseconds. Overwrite for profit. + */ + export function now(): number; + + export function defineLocale(language: string, localeSpec: LocaleSpecification | null): Locale; + export function updateLocale(language: string, localeSpec: LocaleSpecification | null): Locale; + + export function locales(): string[]; + + export function normalizeUnits(unit: unitOfTime.All): string; + export function relativeTimeThreshold(threshold: string): number | boolean; + export function relativeTimeThreshold(threshold: string, limit: number): boolean; + export function relativeTimeRounding(fn: (num: number) => number): boolean; + export function relativeTimeRounding(): (num: number) => number; + export function calendarFormat(m: Moment, now: Moment): string; + + export function parseTwoDigitYear(input: string): number; + /** + * Constant used to enable explicit ISO_8601 format parsing. + */ + export var ISO_8601: MomentBuiltinFormat; + export var RFC_2822: MomentBuiltinFormat; + + export var defaultFormat: string; + export var defaultFormatUtc: string; + + export var suppressDeprecationWarnings: boolean; + export var deprecationHandler: ((name: string | null, msg: string) => void) | null | undefined; + + export var HTML5_FMT: { + DATETIME_LOCAL: string, + DATETIME_LOCAL_SECONDS: string, + DATETIME_LOCAL_MS: string, + DATE: string, + TIME: string, + TIME_SECONDS: string, + TIME_MS: string, + WEEK: string, + MONTH: string + }; + +} + +declare global { + const moment: typeof moment; +} + +/** + * Callback data for the `LLM_FUNCTION_TOOL_REGISTER` event type that is triggered when a function tool can be registered. + */ +interface FunctionToolRegister { + /** + * The type of generation that is being used + */ + type?: string; + /** + * Generation data, including messages and sampling parameters + */ + data: Record; + /** + * Callback to register an LLM function tool. + */ + registerFunctionTool: typeof registerFunctionTool; +} + +/** + * Callback data for the `LLM_FUNCTION_TOOL_REGISTER` event type that is triggered when a function tool is registered. + * @param name Name of the function tool to register + * @param description Description of the function tool + * @param params JSON schema for the parameters of the function tool + * @param required Whether the function tool should be forced to be used + */ +declare function registerFunctionTool(name: string, description: string, params: object, required: boolean): Promise; + +/** + * Callback data for the `LLM_FUNCTION_TOOL_CALL` event type that is triggered when a function tool is called. + */ +interface FunctionToolCall { + /** + * Name of the function tool to call + */ + name: string; + /** + * JSON object with the parameters to pass to the function tool + */ + arguments: string; +} diff --git a/public/img/01ai.svg b/public/img/01ai.svg new file mode 100644 index 0000000000000000000000000000000000000000..317a5da590fdf0d7c0d613f2a048d2ee3f3ba528 --- /dev/null +++ b/public/img/01ai.svg @@ -0,0 +1,59 @@ + + + + + + + + + diff --git a/public/img/No-Image-Placeholder.svg b/public/img/No-Image-Placeholder.svg new file mode 100644 index 0000000000000000000000000000000000000000..d2113750600e95d236593b8218ff295a5c836b1a --- /dev/null +++ b/public/img/No-Image-Placeholder.svg @@ -0,0 +1,309 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + NO IMAGEAVAILABLE + + diff --git a/public/img/addbg3.png b/public/img/addbg3.png new file mode 100644 index 0000000000000000000000000000000000000000..1b7dd7113fa566b700f95ab8e1f66e0e54d2d70d Binary files /dev/null and b/public/img/addbg3.png differ diff --git a/public/img/ai21.svg b/public/img/ai21.svg new file mode 100644 index 0000000000000000000000000000000000000000..891beda5a6dab16062ee995a76acd1be5514d865 --- /dev/null +++ b/public/img/ai21.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + diff --git a/public/img/ai4.png b/public/img/ai4.png new file mode 100644 index 0000000000000000000000000000000000000000..a41de2da4a20406f3fa778b258fcc7ea3951592a Binary files /dev/null and b/public/img/ai4.png differ diff --git a/public/img/aphrodite.svg b/public/img/aphrodite.svg new file mode 100644 index 0000000000000000000000000000000000000000..f9d6f41824dd24d11446b1d6dea2dfbd79666250 --- /dev/null +++ b/public/img/aphrodite.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + diff --git a/public/img/apple-icon-114x114.png b/public/img/apple-icon-114x114.png new file mode 100644 index 0000000000000000000000000000000000000000..cc947f79c6db01c0c18c41424a056ea563aff947 Binary files /dev/null and b/public/img/apple-icon-114x114.png differ diff --git a/public/img/apple-icon-144x144.png b/public/img/apple-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..7f5635e41f230e80bb32b0591bd8f3f205101a2e Binary files /dev/null and b/public/img/apple-icon-144x144.png differ diff --git a/public/img/apple-icon-57x57.png b/public/img/apple-icon-57x57.png new file mode 100644 index 0000000000000000000000000000000000000000..88879c3714fa414ed5c3bb61faf1e850e24da498 Binary files /dev/null and b/public/img/apple-icon-57x57.png differ diff --git a/public/img/apple-icon-72x72.png b/public/img/apple-icon-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..48c7ff21500ceb6182db55d51f52e90a46232de8 Binary files /dev/null and b/public/img/apple-icon-72x72.png differ diff --git a/public/img/blockentropy.svg b/public/img/blockentropy.svg new file mode 100644 index 0000000000000000000000000000000000000000..fa52c3ea8d43e940559dd0de6c771e5d5a77e5c8 --- /dev/null +++ b/public/img/blockentropy.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/img/claude.svg b/public/img/claude.svg new file mode 100644 index 0000000000000000000000000000000000000000..f542c5d753d533a7936b8d8a0963c76e6257668e --- /dev/null +++ b/public/img/claude.svg @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/public/img/cohere.svg b/public/img/cohere.svg new file mode 100644 index 0000000000000000000000000000000000000000..a213ae8d88af609f35cc959faec548cea590df4f --- /dev/null +++ b/public/img/cohere.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/public/img/custom.svg b/public/img/custom.svg new file mode 100644 index 0000000000000000000000000000000000000000..0daa6c3027a6bd109a571e95e3d9e51f9681f000 --- /dev/null +++ b/public/img/custom.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + diff --git a/public/img/default-expressions/admiration.png b/public/img/default-expressions/admiration.png new file mode 100644 index 0000000000000000000000000000000000000000..a9001bb64c475ba7dd3a974b4e7f09ece5bb5e5d Binary files /dev/null and b/public/img/default-expressions/admiration.png differ diff --git a/public/img/default-expressions/amusement.png b/public/img/default-expressions/amusement.png new file mode 100644 index 0000000000000000000000000000000000000000..493880a8a242fb89376ec4098b01cd5c2098a344 Binary files /dev/null and b/public/img/default-expressions/amusement.png differ diff --git a/public/img/default-expressions/anger.png b/public/img/default-expressions/anger.png new file mode 100644 index 0000000000000000000000000000000000000000..6d7398d5b5a1105bf88b5c61e7fd9a08224e743f Binary files /dev/null and b/public/img/default-expressions/anger.png differ diff --git a/public/img/default-expressions/annoyance.png b/public/img/default-expressions/annoyance.png new file mode 100644 index 0000000000000000000000000000000000000000..1c3c20e6edb1d1cc0ddc0cf33e007f98181ea36a Binary files /dev/null and b/public/img/default-expressions/annoyance.png differ diff --git a/public/img/default-expressions/approval.png b/public/img/default-expressions/approval.png new file mode 100644 index 0000000000000000000000000000000000000000..db2fd7fc1f38e98f58c88e6189c5cca1169db0f6 Binary files /dev/null and b/public/img/default-expressions/approval.png differ diff --git a/public/img/default-expressions/caring.png b/public/img/default-expressions/caring.png new file mode 100644 index 0000000000000000000000000000000000000000..676794920ed0b5fa43d46ae985e04db98a29217a Binary files /dev/null and b/public/img/default-expressions/caring.png differ diff --git a/public/img/default-expressions/confusion.png b/public/img/default-expressions/confusion.png new file mode 100644 index 0000000000000000000000000000000000000000..b57949cb3dd6ef0a81f0a52d543a845e8479cacb Binary files /dev/null and b/public/img/default-expressions/confusion.png differ diff --git a/public/img/default-expressions/curiosity.png b/public/img/default-expressions/curiosity.png new file mode 100644 index 0000000000000000000000000000000000000000..e0d4061c8ec1d813b105b08331740e94745f90e9 Binary files /dev/null and b/public/img/default-expressions/curiosity.png differ diff --git a/public/img/default-expressions/desire.png b/public/img/default-expressions/desire.png new file mode 100644 index 0000000000000000000000000000000000000000..98b88fb6f0143462b32c71caf7ab561c5202e07d Binary files /dev/null and b/public/img/default-expressions/desire.png differ diff --git a/public/img/default-expressions/desire1.png b/public/img/default-expressions/desire1.png new file mode 100644 index 0000000000000000000000000000000000000000..d4c6964b6b85880d8aaf5db45f859a3407545882 Binary files /dev/null and b/public/img/default-expressions/desire1.png differ diff --git a/public/img/default-expressions/desire2.png b/public/img/default-expressions/desire2.png new file mode 100644 index 0000000000000000000000000000000000000000..fd31e6b19a0ac42c55a22e20902d92e7913be63f Binary files /dev/null and b/public/img/default-expressions/desire2.png differ diff --git a/public/img/default-expressions/disappointment.png b/public/img/default-expressions/disappointment.png new file mode 100644 index 0000000000000000000000000000000000000000..a2fbb03aff6d939261430d5a231143b04fb8106d Binary files /dev/null and b/public/img/default-expressions/disappointment.png differ diff --git a/public/img/default-expressions/disapproval.png b/public/img/default-expressions/disapproval.png new file mode 100644 index 0000000000000000000000000000000000000000..cb14abbf4319d77888ab3fa82f051b69f50d290f Binary files /dev/null and b/public/img/default-expressions/disapproval.png differ diff --git a/public/img/default-expressions/disgust.png b/public/img/default-expressions/disgust.png new file mode 100644 index 0000000000000000000000000000000000000000..bbb6dc5fffd351f372d01d05e293263f58d5c224 Binary files /dev/null and b/public/img/default-expressions/disgust.png differ diff --git a/public/img/default-expressions/embarrassment.png b/public/img/default-expressions/embarrassment.png new file mode 100644 index 0000000000000000000000000000000000000000..5481a5c45ecbccfc02c85382707f30f77baa177e Binary files /dev/null and b/public/img/default-expressions/embarrassment.png differ diff --git a/public/img/default-expressions/excitement.png b/public/img/default-expressions/excitement.png new file mode 100644 index 0000000000000000000000000000000000000000..3ba87d41dc63c1f74bd3f541755091d7a8883493 Binary files /dev/null and b/public/img/default-expressions/excitement.png differ diff --git a/public/img/default-expressions/fear.png b/public/img/default-expressions/fear.png new file mode 100644 index 0000000000000000000000000000000000000000..c1ada3db9bb532603499323607036abe05fc5a08 Binary files /dev/null and b/public/img/default-expressions/fear.png differ diff --git a/public/img/default-expressions/gratitude.png b/public/img/default-expressions/gratitude.png new file mode 100644 index 0000000000000000000000000000000000000000..e304a102d07b96ed352778eda70aac0c74de9a93 Binary files /dev/null and b/public/img/default-expressions/gratitude.png differ diff --git a/public/img/default-expressions/grief.png b/public/img/default-expressions/grief.png new file mode 100644 index 0000000000000000000000000000000000000000..ae97d3486737b0666021a664b3213d67b324e800 Binary files /dev/null and b/public/img/default-expressions/grief.png differ diff --git a/public/img/default-expressions/joy.png b/public/img/default-expressions/joy.png new file mode 100644 index 0000000000000000000000000000000000000000..939a8760c2bb802bfe8204a4cf60652c78492bf1 Binary files /dev/null and b/public/img/default-expressions/joy.png differ diff --git a/public/img/default-expressions/love.png b/public/img/default-expressions/love.png new file mode 100644 index 0000000000000000000000000000000000000000..8c0556fd772dd67ade7e98bf666945e7c447ee72 Binary files /dev/null and b/public/img/default-expressions/love.png differ diff --git a/public/img/default-expressions/nervousness.png b/public/img/default-expressions/nervousness.png new file mode 100644 index 0000000000000000000000000000000000000000..d08554eede50cf52a04f1529b326c5945f0d4c67 Binary files /dev/null and b/public/img/default-expressions/nervousness.png differ diff --git a/public/img/default-expressions/neutral.png b/public/img/default-expressions/neutral.png new file mode 100644 index 0000000000000000000000000000000000000000..61c65b4d2311dcae29cabd90087b76c6485264cf Binary files /dev/null and b/public/img/default-expressions/neutral.png differ diff --git a/public/img/default-expressions/optimism.png b/public/img/default-expressions/optimism.png new file mode 100644 index 0000000000000000000000000000000000000000..fab101a79930361f4607d851ff4a32afee0b50ff Binary files /dev/null and b/public/img/default-expressions/optimism.png differ diff --git a/public/img/default-expressions/pride.png b/public/img/default-expressions/pride.png new file mode 100644 index 0000000000000000000000000000000000000000..16dae6fca5243af9085462a31589cfa756160745 Binary files /dev/null and b/public/img/default-expressions/pride.png differ diff --git a/public/img/default-expressions/realization.png b/public/img/default-expressions/realization.png new file mode 100644 index 0000000000000000000000000000000000000000..cc8738986b3c043d1c7638c554fdcb537ae6946a Binary files /dev/null and b/public/img/default-expressions/realization.png differ diff --git a/public/img/default-expressions/relief.png b/public/img/default-expressions/relief.png new file mode 100644 index 0000000000000000000000000000000000000000..8731cd6350ae25f51578aa3786c9c39ab48b6812 Binary files /dev/null and b/public/img/default-expressions/relief.png differ diff --git a/public/img/default-expressions/remorse.png b/public/img/default-expressions/remorse.png new file mode 100644 index 0000000000000000000000000000000000000000..abf7c262350471ef2e0c8114088426437c53b2d4 Binary files /dev/null and b/public/img/default-expressions/remorse.png differ diff --git a/public/img/default-expressions/sadness.png b/public/img/default-expressions/sadness.png new file mode 100644 index 0000000000000000000000000000000000000000..bcba564aaf37629530949baa563991437d7deab0 Binary files /dev/null and b/public/img/default-expressions/sadness.png differ diff --git a/public/img/default-expressions/surprise.png b/public/img/default-expressions/surprise.png new file mode 100644 index 0000000000000000000000000000000000000000..a45a8dab926dcaa0d77f10903b96f418fda02c6d Binary files /dev/null and b/public/img/default-expressions/surprise.png differ diff --git a/public/img/dreamgen.svg b/public/img/dreamgen.svg new file mode 100644 index 0000000000000000000000000000000000000000..c62958a12d283ee01ce2d34cfc21599377eb4d05 --- /dev/null +++ b/public/img/dreamgen.svg @@ -0,0 +1 @@ + diff --git a/public/img/featherless.svg b/public/img/featherless.svg new file mode 100644 index 0000000000000000000000000000000000000000..b386387f4efdcda73fe8c779fd0a689e8eeeb576 --- /dev/null +++ b/public/img/featherless.svg @@ -0,0 +1,39 @@ + + diff --git a/public/img/five.png b/public/img/five.png new file mode 100644 index 0000000000000000000000000000000000000000..04a8422e773060ce7de933a7ea8c09bc557ac8fa Binary files /dev/null and b/public/img/five.png differ diff --git a/public/img/groq.svg b/public/img/groq.svg new file mode 100644 index 0000000000000000000000000000000000000000..b1945dc1dbc9a2b28dc78b00e870883af23cfc4f --- /dev/null +++ b/public/img/groq.svg @@ -0,0 +1,48 @@ + + + + + + + + + + diff --git a/public/img/huggingface.svg b/public/img/huggingface.svg new file mode 100644 index 0000000000000000000000000000000000000000..3acb82a27ab22f082438c59d0333d19def5462b9 --- /dev/null +++ b/public/img/huggingface.svg @@ -0,0 +1,40 @@ + + + + + + diff --git a/public/img/infermaticai.svg b/public/img/infermaticai.svg new file mode 100644 index 0000000000000000000000000000000000000000..7f88c643c1fdef03153ad97df0cffb2d3b3349cb --- /dev/null +++ b/public/img/infermaticai.svg @@ -0,0 +1,40 @@ + + + + + + diff --git a/public/img/kobold.svg b/public/img/kobold.svg new file mode 100644 index 0000000000000000000000000000000000000000..9e543d633a764a12dcb24eaae6fbabafcfce5dc5 --- /dev/null +++ b/public/img/kobold.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/img/koboldcpp.svg b/public/img/koboldcpp.svg new file mode 100644 index 0000000000000000000000000000000000000000..9e543d633a764a12dcb24eaae6fbabafcfce5dc5 --- /dev/null +++ b/public/img/koboldcpp.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/img/koboldhorde.svg b/public/img/koboldhorde.svg new file mode 100644 index 0000000000000000000000000000000000000000..46a71498cc94adb8c3ed3ae348262ecb66b7ea1c --- /dev/null +++ b/public/img/koboldhorde.svg @@ -0,0 +1,48 @@ + + + + + + + + + diff --git a/public/img/llamacpp.svg b/public/img/llamacpp.svg new file mode 100644 index 0000000000000000000000000000000000000000..d3237d24767e04cdb23073e13630bf0d751729fd --- /dev/null +++ b/public/img/llamacpp.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/public/img/logo.png b/public/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..14768e82b32b78bd51e3233742667dc3b369a8b2 Binary files /dev/null and b/public/img/logo.png differ diff --git a/public/img/makersuite.svg b/public/img/makersuite.svg new file mode 100644 index 0000000000000000000000000000000000000000..4d70f69cfbac7e58342a34676df1053a47b95363 --- /dev/null +++ b/public/img/makersuite.svg @@ -0,0 +1,38 @@ + + + + + + + + + diff --git a/public/img/mancer.svg b/public/img/mancer.svg new file mode 100644 index 0000000000000000000000000000000000000000..6f84d4c453e76906b61ce6ee448dadda3d65978c --- /dev/null +++ b/public/img/mancer.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/img/manual.svg b/public/img/manual.svg new file mode 100644 index 0000000000000000000000000000000000000000..e313ab59c184df1bbc9cac4b510a450b10810c10 --- /dev/null +++ b/public/img/manual.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/img/mistralai.svg b/public/img/mistralai.svg new file mode 100644 index 0000000000000000000000000000000000000000..8c9dabdb20d0f46cfbbdf8e7faa928b0c5bf4fb0 --- /dev/null +++ b/public/img/mistralai.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/public/img/novel.svg b/public/img/novel.svg new file mode 100644 index 0000000000000000000000000000000000000000..d74243194d20b3793947b8feafa79d24e9a00858 --- /dev/null +++ b/public/img/novel.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/img/ollama.svg b/public/img/ollama.svg new file mode 100644 index 0000000000000000000000000000000000000000..9600c03c6b1cb980dd2316f48bf3dfc326fbfa33 --- /dev/null +++ b/public/img/ollama.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + diff --git a/public/img/openai.svg b/public/img/openai.svg new file mode 100644 index 0000000000000000000000000000000000000000..e04db75a5bbdc4e398618e87f762b75a2ab0d34e --- /dev/null +++ b/public/img/openai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/openrouter.svg b/public/img/openrouter.svg new file mode 100644 index 0000000000000000000000000000000000000000..0452cf4dbc8852d596991d28d722acd6da5a9d25 --- /dev/null +++ b/public/img/openrouter.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + diff --git a/public/img/palm.svg b/public/img/palm.svg new file mode 100644 index 0000000000000000000000000000000000000000..8f57163a29f5ee605cc5d81fc7ada2470b81af64 --- /dev/null +++ b/public/img/palm.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/img/perplexity.svg b/public/img/perplexity.svg new file mode 100644 index 0000000000000000000000000000000000000000..1c10790e3f008a079e4c1d9fafbc3c20b0960551 --- /dev/null +++ b/public/img/perplexity.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/img/quill.png b/public/img/quill.png new file mode 100644 index 0000000000000000000000000000000000000000..8edd69153c981d9780a0d1b1fcbe9c73e57c535f Binary files /dev/null and b/public/img/quill.png differ diff --git a/public/img/scale.svg b/public/img/scale.svg new file mode 100644 index 0000000000000000000000000000000000000000..5d0f87ceac27620110e17d206199f5a9b345ba5a --- /dev/null +++ b/public/img/scale.svg @@ -0,0 +1,60 @@ + + + + diff --git a/public/img/step-into.svg b/public/img/step-into.svg new file mode 100644 index 0000000000000000000000000000000000000000..fcfa7ef16e103977ea86a160ef07418c3847385b --- /dev/null +++ b/public/img/step-into.svg @@ -0,0 +1,149 @@ + + + + diff --git a/public/img/step-out.svg b/public/img/step-out.svg new file mode 100644 index 0000000000000000000000000000000000000000..aa7dd3ea211800ae6617e5f6d4db7f1b3a7f3f50 --- /dev/null +++ b/public/img/step-out.svg @@ -0,0 +1,149 @@ + + + + diff --git a/public/img/step-over.svg b/public/img/step-over.svg new file mode 100644 index 0000000000000000000000000000000000000000..6f23ff22aafab8a599be87649be6fb37863b4729 --- /dev/null +++ b/public/img/step-over.svg @@ -0,0 +1,149 @@ + + + + diff --git a/public/img/step-resume.svg b/public/img/step-resume.svg new file mode 100644 index 0000000000000000000000000000000000000000..bf3e0647fd14ebd54ab89ff499cccee463e649b2 --- /dev/null +++ b/public/img/step-resume.svg @@ -0,0 +1,218 @@ + + + + diff --git a/public/img/tabby.svg b/public/img/tabby.svg new file mode 100644 index 0000000000000000000000000000000000000000..cc19e6ed5e50503ecc144c9c849e9e260530c650 --- /dev/null +++ b/public/img/tabby.svg @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/public/img/textgenerationwebui.svg b/public/img/textgenerationwebui.svg new file mode 100644 index 0000000000000000000000000000000000000000..b453a385e7c3be7402bfde01410e563849547e88 --- /dev/null +++ b/public/img/textgenerationwebui.svg @@ -0,0 +1,88 @@ + + + + +Created by potrace 1.15, written by Peter Selinger 2001-2017 + + + + + diff --git a/public/img/times-circle.svg b/public/img/times-circle.svg new file mode 100644 index 0000000000000000000000000000000000000000..cdee94147a728113176bdf1ba8aca185f21a23ee --- /dev/null +++ b/public/img/times-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/togetherai.svg b/public/img/togetherai.svg new file mode 100644 index 0000000000000000000000000000000000000000..e1e4c0407bdcb636cf29006255148f46b2f1475e --- /dev/null +++ b/public/img/togetherai.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000000000000000000000000000000000000..2232d558df82569a81a1208a18cb8bda84d31aa7 --- /dev/null +++ b/public/index.html @@ -0,0 +1,6610 @@ + + + + + SillyTavern + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+
+
+ +
+
+
+
+
+
+
+ + +
+
+ Click slider numbers to input manually. +
+
MAD LAB MODE ON
+ + + +
+
+
+
+

Kobold Presets + + + +

+
+ +
+ + + + + + + +
+
+
+
+

+ NovelAI Presets + + + +

+
+ +
+ + + + + + + +
+
+
+
+
+

Chat Completion Presets

+
+ +
+ + + + + + +
+
+
+
+
+

Text Completion presets

+
+ +
+ + + + + + + +
+
+
+
+
+
+
+ AI Module +
+
+ Changes the style of the generated text. +
+ +
+
+
+
+
+ Response (tokens) + +
+ +
+
+ +
+
+ +
+
+
+ Context (tokens) + +
+ +
+
+ +
+
+ + Max prompt cost: + +
+
+
+
+ +
+
+ +
+ + Display the response bit by bit as it is generated.
+ + When this is off, responses will be displayed all at once when they are complete. + +
+
+
+
+ Temperature +
+
+
+ +
+
+ +
+
+
+
+
+ Repetition Penalty +
+
+
+ +
+
+ +
+
+
+
+
+ Rep Pen Range +
+
+
+ +
+
+ +
+
+
+
+
+ Repetition Penalty Slope +
+
+
+ +
+
+ +
+
+
+
+
+ Repetition Penalty Frequency +
+
+
+ +
+
+ +
+
+
+
+
+ Repetition Penalty Presence +
+
+
+ +
+
+ +
+
+
+
+
+ TFS +
+
+
+ +
+
+ +
+
+
+
+
+ Phrase Repetition Penalty +
+ +
+
+
+
+ +
+ + Unrestricted maximum value for the context size slider. Enable only if you know + what you're doing. + +
+
+
+
+ Context Size (tokens) +
+
+
+ +
+
+ +
+
+
+
+
+ Max Response Length (tokens) +
+
+ +
+
+
+
+ Multiple swipes per generation +
+
+ +
+
+
+ Max prompt cost: Unknown +
+
+
+ +
+ + Display the response bit by bit as it is generated. +
+ + When this is off, responses will be displayed all at once when they are complete. + +
+
+
+ +
+ + Allow the model to use the web-search connector. + +
+
+
+
+ Temperature +
+
+
+ +
+
+ +
+
+
+
+
+ Frequency Penalty +
+
+
+ +
+
+ +
+
+
+
+
+ Presence Penalty +
+
+
+ +
+
+ +
+
+
+
+
+ Count Penalty +
+
+
+ +
+
+ +
+
+
+
+
+ Top K +
+
+
+ +
+
+ +
+
+
+
+
+ Top P +
+
+
+ +
+
+ +
+
+
+
+
+ Repetition Penalty +
+
+
+ +
+
+ +
+
+
+
+
+ Min P +
+
+
+ +
+
+ +
+
+
+
+
+ Top A +
+
+
+ +
+
+ +
+
+
+
+
+ Quick Prompts Edit +
+
+
+
+
Main
+
+ +
+
+
+
Auxiliary
+
+ +
+
+
+
Post-History Instructions
+
+ +
+
+
+
+
+
+ Utility Prompts +
+
+
+
+
+ Impersonation prompt +
+
+
+
+
+ Prompt that is used for Impersonation function +
+
+ +
+
+
+
+ World Info format template +
+
+
+
+
+ Wraps activated World Info entries before inserting into the prompt. + Use{0} + to mark a place where the content is inserted. +
+
+ +
+
+
+
+ Scenario format template +
+
+
+
+
+ Use {{scenario}} to mark a place where the content is inserted. +
+
+ +
+
+
+
+ Personality format template +
+
+
+
+
+ Use {{personality}} to mark a place where the content is inserted. +
+
+ +
+
+
+
+ Group Nudge prompt template +
+
+
+
+
+ + Sent at the end of the group chat history to force reply from a specific character. + +
+
+ +
+
+
+
+ New Chat +
+
+
+
+
+ + Set at the beginning of the chat history to indicate that a new chat is about to start. + +
+
+ +
+
+
+
+ New Group Chat +
+
+
+
+
+ + Set at the beginning of the chat history to indicate that a new group chat is about to start. + +
+
+ +
+
+
+
+ New Example Chat +
+
+
+
+
+ + Set at the beginning of Dialogue examples to indicate that a new example chat is about to start. + +
+
+ +
+
+
+
+ Continue nudge +
+
+
+
+
+ + Set at the end of the chat history when the continue button is pressed. + +
+
+ +
+
+
+
+ Replace empty message +
+
+ + Send this text instead of nothing when the text box is empty. + +
+
+ +
+
+
+
+
+
+ Seed +
+
+ Set to get deterministic results. Use -1 for random seed. +
+
+ +
+
+
+
+
+
+
+
+ + Temperature +
+
+ + +
+
+ + Top K +
+
+ + +
+
+ + Top P +
+
+ + +
+
+ + Typical P +
+
+ + +
+
+ + Min P +
+
+ + +
+
+ + Top A +
+
+ + +
+
+ + TFS +
+
+ + +
+
+ + Repetition Penalty + + + +
+
+ + Rep Pen Range + + + +
+
+ + Repetition Penalty Slope + + + +
+
+

Mirostat

+
+
+ + Mode +
+
+ + +
+
+ + Tau +
+
+ + +
+
+ + Eta +
+
+ + +
+
+
+
+
+ +
+
+ + Seed + + +
+
+
+

GBNF Grammar + + + + + +

+ +
+
+
+
+ Samplers Order +
+
+ Samplers will be applied in a top-down order. + Use with caution. +
+
+
+ Top K + 0 +
+
+ Top A + 1 +
+
+ Top P & Min P + 2 +
+
+ Tail Free Sampling + 3 +
+
+ Typical P + 4 +
+
+ Temperature + 5 +
+
+ Repetition Penalty + 6 +
+
+ +
+
+
+
+
+
+ Preamble +
+
+
+
+
+ Use style tags to modify the writing style of the output. +
+
+ +
+
+
+
+ Banned Tokens +
+
+ Sequences you don't want to appear in the output. One per line. Text or [token ids]. +
+
+ +
+
+
+
+ Logit Bias +
+ + Add +
+
+
+ Helps to ban or reinforce the usage of certain tokens. +
+
+
+
+
+
+
+
+ CFG Scale +
+
+
+ +
+
+ +
+
+
+
+
+ Negative Prompt +
+
+ +
+ + Used if CFG Scale is unset globally, per chat or character + +
+
+
+
+ Top P +
+
+
+ +
+
+ +
+
+
+
+
+ Top A +
+
+
+ +
+
+ +
+
+
+
+
+ Top K +
+
+
+ +
+
+ +
+
+
+
+
+ Mirostat Tau +
+
+
+ +
+
+ +
+
+
+
+
+ Mirostat LR +
+
+
+ +
+
+ +
+
+
+
+
+ Typical P +
+
+
+ +
+
+ +
+
+
+
+
+ Min Length +
+
+
+ +
+
+ +
+
+
+
+
+ Samplers Order +
+
+ Samplers will be applied in a top-down order. Use with caution. +
+
+
+ Temperature + 0 +
+
+
+ Top K Sampling + 1 +
+
+
+ Nucleus Sampling + 2 +
+
+
+ Tail Free Sampling + 3 +
+
+
+ Top A Sampling + 4 +
+
+
+ Typical P + 5 +
+
+
+ CFG + 6 +
+
+ +
+ Mirostat + 8 +
+
+
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ Multiple swipes per generation + +
+
+
+ + Temperature +
+
+ + +
+
+ + Top K +
+
+ + +
+
+ + Top P +
+
+ + +
+
+ + Typical P +
+
+ + +
+
+ + Min P +
+
+ + +
+
+ + Top A +
+
+ + +
+
+ + TFS +
+
+ + +
+
+ + Epsilon Cutoff +
+
+ + +
+
+ + Eta Cutoff +
+
+ + +
+
+ Repetition Penalty + + +
+
+ Rep Pen Range + + +
+
+ Rep Pen Slope + + +
+
+ Rep Pen Decay + + +
+
+ Encoder Penalty + + +
+
+ Frequency Penalty + + +
+
+ Presence Penalty + + +
+
+ No Repeat Ngram Size + + +
+
+ Skew + + +
+
+ Min Length + + +
+
+ Maximum tokens/second + + +
+
+

+ +
+

+
+
+ Smoothing Factor + + +
+
+ Smoothing Curve + + +
+
+
+ +
+

+ + +
+
+

+
+
+ Multiplier + + +
+
+ Base + + +
+
+ Allowed Length + + +
+
+ Penalty Range + + +
+
+
+
+ Sequence Breakers +
+
+ +
+
+
+
+

+
+
+ +
+ Dynamic Temperature +
+
+

+
+
+ Minimum Temp + + +
+
+ Maximum Temp + + +
+
+ Exponent + + +
+
+
+
+

+ +
+

+
+
+ Mode + + +
+
+ + + +
+
+ + + +
+
+
+
+

+ +

+
+
+ # of Beams + + +
+
+ Length Penalty + + +
+
+ +
+
+
+
+

Contrastive Search +
+

+
+ + + +
+
+
+
+ + + + + + + + + +
+
+
+ Seed + +
+
+
+

+ Banned Tokens +
+

+
+ +
+
+
+
+ Logit Bias +
+ + Add +
+
+
+ Helps to ban or reinforce the usage of certain tokens. +
+
+
+
+
+
+
+

CFG +
+

+
+ Scale + + +
+
+
+ Negative Prompt + +
+
+
+
+ +
+
+
+
+
+

JSON Schema + + + + + +

+ +
+
+
+

+ +

+ +
+
+
+
+ Samplers Order +
+
+ kcpp only. Samplers will be applied in a top-down order. + Use with caution. +
+
+
+ Top K + 0 +
+
+ Top A + 1 +
+
+ Top P & Min P + 2 +
+
+ Tail Free Sampling + 3 +
+
+ Typical P + 4 +
+
+ Temperature + 5 +
+
+ Repetition Penalty + 6 +
+
+ +
+
+
+

+ Sampler Order +
+

+
+ llama.cpp only. Determines the order of samplers. If Mirostat mode is not 0, sampler order is ignored. +
+
+
Temperature
+
Top K
+
Top P
+
Typical P
+
Tail Free Sampling
+
Min P
+
+ +
+
+
+

+ Sampler Priority +
+

+
+ Ooba only. Determines the order of samplers. +
+
+
Temperature
+
Dynamic Temperature
+
Quadratic / Smooth Sampling
+
Top K
+
Top P
+
Typical P
+
Epsilon Cutoff
+
Eta Cutoff
+
Tail Free Sampling
+
Top A
+
Min P
+
Mirostat
+
+ +
+
+
+
+
+
+
+
+ Character Names Behavior + + () +
+
+
+
+ + + + + + +
+
+
+
+
+ Continue Postfix + + () +
+
+
+
+ + + + + + +
+
+
+ +
+ Wrap + entire user message in quotes before sending.
+ Leave off + if you use quotes manually for speech. +
+
+
+ +
+ + Continue sends the last message as assistant role instead of system message with instruction. + +
+
+
+ +
+ + Combines consecutive system messages into one (excluding example dialogues). May improve coherence for some models. + +
+
+
+ +
+
+ +
+ + +
+
+
+ +
+ Use the appropriate tokenizer for Jurassic models, which is more efficient than GPT's. +
+
+
+ +
+ Use the appropriate tokenizer for Google models via their API. Slower prompt processing, but offers much more accurate token counting. +
+
+
+ +
+ + Merges all system messages up until the first message with a non-system role, and sends them in a system_instruction field. + +
+
+
+
+
+ Assistant Prefill + +
+ +
+ Assistant Impersonation Prefill + +
+ +
+ +
+ + Send the system prompt for supported models. If disabled, the user message is added to the beginning of the prompt. + +
+
+
+ User first message +
+
+
+
+ +
+
+
+
+
+ Logit Bias +
+
+ Helps to ban or reinforce the usage of certain tokens. Confirm token parsing with Tokenizer. +
+
+ + + + + + +
+
+
+ View / Edit bias preset +
+
+
+
+ Add bias entry +
+
+
+ + +   + + Most tokens have a leading space. + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

API

+
+
+ +
+
+
+
+ + + + + Context: --, Response: -- +

API key

+ + Get it here: Register (View my Kudos)
+ Enter 0000000000 to use anonymous mode. +
+ +
+ + +
+
+ For privacy reasons, your API key will be hidden after you reload the page. +
+

+ Models +
+
+
+

+ +
+
+
+
Not connected...
+
+
+
+
+
+
+

API url

+ Example: http://127.0.0.1:5000/api + +
+ KoboldCpp works better when you select the Text Completion API and then KoboldCpp as a type! +
+
+ + +
+
+
+
+
Not connected...
+
+
+
+ + + +
+
+ + View hidden API keys +
+
+
+
+
+
+
+
+

+ Advanced Formatting +

+
+
+
+

+
+ Context Template + + + +
+
+ + + + +
+

+
+ + + + + +
+
+ + +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + + +
+ + +
+
+

+
+ Instruct Mode + + + +
+
+ + + + +
+

+
+ + +
+ +
+ + + + + +
+ +
+ +
+
+ + + + + +
+
+ + +
+
+
+ Instruct Mode Sequences +
+
+
+
+ System Prompt Wrapping +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ Chat Messages Wrapping +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+ Misc. Sequences +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+
+
+

+ Context Formatting +

+ +  (Saved to Context Template) + +
+ + + + + +
+

+ Misc. Settings +

+ + +
+

Tokenizer + + + +

+ +
+
+
+ Token Padding + + + +
+ +
+
+
+

+ + Start Reply With + +

+
+ +
+ +
+
+

+ + Non-markdown strings + +

+
+ +
+
+
+

+ + Custom Stopping Strings + + + + +

+
+ + JSON serialized array of strings + +
+
+ +
+ +
+
+
+

+ Auto-Continue +

+
+ + +
+ +
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+ + +

+ Worlds/Lorebooks + + + +

+
+
+
+
+
+ Active World(s) for all chats +
+
+ +
+
+
+
+ + Global World Info/Lorebook activation settings + +
+
+
+ Click to expand +
+
+
+
+
+
+ + Scan Depth + + + +
+ +
+ + Context % + + + +
+ +
+ + Budget Cap +
+
+ + +
+ +
+ + Min Activations +
+
+ + +
+ +
+ + Max Depth +
+
+ + +
+
+ + Max Recursion Steps +
+
+ + +
+ +
+ + Insertion Strategy + + +
+
+
+ + + + + + +
+
+
+
+
+
+
+
+
+ + + or + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

User Settings

+ +
+
+
+ Language: + +
+ +
+
+
+ + + +
+ +
+
+
+
+
+

+ UI Theme +
+ + + +
+ +

+
+ + + +
+
+
+ +
+
+ Avatars: + +
+
+ Chat Style:
+ +
+
+
+
+ Theme Colors +
+
+
+
+
+ + Main Text +
+
+ + Italics Text +
+
+ + Underlined Text +
+
+ + Quote Text +
+
+ + Text Shadow +
+
+ + Chat Background +
+
+ + UI Background +
+
+ + UI Border +
+
+ + User Message +
+
+ + AI Message +
+
+
+
+
+
+ +
+ + Chat Width +
+
+ + +
+ +
+ + Font Scale +
+
+ + +
+ +
+ + Blur Strength +
+
+ + +
+ +
+ + Shadow Width +
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+

+ Character Handling +

+
+ + +
+
+ + +
+ + + + + + + +
+ +
+

Miscellaneous

+
+ + +
+ + + + + + + + +
+ + +
+
+
+ + +
+
+
+

+ Custom CSS + +

+
+ +
+
+
+
+
+
+ +
+

Chat/Message Handling

+
+
+ + # Msg. to Load + +
+
+ + + (0 = All) +
+ +
+ + Streaming FPS +
+
+ + +
+
+
+ + +
+
+ + Enter to Send: + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + +
+
+ Auto-swipe +
+
+
+ + Minimum generated message length + + Blacklisted words +
+ + Blacklisted word count to swipe + +
+
+
+
+
+

AutoComplete Settings

+ +
+
+ + +
+
+ +
+ + +
+
+
+
+ + +
+
+ + + +
+
+ +
+
+ + + + + + +
+
+ + + + + + +
+
+
+
+
+

STscript Settings

+
+ + + +
+
+
+
+
+
+
+
+ +
+
+
+ + +
+

+ System Backgrounds +

+
+
+ +
+
+

+ Chat Backgrounds +

+
+ Chat backgrounds generated with the  Image Generation extension will appear here. +
+
+
+
+
+
+
+
+
+
+
+
+
+

+ Extensions +

+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

Extras API: + + SillyTavern-Extras + +

+
+
Not connected...
+ +
+
+
+ + +
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+

Persona Management

+ + + +
+
+ + + + +
+
+
+
+
+ + + +
+ +
+
+
+
+
+
+ + +
+
+
+

Name

+
+ + + + +
+
+

Persona Description

+ +
+ Tokens: 0 +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+ +
+
+ + +
+
+
+
+

text

+
+ +
+ + +
+
+
+
+
+
+

- Advanced + Definitions +
+
+
+
+
+

+ Prompt Overrides + (For Chat Completion and Instruct Mode) +

+
+
+
+ Insert {{original}} into either box to include the respective default prompt from system settings. +
+

Main Prompt

+ +
+ Tokens: counting... +
+
+
+

Post-History Instructions

+ +
+ Tokens: counting... +
+
+
+
+
+
+
+

+ Creator's Metadata + (Not sent with the AI Prompt) +

+
+
+
+ Everything here is optional +
+
+

Created by

+ +
+
+

Character Version

+ +
+
+
+
+

Creator's Notes

+ +
+
+

Tags to Embed

+ +
+
+
+
+
+
+

+ Personality summary + +

+ +
+ Tokens: counting... +
+
+
+

+ Scenario + + + +

+ +
+ Tokens: counting... +
+
+
+
+

+ + Character's Note + +

+ +
+
+

+ + @ Depth + +

+ +

+ + Role + +

+ +
+ Tokens: counting... +
+
+
+
+

Talkativeness

+
+ How often the character speaks in group chats! +
+ +
+ Shy + Normal + Chatty +
+
+
+
+
+

Examples of dialogue

+
Important to set the character's writing style.
+
+ +
+ Tokens: counting... +
+ +
+ +
+
+
+
+
+ +
+
+ Chat History + +
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+

+ Chat Lorebook for +

+
+
+ + A selected World Info will be bound to this chat. When generating an AI reply, + it will be combined with the entries from global and character lorebooks. + +
+
+ +
+
+
+
+
+
+

+ Select a World Info file for : +

+
+

Primary Lorebook

+
+ A selected World Info will be bound to this character as its own Lorebook. + When generating an AI reply, it will be combined with the entries from a global World Info selector. + Exporting a character would also export the selected Lorebook file embedded in the JSON data. +
+
+ +
+
+

+ Additional Lorebooks +

+
+
+ Associate one or more auxillary Lorebooks with this character.
+ NOTE: These choices are optional and won't be preserved on character export! +
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
 entries
+
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+
+
+
+ + + Comma separated (required) + + + Primary Keywords + + + +
+
+ Logic + +
+
+ + + (ignored if empty) + + + Optional Filter + + + +
+
+
+
+ Scan Depth + +
+
+ Case-Sensitive + +
+
+ Match Whole Words + +
+
+ Use Group Scoring + +
+
+ Automation ID + +
+
+
+
+ + +
+
+
+
+
+
+
+
+ + Inclusion Group + + + + + +
+
+ +
+
+
+
+ + Group Weight + +
+
+ +
+
+
+
+ + + Sticky + + + +
+
+ +
+
+
+
+ + + Cooldown + + + +
+
+ +
+
+
+
+ + + Delay + + + +
+
+ +
+
+
+
+
+
+ + Filter to Characters or Tags + + +
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ + +++ + + +
+ + +
+
+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+
+ + + +
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+ ${characterName} + + +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+ + + + + + +
+
+
+
+
+
+
+
+
+
+
+
1/1
+
+
+ +
+
+
+ +
+
+
+
+ img1 +
+
+ img1 + img2 +
+
+ img1 + img2 + img3 +
+
+ img1 + img2 + img3 + img4 +
+
+ +
+
+

Welcome to SillyTavern!

+ +
+ Language: + +
+ + SillyTavern is aimed at advanced users. + +
+ + If you're new to this, enable the simplified UI mode below. + +
+ + Change it later in the 'User Settings' panel. + +
+ +
+
+

+ Looking for AI characters? +

+ + + + Import + + + from supported sources or view + + + + Sample characters + + +
+
+

+ Your Persona +

+
+ + Before you get started, you must select a persona name. + +
+ This can be changed at any time via the icon. +
+

Persona Name:

+
+
+
+
+
+ Avatar +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+ in this group + + +
+
+
+
+
+
+
+
+ +
+
+
+ + +
+ +
+
+
+
+
+
+
+ +
+
+ +
+
+
+ Go back +
+
+
+
+
+
+ +
+
+
+
+
+

Alternate Greetings

+ +
+ + These will be displayed as swipes on the first message when starting a new chat. + Group members can select one of them to initiate the conversation. + +
+
+ + Click the button to get started! + +
+
+
+
+
+
+ Alternate Greeting # + +
+ +
+
+ + +
+
CHAR is typing
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+ Author's Note +
+
+
+ + Unique to this chat.
+ Checkpoints inherit the Note from their parent, and can be changed individually after that.
+
+ +
+ Tokens: 0 +
+ +
+ + + +
+ +
+ + +
+
+ User inputs until next insertion: (disabled) +
+
+
+
+
+
+ + Character Author's Note (Private) + + + Won't be shared with the character card on export. + +
+
+
+
+ Will be automatically added as the author's note for this character. Will be used in groups, but + can't be modified when a group chat is open. + +
+ Tokens: 0 +
+ +
+ + + +
+
+
+
+
+
+ Default Author's Note +
+
+
+ Will be automatically added as the Author's Note for all new chats. + +
+ Tokens: 0 +
+
+ + + +
+
+ + +
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ Chat CFG +
+
+
+ + Unique to this chat.
+
+ +
+
+ +
+
+ +
+
+
+ + + + +
+
+ +
+
+
+
+ +
+
+
+
+ Global CFG +
+
+
+ Will be used as the default CFG options for every chat unless overridden. +
+ +
+
+ +
+
+ +
+
+
+ + + + +
+
+
+
+
+
+
+
+ CFG Prompt Cascading +
+
+
+
+ + Combine positive/negative prompts from other boxes. +
+ For example, ticking the chat, global, and character boxes combine all negative prompts into a comma-separated string. +
+
+
+
+ + + + +
+
+ + +
+
+
+
+
+
+
+
+
+ Token Probabilities +
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+ + Select a token to see alternatives considered by the AI. + +
+
+
+
+
+ +
+
+
+
+
+
+
+ + +
+
+
+
+ + + + File Name + File Size + +
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+ + +
+
PNG
+
JSON
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+
+
+ User Avatar +
+
+
+ +
+ + + + + +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/jsconfig.json b/public/jsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..f362b9731d3fc53cabbe474ba1a7cc576e0973cc --- /dev/null +++ b/public/jsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "checkJs": true, + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "node", + "allowUmdGlobalAccess": true, + "allowSyntheticDefaultImports": true + }, + "exclude": [ + "node_modules" + ], + "typeAcquisition": { + "include": [ + "jquery", + "@popperjs/core", + "toastr", + "showdown", + "dompurify", + "moment", + "seedrandom", + "showdown-katex", + "droll", + "handlebars", + "highlight.js", + "localforage", + "pdfjs-dist", + "@mozilla/readability" + ] + } +} diff --git a/public/lib/Readability-readerable.js b/public/lib/Readability-readerable.js new file mode 100644 index 0000000000000000000000000000000000000000..892169fb94999987e895846b7605f9c4cf32802c --- /dev/null +++ b/public/lib/Readability-readerable.js @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2010 Arc90 Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * This code is heavily based on Arc90's readability.js (1.7.1) script + * available at: http://code.google.com/p/arc90labs-readability + */ + +var REGEXPS = { + // NOTE: These two regular expressions are duplicated in + // Readability.js. Please keep both copies in sync. + unlikelyCandidates: /-ad-|ai2html|banner|breadcrumbs|combx|comment|community|cover-wrap|disqus|extra|footer|gdpr|header|legends|menu|related|remark|replies|rss|shoutbox|sidebar|skyscraper|social|sponsor|supplemental|ad-break|agegate|pagination|pager|popup|yom-remote/i, + okMaybeItsACandidate: /and|article|body|column|content|main|shadow/i, +}; + +function isNodeVisible(node) { + // Have to null-check node.style and node.className.indexOf to deal with SVG and MathML nodes. + return (!node.style || node.style.display != "none") + && !node.hasAttribute("hidden") + //check for "fallback-image" so that wikimedia math images are displayed + && (!node.hasAttribute("aria-hidden") || node.getAttribute("aria-hidden") != "true" || (node.className && node.className.indexOf && node.className.indexOf("fallback-image") !== -1)); +} + +/** + * Decides whether or not the document is reader-able without parsing the whole thing. + * @param {Object} options Configuration object. + * @param {number} [options.minContentLength=140] The minimum node content length used to decide if the document is readerable. + * @param {number} [options.minScore=20] The minumum cumulated 'score' used to determine if the document is readerable. + * @param {Function} [options.visibilityChecker=isNodeVisible] The function used to determine if a node is visible. + * @return {boolean} Whether or not we suspect Readability.parse() will suceeed at returning an article object. + */ +function isProbablyReaderable(doc, options = {}) { + // For backward compatibility reasons 'options' can either be a configuration object or the function used + // to determine if a node is visible. + if (typeof options == "function") { + options = { visibilityChecker: options }; + } + + var defaultOptions = { minScore: 20, minContentLength: 140, visibilityChecker: isNodeVisible }; + options = Object.assign(defaultOptions, options); + + var nodes = doc.querySelectorAll("p, pre, article"); + + // Get
nodes which have
node(s) and append them into the `nodes` variable. + // Some articles' DOM structures might look like + //
+ // Sentences
+ //
+ // Sentences
+ //
+ var brNodes = doc.querySelectorAll("div > br"); + if (brNodes.length) { + var set = new Set(nodes); + [].forEach.call(brNodes, function (node) { + set.add(node.parentNode); + }); + nodes = Array.from(set); + } + + var score = 0; + // This is a little cheeky, we use the accumulator 'score' to decide what to return from + // this callback: + return [].some.call(nodes, function (node) { + if (!options.visibilityChecker(node)) { + return false; + } + + var matchString = node.className + " " + node.id; + if (REGEXPS.unlikelyCandidates.test(matchString) && + !REGEXPS.okMaybeItsACandidate.test(matchString)) { + return false; + } + + if (node.matches("li p")) { + return false; + } + + var textContentLength = node.textContent.trim().length; + if (textContentLength < options.minContentLength) { + return false; + } + + score += Math.sqrt(textContentLength - options.minContentLength); + + if (score > options.minScore) { + return true; + } + return false; + }); +} + +if (typeof module === "object") { + /* global module */ + module.exports = isProbablyReaderable; +} diff --git a/public/lib/Readability.js b/public/lib/Readability.js new file mode 100644 index 0000000000000000000000000000000000000000..b745aa01d8ea23e55c5c309c29262f6fa0a74a01 --- /dev/null +++ b/public/lib/Readability.js @@ -0,0 +1,2314 @@ +/* + * Copyright (c) 2010 Arc90 Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * This code is heavily based on Arc90's readability.js (1.7.1) script + * available at: http://code.google.com/p/arc90labs-readability + */ + +/** + * Public constructor. + * @param {HTMLDocument} doc The document to parse. + * @param {Object} options The options object. + */ +function Readability(doc, options) { + // In some older versions, people passed a URI as the first argument. Cope: + if (options && options.documentElement) { + doc = options; + options = arguments[2]; + } else if (!doc || !doc.documentElement) { + throw new Error("First argument to Readability constructor should be a document object."); + } + options = options || {}; + + this._doc = doc; + this._docJSDOMParser = this._doc.firstChild.__JSDOMParser__; + this._articleTitle = null; + this._articleByline = null; + this._articleDir = null; + this._articleSiteName = null; + this._attempts = []; + + // Configurable options + this._debug = !!options.debug; + this._maxElemsToParse = options.maxElemsToParse || this.DEFAULT_MAX_ELEMS_TO_PARSE; + this._nbTopCandidates = options.nbTopCandidates || this.DEFAULT_N_TOP_CANDIDATES; + this._charThreshold = options.charThreshold || this.DEFAULT_CHAR_THRESHOLD; + this._classesToPreserve = this.CLASSES_TO_PRESERVE.concat(options.classesToPreserve || []); + this._keepClasses = !!options.keepClasses; + this._serializer = options.serializer || function(el) { + return el.innerHTML; + }; + this._disableJSONLD = !!options.disableJSONLD; + this._allowedVideoRegex = options.allowedVideoRegex || this.REGEXPS.videos; + + // Start with all flags set + this._flags = this.FLAG_STRIP_UNLIKELYS | + this.FLAG_WEIGHT_CLASSES | + this.FLAG_CLEAN_CONDITIONALLY; + + + // Control whether log messages are sent to the console + if (this._debug) { + let logNode = function(node) { + if (node.nodeType == node.TEXT_NODE) { + return `${node.nodeName} ("${node.textContent}")`; + } + let attrPairs = Array.from(node.attributes || [], function(attr) { + return `${attr.name}="${attr.value}"`; + }).join(" "); + return `<${node.localName} ${attrPairs}>`; + }; + this.log = function () { + if (typeof console !== "undefined") { + let args = Array.from(arguments, arg => { + if (arg && arg.nodeType == this.ELEMENT_NODE) { + return logNode(arg); + } + return arg; + }); + args.unshift("Reader: (Readability)"); + console.log.apply(console, args); + } else if (typeof dump !== "undefined") { + /* global dump */ + var msg = Array.prototype.map.call(arguments, function(x) { + return (x && x.nodeName) ? logNode(x) : x; + }).join(" "); + dump("Reader: (Readability) " + msg + "\n"); + } + }; + } else { + this.log = function () {}; + } +} + +Readability.prototype = { + FLAG_STRIP_UNLIKELYS: 0x1, + FLAG_WEIGHT_CLASSES: 0x2, + FLAG_CLEAN_CONDITIONALLY: 0x4, + + // https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType + ELEMENT_NODE: 1, + TEXT_NODE: 3, + + // Max number of nodes supported by this parser. Default: 0 (no limit) + DEFAULT_MAX_ELEMS_TO_PARSE: 0, + + // The number of top candidates to consider when analysing how + // tight the competition is among candidates. + DEFAULT_N_TOP_CANDIDATES: 5, + + // Element tags to score by default. + DEFAULT_TAGS_TO_SCORE: "section,h2,h3,h4,h5,h6,p,td,pre".toUpperCase().split(","), + + // The default number of chars an article must have in order to return a result + DEFAULT_CHAR_THRESHOLD: 500, + + // All of the regular expressions in use within readability. + // Defined up here so we don't instantiate them repeatedly in loops. + REGEXPS: { + // NOTE: These two regular expressions are duplicated in + // Readability-readerable.js. Please keep both copies in sync. + unlikelyCandidates: /-ad-|ai2html|banner|breadcrumbs|combx|comment|community|cover-wrap|disqus|extra|footer|gdpr|header|legends|menu|related|remark|replies|rss|shoutbox|sidebar|skyscraper|social|sponsor|supplemental|ad-break|agegate|pagination|pager|popup|yom-remote/i, + okMaybeItsACandidate: /and|article|body|column|content|main|shadow/i, + + positive: /article|body|content|entry|hentry|h-entry|main|page|pagination|post|text|blog|story/i, + negative: /-ad-|hidden|^hid$| hid$| hid |^hid |banner|combx|comment|com-|contact|foot|footer|footnote|gdpr|masthead|media|meta|outbrain|promo|related|scroll|share|shoutbox|sidebar|skyscraper|sponsor|shopping|tags|tool|widget/i, + extraneous: /print|archive|comment|discuss|e[\-]?mail|share|reply|all|login|sign|single|utility/i, + byline: /byline|author|dateline|writtenby|p-author/i, + replaceFonts: /<(\/?)font[^>]*>/gi, + normalize: /\s{2,}/g, + videos: /\/\/(www\.)?((dailymotion|youtube|youtube-nocookie|player\.vimeo|v\.qq)\.com|(archive|upload\.wikimedia)\.org|player\.twitch\.tv)/i, + shareElements: /(\b|_)(share|sharedaddy)(\b|_)/i, + nextLink: /(next|weiter|continue|>([^\|]|$)|»([^\|]|$))/i, + prevLink: /(prev|earl|old|new|<|«)/i, + tokenize: /\W+/g, + whitespace: /^\s*$/, + hasContent: /\S$/, + hashUrl: /^#.+/, + srcsetUrl: /(\S+)(\s+[\d.]+[xw])?(\s*(?:,|$))/g, + b64DataUrl: /^data:\s*([^\s;,]+)\s*;\s*base64\s*,/i, + // Commas as used in Latin, Sindhi, Chinese and various other scripts. + // see: https://en.wikipedia.org/wiki/Comma#Comma_variants + commas: /\u002C|\u060C|\uFE50|\uFE10|\uFE11|\u2E41|\u2E34|\u2E32|\uFF0C/g, + // See: https://schema.org/Article + jsonLdArticleTypes: /^Article|AdvertiserContentArticle|NewsArticle|AnalysisNewsArticle|AskPublicNewsArticle|BackgroundNewsArticle|OpinionNewsArticle|ReportageNewsArticle|ReviewNewsArticle|Report|SatiricalArticle|ScholarlyArticle|MedicalScholarlyArticle|SocialMediaPosting|BlogPosting|LiveBlogPosting|DiscussionForumPosting|TechArticle|APIReference$/ + }, + + UNLIKELY_ROLES: [ "menu", "menubar", "complementary", "navigation", "alert", "alertdialog", "dialog" ], + + DIV_TO_P_ELEMS: new Set([ "BLOCKQUOTE", "DL", "DIV", "IMG", "OL", "P", "PRE", "TABLE", "UL" ]), + + ALTER_TO_DIV_EXCEPTIONS: ["DIV", "ARTICLE", "SECTION", "P"], + + PRESENTATIONAL_ATTRIBUTES: [ "align", "background", "bgcolor", "border", "cellpadding", "cellspacing", "frame", "hspace", "rules", "style", "valign", "vspace" ], + + DEPRECATED_SIZE_ATTRIBUTE_ELEMS: [ "TABLE", "TH", "TD", "HR", "PRE" ], + + // The commented out elements qualify as phrasing content but tend to be + // removed by readability when put into paragraphs, so we ignore them here. + PHRASING_ELEMS: [ + // "CANVAS", "IFRAME", "SVG", "VIDEO", + "ABBR", "AUDIO", "B", "BDO", "BR", "BUTTON", "CITE", "CODE", "DATA", + "DATALIST", "DFN", "EM", "EMBED", "I", "IMG", "INPUT", "KBD", "LABEL", + "MARK", "MATH", "METER", "NOSCRIPT", "OBJECT", "OUTPUT", "PROGRESS", "Q", + "RUBY", "SAMP", "SCRIPT", "SELECT", "SMALL", "SPAN", "STRONG", "SUB", + "SUP", "TEXTAREA", "TIME", "VAR", "WBR" + ], + + // These are the classes that readability sets itself. + CLASSES_TO_PRESERVE: [ "page" ], + + // These are the list of HTML entities that need to be escaped. + HTML_ESCAPE_MAP: { + "lt": "<", + "gt": ">", + "amp": "&", + "quot": '"', + "apos": "'", + }, + + /** + * Run any post-process modifications to article content as necessary. + * + * @param Element + * @return void + **/ + _postProcessContent: function(articleContent) { + // Readability cannot open relative uris so we convert them to absolute uris. + this._fixRelativeUris(articleContent); + + this._simplifyNestedElements(articleContent); + + if (!this._keepClasses) { + // Remove classes. + this._cleanClasses(articleContent); + } + }, + + /** + * Iterates over a NodeList, calls `filterFn` for each node and removes node + * if function returned `true`. + * + * If function is not passed, removes all the nodes in node list. + * + * @param NodeList nodeList The nodes to operate on + * @param Function filterFn the function to use as a filter + * @return void + */ + _removeNodes: function(nodeList, filterFn) { + // Avoid ever operating on live node lists. + if (this._docJSDOMParser && nodeList._isLiveNodeList) { + throw new Error("Do not pass live node lists to _removeNodes"); + } + for (var i = nodeList.length - 1; i >= 0; i--) { + var node = nodeList[i]; + var parentNode = node.parentNode; + if (parentNode) { + if (!filterFn || filterFn.call(this, node, i, nodeList)) { + parentNode.removeChild(node); + } + } + } + }, + + /** + * Iterates over a NodeList, and calls _setNodeTag for each node. + * + * @param NodeList nodeList The nodes to operate on + * @param String newTagName the new tag name to use + * @return void + */ + _replaceNodeTags: function(nodeList, newTagName) { + // Avoid ever operating on live node lists. + if (this._docJSDOMParser && nodeList._isLiveNodeList) { + throw new Error("Do not pass live node lists to _replaceNodeTags"); + } + for (const node of nodeList) { + this._setNodeTag(node, newTagName); + } + }, + + /** + * Iterate over a NodeList, which doesn't natively fully implement the Array + * interface. + * + * For convenience, the current object context is applied to the provided + * iterate function. + * + * @param NodeList nodeList The NodeList. + * @param Function fn The iterate function. + * @return void + */ + _forEachNode: function(nodeList, fn) { + Array.prototype.forEach.call(nodeList, fn, this); + }, + + /** + * Iterate over a NodeList, and return the first node that passes + * the supplied test function + * + * For convenience, the current object context is applied to the provided + * test function. + * + * @param NodeList nodeList The NodeList. + * @param Function fn The test function. + * @return void + */ + _findNode: function(nodeList, fn) { + return Array.prototype.find.call(nodeList, fn, this); + }, + + /** + * Iterate over a NodeList, return true if any of the provided iterate + * function calls returns true, false otherwise. + * + * For convenience, the current object context is applied to the + * provided iterate function. + * + * @param NodeList nodeList The NodeList. + * @param Function fn The iterate function. + * @return Boolean + */ + _someNode: function(nodeList, fn) { + return Array.prototype.some.call(nodeList, fn, this); + }, + + /** + * Iterate over a NodeList, return true if all of the provided iterate + * function calls return true, false otherwise. + * + * For convenience, the current object context is applied to the + * provided iterate function. + * + * @param NodeList nodeList The NodeList. + * @param Function fn The iterate function. + * @return Boolean + */ + _everyNode: function(nodeList, fn) { + return Array.prototype.every.call(nodeList, fn, this); + }, + + /** + * Concat all nodelists passed as arguments. + * + * @return ...NodeList + * @return Array + */ + _concatNodeLists: function() { + var slice = Array.prototype.slice; + var args = slice.call(arguments); + var nodeLists = args.map(function(list) { + return slice.call(list); + }); + return Array.prototype.concat.apply([], nodeLists); + }, + + _getAllNodesWithTag: function(node, tagNames) { + if (node.querySelectorAll) { + return node.querySelectorAll(tagNames.join(",")); + } + return [].concat.apply([], tagNames.map(function(tag) { + var collection = node.getElementsByTagName(tag); + return Array.isArray(collection) ? collection : Array.from(collection); + })); + }, + + /** + * Removes the class="" attribute from every element in the given + * subtree, except those that match CLASSES_TO_PRESERVE and + * the classesToPreserve array from the options object. + * + * @param Element + * @return void + */ + _cleanClasses: function(node) { + var classesToPreserve = this._classesToPreserve; + var className = (node.getAttribute("class") || "") + .split(/\s+/) + .filter(function(cls) { + return classesToPreserve.indexOf(cls) != -1; + }) + .join(" "); + + if (className) { + node.setAttribute("class", className); + } else { + node.removeAttribute("class"); + } + + for (node = node.firstElementChild; node; node = node.nextElementSibling) { + this._cleanClasses(node); + } + }, + + /** + * Converts each and uri in the given element to an absolute URI, + * ignoring #ref URIs. + * + * @param Element + * @return void + */ + _fixRelativeUris: function(articleContent) { + var baseURI = this._doc.baseURI; + var documentURI = this._doc.documentURI; + function toAbsoluteURI(uri) { + // Leave hash links alone if the base URI matches the document URI: + if (baseURI == documentURI && uri.charAt(0) == "#") { + return uri; + } + + // Otherwise, resolve against base URI: + try { + return new URL(uri, baseURI).href; + } catch (ex) { + // Something went wrong, just return the original: + } + return uri; + } + + var links = this._getAllNodesWithTag(articleContent, ["a"]); + this._forEachNode(links, function(link) { + var href = link.getAttribute("href"); + if (href) { + // Remove links with javascript: URIs, since + // they won't work after scripts have been removed from the page. + if (href.indexOf("javascript:") === 0) { + // if the link only contains simple text content, it can be converted to a text node + if (link.childNodes.length === 1 && link.childNodes[0].nodeType === this.TEXT_NODE) { + var text = this._doc.createTextNode(link.textContent); + link.parentNode.replaceChild(text, link); + } else { + // if the link has multiple children, they should all be preserved + var container = this._doc.createElement("span"); + while (link.firstChild) { + container.appendChild(link.firstChild); + } + link.parentNode.replaceChild(container, link); + } + } else { + link.setAttribute("href", toAbsoluteURI(href)); + } + } + }); + + var medias = this._getAllNodesWithTag(articleContent, [ + "img", "picture", "figure", "video", "audio", "source" + ]); + + this._forEachNode(medias, function(media) { + var src = media.getAttribute("src"); + var poster = media.getAttribute("poster"); + var srcset = media.getAttribute("srcset"); + + if (src) { + media.setAttribute("src", toAbsoluteURI(src)); + } + + if (poster) { + media.setAttribute("poster", toAbsoluteURI(poster)); + } + + if (srcset) { + var newSrcset = srcset.replace(this.REGEXPS.srcsetUrl, function(_, p1, p2, p3) { + return toAbsoluteURI(p1) + (p2 || "") + p3; + }); + + media.setAttribute("srcset", newSrcset); + } + }); + }, + + _simplifyNestedElements: function(articleContent) { + var node = articleContent; + + while (node) { + if (node.parentNode && ["DIV", "SECTION"].includes(node.tagName) && !(node.id && node.id.startsWith("readability"))) { + if (this._isElementWithoutContent(node)) { + node = this._removeAndGetNext(node); + continue; + } else if (this._hasSingleTagInsideElement(node, "DIV") || this._hasSingleTagInsideElement(node, "SECTION")) { + var child = node.children[0]; + for (var i = 0; i < node.attributes.length; i++) { + child.setAttribute(node.attributes[i].name, node.attributes[i].value); + } + node.parentNode.replaceChild(child, node); + node = child; + continue; + } + } + + node = this._getNextNode(node); + } + }, + + /** + * Get the article title as an H1. + * + * @return string + **/ + _getArticleTitle: function() { + var doc = this._doc; + var curTitle = ""; + var origTitle = ""; + + try { + curTitle = origTitle = doc.title.trim(); + + // If they had an element with id "title" in their HTML + if (typeof curTitle !== "string") + curTitle = origTitle = this._getInnerText(doc.getElementsByTagName("title")[0]); + } catch (e) {/* ignore exceptions setting the title. */} + + var titleHadHierarchicalSeparators = false; + function wordCount(str) { + return str.split(/\s+/).length; + } + + // If there's a separator in the title, first remove the final part + if ((/ [\|\-\\\/>»] /).test(curTitle)) { + titleHadHierarchicalSeparators = / [\\\/>»] /.test(curTitle); + curTitle = origTitle.replace(/(.*)[\|\-\\\/>»] .*/gi, "$1"); + + // If the resulting title is too short (3 words or fewer), remove + // the first part instead: + if (wordCount(curTitle) < 3) + curTitle = origTitle.replace(/[^\|\-\\\/>»]*[\|\-\\\/>»](.*)/gi, "$1"); + } else if (curTitle.indexOf(": ") !== -1) { + // Check if we have an heading containing this exact string, so we + // could assume it's the full title. + var headings = this._concatNodeLists( + doc.getElementsByTagName("h1"), + doc.getElementsByTagName("h2") + ); + var trimmedTitle = curTitle.trim(); + var match = this._someNode(headings, function(heading) { + return heading.textContent.trim() === trimmedTitle; + }); + + // If we don't, let's extract the title out of the original title string. + if (!match) { + curTitle = origTitle.substring(origTitle.lastIndexOf(":") + 1); + + // If the title is now too short, try the first colon instead: + if (wordCount(curTitle) < 3) { + curTitle = origTitle.substring(origTitle.indexOf(":") + 1); + // But if we have too many words before the colon there's something weird + // with the titles and the H tags so let's just use the original title instead + } else if (wordCount(origTitle.substr(0, origTitle.indexOf(":"))) > 5) { + curTitle = origTitle; + } + } + } else if (curTitle.length > 150 || curTitle.length < 15) { + var hOnes = doc.getElementsByTagName("h1"); + + if (hOnes.length === 1) + curTitle = this._getInnerText(hOnes[0]); + } + + curTitle = curTitle.trim().replace(this.REGEXPS.normalize, " "); + // If we now have 4 words or fewer as our title, and either no + // 'hierarchical' separators (\, /, > or ») were found in the original + // title or we decreased the number of words by more than 1 word, use + // the original title. + var curTitleWordCount = wordCount(curTitle); + if (curTitleWordCount <= 4 && + (!titleHadHierarchicalSeparators || + curTitleWordCount != wordCount(origTitle.replace(/[\|\-\\\/>»]+/g, "")) - 1)) { + curTitle = origTitle; + } + + return curTitle; + }, + + /** + * Prepare the HTML document for readability to scrape it. + * This includes things like stripping javascript, CSS, and handling terrible markup. + * + * @return void + **/ + _prepDocument: function() { + var doc = this._doc; + + // Remove all style tags in head + this._removeNodes(this._getAllNodesWithTag(doc, ["style"])); + + if (doc.body) { + this._replaceBrs(doc.body); + } + + this._replaceNodeTags(this._getAllNodesWithTag(doc, ["font"]), "SPAN"); + }, + + /** + * Finds the next node, starting from the given node, and ignoring + * whitespace in between. If the given node is an element, the same node is + * returned. + */ + _nextNode: function (node) { + var next = node; + while (next + && (next.nodeType != this.ELEMENT_NODE) + && this.REGEXPS.whitespace.test(next.textContent)) { + next = next.nextSibling; + } + return next; + }, + + /** + * Replaces 2 or more successive
elements with a single

. + * Whitespace between
elements are ignored. For example: + *

foo
bar


abc
+ * will become: + *
foo
bar

abc

+ */ + _replaceBrs: function (elem) { + this._forEachNode(this._getAllNodesWithTag(elem, ["br"]), function(br) { + var next = br.nextSibling; + + // Whether 2 or more
elements have been found and replaced with a + //

block. + var replaced = false; + + // If we find a
chain, remove the
s until we hit another node + // or non-whitespace. This leaves behind the first
in the chain + // (which will be replaced with a

later). + while ((next = this._nextNode(next)) && (next.tagName == "BR")) { + replaced = true; + var brSibling = next.nextSibling; + next.parentNode.removeChild(next); + next = brSibling; + } + + // If we removed a
chain, replace the remaining
with a

. Add + // all sibling nodes as children of the

until we hit another
+ // chain. + if (replaced) { + var p = this._doc.createElement("p"); + br.parentNode.replaceChild(p, br); + + next = p.nextSibling; + while (next) { + // If we've hit another

, we're done adding children to this

. + if (next.tagName == "BR") { + var nextElem = this._nextNode(next.nextSibling); + if (nextElem && nextElem.tagName == "BR") + break; + } + + if (!this._isPhrasingContent(next)) + break; + + // Otherwise, make this node a child of the new

. + var sibling = next.nextSibling; + p.appendChild(next); + next = sibling; + } + + while (p.lastChild && this._isWhitespace(p.lastChild)) { + p.removeChild(p.lastChild); + } + + if (p.parentNode.tagName === "P") + this._setNodeTag(p.parentNode, "DIV"); + } + }); + }, + + _setNodeTag: function (node, tag) { + this.log("_setNodeTag", node, tag); + if (this._docJSDOMParser) { + node.localName = tag.toLowerCase(); + node.tagName = tag.toUpperCase(); + return node; + } + + var replacement = node.ownerDocument.createElement(tag); + while (node.firstChild) { + replacement.appendChild(node.firstChild); + } + node.parentNode.replaceChild(replacement, node); + if (node.readability) + replacement.readability = node.readability; + + for (var i = 0; i < node.attributes.length; i++) { + try { + replacement.setAttribute(node.attributes[i].name, node.attributes[i].value); + } catch (ex) { + /* it's possible for setAttribute() to throw if the attribute name + * isn't a valid XML Name. Such attributes can however be parsed from + * source in HTML docs, see https://github.com/whatwg/html/issues/4275, + * so we can hit them here and then throw. We don't care about such + * attributes so we ignore them. + */ + } + } + return replacement; + }, + + /** + * Prepare the article node for display. Clean out any inline styles, + * iframes, forms, strip extraneous

tags, etc. + * + * @param Element + * @return void + **/ + _prepArticle: function(articleContent) { + this._cleanStyles(articleContent); + + // Check for data tables before we continue, to avoid removing items in + // those tables, which will often be isolated even though they're + // visually linked to other content-ful elements (text, images, etc.). + this._markDataTables(articleContent); + + this._fixLazyImages(articleContent); + + // Clean out junk from the article content + this._cleanConditionally(articleContent, "form"); + this._cleanConditionally(articleContent, "fieldset"); + this._clean(articleContent, "object"); + this._clean(articleContent, "embed"); + this._clean(articleContent, "footer"); + this._clean(articleContent, "link"); + this._clean(articleContent, "aside"); + + // Clean out elements with little content that have "share" in their id/class combinations from final top candidates, + // which means we don't remove the top candidates even they have "share". + + var shareElementThreshold = this.DEFAULT_CHAR_THRESHOLD; + + this._forEachNode(articleContent.children, function (topCandidate) { + this._cleanMatchedNodes(topCandidate, function (node, matchString) { + return this.REGEXPS.shareElements.test(matchString) && node.textContent.length < shareElementThreshold; + }); + }); + + this._clean(articleContent, "iframe"); + this._clean(articleContent, "input"); + this._clean(articleContent, "textarea"); + this._clean(articleContent, "select"); + this._clean(articleContent, "button"); + this._cleanHeaders(articleContent); + + // Do these last as the previous stuff may have removed junk + // that will affect these + this._cleanConditionally(articleContent, "table"); + this._cleanConditionally(articleContent, "ul"); + this._cleanConditionally(articleContent, "div"); + + // replace H1 with H2 as H1 should be only title that is displayed separately + this._replaceNodeTags(this._getAllNodesWithTag(articleContent, ["h1"]), "h2"); + + // Remove extra paragraphs + this._removeNodes(this._getAllNodesWithTag(articleContent, ["p"]), function (paragraph) { + var imgCount = paragraph.getElementsByTagName("img").length; + var embedCount = paragraph.getElementsByTagName("embed").length; + var objectCount = paragraph.getElementsByTagName("object").length; + // At this point, nasty iframes have been removed, only remain embedded video ones. + var iframeCount = paragraph.getElementsByTagName("iframe").length; + var totalCount = imgCount + embedCount + objectCount + iframeCount; + + return totalCount === 0 && !this._getInnerText(paragraph, false); + }); + + this._forEachNode(this._getAllNodesWithTag(articleContent, ["br"]), function(br) { + var next = this._nextNode(br.nextSibling); + if (next && next.tagName == "P") + br.parentNode.removeChild(br); + }); + + // Remove single-cell tables + this._forEachNode(this._getAllNodesWithTag(articleContent, ["table"]), function(table) { + var tbody = this._hasSingleTagInsideElement(table, "TBODY") ? table.firstElementChild : table; + if (this._hasSingleTagInsideElement(tbody, "TR")) { + var row = tbody.firstElementChild; + if (this._hasSingleTagInsideElement(row, "TD")) { + var cell = row.firstElementChild; + cell = this._setNodeTag(cell, this._everyNode(cell.childNodes, this._isPhrasingContent) ? "P" : "DIV"); + table.parentNode.replaceChild(cell, table); + } + } + }); + }, + + /** + * Initialize a node with the readability object. Also checks the + * className/id for special names to add to its score. + * + * @param Element + * @return void + **/ + _initializeNode: function(node) { + node.readability = {"contentScore": 0}; + + switch (node.tagName) { + case "DIV": + node.readability.contentScore += 5; + break; + + case "PRE": + case "TD": + case "BLOCKQUOTE": + node.readability.contentScore += 3; + break; + + case "ADDRESS": + case "OL": + case "UL": + case "DL": + case "DD": + case "DT": + case "LI": + case "FORM": + node.readability.contentScore -= 3; + break; + + case "H1": + case "H2": + case "H3": + case "H4": + case "H5": + case "H6": + case "TH": + node.readability.contentScore -= 5; + break; + } + + node.readability.contentScore += this._getClassWeight(node); + }, + + _removeAndGetNext: function(node) { + var nextNode = this._getNextNode(node, true); + node.parentNode.removeChild(node); + return nextNode; + }, + + /** + * Traverse the DOM from node to node, starting at the node passed in. + * Pass true for the second parameter to indicate this node itself + * (and its kids) are going away, and we want the next node over. + * + * Calling this in a loop will traverse the DOM depth-first. + */ + _getNextNode: function(node, ignoreSelfAndKids) { + // First check for kids if those aren't being ignored + if (!ignoreSelfAndKids && node.firstElementChild) { + return node.firstElementChild; + } + // Then for siblings... + if (node.nextElementSibling) { + return node.nextElementSibling; + } + // And finally, move up the parent chain *and* find a sibling + // (because this is depth-first traversal, we will have already + // seen the parent nodes themselves). + do { + node = node.parentNode; + } while (node && !node.nextElementSibling); + return node && node.nextElementSibling; + }, + + // compares second text to first one + // 1 = same text, 0 = completely different text + // works the way that it splits both texts into words and then finds words that are unique in second text + // the result is given by the lower length of unique parts + _textSimilarity: function(textA, textB) { + var tokensA = textA.toLowerCase().split(this.REGEXPS.tokenize).filter(Boolean); + var tokensB = textB.toLowerCase().split(this.REGEXPS.tokenize).filter(Boolean); + if (!tokensA.length || !tokensB.length) { + return 0; + } + var uniqTokensB = tokensB.filter(token => !tokensA.includes(token)); + var distanceB = uniqTokensB.join(" ").length / tokensB.join(" ").length; + return 1 - distanceB; + }, + + _checkByline: function(node, matchString) { + if (this._articleByline) { + return false; + } + + if (node.getAttribute !== undefined) { + var rel = node.getAttribute("rel"); + var itemprop = node.getAttribute("itemprop"); + } + + if ((rel === "author" || (itemprop && itemprop.indexOf("author") !== -1) || this.REGEXPS.byline.test(matchString)) && this._isValidByline(node.textContent)) { + this._articleByline = node.textContent.trim(); + return true; + } + + return false; + }, + + _getNodeAncestors: function(node, maxDepth) { + maxDepth = maxDepth || 0; + var i = 0, ancestors = []; + while (node.parentNode) { + ancestors.push(node.parentNode); + if (maxDepth && ++i === maxDepth) + break; + node = node.parentNode; + } + return ancestors; + }, + + /*** + * grabArticle - Using a variety of metrics (content score, classname, element types), find the content that is + * most likely to be the stuff a user wants to read. Then return it wrapped up in a div. + * + * @param page a document to run upon. Needs to be a full document, complete with body. + * @return Element + **/ + _grabArticle: function (page) { + this.log("**** grabArticle ****"); + var doc = this._doc; + var isPaging = page !== null; + page = page ? page : this._doc.body; + + // We can't grab an article if we don't have a page! + if (!page) { + this.log("No body found in document. Abort."); + return null; + } + + var pageCacheHtml = page.innerHTML; + + while (true) { + this.log("Starting grabArticle loop"); + var stripUnlikelyCandidates = this._flagIsActive(this.FLAG_STRIP_UNLIKELYS); + + // First, node prepping. Trash nodes that look cruddy (like ones with the + // class name "comment", etc), and turn divs into P tags where they have been + // used inappropriately (as in, where they contain no other block level elements.) + var elementsToScore = []; + var node = this._doc.documentElement; + + let shouldRemoveTitleHeader = true; + + while (node) { + + if (node.tagName === "HTML") { + this._articleLang = node.getAttribute("lang"); + } + + var matchString = node.className + " " + node.id; + + if (!this._isProbablyVisible(node)) { + this.log("Removing hidden node - " + matchString); + node = this._removeAndGetNext(node); + continue; + } + + // User is not able to see elements applied with both "aria-modal = true" and "role = dialog" + if (node.getAttribute("aria-modal") == "true" && node.getAttribute("role") == "dialog") { + node = this._removeAndGetNext(node); + continue; + } + + // Check to see if this node is a byline, and remove it if it is. + if (this._checkByline(node, matchString)) { + node = this._removeAndGetNext(node); + continue; + } + + if (shouldRemoveTitleHeader && this._headerDuplicatesTitle(node)) { + this.log("Removing header: ", node.textContent.trim(), this._articleTitle.trim()); + shouldRemoveTitleHeader = false; + node = this._removeAndGetNext(node); + continue; + } + + // Remove unlikely candidates + if (stripUnlikelyCandidates) { + if (this.REGEXPS.unlikelyCandidates.test(matchString) && + !this.REGEXPS.okMaybeItsACandidate.test(matchString) && + !this._hasAncestorTag(node, "table") && + !this._hasAncestorTag(node, "code") && + node.tagName !== "BODY" && + node.tagName !== "A") { + this.log("Removing unlikely candidate - " + matchString); + node = this._removeAndGetNext(node); + continue; + } + + if (this.UNLIKELY_ROLES.includes(node.getAttribute("role"))) { + this.log("Removing content with role " + node.getAttribute("role") + " - " + matchString); + node = this._removeAndGetNext(node); + continue; + } + } + + // Remove DIV, SECTION, and HEADER nodes without any content(e.g. text, image, video, or iframe). + if ((node.tagName === "DIV" || node.tagName === "SECTION" || node.tagName === "HEADER" || + node.tagName === "H1" || node.tagName === "H2" || node.tagName === "H3" || + node.tagName === "H4" || node.tagName === "H5" || node.tagName === "H6") && + this._isElementWithoutContent(node)) { + node = this._removeAndGetNext(node); + continue; + } + + if (this.DEFAULT_TAGS_TO_SCORE.indexOf(node.tagName) !== -1) { + elementsToScore.push(node); + } + + // Turn all divs that don't have children block level elements into p's + if (node.tagName === "DIV") { + // Put phrasing content into paragraphs. + var p = null; + var childNode = node.firstChild; + while (childNode) { + var nextSibling = childNode.nextSibling; + if (this._isPhrasingContent(childNode)) { + if (p !== null) { + p.appendChild(childNode); + } else if (!this._isWhitespace(childNode)) { + p = doc.createElement("p"); + node.replaceChild(p, childNode); + p.appendChild(childNode); + } + } else if (p !== null) { + while (p.lastChild && this._isWhitespace(p.lastChild)) { + p.removeChild(p.lastChild); + } + p = null; + } + childNode = nextSibling; + } + + // Sites like http://mobile.slate.com encloses each paragraph with a DIV + // element. DIVs with only a P element inside and no text content can be + // safely converted into plain P elements to avoid confusing the scoring + // algorithm with DIVs with are, in practice, paragraphs. + if (this._hasSingleTagInsideElement(node, "P") && this._getLinkDensity(node) < 0.25) { + var newNode = node.children[0]; + node.parentNode.replaceChild(newNode, node); + node = newNode; + elementsToScore.push(node); + } else if (!this._hasChildBlockElement(node)) { + node = this._setNodeTag(node, "P"); + elementsToScore.push(node); + } + } + node = this._getNextNode(node); + } + + /** + * Loop through all paragraphs, and assign a score to them based on how content-y they look. + * Then add their score to their parent node. + * + * A score is determined by things like number of commas, class names, etc. Maybe eventually link density. + **/ + var candidates = []; + this._forEachNode(elementsToScore, function(elementToScore) { + if (!elementToScore.parentNode || typeof(elementToScore.parentNode.tagName) === "undefined") + return; + + // If this paragraph is less than 25 characters, don't even count it. + var innerText = this._getInnerText(elementToScore); + if (innerText.length < 25) + return; + + // Exclude nodes with no ancestor. + var ancestors = this._getNodeAncestors(elementToScore, 5); + if (ancestors.length === 0) + return; + + var contentScore = 0; + + // Add a point for the paragraph itself as a base. + contentScore += 1; + + // Add points for any commas within this paragraph. + contentScore += innerText.split(this.REGEXPS.commas).length; + + // For every 100 characters in this paragraph, add another point. Up to 3 points. + contentScore += Math.min(Math.floor(innerText.length / 100), 3); + + // Initialize and score ancestors. + this._forEachNode(ancestors, function(ancestor, level) { + if (!ancestor.tagName || !ancestor.parentNode || typeof(ancestor.parentNode.tagName) === "undefined") + return; + + if (typeof(ancestor.readability) === "undefined") { + this._initializeNode(ancestor); + candidates.push(ancestor); + } + + // Node score divider: + // - parent: 1 (no division) + // - grandparent: 2 + // - great grandparent+: ancestor level * 3 + if (level === 0) + var scoreDivider = 1; + else if (level === 1) + scoreDivider = 2; + else + scoreDivider = level * 3; + ancestor.readability.contentScore += contentScore / scoreDivider; + }); + }); + + // After we've calculated scores, loop through all of the possible + // candidate nodes we found and find the one with the highest score. + var topCandidates = []; + for (var c = 0, cl = candidates.length; c < cl; c += 1) { + var candidate = candidates[c]; + + // Scale the final candidates score based on link density. Good content + // should have a relatively small link density (5% or less) and be mostly + // unaffected by this operation. + var candidateScore = candidate.readability.contentScore * (1 - this._getLinkDensity(candidate)); + candidate.readability.contentScore = candidateScore; + + this.log("Candidate:", candidate, "with score " + candidateScore); + + for (var t = 0; t < this._nbTopCandidates; t++) { + var aTopCandidate = topCandidates[t]; + + if (!aTopCandidate || candidateScore > aTopCandidate.readability.contentScore) { + topCandidates.splice(t, 0, candidate); + if (topCandidates.length > this._nbTopCandidates) + topCandidates.pop(); + break; + } + } + } + + var topCandidate = topCandidates[0] || null; + var neededToCreateTopCandidate = false; + var parentOfTopCandidate; + + // If we still have no top candidate, just use the body as a last resort. + // We also have to copy the body node so it is something we can modify. + if (topCandidate === null || topCandidate.tagName === "BODY") { + // Move all of the page's children into topCandidate + topCandidate = doc.createElement("DIV"); + neededToCreateTopCandidate = true; + // Move everything (not just elements, also text nodes etc.) into the container + // so we even include text directly in the body: + while (page.firstChild) { + this.log("Moving child out:", page.firstChild); + topCandidate.appendChild(page.firstChild); + } + + page.appendChild(topCandidate); + + this._initializeNode(topCandidate); + } else if (topCandidate) { + // Find a better top candidate node if it contains (at least three) nodes which belong to `topCandidates` array + // and whose scores are quite closed with current `topCandidate` node. + var alternativeCandidateAncestors = []; + for (var i = 1; i < topCandidates.length; i++) { + if (topCandidates[i].readability.contentScore / topCandidate.readability.contentScore >= 0.75) { + alternativeCandidateAncestors.push(this._getNodeAncestors(topCandidates[i])); + } + } + var MINIMUM_TOPCANDIDATES = 3; + if (alternativeCandidateAncestors.length >= MINIMUM_TOPCANDIDATES) { + parentOfTopCandidate = topCandidate.parentNode; + while (parentOfTopCandidate.tagName !== "BODY") { + var listsContainingThisAncestor = 0; + for (var ancestorIndex = 0; ancestorIndex < alternativeCandidateAncestors.length && listsContainingThisAncestor < MINIMUM_TOPCANDIDATES; ancestorIndex++) { + listsContainingThisAncestor += Number(alternativeCandidateAncestors[ancestorIndex].includes(parentOfTopCandidate)); + } + if (listsContainingThisAncestor >= MINIMUM_TOPCANDIDATES) { + topCandidate = parentOfTopCandidate; + break; + } + parentOfTopCandidate = parentOfTopCandidate.parentNode; + } + } + if (!topCandidate.readability) { + this._initializeNode(topCandidate); + } + + // Because of our bonus system, parents of candidates might have scores + // themselves. They get half of the node. There won't be nodes with higher + // scores than our topCandidate, but if we see the score going *up* in the first + // few steps up the tree, that's a decent sign that there might be more content + // lurking in other places that we want to unify in. The sibling stuff + // below does some of that - but only if we've looked high enough up the DOM + // tree. + parentOfTopCandidate = topCandidate.parentNode; + var lastScore = topCandidate.readability.contentScore; + // The scores shouldn't get too low. + var scoreThreshold = lastScore / 3; + while (parentOfTopCandidate.tagName !== "BODY") { + if (!parentOfTopCandidate.readability) { + parentOfTopCandidate = parentOfTopCandidate.parentNode; + continue; + } + var parentScore = parentOfTopCandidate.readability.contentScore; + if (parentScore < scoreThreshold) + break; + if (parentScore > lastScore) { + // Alright! We found a better parent to use. + topCandidate = parentOfTopCandidate; + break; + } + lastScore = parentOfTopCandidate.readability.contentScore; + parentOfTopCandidate = parentOfTopCandidate.parentNode; + } + + // If the top candidate is the only child, use parent instead. This will help sibling + // joining logic when adjacent content is actually located in parent's sibling node. + parentOfTopCandidate = topCandidate.parentNode; + while (parentOfTopCandidate.tagName != "BODY" && parentOfTopCandidate.children.length == 1) { + topCandidate = parentOfTopCandidate; + parentOfTopCandidate = topCandidate.parentNode; + } + if (!topCandidate.readability) { + this._initializeNode(topCandidate); + } + } + + // Now that we have the top candidate, look through its siblings for content + // that might also be related. Things like preambles, content split by ads + // that we removed, etc. + var articleContent = doc.createElement("DIV"); + if (isPaging) + articleContent.id = "readability-content"; + + var siblingScoreThreshold = Math.max(10, topCandidate.readability.contentScore * 0.2); + // Keep potential top candidate's parent node to try to get text direction of it later. + parentOfTopCandidate = topCandidate.parentNode; + var siblings = parentOfTopCandidate.children; + + for (var s = 0, sl = siblings.length; s < sl; s++) { + var sibling = siblings[s]; + var append = false; + + this.log("Looking at sibling node:", sibling, sibling.readability ? ("with score " + sibling.readability.contentScore) : ""); + this.log("Sibling has score", sibling.readability ? sibling.readability.contentScore : "Unknown"); + + if (sibling === topCandidate) { + append = true; + } else { + var contentBonus = 0; + + // Give a bonus if sibling nodes and top candidates have the example same classname + if (sibling.className === topCandidate.className && topCandidate.className !== "") + contentBonus += topCandidate.readability.contentScore * 0.2; + + if (sibling.readability && + ((sibling.readability.contentScore + contentBonus) >= siblingScoreThreshold)) { + append = true; + } else if (sibling.nodeName === "P") { + var linkDensity = this._getLinkDensity(sibling); + var nodeContent = this._getInnerText(sibling); + var nodeLength = nodeContent.length; + + if (nodeLength > 80 && linkDensity < 0.25) { + append = true; + } else if (nodeLength < 80 && nodeLength > 0 && linkDensity === 0 && + nodeContent.search(/\.( |$)/) !== -1) { + append = true; + } + } + } + + if (append) { + this.log("Appending node:", sibling); + + if (this.ALTER_TO_DIV_EXCEPTIONS.indexOf(sibling.nodeName) === -1) { + // We have a node that isn't a common block level element, like a form or td tag. + // Turn it into a div so it doesn't get filtered out later by accident. + this.log("Altering sibling:", sibling, "to div."); + + sibling = this._setNodeTag(sibling, "DIV"); + } + + articleContent.appendChild(sibling); + // Fetch children again to make it compatible + // with DOM parsers without live collection support. + siblings = parentOfTopCandidate.children; + // siblings is a reference to the children array, and + // sibling is removed from the array when we call appendChild(). + // As a result, we must revisit this index since the nodes + // have been shifted. + s -= 1; + sl -= 1; + } + } + + if (this._debug) + this.log("Article content pre-prep: " + articleContent.innerHTML); + // So we have all of the content that we need. Now we clean it up for presentation. + this._prepArticle(articleContent); + if (this._debug) + this.log("Article content post-prep: " + articleContent.innerHTML); + + if (neededToCreateTopCandidate) { + // We already created a fake div thing, and there wouldn't have been any siblings left + // for the previous loop, so there's no point trying to create a new div, and then + // move all the children over. Just assign IDs and class names here. No need to append + // because that already happened anyway. + topCandidate.id = "readability-page-1"; + topCandidate.className = "page"; + } else { + var div = doc.createElement("DIV"); + div.id = "readability-page-1"; + div.className = "page"; + while (articleContent.firstChild) { + div.appendChild(articleContent.firstChild); + } + articleContent.appendChild(div); + } + + if (this._debug) + this.log("Article content after paging: " + articleContent.innerHTML); + + var parseSuccessful = true; + + // Now that we've gone through the full algorithm, check to see if + // we got any meaningful content. If we didn't, we may need to re-run + // grabArticle with different flags set. This gives us a higher likelihood of + // finding the content, and the sieve approach gives us a higher likelihood of + // finding the -right- content. + var textLength = this._getInnerText(articleContent, true).length; + if (textLength < this._charThreshold) { + parseSuccessful = false; + page.innerHTML = pageCacheHtml; + + if (this._flagIsActive(this.FLAG_STRIP_UNLIKELYS)) { + this._removeFlag(this.FLAG_STRIP_UNLIKELYS); + this._attempts.push({articleContent: articleContent, textLength: textLength}); + } else if (this._flagIsActive(this.FLAG_WEIGHT_CLASSES)) { + this._removeFlag(this.FLAG_WEIGHT_CLASSES); + this._attempts.push({articleContent: articleContent, textLength: textLength}); + } else if (this._flagIsActive(this.FLAG_CLEAN_CONDITIONALLY)) { + this._removeFlag(this.FLAG_CLEAN_CONDITIONALLY); + this._attempts.push({articleContent: articleContent, textLength: textLength}); + } else { + this._attempts.push({articleContent: articleContent, textLength: textLength}); + // No luck after removing flags, just return the longest text we found during the different loops + this._attempts.sort(function (a, b) { + return b.textLength - a.textLength; + }); + + // But first check if we actually have something + if (!this._attempts[0].textLength) { + return null; + } + + articleContent = this._attempts[0].articleContent; + parseSuccessful = true; + } + } + + if (parseSuccessful) { + // Find out text direction from ancestors of final top candidate. + var ancestors = [parentOfTopCandidate, topCandidate].concat(this._getNodeAncestors(parentOfTopCandidate)); + this._someNode(ancestors, function(ancestor) { + if (!ancestor.tagName) + return false; + var articleDir = ancestor.getAttribute("dir"); + if (articleDir) { + this._articleDir = articleDir; + return true; + } + return false; + }); + return articleContent; + } + } + }, + + /** + * Check whether the input string could be a byline. + * This verifies that the input is a string, and that the length + * is less than 100 chars. + * + * @param possibleByline {string} - a string to check whether its a byline. + * @return Boolean - whether the input string is a byline. + */ + _isValidByline: function(byline) { + if (typeof byline == "string" || byline instanceof String) { + byline = byline.trim(); + return (byline.length > 0) && (byline.length < 100); + } + return false; + }, + + /** + * Converts some of the common HTML entities in string to their corresponding characters. + * + * @param str {string} - a string to unescape. + * @return string without HTML entity. + */ + _unescapeHtmlEntities: function(str) { + if (!str) { + return str; + } + + var htmlEscapeMap = this.HTML_ESCAPE_MAP; + return str.replace(/&(quot|amp|apos|lt|gt);/g, function(_, tag) { + return htmlEscapeMap[tag]; + }).replace(/&#(?:x([0-9a-z]{1,4})|([0-9]{1,4}));/gi, function(_, hex, numStr) { + var num = parseInt(hex || numStr, hex ? 16 : 10); + return String.fromCharCode(num); + }); + }, + + /** + * Try to extract metadata from JSON-LD object. + * For now, only Schema.org objects of type Article or its subtypes are supported. + * @return Object with any metadata that could be extracted (possibly none) + */ + _getJSONLD: function (doc) { + var scripts = this._getAllNodesWithTag(doc, ["script"]); + + var metadata; + + this._forEachNode(scripts, function(jsonLdElement) { + if (!metadata && jsonLdElement.getAttribute("type") === "application/ld+json") { + try { + // Strip CDATA markers if present + var content = jsonLdElement.textContent.replace(/^\s*\s*$/g, ""); + var parsed = JSON.parse(content); + if ( + !parsed["@context"] || + !parsed["@context"].match(/^https?\:\/\/schema\.org$/) + ) { + return; + } + + if (!parsed["@type"] && Array.isArray(parsed["@graph"])) { + parsed = parsed["@graph"].find(function(it) { + return (it["@type"] || "").match( + this.REGEXPS.jsonLdArticleTypes + ); + }); + } + + if ( + !parsed || + !parsed["@type"] || + !parsed["@type"].match(this.REGEXPS.jsonLdArticleTypes) + ) { + return; + } + + metadata = {}; + + if (typeof parsed.name === "string" && typeof parsed.headline === "string" && parsed.name !== parsed.headline) { + // we have both name and headline element in the JSON-LD. They should both be the same but some websites like aktualne.cz + // put their own name into "name" and the article title to "headline" which confuses Readability. So we try to check if either + // "name" or "headline" closely matches the html title, and if so, use that one. If not, then we use "name" by default. + + var title = this._getArticleTitle(); + var nameMatches = this._textSimilarity(parsed.name, title) > 0.75; + var headlineMatches = this._textSimilarity(parsed.headline, title) > 0.75; + + if (headlineMatches && !nameMatches) { + metadata.title = parsed.headline; + } else { + metadata.title = parsed.name; + } + } else if (typeof parsed.name === "string") { + metadata.title = parsed.name.trim(); + } else if (typeof parsed.headline === "string") { + metadata.title = parsed.headline.trim(); + } + if (parsed.author) { + if (typeof parsed.author.name === "string") { + metadata.byline = parsed.author.name.trim(); + } else if (Array.isArray(parsed.author) && parsed.author[0] && typeof parsed.author[0].name === "string") { + metadata.byline = parsed.author + .filter(function(author) { + return author && typeof author.name === "string"; + }) + .map(function(author) { + return author.name.trim(); + }) + .join(", "); + } + } + if (typeof parsed.description === "string") { + metadata.excerpt = parsed.description.trim(); + } + if ( + parsed.publisher && + typeof parsed.publisher.name === "string" + ) { + metadata.siteName = parsed.publisher.name.trim(); + } + if (typeof parsed.datePublished === "string") { + metadata.datePublished = parsed.datePublished.trim(); + } + return; + } catch (err) { + this.log(err.message); + } + } + }); + return metadata ? metadata : {}; + }, + + /** + * Attempts to get excerpt and byline metadata for the article. + * + * @param {Object} jsonld — object containing any metadata that + * could be extracted from JSON-LD object. + * + * @return Object with optional "excerpt" and "byline" properties + */ + _getArticleMetadata: function(jsonld) { + var metadata = {}; + var values = {}; + var metaElements = this._doc.getElementsByTagName("meta"); + + // property is a space-separated list of values + var propertyPattern = /\s*(article|dc|dcterm|og|twitter)\s*:\s*(author|creator|description|published_time|title|site_name)\s*/gi; + + // name is a single value + var namePattern = /^\s*(?:(dc|dcterm|og|twitter|weibo:(article|webpage))\s*[\.:]\s*)?(author|creator|description|title|site_name)\s*$/i; + + // Find description tags. + this._forEachNode(metaElements, function(element) { + var elementName = element.getAttribute("name"); + var elementProperty = element.getAttribute("property"); + var content = element.getAttribute("content"); + if (!content) { + return; + } + var matches = null; + var name = null; + + if (elementProperty) { + matches = elementProperty.match(propertyPattern); + if (matches) { + // Convert to lowercase, and remove any whitespace + // so we can match below. + name = matches[0].toLowerCase().replace(/\s/g, ""); + // multiple authors + values[name] = content.trim(); + } + } + if (!matches && elementName && namePattern.test(elementName)) { + name = elementName; + if (content) { + // Convert to lowercase, remove any whitespace, and convert dots + // to colons so we can match below. + name = name.toLowerCase().replace(/\s/g, "").replace(/\./g, ":"); + values[name] = content.trim(); + } + } + }); + + // get title + metadata.title = jsonld.title || + values["dc:title"] || + values["dcterm:title"] || + values["og:title"] || + values["weibo:article:title"] || + values["weibo:webpage:title"] || + values["title"] || + values["twitter:title"]; + + if (!metadata.title) { + metadata.title = this._getArticleTitle(); + } + + // get author + metadata.byline = jsonld.byline || + values["dc:creator"] || + values["dcterm:creator"] || + values["author"]; + + // get description + metadata.excerpt = jsonld.excerpt || + values["dc:description"] || + values["dcterm:description"] || + values["og:description"] || + values["weibo:article:description"] || + values["weibo:webpage:description"] || + values["description"] || + values["twitter:description"]; + + // get site name + metadata.siteName = jsonld.siteName || + values["og:site_name"]; + + // get article published time + metadata.publishedTime = jsonld.datePublished || + values["article:published_time"] || null; + + // in many sites the meta value is escaped with HTML entities, + // so here we need to unescape it + metadata.title = this._unescapeHtmlEntities(metadata.title); + metadata.byline = this._unescapeHtmlEntities(metadata.byline); + metadata.excerpt = this._unescapeHtmlEntities(metadata.excerpt); + metadata.siteName = this._unescapeHtmlEntities(metadata.siteName); + metadata.publishedTime = this._unescapeHtmlEntities(metadata.publishedTime); + + return metadata; + }, + + /** + * Check if node is image, or if node contains exactly only one image + * whether as a direct child or as its descendants. + * + * @param Element + **/ + _isSingleImage: function(node) { + if (node.tagName === "IMG") { + return true; + } + + if (node.children.length !== 1 || node.textContent.trim() !== "") { + return false; + } + + return this._isSingleImage(node.children[0]); + }, + + /** + * Find all