diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 04c01ba..0000000 --- a/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -dist/ \ No newline at end of file diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index dfe0770..0000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto diff --git a/.gitignore b/.gitignore index ec6cb9f..f149e38 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,10 @@ -!.gitkeep - tmp/ src/tmp node_modules/ obj/ -out/ \ No newline at end of file +out/ + +!.gitkeep + diff --git a/v5/404.html b/404.html similarity index 97% rename from v5/404.html rename to 404.html index e8e7f56..db28de9 100644 --- a/v5/404.html +++ b/404.html @@ -20,7 +20,7 @@ - + diff --git a/_static/.well-known/keybase.txt b/_static/.well-known/keybase.txt deleted file mode 100644 index 5451dc0..0000000 --- a/_static/.well-known/keybase.txt +++ /dev/null @@ -1,68 +0,0 @@ -================================================================== -https://keybase.io/wessel_tip --------------------------------------------------------------------- - -I hereby claim: - - * I am an admin of https://wessel.gg - * I am wessel_tip (https://keybase.io/wessel_tip) on keybase. - * I have a public key with fingerprint 46ED 4E83 7580 D2E8 0D65 6D62 8E67 9DC5 B88F 3FF8 - -To do so, I am signing this object: - -{ - "body": { - "key": { - "eldest_kid": "0101bc79e213576070dd479bba0b6c1435875a62c863b7879efa752443596c1cfa510a", - "fingerprint": "46ed4e837580d2e80d656d628e679dc5b88f3ff8", - "host": "keybase.io", - "key_id": "8e679dc5b88f3ff8", - "kid": "0101bc79e213576070dd479bba0b6c1435875a62c863b7879efa752443596c1cfa510a", - "uid": "30ed2370c46451bc86aae72e43de0719", - "username": "wessel_tip" - }, - "service": { - "hostname": "wessel.gg", - "protocol": "https:" - }, - "type": "web_service_binding", - "version": 1 - }, - "ctime": 1673997443, - "expire_in": 157680000, - "prev": "d2b02a2cd3753192cc91dfa053e55073fe32371e65ced7334a2be2a4c49e6084", - "seqno": 68, - "tag": "signature" -} - -which yields the signature: - ------BEGIN PGP MESSAGE----- -Version: Keybase OpenPGP v2.1.13 -Comment: https://keybase.io/crypto - -yMIoAnicrVJbSBRRGN5VM1RKizAqJZgULy029zOzJlhJYYZdibBgmcuZ3Und2XbG -bXU1y25kBplIFpYUhBqZ9mDEZmEiSJYWRIVoSyihL/qShrKgnbF6CHrsPJzD+f/v -+873/Zz+VZGWWGvW2MWc562Kz/rm1c0yizRgOx/ARE0ux+wBrBguH7BEhrrhKFZl -zI7hBE6IEuAhSVAMYHGAyzINeFEUcJGVCJpiOMAILClxLCUCDgEVATAkjRo86kuK -wBC4gNkwRXU7odfjVd0GkqVZKNOQowDD4TIJ0cYyrMySHGQBL0uMyHEKpSgcIro0 -3WQgc6KgwyxVQzV0cSzb+wf+P/suW5ajcCiTFMAlmqUZJMyxggABCWlKhjggeBOo -Q69bKIUIfRrqOixxGKoHq7JhqO5TJWiO1szyFybL6URUj1czNEkrQWWXYXh0u0kz -yj2/cKLjt4JDVN0yGiNi+KBXVzU3ZicQUjJUU5JgAcXzAEWwYdDvUb3QoZoIFJ/D -0TLfgT4kKZMiTgqkJKPxUwRPShJPyIqAMxRkGBxQCqRQVgKyjARlQFG0QIqQFGiJ -5iGLczRmZjrl1jA7yyGfghNp6qrTLRhlXohV9fWeiLJYYy3RKyLM/2WJjUn48+t6 -a1cuVebPvsg+UzP9/fXXwKEHOcG0dZ+bkoMV8YvF3e/p63TpkK81vi80k7q/O72j -ayjOMuW70Nm699lotT9pqXFNQk9noK7r2L3sw2vDtcH5/EfNN/p3xbVf7cpYGJuI -Gj64raUw3DG5JX7y9lz1YsHLgYqtbY0joTz//Yyi7T3FYy3W7tTc9QWXPzS7mhL9 -9RtHr+XMvRseONqWtzv3nGs2fbxqavxK4qXonTH9Pyo51+B8zcj408WuIj7cvm9m -dbV0oOFtQ4r2bYIcPO6403wLUKFwWs2TzNBJV2FoesPjyuSlzHBdZLC2oiBhx6fI -s0kLmQ8H6z/eHYrYMz2Q8qXQt3nTkZ+adEfS -=8YHS ------END PGP MESSAGE----- - -And finally, I am proving ownership of this host by posting or -appending to this document. - -View my publicly-auditable identity here: https://keybase.io/wessel_tip - -================================================================== diff --git a/index.html b/index.html new file mode 100644 index 0000000..218daf9 --- /dev/null +++ b/index.html @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wessel Tip + + +
+ +
+
+ +
+
+
+ logo +
+
+

Wessel Tip

+

Developer, Photographer

+

+

I'm Wessel, a ?? year old self-taught software engineer with ?+ years of experience.
+ I like to listen to a lot of music and participate in some photography when I feel like it.

+

I am currently studying computer engineering at the Inholland University of Applied Sciences in Alkmaar and have a Cambridge English Level 2 Certficate in ESOL International.

+

A lot of my work is closed source or unfinished, but the ones that are open sourced can be found on my GitHub. + Feel free to send an e-mail to contact@wessel.gg for any inquiries, whether it be about development or photography.
+

+
+
+ +
+
+

Proficiency

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

Experience

+
+
+
Mue
+
Fast, open and free-to-use new tab page for modern browsers.
+
EVE
+
EVE is a latent text-to-image diffusion model initialized on the weights of the Stable Diffusion-v1-5 checkpoint and furthur trained on the LAION 5B dataset which can be interacted with in the form of a chatbot on Discord.
+
Snowflakey
+
A snowflake (user identifier) and token (user credential) generator, written in TypeScript.
+
(DISCONTINUED) QTRadio
+
An online continuous radio streaming service with dekstop app and web interface.
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/_static/manifest.webmanifest b/manifest.webmanifest similarity index 100% rename from _static/manifest.webmanifest rename to manifest.webmanifest diff --git a/_static/robots.txt b/robots.txt similarity index 100% rename from _static/robots.txt rename to robots.txt diff --git a/v5/static/css/404.css b/static/css/404.css similarity index 100% rename from v5/static/css/404.css rename to static/css/404.css diff --git a/v5/static/css/404.css.map b/static/css/404.css.map similarity index 100% rename from v5/static/css/404.css.map rename to static/css/404.css.map diff --git a/static/css/autoindex.css b/static/css/autoindex.css new file mode 100644 index 0000000..1974474 --- /dev/null +++ b/static/css/autoindex.css @@ -0,0 +1 @@ +body{font-family:Roboto}/*# sourceMappingURL=autoindex.css.map */ diff --git a/static/css/autoindex.css.map b/static/css/autoindex.css.map new file mode 100644 index 0000000..4e5b84f --- /dev/null +++ b/static/css/autoindex.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../scss/autoindex.scss"],"names":[],"mappings":"AAAA,KACE","file":"autoindex.css"} \ No newline at end of file diff --git a/static/css/devicon.min.css b/static/css/devicon.min.css new file mode 100644 index 0000000..7e75028 --- /dev/null +++ b/static/css/devicon.min.css @@ -0,0 +1 @@ +@font-face{font-family:"devicon";src:url("../font/devicon.ttf?iehcku") format("truetype"),url("../font/devicon.woff?iehcku") format("woff"),url("../font/devicon.svg?iehcku#devicon") format("svg");font-weight:normal;font-style:normal;font-display:block}[class^=devicon-],[class*=" devicon-"]{font-family:"devicon" !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.devicon-aarch64-line:before,.devicon-aarch64-line-wordmark:before{content:""}.devicon-aarch64-plain:before,.devicon-aarch64-plain-wordmark:before{content:""}.devicon-adonisjs-original:before,.devicon-adonisjs-plain:before{content:""}.devicon-adonisjs-original-wordmark:before,.devicon-adonisjs-plain-wordmark:before{content:""}.devicon-aftereffects-plain:before{content:""}.devicon-akka-plain:before{content:""}.devicon-akka-plain-wordmark:before{content:""}.devicon-algolia-original:before{content:""}.devicon-algolia-original-wordmark:before{content:""}.devicon-alpinejs-original:before,.devicon-alpinejs-plain:before{content:""}.devicon-alpinejs-original-wordmark:before,.devicon-alpinejs-plain-wordmark:before{content:""}.devicon-amazonwebservices-line-wordmark:before,.devicon-amazonwebservices-line:before{content:""}.devicon-amazonwebservices-plain-wordmark:before,.devicon-amazonwebservices-plain:before{content:""}.devicon-anaconda-original:before,.devicon-anaconda-plain:before{content:""}.devicon-anaconda-original-wordmark:before,.devicon-anaconda-plain-wordmark:before{content:""}.devicon-android-plain:before{content:""}.devicon-android-plain-wordmark:before{content:""}.devicon-androidstudio-plain:before{content:""}.devicon-androidstudio-plain-wordmark:before{content:""}.devicon-angularjs-plain:before{content:""}.devicon-angularjs-plain-wordmark:before{content:""}.devicon-angularmaterial-plain:before{content:""}.devicon-angular-plain:before{content:""}.devicon-angular-plain-wordmark:before{content:""}.devicon-ansible-plain:before{content:""}.devicon-ansible-plain-wordmark:before{content:""}.devicon-antdesign-plain:before{content:""}.devicon-antdesign-plain-wordmark:before{content:""}.devicon-apacheairflow-plain:before{content:""}.devicon-apacheairflow-plain-wordmark:before{content:""}.devicon-apachekafka-original:before,.devicon-apachekafka-plain:before{content:""}.devicon-apachekafka-original-wordmark:before,.devicon-apachekafka-plain-wordmark:before{content:""}.devicon-apache-line:before{content:""}.devicon-apache-line-wordmark:before{content:""}.devicon-apache-plain:before{content:""}.devicon-apache-plain-wordmark:before{content:""}.devicon-apachespark-original:before,.devicon-apachespark-plain:before{content:""}.devicon-apachespark-plain-wordmark:before{content:""}.devicon-apl-plain:before{content:""}.devicon-appcelerator-original:before,.devicon-appcelerator-plain:before{content:""}.devicon-appcelerator-plain-wordmark:before{content:""}.devicon-apple-original:before,.devicon-apple-plain:before{content:""}.devicon-appwrite-plain:before,.devicon-appwrite-original:before{content:""}.devicon-appwrite-plain-wordmark:before,.devicon-appwrite-original-wordmark:before{content:""}.devicon-archlinux-plain:before{content:""}.devicon-archlinux-plain-wordmark:before{content:""}.devicon-arduino-plain:before{content:""}.devicon-arduino-plain-wordmark:before{content:""}.devicon-argocd-plain:before{content:""}.devicon-argocd-plain-wordmark:before{content:""}.devicon-astro-plain:before{content:""}.devicon-astro-plain-wordmark:before{content:""}.devicon-atom-original:before,.devicon-atom-plain:before{content:""}.devicon-atom-original-wordmark:before,.devicon-atom-plain-wordmark:before{content:""}.devicon-awk-plain-wordmark:before,.devicon-awk-plain:before{content:""}.devicon-axios-plain:before{content:""}.devicon-axios-plain-wordmark:before{content:""}.devicon-azuredevops-plain:before{content:""}.devicon-azure-plain:before{content:""}.devicon-azure-plain-wordmark:before{content:""}.devicon-azuresqldatabase-plain:before{content:""}.devicon-babel-plain:before,.devicon-babel-original:before{content:""}.devicon-backbonejs-plain:before{content:""}.devicon-backbonejs-plain-wordmark:before{content:""}.devicon-ballerina-line:before{content:""}.devicon-ballerina-line-wordmark:before{content:""}.devicon-ballerina-original:before,.devicon-ballerina-plain:before{content:""}.devicon-ballerina-original-wordmark:before,.devicon-ballerina-plain-wordmark:before{content:""}.devicon-bamboo-original:before,.devicon-bamboo-plain:before{content:""}.devicon-bamboo-original-wordmark:before,.devicon-bamboo-plain-wordmark:before{content:""}.devicon-bash-plain:before{content:""}.devicon-beats-plain:before{content:""}.devicon-behance-plain:before{content:""}.devicon-behance-plain-wordmark:before{content:""}.devicon-bitbucket-original:before,.devicon-bitbucket-plain:before{content:""}.devicon-bitbucket-original-wordmark:before,.devicon-bitbucket-plain-wordmark:before{content:""}.devicon-blazor-line:before{content:""}.devicon-blazor-original:before,.devicon-blazor-plain:before{content:""}.devicon-blender-original:before{content:""}.devicon-blender-original-wordmark:before{content:""}.devicon-bootstrap-plain:before{content:""}.devicon-bootstrap-plain-wordmark:before{content:""}.devicon-bower-line:before{content:""}.devicon-bower-line-wordmark:before{content:""}.devicon-bower-plain:before{content:""}.devicon-bower-plain-wordmark:before{content:""}.devicon-browserstack-line:before{content:""}.devicon-browserstack-line-wordmark:before{content:""}.devicon-browserstack-plain:before{content:""}.devicon-browserstack-plain-wordmark:before{content:""}.devicon-bulma-plain:before{content:""}.devicon-bun-line:before{content:""}.devicon-bun-plain:before{content:""}.devicon-cairo-plain:before{content:""}.devicon-cairo-plain-wordmark:before{content:""}.devicon-cakephp-plain:before{content:""}.devicon-cakephp-plain-wordmark:before{content:""}.devicon-canva-original:before,.devicon-canva-plain:before{content:""}.devicon-capacitor-plain:before{content:""}.devicon-capacitor-plain-wordmark:before{content:""}.devicon-carbon-original:before,.devicon-carbon-plain:before{content:""}.devicon-cassandra-plain:before{content:""}.devicon-cassandra-plain-wordmark:before{content:""}.devicon-centos-plain:before{content:""}.devicon-centos-plain-wordmark:before{content:""}.devicon-ceylon-plain:before{content:""}.devicon-ceylon-plain-wordmark:before{content:""}.devicon-chrome-plain:before{content:""}.devicon-chrome-plain-wordmark:before{content:""}.devicon-circleci-plain:before{content:""}.devicon-circleci-plain-wordmark:before{content:""}.devicon-clarity-plain:before{content:""}.devicon-clarity-plain-wordmark:before{content:""}.devicon-c-line:before,.devicon-c-line-wordmark:before{content:""}.devicon-clion-plain:before{content:""}.devicon-clion-plain-wordmark:before{content:""}.devicon-clojure-line:before,.devicon-clojure-plain:before{content:""}.devicon-clojurescript-plain:before{content:""}.devicon-cloudflare-plain:before{content:""}.devicon-cloudflare-plain-wordmark:before{content:""}.devicon-cloudflareworkers-plain:before{content:""}.devicon-cloudflareworkers-plain-wordmark:before{content:""}.devicon-cmake-plain:before{content:""}.devicon-cmake-plain-wordmark:before{content:""}.devicon-codeac-original:before{content:""}.devicon-codecov-plain:before{content:""}.devicon-codeigniter-plain:before{content:""}.devicon-codeigniter-plain-wordmark:before{content:""}.devicon-codepen-line:before{content:""}.devicon-codepen-line-wordmark:before{content:""}.devicon-codepen-original:before,.devicon-codepen-plain:before{content:""}.devicon-codepen-original-wordmark:before,.devicon-codepen-plain-wordmark:before{content:""}.devicon-coffeescript-original:before,.devicon-coffeescript-plain:before{content:""}.devicon-coffeescript-original-wordmark:before,.devicon-coffeescript-plain-wordmark:before{content:""}.devicon-composer-line:before,.devicon-composer-plain:before{content:""}.devicon-composer-line-wordmark:before,.devicon-composer-plain-wordmark:before{content:""}.devicon-confluence-line:before{content:""}.devicon-confluence-line-wordmark:before{content:""}.devicon-confluence-plain:before{content:""}.devicon-confluence-plain-wordmark:before{content:""}.devicon-consul-original:before,.devicon-consul-plain:before{content:""}.devicon-consul-plain-wordmark:before{content:""}.devicon-contao-original:before{content:""}.devicon-contao-original-wordmark:before{content:""}.devicon-corejs-original:before,.devicon-corejs-plain:before{content:""}.devicon-corejs-original-wordmark:before,.devicon-corejs-plain-wordmark:before{content:""}.devicon-cosmosdb-plain:before{content:""}.devicon-cosmosdb-plain-wordmark:before{content:""}.devicon-couchbase-original:before,.devicon-couchbase-plain:before{content:""}.devicon-couchbase-plain-wordmark:before{content:""}.devicon-couchdb-plain:before{content:""}.devicon-couchdb-plain-wordmark:before{content:""}.devicon-c-plain:before,.devicon-c-plain-wordmark:before{content:""}.devicon-cplusplus-line:before,.devicon-cplusplus-line-wordmark:before{content:""}.devicon-cplusplus-plain:before,.devicon-cplusplus-plain-wordmark:before{content:""}.devicon-crystal-line:before{content:""}.devicon-crystal-line-wordmark:before{content:""}.devicon-crystal-original:before,.devicon-crystal-plain:before{content:""}.devicon-crystal-original-wordmark:before,.devicon-crystal-plain-wordmark:before{content:""}.devicon-csharp-line:before,.devicon-csharp-line-wordmark:before{content:""}.devicon-csharp-plain:before,.devicon-csharp-plain-wordmark:before{content:""}.devicon-css3-plain:before{content:""}.devicon-css3-plain-wordmark:before{content:""}.devicon-cucumber-plain:before{content:""}.devicon-cucumber-plain-wordmark:before{content:""}.devicon-cypressio-line:before{content:""}.devicon-cypressio-line-wordmark:before{content:""}.devicon-cypressio-plain:before{content:""}.devicon-cypressio-plain-wordmark:before{content:""}.devicon-d3js-plain:before{content:""}.devicon-dart-plain:before{content:""}.devicon-dart-plain-wordmark:before{content:""}.devicon-datagrip-plain:before{content:""}.devicon-datagrip-plain-wordmark:before{content:""}.devicon-dataspell-plain:before{content:""}.devicon-dataspell-plain-wordmark:before{content:""}.devicon-dbeaver-plain:before{content:""}.devicon-debian-plain:before{content:""}.devicon-debian-plain-wordmark:before{content:""}.devicon-denojs-original:before,.devicon-denojs-plain:before{content:""}.devicon-denojs-original-wordmark:before,.devicon-denojs-plain-wordmark:before{content:""}.devicon-devicon-line:before{content:""}.devicon-devicon-line-wordmark:before{content:""}.devicon-devicon-plain:before{content:""}.devicon-devicon-plain-wordmark:before{content:""}.devicon-digitalocean-original:before,.devicon-digitalocean-plain:before{content:""}.devicon-digitalocean-original-wordmark:before,.devicon-digitalocean-plain-wordmark:before{content:""}.devicon-discordjs-plain:before{content:""}.devicon-discordjs-plain-wordmark:before{content:""}.devicon-django-plain:before{content:""}.devicon-django-plain-wordmark:before{content:""}.devicon-djangorest-line:before{content:""}.devicon-djangorest-line-wordmark:before{content:""}.devicon-djangorest-plain:before{content:""}.devicon-djangorest-plain-wordmark:before{content:""}.devicon-docker-plain:before{content:""}.devicon-docker-plain-wordmark:before{content:""}.devicon-doctrine-line:before{content:""}.devicon-doctrine-line-wordmark:before{content:""}.devicon-doctrine-plain:before{content:""}.devicon-doctrine-plain-wordmark:before{content:""}.devicon-dotnetcore-plain:before{content:""}.devicon-dot-net-plain:before{content:""}.devicon-dot-net-plain-wordmark:before{content:""}.devicon-dreamweaver-line:before{content:""}.devicon-dreamweaver-plain:before{content:""}.devicon-dropwizard-plain:before{content:""}.devicon-drupal-plain:before{content:""}.devicon-drupal-plain-wordmark:before{content:""}.devicon-dynamodb-plain:before{content:""}.devicon-eclipse-plain:before{content:""}.devicon-eclipse-plain-wordmark:before{content:""}.devicon-ecto-original:before,.devicon-ecto-plain:before{content:""}.devicon-ecto-plain-wordmark:before{content:""}.devicon-elasticsearch-plain:before{content:""}.devicon-elasticsearch-plain-wordmark:before{content:""}.devicon-electron-original:before{content:""}.devicon-electron-original-wordmark:before{content:""}.devicon-eleventy-plain:before{content:""}.devicon-elixir-plain:before{content:""}.devicon-elixir-plain-wordmark:before{content:""}.devicon-elm-plain:before{content:""}.devicon-elm-plain-wordmark:before{content:""}.devicon-emacs-original:before{content:""}.devicon-embeddedc-plain:before{content:""}.devicon-embeddedc-plain-wordmark:before{content:""}.devicon-ember-original-wordmark:before,.devicon-ember-plain-wordmark:before{content:""}.devicon-ember-plain:before{content:""}.devicon-envoy-plain:before{content:""}.devicon-envoy-plain-wordmark:before{content:""}.devicon-erlang-plain:before{content:""}.devicon-erlang-plain-wordmark:before{content:""}.devicon-eslint-line:before{content:""}.devicon-eslint-line-wordmark:before{content:""}.devicon-eslint-plain:before{content:""}.devicon-eslint-plain-wordmark:before{content:""}.devicon-express-original:before{content:""}.devicon-express-original-wordmark:before{content:""}.devicon-facebook-plain:before,.devicon-facebook-original:before{content:""}.devicon-fastapi-plain:before{content:""}.devicon-fastapi-plain-wordmark:before{content:""}.devicon-fastify-plain:before{content:""}.devicon-fastify-plain-wordmark:before{content:""}.devicon-faunadb-line:before{content:""}.devicon-faunadb-line-wordmark:before{content:""}.devicon-faunadb-original:before,.devicon-faunadb-plain:before{content:""}.devicon-faunadb-original-wordmark:before,.devicon-faunadb-plain-wordmark:before{content:""}.devicon-feathersjs-original:before{content:""}.devicon-fedora-plain:before{content:""}.devicon-figma-plain:before{content:""}.devicon-filezilla-line:before{content:""}.devicon-filezilla-line-wordmark:before{content:""}.devicon-filezilla-plain:before{content:""}.devicon-filezilla-plain-wordmark:before{content:""}.devicon-firebase-line:before{content:""}.devicon-firebase-line-wordmark:before{content:""}.devicon-firebase-plain:before{content:""}.devicon-firebase-plain-wordmark:before{content:""}.devicon-firefox-plain:before{content:""}.devicon-firefox-plain-wordmark:before{content:""}.devicon-flask-original:before,.devicon-flask-plain:before{content:""}.devicon-flask-original-wordmark:before,.devicon-flask-plain-wordmark:before{content:""}.devicon-flutter-plain:before{content:""}.devicon-fortran-original:before{content:""}.devicon-foundation-plain:before{content:""}.devicon-foundation-plain-wordmark:before{content:""}.devicon-framermotion-original:before,.devicon-framermotion-plain:before{content:""}.devicon-framermotion-original-wordmark:before,.devicon-framermotion-plain-wordmark:before{content:""}.devicon-framework7-original:before,.devicon-framework7-plain:before{content:""}.devicon-framework7-original-wordmark:before,.devicon-framework7-plain-wordmark:before{content:""}.devicon-fsharp-plain:before{content:""}.devicon-gatling-line:before{content:""}.devicon-gatling-line-wordmark:before{content:""}.devicon-gatling-original:before,.devicon-gatling-plain:before{content:""}.devicon-gatling-plain-wordmark:before{content:""}.devicon-gatsby-original:before,.devicon-gatsby-plain:before{content:""}.devicon-gatsby-plain-wordmark:before{content:""}.devicon-gazebo-plain:before{content:""}.devicon-gazebo-plain-wordmark:before{content:""}.devicon-gcc-line:before,.devicon-gcc-line-wordmark:before{content:""}.devicon-gcc-plain:before,.devicon-gcc-plain-wordmark:before{content:""}.devicon-gentoo-line:before{content:""}.devicon-gentoo-line-wordmark:before{content:""}.devicon-gentoo-plain:before{content:""}.devicon-gentoo-plain-wordmark:before{content:""}.devicon-ghost-original:before{content:""}.devicon-ghost-original-wordmark:before{content:""}.devicon-gimp-line:before{content:""}.devicon-gimp-line-wordmark:before{content:""}.devicon-gimp-plain:before{content:""}.devicon-gimp-plain-wordmark:before{content:""}.devicon-gitbook-line:before{content:""}.devicon-gitbook-line-wordmark:before{content:""}.devicon-gitbook-original:before,.devicon-gitbook-plain:before{content:""}.devicon-gitbook-original-wordmark:before,.devicon-gitbook-plain-wordmark:before{content:""}.devicon-githubactions-plain:before{content:""}.devicon-githubcodespaces-plain:before{content:""}.devicon-github-original:before,.devicon-github-plain:before{content:""}.devicon-github-original-wordmark:before{content:""}.devicon-gitlab-plain:before{content:""}.devicon-gitlab-plain-wordmark:before{content:""}.devicon-git-plain:before{content:""}.devicon-git-plain-wordmark:before{content:""}.devicon-gitpod-plain:before{content:""}.devicon-gitpod-plain-wordmark:before{content:""}.devicon-gitter-plain:before{content:""}.devicon-gitter-plain-wordmark:before{content:""}.devicon-godot-plain:before{content:""}.devicon-godot-plain-wordmark:before{content:""}.devicon-goland-plain:before{content:""}.devicon-goland-plain-wordmark:before{content:""}.devicon-go-line:before{content:""}.devicon-googlecloud-plain:before{content:""}.devicon-googlecloud-plain-wordmark:before{content:""}.devicon-google-plain:before,.devicon-google-original:before{content:""}.devicon-google-plain-wordmark:before,.devicon-google-original-wordmark:before{content:""}.devicon-go-original-wordmark:before,.devicon-go-plain-wordmark:before{content:""}.devicon-go-plain:before{content:""}.devicon-gradle-original:before,.devicon-gradle-plain:before{content:""}.devicon-gradle-original-wordmark:before,.devicon-gradle-plain-wordmark:before{content:""}.devicon-grafana-line:before{content:""}.devicon-grafana-line-wordmark:before{content:""}.devicon-grafana-plain:before{content:""}.devicon-grafana-plain-wordmark:before{content:""}.devicon-grails-plain:before{content:""}.devicon-graphql-plain:before{content:""}.devicon-graphql-plain-wordmark:before{content:""}.devicon-groovy-plain:before{content:""}.devicon-grpc-plain:before{content:""}.devicon-grunt-line:before{content:""}.devicon-grunt-line-wordmark:before{content:""}.devicon-grunt-plain:before{content:""}.devicon-grunt-plain-wordmark:before{content:""}.devicon-gulp-plain:before{content:""}.devicon-hadoop-plain:before,.devicon-hadoop-line:before{content:""}.devicon-hadoop-plain-wordmark:before,.devicon-hadoop-line-wordmark:before{content:""}.devicon-handlebars-line:before{content:""}.devicon-handlebars-line-wordmark:before{content:""}.devicon-handlebars-original:before,.devicon-handlebars-plain:before{content:""}.devicon-handlebars-original-wordmark:before,.devicon-handlebars-plain-wordmark:before{content:""}.devicon-hardhat-plain:before{content:""}.devicon-hardhat-plain-wordmark:before{content:""}.devicon-harvester-original:before,.devicon-harvester-plain:before{content:""}.devicon-harvester-plain-wordmark:before{content:""}.devicon-haskell-plain:before{content:""}.devicon-haskell-plain-wordmark:before{content:""}.devicon-haxe-plain:before{content:""}.devicon-helm-line:before{content:""}.devicon-helm-original:before,.devicon-helm-plain:before{content:""}.devicon-heroku-original:before,.devicon-heroku-line:before{content:""}.devicon-heroku-original-wordmark:before,.devicon-heroku-line-wordmark:before{content:""}.devicon-heroku-plain:before{content:""}.devicon-heroku-plain-wordmark:before{content:""}.devicon-hibernate-plain:before{content:""}.devicon-hibernate-plain-wordmark:before{content:""}.devicon-homebrew-line:before{content:""}.devicon-homebrew-line-wordmark:before{content:""}.devicon-homebrew-plain:before{content:""}.devicon-homebrew-plain-wordmark:before{content:""}.devicon-html5-plain:before{content:""}.devicon-html5-plain-wordmark:before{content:""}.devicon-hugo-plain:before{content:""}.devicon-hugo-plain-wordmark:before{content:""}.devicon-ie10-original:before,.devicon-ie10-plain:before{content:""}.devicon-ifttt-original:before,.devicon-ifttt-plain:before{content:""}.devicon-illustrator-line:before{content:""}.devicon-illustrator-plain:before{content:""}.devicon-influxdb-original:before,.devicon-influxdb-plain:before{content:""}.devicon-influxdb-original-wordmark:before,.devicon-influxdb-plain-wordmark:before{content:""}.devicon-inkscape-plain:before{content:""}.devicon-inkscape-plain-wordmark:before{content:""}.devicon-insomnia-plain:before{content:""}.devicon-insomnia-plain-wordmark:before{content:""}.devicon-intellij-plain:before{content:""}.devicon-intellij-plain-wordmark:before{content:""}.devicon-ionic-original:before{content:""}.devicon-ionic-original-wordmark:before{content:""}.devicon-jaegertracing-plain:before{content:""}.devicon-jaegertracing-plain-wordmark:before{content:""}.devicon-jamstack-original:before,.devicon-jamstack-plain:before{content:""}.devicon-jamstack-plain-wordmark:before{content:""}.devicon-jasmine-original:before,.devicon-jasmine-plain:before{content:""}.devicon-jasmine-original-wordmark:before,.devicon-jasmine-plain-wordmark:before{content:""}.devicon-java-plain:before{content:""}.devicon-java-plain-wordmark:before{content:""}.devicon-javascript-plain:before{content:""}.devicon-jeet-plain:before{content:""}.devicon-jeet-plain-wordmark:before{content:""}.devicon-jekyll-plain:before{content:""}.devicon-jekyll-plain-wordmark:before{content:""}.devicon-jenkins-line:before{content:""}.devicon-jenkins-plain:before{content:""}.devicon-jest-plain:before{content:""}.devicon-jetbrains-plain:before{content:""}.devicon-jetpackcompose-line:before{content:""}.devicon-jetpackcompose-line-wordmark:before{content:""}.devicon-jetpackcompose-plain:before{content:""}.devicon-jetpackcompose-plain-wordmark:before{content:""}.devicon-jiraalign-plain:before{content:""}.devicon-jiraalign-plain-wordmark:before{content:""}.devicon-jira-plain:before{content:""}.devicon-jira-plain-wordmark:before{content:""}.devicon-jquery-plain:before{content:""}.devicon-jquery-plain-wordmark:before{content:""}.devicon-json-plain:before{content:""}.devicon-jule-original:before,.devicon-jule-plain:before{content:""}.devicon-jule-original-wordmark:before,.devicon-jule-plain-wordmark:before{content:""}.devicon-julia-plain:before{content:""}.devicon-julia-plain-wordmark:before{content:""}.devicon-junit-line:before{content:""}.devicon-junit-line-wordmark:before{content:""}.devicon-junit-plain:before{content:""}.devicon-junit-plain-wordmark:before{content:""}.devicon-jupyter-plain:before{content:""}.devicon-jupyter-plain-wordmark:before{content:""}.devicon-k3os-line:before{content:""}.devicon-k3os-line-wordmark:before{content:""}.devicon-k3os-original:before,.devicon-k3os-plain:before{content:""}.devicon-k3os-plain-wordmark:before{content:""}.devicon-k3s-original:before,.devicon-k3s-plain:before{content:""}.devicon-k3s-plain-wordmark:before{content:""}.devicon-k6-original:before,.devicon-k6-plain:before{content:""}.devicon-kaggle-original:before,.devicon-kaggle-plain:before{content:""}.devicon-kaggle-original-wordmark:before,.devicon-kaggle-plain-wordmark:before{content:""}.devicon-karatelabs-plain:before{content:""}.devicon-karatelabs-plain-wordmark:before{content:""}.devicon-karma-plain:before{content:""}.devicon-kdeneon-plain:before{content:""}.devicon-keras-line:before{content:""}.devicon-keras-line-wordmark:before{content:""}.devicon-keras-plain:before{content:""}.devicon-keras-plain-wordmark:before{content:""}.devicon-kibana-plain:before{content:""}.devicon-kibana-plain-wordmark:before{content:""}.devicon-knexjs-original:before,.devicon-knexjs-plain:before{content:""}.devicon-knexjs-plain-wordmark:before{content:""}.devicon-knockout-plain-wordmark:before{content:""}.devicon-kotlin-plain:before{content:""}.devicon-kotlin-plain-wordmark:before{content:""}.devicon-krakenjs-plain:before{content:""}.devicon-krakenjs-plain-wordmark:before{content:""}.devicon-ktor-plain:before{content:""}.devicon-ktor-plain-wordmark:before{content:""}.devicon-kubernetes-line:before{content:""}.devicon-kubernetes-line-wordmark:before{content:""}.devicon-kubernetes-plain:before{content:""}.devicon-kubernetes-plain-wordmark:before{content:""}.devicon-labview-plain:before{content:""}.devicon-labview-plain-wordmark:before{content:""}.devicon-laravel-line:before{content:""}.devicon-laravel-line-wordmark:before{content:""}.devicon-laravel-original:before,.devicon-laravel-plain:before{content:""}.devicon-laravel-original-wordmark:before,.devicon-laravel-plain-wordmark:before{content:""}.devicon-latex-original:before,.devicon-latex-plain:before{content:""}.devicon-less-plain-wordmark:before{content:""}.devicon-linkedin-plain:before{content:""}.devicon-linkedin-plain-wordmark:before{content:""}.devicon-linux-plain:before{content:""}.devicon-liquibase-original:before,.devicon-liquibase-plain:before{content:""}.devicon-liquibase-original-wordmark:before,.devicon-liquibase-plain-wordmark:before{content:""}.devicon-livewire-plain:before{content:""}.devicon-livewire-plain-wordmark:before{content:""}.devicon-llvm-plain:before{content:""}.devicon-lodash-plain:before{content:""}.devicon-logstash-plain:before{content:""}.devicon-logstash-plain-wordmark:before{content:""}.devicon-lua-line:before,.devicon-lua-line-wordmark:before{content:""}.devicon-lua-plain:before,.devicon-lua-plain-wordmark:before{content:""}.devicon-lumen-original:before,.devicon-lumen-plain:before{content:""}.devicon-magento-line:before{content:""}.devicon-magento-line-wordmark:before{content:""}.devicon-magento-original:before,.devicon-magento-plain:before{content:""}.devicon-magento-plain-wordmark:before{content:""}.devicon-mariadb-original:before,.devicon-mariadb-plain:before{content:""}.devicon-mariadb-original-wordmark:before,.devicon-mariadb-plain-wordmark:before{content:""}.devicon-markdown-original:before,.devicon-markdown-plain:before{content:""}.devicon-materializecss-plain:before{content:""}.devicon-materialui-plain:before{content:""}.devicon-matlab-line:before{content:""}.devicon-matlab-plain:before{content:""}.devicon-matplotlib-plain:before{content:""}.devicon-matplotlib-plain-wordmark:before{content:""}.devicon-maven-plain:before{content:""}.devicon-maven-plain-wordmark:before{content:""}.devicon-maya-plain:before{content:""}.devicon-maya-plain-wordmark:before{content:""}.devicon-meteor-plain:before{content:""}.devicon-meteor-plain-wordmark:before{content:""}.devicon-microsoftsqlserver-line:before{content:""}.devicon-microsoftsqlserver-line-wordmark:before{content:""}.devicon-microsoftsqlserver-plain:before{content:""}.devicon-microsoftsqlserver-plain-wordmark:before{content:""}.devicon-minitab-plain:before{content:""}.devicon-mithril-line:before{content:""}.devicon-mithril-original:before,.devicon-mithril-plain:before{content:""}.devicon-mobx-plain:before{content:""}.devicon-mocha-plain:before{content:""}.devicon-modx-plain:before{content:""}.devicon-modx-plain-wordmark:before{content:""}.devicon-moleculer-original:before,.devicon-moleculer-plain:before{content:""}.devicon-moleculer-original-wordmark:before,.devicon-moleculer-plain-wordmark:before{content:""}.devicon-mongodb-plain:before{content:""}.devicon-mongodb-plain-wordmark:before{content:""}.devicon-mongoose-original:before{content:""}.devicon-mongoose-original-wordmark:before{content:""}.devicon-moodle-plain:before{content:""}.devicon-moodle-plain-wordmark:before{content:""}.devicon-msdos-line:before{content:""}.devicon-msdos-plain:before{content:""}.devicon-mysql-original:before,.devicon-mysql-plain:before{content:""}.devicon-mysql-plain-wordmark:before{content:""}.devicon-nano-plain:before{content:""}.devicon-nano-plain-wordmark:before{content:""}.devicon-neo4j-plain:before{content:""}.devicon-neo4j-plain-wordmark:before{content:""}.devicon-neovim-line:before{content:""}.devicon-neovim-line-wordmark:before{content:""}.devicon-neovim-plain:before{content:""}.devicon-neovim-plain-wordmark:before{content:""}.devicon-nestjs-line:before{content:""}.devicon-nestjs-line-wordmark:before{content:""}.devicon-nestjs-original:before,.devicon-nestjs-plain:before{content:""}.devicon-nestjs-original-wordmark:before,.devicon-nestjs-plain-wordmark:before{content:""}.devicon-netlify-plain:before{content:""}.devicon-netlify-plain-wordmark:before{content:""}.devicon-networkx-line:before{content:""}.devicon-networkx-line-wordmark:before{content:""}.devicon-networkx-plain:before{content:""}.devicon-networkx-plain-wordmark:before{content:""}.devicon-nextjs-line:before{content:""}.devicon-nextjs-line-wordmark:before{content:""}.devicon-nextjs-original-wordmark:before,.devicon-nextjs-plain-wordmark:before{content:""}.devicon-nextjs-plain:before{content:""}.devicon-nginx-original:before,.devicon-nginx-original-wordmark:before,.devicon-nginx-plain:before,.devicon-nginx-plain-wordmark:before{content:""}.devicon-ngrx-plain:before{content:""}.devicon-nhibernate-line:before{content:""}.devicon-nhibernate-line-wordmark:before{content:""}.devicon-nhibernate-plain:before{content:""}.devicon-nhibernate-plain-wordmark:before{content:""}.devicon-nimble-plain:before{content:""}.devicon-nim-line:before{content:""}.devicon-nim-line-wordmark:before{content:""}.devicon-nim-plain:before{content:""}.devicon-nim-plain-wordmark:before{content:""}.devicon-nixos-plain:before{content:""}.devicon-nixos-plain-wordmark:before{content:""}.devicon-nodejs-line:before{content:""}.devicon-nodejs-line-wordmark:before{content:""}.devicon-nodejs-plain:before{content:""}.devicon-nodejs-plain-wordmark:before{content:""}.devicon-nodemon-line:before{content:""}.devicon-nodemon-plain:before{content:""}.devicon-nodewebkit-line:before{content:""}.devicon-nodewebkit-line-wordmark:before{content:""}.devicon-nodewebkit-plain:before{content:""}.devicon-nodewebkit-plain-wordmark:before{content:""}.devicon-nomad-original:before,.devicon-nomad-plain:before{content:""}.devicon-nomad-plain-wordmark:before{content:""}.devicon-norg-plain:before{content:""}.devicon-notion-line:before{content:""}.devicon-notion-plain:before{content:""}.devicon-npm-original-wordmark:before{content:""}.devicon-nuget-original:before{content:""}.devicon-nuget-original-wordmark:before{content:""}.devicon-numpy-line:before{content:""}.devicon-numpy-line-wordmark:before{content:""}.devicon-numpy-plain:before{content:""}.devicon-numpy-plain-wordmark:before{content:""}.devicon-nuxtjs-plain:before{content:""}.devicon-nuxtjs-plain-wordmark:before{content:""}.devicon-oauth-plain:before,.devicon-oauth-plain-wordmark:before{content:""}.devicon-objectivec-plain:before{content:""}.devicon-ocaml-plain:before{content:""}.devicon-ocaml-plain-wordmark:before{content:""}.devicon-ohmyzsh-plain:before{content:""}.devicon-okta-plain:before{content:""}.devicon-okta-plain-wordmark:before{content:""}.devicon-openal-plain:before{content:""}.devicon-openapi-line:before{content:""}.devicon-openapi-line-wordmark:before{content:""}.devicon-openapi-plain:before{content:""}.devicon-openapi-plain-wordmark:before{content:""}.devicon-opencl-line:before,.devicon-opencl-line-wordmark:before{content:""}.devicon-opencl-plain:before,.devicon-opencl-plain-wordmark:before{content:""}.devicon-opencv-plain:before{content:""}.devicon-opencv-plain-wordmark:before{content:""}.devicon-opengl-plain:before{content:""}.devicon-openstack-original:before,.devicon-openstack-plain:before{content:""}.devicon-openstack-plain-wordmark:before{content:""}.devicon-opensuse-original:before,.devicon-opensuse-plain:before{content:""}.devicon-opensuse-original-wordmark:before,.devicon-opensuse-plain-wordmark:before{content:""}.devicon-opentelemetry-plain:before{content:""}.devicon-opentelemetry-plain-wordmark:before{content:""}.devicon-opera-plain:before{content:""}.devicon-opera-plain-wordmark:before{content:""}.devicon-oracle-original:before,.devicon-oracle-plain:before{content:""}.devicon-ory-original:before,.devicon-ory-plain:before{content:""}.devicon-ory-original-wordmark:before,.devicon-ory-plain-wordmark:before{content:""}.devicon-p5js-original:before,.devicon-p5js-plain:before,.devicon-p5js-original-wordmark:before,.devicon-p5js-plain-wordmark:before{content:""}.devicon-packer-line:before{content:""}.devicon-packer-line-wordmark:before{content:""}.devicon-packer-plain:before{content:""}.devicon-packer-plain-wordmark:before{content:""}.devicon-pandas-line:before{content:""}.devicon-pandas-line-wordmark:before{content:""}.devicon-pandas-plain:before{content:""}.devicon-pandas-plain-wordmark:before{content:""}.devicon-perl-plain:before{content:""}.devicon-pfsense-original:before,.devicon-pfsense-plain:before{content:""}.devicon-pfsense-original-wordmark:before,.devicon-pfsense-plain-wordmark:before{content:""}.devicon-phalcon-plain:before{content:""}.devicon-phoenix-original:before,.devicon-phoenix-plain:before{content:""}.devicon-phoenix-plain-wordmark:before{content:""}.devicon-photonengine-plain:before,.devicon-photonengine-plain-wordmark:before{content:""}.devicon-photoshop-line:before{content:""}.devicon-photoshop-plain:before{content:""}.devicon-php-plain:before{content:""}.devicon-phpstorm-plain:before{content:""}.devicon-phpstorm-plain-wordmark:before{content:""}.devicon-playwright-plain:before{content:""}.devicon-plotly-plain:before{content:""}.devicon-plotly-plain-wordmark:before{content:""}.devicon-pnpm-plain:before{content:""}.devicon-pnpm-plain-wordmark:before{content:""}.devicon-podman-plain:before{content:""}.devicon-podman-plain-wordmark:before{content:""}.devicon-poetry-plain:before{content:""}.devicon-polygon-plain:before{content:""}.devicon-polygon-plain-wordmark:before{content:""}.devicon-portainer-original:before,.devicon-portainer-plain:before{content:""}.devicon-portainer-original-wordmark:before,.devicon-portainer-plain-wordmark:before{content:""}.devicon-postcss-original:before,.devicon-postcss-plain:before{content:""}.devicon-postcss-plain-wordmark:before{content:""}.devicon-postgresql-plain:before{content:""}.devicon-postgresql-plain-wordmark:before{content:""}.devicon-postman-plain:before{content:""}.devicon-postman-plain-wordmark:before{content:""}.devicon-powershell-plain:before{content:""}.devicon-premierepro-plain:before{content:""}.devicon-prisma-original:before,.devicon-prisma-plain:before{content:""}.devicon-prisma-original-wordmark:before,.devicon-prisma-plain-wordmark:before{content:""}.devicon-processing-plain:before{content:""}.devicon-processing-plain-wordmark:before{content:""}.devicon-prolog-plain:before{content:""}.devicon-prolog-plain-wordmark:before{content:""}.devicon-prometheus-line:before{content:""}.devicon-prometheus-line-wordmark:before{content:""}.devicon-prometheus-original:before,.devicon-prometheus-plain:before{content:""}.devicon-prometheus-plain-wordmark:before{content:""}.devicon-protractor-line:before{content:""}.devicon-protractor-line-wordmark:before{content:""}.devicon-protractor-plain:before{content:""}.devicon-protractor-plain-wordmark:before{content:""}.devicon-pulsar-original:before,.devicon-pulsar-plain:before{content:""}.devicon-pulsar-original-wordmark:before,.devicon-pulsar-plain-wordmark:before{content:""}.devicon-pulumi-plain:before{content:""}.devicon-pulumi-plain-wordmark:before{content:""}.devicon-puppeteer-plain:before,.devicon-puppeteer-plain-wordmark:before{content:""}.devicon-purescript-original:before{content:""}.devicon-purescript-original-wordmark:before{content:""}.devicon-putty-plain:before{content:""}.devicon-pycharm-plain:before{content:""}.devicon-pycharm-plain-wordmark:before{content:""}.devicon-pypi-plain:before{content:""}.devicon-pypi-plain-wordmark:before{content:""}.devicon-pyscript-plain-wordmark:before{content:""}.devicon-pytest-plain:before{content:""}.devicon-pytest-plain-wordmark:before{content:""}.devicon-python-plain:before{content:""}.devicon-python-plain-wordmark:before{content:""}.devicon-pytorch-original:before,.devicon-pytorch-plain:before{content:""}.devicon-pytorch-plain-wordmark:before{content:""}.devicon-qodana-plain:before{content:""}.devicon-qodana-plain-wordmark:before{content:""}.devicon-qt-original:before,.devicon-qt-plain:before{content:""}.devicon-quarkus-plain:before{content:""}.devicon-quarkus-plain-wordmark:before{content:""}.devicon-quasar-plain:before{content:""}.devicon-quasar-plain-wordmark:before{content:""}.devicon-qwik-plain:before{content:""}.devicon-qwik-plain-wordmark:before{content:""}.devicon-rabbitmq-original:before,.devicon-rabbitmq-plain:before{content:""}.devicon-rabbitmq-plain-wordmark:before{content:""}.devicon-rails-plain:before{content:""}.devicon-rails-plain-wordmark:before{content:""}.devicon-railway-line:before{content:""}.devicon-railway-line-wordmark:before{content:""}.devicon-railway-original:before,.devicon-railway-plain:before{content:""}.devicon-railway-original-wordmark:before,.devicon-railway-plain-wordmark:before{content:""}.devicon-rancher-line:before{content:""}.devicon-rancher-line-wordmark:before{content:""}.devicon-rancher-original:before,.devicon-rancher-plain:before{content:""}.devicon-rancher-plain-wordmark:before{content:""}.devicon-raspberrypi-line:before{content:""}.devicon-raspberrypi-line-wordmark:before{content:""}.devicon-raspberrypi-plain:before{content:""}.devicon-raspberrypi-plain-wordmark:before{content:""}.devicon-reach-plain:before{content:""}.devicon-reactbootstrap-original:before,.devicon-reactbootstrap-plain:before{content:""}.devicon-reactnavigation-original:before,.devicon-reactnavigation-plain:before{content:""}.devicon-react-original:before,.devicon-react-plain:before{content:""}.devicon-react-original-wordmark:before,.devicon-react-plain-wordmark:before{content:""}.devicon-reactrouter-plain:before{content:""}.devicon-reactrouter-plain-wordmark:before{content:""}.devicon-readthedocs-line:before{content:""}.devicon-readthedocs-original:before,.devicon-readthedocs-plain:before{content:""}.devicon-readthedocs-original-wordmark:before,.devicon-readthedocs-plain-wordmark:before{content:""}.devicon-realm-plain:before{content:""}.devicon-realm-plain-wordmark:before{content:""}.devicon-rect-plain:before{content:""}.devicon-redhat-plain:before{content:""}.devicon-redhat-plain-wordmark:before{content:""}.devicon-redis-plain:before{content:""}.devicon-redis-plain-wordmark:before{content:""}.devicon-redux-original:before,.devicon-redux-plain:before{content:""}.devicon-renpy-plain:before{content:""}.devicon-replit-original:before,.devicon-replit-plain:before{content:""}.devicon-replit-plain-wordmark:before{content:""}.devicon-rider-plain:before{content:""}.devicon-rider-plain-wordmark:before{content:""}.devicon-r-line:before{content:""}.devicon-rocksdb-line:before{content:""}.devicon-rocksdb-plain:before{content:""}.devicon-rockylinux-original:before,.devicon-rockylinux-plain:before{content:""}.devicon-rockylinux-plain-wordmark:before{content:""}.devicon-rollup-line:before{content:""}.devicon-rollup-line-wordmark:before{content:""}.devicon-rollup-plain:before{content:""}.devicon-rollup-plain-wordmark:before{content:""}.devicon-ros-original:before{content:""}.devicon-ros-original-wordmark:before{content:""}.devicon-r-plain:before{content:""}.devicon-rspec-line:before{content:""}.devicon-rspec-line-wordmark:before{content:""}.devicon-rspec-plain:before{content:""}.devicon-rspec-plain-wordmark:before{content:""}.devicon-rstudio-plain:before{content:""}.devicon-rubymine-plain:before{content:""}.devicon-rubymine-plain-wordmark:before{content:""}.devicon-ruby-plain:before{content:""}.devicon-ruby-plain-wordmark:before{content:""}.devicon-rust-line:before{content:""}.devicon-rust-original:before,.devicon-rust-plain:before{content:""}.devicon-rxjs-plain:before{content:""}.devicon-safari-line:before{content:""}.devicon-safari-line-wordmark:before{content:""}.devicon-safari-plain:before{content:""}.devicon-safari-plain-wordmark:before{content:""}.devicon-salesforce-plain:before{content:""}.devicon-sanity-plain:before{content:""}.devicon-sass-original:before,.devicon-sass-plain:before{content:""}.devicon-scala-plain:before{content:""}.devicon-scala-plain-wordmark:before{content:""}.devicon-scalingo-line:before{content:""}.devicon-scalingo-line-wordmark:before{content:""}.devicon-scalingo-plain:before{content:""}.devicon-scalingo-plain-wordmark:before{content:""}.devicon-scikitlearn-line:before,.devicon-scikitlearn-line-wordmark:before{content:""}.devicon-scikitlearn-plain:before,.devicon-scikitlearn-plain-wordmark:before{content:""}.devicon-sdl-plain:before{content:""}.devicon-selenium-original:before,.devicon-selenium-plain:before{content:""}.devicon-sema-original:before,.devicon-sema-plain:before{content:""}.devicon-sema-original-wordmark:before,.devicon-sema-plain-wordmark:before{content:""}.devicon-sentry-original:before,.devicon-sentry-plain:before{content:""}.devicon-sentry-original-wordmark:before,.devicon-sentry-plain-wordmark:before{content:""}.devicon-sequelize-plain:before{content:""}.devicon-sequelize-plain-wordmark:before{content:""}.devicon-shopware-original:before{content:""}.devicon-shopware-original-wordmark:before{content:""}.devicon-shotgrid-original-wordmark:before,.devicon-shotgrid-plain-wordmark:before{content:""}.devicon-shotgrid-plain:before{content:""}.devicon-sketch-line:before{content:""}.devicon-sketch-line-wordmark:before{content:""}.devicon-sketch-plain:before{content:""}.devicon-sketch-plain-wordmark:before{content:""}.devicon-slack-plain:before{content:""}.devicon-slack-plain-wordmark:before{content:""}.devicon-socketio-original:before,.devicon-socketio-plain:before{content:""}.devicon-socketio-original-wordmark:before,.devicon-socketio-plain-wordmark:before{content:""}.devicon-solidity-plain:before{content:""}.devicon-solidjs-plain:before{content:""}.devicon-solidjs-plain-wordmark:before{content:""}.devicon-sonarqube-line:before{content:""}.devicon-sonarqube-line-wordmark:before{content:""}.devicon-sonarqube-original:before,.devicon-sonarqube-plain:before{content:""}.devicon-sonarqube-plain-wordmark:before{content:""}.devicon-sourcetree-original:before,.devicon-sourcetree-plain:before{content:""}.devicon-sourcetree-original-wordmark:before,.devicon-sourcetree-plain-wordmark:before{content:""}.devicon-spack-plain:before{content:""}.devicon-splunk-original-wordmark:before,.devicon-splunk-plain-wordmark:before{content:""}.devicon-spring-original:before,.devicon-spring-plain:before{content:""}.devicon-spring-original-wordmark:before,.devicon-spring-plain-wordmark:before{content:""}.devicon-spss-plain:before{content:""}.devicon-spyder-plain:before{content:""}.devicon-spyder-plain-wordmark:before{content:""}.devicon-sqlalchemy-plain:before{content:""}.devicon-sqlalchemy-plain-wordmark:before{content:""}.devicon-sqldeveloper-plain:before{content:""}.devicon-sqlite-plain:before{content:""}.devicon-sqlite-plain-wordmark:before{content:""}.devicon-ssh-original:before,.devicon-ssh-plain:before{content:""}.devicon-ssh-original-wordmark:before,.devicon-ssh-plain-wordmark:before{content:""}.devicon-stackoverflow-line:before{content:""}.devicon-stackoverflow-line-wordmark:before{content:""}.devicon-stackoverflow-plain:before{content:""}.devicon-stackoverflow-plain-wordmark:before{content:""}.devicon-stata-original-wordmark:before,.devicon-stata-plain-wordmark:before{content:""}.devicon-storybook-plain:before{content:""}.devicon-storybook-plain-wordmark:before{content:""}.devicon-streamlit-plain:before{content:""}.devicon-streamlit-plain-wordmark:before{content:""}.devicon-stylus-original:before{content:""}.devicon-subversion-original:before,.devicon-subversion-plain:before{content:""}.devicon-subversion-plain-wordmark:before{content:""}.devicon-supabase-plain:before{content:""}.devicon-supabase-plain-wordmark:before{content:""}.devicon-svelte-plain:before{content:""}.devicon-svelte-plain-wordmark:before{content:""}.devicon-swagger-plain:before{content:""}.devicon-swagger-plain-wordmark:before{content:""}.devicon-swift-plain:before{content:""}.devicon-swift-plain-wordmark:before{content:""}.devicon-swiper-original:before,.devicon-swiper-plain:before{content:""}.devicon-symfony-original:before,.devicon-symfony-plain:before{content:""}.devicon-symfony-original-wordmark:before,.devicon-symfony-plain-wordmark:before{content:""}.devicon-tailwindcss-original:before,.devicon-tailwindcss-plain:before{content:""}.devicon-tailwindcss-plain-wordmark:before{content:""}.devicon-tauri-plain:before{content:""}.devicon-tauri-plain-wordmark:before{content:""}.devicon-tensorflow-line:before{content:""}.devicon-tensorflow-line-wordmark:before{content:""}.devicon-tensorflow-original:before{content:""}.devicon-tensorflow-original-wordmark:before{content:""}.devicon-terraform-plain:before{content:""}.devicon-terraform-plain-wordmark:before{content:""}.devicon-tex-original:before,.devicon-tex-original-wordmark:before,.devicon-tex-plain:before,.devicon-tex-plain-wordmark:before{content:""}.devicon-thealgorithms-plain:before{content:""}.devicon-thealgorithms-plain-wordmark:before{content:""}.devicon-threedsmax-plain:before,.devicon-threedsmax-plain-wordmark:before{content:""}.devicon-threejs-original:before{content:""}.devicon-threejs-original-wordmark:before{content:""}.devicon-titaniumsdk-original:before,.devicon-titaniumsdk-plain:before{content:""}.devicon-tomcat-line:before{content:""}.devicon-tomcat-line-wordmark:before{content:""}.devicon-tortoisegit-line:before{content:""}.devicon-tortoisegit-plain:before{content:""}.devicon-towergit-plain:before{content:""}.devicon-towergit-plain-wordmark:before{content:""}.devicon-traefikmesh-line:before{content:""}.devicon-traefikmesh-line-wordmark:before{content:""}.devicon-traefikmesh-original:before,.devicon-traefikmesh-plain:before{content:""}.devicon-traefikmesh-plain-wordmark:before{content:""}.devicon-traefikproxy-line:before{content:""}.devicon-traefikproxy-line-wordmark:before{content:""}.devicon-traefikproxy-original:before,.devicon-traefikproxy-plain:before{content:""}.devicon-traefikproxy-plain-wordmark:before{content:""}.devicon-travis-line:before{content:""}.devicon-travis-line-wordmark:before{content:""}.devicon-travis-plain:before{content:""}.devicon-travis-plain-wordmark:before{content:""}.devicon-trello-line:before{content:""}.devicon-trello-line-wordmark:before{content:""}.devicon-trello-plain:before{content:""}.devicon-trello-plain-wordmark:before{content:""}.devicon-trpc-plain:before{content:""}.devicon-trpc-plain-wordmark:before{content:""}.devicon-twitter-original:before,.devicon-twitter-plain:before{content:""}.devicon-typescript-plain:before,.devicon-typescript-original:before{content:""}.devicon-typo3-line:before{content:""}.devicon-typo3-line-wordmark:before{content:""}.devicon-typo3-original:before,.devicon-typo3-plain:before{content:""}.devicon-typo3-plain-wordmark:before{content:""}.devicon-ubuntu-plain:before{content:""}.devicon-ubuntu-plain-wordmark:before{content:""}.devicon-unifiedmodelinglanguage-plain:before{content:""}.devicon-unifiedmodelinglanguage-plain-wordmark:before{content:""}.devicon-unity-line:before{content:""}.devicon-unity-line-wordmark:before{content:""}.devicon-unity-plain:before{content:""}.devicon-unity-plain-wordmark:before{content:""}.devicon-unix-original:before{content:""}.devicon-unrealengine-original:before,.devicon-unrealengine-plain:before{content:""}.devicon-unrealengine-original-wordmark:before,.devicon-unrealengine-plain-wordmark:before{content:""}.devicon-uwsgi-plain:before{content:""}.devicon-v8-plain:before,.devicon-v8-plain-wordmark:before{content:""}.devicon-vagrant-plain:before{content:""}.devicon-vagrant-plain-wordmark:before{content:""}.devicon-vala-plain:before{content:""}.devicon-vala-plain-wordmark:before{content:""}.devicon-vault-original:before,.devicon-vault-plain:before{content:""}.devicon-vault-plain-wordmark:before{content:""}.devicon-vercel-line:before{content:""}.devicon-vercel-line-wordmark:before{content:""}.devicon-vercel-original:before,.devicon-vercel-plain:before{content:""}.devicon-vercel-original-wordmark:before,.devicon-vercel-plain-wordmark:before{content:""}.devicon-vertx-line:before{content:""}.devicon-vertx-line-wordmark:before{content:""}.devicon-vertx-plain:before{content:""}.devicon-vertx-plain-wordmark:before{content:""}.devicon-vim-plain:before{content:""}.devicon-visualbasic-line:before{content:""}.devicon-visualbasic-plain:before{content:""}.devicon-visualstudio-line:before{content:""}.devicon-visualstudio-plain:before{content:""}.devicon-vitejs-plain:before{content:""}.devicon-vite-original:before,.devicon-vite-plain:before{content:""}.devicon-vite-original-wordmark:before,.devicon-vite-plain-wordmark:before{content:""}.devicon-vitess-plain:before{content:""}.devicon-vitess-plain-wordmark:before{content:""}.devicon-vitest-plain:before{content:""}.devicon-vscode-plain:before{content:""}.devicon-vscode-plain-wordmark:before{content:""}.devicon-vsphere-line:before{content:""}.devicon-vsphere-line-wordmark:before{content:""}.devicon-vsphere-plain:before{content:""}.devicon-vsphere-plain-wordmark:before{content:""}.devicon-vuejs-line:before{content:""}.devicon-vuejs-line-wordmark:before{content:""}.devicon-vuejs-plain:before{content:""}.devicon-vuejs-plain-wordmark:before{content:""}.devicon-vuestorefront-plain:before{content:""}.devicon-vuetify-line:before{content:""}.devicon-vuetify-plain:before{content:""}.devicon-vyper-plain:before{content:""}.devicon-vyper-plain-wordmark:before{content:""}.devicon-wasm-original:before,.devicon-wasm-plain:before{content:""}.devicon-wasm-plain-wordmark:before{content:""}.devicon-webflow-original:before{content:""}.devicon-weblate-plain:before{content:""}.devicon-weblate-plain-wordmark:before{content:""}.devicon-webpack-plain:before{content:""}.devicon-webpack-plain-wordmark:before{content:""}.devicon-webstorm-plain:before{content:""}.devicon-webstorm-plain-wordmark:before{content:""}.devicon-windows8-original:before,.devicon-windows8-plain:before{content:""}.devicon-windows8-original-wordmark:before,.devicon-windows8-plain-wordmark:before{content:""}.devicon-windows11-original:before,.devicon-windows11-plain:before{content:""}.devicon-windows11-original-wordmark:before,.devicon-windows11-plain-wordmark:before{content:""}.devicon-woocommerce-plain:before{content:""}.devicon-woocommerce-plain-wordmark:before{content:""}.devicon-wordpress-plain:before{content:""}.devicon-wordpress-plain-wordmark:before{content:""}.devicon-xamarin-original:before,.devicon-xamarin-plain:before{content:""}.devicon-xamarin-original-wordmark:before,.devicon-xamarin-plain-wordmark:before{content:""}.devicon-xcode-plain:before{content:""}.devicon-xd-line:before{content:""}.devicon-xd-plain:before{content:""}.devicon-xml-line:before,.devicon-xml-line-wordmark:before{content:""}.devicon-xml-plain:before,.devicon-xml-plain-wordmark:before{content:""}.devicon-yaml-plain:before,.devicon-yaml-plain-wordmark:before{content:""}.devicon-yarn-line:before{content:""}.devicon-yarn-line-wordmark:before{content:""}.devicon-yarn-original:before,.devicon-yarn-plain:before{content:""}.devicon-yarn-original-wordmark:before,.devicon-yarn-plain-wordmark:before{content:""}.devicon-yii-plain:before{content:""}.devicon-yii-plain-wordmark:before{content:""}.devicon-yugabytedb-plain:before{content:""}.devicon-yugabytedb-plain-wordmark:before{content:""}.devicon-yunohost-plain:before{content:""}.devicon-zend-line:before{content:""}.devicon-zend-line-wordmark:before{content:""}.devicon-zend-original:before,.devicon-zend-plain:before{content:""}.devicon-zend-original-wordmark:before,.devicon-zend-plain-wordmark:before{content:""}.devicon-zig-original:before,.devicon-zig-plain:before{content:""}.devicon-zig-plain-wordmark:before{content:""}.devicon-threedsmax-plain.colored,.devicon-threedsmax-original-wordmark.colored,.devicon-threedsmax-plain-wordmark.colored{color:#37a5cc}.devicon-aarch64-plain.colored,.devicon-aarch64-line.colored,.devicon-aarch64-original-wordmark.colored,.devicon-aarch64-plain-wordmark.colored,.devicon-aarch64-line-wordmark.colored{color:#16358c}.devicon-adonisjs-original.colored,.devicon-adonisjs-original-wordmark.colored,.devicon-adonisjs-plain.colored,.devicon-adonisjs-plain-wordmark.colored{color:#5a45ff}.devicon-aftereffects-plain.colored{color:#1f0740}.devicon-akka-plain.colored,.devicon-akka-plain-wordmark.colored{color:#15a9ce}.devicon-algolia-original.colored,.devicon-algolia-original-wordmark.colored{color:#003dff}.devicon-alpinejs-original.colored,.devicon-alpinejs-original-wordmark.colored,.devicon-alpinejs-plain.colored,.devicon-alpinejs-plain-wordmark.colored{color:#2d3441}.devicon-amazonwebservices-plain-wordmark.colored,.devicon-amazonwebservices-line-wordmark.colored,.devicon-amazonwebservices-original.colored,.devicon-amazonwebservices-plain.colored,.devicon-amazonwebservices-line.colored{color:#f90}.devicon-anaconda-original.colored,.devicon-anaconda-original-wordmark.colored,.devicon-anaconda-plain.colored,.devicon-anaconda-plain-wordmark.colored{color:#3eb049}.devicon-android-plain.colored,.devicon-android-plain-wordmark.colored{color:#a4c439}.devicon-androidstudio-plain.colored,.devicon-androidstudio-plain-wordmark.colored{color:#4285f4}.devicon-angular-plain.colored,.devicon-angular-plain-wordmark.colored{color:#fff}.devicon-angularjs-plain.colored,.devicon-angularjs-plain-wordmark.colored{color:#c4473a}.devicon-angularmaterial-plain.colored{color:#ffa726}.devicon-ansible-plain.colored,.devicon-ansible-plain-wordmark.colored{color:#1a1918}.devicon-antdesign-plain.colored,.devicon-antdesign-plain-wordmark.colored{color:#0073bb}.devicon-apache-plain.colored,.devicon-apache-plain-wordmark.colored,.devicon-apache-line.colored,.devicon-apache-line-wordmark.colored{color:#cb2533}.devicon-apacheairflow-plain.colored,.devicon-apacheairflow-plain-wordmark.colored{color:#017cee}.devicon-apachekafka-original.colored,.devicon-apachekafka-original-wordmark.colored,.devicon-apachekafka-plain.colored,.devicon-apachekafka-plain-wordmark.colored{color:#231f20}.devicon-apachespark-original.colored,.devicon-apachespark-plain-wordmark.colored,.devicon-apachespark-plain.colored{color:#e15919}.devicon-apl-plain.colored{color:#24a148}.devicon-appcelerator-original.colored,.devicon-appcelerator-plain-wordmark.colored,.devicon-appcelerator-plain.colored{color:#ac162c}.devicon-apple-original.colored,.devicon-apple-plain.colored{color:#000}.devicon-appwrite-plain.colored,.devicon-appwrite-plain-wordmark.colored,.devicon-appwrite-original.colored,.devicon-appwrite-original-wordmark.colored{color:#f02e65}.devicon-archlinux-plain.colored,.devicon-archlinux-plain-wordmark.colored{color:#1791cf}.devicon-arduino-plain.colored,.devicon-arduino-plain-wordmark.colored{color:#00979d}.devicon-argocd-plain.colored,.devicon-argocd-plain-wordmark.colored{color:#ef7b4d}.devicon-astro-plain.colored,.devicon-astro-plain-wordmark.colored{color:#ff5d01}.devicon-atom-original.colored,.devicon-atom-original-wordmark.colored,.devicon-atom-plain.colored,.devicon-atom-plain-wordmark.colored{color:#67595d}.devicon-awk-plain-wordmark.colored,.devicon-awk-original.colored,.devicon-awk-plain.colored{color:#0a094d}.devicon-axios-plain.colored,.devicon-axios-plain-wordmark.colored{color:#5a29e4}.devicon-azure-plain.colored,.devicon-azure-plain-wordmark.colored{color:#0089d6}.devicon-azuredevops-plain.colored{color:#0078d4}.devicon-azuresqldatabase-plain.colored{color:#005ba1}.devicon-babel-plain.colored,.devicon-babel-original.colored{color:#f9dc3e}.devicon-backbonejs-plain.colored,.devicon-backbonejs-plain-wordmark.colored{color:#002a41}.devicon-ballerina-original.colored,.devicon-ballerina-original-wordmark.colored,.devicon-ballerina-line.colored,.devicon-ballerina-line-wordmark.colored,.devicon-ballerina-plain.colored,.devicon-ballerina-plain-wordmark.colored{color:#46c0bc}.devicon-bamboo-original.colored,.devicon-bamboo-original-wordmark.colored,.devicon-bamboo-plain.colored,.devicon-bamboo-plain-wordmark.colored{color:#1068e2}.devicon-bash-plain.colored{color:#293138}.devicon-beats-plain.colored{color:#07c}.devicon-behance-plain.colored,.devicon-behance-plain-wordmark.colored{color:#0071e0}.devicon-bitbucket-original.colored,.devicon-bitbucket-original-wordmark.colored,.devicon-bitbucket-plain.colored,.devicon-bitbucket-plain-wordmark.colored{color:#205081}.devicon-blazor-original.colored,.devicon-blazor-line.colored,.devicon-blazor-plain.colored{color:#5c2d91}.devicon-blender-original.colored,.devicon-blender-original-wordmark.colored{color:#dc7b2e}.devicon-bootstrap-plain.colored,.devicon-bootstrap-plain-wordmark.colored{color:#712cf9}.devicon-bower-plain.colored,.devicon-bower-plain-wordmark.colored,.devicon-bower-line.colored,.devicon-bower-line-wordmark.colored{color:#ef5734}.devicon-browserstack-plain.colored,.devicon-browserstack-plain-wordmark.colored,.devicon-browserstack-line.colored,.devicon-browserstack-line-wordmark.colored{color:#0070f0}.devicon-bulma-plain.colored{color:#00d1b2}.devicon-bun-plain.colored,.devicon-bun-line.colored{color:#fbf0df}.devicon-c-plain.colored,.devicon-c-plain-wordmark.colored,.devicon-c-line.colored,.devicon-c-line-wordmark.colored,.devicon-c-plain-wordmark.colored,.devicon-c-line-wordmark.colored{color:#03599c}.devicon-cairo-plain.colored,.devicon-cairo-plain-wordmark.colored{color:#f39914}.devicon-cakephp-plain.colored,.devicon-cakephp-plain-wordmark.colored{color:#d43d44}.devicon-canva-original.colored,.devicon-canva-plain.colored{color:#00c4cc}.devicon-capacitor-plain.colored,.devicon-capacitor-plain-wordmark.colored{color:#53b9ff}.devicon-carbon-original.colored,.devicon-carbon-plain.colored{color:#000}.devicon-cassandra-plain.colored,.devicon-cassandra-plain-wordmark.colored{color:#1185b0}.devicon-centos-plain.colored,.devicon-centos-plain-wordmark.colored{color:#932178}.devicon-ceylon-plain.colored,.devicon-ceylon-plain-wordmark.colored{color:#ab710a}.devicon-chrome-plain.colored,.devicon-chrome-plain-wordmark.colored{color:#ce4e4e}.devicon-circleci-plain.colored,.devicon-circleci-plain-wordmark.colored{color:#343434}.devicon-clarity-plain.colored,.devicon-clarity-plain-wordmark.colored{color:#13171a}.devicon-clion-plain.colored,.devicon-clion-plain-wordmark.colored{color:#21d789}.devicon-clojure-line.colored,.devicon-clojure-plain.colored,.devicon-clojure-plain.colored{color:#5881d8}.devicon-clojurescript-plain.colored{color:#96ca4b}.devicon-cloudflare-plain.colored,.devicon-cloudflare-plain-wordmark.colored{color:#f38020}.devicon-cloudflareworkers-plain.colored,.devicon-cloudflareworkers-plain-wordmark.colored{color:#ea9344}.devicon-cmake-plain.colored,.devicon-cmake-plain-wordmark.colored{color:#0e8a16}.devicon-codeac-original.colored{color:#005096}.devicon-codecov-plain.colored{color:#e0225c}.devicon-codeigniter-plain.colored,.devicon-codeigniter-plain-wordmark.colored{color:#ee4323}.devicon-codepen-original.colored,.devicon-codepen-original-wordmark.colored,.devicon-codepen-line.colored,.devicon-codepen-line-wordmark.colored,.devicon-codepen-plain.colored,.devicon-codepen-plain-wordmark.colored{color:#000}.devicon-coffeescript-original.colored,.devicon-coffeescript-original-wordmark.colored,.devicon-coffeescript-plain.colored,.devicon-coffeescript-plain-wordmark.colored{color:#28334c}.devicon-composer-line.colored,.devicon-composer-line-wordmark.colored,.devicon-composer-plain.colored,.devicon-composer-plain-wordmark.colored{color:#000}.devicon-confluence-plain.colored,.devicon-confluence-plain-wordmark.colored,.devicon-confluence-line.colored,.devicon-confluence-line-wordmark.colored{color:#136be6}.devicon-consul-original.colored,.devicon-consul-plain-wordmark.colored,.devicon-consul-plain.colored{color:#e03875}.devicon-contao-original.colored,.devicon-contao-original-wordmark.colored{color:#f47c00}.devicon-corejs-original.colored,.devicon-corejs-original-wordmark.colored,.devicon-corejs-plain.colored,.devicon-corejs-plain-wordmark.colored{color:#000}.devicon-cosmosdb-plain.colored,.devicon-cosmosdb-plain-wordmark.colored{color:#59b3d8}.devicon-couchbase-original.colored,.devicon-couchbase-plain-wordmark.colored,.devicon-couchbase-plain.colored{color:#ea2328}.devicon-couchdb-plain.colored,.devicon-couchdb-plain-wordmark.colored{color:#e42528}.devicon-cplusplus-plain.colored,.devicon-cplusplus-line.colored,.devicon-cplusplus-plain-wordmark.colored,.devicon-cplusplus-line-wordmark.colored{color:#004482}.devicon-crystal-original.colored,.devicon-crystal-original-wordmark.colored,.devicon-crystal-line.colored,.devicon-crystal-line-wordmark.colored,.devicon-crystal-plain.colored,.devicon-crystal-plain-wordmark.colored{color:#000}.devicon-csharp-plain.colored,.devicon-csharp-plain-wordmark.colored,.devicon-csharp-line.colored,.devicon-csharp-line-wordmark.colored,.devicon-csharp-plain-wordmark.colored,.devicon-csharp-line-wordmark.colored{color:#68217a}.devicon-css3-plain.colored,.devicon-css3-plain-wordmark.colored{color:#3d8fc6}.devicon-cucumber-plain.colored,.devicon-cucumber-plain-wordmark.colored{color:#00a818}.devicon-cypressio-plain.colored,.devicon-cypressio-plain-wordmark.colored,.devicon-cypressio-line.colored,.devicon-cypressio-line-wordmark.colored{color:#1b1e2e}.devicon-d3js-plain.colored{color:#f7974e}.devicon-dart-plain.colored,.devicon-dart-plain-wordmark.colored{color:#00a8e1}.devicon-datagrip-plain.colored,.devicon-datagrip-plain-wordmark.colored{color:#21d789}.devicon-dataspell-plain.colored,.devicon-dataspell-plain-wordmark.colored{color:#087cfa}.devicon-dbeaver-plain.colored{color:#382a24}.devicon-debian-plain.colored,.devicon-debian-plain-wordmark.colored{color:#a80030}.devicon-denojs-original.colored,.devicon-denojs-original-wordmark.colored,.devicon-denojs-plain.colored,.devicon-denojs-plain-wordmark.colored{color:#000}.devicon-devicon-plain.colored,.devicon-devicon-plain-wordmark.colored,.devicon-devicon-line.colored,.devicon-devicon-line-wordmark.colored{color:#60be86}.devicon-digitalocean-original.colored,.devicon-digitalocean-original-wordmark.colored,.devicon-digitalocean-plain.colored,.devicon-digitalocean-plain-wordmark.colored{color:#0080ff}.devicon-discordjs-plain.colored,.devicon-discordjs-plain-wordmark.colored{color:#0c0c14}.devicon-django-plain.colored,.devicon-django-plain-wordmark.colored{color:#092e20}.devicon-djangorest-plain.colored,.devicon-djangorest-line.colored,.devicon-djangorest-plain-wordmark.colored,.devicon-djangorest-line-wordmark.colored{color:#a30000}.devicon-docker-plain.colored,.devicon-docker-plain-wordmark.colored{color:#019bc6}.devicon-doctrine-plain.colored,.devicon-doctrine-plain-wordmark.colored,.devicon-doctrine-line.colored,.devicon-doctrine-line-wordmark.colored{color:#f56d39}.devicon-dot-net-plain.colored,.devicon-dot-net-plain-wordmark.colored{color:#1384c8}.devicon-dotnetcore-plain.colored{color:#623697}.devicon-dreamweaver-plain.colored,.devicon-dreamweaver-line.colored{color:#470137}.devicon-dropwizard-plain.colored{color:#24265d}.devicon-drupal-plain.colored,.devicon-drupal-plain-wordmark.colored{color:#0073ba}.devicon-dynamodb-plain.colored{color:#527fff}.devicon-eclipse-plain-wordmark.colored,.devicon-eclipse-plain.colored{color:#2c2255}.devicon-ecto-original.colored,.devicon-ecto-plain-wordmark.colored,.devicon-ecto-plain.colored{color:#77bf43}.devicon-elasticsearch-plain-wordmark.colored,.devicon-elasticsearch-plain.colored{color:#00bfb3}.devicon-electron-original.colored,.devicon-electron-original-wordmark.colored{color:#47848f}.devicon-eleventy-plain.colored{color:#1f1f1f}.devicon-elixir-plain.colored,.devicon-elixir-plain-wordmark.colored{color:#380a4d}.devicon-elm-plain.colored,.devicon-elm-plain-wordmark.colored{color:#34495e}.devicon-emacs-original.colored{color:#421f5f}.devicon-embeddedc-plain.colored,.devicon-embeddedc-plain-wordmark.colored{color:#444}.devicon-ember-original-wordmark.colored,.devicon-ember-plain.colored,.devicon-ember-plain-wordmark.colored{color:#e04e39}.devicon-envoy-plain.colored,.devicon-envoy-plain-wordmark.colored{color:#e13eaf}.devicon-erlang-plain.colored,.devicon-erlang-plain-wordmark.colored{color:#a90533}.devicon-eslint-plain.colored,.devicon-eslint-plain-wordmark.colored,.devicon-eslint-line.colored,.devicon-eslint-line-wordmark.colored{color:#4b32c3}.devicon-express-original.colored,.devicon-express-original-wordmark.colored{color:#444}.devicon-facebook-plain.colored,.devicon-facebook-original.colored{color:#3d5a98}.devicon-fastapi-plain.colored,.devicon-fastapi-plain-wordmark.colored{color:#009688}.devicon-fastify-plain.colored,.devicon-fastify-plain-wordmark.colored{color:#000}.devicon-faunadb-original-wordmark.colored,.devicon-faunadb-original.colored,.devicon-faunadb-line.colored,.devicon-faunadb-line-wordmark.colored,.devicon-faunadb-plain.colored,.devicon-faunadb-plain-wordmark.colored{color:#3a1ab6}.devicon-feathersjs-original.colored{color:#333}.devicon-fedora-plain.colored{color:#294172}.devicon-figma-plain.colored{color:#f24e1e}.devicon-filezilla-plain.colored,.devicon-filezilla-plain-wordmark.colored,.devicon-filezilla-line.colored,.devicon-filezilla-line-wordmark.colored{color:#bb0001}.devicon-firebase-plain.colored,.devicon-firebase-plain-wordmark.colored,.devicon-firebase-line.colored,.devicon-firebase-line-wordmark.colored{color:#ffa000}.devicon-firefox-plain.colored,.devicon-firefox-plain-wordmark.colored{color:#dd732a}.devicon-flask-original.colored,.devicon-flask-original-wordmark.colored,.devicon-flask-plain.colored,.devicon-flask-plain-wordmark.colored{color:#010101}.devicon-flutter-plain.colored{color:#3fb6d3}.devicon-fortran-original.colored{color:#734f96}.devicon-foundation-plain.colored,.devicon-foundation-plain-wordmark.colored{color:#008cba}.devicon-framermotion-original.colored,.devicon-framermotion-original-wordmark.colored,.devicon-framermotion-plain.colored,.devicon-framermotion-plain-wordmark.colored{color:#000}.devicon-framework7-original.colored,.devicon-framework7-original-wordmark.colored,.devicon-framework7-plain.colored,.devicon-framework7-plain-wordmark.colored{color:#ee350f}.devicon-fsharp-plain.colored{color:#378bba}.devicon-gatling-original.colored,.devicon-gatling-plain-wordmark.colored,.devicon-gatling-line.colored,.devicon-gatling-line-wordmark.colored,.devicon-gatling-plain.colored{color:#f78557}.devicon-gatsby-original.colored,.devicon-gatsby-plain-wordmark.colored,.devicon-gatsby-plain.colored{color:#64328b}.devicon-gazebo-plain.colored,.devicon-gazebo-plain-wordmark.colored{color:#f58113}.devicon-gcc-plain.colored,.devicon-gcc-line.colored,.devicon-gcc-original-wordmark.colored,.devicon-gcc-plain-wordmark.colored,.devicon-gcc-line-wordmark.colored{color:#ffcfab}.devicon-gentoo-plain.colored,.devicon-gentoo-plain-wordmark.colored,.devicon-gentoo-line.colored,.devicon-gentoo-line-wordmark.colored{color:#9991d9}.devicon-ghost-original.colored,.devicon-ghost-original-wordmark.colored{color:#000}.devicon-gimp-plain.colored,.devicon-gimp-plain-wordmark.colored,.devicon-gimp-line.colored,.devicon-gimp-line-wordmark.colored{color:#716955}.devicon-git-plain.colored,.devicon-git-plain-wordmark.colored{color:#f34f29}.devicon-gitbook-original.colored,.devicon-gitbook-original-wordmark.colored,.devicon-gitbook-line.colored,.devicon-gitbook-line-wordmark.colored,.devicon-gitbook-plain.colored,.devicon-gitbook-plain-wordmark.colored{color:#346ddb}.devicon-github-original.colored,.devicon-github-original-wordmark.colored,.devicon-github-plain.colored{color:#181616}.devicon-githubactions-plain.colored{color:#2088ff}.devicon-githubcodespaces-plain.colored{color:#24292e}.devicon-gitlab-plain.colored,.devicon-gitlab-plain-wordmark.colored{color:#e24329}.devicon-gitpod-plain.colored,.devicon-gitpod-plain-wordmark.colored{color:#ffa132}.devicon-gitter-plain.colored,.devicon-gitter-plain-wordmark.colored{color:#000}.devicon-go-original-wordmark.colored,.devicon-go-plain.colored,.devicon-go-line.colored,.devicon-go-plain-wordmark.colored{color:#00acd7}.devicon-godot-plain.colored,.devicon-godot-plain-wordmark.colored{color:#478cbf}.devicon-goland-plain.colored,.devicon-goland-plain-wordmark.colored{color:#087cfa}.devicon-google-plain.colored,.devicon-google-plain-wordmark.colored,.devicon-google-original.colored,.devicon-google-original-wordmark.colored{color:#587dbd}.devicon-googlecloud-plain.colored,.devicon-googlecloud-plain-wordmark.colored{color:#557ebf}.devicon-gradle-original.colored,.devicon-gradle-original-wordmark.colored,.devicon-gradle-plain.colored,.devicon-gradle-plain-wordmark.colored{color:#02303a}.devicon-grafana-plain.colored,.devicon-grafana-plain-wordmark.colored,.devicon-grafana-line.colored,.devicon-grafana-line-wordmark.colored{color:#f7a525}.devicon-grails-plain.colored{color:#feb571}.devicon-graphql-plain.colored,.devicon-graphql-plain-wordmark.colored{color:#e434aa}.devicon-groovy-plain.colored{color:#619cbc}.devicon-grpc-plain.colored{color:#00b0ad}.devicon-grunt-plain.colored,.devicon-grunt-plain-wordmark.colored,.devicon-grunt-line.colored,.devicon-grunt-line-wordmark.colored{color:#fcaa1a}.devicon-gulp-plain.colored{color:#eb4a4b}.devicon-hadoop-plain.colored,.devicon-hadoop-plain-wordmark.colored,.devicon-hadoop-line.colored,.devicon-hadoop-line-wordmark.colored{color:#ff0}.devicon-handlebars-original.colored,.devicon-handlebars-original-wordmark.colored,.devicon-handlebars-line.colored,.devicon-handlebars-line-wordmark.colored,.devicon-handlebars-plain.colored,.devicon-handlebars-plain-wordmark.colored{color:#000}.devicon-hardhat-plain.colored,.devicon-hardhat-plain-wordmark.colored{color:#fff100}.devicon-harvester-original.colored,.devicon-harvester-plain-wordmark.colored,.devicon-harvester-plain.colored{color:#00a580}.devicon-haskell-plain.colored,.devicon-haskell-plain-wordmark.colored{color:#5e5185}.devicon-haxe-plain.colored{color:#ea8220}.devicon-helm-original.colored,.devicon-helm-line.colored,.devicon-helm-plain.colored{color:#0f1689}.devicon-heroku-original.colored,.devicon-heroku-original-wordmark.colored,.devicon-heroku-plain.colored,.devicon-heroku-plain-wordmark.colored,.devicon-heroku-line.colored,.devicon-heroku-line-wordmark.colored{color:#6762a6}.devicon-hibernate-plain.colored,.devicon-hibernate-plain-wordmark.colored{color:#bcae79}.devicon-homebrew-plain.colored,.devicon-homebrew-plain-wordmark.colored,.devicon-homebrew-line.colored,.devicon-homebrew-line-wordmark.colored{color:#fbb040}.devicon-html5-plain.colored,.devicon-html5-plain-wordmark.colored{color:#e54d26}.devicon-hugo-plain.colored,.devicon-hugo-plain-wordmark.colored{color:#ff4088}.devicon-ie10-original.colored,.devicon-ie10-plain.colored{color:#1ebbee}.devicon-ifttt-original.colored,.devicon-ifttt-plain.colored{color:#000}.devicon-illustrator-plain.colored,.devicon-illustrator-line.colored{color:#faa625}.devicon-influxdb-original.colored,.devicon-influxdb-original-wordmark.colored,.devicon-influxdb-plain.colored,.devicon-influxdb-plain-wordmark.colored{color:#020a47}.devicon-inkscape-plain.colored,.devicon-inkscape-plain-wordmark.colored{color:#000}.devicon-insomnia-plain.colored,.devicon-insomnia-plain-wordmark.colored{color:#4000bf}.devicon-intellij-plain.colored,.devicon-intellij-plain-wordmark.colored{color:#087cfa}.devicon-ionic-original.colored,.devicon-ionic-original-wordmark.colored{color:#4e8ef7}.devicon-jaegertracing-plain.colored,.devicon-jaegertracing-plain-wordmark.colored{color:#67cfe3}.devicon-jamstack-original.colored,.devicon-jamstack-plain-wordmark.colored,.devicon-jamstack-plain.colored{color:#f0047f}.devicon-jasmine-original.colored,.devicon-jasmine-original-wordmark.colored,.devicon-jasmine-plain.colored,.devicon-jasmine-plain-wordmark.colored{color:#8a4182}.devicon-java-plain.colored,.devicon-java-plain-wordmark.colored{color:#ea2d2e}.devicon-javascript-plain.colored{color:#f0db4f}.devicon-jeet-plain.colored,.devicon-jeet-plain-wordmark.colored{color:#ff664a}.devicon-jekyll-plain.colored,.devicon-jekyll-plain-wordmark.colored{color:#000}.devicon-jenkins-line.colored,.devicon-jenkins-plain.colored{color:#f0d6b7}.devicon-jest-plain.colored{color:#99425b}.devicon-jetbrains-plain.colored{color:#fdcc21}.devicon-jetpackcompose-plain-wordmark.colored,.devicon-jetpackcompose-plain.colored,.devicon-jetpackcompose-line.colored,.devicon-jetpackcompose-line-wordmark.colored{color:#4285f4}.devicon-jira-plain.colored,.devicon-jira-plain-wordmark.colored{color:#2684ff}.devicon-jiraalign-plain.colored,.devicon-jiraalign-plain-wordmark.colored{color:#2684ff}.devicon-jquery-plain.colored,.devicon-jquery-plain-wordmark.colored{color:#0769ad}.devicon-json-plain.colored{color:#505050}.devicon-jule-original.colored,.devicon-jule-original-wordmark.colored,.devicon-jule-plain.colored,.devicon-jule-plain-wordmark.colored{color:#5f7389}.devicon-julia-plain.colored,.devicon-julia-plain-wordmark.colored{color:#28a745}.devicon-junit-plain.colored,.devicon-junit-plain-wordmark.colored,.devicon-junit-line.colored,.devicon-junit-line-wordmark.colored{color:#dc514a}.devicon-jupyter-plain.colored,.devicon-jupyter-plain-wordmark.colored{color:#f37726}.devicon-k3os-original.colored,.devicon-k3os-plain-wordmark.colored,.devicon-k3os-line.colored,.devicon-k3os-line-wordmark.colored,.devicon-k3os-plain.colored{color:#fd824e}.devicon-k3s-original.colored,.devicon-k3s-plain-wordmark.colored,.devicon-k3s-plain.colored{color:#ffc519}.devicon-k6-original.colored,.devicon-k6-plain.colored{color:#7d64ff}.devicon-kaggle-original.colored,.devicon-kaggle-original-wordmark.colored,.devicon-kaggle-plain.colored,.devicon-kaggle-plain-wordmark.colored{color:#20beff}.devicon-karatelabs-plain.colored,.devicon-karatelabs-plain-wordmark.colored{color:#000}.devicon-karma-plain.colored{color:#56c5a8}.devicon-kdeneon-plain.colored{color:#21769a}.devicon-keras-plain.colored,.devicon-keras-plain-wordmark.colored,.devicon-keras-line.colored,.devicon-keras-line-wordmark.colored{color:#d00000}.devicon-kibana-plain.colored,.devicon-kibana-plain-wordmark.colored{color:#f04e98}.devicon-knexjs-original.colored,.devicon-knexjs-plain-wordmark.colored,.devicon-knexjs-plain.colored{color:#e16426}.devicon-knockout-plain-wordmark.colored{color:#e42e16}.devicon-kotlin-plain.colored,.devicon-kotlin-plain-wordmark.colored{color:#c711e1}.devicon-krakenjs-plain.colored,.devicon-krakenjs-plain-wordmark.colored{color:#0081c2}.devicon-ktor-plain.colored,.devicon-ktor-plain-wordmark.colored{color:#fc801d}.devicon-kubernetes-plain.colored,.devicon-kubernetes-plain-wordmark.colored,.devicon-kubernetes-line.colored,.devicon-kubernetes-line-wordmark.colored{color:#326ce5}.devicon-labview-plain.colored,.devicon-labview-plain-wordmark.colored{color:#fed500}.devicon-laravel-original.colored,.devicon-laravel-original-wordmark.colored,.devicon-laravel-line.colored,.devicon-laravel-line-wordmark.colored,.devicon-laravel-plain.colored,.devicon-laravel-plain-wordmark.colored{color:#f0513f}.devicon-latex-original.colored,.devicon-latex-plain.colored{color:#000}.devicon-less-plain-wordmark.colored{color:#2a4d80}.devicon-linkedin-plain.colored,.devicon-linkedin-plain-wordmark.colored{color:#0076b2}.devicon-linux-plain.colored{color:#000}.devicon-liquibase-original-wordmark.colored,.devicon-liquibase-original.colored,.devicon-liquibase-plain.colored,.devicon-liquibase-plain-wordmark.colored{color:#ff3c00}.devicon-livewire-plain-wordmark.colored,.devicon-livewire-plain.colored{color:#fb70a9}.devicon-llvm-plain.colored{color:#5a90b6}.devicon-lodash-plain.colored{color:#000}.devicon-logstash-plain-wordmark.colored,.devicon-logstash-plain.colored{color:#fec514}.devicon-lua-plain.colored,.devicon-lua-line.colored,.devicon-lua-original-wordmark.colored,.devicon-lua-plain-wordmark.colored,.devicon-lua-line-wordmark.colored{color:navy}.devicon-lumen-original.colored,.devicon-lumen-plain.colored{color:#e54537}.devicon-magento-original.colored,.devicon-magento-plain-wordmark.colored,.devicon-magento-line.colored,.devicon-magento-line-wordmark.colored,.devicon-magento-plain.colored{color:#f26322}.devicon-mariadb-original.colored,.devicon-mariadb-original-wordmark.colored,.devicon-mariadb-plain.colored,.devicon-mariadb-plain-wordmark.colored{color:#003545}.devicon-markdown-original.colored,.devicon-markdown-plain.colored{color:#000}.devicon-materializecss-plain.colored{color:#eb7077}.devicon-materialui-plain.colored{color:#1fa6ca}.devicon-matlab-plain.colored,.devicon-matlab-line.colored{color:#6dd0c7}.devicon-matplotlib-plain.colored,.devicon-matplotlib-plain-wordmark.colored{color:#11557c}.devicon-maven-plain.colored,.devicon-maven-plain-wordmark.colored{color:#e97826}.devicon-maya-plain.colored,.devicon-maya-plain-wordmark.colored{color:#149b9a}.devicon-meteor-plain.colored,.devicon-meteor-plain-wordmark.colored{color:#df5052}.devicon-microsoftsqlserver-plain.colored,.devicon-microsoftsqlserver-plain-wordmark.colored,.devicon-microsoftsqlserver-line.colored,.devicon-microsoftsqlserver-line-wordmark.colored{color:#ee352c}.devicon-minitab-plain.colored{color:#8dc63f}.devicon-mithril-original.colored,.devicon-mithril-line.colored,.devicon-mithril-plain.colored{color:#010002}.devicon-mobx-plain.colored{color:#e05e11}.devicon-mocha-plain.colored{color:#8d6748}.devicon-modx-plain.colored,.devicon-modx-plain-wordmark.colored{color:#00decc}.devicon-moleculer-original.colored,.devicon-moleculer-original-wordmark.colored,.devicon-moleculer-plain.colored,.devicon-moleculer-plain-wordmark.colored{color:#3cafce}.devicon-mongodb-plain.colored,.devicon-mongodb-plain-wordmark.colored{color:#4faa41}.devicon-mongoose-original.colored,.devicon-mongoose-original-wordmark.colored{color:#860000}.devicon-moodle-plain.colored,.devicon-moodle-plain-wordmark.colored{color:#f7931e}.devicon-msdos-plain.colored,.devicon-msdos-line.colored{color:#000}.devicon-mysql-original.colored,.devicon-mysql-plain-wordmark.colored,.devicon-mysql-plain.colored{color:#00618a}.devicon-nano-plain.colored,.devicon-nano-plain-wordmark.colored{color:#c8f}.devicon-neo4j-plain.colored,.devicon-neo4j-plain-wordmark.colored{color:#018bff}.devicon-neovim-plain.colored,.devicon-neovim-plain-wordmark.colored,.devicon-neovim-line.colored,.devicon-neovim-line-wordmark.colored{color:#5fb950}.devicon-nestjs-original.colored,.devicon-nestjs-original-wordmark.colored,.devicon-nestjs-line.colored,.devicon-nestjs-line-wordmark.colored,.devicon-nestjs-plain.colored,.devicon-nestjs-plain-wordmark.colored{color:#df234f}.devicon-netlify-plain.colored,.devicon-netlify-plain-wordmark.colored{color:#05bdba}.devicon-networkx-plain.colored,.devicon-networkx-plain-wordmark.colored,.devicon-networkx-line.colored,.devicon-networkx-line-wordmark.colored{color:#2c7fb8}.devicon-nextjs-original-wordmark.colored,.devicon-nextjs-plain.colored,.devicon-nextjs-line.colored,.devicon-nextjs-line-wordmark.colored,.devicon-nextjs-plain-wordmark.colored{color:#000}.devicon-nginx-original.colored,.devicon-nginx-original-wordmark.colored,.devicon-nginx-plain.colored,.devicon-nginx-plain-wordmark.colored{color:#090}.devicon-ngrx-plain.colored{color:#412846}.devicon-nhibernate-plain-wordmark.colored,.devicon-nhibernate-plain.colored,.devicon-nhibernate-line.colored,.devicon-nhibernate-line-wordmark.colored{color:#903a36}.devicon-nim-plain.colored,.devicon-nim-plain-wordmark.colored,.devicon-nim-line.colored,.devicon-nim-line-wordmark.colored{color:#ffe953}.devicon-nimble-plain.colored{color:#f7e941}.devicon-nixos-plain.colored,.devicon-nixos-plain-wordmark.colored{color:#5277c3}.devicon-nodejs-plain.colored,.devicon-nodejs-plain-wordmark.colored,.devicon-nodejs-line.colored,.devicon-nodejs-line-wordmark.colored{color:#5fa04e}.devicon-nodemon-plain.colored,.devicon-nodemon-line.colored{color:#76d04b}.devicon-nodewebkit-plain.colored,.devicon-nodewebkit-plain-wordmark.colored,.devicon-nodewebkit-line.colored,.devicon-nodewebkit-line-wordmark.colored{color:#3d3b47}.devicon-nomad-original.colored,.devicon-nomad-plain-wordmark.colored,.devicon-nomad-plain.colored{color:#00ca8e}.devicon-norg-plain.colored{color:#4878be}.devicon-notion-plain.colored,.devicon-notion-line.colored{color:#fff}.devicon-npm-original-wordmark.colored{color:#cb3837}.devicon-nuget-original.colored,.devicon-nuget-original-wordmark.colored{color:#004880}.devicon-numpy-plain.colored,.devicon-numpy-plain-wordmark.colored,.devicon-numpy-line.colored,.devicon-numpy-line-wordmark.colored{color:#4dabcf}.devicon-nuxtjs-plain.colored,.devicon-nuxtjs-plain-wordmark.colored{color:#00c48d}.devicon-oauth-plain.colored,.devicon-oauth-original-wordmark.colored,.devicon-oauth-plain-wordmark.colored{color:#000}.devicon-objectivec-plain.colored{color:#0b5a9d}.devicon-ocaml-plain.colored,.devicon-ocaml-plain-wordmark.colored{color:#f18803}.devicon-ohmyzsh-plain.colored{color:#000}.devicon-okta-plain.colored,.devicon-okta-plain-wordmark.colored{color:#0f82c2}.devicon-openal-plain.colored{color:#7e000d}.devicon-openapi-plain.colored,.devicon-openapi-plain-wordmark.colored,.devicon-openapi-line.colored,.devicon-openapi-line-wordmark.colored{color:#91d400}.devicon-opencl-plain.colored,.devicon-opencl-line.colored,.devicon-opencl-original-wordmark.colored,.devicon-opencl-plain-wordmark.colored,.devicon-opencl-line-wordmark.colored{color:#000}.devicon-opencv-plain.colored,.devicon-opencv-plain-wordmark.colored{color:#128dff}.devicon-opengl-plain.colored{color:#5586a4}.devicon-openstack-original.colored,.devicon-openstack-plain-wordmark.colored,.devicon-openstack-plain.colored{color:#ed1944}.devicon-opensuse-original.colored,.devicon-opensuse-original-wordmark.colored,.devicon-opensuse-plain.colored,.devicon-opensuse-plain-wordmark.colored{color:#73ba25}.devicon-opentelemetry-plain.colored,.devicon-opentelemetry-plain-wordmark.colored{color:#f5a800}.devicon-opera-plain.colored,.devicon-opera-plain-wordmark.colored{color:#f7192d}.devicon-oracle-original.colored,.devicon-oracle-plain.colored{color:#ea1b22}.devicon-ory-original.colored,.devicon-ory-original-wordmark.colored,.devicon-ory-plain.colored,.devicon-ory-plain-wordmark.colored{color:#5528ff}.devicon-p5js-original.colored,.devicon-p5js-plain.colored,.devicon-p5js-original-wordmark.colored,.devicon-p5js-plain-wordmark.colored{color:#ed225d}.devicon-packer-plain.colored,.devicon-packer-plain-wordmark.colored,.devicon-packer-line.colored,.devicon-packer-line-wordmark.colored{color:#1d94dd}.devicon-pandas-plain.colored,.devicon-pandas-plain-wordmark.colored,.devicon-pandas-line.colored,.devicon-pandas-line-wordmark.colored{color:#130754}.devicon-perl-plain.colored{color:#212177}.devicon-pfsense-original.colored,.devicon-pfsense-original-wordmark.colored,.devicon-pfsense-plain.colored,.devicon-pfsense-plain-wordmark.colored{color:#000}.devicon-phalcon-plain.colored{color:#76c39b}.devicon-phoenix-original.colored,.devicon-phoenix-plain-wordmark.colored,.devicon-phoenix-plain.colored{color:#fd4f00}.devicon-photonengine-plain.colored,.devicon-photonengine-original-wordmark.colored,.devicon-photonengine-plain-wordmark.colored{color:#004480}.devicon-photoshop-plain.colored,.devicon-photoshop-line.colored{color:#001e36}.devicon-php-plain.colored{color:#777bb3}.devicon-phpstorm-plain.colored,.devicon-phpstorm-plain-wordmark.colored{color:#b74af7}.devicon-playwright-plain.colored{color:#2ead33}.devicon-plotly-plain.colored,.devicon-plotly-plain-wordmark.colored{color:#3d4c73}.devicon-pnpm-plain.colored,.devicon-pnpm-plain-wordmark.colored{color:#f9ad00}.devicon-podman-plain.colored,.devicon-podman-plain-wordmark.colored{color:#892ca0}.devicon-poetry-plain.colored{color:#0080c5}.devicon-polygon-plain.colored,.devicon-polygon-plain-wordmark.colored{color:#7950dd}.devicon-portainer-original.colored,.devicon-portainer-original-wordmark.colored,.devicon-portainer-plain.colored,.devicon-portainer-plain-wordmark.colored{color:#3bbced}.devicon-postcss-original.colored,.devicon-postcss-plain-wordmark.colored,.devicon-postcss-plain.colored{color:#dd3a0a}.devicon-postgresql-plain.colored,.devicon-postgresql-plain-wordmark.colored{color:#336791}.devicon-postman-plain.colored,.devicon-postman-plain-wordmark.colored{color:#f37036}.devicon-powershell-plain.colored{color:#1e2a3a}.devicon-premierepro-plain.colored{color:#2a0634}.devicon-prisma-original.colored,.devicon-prisma-original-wordmark.colored,.devicon-prisma-plain.colored,.devicon-prisma-plain-wordmark.colored{color:#2d3748}.devicon-processing-plain.colored,.devicon-processing-plain-wordmark.colored{color:#000}.devicon-prolog-plain.colored,.devicon-prolog-plain-wordmark.colored{color:#f46c30}.devicon-prometheus-original.colored,.devicon-prometheus-plain-wordmark.colored,.devicon-prometheus-line.colored,.devicon-prometheus-line-wordmark.colored,.devicon-prometheus-plain.colored{color:#e75225}.devicon-protractor-plain.colored,.devicon-protractor-plain-wordmark.colored,.devicon-protractor-line.colored,.devicon-protractor-line-wordmark.colored{color:#d51c2f}.devicon-pulsar-original.colored,.devicon-pulsar-original-wordmark.colored,.devicon-pulsar-plain.colored,.devicon-pulsar-plain-wordmark.colored{color:#2c3e50}.devicon-pulumi-plain.colored,.devicon-pulumi-plain-wordmark.colored{color:#f6bf29}.devicon-puppeteer-plain.colored,.devicon-puppeteer-original-wordmark.colored,.devicon-puppeteer-plain-wordmark.colored{color:#00d8a2}.devicon-purescript-original.colored,.devicon-purescript-original-wordmark.colored{color:#14161a}.devicon-putty-plain.colored{color:#0000fc}.devicon-pycharm-plain.colored,.devicon-pycharm-plain-wordmark.colored{color:#21d789}.devicon-pypi-plain.colored,.devicon-pypi-plain-wordmark.colored{color:#3775a9}.devicon-pyscript-plain-wordmark.colored{color:#fda703}.devicon-pytest-plain.colored,.devicon-pytest-plain-wordmark.colored{color:#009fe3}.devicon-python-plain.colored,.devicon-python-plain-wordmark.colored{color:#ffd845}.devicon-pytorch-original.colored,.devicon-pytorch-plain-wordmark.colored,.devicon-pytorch-plain.colored{color:#ee4c2c}.devicon-qodana-plain.colored,.devicon-qodana-plain-wordmark.colored{color:#ff318c}.devicon-qt-original.colored,.devicon-qt-plain.colored{color:#41cd52}.devicon-quarkus-plain.colored,.devicon-quarkus-plain-wordmark.colored{color:#4695eb}.devicon-quasar-plain-wordmark.colored,.devicon-quasar-plain.colored{color:#00b4ff}.devicon-qwik-plain.colored,.devicon-qwik-plain-wordmark.colored{color:#18b6f6}.devicon-r-plain.colored,.devicon-r-line.colored{color:#1f65b7}.devicon-rabbitmq-original.colored,.devicon-rabbitmq-plain-wordmark.colored,.devicon-rabbitmq-plain.colored{color:#f60}.devicon-rails-plain.colored,.devicon-rails-plain-wordmark.colored{color:#c00}.devicon-railway-original.colored,.devicon-railway-original-wordmark.colored,.devicon-railway-line.colored,.devicon-railway-line-wordmark.colored,.devicon-railway-plain.colored,.devicon-railway-plain-wordmark.colored{color:#fff}.devicon-rancher-original.colored,.devicon-rancher-plain-wordmark.colored,.devicon-rancher-line.colored,.devicon-rancher-line-wordmark.colored,.devicon-rancher-plain.colored{color:#2453ff}.devicon-raspberrypi-plain.colored,.devicon-raspberrypi-plain-wordmark.colored,.devicon-raspberrypi-line.colored,.devicon-raspberrypi-line-wordmark.colored{color:#c51850}.devicon-reach-plain.colored{color:#6ac6e7}.devicon-react-original.colored,.devicon-react-original-wordmark.colored,.devicon-react-plain.colored,.devicon-react-plain-wordmark.colored{color:#61dafb}.devicon-reactbootstrap-original.colored,.devicon-reactbootstrap-plain.colored{color:#41e0fd}.devicon-reactnavigation-original.colored,.devicon-reactnavigation-plain.colored{color:#7b61c1}.devicon-readthedocs-original.colored,.devicon-readthedocs-original-wordmark.colored,.devicon-readthedocs-line.colored,.devicon-readthedocs-plain.colored,.devicon-readthedocs-plain-wordmark.colored{color:#32322a}.devicon-realm-plain.colored,.devicon-realm-plain-wordmark.colored{color:#6e60f9}.devicon-rect-plain.colored{color:#262626}.devicon-redhat-plain.colored,.devicon-redhat-plain-wordmark.colored{color:#e93442}.devicon-redis-plain.colored,.devicon-redis-plain-wordmark.colored{color:#d82c20}.devicon-redux-original.colored,.devicon-redux-plain.colored{color:#764abc}.devicon-renpy-plain.colored{color:#ff7f7f}.devicon-replit-original.colored,.devicon-replit-plain-wordmark.colored,.devicon-replit-plain.colored{color:#f26207}.devicon-rider-plain.colored,.devicon-rider-plain-wordmark.colored{color:#dd1265}.devicon-rocksdb-plain.colored,.devicon-rocksdb-line.colored{color:#ffbe00}.devicon-rockylinux-original.colored,.devicon-rockylinux-plain-wordmark.colored,.devicon-rockylinux-plain.colored{color:#10b982}.devicon-rollup-plain.colored,.devicon-rollup-plain-wordmark.colored,.devicon-rollup-line.colored,.devicon-rollup-line-wordmark.colored{color:#f33}.devicon-ros-original.colored,.devicon-ros-original-wordmark.colored{color:#21304c}.devicon-rspec-plain.colored,.devicon-rspec-plain-wordmark.colored,.devicon-rspec-line.colored,.devicon-rspec-line-wordmark.colored{color:#6de1fa}.devicon-rstudio-plain.colored{color:#75aadb}.devicon-ruby-plain.colored,.devicon-ruby-plain-wordmark.colored{color:#d91404}.devicon-rubymine-plain.colored,.devicon-rubymine-plain-wordmark.colored{color:#fc801d}.devicon-rust-original.colored,.devicon-rust-line.colored,.devicon-rust-plain.colored{color:#000}.devicon-rxjs-plain.colored{color:#df1c85}.devicon-safari-plain.colored,.devicon-safari-plain-wordmark.colored,.devicon-safari-line-wordmark.colored,.devicon-safari-line.colored{color:#1b88ca}.devicon-salesforce-plain.colored{color:#00a1e0}.devicon-sanity-plain.colored{color:#f03e2f}.devicon-sass-original.colored,.devicon-sass-plain.colored{color:#c69}.devicon-scala-plain.colored,.devicon-scala-plain-wordmark.colored{color:#de3423}.devicon-scalingo-plain.colored,.devicon-scalingo-plain-wordmark.colored,.devicon-scalingo-line.colored,.devicon-scalingo-line-wordmark.colored{color:#173aee}.devicon-scikitlearn-plain.colored,.devicon-scikitlearn-line.colored,.devicon-scikitlearn-original-wordmark.colored,.devicon-scikitlearn-plain-wordmark.colored,.devicon-scikitlearn-line-wordmark.colored{color:#f89939}.devicon-sdl-plain.colored{color:#173354}.devicon-selenium-original.colored,.devicon-selenium-plain.colored{color:#cf0a2c}.devicon-sema-original.colored,.devicon-sema-original-wordmark.colored,.devicon-sema-plain.colored,.devicon-sema-plain-wordmark.colored{color:#000}.devicon-sentry-original.colored,.devicon-sentry-original-wordmark.colored,.devicon-sentry-plain.colored,.devicon-sentry-plain-wordmark.colored{color:#362d59}.devicon-reactrouter-plain.colored,.devicon-reactrouter-plain-wordmark.colored{color:#f44250}.devicon-sequelize-plain.colored,.devicon-sequelize-plain-wordmark.colored{color:#3b4b72}.devicon-shopware-original.colored,.devicon-shopware-original-wordmark.colored{color:#179eff}.devicon-shotgrid-plain.colored,.devicon-shotgrid-original-wordmark.colored,.devicon-shotgrid-plain-wordmark.colored{color:#000}.devicon-sketch-plain.colored,.devicon-sketch-plain-wordmark.colored,.devicon-sketch-line.colored,.devicon-sketch-line-wordmark.colored{color:#fdad00}.devicon-slack-plain.colored,.devicon-slack-plain-wordmark.colored{color:#2d333a}.devicon-socketio-original.colored,.devicon-socketio-original-wordmark.colored,.devicon-socketio-plain.colored,.devicon-socketio-plain-wordmark.colored{color:#010101}.devicon-solidity-plain.colored{color:#383838}.devicon-solidjs-plain.colored,.devicon-solidjs-plain-wordmark.colored{color:#2c4f7c}.devicon-sonarqube-original.colored,.devicon-sonarqube-plain-wordmark.colored,.devicon-sonarqube-line.colored,.devicon-sonarqube-line-wordmark.colored,.devicon-sonarqube-plain.colored{color:#549dd0}.devicon-sourcetree-original.colored,.devicon-sourcetree-original-wordmark.colored,.devicon-sourcetree-plain.colored,.devicon-sourcetree-plain-wordmark.colored{color:#205081}.devicon-spack-plain.colored{color:#0f3a80}.devicon-splunk-original-wordmark.colored,.devicon-splunk-plain-wordmark.colored{color:#0c1724}.devicon-spring-original.colored,.devicon-spring-original-wordmark.colored,.devicon-spring-plain.colored,.devicon-spring-plain-wordmark.colored{color:#5fb832}.devicon-spss-plain.colored{color:#cc1e4c}.devicon-spyder-plain.colored,.devicon-spyder-plain-wordmark.colored{color:#8c0000}.devicon-sqlalchemy-plain.colored,.devicon-sqlalchemy-plain-wordmark.colored{color:#333}.devicon-sqldeveloper-plain.colored{color:#adadad}.devicon-sqlite-plain.colored,.devicon-sqlite-plain-wordmark.colored{color:#0f80cc}.devicon-ssh-original.colored,.devicon-ssh-original-wordmark.colored,.devicon-ssh-plain.colored,.devicon-ssh-plain-wordmark.colored{color:#231f20}.devicon-stackoverflow-plain.colored,.devicon-stackoverflow-plain-wordmark.colored,.devicon-stackoverflow-line.colored,.devicon-stackoverflow-line-wordmark.colored{color:#f58025}.devicon-stata-original-wordmark.colored,.devicon-stata-plain-wordmark.colored{color:#195f92}.devicon-storybook-plain.colored,.devicon-storybook-plain-wordmark.colored{color:#ff4785}.devicon-streamlit-plain.colored,.devicon-streamlit-plain-wordmark.colored{color:#7d353b}.devicon-stylus-original.colored{color:#333}.devicon-subversion-original.colored,.devicon-subversion-plain-wordmark.colored,.devicon-subversion-plain.colored{color:#809cc8}.devicon-supabase-plain.colored,.devicon-supabase-plain-wordmark.colored{color:#3ecf8e}.devicon-svelte-plain.colored,.devicon-svelte-plain-wordmark.colored{color:#ff3e00}.devicon-swagger-plain.colored,.devicon-swagger-plain-wordmark.colored{color:#85ea2d}.devicon-swift-plain.colored,.devicon-swift-plain-wordmark.colored{color:#f05138}.devicon-swiper-original.colored,.devicon-swiper-plain.colored{color:#0080ff}.devicon-symfony-original.colored,.devicon-symfony-original-wordmark.colored,.devicon-symfony-plain.colored,.devicon-symfony-plain-wordmark.colored{color:#1a171b}.devicon-tailwindcss-original.colored,.devicon-tailwindcss-plain-wordmark.colored,.devicon-tailwindcss-plain.colored{color:#38bdf8}.devicon-tauri-plain.colored,.devicon-tauri-plain-wordmark.colored{color:#ffc131}.devicon-tensorflow-original.colored,.devicon-tensorflow-original-wordmark.colored,.devicon-tensorflow-line.colored,.devicon-tensorflow-line-wordmark.colored{color:#ff6f00}.devicon-terraform-plain.colored,.devicon-terraform-plain-wordmark.colored{color:#5c4ee5}.devicon-tex-original.colored,.devicon-tex-original-wordmark.colored,.devicon-tex-plain.colored,.devicon-tex-plain-wordmark.colored{color:#000}.devicon-thealgorithms-plain.colored,.devicon-thealgorithms-plain-wordmark.colored{color:#00bcb4}.devicon-threejs-original.colored,.devicon-threejs-original-wordmark.colored{color:#000}.devicon-titaniumsdk-original.colored,.devicon-titaniumsdk-plain.colored{color:#bd222b}.devicon-tomcat-line.colored,.devicon-tomcat-line-wordmark.colored{color:#d1a41a}.devicon-tortoisegit-plain.colored,.devicon-tortoisegit-line.colored{color:#4b8eb4}.devicon-towergit-plain.colored,.devicon-towergit-plain-wordmark.colored{color:#d18900}.devicon-traefikmesh-original.colored,.devicon-traefikmesh-plain-wordmark.colored,.devicon-traefikmesh-line.colored,.devicon-traefikmesh-line-wordmark.colored,.devicon-traefikmesh-plain.colored{color:#9d0fb0}.devicon-traefikproxy-original.colored,.devicon-traefikproxy-plain-wordmark.colored,.devicon-traefikproxy-line.colored,.devicon-traefikproxy-line-wordmark.colored,.devicon-traefikproxy-plain.colored{color:#24a1c1}.devicon-travis-plain.colored,.devicon-travis-plain-wordmark.colored,.devicon-travis-line.colored,.devicon-travis-line-wordmark.colored{color:#2d3136}.devicon-trello-plain.colored,.devicon-trello-plain-wordmark.colored,.devicon-trello-line.colored,.devicon-trello-line-wordmark.colored{color:#0052cc}.devicon-trpc-plain.colored,.devicon-trpc-plain-wordmark.colored{color:#398ccb}.devicon-twitter-original.colored,.devicon-twitter-plain.colored{color:#000}.devicon-typescript-plain.colored,.devicon-typescript-original.colored{color:#007acc}.devicon-typo3-original.colored,.devicon-typo3-plain-wordmark.colored,.devicon-typo3-line.colored,.devicon-typo3-line-wordmark.colored,.devicon-typo3-plain.colored{color:#f49700}.devicon-ubuntu-plain.colored,.devicon-ubuntu-plain-wordmark.colored{color:#e95420}.devicon-unifiedmodelinglanguage-plain.colored,.devicon-unifiedmodelinglanguage-plain-wordmark.colored{color:#452e7f}.devicon-unity-plain.colored,.devicon-unity-plain-wordmark.colored,.devicon-unity-line.colored,.devicon-unity-line-wordmark.colored{color:#4d4d4d}.devicon-unix-original.colored{color:#4051b5}.devicon-unrealengine-original.colored,.devicon-unrealengine-original-wordmark.colored,.devicon-unrealengine-plain.colored,.devicon-unrealengine-plain-wordmark.colored{color:#000}.devicon-uwsgi-plain.colored{color:#bad05e}.devicon-v8-plain.colored,.devicon-v8-original-wordmark.colored,.devicon-v8-plain-wordmark.colored{color:#00c4cc}.devicon-vagrant-plain.colored,.devicon-vagrant-plain-wordmark.colored{color:#127eff}.devicon-vala-plain.colored,.devicon-vala-plain-wordmark.colored{color:#a56de2}.devicon-vault-original.colored,.devicon-vault-plain-wordmark.colored,.devicon-vault-plain.colored{color:#ffd814}.devicon-vercel-original.colored,.devicon-vercel-original-wordmark.colored,.devicon-vercel-line.colored,.devicon-vercel-line-wordmark.colored,.devicon-vercel-plain.colored,.devicon-vercel-plain-wordmark.colored{color:#000}.devicon-vertx-plain.colored,.devicon-vertx-plain-wordmark.colored,.devicon-vertx-line.colored,.devicon-vertx-line-wordmark.colored{color:#782a91}.devicon-vim-plain.colored{color:#179a33}.devicon-visualbasic-plain.colored,.devicon-visualbasic-line.colored{color:#004e8c}.devicon-visualstudio-plain.colored,.devicon-visualstudio-line.colored{color:#52218a}.devicon-vite-original.colored,.devicon-vite-original-wordmark.colored,.devicon-vite-plain.colored,.devicon-vite-plain-wordmark.colored{color:#006bff}.devicon-vitejs-plain.colored{color:#ffdd35}.devicon-vitess-plain.colored,.devicon-vitess-plain-wordmark.colored{color:#f16827}.devicon-vitest-plain.colored{color:#fcc72b}.devicon-vscode-plain.colored,.devicon-vscode-plain-wordmark.colored{color:#3c99d4}.devicon-vsphere-plain.colored,.devicon-vsphere-plain-wordmark.colored,.devicon-vsphere-line.colored,.devicon-vsphere-line-wordmark.colored{color:#0091da}.devicon-vuejs-plain.colored,.devicon-vuejs-plain-wordmark.colored,.devicon-vuejs-line.colored,.devicon-vuejs-line-wordmark.colored{color:#41b883}.devicon-vuestorefront-plain.colored{color:#5ecf7b}.devicon-vuetify-line.colored,.devicon-vuetify-plain.colored{color:#1697f6}.devicon-vyper-plain.colored,.devicon-vyper-plain-wordmark.colored{color:#000}.devicon-wasm-original.colored,.devicon-wasm-plain-wordmark.colored,.devicon-wasm-plain.colored{color:#654ff0}.devicon-webflow-original.colored{color:#4353ff}.devicon-weblate-plain.colored,.devicon-weblate-plain-wordmark.colored{color:#2eccaa}.devicon-webpack-plain.colored,.devicon-webpack-plain-wordmark.colored{color:#1c78c0}.devicon-webstorm-plain.colored,.devicon-webstorm-plain-wordmark.colored{color:#07c3f2}.devicon-windows11-original.colored,.devicon-windows11-original-wordmark.colored,.devicon-windows11-plain.colored,.devicon-windows11-plain-wordmark.colored{color:#0078d4}.devicon-windows8-original.colored,.devicon-windows8-original-wordmark.colored,.devicon-windows8-plain.colored,.devicon-windows8-plain-wordmark.colored{color:#00adef}.devicon-woocommerce-plain.colored,.devicon-woocommerce-plain-wordmark.colored{color:#7f54b3}.devicon-wordpress-plain.colored,.devicon-wordpress-plain-wordmark.colored{color:#494949}.devicon-xamarin-original.colored,.devicon-xamarin-original-wordmark.colored,.devicon-xamarin-plain.colored,.devicon-xamarin-plain-wordmark.colored{color:#3498db}.devicon-xcode-plain.colored{color:#069cec}.devicon-xd-plain.colored,.devicon-xd-line.colored{color:#470137}.devicon-xml-plain.colored,.devicon-xml-line.colored,.devicon-xml-original-wordmark.colored,.devicon-xml-plain-wordmark.colored,.devicon-xml-line-wordmark.colored{color:#005fad}.devicon-yaml-plain.colored,.devicon-yaml-original-wordmark.colored,.devicon-yaml-plain-wordmark.colored{color:#cb171e}.devicon-yarn-original.colored,.devicon-yarn-original-wordmark.colored,.devicon-yarn-line.colored,.devicon-yarn-line-wordmark.colored,.devicon-yarn-plain.colored,.devicon-yarn-plain-wordmark.colored{color:#2c8ebb}.devicon-yii-plain.colored,.devicon-yii-plain-wordmark.colored{color:#40b3d8}.devicon-yugabytedb-plain.colored,.devicon-yugabytedb-plain-wordmark.colored{color:#ff5f3b}.devicon-yunohost-plain.colored{color:#fff}.devicon-zend-original.colored,.devicon-zend-original-wordmark.colored,.devicon-zend-line.colored,.devicon-zend-line-wordmark.colored,.devicon-zend-plain.colored,.devicon-zend-plain-wordmark.colored{color:#68b604}.devicon-zig-original.colored,.devicon-zig-plain-wordmark.colored,.devicon-zig-plain.colored{color:#f7a41d} \ No newline at end of file diff --git a/static/css/main.css b/static/css/main.css new file mode 100644 index 0000000..6c4a4e9 --- /dev/null +++ b/static/css/main.css @@ -0,0 +1 @@ +.btn,input[type=submit]{backface-visibility:hidden;-webkit-backface-visibility:hidden;-ms-backface-visibility:hidden;-moz-backface-visibility:hidden;-o-backface-visibility:hidden;transition:all 350ms ease;-webkit-transition:all 350ms ease;-ms-transition:all 350ms ease;-moz-transition:all 350ms ease;-o-transition:all 350ms ease;background-color:rgba(0,0,0,0);border:0;border-radius:5px;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:"Consolas",monospace;font-size:1.2rem;font-weight:500;height:2.7rem;line-height:38px;margin:.5em;padding:0 2rem;text-align:center;text-decoration:none;white-space:nowrap}.btn.pomegranate,input[type=submit].pomegranate{background-color:#c0392b;filter:drop-shadow(5px 5px 0 rgba(192, 57, 43, 0.6))}.btn.pomegranate:hover,input[type=submit].pomegranate:hover{filter:drop-shadow(5px 5px 0 rgba(192, 57, 43, 0.6)) brightness(50%)}.btn.discord,input[type=submit].discord{background-color:#5865f2;filter:drop-shadow(5px 5px 0 rgba(114, 137, 218, 0.6))}.btn.discord:hover,input[type=submit].discord:hover{filter:drop-shadow(5px 5px 0 rgba(114, 137, 218, 0.6)) brightness(50%)}.btn.github,input[type=submit].github{background-color:#292d32;filter:drop-shadow(5px 5px 0 rgba(41, 45, 50, 0.6))}.btn.github:hover,input[type=submit].github:hover{filter:drop-shadow(5px 5px 0 rgba(41, 45, 50, 0.6)) brightness(50%)}.btn:hover,input[type=submit]:hover{transition:all 350ms ease;-webkit-transition:all 350ms ease;-ms-transition:all 350ms ease;-moz-transition:all 350ms ease;-o-transition:all 350ms ease;color:#fff}.btn.animation,input[type=submit].animation{animation:button-enter 1s ease-in-out forwards;-webkit-animation:button-enter 1s ease-in-out forwards;-ms-animation:button-enter 1s ease-in-out forwards;-moz-animation:button-enter 1s ease-in-out forwards;-o-animation:button-enter 1s ease-in-out forwards;opacity:0;position:relative}.btn.animation:nth-child(1),input[type=submit].animation:nth-child(1){animation-delay:.25s}.btn.animation:nth-child(2),input[type=submit].animation:nth-child(2){animation-delay:.5s}.btn.animation:nth-child(3),input[type=submit].animation:nth-child(3){animation-delay:.75s}.btn.animation:nth-child(4),input[type=submit].animation:nth-child(4){animation-delay:1s}.btn.animation:nth-child(5),input[type=submit].animation:nth-child(5){animation-delay:1.25s}.btn.animation:nth-child(6),input[type=submit].animation:nth-child(6){animation-delay:1.5s}.btn.animation:nth-child(7),input[type=submit].animation:nth-child(7){animation-delay:1.75s}.btn.animation:nth-child(8),input[type=submit].animation:nth-child(8){animation-delay:2s}.btn.animation:nth-child(9),input[type=submit].animation:nth-child(9){animation-delay:2.25s}.btn.animation:nth-child(10),input[type=submit].animation:nth-child(10){animation-delay:2.5s}.btn.animation:nth-child(11),input[type=submit].animation:nth-child(11){animation-delay:2.75s}.btn.animation:nth-child(12),input[type=submit].animation:nth-child(12){animation-delay:3s}.btn.animation:nth-child(13),input[type=submit].animation:nth-child(13){animation-delay:3.25s}.btn.animation:nth-child(14),input[type=submit].animation:nth-child(14){animation-delay:3.5s}.btn.animation:nth-child(15),input[type=submit].animation:nth-child(15){animation-delay:3.75s}.btn.hover,input[type=submit].hover{transition:all 350ms ease;-webkit-transition:all 350ms ease;-ms-transition:all 350ms ease;-moz-transition:all 350ms ease;-o-transition:all 350ms ease}.btn.hover:hover,input[type=submit].hover:hover{transform:translateY(-0.5em);-webkit-transform:translateY(-0.5em);-ms-transform:translateY(-0.5em);-moz-transform:translateY(-0.5em);-o-transform:translateY(-0.5em)}.btn.midnight-blue,input[type=submit].midnight-blue{background-color:#2c3e50;filter:drop-shadow(5px 5px 0 rgba(44, 62, 80, 0.6))}.btn.midnight-blue:hover,input[type=submit].midnight-blue:hover{filter:drop-shadow(5px 5px 0 rgba(44, 62, 80, 0.6)) brightness(50%)}@-webkit-keyframes button-enter{from{opacity:0;top:2em}70%{top:-0.3em}100%{opacity:1;top:0}}@-moz-keyframes button-enter{from{opacity:0;top:2em}70%{top:-0.3em}100%{opacity:1;top:0}}@-o-keyframes button-enter{from{opacity:0;top:2em}70%{top:-0.3em}100%{opacity:1;top:0}}@keyframes button-enter{from{opacity:0;top:2em}70%{top:-0.3em}100%{opacity:1;top:0}}.buttons{align-items:center;justify-content:center;text-align:center}canvas{display:block}#particles-js{position:fixed;width:100%;height:100%;pointer-events:none;z-index:-10}.particle-content{position:absolute;top:50%;right:50%;transform:translate(50%, -50%);width:100%;color:#fff;max-width:90%;padding:2em 3em;background:rgba(0,0,0,.4);text-shadow:0px 0px 2px #131415}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row.main .logo{margin-top:1.8rem;border-radius:2.5%}.row.main .name{margin-top:1rem}.row.main .title{margin-left:3%;color:#ccc;font-style:italic;font-size:1.5rem !important}@media(min-width: 768px){.container{width:95%}}@media(min-width: 992px){.container{width:85%}}@media(min-width: 1200px){.container{width:80%}}@media(min-width: 1800px){.container{width:100rem}}h2{font-size:3.5rem !important}h3{font-size:3.2rem !important}.sun{color:#f1c40f !important}.gray{color:#cacaca !important}.purple{color:#551a8b !important}.emerald{color:#2ecc71 !important}.center{text-align:center}.left{text-align:left}.right{text-align:right}.unselectable{user-select:none;-ms-user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}::-moz-selection{background-color:rgba(128,0,0,.3)}::selection{background-color:rgba(128,0,0,.3)}@font-face{font-family:"devicon";src:url("../font/devicon.eot");src:url("../font/devicon.eot?#iefix") format("embedded-opentype"),url("../font/devicon.woff") format("woff"),url("../font/devicon.ttf") format("truetype");font-weight:normal;font-style:normal;font-display:swap}[class*=devicon-]:before{display:inline-block;font-family:"devicon";font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-archlinux:before{content:"A"}.devicon-c:before{content:""}.devicon-rust:before{content:""}.devicon-python:before{content:""}.devicon-typescript:before{content:""}.devicon-elixir:before{content:""}.devicon-html5:before{content:""}.devicon-css3:before{content:""}.devicon-sass:before{content:""}.devicon-redis-plain:before{content:""}.devicon-postgresql-plain:before{content:""}.devicon-mongodb-plain:before{content:""}.devicon-cassandra-plain:before{content:""}.devicon-git-plain:before{content:""}.devicon-docker-plain:before{content:""}.devicon-archlinux-plain:before{content:""}.devicon-redhat-plain:before{content:""}.devicon-ubuntu-plain:before{content:""}.devicon-debian-plain:before{content:""}.footer{margin-top:25px;text-align:left;padding:5px;border-top:2px rgba(0,0,0,.6) solid;font-family:"Courier New",Courier,monospace;display:flex;justify-content:center}.footer .logo{width:100%;max-width:150px;margin:5px;border-radius:2.5%;filter:invert(35%) sepia(95%) saturate(435%) hue-rotate(131deg) brightness(94%) contrast(101%)}:root,[data-bs-theme=light]{--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-primary: #0d6efd;--bs-secondary: #6c757d;--bs-success: #198754;--bs-info: #0dcaf0;--bs-warning: #ffc107;--bs-danger: #dc3545;--bs-light: #f8f9fa;--bs-dark: #212529;--bs-primary-rgb: 13, 110, 253;--bs-secondary-rgb: 108, 117, 125;--bs-success-rgb: 25, 135, 84;--bs-info-rgb: 13, 202, 240;--bs-warning-rgb: 255, 193, 7;--bs-danger-rgb: 220, 53, 69;--bs-light-rgb: 248, 249, 250;--bs-dark-rgb: 33, 37, 41;--bs-primary-text-emphasis: #052c65;--bs-secondary-text-emphasis: #2b2f32;--bs-success-text-emphasis: #0a3622;--bs-info-text-emphasis: #055160;--bs-warning-text-emphasis: #664d03;--bs-danger-text-emphasis: #58151c;--bs-light-text-emphasis: #495057;--bs-dark-text-emphasis: #495057;--bs-primary-bg-subtle: #cfe2ff;--bs-secondary-bg-subtle: #e2e3e5;--bs-success-bg-subtle: #d1e7dd;--bs-info-bg-subtle: #cff4fc;--bs-warning-bg-subtle: #fff3cd;--bs-danger-bg-subtle: #f8d7da;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #9ec5fe;--bs-secondary-border-subtle: #c4c8cb;--bs-success-border-subtle: #a3cfbb;--bs-info-border-subtle: #9eeaf9;--bs-warning-border-subtle: #ffe69c;--bs-danger-border-subtle: #f1aeb5;--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family: var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #212529;--bs-body-color-rgb: 33, 37, 41;--bs-body-bg: #fff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb: 33, 37, 41;--bs-secondary-bg: #e9ecef;--bs-secondary-bg-rgb: 233, 236, 239;--bs-tertiary-color: rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb: 33, 37, 41;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #0d6efd;--bs-link-color-rgb: 13, 110, 253;--bs-link-decoration: underline;--bs-link-hover-color: #0a58ca;--bs-link-hover-color-rgb: 10, 88, 202;--bs-code-color: #d63384;--bs-highlight-color: #212529;--bs-highlight-bg: #fff3cd;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.375rem;--bs-border-radius-sm: 0.25rem;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(13, 110, 253, 0.25);--bs-form-valid-color: #198754;--bs-form-valid-border-color: #198754;--bs-form-invalid-color: #dc3545;--bs-form-invalid-border-color: #dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33, 37, 41;--bs-emphasis-color: #fff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b3035;--bs-tertiary-bg-rgb: 43, 48, 53;--bs-primary-text-emphasis: #6ea8fe;--bs-secondary-text-emphasis: #a7acb1;--bs-success-text-emphasis: #75b798;--bs-info-text-emphasis: #6edff6;--bs-warning-text-emphasis: #ffda6a;--bs-danger-text-emphasis: #ea868f;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #031633;--bs-secondary-bg-subtle: #161719;--bs-success-bg-subtle: #051b11;--bs-info-bg-subtle: #032830;--bs-warning-bg-subtle: #332701;--bs-danger-bg-subtle: #2c0b0e;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #084298;--bs-secondary-border-subtle: #41464b;--bs-success-border-subtle: #0f5132;--bs-info-border-subtle: #087990;--bs-warning-border-subtle: #997404;--bs-danger-border-subtle: #842029;--bs-light-border-subtle: #495057;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #6ea8fe;--bs-link-hover-color: #8bb9fe;--bs-link-color-rgb: 110, 168, 254;--bs-link-hover-color-rgb: 139, 185, 254;--bs-code-color: #e685b5;--bs-highlight-color: #dee2e6;--bs-highlight-bg: #664d03;--bs-border-color: #495057;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #75b798;--bs-form-valid-border-color: #75b798;--bs-form-invalid-color: #ea868f;--bs-form-invalid-border-color: #ea868f}*,*::before,*::after{box-sizing:border-box}@media(prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}h6,h5,h4,h3,h2,h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1{font-size:calc(1.375rem + 1.5vw)}@media(min-width: 1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + 0.6vw)}@media(min-width: 1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + 0.3vw)}@media(min-width: 1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:0.875em}mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:0.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.row{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(-1*var(--bs-gutter-y));margin-right:calc(-0.5*var(--bs-gutter-x));margin-left:calc(-0.5*var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x: 0}.g-0,.gy-0{--bs-gutter-y: 0}.g-1,.gx-1{--bs-gutter-x: 0.25rem}.g-1,.gy-1{--bs-gutter-y: 0.25rem}.g-2,.gx-2{--bs-gutter-x: 0.5rem}.g-2,.gy-2{--bs-gutter-y: 0.5rem}.g-3,.gx-3{--bs-gutter-x: 1rem}.g-3,.gy-3{--bs-gutter-y: 1rem}.g-4,.gx-4{--bs-gutter-x: 1.5rem}.g-4,.gy-4{--bs-gutter-y: 1.5rem}.g-5,.gx-5{--bs-gutter-x: 3rem}.g-5,.gy-5{--bs-gutter-y: 3rem}@media(min-width: 576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x: 0}.g-sm-0,.gy-sm-0{--bs-gutter-y: 0}.g-sm-1,.gx-sm-1{--bs-gutter-x: 0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y: 0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x: 0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y: 0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x: 3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y: 3rem}}@media(min-width: 768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x: 0}.g-md-0,.gy-md-0{--bs-gutter-y: 0}.g-md-1,.gx-md-1{--bs-gutter-x: 0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y: 0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x: 0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y: 0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x: 1rem}.g-md-3,.gy-md-3{--bs-gutter-y: 1rem}.g-md-4,.gx-md-4{--bs-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x: 3rem}.g-md-5,.gy-md-5{--bs-gutter-y: 3rem}}@media(min-width: 992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x: 0}.g-lg-0,.gy-lg-0{--bs-gutter-y: 0}.g-lg-1,.gx-lg-1{--bs-gutter-x: 0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y: 0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x: 0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y: 0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x: 3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y: 3rem}}@media(min-width: 1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x: 0}.g-xl-0,.gy-xl-0{--bs-gutter-y: 0}.g-xl-1,.gx-xl-1{--bs-gutter-x: 0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y: 0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x: 0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y: 0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x: 3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y: 3rem}}@media(min-width: 1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x: 0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y: 0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x: 0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y: 0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x: 3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y: 3rem}}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: var(--bs-body-bg);--bs-tooltip-bg: var(--bs-emphasis-color);--bs-tooltip-border-radius: var(--bs-border-radius);--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}:root{font-size:14px}p a,.projects a{font-weight:700;font-style:italic;text-decoration:none}p a:hover,.projects a:hover{color:maroon !important;transition:.2s color}p a:link,p a:visited,p a:active,.projects a:link,.projects a:visited,.projects a:active{color:teal}body{font-family:Helvetica,sans-serif !important;background-color:#2c2f33;background:url("../img/background.webp");color:#f5f5f5;line-height:1.4;font-size:1.2rem}.maincontent{z-index:1;padding-left:5%;padding-right:5%;min-width:350px;margin-top:1%;border:.5px rgba(0,0,0,.2) solid;border-radius:1%;background:rgba(5,5,5,.3)}.social-icons{margin:5px;position:relative}.icon_set a{color:#eee}.icon_set i{cursor:pointer;margin:0 5px;font-size:43px;transition:.3s color}.icon_set i{cursor:pointer;font-size:2.8rem;margin-right:4px} diff --git a/static/css/main.css.map b/static/css/main.css.map new file mode 100644 index 0000000..c7bb588 --- /dev/null +++ b/static/css/main.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../scss/_buttons.selected.scss","../scss/_particles.scss","../scss/_container.scss","../scss/_text.scss","../scss/_fonts.scss","../scss/_font_mfizz.part.scss","../scss/_footer.scss","../scss/bootstrap/_root.scss","../scss/bootstrap/vendor/_rfs.scss","../scss/bootstrap/mixins/_color-mode.scss","../scss/bootstrap/_reboot.scss","../scss/bootstrap/_variables.scss","../scss/bootstrap/mixins/_border-radius.scss","../scss/bootstrap/_grid.scss","../scss/bootstrap/mixins/_grid.scss","../scss/bootstrap/mixins/_breakpoints.scss","../scss/bootstrap/_transitions.scss","../scss/bootstrap/mixins/_transition.scss","../scss/bootstrap/_tooltip.scss","../scss/bootstrap/mixins/_reset-text.scss","../scss/main.scss"],"names":[],"mappings":"AAAA,wBAEE,2BACA,mCACA,+BACA,gCACA,8BACA,0BACA,kCACA,8BACA,+BACA,6BACA,+BACA,SACA,kBACA,sBACA,WACA,eACA,qBACA,iCACA,iBACA,gBACA,cACA,iBACA,YACA,eACA,kBACA,qBACA,mBAGF,gDAEE,yBACA,qDAGF,4DAEE,qEAGF,wCAEE,yBACA,uDAGF,oDAEE,uEAGF,sCAEE,yBACA,oDAGF,kDAEE,oEAGF,oCAEE,0BACA,kCACA,8BACA,+BACA,6BACA,WAGF,4CAEE,+CACA,uDACA,mDACA,oDACA,kDACA,UACA,kBAGF,sEAEE,qBAGF,sEAEE,oBAGF,sEAEE,qBAGF,sEAEE,mBAGF,sEAEE,sBAGF,sEAEE,qBAGF,sEAEE,sBAGF,sEAEE,mBAGF,sEAEE,sBAGF,wEAEE,qBAGF,wEAEE,sBAGF,wEAEE,mBAGF,wEAEE,sBAGF,wEAEE,qBAGF,wEAEE,sBAGF,oCAEE,0BACA,kCACA,8BACA,+BACA,6BAGF,gDAEE,6BACA,qCACA,iCACA,kCACA,gCAGF,oDAEE,yBACA,oDAGF,gEAEE,oEAGF,gCACE,KACE,UACA,QAGF,IACE,WAGF,KACE,UACA,OAIJ,6BACE,KACE,UACA,QAGF,IACE,WAGF,KACE,UACA,OAIJ,2BACE,KACE,UACA,QAGF,IACE,WAGF,KACE,UACA,OAIJ,wBACE,KACE,UACA,QAGF,IACE,WAGF,KACE,UACA,OAIJ,SACE,mBACA,uBACA,kBChQF,qBACA,cACE,eACA,WACA,YAGF,kBACE,kBACA,QACA,UACA,+BAEA,WACA,WACA,cACA,gBACA,0BACA,gCAGF,cACE,oBCtBF,WACE,mBACA,kBACA,kBACA,iBAKE,gBACE,gBACA,mBACA,+FAGF,gBACE,cAGF,iBACE,gBAKN,mDACA,iDACA,iDCzBA,GACE,4BAEF,GACE,4BAGF,KACE,yBAGF,MACE,yBAGF,QACE,yBAGF,SACE,yBAGF,QACE,kBAGF,MACE,gBAGF,OACE,iBAGF,cACE,iBACA,qBACA,sBACA,wBACA,yBACA,2BAGF,iBACE,iBA/CqB,iBAkDvB,YACE,iBAnDqB,4BCCrB,oBACA,oCACA,iOAIA,mBACA,kBACA,kBCTF,sBACC,qBACE,oBACA,kBACA,mBACA,cACA,mCACA,kCAEH,mCACA,mCACA,2BACA,mCACA,gCACA,8BACA,gCACA,gCACA,gCACA,gCACA,6BACA,4BACA,+BACA,iCACA,iCACA,+BACA,+BACA,gCACA,kCACA,gCACA,qCACA,iCACA,gCACA,+BACA,8BACA,8BACA,+BACA,gCCpCA,QACE,gBACA,gBACA,YACA,oCACA,4CAEA,cACE,WACA,gBACA,WACA,mBACA,+FCZJ,4BASI,mRAIA,+MAIA,yKAIA,8OAIA,iNAIA,yPAIA,yRAGF,8BACA,wBAMA,sNACA,0GACA,0FAOA,iDCiPI,oBALI,KD1OR,2BACA,2BAKA,yBACA,gCACA,mBACA,gCAEA,0BACA,iCAEA,6CACA,qCACA,2BACA,qCAEA,2CACA,oCACA,0BACA,oCAOA,yBACA,kCACA,gCAEA,+BACA,uCAMA,yBACA,2BAGA,uBACA,yBACA,2BACA,oDAEA,6BACA,+BACA,8BACA,4BACA,6BACA,oDACA,+BAGA,mDACA,4DACA,qDACA,4DAIA,+BACA,8BACA,gDAEA,mKE5GE,qBFkHA,kBAGA,yBACA,mCACA,sBACA,6BAEA,0BACA,uCAEA,gDACA,wCACA,2BACA,kCAEA,8CACA,uCACA,0BACA,iCAGE,iNAIA,yPAIA,yRAOF,yBACA,+BACA,mCACA,yCAEA,yBAEA,2BACA,yDG/JJ,qBAGE,sBAeE,8CANJ,MAOM,wBAcN,KACE,SACA,uCFmPI,UALI,yBE5OR,uCACA,uCACA,2BACA,qCACA,mCACA,8BACA,0CASF,GACE,cACA,MC0mB4B,QDzmB5B,SACA,wCACA,QCgnB4B,IDtmB9B,kBACE,aACA,cC+iB4B,MD5iB5B,YC+iB4B,ID9iB5B,YC+iB4B,ID9iB5B,uCAGF,GF6MQ,iCAlKJ,0BE3CJ,GFoNQ,kBE/MR,GFwMQ,iCAlKJ,0BEtCJ,GF+MQ,gBE1MR,GFmMQ,+BAlKJ,0BEjCJ,GF0MQ,mBErMR,GF8LQ,iCAlKJ,0BE5BJ,GFqMQ,kBEhMR,GFqLM,UALI,QE3KV,GFgLM,UALI,KEhKV,EACE,aACA,cC+U0B,KDrU5B,YACE,iCACA,YACA,8BAMF,QACE,mBACA,kBACA,oBAMF,MAEE,kBAGF,SAGE,aACA,mBAGF,wBAIE,gBAGF,GACE,YCob4B,ID/a9B,GACE,oBACA,cAMF,WACE,gBAQF,SAEE,YC6Z4B,ODrZ9B,MFmFM,UALI,QEvEV,KACE,QCwe4B,QDve5B,wCASF,QAEE,kBF+DI,UALI,OExDR,cACA,wBAGF,mBACA,eAKA,EACE,gEACA,gBCiNwC,UD/MxC,QACE,oDAWF,4DAEE,cACA,qBAOJ,kBAIE,YCwU4B,yBHnTxB,UALI,IERV,IACE,cACA,aACA,mBACA,cFSI,UALI,QECR,SFII,UALI,QEGN,cACA,kBAIJ,KFHM,UALI,QEUR,2BACA,qBAGA,OACE,cAIJ,IACE,yBFfI,UALI,QEsBR,MCq4CkC,kBDp4ClC,iBCq4CkC,qBCzqDhC,qBFuSF,QACE,UFtBE,UALI,IEsCV,OACE,gBAMF,QAEE,sBAQF,MACE,oBACA,yBAGF,QACE,YC+W4B,MD9W5B,eC8W4B,MD7W5B,MC+Y4B,0BD9Y5B,gBAOF,GAEE,mBACA,gCAGF,2BAME,qBACA,mBACA,eAQF,MACE,qBAMF,OAEE,gBAQF,iCACE,UAKF,sCAKE,SACA,oBFrHI,UALI,QE4HR,oBAIF,cAEE,oBAKF,cACE,eAGF,OAGE,iBAGA,gBACE,UAOJ,0IACE,wBAQF,gDAIE,0BAGE,4GACE,eAON,mBACE,UACA,kBAKF,SACE,gBAUF,SACE,YACA,UACA,SACA,SAQF,OACE,WACA,WACA,UACA,cCuM4B,MHjZtB,iCE6MN,oBF/WE,0BEwWJ,OF/LQ,kBEwMN,SACE,WAOJ,+OAOE,UAGF,4BACE,YASF,cACE,oBACA,6BAmBF,4BACE,wBAKF,+BACE,UAOF,uBACE,aACA,0BAKF,OACE,qBAKF,OACE,SAOF,QACE,kBACA,eAQF,SACE,wBAQF,SACE,wBG5lBF,MAEI,2JAKF,KCNA,sBACA,iBACA,aACA,eAEA,uCACA,2CACA,0CDEE,OCOF,cACA,WACA,eACA,0CACA,yCACA,8BA+CI,KACE,YAGF,iBApCJ,cACA,WAcA,cACE,cACA,WAFF,cACE,cACA,UAFF,cACE,cACA,qBAFF,cACE,cACA,UAFF,cACE,cACA,UAFF,cACE,cACA,qBA+BE,UAhDJ,cACA,WAqDQ,OAhEN,cACA,kBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,mBA+DM,OAhEN,cACA,UA+DM,QAhEN,cACA,mBA+DM,QAhEN,cACA,mBA+DM,QAhEN,cACA,WAuEQ,UAxDV,wBAwDU,UAxDV,yBAwDU,UAxDV,gBAwDU,UAxDV,yBAwDU,UAxDV,yBAwDU,UAxDV,gBAwDU,UAxDV,yBAwDU,UAxDV,yBAwDU,UAxDV,gBAwDU,WAxDV,yBAwDU,WAxDV,yBAmEM,WAEE,iBAGF,WAEE,iBAPF,WAEE,uBAGF,WAEE,uBAPF,WAEE,sBAGF,WAEE,sBAPF,WAEE,oBAGF,WAEE,oBAPF,WAEE,sBAGF,WAEE,sBAPF,WAEE,oBAGF,WAEE,oBC1DN,yBDUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,qBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,qBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBC1DN,yBDUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,qBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,qBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBC1DN,yBDUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,qBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,qBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBC1DN,0BDUE,QACE,YAGF,oBApCJ,cACA,WAcA,iBACE,cACA,WAFF,iBACE,cACA,UAFF,iBACE,cACA,qBAFF,iBACE,cACA,UAFF,iBACE,cACA,UAFF,iBACE,cACA,qBA+BE,aAhDJ,cACA,WAqDQ,UAhEN,cACA,kBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,mBA+DM,UAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,WAuEQ,aAxDV,cAwDU,aAxDV,wBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,aAxDV,yBAwDU,aAxDV,yBAwDU,aAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAmEM,iBAEE,iBAGF,iBAEE,iBAPF,iBAEE,uBAGF,iBAEE,uBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,oBAPF,iBAEE,sBAGF,iBAEE,sBAPF,iBAEE,oBAGF,iBAEE,qBC1DN,0BDUE,SACE,YAGF,qBApCJ,cACA,WAcA,kBACE,cACA,WAFF,kBACE,cACA,UAFF,kBACE,cACA,qBAFF,kBACE,cACA,UAFF,kBACE,cACA,UAFF,kBACE,cACA,qBA+BE,cAhDJ,cACA,WAqDQ,WAhEN,cACA,kBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,UA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,mBA+DM,WAhEN,cACA,UA+DM,YAhEN,cACA,mBA+DM,YAhEN,cACA,mBA+DM,YAhEN,cACA,WAuEQ,cAxDV,cAwDU,cAxDV,wBAwDU,cAxDV,yBAwDU,cAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAwDU,cAxDV,gBAwDU,cAxDV,yBAwDU,cAxDV,yBAwDU,cAxDV,gBAwDU,eAxDV,yBAwDU,eAxDV,yBAmEM,mBAEE,iBAGF,mBAEE,iBAPF,mBAEE,uBAGF,mBAEE,uBAPF,mBAEE,sBAGF,mBAEE,sBAPF,mBAEE,oBAGF,mBAEE,oBAPF,mBAEE,sBAGF,mBAEE,sBAPF,mBAEE,oBAGF,mBAEE,qBEzHV,MCgBM,WDfJ,oBCmBI,uCDpBN,MCqBQ,iBDlBN,iBACE,UAMF,qBACE,aAIJ,YACE,SACA,gBCDI,WDEJ,iBCEI,uCDLN,YCMQ,iBDDN,gCACE,QACA,YCNE,WDOF,gBCHE,uEACE,iBCpBR,SAEE,0BACA,8BACA,+BACA,gCACA,sBV8RI,uBALI,SUvRR,sCACA,0CACA,oDACA,0BACA,iCACA,kCAGA,iCACA,cACA,uCACA,gCCnBA,YRslB4B,0BQplB5B,kBACA,YR+lB4B,IQ9lB5B,YRsmB4B,IQrmB5B,gBACA,iBACA,qBACA,iBACA,oBACA,sBACA,kBACA,mBACA,oBACA,gBXsRI,UALI,4BUrQR,qBACA,UAEA,gDAEA,wBACE,cACA,oCACA,sCAEA,gCACE,kBACA,WACA,2BACA,mBAKN,2FACE,SAEA,2GACE,SACA,qFACA,sCAKJ,6FACE,OACA,qCACA,qCAEA,6GACE,WACA,4HACA,wCAMJ,iGACE,MAEA,iHACE,YACA,qFACA,yCAKJ,8FACE,QACA,qCACA,qCAEA,8GACE,UACA,4HACA,uCAsBJ,eACE,sCACA,gEACA,8BACA,kBACA,sCNlGE,8CQTJ,MACE,eAGF,gBACE,gBACA,kBACA,qBAEA,4BACE,wBACA,qBAGF,wFACE,WAIJ,KACE,4CACA,yBACA,yCACA,cACA,gBACA,eAGF,aACE,YACA,gBACA,cACA,iCACA,iBACA,0BAIF,cACE,WACA,kBAGF,YACE,WAGF,YACE,eACA,aACA,eACA,qBAQA,YACE,OAJW,QAKX,UAPS,OAQT,aAPW","file":"main.css"} \ No newline at end of file diff --git a/static/css/main.gulp.css b/static/css/main.gulp.css new file mode 100644 index 0000000..10e11d3 --- /dev/null +++ b/static/css/main.gulp.css @@ -0,0 +1,2 @@ +.btn{backface-visibility:hidden;-webkit-backface-visibility:hidden;-ms-backface-visibility:hidden;-moz-backface-visibility:hidden;-o-backface-visibility:hidden;transition:all 350ms ease;-webkit-transition:all 350ms ease;-ms-transition:all 350ms ease;-moz-transition:all 350ms ease;-o-transition:all 350ms ease;background-color:rgba(0,0,0,0);border:0;border-radius:5px;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:"Consolas",monospace;font-size:1.2rem;font-weight:500;height:2.7rem;line-height:38px;margin:.5em;padding:0 2rem;text-align:center;text-decoration:none;white-space:nowrap}.btn.pomegranate{background-color:#c0392b;filter:drop-shadow(5px 5px 0 rgba(192, 57, 43, 0.6))}.btn.pomegranate:hover{filter:drop-shadow(5px 5px 0 rgba(192, 57, 43, 0.6)) brightness(50%)}.btn.discord{background-color:#5865f2;filter:drop-shadow(5px 5px 0 rgba(114, 137, 218, 0.6))}.btn.discord:hover{filter:drop-shadow(5px 5px 0 rgba(114, 137, 218, 0.6)) brightness(50%)}.btn.github{background-color:#292d32;filter:drop-shadow(5px 5px 0 rgba(41, 45, 50, 0.6))}.btn.github:hover{filter:drop-shadow(5px 5px 0 rgba(41, 45, 50, 0.6)) brightness(50%)}.btn:hover{transition:all 350ms ease;-webkit-transition:all 350ms ease;-ms-transition:all 350ms ease;-moz-transition:all 350ms ease;-o-transition:all 350ms ease;color:#fff}.btn.animation{animation:button-enter 1s ease-in-out forwards;-webkit-animation:button-enter 1s ease-in-out forwards;-ms-animation:button-enter 1s ease-in-out forwards;-moz-animation:button-enter 1s ease-in-out forwards;-o-animation:button-enter 1s ease-in-out forwards;opacity:0;position:relative}.btn.animation:nth-child(1){animation-delay:.25s}.btn.animation:nth-child(2){animation-delay:.5s}.btn.animation:nth-child(3){animation-delay:.75s}.btn.animation:nth-child(4){animation-delay:1s}.btn.animation:nth-child(5){animation-delay:1.25s}.btn.animation:nth-child(6){animation-delay:1.5s}.btn.animation:nth-child(7){animation-delay:1.75s}.btn.animation:nth-child(8){animation-delay:2s}.btn.animation:nth-child(9){animation-delay:2.25s}.btn.animation:nth-child(10){animation-delay:2.5s}.btn.animation:nth-child(11){animation-delay:2.75s}.btn.animation:nth-child(12){animation-delay:3s}.btn.animation:nth-child(13){animation-delay:3.25s}.btn.animation:nth-child(14){animation-delay:3.5s}.btn.animation:nth-child(15){animation-delay:3.75s}.btn.hover{transition:all 350ms ease;-webkit-transition:all 350ms ease;-ms-transition:all 350ms ease;-moz-transition:all 350ms ease;-o-transition:all 350ms ease}.btn.hover:hover{transform:translateY(-0.5em);-webkit-transform:translateY(-0.5em);-ms-transform:translateY(-0.5em);-moz-transform:translateY(-0.5em);-o-transform:translateY(-0.5em)}.btn.midnight-blue{background-color:#2c3e50;filter:drop-shadow(5px 5px 0 rgba(44, 62, 80, 0.6))}.btn.midnight-blue:hover{filter:drop-shadow(5px 5px 0 rgba(44, 62, 80, 0.6)) brightness(50%)}@-webkit-keyframes button-enter{from{opacity:0;top:2em}70%{top:-0.3em}100%{opacity:1;top:0}}@-moz-keyframes button-enter{from{opacity:0;top:2em}70%{top:-0.3em}100%{opacity:1;top:0}}@-o-keyframes button-enter{from{opacity:0;top:2em}70%{top:-0.3em}100%{opacity:1;top:0}}@keyframes button-enter{from{opacity:0;top:2em}70%{top:-0.3em}100%{opacity:1;top:0}}.buttons{align-items:center;justify-content:center;text-align:center}#particles-js{position:fixed;width:100%;height:100%}#particles-js{pointer-events:none}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row.main .logo{margin-top:15px;border-radius:2.5%;filter:invert(35%) sepia(95%) saturate(435%) hue-rotate(131deg) brightness(94%) contrast(101%)}.row.main .title{margin-top:2%}@media(min-width: 1200px){.container{width:1170px}}@media(min-width: 992px){.container{width:970px}}@media(min-width: 768px){.container{width:750px}}h2{font-size:3.5rem !important}h3{font-size:3.2rem !important}.emerald{color:#2ecc71 !important}.center{text-align:center}.left{text-align:left}.right{text-align:right}.unselectable{user-select:none;-ms-user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}::-moz-selection{background-color:rgba(128,0,0,.3)}::selection{background-color:rgba(128,0,0,.3)}:root{--balloon-color: rgba(16, 16, 16, 0.95);--balloon-font-size: 12px;--balloon-move: 4px}.emoji{width:1em;height:1em;margin:0 .05em 0 .1em;display:inline-block;vertical-align:-0.1em;background-size:1em 1em;background-repeat:no-repeat;background-position:center center;filter:invert(100%) sepia(0%) saturate(0%) hue-rotate(93deg) brightness(103%) contrast(103%)}.repo{background-image:url(../img/GitHub/repo.svg) !important}.octoface{background-image:url(../img/GitHub/octoface.svg)}.repo-force-push{background-image:url(../img/GitHub/repo-force-push.svg);font-size:16px}@font-face{font-family:"Mfizz";src:url("../font/mfizz-custom.eot");src:url("../font/mfizz-custom.eot?#iefix") format("embedded-opentype"),url("../font/mfizz-custom.woff") format("woff"),url("../font/mfizz-custom.ttf") format("truetype"),url("../font/mfizz-custom.svg#Glyphter") format("svg");font-weight:normal;font-style:normal;font-display:swap}[class*=icon-]:before{display:inline-block;font-family:"Mfizz";font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-archlinux:before{content:"A"}.icon-bootstrap:before{content:"B"}.icon-c:before{content:"C"}.icon-cassandra:before{content:"D"}.icon-centos:before{content:"E"}.icon-css3:before{content:"F"}.icon-debian:before{content:"G"}.icon-docker:before{content:"H"}.icon-elixir:before{content:"I"}.icon-fedora:before{content:"J"}.icon-git:before{content:"K"}.icon-go:before{content:"L"}.icon-html5:before{content:"M"}.icon-mariadb:before{content:"N"}.icon-mongodb:before{content:"O"}.icon-mysql:before{content:"P"}.icon-nginx:before{content:"Q"}.icon-nodejs:before{content:"R"}.icon-postgres:before{content:"S"}.icon-python:before{content:"T"}.icon-raspberrypi:before{content:"U"}.icon-reactjs:before{content:"V"}.icon-redhat:before{content:"W"}.icon-redis:before{content:"X"}.icon-rust:before{content:"Y"}.icon-sass:before{content:"Z"}.icon-shell:before{content:"a"}.icon-ubuntu:before{content:"b"}:root{--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-primary: #0d6efd;--bs-secondary: #6c757d;--bs-success: #198754;--bs-info: #0dcaf0;--bs-warning: #ffc107;--bs-danger: #dc3545;--bs-light: #f8f9fa;--bs-dark: #212529;--bs-primary-rgb: 13, 110, 253;--bs-secondary-rgb: 108, 117, 125;--bs-success-rgb: 25, 135, 84;--bs-info-rgb: 13, 202, 240;--bs-warning-rgb: 255, 193, 7;--bs-danger-rgb: 220, 53, 69;--bs-light-rgb: 248, 249, 250;--bs-dark-rgb: 33, 37, 41;--bs-primary-text: #084298;--bs-secondary-text: #495057;--bs-success-text: #0f5132;--bs-info-text: #055160;--bs-warning-text: #664d03;--bs-danger-text: #842029;--bs-light-text: #495057;--bs-dark-text: #495057;--bs-primary-bg-subtle: #cfe2ff;--bs-secondary-bg-subtle: #f8f9fa;--bs-success-bg-subtle: #d1e7dd;--bs-info-bg-subtle: #cff4fc;--bs-warning-bg-subtle: #fff3cd;--bs-danger-bg-subtle: #f8d7da;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #9ec5fe;--bs-secondary-border-subtle: #e9ecef;--bs-success-border-subtle: #a3cfbb;--bs-info-border-subtle: #9eeaf9;--bs-warning-border-subtle: #ffe69c;--bs-danger-border-subtle: #f1aeb5;--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family: var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #212529;--bs-body-color-rgb: 33, 37, 41;--bs-body-bg: #fff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb: 33, 37, 41;--bs-secondary-bg: #e9ecef;--bs-secondary-bg-rgb: 233, 236, 239;--bs-tertiary-color: rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb: 33, 37, 41;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-link-color: #0d6efd;--bs-link-color-rgb: 13, 110, 253;--bs-link-decoration: underline;--bs-link-hover-color: #0a58ca;--bs-link-hover-color-rgb: 10, 88, 202;--bs-code-color: #d63384;--bs-highlight-bg: #fff3cd;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.375rem;--bs-border-radius-sm: 0.25rem;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(13, 110, 253, 0.25);--bs-focus-ring-box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}*,*::before,*::after{box-sizing:border-box}@media(prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}h4,h3,h2,h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color, inherit)}h1{font-size:calc(1.375rem + 1.5vw)}@media(min-width: 1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + 0.6vw)}@media(min-width: 1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + 0.3vw)}@media(min-width: 1200px){h4{font-size:1.5rem}}p{margin-top:0;margin-bottom:1rem}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl{margin-top:0;margin-bottom:1rem}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}b{font-weight:bolder}small{font-size:0.875em}mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}tr{border-color:inherit;border-style:solid;border-width:0}input{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}[type=reset]{-webkit-appearance:button}[type=reset]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}progress{vertical-align:baseline}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.row{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(-1*var(--bs-gutter-y));margin-right:calc(-0.5*var(--bs-gutter-x));margin-left:calc(-0.5*var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}@media(min-width: 576px){.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: var(--bs-body-bg);--bs-tooltip-bg: var(--bs-emphasis-color);--bs-tooltip-border-radius: var(--bs-border-radius);--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;padding:var(--bs-tooltip-arrow-height);margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}:root{font-size:14px}p a,.projects a{font-weight:700;font-style:italic;text-decoration:none}p a:hover,.projects a:hover{color:maroon !important;transition:.2s color}p a:link,p a:visited,p a:active,.projects a:link,.projects a:visited,.projects a:active{color:teal}body{font-family:"Monsterrat",sans-serif !important;background-color:#2c2f33;background:url("../img/background.png");color:#f5f5f5;line-height:1.4;font-size:1rem}.maincontent{width:52.5%;min-width:350px;margin-top:1%;border:.5px rgba(0,0,0,.2) solid;border-radius:1%;background:rgba(5,5,5,.3)}.icon_set a{color:#eee}.icon_set i{cursor:pointer;margin:0 5px;font-size:43px;transition:.3s color}.icon_set i{cursor:pointer;font-size:2.8rem;margin-right:4px} +.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: var(--bs-body-bg);--bs-tooltip-bg: var(--bs-emphasis-color);--bs-tooltip-border-radius: var(--bs-border-radius);--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;padding:var(--bs-tooltip-arrow-height);margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:0}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:0}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)} \ No newline at end of file diff --git a/v5/static/font/ArchivoBlack.woff b/static/font/ArchivoBlack.woff similarity index 100% rename from v5/static/font/ArchivoBlack.woff rename to static/font/ArchivoBlack.woff diff --git a/v5/static/font/ReenieBeanie.woff b/static/font/ReenieBeanie.woff similarity index 100% rename from v5/static/font/ReenieBeanie.woff rename to static/font/ReenieBeanie.woff diff --git a/v5/static/font/SourceCodePro.woff b/static/font/SourceCodePro.woff similarity index 100% rename from v5/static/font/SourceCodePro.woff rename to static/font/SourceCodePro.woff diff --git a/v5/static/font/Whitney-300.woff b/static/font/Whitney-300.woff similarity index 100% rename from v5/static/font/Whitney-300.woff rename to static/font/Whitney-300.woff diff --git a/v5/static/font/Whitney-400.woff b/static/font/Whitney-400.woff similarity index 100% rename from v5/static/font/Whitney-400.woff rename to static/font/Whitney-400.woff diff --git a/v5/static/font/Whitney-500.woff b/static/font/Whitney-500.woff similarity index 100% rename from v5/static/font/Whitney-500.woff rename to static/font/Whitney-500.woff diff --git a/v5/static/font/Whitney-600.woff b/static/font/Whitney-600.woff similarity index 100% rename from v5/static/font/Whitney-600.woff rename to static/font/Whitney-600.woff diff --git a/v5/static/font/Whitney-700.woff b/static/font/Whitney-700.woff similarity index 100% rename from v5/static/font/Whitney-700.woff rename to static/font/Whitney-700.woff diff --git a/static/font/beatrix-config.js b/static/font/beatrix-config.js new file mode 100644 index 0000000..f372407 --- /dev/null +++ b/static/font/beatrix-config.js @@ -0,0 +1,29 @@ +module.exports = { + CHARACTERS: [ + // Unicode range from U+0020 to U+007E (including the last one). + // Contains: space, !, ", #, $, %, &, ', (, ), *, +, comma, + // -, dot, /, numbers, :, ;, <, =, >, ?, @, A-Z, [, \, ], ^, + // _, `, a-z, {, |, }, ~ + 'E9C3', // docker + 'E998', // c + 'E9A1', // css 3 + 'E9A0', // c# + 'E9B1', // debian + 'E92C', // arch + 'E965', // cassandra + 'E9DB', // elixir + 'EA2D', // git + 'EA67', // html5 + 'EBEE', // sass + 'EBE6', // rust + 'EB9C', // python + 'EC63', // typescript + 'EBC6', // redhat + 'EBC8', // redis + 'EB79', // postgres + 'EC68' // ubuntu + ], + + // Drop all the features except 'tnum' and 'kern' + LAYOUT_FEATURES: ['tnum', 'kern'] +} \ No newline at end of file diff --git a/static/font/devicon.ttf b/static/font/devicon.ttf new file mode 100644 index 0000000..a5d2d43 Binary files /dev/null and b/static/font/devicon.ttf differ diff --git a/static/font/devicon.woff b/static/font/devicon.woff new file mode 100644 index 0000000..ac99b80 Binary files /dev/null and b/static/font/devicon.woff differ diff --git a/static/font/devicon.woff2 b/static/font/devicon.woff2 new file mode 100644 index 0000000..16f3109 Binary files /dev/null and b/static/font/devicon.woff2 differ diff --git a/static/font/legacy/devicon.eot b/static/font/legacy/devicon.eot new file mode 100644 index 0000000..c579f05 Binary files /dev/null and b/static/font/legacy/devicon.eot differ diff --git a/static/font/legacy/devicon.svg b/static/font/legacy/devicon.svg new file mode 100644 index 0000000..11e6566 --- /dev/null +++ b/static/font/legacy/devicon.svg @@ -0,0 +1,975 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/font/legacy/devicon.ttf b/static/font/legacy/devicon.ttf new file mode 100644 index 0000000..48e1886 Binary files /dev/null and b/static/font/legacy/devicon.ttf differ diff --git a/static/font/legacy/devicon.woff b/static/font/legacy/devicon.woff new file mode 100644 index 0000000..a5c2d9a Binary files /dev/null and b/static/font/legacy/devicon.woff differ diff --git a/v5/static/font/mfizz-custom.eot b/static/font/legacy/mfizz-custom.eot similarity index 100% rename from v5/static/font/mfizz-custom.eot rename to static/font/legacy/mfizz-custom.eot diff --git a/v5/static/font/mfizz-custom.svg b/static/font/legacy/mfizz-custom.svg similarity index 100% rename from v5/static/font/mfizz-custom.svg rename to static/font/legacy/mfizz-custom.svg diff --git a/v5/static/font/mfizz-custom.ttf b/static/font/legacy/mfizz-custom.ttf similarity index 100% rename from v5/static/font/mfizz-custom.ttf rename to static/font/legacy/mfizz-custom.ttf diff --git a/v5/static/font/mfizz-custom.woff b/static/font/legacy/mfizz-custom.woff similarity index 100% rename from v5/static/font/mfizz-custom.woff rename to static/font/legacy/mfizz-custom.woff diff --git a/v5/static/font/mfizz.eot b/static/font/legacy/mfizz.eot similarity index 100% rename from v5/static/font/mfizz.eot rename to static/font/legacy/mfizz.eot diff --git a/v5/static/font/mfizz.svg b/static/font/legacy/mfizz.svg similarity index 100% rename from v5/static/font/mfizz.svg rename to static/font/legacy/mfizz.svg diff --git a/v5/static/font/mfizz.ttf b/static/font/legacy/mfizz.ttf similarity index 100% rename from v5/static/font/mfizz.ttf rename to static/font/legacy/mfizz.ttf diff --git a/v5/static/font/mfizz.woff b/static/font/legacy/mfizz.woff similarity index 100% rename from v5/static/font/mfizz.woff rename to static/font/legacy/mfizz.woff diff --git a/v5/static/img/404-background-compressed.png b/static/img/404-background-compressed.png similarity index 100% rename from v5/static/img/404-background-compressed.png rename to static/img/404-background-compressed.png diff --git a/v5/static/img/404-background.png b/static/img/404-background.png similarity index 100% rename from v5/static/img/404-background.png rename to static/img/404-background.png diff --git a/v1/img/GitHub/alert.svg b/static/img/GitHub/alert.svg similarity index 100% rename from v1/img/GitHub/alert.svg rename to static/img/GitHub/alert.svg diff --git a/v1/img/GitHub/archive.svg b/static/img/GitHub/archive.svg similarity index 100% rename from v1/img/GitHub/archive.svg rename to static/img/GitHub/archive.svg diff --git a/v1/img/GitHub/arrow-both.svg b/static/img/GitHub/arrow-both.svg similarity index 100% rename from v1/img/GitHub/arrow-both.svg rename to static/img/GitHub/arrow-both.svg diff --git a/v1/img/GitHub/arrow-down.svg b/static/img/GitHub/arrow-down.svg similarity index 100% rename from v1/img/GitHub/arrow-down.svg rename to static/img/GitHub/arrow-down.svg diff --git a/v1/img/GitHub/arrow-left.svg b/static/img/GitHub/arrow-left.svg similarity index 100% rename from v1/img/GitHub/arrow-left.svg rename to static/img/GitHub/arrow-left.svg diff --git a/v1/img/GitHub/arrow-right.svg b/static/img/GitHub/arrow-right.svg similarity index 100% rename from v1/img/GitHub/arrow-right.svg rename to static/img/GitHub/arrow-right.svg diff --git a/v1/img/GitHub/arrow-small-down.svg b/static/img/GitHub/arrow-small-down.svg similarity index 100% rename from v1/img/GitHub/arrow-small-down.svg rename to static/img/GitHub/arrow-small-down.svg diff --git a/v1/img/GitHub/arrow-small-left.svg b/static/img/GitHub/arrow-small-left.svg similarity index 100% rename from v1/img/GitHub/arrow-small-left.svg rename to static/img/GitHub/arrow-small-left.svg diff --git a/v1/img/GitHub/arrow-small-right.svg b/static/img/GitHub/arrow-small-right.svg similarity index 100% rename from v1/img/GitHub/arrow-small-right.svg rename to static/img/GitHub/arrow-small-right.svg diff --git a/v1/img/GitHub/arrow-small-up.svg b/static/img/GitHub/arrow-small-up.svg similarity index 100% rename from v1/img/GitHub/arrow-small-up.svg rename to static/img/GitHub/arrow-small-up.svg diff --git a/v1/img/GitHub/arrow-up.svg b/static/img/GitHub/arrow-up.svg similarity index 100% rename from v1/img/GitHub/arrow-up.svg rename to static/img/GitHub/arrow-up.svg diff --git a/v1/img/GitHub/beaker.svg b/static/img/GitHub/beaker.svg similarity index 100% rename from v1/img/GitHub/beaker.svg rename to static/img/GitHub/beaker.svg diff --git a/v1/img/GitHub/bell.svg b/static/img/GitHub/bell.svg similarity index 100% rename from v1/img/GitHub/bell.svg rename to static/img/GitHub/bell.svg diff --git a/v1/img/GitHub/bold.svg b/static/img/GitHub/bold.svg similarity index 100% rename from v1/img/GitHub/bold.svg rename to static/img/GitHub/bold.svg diff --git a/v1/img/GitHub/book.svg b/static/img/GitHub/book.svg similarity index 100% rename from v1/img/GitHub/book.svg rename to static/img/GitHub/book.svg diff --git a/v1/img/GitHub/bookmark.svg b/static/img/GitHub/bookmark.svg similarity index 100% rename from v1/img/GitHub/bookmark.svg rename to static/img/GitHub/bookmark.svg diff --git a/v1/img/GitHub/briefcase.svg b/static/img/GitHub/briefcase.svg similarity index 100% rename from v1/img/GitHub/briefcase.svg rename to static/img/GitHub/briefcase.svg diff --git a/v1/img/GitHub/broadcast.svg b/static/img/GitHub/broadcast.svg similarity index 100% rename from v1/img/GitHub/broadcast.svg rename to static/img/GitHub/broadcast.svg diff --git a/v1/img/GitHub/browser.svg b/static/img/GitHub/browser.svg similarity index 100% rename from v1/img/GitHub/browser.svg rename to static/img/GitHub/browser.svg diff --git a/v1/img/GitHub/bug.svg b/static/img/GitHub/bug.svg similarity index 100% rename from v1/img/GitHub/bug.svg rename to static/img/GitHub/bug.svg diff --git a/v1/img/GitHub/calendar.svg b/static/img/GitHub/calendar.svg similarity index 100% rename from v1/img/GitHub/calendar.svg rename to static/img/GitHub/calendar.svg diff --git a/v1/img/GitHub/check.svg b/static/img/GitHub/check.svg similarity index 100% rename from v1/img/GitHub/check.svg rename to static/img/GitHub/check.svg diff --git a/v1/img/GitHub/checklist.svg b/static/img/GitHub/checklist.svg similarity index 100% rename from v1/img/GitHub/checklist.svg rename to static/img/GitHub/checklist.svg diff --git a/v1/img/GitHub/chevron-down.svg b/static/img/GitHub/chevron-down.svg similarity index 100% rename from v1/img/GitHub/chevron-down.svg rename to static/img/GitHub/chevron-down.svg diff --git a/v1/img/GitHub/chevron-left.svg b/static/img/GitHub/chevron-left.svg similarity index 100% rename from v1/img/GitHub/chevron-left.svg rename to static/img/GitHub/chevron-left.svg diff --git a/v1/img/GitHub/chevron-right.svg b/static/img/GitHub/chevron-right.svg similarity index 100% rename from v1/img/GitHub/chevron-right.svg rename to static/img/GitHub/chevron-right.svg diff --git a/v1/img/GitHub/chevron-up.svg b/static/img/GitHub/chevron-up.svg similarity index 100% rename from v1/img/GitHub/chevron-up.svg rename to static/img/GitHub/chevron-up.svg diff --git a/v1/img/GitHub/circle-slash.svg b/static/img/GitHub/circle-slash.svg similarity index 100% rename from v1/img/GitHub/circle-slash.svg rename to static/img/GitHub/circle-slash.svg diff --git a/v1/img/GitHub/circuit-board.svg b/static/img/GitHub/circuit-board.svg similarity index 100% rename from v1/img/GitHub/circuit-board.svg rename to static/img/GitHub/circuit-board.svg diff --git a/v1/img/GitHub/clippy.svg b/static/img/GitHub/clippy.svg similarity index 100% rename from v1/img/GitHub/clippy.svg rename to static/img/GitHub/clippy.svg diff --git a/v1/img/GitHub/clock.svg b/static/img/GitHub/clock.svg similarity index 100% rename from v1/img/GitHub/clock.svg rename to static/img/GitHub/clock.svg diff --git a/v1/img/GitHub/cloud-download.svg b/static/img/GitHub/cloud-download.svg similarity index 100% rename from v1/img/GitHub/cloud-download.svg rename to static/img/GitHub/cloud-download.svg diff --git a/v1/img/GitHub/cloud-upload.svg b/static/img/GitHub/cloud-upload.svg similarity index 100% rename from v1/img/GitHub/cloud-upload.svg rename to static/img/GitHub/cloud-upload.svg diff --git a/v1/img/GitHub/code.svg b/static/img/GitHub/code.svg similarity index 100% rename from v1/img/GitHub/code.svg rename to static/img/GitHub/code.svg diff --git a/v1/img/GitHub/comment-discussion.svg b/static/img/GitHub/comment-discussion.svg similarity index 100% rename from v1/img/GitHub/comment-discussion.svg rename to static/img/GitHub/comment-discussion.svg diff --git a/v1/img/GitHub/comment.svg b/static/img/GitHub/comment.svg similarity index 100% rename from v1/img/GitHub/comment.svg rename to static/img/GitHub/comment.svg diff --git a/v1/img/GitHub/credit-card.svg b/static/img/GitHub/credit-card.svg similarity index 100% rename from v1/img/GitHub/credit-card.svg rename to static/img/GitHub/credit-card.svg diff --git a/v1/img/GitHub/dash.svg b/static/img/GitHub/dash.svg similarity index 100% rename from v1/img/GitHub/dash.svg rename to static/img/GitHub/dash.svg diff --git a/v1/img/GitHub/dashboard.svg b/static/img/GitHub/dashboard.svg similarity index 100% rename from v1/img/GitHub/dashboard.svg rename to static/img/GitHub/dashboard.svg diff --git a/v1/img/GitHub/database.svg b/static/img/GitHub/database.svg similarity index 100% rename from v1/img/GitHub/database.svg rename to static/img/GitHub/database.svg diff --git a/v1/img/GitHub/desktop-download.svg b/static/img/GitHub/desktop-download.svg similarity index 100% rename from v1/img/GitHub/desktop-download.svg rename to static/img/GitHub/desktop-download.svg diff --git a/v1/img/GitHub/device-camera-video.svg b/static/img/GitHub/device-camera-video.svg similarity index 100% rename from v1/img/GitHub/device-camera-video.svg rename to static/img/GitHub/device-camera-video.svg diff --git a/v1/img/GitHub/device-camera.svg b/static/img/GitHub/device-camera.svg similarity index 100% rename from v1/img/GitHub/device-camera.svg rename to static/img/GitHub/device-camera.svg diff --git a/v1/img/GitHub/device-desktop.svg b/static/img/GitHub/device-desktop.svg similarity index 100% rename from v1/img/GitHub/device-desktop.svg rename to static/img/GitHub/device-desktop.svg diff --git a/v1/img/GitHub/device-mobile.svg b/static/img/GitHub/device-mobile.svg similarity index 100% rename from v1/img/GitHub/device-mobile.svg rename to static/img/GitHub/device-mobile.svg diff --git a/v1/img/GitHub/diff-added.svg b/static/img/GitHub/diff-added.svg similarity index 100% rename from v1/img/GitHub/diff-added.svg rename to static/img/GitHub/diff-added.svg diff --git a/v1/img/GitHub/diff-ignored.svg b/static/img/GitHub/diff-ignored.svg similarity index 100% rename from v1/img/GitHub/diff-ignored.svg rename to static/img/GitHub/diff-ignored.svg diff --git a/v1/img/GitHub/diff-modified.svg b/static/img/GitHub/diff-modified.svg similarity index 100% rename from v1/img/GitHub/diff-modified.svg rename to static/img/GitHub/diff-modified.svg diff --git a/v1/img/GitHub/diff-removed.svg b/static/img/GitHub/diff-removed.svg similarity index 100% rename from v1/img/GitHub/diff-removed.svg rename to static/img/GitHub/diff-removed.svg diff --git a/v1/img/GitHub/diff-renamed.svg b/static/img/GitHub/diff-renamed.svg similarity index 100% rename from v1/img/GitHub/diff-renamed.svg rename to static/img/GitHub/diff-renamed.svg diff --git a/v1/img/GitHub/diff.svg b/static/img/GitHub/diff.svg similarity index 100% rename from v1/img/GitHub/diff.svg rename to static/img/GitHub/diff.svg diff --git a/v1/img/GitHub/ellipsis.svg b/static/img/GitHub/ellipsis.svg similarity index 100% rename from v1/img/GitHub/ellipsis.svg rename to static/img/GitHub/ellipsis.svg diff --git a/v1/img/GitHub/eye.svg b/static/img/GitHub/eye.svg similarity index 100% rename from v1/img/GitHub/eye.svg rename to static/img/GitHub/eye.svg diff --git a/v1/img/GitHub/file-binary.svg b/static/img/GitHub/file-binary.svg similarity index 100% rename from v1/img/GitHub/file-binary.svg rename to static/img/GitHub/file-binary.svg diff --git a/v1/img/GitHub/file-code.svg b/static/img/GitHub/file-code.svg similarity index 100% rename from v1/img/GitHub/file-code.svg rename to static/img/GitHub/file-code.svg diff --git a/v1/img/GitHub/file-directory.svg b/static/img/GitHub/file-directory.svg similarity index 100% rename from v1/img/GitHub/file-directory.svg rename to static/img/GitHub/file-directory.svg diff --git a/v1/img/GitHub/file-media.svg b/static/img/GitHub/file-media.svg similarity index 100% rename from v1/img/GitHub/file-media.svg rename to static/img/GitHub/file-media.svg diff --git a/v1/img/GitHub/file-pdf.svg b/static/img/GitHub/file-pdf.svg similarity index 100% rename from v1/img/GitHub/file-pdf.svg rename to static/img/GitHub/file-pdf.svg diff --git a/v1/img/GitHub/file-submodule.svg b/static/img/GitHub/file-submodule.svg similarity index 100% rename from v1/img/GitHub/file-submodule.svg rename to static/img/GitHub/file-submodule.svg diff --git a/v1/img/GitHub/file-symlink-directory.svg b/static/img/GitHub/file-symlink-directory.svg similarity index 100% rename from v1/img/GitHub/file-symlink-directory.svg rename to static/img/GitHub/file-symlink-directory.svg diff --git a/v1/img/GitHub/file-symlink-file.svg b/static/img/GitHub/file-symlink-file.svg similarity index 100% rename from v1/img/GitHub/file-symlink-file.svg rename to static/img/GitHub/file-symlink-file.svg diff --git a/v1/img/GitHub/file-zip.svg b/static/img/GitHub/file-zip.svg similarity index 100% rename from v1/img/GitHub/file-zip.svg rename to static/img/GitHub/file-zip.svg diff --git a/v1/img/GitHub/file.svg b/static/img/GitHub/file.svg similarity index 100% rename from v1/img/GitHub/file.svg rename to static/img/GitHub/file.svg diff --git a/v1/img/GitHub/flame.svg b/static/img/GitHub/flame.svg similarity index 100% rename from v1/img/GitHub/flame.svg rename to static/img/GitHub/flame.svg diff --git a/v1/img/GitHub/fold.svg b/static/img/GitHub/fold.svg similarity index 100% rename from v1/img/GitHub/fold.svg rename to static/img/GitHub/fold.svg diff --git a/v1/img/GitHub/gear.svg b/static/img/GitHub/gear.svg similarity index 100% rename from v1/img/GitHub/gear.svg rename to static/img/GitHub/gear.svg diff --git a/v1/img/GitHub/gift.svg b/static/img/GitHub/gift.svg similarity index 100% rename from v1/img/GitHub/gift.svg rename to static/img/GitHub/gift.svg diff --git a/v1/img/GitHub/gist-secret.svg b/static/img/GitHub/gist-secret.svg similarity index 100% rename from v1/img/GitHub/gist-secret.svg rename to static/img/GitHub/gist-secret.svg diff --git a/v1/img/GitHub/gist.svg b/static/img/GitHub/gist.svg similarity index 100% rename from v1/img/GitHub/gist.svg rename to static/img/GitHub/gist.svg diff --git a/v1/img/GitHub/git-branch.svg b/static/img/GitHub/git-branch.svg similarity index 100% rename from v1/img/GitHub/git-branch.svg rename to static/img/GitHub/git-branch.svg diff --git a/v1/img/GitHub/git-commit.svg b/static/img/GitHub/git-commit.svg similarity index 100% rename from v1/img/GitHub/git-commit.svg rename to static/img/GitHub/git-commit.svg diff --git a/v1/img/GitHub/git-compare.svg b/static/img/GitHub/git-compare.svg similarity index 100% rename from v1/img/GitHub/git-compare.svg rename to static/img/GitHub/git-compare.svg diff --git a/v1/img/GitHub/git-merge.svg b/static/img/GitHub/git-merge.svg similarity index 100% rename from v1/img/GitHub/git-merge.svg rename to static/img/GitHub/git-merge.svg diff --git a/v1/img/GitHub/git-pull-request.svg b/static/img/GitHub/git-pull-request.svg similarity index 100% rename from v1/img/GitHub/git-pull-request.svg rename to static/img/GitHub/git-pull-request.svg diff --git a/v1/img/GitHub/globe.svg b/static/img/GitHub/globe.svg similarity index 100% rename from v1/img/GitHub/globe.svg rename to static/img/GitHub/globe.svg diff --git a/v1/img/GitHub/grabber.svg b/static/img/GitHub/grabber.svg similarity index 100% rename from v1/img/GitHub/grabber.svg rename to static/img/GitHub/grabber.svg diff --git a/v1/img/GitHub/graph.svg b/static/img/GitHub/graph.svg similarity index 100% rename from v1/img/GitHub/graph.svg rename to static/img/GitHub/graph.svg diff --git a/v1/img/GitHub/heart.svg b/static/img/GitHub/heart.svg similarity index 100% rename from v1/img/GitHub/heart.svg rename to static/img/GitHub/heart.svg diff --git a/v1/img/GitHub/history.svg b/static/img/GitHub/history.svg similarity index 100% rename from v1/img/GitHub/history.svg rename to static/img/GitHub/history.svg diff --git a/v1/img/GitHub/home.svg b/static/img/GitHub/home.svg similarity index 100% rename from v1/img/GitHub/home.svg rename to static/img/GitHub/home.svg diff --git a/v1/img/GitHub/horizontal-rule.svg b/static/img/GitHub/horizontal-rule.svg similarity index 100% rename from v1/img/GitHub/horizontal-rule.svg rename to static/img/GitHub/horizontal-rule.svg diff --git a/v1/img/GitHub/hubot.svg b/static/img/GitHub/hubot.svg similarity index 100% rename from v1/img/GitHub/hubot.svg rename to static/img/GitHub/hubot.svg diff --git a/v1/img/GitHub/inbox.svg b/static/img/GitHub/inbox.svg similarity index 100% rename from v1/img/GitHub/inbox.svg rename to static/img/GitHub/inbox.svg diff --git a/v1/img/GitHub/info.svg b/static/img/GitHub/info.svg similarity index 100% rename from v1/img/GitHub/info.svg rename to static/img/GitHub/info.svg diff --git a/v1/img/GitHub/issue-closed.svg b/static/img/GitHub/issue-closed.svg similarity index 100% rename from v1/img/GitHub/issue-closed.svg rename to static/img/GitHub/issue-closed.svg diff --git a/v1/img/GitHub/issue-opened.svg b/static/img/GitHub/issue-opened.svg similarity index 100% rename from v1/img/GitHub/issue-opened.svg rename to static/img/GitHub/issue-opened.svg diff --git a/v1/img/GitHub/issue-reopened.svg b/static/img/GitHub/issue-reopened.svg similarity index 100% rename from v1/img/GitHub/issue-reopened.svg rename to static/img/GitHub/issue-reopened.svg diff --git a/v1/img/GitHub/italic.svg b/static/img/GitHub/italic.svg similarity index 100% rename from v1/img/GitHub/italic.svg rename to static/img/GitHub/italic.svg diff --git a/v1/img/GitHub/jersey.svg b/static/img/GitHub/jersey.svg similarity index 100% rename from v1/img/GitHub/jersey.svg rename to static/img/GitHub/jersey.svg diff --git a/v1/img/GitHub/kebab-horizontal.svg b/static/img/GitHub/kebab-horizontal.svg similarity index 100% rename from v1/img/GitHub/kebab-horizontal.svg rename to static/img/GitHub/kebab-horizontal.svg diff --git a/v1/img/GitHub/kebab-vertical.svg b/static/img/GitHub/kebab-vertical.svg similarity index 100% rename from v1/img/GitHub/kebab-vertical.svg rename to static/img/GitHub/kebab-vertical.svg diff --git a/v1/img/GitHub/key.svg b/static/img/GitHub/key.svg similarity index 100% rename from v1/img/GitHub/key.svg rename to static/img/GitHub/key.svg diff --git a/v1/img/GitHub/keyboard.svg b/static/img/GitHub/keyboard.svg similarity index 100% rename from v1/img/GitHub/keyboard.svg rename to static/img/GitHub/keyboard.svg diff --git a/v1/img/GitHub/law.svg b/static/img/GitHub/law.svg similarity index 100% rename from v1/img/GitHub/law.svg rename to static/img/GitHub/law.svg diff --git a/v1/img/GitHub/light-bulb.svg b/static/img/GitHub/light-bulb.svg similarity index 100% rename from v1/img/GitHub/light-bulb.svg rename to static/img/GitHub/light-bulb.svg diff --git a/v1/img/GitHub/link-external.svg b/static/img/GitHub/link-external.svg similarity index 100% rename from v1/img/GitHub/link-external.svg rename to static/img/GitHub/link-external.svg diff --git a/v1/img/GitHub/link.svg b/static/img/GitHub/link.svg similarity index 100% rename from v1/img/GitHub/link.svg rename to static/img/GitHub/link.svg diff --git a/v1/img/GitHub/list-ordered.svg b/static/img/GitHub/list-ordered.svg similarity index 100% rename from v1/img/GitHub/list-ordered.svg rename to static/img/GitHub/list-ordered.svg diff --git a/v1/img/GitHub/list-unordered.svg b/static/img/GitHub/list-unordered.svg similarity index 100% rename from v1/img/GitHub/list-unordered.svg rename to static/img/GitHub/list-unordered.svg diff --git a/v1/img/GitHub/location.svg b/static/img/GitHub/location.svg similarity index 100% rename from v1/img/GitHub/location.svg rename to static/img/GitHub/location.svg diff --git a/v1/img/GitHub/lock.svg b/static/img/GitHub/lock.svg similarity index 100% rename from v1/img/GitHub/lock.svg rename to static/img/GitHub/lock.svg diff --git a/v1/img/GitHub/logo-gist.svg b/static/img/GitHub/logo-gist.svg similarity index 100% rename from v1/img/GitHub/logo-gist.svg rename to static/img/GitHub/logo-gist.svg diff --git a/v1/img/GitHub/logo-github.svg b/static/img/GitHub/logo-github.svg similarity index 100% rename from v1/img/GitHub/logo-github.svg rename to static/img/GitHub/logo-github.svg diff --git a/v1/img/GitHub/mail-read.svg b/static/img/GitHub/mail-read.svg similarity index 100% rename from v1/img/GitHub/mail-read.svg rename to static/img/GitHub/mail-read.svg diff --git a/v1/img/GitHub/mail.svg b/static/img/GitHub/mail.svg similarity index 100% rename from v1/img/GitHub/mail.svg rename to static/img/GitHub/mail.svg diff --git a/v1/img/GitHub/mark-github.svg b/static/img/GitHub/mark-github.svg similarity index 100% rename from v1/img/GitHub/mark-github.svg rename to static/img/GitHub/mark-github.svg diff --git a/v1/img/GitHub/markdown.svg b/static/img/GitHub/markdown.svg similarity index 100% rename from v1/img/GitHub/markdown.svg rename to static/img/GitHub/markdown.svg diff --git a/v1/img/GitHub/megaphone.svg b/static/img/GitHub/megaphone.svg similarity index 100% rename from v1/img/GitHub/megaphone.svg rename to static/img/GitHub/megaphone.svg diff --git a/v1/img/GitHub/mention.svg b/static/img/GitHub/mention.svg similarity index 100% rename from v1/img/GitHub/mention.svg rename to static/img/GitHub/mention.svg diff --git a/v1/img/GitHub/milestone.svg b/static/img/GitHub/milestone.svg similarity index 100% rename from v1/img/GitHub/milestone.svg rename to static/img/GitHub/milestone.svg diff --git a/v1/img/GitHub/mirror.svg b/static/img/GitHub/mirror.svg similarity index 100% rename from v1/img/GitHub/mirror.svg rename to static/img/GitHub/mirror.svg diff --git a/v1/img/GitHub/mortar-board.svg b/static/img/GitHub/mortar-board.svg similarity index 100% rename from v1/img/GitHub/mortar-board.svg rename to static/img/GitHub/mortar-board.svg diff --git a/v1/img/GitHub/mute.svg b/static/img/GitHub/mute.svg similarity index 100% rename from v1/img/GitHub/mute.svg rename to static/img/GitHub/mute.svg diff --git a/v1/img/GitHub/no-newline.svg b/static/img/GitHub/no-newline.svg similarity index 100% rename from v1/img/GitHub/no-newline.svg rename to static/img/GitHub/no-newline.svg diff --git a/v1/img/GitHub/note.svg b/static/img/GitHub/note.svg similarity index 100% rename from v1/img/GitHub/note.svg rename to static/img/GitHub/note.svg diff --git a/v1/img/GitHub/octoface.svg b/static/img/GitHub/octoface.svg similarity index 100% rename from v1/img/GitHub/octoface.svg rename to static/img/GitHub/octoface.svg diff --git a/v1/img/GitHub/organization.svg b/static/img/GitHub/organization.svg similarity index 100% rename from v1/img/GitHub/organization.svg rename to static/img/GitHub/organization.svg diff --git a/v1/img/GitHub/package.svg b/static/img/GitHub/package.svg similarity index 100% rename from v1/img/GitHub/package.svg rename to static/img/GitHub/package.svg diff --git a/v1/img/GitHub/paintcan.svg b/static/img/GitHub/paintcan.svg similarity index 100% rename from v1/img/GitHub/paintcan.svg rename to static/img/GitHub/paintcan.svg diff --git a/v1/img/GitHub/pencil.svg b/static/img/GitHub/pencil.svg similarity index 100% rename from v1/img/GitHub/pencil.svg rename to static/img/GitHub/pencil.svg diff --git a/v1/img/GitHub/person.svg b/static/img/GitHub/person.svg similarity index 100% rename from v1/img/GitHub/person.svg rename to static/img/GitHub/person.svg diff --git a/v1/img/GitHub/pin.svg b/static/img/GitHub/pin.svg similarity index 100% rename from v1/img/GitHub/pin.svg rename to static/img/GitHub/pin.svg diff --git a/v1/img/GitHub/plug.svg b/static/img/GitHub/plug.svg similarity index 100% rename from v1/img/GitHub/plug.svg rename to static/img/GitHub/plug.svg diff --git a/v1/img/GitHub/plus-small.svg b/static/img/GitHub/plus-small.svg similarity index 100% rename from v1/img/GitHub/plus-small.svg rename to static/img/GitHub/plus-small.svg diff --git a/v1/img/GitHub/plus.svg b/static/img/GitHub/plus.svg similarity index 100% rename from v1/img/GitHub/plus.svg rename to static/img/GitHub/plus.svg diff --git a/v1/img/GitHub/primitive-dot.svg b/static/img/GitHub/primitive-dot.svg similarity index 100% rename from v1/img/GitHub/primitive-dot.svg rename to static/img/GitHub/primitive-dot.svg diff --git a/v1/img/GitHub/primitive-square.svg b/static/img/GitHub/primitive-square.svg similarity index 100% rename from v1/img/GitHub/primitive-square.svg rename to static/img/GitHub/primitive-square.svg diff --git a/v1/img/GitHub/project.svg b/static/img/GitHub/project.svg similarity index 100% rename from v1/img/GitHub/project.svg rename to static/img/GitHub/project.svg diff --git a/v1/img/GitHub/pulse.svg b/static/img/GitHub/pulse.svg similarity index 100% rename from v1/img/GitHub/pulse.svg rename to static/img/GitHub/pulse.svg diff --git a/v1/img/GitHub/question.svg b/static/img/GitHub/question.svg similarity index 100% rename from v1/img/GitHub/question.svg rename to static/img/GitHub/question.svg diff --git a/v1/img/GitHub/quote.svg b/static/img/GitHub/quote.svg similarity index 100% rename from v1/img/GitHub/quote.svg rename to static/img/GitHub/quote.svg diff --git a/v1/img/GitHub/radio-tower.svg b/static/img/GitHub/radio-tower.svg similarity index 100% rename from v1/img/GitHub/radio-tower.svg rename to static/img/GitHub/radio-tower.svg diff --git a/v1/img/GitHub/reply.svg b/static/img/GitHub/reply.svg similarity index 100% rename from v1/img/GitHub/reply.svg rename to static/img/GitHub/reply.svg diff --git a/v1/img/GitHub/repo-clone.svg b/static/img/GitHub/repo-clone.svg similarity index 100% rename from v1/img/GitHub/repo-clone.svg rename to static/img/GitHub/repo-clone.svg diff --git a/v1/img/GitHub/repo-force-push.svg b/static/img/GitHub/repo-force-push.svg similarity index 100% rename from v1/img/GitHub/repo-force-push.svg rename to static/img/GitHub/repo-force-push.svg diff --git a/v1/img/GitHub/repo-forked.svg b/static/img/GitHub/repo-forked.svg similarity index 100% rename from v1/img/GitHub/repo-forked.svg rename to static/img/GitHub/repo-forked.svg diff --git a/v1/img/GitHub/repo-pull.svg b/static/img/GitHub/repo-pull.svg similarity index 100% rename from v1/img/GitHub/repo-pull.svg rename to static/img/GitHub/repo-pull.svg diff --git a/v1/img/GitHub/repo-push.svg b/static/img/GitHub/repo-push.svg similarity index 100% rename from v1/img/GitHub/repo-push.svg rename to static/img/GitHub/repo-push.svg diff --git a/v1/img/GitHub/repo.svg b/static/img/GitHub/repo.svg similarity index 100% rename from v1/img/GitHub/repo.svg rename to static/img/GitHub/repo.svg diff --git a/v1/img/GitHub/report.svg b/static/img/GitHub/report.svg similarity index 100% rename from v1/img/GitHub/report.svg rename to static/img/GitHub/report.svg diff --git a/v1/img/GitHub/rocket.svg b/static/img/GitHub/rocket.svg similarity index 100% rename from v1/img/GitHub/rocket.svg rename to static/img/GitHub/rocket.svg diff --git a/v1/img/GitHub/rss.svg b/static/img/GitHub/rss.svg similarity index 100% rename from v1/img/GitHub/rss.svg rename to static/img/GitHub/rss.svg diff --git a/v1/img/GitHub/ruby.svg b/static/img/GitHub/ruby.svg similarity index 100% rename from v1/img/GitHub/ruby.svg rename to static/img/GitHub/ruby.svg diff --git a/v1/img/GitHub/screen-full.svg b/static/img/GitHub/screen-full.svg similarity index 100% rename from v1/img/GitHub/screen-full.svg rename to static/img/GitHub/screen-full.svg diff --git a/v1/img/GitHub/screen-normal.svg b/static/img/GitHub/screen-normal.svg similarity index 100% rename from v1/img/GitHub/screen-normal.svg rename to static/img/GitHub/screen-normal.svg diff --git a/v1/img/GitHub/search.svg b/static/img/GitHub/search.svg similarity index 100% rename from v1/img/GitHub/search.svg rename to static/img/GitHub/search.svg diff --git a/v1/img/GitHub/server.svg b/static/img/GitHub/server.svg similarity index 100% rename from v1/img/GitHub/server.svg rename to static/img/GitHub/server.svg diff --git a/v1/img/GitHub/settings.svg b/static/img/GitHub/settings.svg similarity index 100% rename from v1/img/GitHub/settings.svg rename to static/img/GitHub/settings.svg diff --git a/v1/img/GitHub/shield.svg b/static/img/GitHub/shield.svg similarity index 100% rename from v1/img/GitHub/shield.svg rename to static/img/GitHub/shield.svg diff --git a/v1/img/GitHub/sign-in.svg b/static/img/GitHub/sign-in.svg similarity index 100% rename from v1/img/GitHub/sign-in.svg rename to static/img/GitHub/sign-in.svg diff --git a/v1/img/GitHub/sign-out.svg b/static/img/GitHub/sign-out.svg similarity index 100% rename from v1/img/GitHub/sign-out.svg rename to static/img/GitHub/sign-out.svg diff --git a/v1/img/GitHub/smiley.svg b/static/img/GitHub/smiley.svg similarity index 100% rename from v1/img/GitHub/smiley.svg rename to static/img/GitHub/smiley.svg diff --git a/v1/img/GitHub/squirrel.svg b/static/img/GitHub/squirrel.svg similarity index 100% rename from v1/img/GitHub/squirrel.svg rename to static/img/GitHub/squirrel.svg diff --git a/v1/img/GitHub/star.svg b/static/img/GitHub/star.svg similarity index 100% rename from v1/img/GitHub/star.svg rename to static/img/GitHub/star.svg diff --git a/v1/img/GitHub/stop.svg b/static/img/GitHub/stop.svg similarity index 100% rename from v1/img/GitHub/stop.svg rename to static/img/GitHub/stop.svg diff --git a/v1/img/GitHub/sync.svg b/static/img/GitHub/sync.svg similarity index 100% rename from v1/img/GitHub/sync.svg rename to static/img/GitHub/sync.svg diff --git a/v1/img/GitHub/tag.svg b/static/img/GitHub/tag.svg similarity index 100% rename from v1/img/GitHub/tag.svg rename to static/img/GitHub/tag.svg diff --git a/v1/img/GitHub/tasklist.svg b/static/img/GitHub/tasklist.svg similarity index 100% rename from v1/img/GitHub/tasklist.svg rename to static/img/GitHub/tasklist.svg diff --git a/v1/img/GitHub/telescope.svg b/static/img/GitHub/telescope.svg similarity index 100% rename from v1/img/GitHub/telescope.svg rename to static/img/GitHub/telescope.svg diff --git a/v1/img/GitHub/terminal.svg b/static/img/GitHub/terminal.svg similarity index 100% rename from v1/img/GitHub/terminal.svg rename to static/img/GitHub/terminal.svg diff --git a/v1/img/GitHub/text-size.svg b/static/img/GitHub/text-size.svg similarity index 100% rename from v1/img/GitHub/text-size.svg rename to static/img/GitHub/text-size.svg diff --git a/v1/img/GitHub/three-bars.svg b/static/img/GitHub/three-bars.svg similarity index 100% rename from v1/img/GitHub/three-bars.svg rename to static/img/GitHub/three-bars.svg diff --git a/v1/img/GitHub/thumbsdown.svg b/static/img/GitHub/thumbsdown.svg similarity index 100% rename from v1/img/GitHub/thumbsdown.svg rename to static/img/GitHub/thumbsdown.svg diff --git a/v1/img/GitHub/thumbsup.svg b/static/img/GitHub/thumbsup.svg similarity index 100% rename from v1/img/GitHub/thumbsup.svg rename to static/img/GitHub/thumbsup.svg diff --git a/v1/img/GitHub/tools.svg b/static/img/GitHub/tools.svg similarity index 100% rename from v1/img/GitHub/tools.svg rename to static/img/GitHub/tools.svg diff --git a/v1/img/GitHub/trashcan.svg b/static/img/GitHub/trashcan.svg similarity index 100% rename from v1/img/GitHub/trashcan.svg rename to static/img/GitHub/trashcan.svg diff --git a/v1/img/GitHub/triangle-down.svg b/static/img/GitHub/triangle-down.svg similarity index 100% rename from v1/img/GitHub/triangle-down.svg rename to static/img/GitHub/triangle-down.svg diff --git a/v1/img/GitHub/triangle-left.svg b/static/img/GitHub/triangle-left.svg similarity index 100% rename from v1/img/GitHub/triangle-left.svg rename to static/img/GitHub/triangle-left.svg diff --git a/v1/img/GitHub/triangle-right.svg b/static/img/GitHub/triangle-right.svg similarity index 100% rename from v1/img/GitHub/triangle-right.svg rename to static/img/GitHub/triangle-right.svg diff --git a/v1/img/GitHub/triangle-up.svg b/static/img/GitHub/triangle-up.svg similarity index 100% rename from v1/img/GitHub/triangle-up.svg rename to static/img/GitHub/triangle-up.svg diff --git a/v1/img/GitHub/unfold.svg b/static/img/GitHub/unfold.svg similarity index 100% rename from v1/img/GitHub/unfold.svg rename to static/img/GitHub/unfold.svg diff --git a/v1/img/GitHub/unmute.svg b/static/img/GitHub/unmute.svg similarity index 100% rename from v1/img/GitHub/unmute.svg rename to static/img/GitHub/unmute.svg diff --git a/v1/img/GitHub/unverified.svg b/static/img/GitHub/unverified.svg similarity index 100% rename from v1/img/GitHub/unverified.svg rename to static/img/GitHub/unverified.svg diff --git a/v1/img/GitHub/verified.svg b/static/img/GitHub/verified.svg similarity index 100% rename from v1/img/GitHub/verified.svg rename to static/img/GitHub/verified.svg diff --git a/v1/img/GitHub/versions.svg b/static/img/GitHub/versions.svg similarity index 100% rename from v1/img/GitHub/versions.svg rename to static/img/GitHub/versions.svg diff --git a/v1/img/GitHub/watch.svg b/static/img/GitHub/watch.svg similarity index 100% rename from v1/img/GitHub/watch.svg rename to static/img/GitHub/watch.svg diff --git a/v1/img/GitHub/x.svg b/static/img/GitHub/x.svg similarity index 100% rename from v1/img/GitHub/x.svg rename to static/img/GitHub/x.svg diff --git a/v1/img/GitHub/zap.svg b/static/img/GitHub/zap.svg similarity index 100% rename from v1/img/GitHub/zap.svg rename to static/img/GitHub/zap.svg diff --git a/v5/static/img/background-full.png b/static/img/background-full.png similarity index 100% rename from v5/static/img/background-full.png rename to static/img/background-full.png diff --git a/v5/static/img/background.png b/static/img/background.png similarity index 100% rename from v5/static/img/background.png rename to static/img/background.png diff --git a/static/img/background.webp b/static/img/background.webp new file mode 100644 index 0000000..508b5a0 Binary files /dev/null and b/static/img/background.webp differ diff --git a/static/img/embed-logo-dark.png b/static/img/embed-logo-dark.png new file mode 100644 index 0000000..9601bf0 Binary files /dev/null and b/static/img/embed-logo-dark.png differ diff --git a/static/img/embed-logo.png b/static/img/embed-logo.png new file mode 100644 index 0000000..28eb3c8 Binary files /dev/null and b/static/img/embed-logo.png differ diff --git a/static/img/favicon-dark.ico b/static/img/favicon-dark.ico new file mode 100644 index 0000000..8be81f6 Binary files /dev/null and b/static/img/favicon-dark.ico differ diff --git a/v5/static/img/favicon.ico b/static/img/favicon.ico similarity index 100% rename from v5/static/img/favicon.ico rename to static/img/favicon.ico diff --git a/v5/static/img/icons/archlinux.svg b/static/img/icons/archlinux.svg similarity index 100% rename from v5/static/img/icons/archlinux.svg rename to static/img/icons/archlinux.svg diff --git a/v5/static/img/icons/bootstrap.svg b/static/img/icons/bootstrap.svg similarity index 100% rename from v5/static/img/icons/bootstrap.svg rename to static/img/icons/bootstrap.svg diff --git a/v5/static/img/icons/c.svg b/static/img/icons/c.svg similarity index 100% rename from v5/static/img/icons/c.svg rename to static/img/icons/c.svg diff --git a/v5/static/img/icons/cassandra.svg b/static/img/icons/cassandra.svg similarity index 100% rename from v5/static/img/icons/cassandra.svg rename to static/img/icons/cassandra.svg diff --git a/v5/static/img/icons/centos.svg b/static/img/icons/centos.svg similarity index 100% rename from v5/static/img/icons/centos.svg rename to static/img/icons/centos.svg diff --git a/v5/static/img/icons/css3.svg b/static/img/icons/css3.svg similarity index 100% rename from v5/static/img/icons/css3.svg rename to static/img/icons/css3.svg diff --git a/v5/static/img/icons/debian.svg b/static/img/icons/debian.svg similarity index 100% rename from v5/static/img/icons/debian.svg rename to static/img/icons/debian.svg diff --git a/v5/static/img/icons/docker.svg b/static/img/icons/docker.svg similarity index 100% rename from v5/static/img/icons/docker.svg rename to static/img/icons/docker.svg diff --git a/v5/static/img/icons/elixir.svg b/static/img/icons/elixir.svg similarity index 100% rename from v5/static/img/icons/elixir.svg rename to static/img/icons/elixir.svg diff --git a/v5/static/img/icons/fedora.svg b/static/img/icons/fedora.svg similarity index 100% rename from v5/static/img/icons/fedora.svg rename to static/img/icons/fedora.svg diff --git a/v5/static/img/icons/git.svg b/static/img/icons/git.svg similarity index 100% rename from v5/static/img/icons/git.svg rename to static/img/icons/git.svg diff --git a/v5/static/img/icons/go.svg b/static/img/icons/go.svg similarity index 100% rename from v5/static/img/icons/go.svg rename to static/img/icons/go.svg diff --git a/v5/static/img/icons/html5.svg b/static/img/icons/html5.svg similarity index 100% rename from v5/static/img/icons/html5.svg rename to static/img/icons/html5.svg diff --git a/v5/static/img/icons/mariadb.svg b/static/img/icons/mariadb.svg similarity index 100% rename from v5/static/img/icons/mariadb.svg rename to static/img/icons/mariadb.svg diff --git a/v5/static/img/icons/mongodb.svg b/static/img/icons/mongodb.svg similarity index 100% rename from v5/static/img/icons/mongodb.svg rename to static/img/icons/mongodb.svg diff --git a/v5/static/img/icons/mysql.svg b/static/img/icons/mysql.svg similarity index 100% rename from v5/static/img/icons/mysql.svg rename to static/img/icons/mysql.svg diff --git a/v5/static/img/icons/nginx.svg b/static/img/icons/nginx.svg similarity index 100% rename from v5/static/img/icons/nginx.svg rename to static/img/icons/nginx.svg diff --git a/v5/static/img/icons/nodejs.svg b/static/img/icons/nodejs.svg similarity index 100% rename from v5/static/img/icons/nodejs.svg rename to static/img/icons/nodejs.svg diff --git a/v5/static/img/icons/postgres.svg b/static/img/icons/postgres.svg similarity index 100% rename from v5/static/img/icons/postgres.svg rename to static/img/icons/postgres.svg diff --git a/v5/static/img/icons/python.svg b/static/img/icons/python.svg similarity index 100% rename from v5/static/img/icons/python.svg rename to static/img/icons/python.svg diff --git a/v5/static/img/icons/raspberrypi.svg b/static/img/icons/raspberrypi.svg similarity index 100% rename from v5/static/img/icons/raspberrypi.svg rename to static/img/icons/raspberrypi.svg diff --git a/v5/static/img/icons/reactjs.svg b/static/img/icons/reactjs.svg similarity index 100% rename from v5/static/img/icons/reactjs.svg rename to static/img/icons/reactjs.svg diff --git a/v5/static/img/icons/redhat.svg b/static/img/icons/redhat.svg similarity index 100% rename from v5/static/img/icons/redhat.svg rename to static/img/icons/redhat.svg diff --git a/v5/static/img/icons/redis.svg b/static/img/icons/redis.svg similarity index 100% rename from v5/static/img/icons/redis.svg rename to static/img/icons/redis.svg diff --git a/v5/static/img/icons/rust.svg b/static/img/icons/rust.svg similarity index 100% rename from v5/static/img/icons/rust.svg rename to static/img/icons/rust.svg diff --git a/v5/static/img/icons/sass.svg b/static/img/icons/sass.svg similarity index 100% rename from v5/static/img/icons/sass.svg rename to static/img/icons/sass.svg diff --git a/v5/static/img/icons/shell.svg b/static/img/icons/shell.svg similarity index 100% rename from v5/static/img/icons/shell.svg rename to static/img/icons/shell.svg diff --git a/v5/static/img/icons/ubuntu.svg b/static/img/icons/ubuntu.svg similarity index 100% rename from v5/static/img/icons/ubuntu.svg rename to static/img/icons/ubuntu.svg diff --git a/static/img/logo-dark.png b/static/img/logo-dark.png new file mode 100644 index 0000000..9601bf0 Binary files /dev/null and b/static/img/logo-dark.png differ diff --git a/static/img/logo-gradient.svg b/static/img/logo-gradient.svg new file mode 100644 index 0000000..63a0388 --- /dev/null +++ b/static/img/logo-gradient.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/logo.png b/static/img/logo.png new file mode 100644 index 0000000..28eb3c8 Binary files /dev/null and b/static/img/logo.png differ diff --git a/v5/static/img/logo.svg b/static/img/logo.svg similarity index 100% rename from v5/static/img/logo.svg rename to static/img/logo.svg diff --git a/v1/img/svg/reptice.png b/static/img/svg/reptice.png similarity index 100% rename from v1/img/svg/reptice.png rename to static/img/svg/reptice.png diff --git a/v1/img/svg/reptice.svg b/static/img/svg/reptice.svg similarity index 100% rename from v1/img/svg/reptice.svg rename to static/img/svg/reptice.svg diff --git a/v5/static/js/app.js b/static/js/app.js similarity index 100% rename from v5/static/js/app.js rename to static/js/app.js diff --git a/v5/static/js/bootstrap.bundle.js b/static/js/bootstrap.bundle.js similarity index 100% rename from v5/static/js/bootstrap.bundle.js rename to static/js/bootstrap.bundle.js diff --git a/static/js/bootstrap.bundle.js.bak b/static/js/bootstrap.bundle.js.bak new file mode 100644 index 0000000..4d2e0b8 --- /dev/null +++ b/static/js/bootstrap.bundle.js.bak @@ -0,0 +1,3368 @@ +/*! + * Bootstrap v5.3.0-alpha1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory()); +})(this, (function () { 'use strict'; + + var top = 'top'; + var bottom = 'bottom'; + var right = 'right'; + var left = 'left'; + var auto = 'auto'; + var basePlacements = [top, bottom, right, left]; + var start = 'start'; + var end = 'end'; + var clippingParents = 'clippingParents'; + var viewport = 'viewport'; + var popper = 'popper'; + var reference = 'reference'; + var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) { + return acc.concat([placement + "-" + start, placement + "-" + end]); + }, []); + var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) { + return acc.concat([placement, placement + "-" + start, placement + "-" + end]); + }, []); // modifiers that need to read the DOM + + var beforeRead = 'beforeRead'; + var read = 'read'; + var afterRead = 'afterRead'; // pure-logic modifiers + + var beforeMain = 'beforeMain'; + var main = 'main'; + var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state) + + var beforeWrite = 'beforeWrite'; + var write = 'write'; + var afterWrite = 'afterWrite'; + var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; + + function getNodeName(element) { + return element ? (element.nodeName || '').toLowerCase() : null; + } + + function getWindow(node) { + if (node == null) { + return window; + } + + if (node.toString() !== '[object Window]') { + var ownerDocument = node.ownerDocument; + return ownerDocument ? ownerDocument.defaultView || window : window; + } + + return node; + } + + function isElement$1(node) { + var OwnElement = getWindow(node).Element; + return node instanceof OwnElement || node instanceof Element; + } + + function isHTMLElement(node) { + var OwnElement = getWindow(node).HTMLElement; + return node instanceof OwnElement || node instanceof HTMLElement; + } + + function isShadowRoot(node) { + // IE 11 has no ShadowRoot + if (typeof ShadowRoot === 'undefined') { + return false; + } + + var OwnElement = getWindow(node).ShadowRoot; + return node instanceof OwnElement || node instanceof ShadowRoot; + } + + // and applies them to the HTMLElements such as popper and arrow + + function applyStyles(_ref) { + var state = _ref.state; + Object.keys(state.elements).forEach(function (name) { + var style = state.styles[name] || {}; + var attributes = state.attributes[name] || {}; + var element = state.elements[name]; // arrow is optional + virtual elements + + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } // Flow doesn't support to extend this property, but it's the most + // effective way to apply styles to an HTMLElement + // $FlowFixMe[cannot-write] + + + Object.assign(element.style, style); + Object.keys(attributes).forEach(function (name) { + var value = attributes[name]; + + if (value === false) { + element.removeAttribute(name); + } else { + element.setAttribute(name, value === true ? '' : value); + } + }); + }); + } + + function effect$2(_ref2) { + var state = _ref2.state; + var initialStyles = { + popper: { + position: state.options.strategy, + left: '0', + top: '0', + margin: '0' + }, + arrow: { + position: 'absolute' + }, + reference: {} + }; + Object.assign(state.elements.popper.style, initialStyles.popper); + state.styles = initialStyles; + + if (state.elements.arrow) { + Object.assign(state.elements.arrow.style, initialStyles.arrow); + } + + return function () { + Object.keys(state.elements).forEach(function (name) { + var element = state.elements[name]; + var attributes = state.attributes[name] || {}; + var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them + + var style = styleProperties.reduce(function (style, property) { + style[property] = ''; + return style; + }, {}); // arrow is optional + virtual elements + + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } + + Object.assign(element.style, style); + Object.keys(attributes).forEach(function (attribute) { + element.removeAttribute(attribute); + }); + }); + }; + } // eslint-disable-next-line import/no-unused-modules + + + const applyStyles$1 = { + name: 'applyStyles', + enabled: true, + phase: 'write', + fn: applyStyles, + effect: effect$2, + requires: ['computeStyles'] + }; + + function getBasePlacement(placement) { + return placement.split('-')[0]; + } + + var max = Math.max; + var min = Math.min; + var round = Math.round; + + function getUAString() { + var uaData = navigator.userAgentData; + + if (uaData != null && uaData.brands) { + return uaData.brands.map(function (item) { + return item.brand + "/" + item.version; + }).join(' '); + } + + return navigator.userAgent; + } + + function isLayoutViewport() { + return !/^((?!chrome|android).)*safari/i.test(getUAString()); + } + + function getBoundingClientRect(element, includeScale, isFixedStrategy) { + if (includeScale === void 0) { + includeScale = false; + } + + if (isFixedStrategy === void 0) { + isFixedStrategy = false; + } + + var clientRect = element.getBoundingClientRect(); + var scaleX = 1; + var scaleY = 1; + + if (includeScale && isHTMLElement(element)) { + scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1; + scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1; + } + + var _ref = isElement$1(element) ? getWindow(element) : window, + visualViewport = _ref.visualViewport; + + var addVisualOffsets = !isLayoutViewport() && isFixedStrategy; + var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX; + var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY; + var width = clientRect.width / scaleX; + var height = clientRect.height / scaleY; + return { + width: width, + height: height, + top: y, + right: x + width, + bottom: y + height, + left: x, + x: x, + y: y + }; + } + + // means it doesn't take into account transforms. + + function getLayoutRect(element) { + var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed. + // Fixes https://github.com/popperjs/popper-core/issues/1223 + + var width = element.offsetWidth; + var height = element.offsetHeight; + + if (Math.abs(clientRect.width - width) <= 1) { + width = clientRect.width; + } + + if (Math.abs(clientRect.height - height) <= 1) { + height = clientRect.height; + } + + return { + x: element.offsetLeft, + y: element.offsetTop, + width: width, + height: height + }; + } + + function contains(parent, child) { + var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method + + if (parent.contains(child)) { + return true; + } // then fallback to custom implementation with Shadow DOM support + else if (rootNode && isShadowRoot(rootNode)) { + var next = child; + + do { + if (next && parent.isSameNode(next)) { + return true; + } // $FlowFixMe[prop-missing]: need a better way to handle this... + + + next = next.parentNode || next.host; + } while (next); + } // Give up, the result is false + + + return false; + } + + function getComputedStyle$1(element) { + return getWindow(element).getComputedStyle(element); + } + + function isTableElement(element) { + return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0; + } + + function getDocumentElement(element) { + // $FlowFixMe[incompatible-return]: assume body is always available + return ((isElement$1(element) ? element.ownerDocument : // $FlowFixMe[prop-missing] + element.document) || window.document).documentElement; + } + + function getParentNode(element) { + if (getNodeName(element) === 'html') { + return element; + } + + return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle + // $FlowFixMe[incompatible-return] + // $FlowFixMe[prop-missing] + element.assignedSlot || // step into the shadow DOM of the parent of a slotted node + element.parentNode || ( // DOM Element detected + isShadowRoot(element) ? element.host : null) || // ShadowRoot detected + // $FlowFixMe[incompatible-call]: HTMLElement is a Node + getDocumentElement(element) // fallback + + ); + } + + function getTrueOffsetParent(element) { + if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837 + getComputedStyle$1(element).position === 'fixed') { + return null; + } + + return element.offsetParent; + } // `.offsetParent` reports `null` for fixed elements, while absolute elements + // return the containing block + + + function getContainingBlock(element) { + var isFirefox = /firefox/i.test(getUAString()); + var isIE = /Trident/i.test(getUAString()); + + if (isIE && isHTMLElement(element)) { + // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport + var elementCss = getComputedStyle$1(element); + + if (elementCss.position === 'fixed') { + return null; + } + } + + var currentNode = getParentNode(element); + + if (isShadowRoot(currentNode)) { + currentNode = currentNode.host; + } + + while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) { + var css = getComputedStyle$1(currentNode); // This is non-exhaustive but covers the most common CSS properties that + // create a containing block. + // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block + + if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') { + return currentNode; + } else { + currentNode = currentNode.parentNode; + } + } + + return null; + } // Gets the closest ancestor positioned element. Handles some edge cases, + // such as table ancestors and cross browser bugs. + + + function getOffsetParent(element) { + var window = getWindow(element); + var offsetParent = getTrueOffsetParent(element); + + while (offsetParent && isTableElement(offsetParent) && getComputedStyle$1(offsetParent).position === 'static') { + offsetParent = getTrueOffsetParent(offsetParent); + } + + if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle$1(offsetParent).position === 'static')) { + return window; + } + + return offsetParent || getContainingBlock(element) || window; + } + + function getMainAxisFromPlacement(placement) { + return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y'; + } + + function within(min$1, value, max$1) { + return max(min$1, min(value, max$1)); + } + function withinMaxClamp(min, value, max) { + var v = within(min, value, max); + return v > max ? max : v; + } + + function getFreshSideObject() { + return { + top: 0, + right: 0, + bottom: 0, + left: 0 + }; + } + + function mergePaddingObject(paddingObject) { + return Object.assign({}, getFreshSideObject(), paddingObject); + } + + function expandToHashMap(value, keys) { + return keys.reduce(function (hashMap, key) { + hashMap[key] = value; + return hashMap; + }, {}); + } + + var toPaddingObject = function toPaddingObject(padding, state) { + padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, { + placement: state.placement + })) : padding; + return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); + }; + + function arrow(_ref) { + var _state$modifiersData$; + + var state = _ref.state, + name = _ref.name, + options = _ref.options; + var arrowElement = state.elements.arrow; + var popperOffsets = state.modifiersData.popperOffsets; + var basePlacement = getBasePlacement(state.placement); + var axis = getMainAxisFromPlacement(basePlacement); + var isVertical = [left, right].indexOf(basePlacement) >= 0; + var len = isVertical ? 'height' : 'width'; + + if (!arrowElement || !popperOffsets) { + return; + } + + var paddingObject = toPaddingObject(options.padding, state); + var arrowRect = getLayoutRect(arrowElement); + var minProp = axis === 'y' ? top : left; + var maxProp = axis === 'y' ? bottom : right; + var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len]; + var startDiff = popperOffsets[axis] - state.rects.reference[axis]; + var arrowOffsetParent = getOffsetParent(arrowElement); + var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; + var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is + // outside of the popper bounds + + var min = paddingObject[minProp]; + var max = clientSize - arrowRect[len] - paddingObject[maxProp]; + var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; + var offset = within(min, center, max); // Prevents breaking syntax highlighting... + + var axisProp = axis; + state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$); + } + + function effect$1(_ref2) { + var state = _ref2.state, + options = _ref2.options; + var _options$element = options.element, + arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element; + + if (arrowElement == null) { + return; + } // CSS selector + + + if (typeof arrowElement === 'string') { + arrowElement = state.elements.popper.querySelector(arrowElement); + + if (!arrowElement) { + return; + } + } + + if (!contains(state.elements.popper, arrowElement)) { + + return; + } + + state.elements.arrow = arrowElement; + } // eslint-disable-next-line import/no-unused-modules + + + const arrow$1 = { + name: 'arrow', + enabled: true, + phase: 'main', + fn: arrow, + effect: effect$1, + requires: ['popperOffsets'], + requiresIfExists: ['preventOverflow'] + }; + + function getVariation(placement) { + return placement.split('-')[1]; + } + + var unsetSides = { + top: 'auto', + right: 'auto', + bottom: 'auto', + left: 'auto' + }; // Round the offsets to the nearest suitable subpixel based on the DPR. + // Zooming can change the DPR, but it seems to report a value that will + // cleanly divide the values into the appropriate subpixels. + + function roundOffsetsByDPR(_ref) { + var x = _ref.x, + y = _ref.y; + var win = window; + var dpr = win.devicePixelRatio || 1; + return { + x: round(x * dpr) / dpr || 0, + y: round(y * dpr) / dpr || 0 + }; + } + + function mapToStyles(_ref2) { + var _Object$assign2; + + var popper = _ref2.popper, + popperRect = _ref2.popperRect, + placement = _ref2.placement, + variation = _ref2.variation, + offsets = _ref2.offsets, + position = _ref2.position, + gpuAcceleration = _ref2.gpuAcceleration, + adaptive = _ref2.adaptive, + roundOffsets = _ref2.roundOffsets, + isFixed = _ref2.isFixed; + var _offsets$x = offsets.x, + x = _offsets$x === void 0 ? 0 : _offsets$x, + _offsets$y = offsets.y, + y = _offsets$y === void 0 ? 0 : _offsets$y; + + var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({ + x: x, + y: y + }) : { + x: x, + y: y + }; + + x = _ref3.x; + y = _ref3.y; + var hasX = offsets.hasOwnProperty('x'); + var hasY = offsets.hasOwnProperty('y'); + var sideX = left; + var sideY = top; + var win = window; + + if (adaptive) { + var offsetParent = getOffsetParent(popper); + var heightProp = 'clientHeight'; + var widthProp = 'clientWidth'; + + if (offsetParent === getWindow(popper)) { + offsetParent = getDocumentElement(popper); + + if (getComputedStyle$1(offsetParent).position !== 'static' && position === 'absolute') { + heightProp = 'scrollHeight'; + widthProp = 'scrollWidth'; + } + } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it + + + offsetParent = offsetParent; + + if (placement === top || (placement === left || placement === right) && variation === end) { + sideY = bottom; + var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing] + offsetParent[heightProp]; + y -= offsetY - popperRect.height; + y *= gpuAcceleration ? 1 : -1; + } + + if (placement === left || (placement === top || placement === bottom) && variation === end) { + sideX = right; + var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing] + offsetParent[widthProp]; + x -= offsetX - popperRect.width; + x *= gpuAcceleration ? 1 : -1; + } + } + + var commonStyles = Object.assign({ + position: position + }, adaptive && unsetSides); + + var _ref4 = roundOffsets === true ? roundOffsetsByDPR({ + x: x, + y: y + }) : { + x: x, + y: y + }; + + x = _ref4.x; + y = _ref4.y; + + if (gpuAcceleration) { + var _Object$assign; + + return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); + } + + return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2)); + } + + function computeStyles(_ref5) { + var state = _ref5.state, + options = _ref5.options; + var _options$gpuAccelerat = options.gpuAcceleration, + gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, + _options$adaptive = options.adaptive, + adaptive = _options$adaptive === void 0 ? true : _options$adaptive, + _options$roundOffsets = options.roundOffsets, + roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; + + var commonStyles = { + placement: getBasePlacement(state.placement), + variation: getVariation(state.placement), + popper: state.elements.popper, + popperRect: state.rects.popper, + gpuAcceleration: gpuAcceleration, + isFixed: state.options.strategy === 'fixed' + }; + + if (state.modifiersData.popperOffsets != null) { + state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.popperOffsets, + position: state.options.strategy, + adaptive: adaptive, + roundOffsets: roundOffsets + }))); + } + + if (state.modifiersData.arrow != null) { + state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.arrow, + position: 'absolute', + adaptive: false, + roundOffsets: roundOffsets + }))); + } + + state.attributes.popper = Object.assign({}, state.attributes.popper, { + 'data-popper-placement': state.placement + }); + } // eslint-disable-next-line import/no-unused-modules + + + const computeStyles$1 = { + name: 'computeStyles', + enabled: true, + phase: 'beforeWrite', + fn: computeStyles, + data: {} + }; + + var passive = { + passive: true + }; + + function effect(_ref) { + var state = _ref.state, + instance = _ref.instance, + options = _ref.options; + var _options$scroll = options.scroll, + scroll = _options$scroll === void 0 ? true : _options$scroll, + _options$resize = options.resize, + resize = _options$resize === void 0 ? true : _options$resize; + var window = getWindow(state.elements.popper); + var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); + + if (scroll) { + scrollParents.forEach(function (scrollParent) { + scrollParent.addEventListener('scroll', instance.update, passive); + }); + } + + if (resize) { + window.addEventListener('resize', instance.update, passive); + } + + return function () { + if (scroll) { + scrollParents.forEach(function (scrollParent) { + scrollParent.removeEventListener('scroll', instance.update, passive); + }); + } + + if (resize) { + window.removeEventListener('resize', instance.update, passive); + } + }; + } // eslint-disable-next-line import/no-unused-modules + + + const eventListeners = { + name: 'eventListeners', + enabled: true, + phase: 'write', + fn: function fn() {}, + effect: effect, + data: {} + }; + + var hash$1 = { + left: 'right', + right: 'left', + bottom: 'top', + top: 'bottom' + }; + function getOppositePlacement(placement) { + return placement.replace(/left|right|bottom|top/g, function (matched) { + return hash$1[matched]; + }); + } + + var hash = { + start: 'end', + end: 'start' + }; + function getOppositeVariationPlacement(placement) { + return placement.replace(/start|end/g, function (matched) { + return hash[matched]; + }); + } + + function getWindowScroll(node) { + var win = getWindow(node); + var scrollLeft = win.pageXOffset; + var scrollTop = win.pageYOffset; + return { + scrollLeft: scrollLeft, + scrollTop: scrollTop + }; + } + + function getWindowScrollBarX(element) { + // If has a CSS width greater than the viewport, then this will be + // incorrect for RTL. + // Popper 1 is broken in this case and never had a bug report so let's assume + // it's not an issue. I don't think anyone ever specifies width on + // anyway. + // Browsers where the left scrollbar doesn't cause an issue report `0` for + // this (e.g. Edge 2019, IE11, Safari) + return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; + } + + function getViewportRect(element, strategy) { + var win = getWindow(element); + var html = getDocumentElement(element); + var visualViewport = win.visualViewport; + var width = html.clientWidth; + var height = html.clientHeight; + var x = 0; + var y = 0; + + if (visualViewport) { + width = visualViewport.width; + height = visualViewport.height; + var layoutViewport = isLayoutViewport(); + + if (layoutViewport || !layoutViewport && strategy === 'fixed') { + x = visualViewport.offsetLeft; + y = visualViewport.offsetTop; + } + } + + return { + width: width, + height: height, + x: x + getWindowScrollBarX(element), + y: y + }; + } + + // of the `` and `` rect bounds if horizontally scrollable + + function getDocumentRect(element) { + var _element$ownerDocumen; + + var html = getDocumentElement(element); + var winScroll = getWindowScroll(element); + var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; + var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); + var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); + var x = -winScroll.scrollLeft + getWindowScrollBarX(element); + var y = -winScroll.scrollTop; + + if (getComputedStyle$1(body || html).direction === 'rtl') { + x += max(html.clientWidth, body ? body.clientWidth : 0) - width; + } + + return { + width: width, + height: height, + x: x, + y: y + }; + } + + function isScrollParent(element) { + // Firefox wants us to check `-x` and `-y` variations as well + var _getComputedStyle = getComputedStyle$1(element), + overflow = _getComputedStyle.overflow, + overflowX = _getComputedStyle.overflowX, + overflowY = _getComputedStyle.overflowY; + + return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); + } + + function getScrollParent(node) { + if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) { + // $FlowFixMe[incompatible-return]: assume body is always available + return node.ownerDocument.body; + } + + if (isHTMLElement(node) && isScrollParent(node)) { + return node; + } + + return getScrollParent(getParentNode(node)); + } + + /* + given a DOM element, return the list of all scroll parents, up the list of ancesors + until we get to the top window object. This list is what we attach scroll listeners + to, because if any of these parent elements scroll, we'll need to re-calculate the + reference element's position. + */ + + function listScrollParents(element, list) { + var _element$ownerDocumen; + + if (list === void 0) { + list = []; + } + + var scrollParent = getScrollParent(element); + var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); + var win = getWindow(scrollParent); + var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; + var updatedList = list.concat(target); + return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here + updatedList.concat(listScrollParents(getParentNode(target))); + } + + function rectToClientRect(rect) { + return Object.assign({}, rect, { + left: rect.x, + top: rect.y, + right: rect.x + rect.width, + bottom: rect.y + rect.height + }); + } + + function getInnerBoundingClientRect(element, strategy) { + var rect = getBoundingClientRect(element, false, strategy === 'fixed'); + rect.top = rect.top + element.clientTop; + rect.left = rect.left + element.clientLeft; + rect.bottom = rect.top + element.clientHeight; + rect.right = rect.left + element.clientWidth; + rect.width = element.clientWidth; + rect.height = element.clientHeight; + rect.x = rect.left; + rect.y = rect.top; + return rect; + } + + function getClientRectFromMixedType(element, clippingParent, strategy) { + return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement$1(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element))); + } // A "clipping parent" is an overflowable container with the characteristic of + // clipping (or hiding) overflowing elements with a position different from + // `initial` + + + function getClippingParents(element) { + var clippingParents = listScrollParents(getParentNode(element)); + var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle$1(element).position) >= 0; + var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; + + if (!isElement$1(clipperElement)) { + return []; + } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414 + + + return clippingParents.filter(function (clippingParent) { + return isElement$1(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body'; + }); + } // Gets the maximum area that the element is visible in due to any number of + // clipping parents + + + function getClippingRect(element, boundary, rootBoundary, strategy) { + var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary); + var clippingParents = [].concat(mainClippingParents, [rootBoundary]); + var firstClippingParent = clippingParents[0]; + var clippingRect = clippingParents.reduce(function (accRect, clippingParent) { + var rect = getClientRectFromMixedType(element, clippingParent, strategy); + accRect.top = max(rect.top, accRect.top); + accRect.right = min(rect.right, accRect.right); + accRect.bottom = min(rect.bottom, accRect.bottom); + accRect.left = max(rect.left, accRect.left); + return accRect; + }, getClientRectFromMixedType(element, firstClippingParent, strategy)); + clippingRect.width = clippingRect.right - clippingRect.left; + clippingRect.height = clippingRect.bottom - clippingRect.top; + clippingRect.x = clippingRect.left; + clippingRect.y = clippingRect.top; + return clippingRect; + } + + function computeOffsets(_ref) { + var reference = _ref.reference, + element = _ref.element, + placement = _ref.placement; + var basePlacement = placement ? getBasePlacement(placement) : null; + var variation = placement ? getVariation(placement) : null; + var commonX = reference.x + reference.width / 2 - element.width / 2; + var commonY = reference.y + reference.height / 2 - element.height / 2; + var offsets; + + switch (basePlacement) { + case top: + offsets = { + x: commonX, + y: reference.y - element.height + }; + break; + + case bottom: + offsets = { + x: commonX, + y: reference.y + reference.height + }; + break; + + case right: + offsets = { + x: reference.x + reference.width, + y: commonY + }; + break; + + case left: + offsets = { + x: reference.x - element.width, + y: commonY + }; + break; + + default: + offsets = { + x: reference.x, + y: reference.y + }; + } + + var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; + + if (mainAxis != null) { + var len = mainAxis === 'y' ? 'height' : 'width'; + + switch (variation) { + case start: + offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2); + break; + + case end: + offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2); + break; + } + } + + return offsets; + } + + function detectOverflow(state, options) { + if (options === void 0) { + options = {}; + } + + var _options = options, + _options$placement = _options.placement, + placement = _options$placement === void 0 ? state.placement : _options$placement, + _options$strategy = _options.strategy, + strategy = _options$strategy === void 0 ? state.strategy : _options$strategy, + _options$boundary = _options.boundary, + boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, + _options$rootBoundary = _options.rootBoundary, + rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, + _options$elementConte = _options.elementContext, + elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, + _options$altBoundary = _options.altBoundary, + altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, + _options$padding = _options.padding, + padding = _options$padding === void 0 ? 0 : _options$padding; + var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); + var altContext = elementContext === popper ? reference : popper; + var popperRect = state.rects.popper; + var element = state.elements[altBoundary ? altContext : elementContext]; + var clippingClientRect = getClippingRect(isElement$1(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy); + var referenceClientRect = getBoundingClientRect(state.elements.reference); + var popperOffsets = computeOffsets({ + reference: referenceClientRect, + element: popperRect, + strategy: 'absolute', + placement: placement + }); + var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets)); + var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect + // 0 or negative = within the clipping rect + + var overflowOffsets = { + top: clippingClientRect.top - elementClientRect.top + paddingObject.top, + bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, + left: clippingClientRect.left - elementClientRect.left + paddingObject.left, + right: elementClientRect.right - clippingClientRect.right + paddingObject.right + }; + var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element + + if (elementContext === popper && offsetData) { + var offset = offsetData[placement]; + Object.keys(overflowOffsets).forEach(function (key) { + var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; + var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x'; + overflowOffsets[key] += offset[axis] * multiply; + }); + } + + return overflowOffsets; + } + + function computeAutoPlacement(state, options) { + if (options === void 0) { + options = {}; + } + + var _options = options, + placement = _options.placement, + boundary = _options.boundary, + rootBoundary = _options.rootBoundary, + padding = _options.padding, + flipVariations = _options.flipVariations, + _options$allowedAutoP = _options.allowedAutoPlacements, + allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP; + var variation = getVariation(placement); + var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) { + return getVariation(placement) === variation; + }) : basePlacements; + var allowedPlacements = placements$1.filter(function (placement) { + return allowedAutoPlacements.indexOf(placement) >= 0; + }); + + if (allowedPlacements.length === 0) { + allowedPlacements = placements$1; + } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions... + + + var overflows = allowedPlacements.reduce(function (acc, placement) { + acc[placement] = detectOverflow(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding + })[getBasePlacement(placement)]; + return acc; + }, {}); + return Object.keys(overflows).sort(function (a, b) { + return overflows[a] - overflows[b]; + }); + } + + function getExpandedFallbackPlacements(placement) { + if (getBasePlacement(placement) === auto) { + return []; + } + + var oppositePlacement = getOppositePlacement(placement); + return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; + } + + function flip(_ref) { + var state = _ref.state, + options = _ref.options, + name = _ref.name; + + if (state.modifiersData[name]._skip) { + return; + } + + var _options$mainAxis = options.mainAxis, + checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, + _options$altAxis = options.altAxis, + checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, + specifiedFallbackPlacements = options.fallbackPlacements, + padding = options.padding, + boundary = options.boundary, + rootBoundary = options.rootBoundary, + altBoundary = options.altBoundary, + _options$flipVariatio = options.flipVariations, + flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, + allowedAutoPlacements = options.allowedAutoPlacements; + var preferredPlacement = state.options.placement; + var basePlacement = getBasePlacement(preferredPlacement); + var isBasePlacement = basePlacement === preferredPlacement; + var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); + var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) { + return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding, + flipVariations: flipVariations, + allowedAutoPlacements: allowedAutoPlacements + }) : placement); + }, []); + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var checksMap = new Map(); + var makeFallbackChecks = true; + var firstFittingPlacement = placements[0]; + + for (var i = 0; i < placements.length; i++) { + var placement = placements[i]; + + var _basePlacement = getBasePlacement(placement); + + var isStartVariation = getVariation(placement) === start; + var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; + var len = isVertical ? 'width' : 'height'; + var overflow = detectOverflow(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + altBoundary: altBoundary, + padding: padding + }); + var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top; + + if (referenceRect[len] > popperRect[len]) { + mainVariationSide = getOppositePlacement(mainVariationSide); + } + + var altVariationSide = getOppositePlacement(mainVariationSide); + var checks = []; + + if (checkMainAxis) { + checks.push(overflow[_basePlacement] <= 0); + } + + if (checkAltAxis) { + checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); + } + + if (checks.every(function (check) { + return check; + })) { + firstFittingPlacement = placement; + makeFallbackChecks = false; + break; + } + + checksMap.set(placement, checks); + } + + if (makeFallbackChecks) { + // `2` may be desired in some cases – research later + var numberOfChecks = flipVariations ? 3 : 1; + + var _loop = function _loop(_i) { + var fittingPlacement = placements.find(function (placement) { + var checks = checksMap.get(placement); + + if (checks) { + return checks.slice(0, _i).every(function (check) { + return check; + }); + } + }); + + if (fittingPlacement) { + firstFittingPlacement = fittingPlacement; + return "break"; + } + }; + + for (var _i = numberOfChecks; _i > 0; _i--) { + var _ret = _loop(_i); + + if (_ret === "break") break; + } + } + + if (state.placement !== firstFittingPlacement) { + state.modifiersData[name]._skip = true; + state.placement = firstFittingPlacement; + state.reset = true; + } + } // eslint-disable-next-line import/no-unused-modules + + + const flip$1 = { + name: 'flip', + enabled: true, + phase: 'main', + fn: flip, + requiresIfExists: ['offset'], + data: { + _skip: false + } + }; + + function getSideOffsets(overflow, rect, preventedOffsets) { + if (preventedOffsets === void 0) { + preventedOffsets = { + x: 0, + y: 0 + }; + } + + return { + top: overflow.top - rect.height - preventedOffsets.y, + right: overflow.right - rect.width + preventedOffsets.x, + bottom: overflow.bottom - rect.height + preventedOffsets.y, + left: overflow.left - rect.width - preventedOffsets.x + }; + } + + function isAnySideFullyClipped(overflow) { + return [top, right, bottom, left].some(function (side) { + return overflow[side] >= 0; + }); + } + + function hide(_ref) { + var state = _ref.state, + name = _ref.name; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var preventedOffsets = state.modifiersData.preventOverflow; + var referenceOverflow = detectOverflow(state, { + elementContext: 'reference' + }); + var popperAltOverflow = detectOverflow(state, { + altBoundary: true + }); + var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); + var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); + var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); + var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); + state.modifiersData[name] = { + referenceClippingOffsets: referenceClippingOffsets, + popperEscapeOffsets: popperEscapeOffsets, + isReferenceHidden: isReferenceHidden, + hasPopperEscaped: hasPopperEscaped + }; + state.attributes.popper = Object.assign({}, state.attributes.popper, { + 'data-popper-reference-hidden': isReferenceHidden, + 'data-popper-escaped': hasPopperEscaped + }); + } // eslint-disable-next-line import/no-unused-modules + + + const hide$1 = { + name: 'hide', + enabled: true, + phase: 'main', + requiresIfExists: ['preventOverflow'], + fn: hide + }; + + function distanceAndSkiddingToXY(placement, rects, offset) { + var basePlacement = getBasePlacement(placement); + var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1; + + var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, { + placement: placement + })) : offset, + skidding = _ref[0], + distance = _ref[1]; + + skidding = skidding || 0; + distance = (distance || 0) * invertDistance; + return [left, right].indexOf(basePlacement) >= 0 ? { + x: distance, + y: skidding + } : { + x: skidding, + y: distance + }; + } + + function offset(_ref2) { + var state = _ref2.state, + options = _ref2.options, + name = _ref2.name; + var _options$offset = options.offset, + offset = _options$offset === void 0 ? [0, 0] : _options$offset; + var data = placements.reduce(function (acc, placement) { + acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset); + return acc; + }, {}); + var _data$state$placement = data[state.placement], + x = _data$state$placement.x, + y = _data$state$placement.y; + + if (state.modifiersData.popperOffsets != null) { + state.modifiersData.popperOffsets.x += x; + state.modifiersData.popperOffsets.y += y; + } + + state.modifiersData[name] = data; + } // eslint-disable-next-line import/no-unused-modules + + + const offset$1 = { + name: 'offset', + enabled: true, + phase: 'main', + requires: ['popperOffsets'], + fn: offset + }; + + function popperOffsets(_ref) { + var state = _ref.state, + name = _ref.name; + // Offsets are the actual position the popper needs to have to be + // properly positioned near its reference element + // This is the most basic placement, and will be adjusted by + // the modifiers in the next step + state.modifiersData[name] = computeOffsets({ + reference: state.rects.reference, + element: state.rects.popper, + strategy: 'absolute', + placement: state.placement + }); + } // eslint-disable-next-line import/no-unused-modules + + + const popperOffsets$1 = { + name: 'popperOffsets', + enabled: true, + phase: 'read', + fn: popperOffsets, + data: {} + }; + + function getAltAxis(axis) { + return axis === 'x' ? 'y' : 'x'; + } + + function preventOverflow(_ref) { + var state = _ref.state, + options = _ref.options, + name = _ref.name; + var _options$mainAxis = options.mainAxis, + checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, + _options$altAxis = options.altAxis, + checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, + boundary = options.boundary, + rootBoundary = options.rootBoundary, + altBoundary = options.altBoundary, + padding = options.padding, + _options$tether = options.tether, + tether = _options$tether === void 0 ? true : _options$tether, + _options$tetherOffset = options.tetherOffset, + tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; + var overflow = detectOverflow(state, { + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding, + altBoundary: altBoundary + }); + var basePlacement = getBasePlacement(state.placement); + var variation = getVariation(state.placement); + var isBasePlacement = !variation; + var mainAxis = getMainAxisFromPlacement(basePlacement); + var altAxis = getAltAxis(mainAxis); + var popperOffsets = state.modifiersData.popperOffsets; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, { + placement: state.placement + })) : tetherOffset; + var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? { + mainAxis: tetherOffsetValue, + altAxis: tetherOffsetValue + } : Object.assign({ + mainAxis: 0, + altAxis: 0 + }, tetherOffsetValue); + var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null; + var data = { + x: 0, + y: 0 + }; + + if (!popperOffsets) { + return; + } + + if (checkMainAxis) { + var _offsetModifierState$; + + var mainSide = mainAxis === 'y' ? top : left; + var altSide = mainAxis === 'y' ? bottom : right; + var len = mainAxis === 'y' ? 'height' : 'width'; + var offset = popperOffsets[mainAxis]; + var min$1 = offset + overflow[mainSide]; + var max$1 = offset - overflow[altSide]; + var additive = tether ? -popperRect[len] / 2 : 0; + var minLen = variation === start ? referenceRect[len] : popperRect[len]; + var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go + // outside the reference bounds + + var arrowElement = state.elements.arrow; + var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { + width: 0, + height: 0 + }; + var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject(); + var arrowPaddingMin = arrowPaddingObject[mainSide]; + var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want + // to include its full size in the calculation. If the reference is small + // and near the edge of a boundary, the popper can overflow even if the + // reference is not overflowing as well (e.g. virtual elements with no + // width or height) + + var arrowLen = within(0, referenceRect[len], arrowRect[len]); + var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis; + var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis; + var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); + var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; + var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0; + var tetherMin = offset + minOffset - offsetModifierValue - clientOffset; + var tetherMax = offset + maxOffset - offsetModifierValue; + var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset, tether ? max(max$1, tetherMax) : max$1); + popperOffsets[mainAxis] = preventedOffset; + data[mainAxis] = preventedOffset - offset; + } + + if (checkAltAxis) { + var _offsetModifierState$2; + + var _mainSide = mainAxis === 'x' ? top : left; + + var _altSide = mainAxis === 'x' ? bottom : right; + + var _offset = popperOffsets[altAxis]; + + var _len = altAxis === 'y' ? 'height' : 'width'; + + var _min = _offset + overflow[_mainSide]; + + var _max = _offset - overflow[_altSide]; + + var isOriginSide = [top, left].indexOf(basePlacement) !== -1; + + var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0; + + var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis; + + var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max; + + var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max); + + popperOffsets[altAxis] = _preventedOffset; + data[altAxis] = _preventedOffset - _offset; + } + + state.modifiersData[name] = data; + } // eslint-disable-next-line import/no-unused-modules + + + const preventOverflow$1 = { + name: 'preventOverflow', + enabled: true, + phase: 'main', + fn: preventOverflow, + requiresIfExists: ['offset'] + }; + + function getHTMLElementScroll(element) { + return { + scrollLeft: element.scrollLeft, + scrollTop: element.scrollTop + }; + } + + function getNodeScroll(node) { + if (node === getWindow(node) || !isHTMLElement(node)) { + return getWindowScroll(node); + } else { + return getHTMLElementScroll(node); + } + } + + function isElementScaled(element) { + var rect = element.getBoundingClientRect(); + var scaleX = round(rect.width) / element.offsetWidth || 1; + var scaleY = round(rect.height) / element.offsetHeight || 1; + return scaleX !== 1 || scaleY !== 1; + } // Returns the composite rect of an element relative to its offsetParent. + // Composite means it takes into account transforms as well as layout. + + + function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { + if (isFixed === void 0) { + isFixed = false; + } + + var isOffsetParentAnElement = isHTMLElement(offsetParent); + var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent); + var documentElement = getDocumentElement(offsetParent); + var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed); + var scroll = { + scrollLeft: 0, + scrollTop: 0 + }; + var offsets = { + x: 0, + y: 0 + }; + + if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { + if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078 + isScrollParent(documentElement)) { + scroll = getNodeScroll(offsetParent); + } + + if (isHTMLElement(offsetParent)) { + offsets = getBoundingClientRect(offsetParent, true); + offsets.x += offsetParent.clientLeft; + offsets.y += offsetParent.clientTop; + } else if (documentElement) { + offsets.x = getWindowScrollBarX(documentElement); + } + } + + return { + x: rect.left + scroll.scrollLeft - offsets.x, + y: rect.top + scroll.scrollTop - offsets.y, + width: rect.width, + height: rect.height + }; + } + + function order(modifiers) { + var map = new Map(); + var visited = new Set(); + var result = []; + modifiers.forEach(function (modifier) { + map.set(modifier.name, modifier); + }); // On visiting object, check for its dependencies and visit them recursively + + function sort(modifier) { + visited.add(modifier.name); + var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); + requires.forEach(function (dep) { + if (!visited.has(dep)) { + var depModifier = map.get(dep); + + if (depModifier) { + sort(depModifier); + } + } + }); + result.push(modifier); + } + + modifiers.forEach(function (modifier) { + if (!visited.has(modifier.name)) { + // check for visited object + sort(modifier); + } + }); + return result; + } + + function orderModifiers(modifiers) { + // order based on dependencies + var orderedModifiers = order(modifiers); // order based on phase + + return modifierPhases.reduce(function (acc, phase) { + return acc.concat(orderedModifiers.filter(function (modifier) { + return modifier.phase === phase; + })); + }, []); + } + + function debounce(fn) { + var pending; + return function () { + if (!pending) { + pending = new Promise(function (resolve) { + Promise.resolve().then(function () { + pending = undefined; + resolve(fn()); + }); + }); + } + + return pending; + }; + } + + function mergeByName(modifiers) { + var merged = modifiers.reduce(function (merged, current) { + var existing = merged[current.name]; + merged[current.name] = existing ? Object.assign({}, existing, current, { + options: Object.assign({}, existing.options, current.options), + data: Object.assign({}, existing.data, current.data) + }) : current; + return merged; + }, {}); // IE11 does not support Object.values + + return Object.keys(merged).map(function (key) { + return merged[key]; + }); + } + + var DEFAULT_OPTIONS = { + placement: 'bottom', + modifiers: [], + strategy: 'absolute' + }; + + function areValidElements() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return !args.some(function (element) { + return !(element && typeof element.getBoundingClientRect === 'function'); + }); + } + + function popperGenerator(generatorOptions) { + if (generatorOptions === void 0) { + generatorOptions = {}; + } + + var _generatorOptions = generatorOptions, + _generatorOptions$def = _generatorOptions.defaultModifiers, + defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, + _generatorOptions$def2 = _generatorOptions.defaultOptions, + defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; + return function createPopper(reference, popper, options) { + if (options === void 0) { + options = defaultOptions; + } + + var state = { + placement: 'bottom', + orderedModifiers: [], + options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), + modifiersData: {}, + elements: { + reference: reference, + popper: popper + }, + attributes: {}, + styles: {} + }; + var effectCleanupFns = []; + var isDestroyed = false; + var instance = { + state: state, + setOptions: function setOptions(setOptionsAction) { + var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction; + cleanupModifierEffects(); + state.options = Object.assign({}, defaultOptions, state.options, options); + state.scrollParents = { + reference: isElement$1(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [], + popper: listScrollParents(popper) + }; // Orders the modifiers based on their dependencies and `phase` + // properties + + var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers + + state.orderedModifiers = orderedModifiers.filter(function (m) { + return m.enabled; + }); // Validate the provided modifiers so that the consumer will get warned + + runModifierEffects(); + return instance.update(); + }, + // Sync update – it will always be executed, even if not necessary. This + // is useful for low frequency updates where sync behavior simplifies the + // logic. + // For high frequency updates (e.g. `resize` and `scroll` events), always + // prefer the async Popper#update method + forceUpdate: function forceUpdate() { + if (isDestroyed) { + return; + } + + var _state$elements = state.elements, + reference = _state$elements.reference, + popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements + // anymore + + if (!areValidElements(reference, popper)) { + + return; + } // Store the reference and popper rects to be read by modifiers + + + state.rects = { + reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'), + popper: getLayoutRect(popper) + }; // Modifiers have the ability to reset the current update cycle. The + // most common use case for this is the `flip` modifier changing the + // placement, which then needs to re-run all the modifiers, because the + // logic was previously ran for the previous placement and is therefore + // stale/incorrect + + state.reset = false; + state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier + // is filled with the initial data specified by the modifier. This means + // it doesn't persist and is fresh on each update. + // To ensure persistent data, use `${name}#persistent` + + state.orderedModifiers.forEach(function (modifier) { + return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); + }); + + for (var index = 0; index < state.orderedModifiers.length; index++) { + + if (state.reset === true) { + state.reset = false; + index = -1; + continue; + } + + var _state$orderedModifie = state.orderedModifiers[index], + fn = _state$orderedModifie.fn, + _state$orderedModifie2 = _state$orderedModifie.options, + _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, + name = _state$orderedModifie.name; + + if (typeof fn === 'function') { + state = fn({ + state: state, + options: _options, + name: name, + instance: instance + }) || state; + } + } + }, + // Async and optimistically optimized update – it will not be executed if + // not necessary (debounced to run at most once-per-tick) + update: debounce(function () { + return new Promise(function (resolve) { + instance.forceUpdate(); + resolve(state); + }); + }), + destroy: function destroy() { + cleanupModifierEffects(); + isDestroyed = true; + } + }; + + if (!areValidElements(reference, popper)) { + + return instance; + } + + instance.setOptions(options).then(function (state) { + if (!isDestroyed && options.onFirstUpdate) { + options.onFirstUpdate(state); + } + }); // Modifiers have the ability to execute arbitrary code before the first + // update cycle runs. They will be executed in the same order as the update + // cycle. This is useful when a modifier adds some persistent data that + // other modifiers need to use, but the modifier is run after the dependent + // one. + + function runModifierEffects() { + state.orderedModifiers.forEach(function (_ref3) { + var name = _ref3.name, + _ref3$options = _ref3.options, + options = _ref3$options === void 0 ? {} : _ref3$options, + effect = _ref3.effect; + + if (typeof effect === 'function') { + var cleanupFn = effect({ + state: state, + name: name, + instance: instance, + options: options + }); + + var noopFn = function noopFn() {}; + + effectCleanupFns.push(cleanupFn || noopFn); + } + }); + } + + function cleanupModifierEffects() { + effectCleanupFns.forEach(function (fn) { + return fn(); + }); + effectCleanupFns = []; + } + + return instance; + }; + } + var createPopper$2 = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules + + var defaultModifiers$1 = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1]; + var createPopper$1 = /*#__PURE__*/popperGenerator({ + defaultModifiers: defaultModifiers$1 + }); // eslint-disable-next-line import/no-unused-modules + + var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1]; + var createPopper = /*#__PURE__*/popperGenerator({ + defaultModifiers: defaultModifiers + }); // eslint-disable-next-line import/no-unused-modules + + const Popper = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({ + __proto__: null, + afterMain, + afterRead, + afterWrite, + applyStyles: applyStyles$1, + arrow: arrow$1, + auto, + basePlacements, + beforeMain, + beforeRead, + beforeWrite, + bottom, + clippingParents, + computeStyles: computeStyles$1, + createPopper, + createPopperBase: createPopper$2, + createPopperLite: createPopper$1, + detectOverflow, + end, + eventListeners, + flip: flip$1, + hide: hide$1, + left, + main, + modifierPhases, + offset: offset$1, + placements, + popper, + popperGenerator, + popperOffsets: popperOffsets$1, + preventOverflow: preventOverflow$1, + read, + reference, + right, + start, + top, + variationPlacements, + viewport, + write + }, Symbol.toStringTag, { value: 'Module' })); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.3.0-alpha1): util/index.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + const MAX_UID = 1000000; + const MILLISECONDS_MULTIPLIER = 1000; + const TRANSITION_END = 'transitionend'; + + /** + * Properly escape IDs selectors to handle weird IDs + * @param {string} selector + * @returns {string} + */ + const parseSelector = selector => { + if (selector && window.CSS && window.CSS.escape) { + // document.querySelector needs escaping to handle IDs (html5+) containing for instance / + selector = selector.replace(/#([^\s"#']+)/g, (match, id) => `#${CSS.escape(id)}`); + } + return selector; + }; + + // Shout-out Angus Croll (https://goo.gl/pxwQGp) + const toType = object => { + if (object === null || object === undefined) { + return `${object}`; + } + return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase(); + }; + + /** + * Public Util API + */ + + const getUID = prefix => { + do { + prefix += Math.floor(Math.random() * MAX_UID); + } while (document.getElementById(prefix)); + return prefix; + }; + const getTransitionDurationFromElement = element => { + if (!element) { + return 0; + } + + // Get transition-duration of the element + let { + transitionDuration, + transitionDelay + } = window.getComputedStyle(element); + const floatTransitionDuration = Number.parseFloat(transitionDuration); + const floatTransitionDelay = Number.parseFloat(transitionDelay); + + // Return 0 if element or transition duration is not found + if (!floatTransitionDuration && !floatTransitionDelay) { + return 0; + } + + // If multiple durations are defined, take the first + transitionDuration = transitionDuration.split(',')[0]; + transitionDelay = transitionDelay.split(',')[0]; + return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; + }; + const triggerTransitionEnd = element => { + element.dispatchEvent(new Event(TRANSITION_END)); + }; + const isElement = object => { + if (!object || typeof object !== 'object') { + return false; + } + if (typeof object.jquery !== 'undefined') { + object = object[0]; + } + return typeof object.nodeType !== 'undefined'; + }; + const getElement = object => { + // it's a jQuery object or a node element + if (isElement(object)) { + return object.jquery ? object[0] : object; + } + if (typeof object === 'string' && object.length > 0) { + return document.querySelector(parseSelector(object)); + } + return null; + }; + const isVisible = element => { + if (!isElement(element) || element.getClientRects().length === 0) { + return false; + } + const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'; + // Handle `details` element as its content may falsie appear visible when it is closed + const closedDetails = element.closest('details:not([open])'); + if (!closedDetails) { + return elementIsVisible; + } + if (closedDetails !== element) { + const summary = element.closest('summary'); + if (summary && summary.parentNode !== closedDetails) { + return false; + } + if (summary === null) { + return false; + } + } + return elementIsVisible; + }; + const isDisabled = element => { + if (!element || element.nodeType !== Node.ELEMENT_NODE) { + return true; + } + if (element.classList.contains('disabled')) { + return true; + } + if (typeof element.disabled !== 'undefined') { + return element.disabled; + } + return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'; + }; + const findShadowRoot = element => { + if (!document.documentElement.attachShadow) { + return null; + } + + // Can find the shadow root otherwise it'll return the document + if (typeof element.getRootNode === 'function') { + const root = element.getRootNode(); + return root instanceof ShadowRoot ? root : null; + } + if (element instanceof ShadowRoot) { + return element; + } + + // when we don't find a shadow root + if (!element.parentNode) { + return null; + } + return findShadowRoot(element.parentNode); + }; + const noop = () => {}; + + const getjQuery = () => { + if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) { + return window.jQuery; + } + return null; + }; + const DOMContentLoadedCallbacks = []; + const onDOMContentLoaded = callback => { + if (document.readyState === 'loading') { + // add listener on the first call when the document is in loading state + if (!DOMContentLoadedCallbacks.length) { + document.addEventListener('DOMContentLoaded', () => { + for (const callback of DOMContentLoadedCallbacks) { + callback(); + } + }); + } + DOMContentLoadedCallbacks.push(callback); + } else { + callback(); + } + }; + const isRTL = () => document.documentElement.dir === 'rtl'; + const defineJQueryPlugin = plugin => { + onDOMContentLoaded(() => { + const $ = getjQuery(); + /* istanbul ignore if */ + if ($) { + const name = plugin.NAME; + const JQUERY_NO_CONFLICT = $.fn[name]; + $.fn[name] = plugin.jQueryInterface; + $.fn[name].Constructor = plugin; + $.fn[name].noConflict = () => { + $.fn[name] = JQUERY_NO_CONFLICT; + return plugin.jQueryInterface; + }; + } + }); + }; + const execute = (possibleCallback, args = [], defaultValue = possibleCallback) => { + return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue; + }; + const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => { + if (!waitForTransition) { + execute(callback); + return; + } + const durationPadding = 5; + const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding; + let called = false; + const handler = ({ + target + }) => { + if (target !== transitionElement) { + return; + } + called = true; + transitionElement.removeEventListener(TRANSITION_END, handler); + execute(callback); + }; + transitionElement.addEventListener(TRANSITION_END, handler); + setTimeout(() => { + if (!called) { + triggerTransitionEnd(transitionElement); + } + }, emulatedDuration); + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.3.0-alpha1): util/sanitizer.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']); + const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; + + /** + * A pattern that recognizes a commonly useful subset of URLs that are safe. + * + * Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts + */ + const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i; + + /** + * A pattern that matches safe data URLs. Only matches image, video and audio types. + * + * Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts + */ + const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i; + const allowedAttribute = (attribute, allowedAttributeList) => { + const attributeName = attribute.nodeName.toLowerCase(); + if (allowedAttributeList.includes(attributeName)) { + if (uriAttributes.has(attributeName)) { + return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue)); + } + return true; + } + + // Check if a regular expression validates the attribute. + return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName)); + }; + const DefaultAllowlist = { + // Global attributes allowed on any supplied element below. + '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], + a: ['target', 'href', 'title', 'rel'], + area: [], + b: [], + br: [], + col: [], + code: [], + div: [], + em: [], + hr: [], + h1: [], + h2: [], + h3: [], + h4: [], + h5: [], + h6: [], + i: [], + img: ['src', 'srcset', 'alt', 'title', 'width', 'height'], + li: [], + ol: [], + p: [], + pre: [], + s: [], + small: [], + span: [], + sub: [], + sup: [], + strong: [], + u: [], + ul: [] + }; + function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) { + if (!unsafeHtml.length) { + return unsafeHtml; + } + if (sanitizeFunction && typeof sanitizeFunction === 'function') { + return sanitizeFunction(unsafeHtml); + } + const domParser = new window.DOMParser(); + const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html'); + const elements = [].concat(...createdDocument.body.querySelectorAll('*')); + for (const element of elements) { + const elementName = element.nodeName.toLowerCase(); + if (!Object.keys(allowList).includes(elementName)) { + element.remove(); + continue; + } + const attributeList = [].concat(...element.attributes); + const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []); + for (const attribute of attributeList) { + if (!allowedAttribute(attribute, allowedAttributes)) { + element.removeAttribute(attribute.nodeName); + } + } + } + return createdDocument.body.innerHTML; + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.3.0-alpha1): dom/event-handler.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + /** + * Constants + */ + + const namespaceRegex = /[^.]*(?=\..*)\.|.*/; + const stripNameRegex = /\..*/; + const stripUidRegex = /::\d+$/; + const eventRegistry = {}; // Events storage + let uidEvent = 1; + const customEvents = { + mouseenter: 'mouseover', + mouseleave: 'mouseout' + }; + const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']); + + /** + * Private methods + */ + + function makeEventUid(element, uid) { + return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++; + } + function getElementEvents(element) { + const uid = makeEventUid(element); + element.uidEvent = uid; + eventRegistry[uid] = eventRegistry[uid] || {}; + return eventRegistry[uid]; + } + function bootstrapHandler(element, fn) { + return function handler(event) { + hydrateObj(event, { + delegateTarget: element + }); + if (handler.oneOff) { + EventHandler.off(element, event.type, fn); + } + return fn.apply(element, [event]); + }; + } + function bootstrapDelegationHandler(element, selector, fn) { + return function handler(event) { + const domElements = element.querySelectorAll(selector); + for (let { + target + } = event; target && target !== this; target = target.parentNode) { + for (const domElement of domElements) { + if (domElement !== target) { + continue; + } + hydrateObj(event, { + delegateTarget: target + }); + if (handler.oneOff) { + EventHandler.off(element, event.type, selector, fn); + } + return fn.apply(target, [event]); + } + } + }; + } + function findHandler(events, callable, delegationSelector = null) { + return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector); + } + function normalizeParameters(originalTypeEvent, handler, delegationFunction) { + const isDelegated = typeof handler === 'string'; + // todo: tooltip passes `false` instead of selector, so we need to check + const callable = isDelegated ? delegationFunction : handler || delegationFunction; + let typeEvent = getTypeEvent(originalTypeEvent); + if (!nativeEvents.has(typeEvent)) { + typeEvent = originalTypeEvent; + } + return [isDelegated, callable, typeEvent]; + } + function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) { + if (typeof originalTypeEvent !== 'string' || !element) { + return; + } + let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); + + // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position + // this prevents the handler from being dispatched the same way as mouseover or mouseout does + if (originalTypeEvent in customEvents) { + const wrapFunction = fn => { + return function (event) { + if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) { + return fn.call(this, event); + } + }; + }; + callable = wrapFunction(callable); + } + const events = getElementEvents(element); + const handlers = events[typeEvent] || (events[typeEvent] = {}); + const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null); + if (previousFunction) { + previousFunction.oneOff = previousFunction.oneOff && oneOff; + return; + } + const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, '')); + const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable); + fn.delegationSelector = isDelegated ? handler : null; + fn.callable = callable; + fn.oneOff = oneOff; + fn.uidEvent = uid; + handlers[uid] = fn; + element.addEventListener(typeEvent, fn, isDelegated); + } + function removeHandler(element, events, typeEvent, handler, delegationSelector) { + const fn = findHandler(events[typeEvent], handler, delegationSelector); + if (!fn) { + return; + } + element.removeEventListener(typeEvent, fn, Boolean(delegationSelector)); + delete events[typeEvent][fn.uidEvent]; + } + function removeNamespacedHandlers(element, events, typeEvent, namespace) { + const storeElementEvent = events[typeEvent] || {}; + for (const [handlerKey, event] of Object.entries(storeElementEvent)) { + if (handlerKey.includes(namespace)) { + removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); + } + } + } + function getTypeEvent(event) { + // allow to get the native events from namespaced events ('click.bs.button' --> 'click') + event = event.replace(stripNameRegex, ''); + return customEvents[event] || event; + } + const EventHandler = { + on(element, event, handler, delegationFunction) { + addHandler(element, event, handler, delegationFunction, false); + }, + one(element, event, handler, delegationFunction) { + addHandler(element, event, handler, delegationFunction, true); + }, + off(element, originalTypeEvent, handler, delegationFunction) { + if (typeof originalTypeEvent !== 'string' || !element) { + return; + } + const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); + const inNamespace = typeEvent !== originalTypeEvent; + const events = getElementEvents(element); + const storeElementEvent = events[typeEvent] || {}; + const isNamespace = originalTypeEvent.startsWith('.'); + if (typeof callable !== 'undefined') { + // Simplest case: handler is passed, remove that listener ONLY. + if (!Object.keys(storeElementEvent).length) { + return; + } + removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null); + return; + } + if (isNamespace) { + for (const elementEvent of Object.keys(events)) { + removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1)); + } + } + for (const [keyHandlers, event] of Object.entries(storeElementEvent)) { + const handlerKey = keyHandlers.replace(stripUidRegex, ''); + if (!inNamespace || originalTypeEvent.includes(handlerKey)) { + removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); + } + } + }, + trigger(element, event, args) { + if (typeof event !== 'string' || !element) { + return null; + } + const $ = getjQuery(); + const typeEvent = getTypeEvent(event); + const inNamespace = event !== typeEvent; + let jQueryEvent = null; + let bubbles = true; + let nativeDispatch = true; + let defaultPrevented = false; + if (inNamespace && $) { + jQueryEvent = $.Event(event, args); + $(element).trigger(jQueryEvent); + bubbles = !jQueryEvent.isPropagationStopped(); + nativeDispatch = !jQueryEvent.isImmediatePropagationStopped(); + defaultPrevented = jQueryEvent.isDefaultPrevented(); + } + let evt = new Event(event, { + bubbles, + cancelable: true + }); + evt = hydrateObj(evt, args); + if (defaultPrevented) { + evt.preventDefault(); + } + if (nativeDispatch) { + element.dispatchEvent(evt); + } + if (evt.defaultPrevented && jQueryEvent) { + jQueryEvent.preventDefault(); + } + return evt; + } + }; + function hydrateObj(obj, meta = {}) { + for (const [key, value] of Object.entries(meta)) { + try { + obj[key] = value; + } catch (_unused) { + Object.defineProperty(obj, key, { + configurable: true, + get() { + return value; + } + }); + } + } + return obj; + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.3.0-alpha1): dom/manipulator.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + function normalizeData(value) { + if (value === 'true') { + return true; + } + if (value === 'false') { + return false; + } + if (value === Number(value).toString()) { + return Number(value); + } + if (value === '' || value === 'null') { + return null; + } + if (typeof value !== 'string') { + return value; + } + try { + return JSON.parse(decodeURIComponent(value)); + } catch (_unused) { + return value; + } + } + function normalizeDataKey(key) { + return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`); + } + const Manipulator = { + setDataAttribute(element, key, value) { + element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value); + }, + removeDataAttribute(element, key) { + element.removeAttribute(`data-bs-${normalizeDataKey(key)}`); + }, + getDataAttributes(element) { + if (!element) { + return {}; + } + const attributes = {}; + const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig')); + for (const key of bsKeys) { + let pureKey = key.replace(/^bs/, ''); + pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length); + attributes[pureKey] = normalizeData(element.dataset[key]); + } + return attributes; + }, + getDataAttribute(element, key) { + return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`)); + } + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.3.0-alpha1): dom/data.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + /** + * Constants + */ + + const elementMap = new Map(); + const Data = { + set(element, key, instance) { + if (!elementMap.has(element)) { + elementMap.set(element, new Map()); + } + const instanceMap = elementMap.get(element); + + // make it clear we only want one instance per element + // can be removed later when multiple key/instances are fine to be used + if (!instanceMap.has(key) && instanceMap.size !== 0) { + // eslint-disable-next-line no-console + console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`); + return; + } + instanceMap.set(key, instance); + }, + get(element, key) { + if (elementMap.has(element)) { + return elementMap.get(element).get(key) || null; + } + return null; + }, + remove(element, key) { + if (!elementMap.has(element)) { + return; + } + const instanceMap = elementMap.get(element); + instanceMap.delete(key); + + // free up element references if there are no instances left for an element + if (instanceMap.size === 0) { + elementMap.delete(element); + } + } + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.3.0-alpha1): util/config.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + /** + * Class definition + */ + + class Config { + // Getters + static get Default() { + return {}; + } + static get DefaultType() { + return {}; + } + static get NAME() { + throw new Error('You have to implement the static method "NAME", for each component!'); + } + _getConfig(config) { + config = this._mergeConfigObj(config); + config = this._configAfterMerge(config); + this._typeCheckConfig(config); + return config; + } + _configAfterMerge(config) { + return config; + } + _mergeConfigObj(config, element) { + const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse + + return { + ...this.constructor.Default, + ...(typeof jsonConfig === 'object' ? jsonConfig : {}), + ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}), + ...(typeof config === 'object' ? config : {}) + }; + } + _typeCheckConfig(config, configTypes = this.constructor.DefaultType) { + for (const [property, expectedTypes] of Object.entries(configTypes)) { + const value = config[property]; + const valueType = isElement(value) ? 'element' : toType(value); + if (!new RegExp(expectedTypes).test(valueType)) { + throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`); + } + } + } + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.3.0-alpha1): base-component.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + /** + * Constants + */ + + const VERSION = '5.3.0-alpha1'; + + /** + * Class definition + */ + + class BaseComponent extends Config { + constructor(element, config) { + super(); + element = getElement(element); + if (!element) { + return; + } + this._element = element; + this._config = this._getConfig(config); + Data.set(this._element, this.constructor.DATA_KEY, this); + } + + // Public + dispose() { + Data.remove(this._element, this.constructor.DATA_KEY); + EventHandler.off(this._element, this.constructor.EVENT_KEY); + for (const propertyName of Object.getOwnPropertyNames(this)) { + this[propertyName] = null; + } + } + _queueCallback(callback, element, isAnimated = true) { + executeAfterTransition(callback, element, isAnimated); + } + _getConfig(config) { + config = this._mergeConfigObj(config, this._element); + config = this._configAfterMerge(config); + this._typeCheckConfig(config); + return config; + } + + // Static + static getInstance(element) { + return Data.get(getElement(element), this.DATA_KEY); + } + static getOrCreateInstance(element, config = {}) { + return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null); + } + static get VERSION() { + return VERSION; + } + static get DATA_KEY() { + return `bs.${this.NAME}`; + } + static get EVENT_KEY() { + return `.${this.DATA_KEY}`; + } + static eventName(name) { + return `${name}${this.EVENT_KEY}`; + } + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.3.0-alpha1): dom/selector-engine.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + const getSelector = element => { + let selector = element.getAttribute('data-bs-target'); + if (!selector || selector === '#') { + let hrefAttribute = element.getAttribute('href'); + + // The only valid content that could double as a selector are IDs or classes, + // so everything starting with `#` or `.`. If a "real" URL is used as the selector, + // `document.querySelector` will rightfully complain it is invalid. + // See https://github.com/twbs/bootstrap/issues/32273 + if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) { + return null; + } + + // Just in case some CMS puts out a full URL with the anchor appended + if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) { + hrefAttribute = `#${hrefAttribute.split('#')[1]}`; + } + selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null; + } + return parseSelector(selector); + }; + const SelectorEngine = { + find(selector, element = document.documentElement) { + return [].concat(...Element.prototype.querySelectorAll.call(element, selector)); + }, + findOne(selector, element = document.documentElement) { + return Element.prototype.querySelector.call(element, selector); + }, + children(element, selector) { + return [].concat(...element.children).filter(child => child.matches(selector)); + }, + parents(element, selector) { + const parents = []; + let ancestor = element.parentNode.closest(selector); + while (ancestor) { + parents.push(ancestor); + ancestor = ancestor.parentNode.closest(selector); + } + return parents; + }, + prev(element, selector) { + let previous = element.previousElementSibling; + while (previous) { + if (previous.matches(selector)) { + return [previous]; + } + previous = previous.previousElementSibling; + } + return []; + }, + // TODO: this is now unused; remove later along with prev() + next(element, selector) { + let next = element.nextElementSibling; + while (next) { + if (next.matches(selector)) { + return [next]; + } + next = next.nextElementSibling; + } + return []; + }, + focusableChildren(element) { + const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(','); + return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el)); + }, + getSelectorFromElement(element) { + const selector = getSelector(element); + if (selector) { + return SelectorEngine.findOne(selector) ? selector : null; + } + return null; + }, + getElementFromSelector(element) { + const selector = getSelector(element); + return selector ? SelectorEngine.findOne(selector) : null; + }, + getMultipleElementsFromSelector(element) { + const selector = getSelector(element); + return selector ? SelectorEngine.find(selector) : []; + } + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.3.0-alpha1): util/template-factory.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + /** + * Constants + */ + + const NAME$1 = 'TemplateFactory'; + const Default$1 = { + allowList: DefaultAllowlist, + content: {}, + // { selector : text , selector2 : text2 , } + extraClass: '', + html: false, + sanitize: true, + sanitizeFn: null, + template: '
' + }; + const DefaultType$1 = { + allowList: 'object', + content: 'object', + extraClass: '(string|function)', + html: 'boolean', + sanitize: 'boolean', + sanitizeFn: '(null|function)', + template: 'string' + }; + const DefaultContentType = { + entry: '(string|element|function|null)', + selector: '(string|element)' + }; + + /** + * Class definition + */ + + class TemplateFactory extends Config { + constructor(config) { + super(); + this._config = this._getConfig(config); + } + + // Getters + static get Default() { + return Default$1; + } + static get DefaultType() { + return DefaultType$1; + } + static get NAME() { + return NAME$1; + } + + // Public + getContent() { + return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean); + } + hasContent() { + return this.getContent().length > 0; + } + changeContent(content) { + this._checkContent(content); + this._config.content = { + ...this._config.content, + ...content + }; + return this; + } + toHtml() { + const templateWrapper = document.createElement('div'); + templateWrapper.innerHTML = this._maybeSanitize(this._config.template); + for (const [selector, text] of Object.entries(this._config.content)) { + this._setContent(templateWrapper, text, selector); + } + const template = templateWrapper.children[0]; + const extraClass = this._resolvePossibleFunction(this._config.extraClass); + if (extraClass) { + template.classList.add(...extraClass.split(' ')); + } + return template; + } + + // Private + _typeCheckConfig(config) { + super._typeCheckConfig(config); + this._checkContent(config.content); + } + _checkContent(arg) { + for (const [selector, content] of Object.entries(arg)) { + super._typeCheckConfig({ + selector, + entry: content + }, DefaultContentType); + } + } + _setContent(template, content, selector) { + const templateElement = SelectorEngine.findOne(selector, template); + if (!templateElement) { + return; + } + content = this._resolvePossibleFunction(content); + if (!content) { + templateElement.remove(); + return; + } + if (isElement(content)) { + this._putElementInTemplate(getElement(content), templateElement); + return; + } + if (this._config.html) { + templateElement.innerHTML = this._maybeSanitize(content); + return; + } + templateElement.textContent = content; + } + _maybeSanitize(arg) { + return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg; + } + _resolvePossibleFunction(arg) { + return execute(arg, [this]); + } + _putElementInTemplate(element, templateElement) { + if (this._config.html) { + templateElement.innerHTML = ''; + templateElement.append(element); + return; + } + templateElement.textContent = element.textContent; + } + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.3.0-alpha1): tooltip.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + /** + * Constants + */ + + const NAME = 'tooltip'; + const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']); + const CLASS_NAME_FADE = 'fade'; + const CLASS_NAME_MODAL = 'modal'; + const CLASS_NAME_SHOW = 'show'; + const SELECTOR_TOOLTIP_INNER = '.tooltip-inner'; + const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`; + const EVENT_MODAL_HIDE = 'hide.bs.modal'; + const TRIGGER_HOVER = 'hover'; + const TRIGGER_FOCUS = 'focus'; + const TRIGGER_CLICK = 'click'; + const TRIGGER_MANUAL = 'manual'; + const EVENT_HIDE = 'hide'; + const EVENT_HIDDEN = 'hidden'; + const EVENT_SHOW = 'show'; + const EVENT_SHOWN = 'shown'; + const EVENT_INSERTED = 'inserted'; + const EVENT_CLICK = 'click'; + const EVENT_FOCUSIN = 'focusin'; + const EVENT_FOCUSOUT = 'focusout'; + const EVENT_MOUSEENTER = 'mouseenter'; + const EVENT_MOUSELEAVE = 'mouseleave'; + const AttachmentMap = { + AUTO: 'auto', + TOP: 'top', + RIGHT: isRTL() ? 'left' : 'right', + BOTTOM: 'bottom', + LEFT: isRTL() ? 'right' : 'left' + }; + const Default = { + allowList: DefaultAllowlist, + animation: true, + boundary: 'clippingParents', + container: false, + customClass: '', + delay: 0, + fallbackPlacements: ['top', 'right', 'bottom', 'left'], + html: false, + offset: [0, 0], + placement: 'top', + popperConfig: null, + sanitize: true, + sanitizeFn: null, + selector: false, + template: '', + title: '', + trigger: 'hover focus' + }; + const DefaultType = { + allowList: 'object', + animation: 'boolean', + boundary: '(string|element)', + container: '(string|element|boolean)', + customClass: '(string|function)', + delay: '(number|object)', + fallbackPlacements: 'array', + html: 'boolean', + offset: '(array|string|function)', + placement: '(string|function)', + popperConfig: '(null|object|function)', + sanitize: 'boolean', + sanitizeFn: '(null|function)', + selector: '(string|boolean)', + template: 'string', + title: '(string|element|function)', + trigger: 'string' + }; + + /** + * Class definition + */ + + class Tooltip extends BaseComponent { + constructor(element, config) { + if (typeof Popper === 'undefined') { + throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)'); + } + super(element, config); + + // Private + this._isEnabled = true; + this._timeout = 0; + this._isHovered = null; + this._activeTrigger = {}; + this._popper = null; + this._templateFactory = null; + this._newContent = null; + + // Protected + this.tip = null; + this._setListeners(); + if (!this._config.selector) { + this._fixTitle(); + } + } + + // Getters + static get Default() { + return Default; + } + static get DefaultType() { + return DefaultType; + } + static get NAME() { + return NAME; + } + + // Public + enable() { + this._isEnabled = true; + } + disable() { + this._isEnabled = false; + } + toggleEnabled() { + this._isEnabled = !this._isEnabled; + } + toggle() { + if (!this._isEnabled) { + return; + } + this._activeTrigger.click = !this._activeTrigger.click; + if (this._isShown()) { + this._leave(); + return; + } + this._enter(); + } + dispose() { + clearTimeout(this._timeout); + EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); + if (this._element.getAttribute('data-bs-original-title')) { + this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title')); + } + this._disposePopper(); + super.dispose(); + } + show() { + if (this._element.style.display === 'none') { + throw new Error('Please use show on visible elements'); + } + if (!(this._isWithContent() && this._isEnabled)) { + return; + } + const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW)); + const shadowRoot = findShadowRoot(this._element); + const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element); + if (showEvent.defaultPrevented || !isInTheDom) { + return; + } + + // todo v6 remove this OR make it optional + this._disposePopper(); + const tip = this._getTipElement(); + this._element.setAttribute('aria-describedby', tip.getAttribute('id')); + const { + container + } = this._config; + if (!this._element.ownerDocument.documentElement.contains(this.tip)) { + container.append(tip); + EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED)); + } + this._popper = this._createPopper(tip); + tip.classList.add(CLASS_NAME_SHOW); + + // If this is a touch-enabled device we add extra + // empty mouseover listeners to the body's immediate children; + // only needed because of broken event delegation on iOS + // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html + if ('ontouchstart' in document.documentElement) { + for (const element of [].concat(...document.body.children)) { + EventHandler.on(element, 'mouseover', noop); + } + } + const complete = () => { + EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN)); + if (this._isHovered === false) { + this._leave(); + } + this._isHovered = false; + }; + this._queueCallback(complete, this.tip, this._isAnimated()); + } + hide() { + if (!this._isShown()) { + return; + } + const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE)); + if (hideEvent.defaultPrevented) { + return; + } + const tip = this._getTipElement(); + tip.classList.remove(CLASS_NAME_SHOW); + + // If this is a touch-enabled device we remove the extra + // empty mouseover listeners we added for iOS support + if ('ontouchstart' in document.documentElement) { + for (const element of [].concat(...document.body.children)) { + EventHandler.off(element, 'mouseover', noop); + } + } + this._activeTrigger[TRIGGER_CLICK] = false; + this._activeTrigger[TRIGGER_FOCUS] = false; + this._activeTrigger[TRIGGER_HOVER] = false; + this._isHovered = null; // it is a trick to support manual triggering + + const complete = () => { + if (this._isWithActiveTrigger()) { + return; + } + if (!this._isHovered) { + this._disposePopper(); + } + this._element.removeAttribute('aria-describedby'); + EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN)); + }; + this._queueCallback(complete, this.tip, this._isAnimated()); + } + update() { + if (this._popper) { + this._popper.update(); + } + } + + // Protected + _isWithContent() { + return Boolean(this._getTitle()); + } + _getTipElement() { + if (!this.tip) { + this.tip = this._createTipElement(this._newContent || this._getContentForTemplate()); + } + return this.tip; + } + _createTipElement(content) { + const tip = this._getTemplateFactory(content).toHtml(); + + // todo: remove this check on v6 + if (!tip) { + return null; + } + tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW); + // todo: on v6 the following can be achieved with CSS only + tip.classList.add(`bs-${this.constructor.NAME}-auto`); + const tipId = getUID(this.constructor.NAME).toString(); + tip.setAttribute('id', tipId); + if (this._isAnimated()) { + tip.classList.add(CLASS_NAME_FADE); + } + return tip; + } + setContent(content) { + this._newContent = content; + if (this._isShown()) { + this._disposePopper(); + this.show(); + } + } + _getTemplateFactory(content) { + if (this._templateFactory) { + this._templateFactory.changeContent(content); + } else { + this._templateFactory = new TemplateFactory({ + ...this._config, + // the `content` var has to be after `this._config` + // to override config.content in case of popover + content, + extraClass: this._resolvePossibleFunction(this._config.customClass) + }); + } + return this._templateFactory; + } + _getContentForTemplate() { + return { + [SELECTOR_TOOLTIP_INNER]: this._getTitle() + }; + } + _getTitle() { + return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title'); + } + + // Private + _initializeOnDelegatedTarget(event) { + return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig()); + } + _isAnimated() { + return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE); + } + _isShown() { + return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW); + } + _createPopper(tip) { + const placement = execute(this._config.placement, [this, tip, this._element]); + const attachment = AttachmentMap[placement.toUpperCase()]; + return createPopper(this._element, tip, this._getPopperConfig(attachment)); + } + _getOffset() { + const { + offset + } = this._config; + if (typeof offset === 'string') { + return offset.split(',').map(value => Number.parseInt(value, 10)); + } + if (typeof offset === 'function') { + return popperData => offset(popperData, this._element); + } + return offset; + } + _resolvePossibleFunction(arg) { + return execute(arg, [this._element]); + } + _getPopperConfig(attachment) { + const defaultBsPopperConfig = { + placement: attachment, + modifiers: [{ + name: 'flip', + options: { + fallbackPlacements: this._config.fallbackPlacements + } + }, { + name: 'offset', + options: { + offset: this._getOffset() + } + }, { + name: 'preventOverflow', + options: { + boundary: this._config.boundary + } + }, { + name: 'arrow', + options: { + element: `.${this.constructor.NAME}-arrow` + } + }, { + name: 'preSetPlacement', + enabled: true, + phase: 'beforeMain', + fn: data => { + // Pre-set Popper's placement attribute in order to read the arrow sizes properly. + // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement + this._getTipElement().setAttribute('data-popper-placement', data.state.placement); + } + }] + }; + return { + ...defaultBsPopperConfig, + ...execute(this._config.popperConfig, [defaultBsPopperConfig]) + }; + } + _setListeners() { + const triggers = this._config.trigger.split(' '); + for (const trigger of triggers) { + if (trigger === 'click') { + EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => { + const context = this._initializeOnDelegatedTarget(event); + context.toggle(); + }); + } else if (trigger !== TRIGGER_MANUAL) { + const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN); + const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT); + EventHandler.on(this._element, eventIn, this._config.selector, event => { + const context = this._initializeOnDelegatedTarget(event); + context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true; + context._enter(); + }); + EventHandler.on(this._element, eventOut, this._config.selector, event => { + const context = this._initializeOnDelegatedTarget(event); + context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget); + context._leave(); + }); + } + } + this._hideModalHandler = () => { + if (this._element) { + this.hide(); + } + }; + EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); + } + _fixTitle() { + const title = this._element.getAttribute('title'); + if (!title) { + return; + } + if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) { + this._element.setAttribute('aria-label', title); + } + this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility + this._element.removeAttribute('title'); + } + _enter() { + if (this._isShown() || this._isHovered) { + this._isHovered = true; + return; + } + this._isHovered = true; + this._setTimeout(() => { + if (this._isHovered) { + this.show(); + } + }, this._config.delay.show); + } + _leave() { + if (this._isWithActiveTrigger()) { + return; + } + this._isHovered = false; + this._setTimeout(() => { + if (!this._isHovered) { + this.hide(); + } + }, this._config.delay.hide); + } + _setTimeout(handler, timeout) { + clearTimeout(this._timeout); + this._timeout = setTimeout(handler, timeout); + } + _isWithActiveTrigger() { + return Object.values(this._activeTrigger).includes(true); + } + _getConfig(config) { + const dataAttributes = Manipulator.getDataAttributes(this._element); + for (const dataAttribute of Object.keys(dataAttributes)) { + if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) { + delete dataAttributes[dataAttribute]; + } + } + config = { + ...dataAttributes, + ...(typeof config === 'object' && config ? config : {}) + }; + config = this._mergeConfigObj(config); + config = this._configAfterMerge(config); + this._typeCheckConfig(config); + return config; + } + _configAfterMerge(config) { + config.container = config.container === false ? document.body : getElement(config.container); + if (typeof config.delay === 'number') { + config.delay = { + show: config.delay, + hide: config.delay + }; + } + if (typeof config.title === 'number') { + config.title = config.title.toString(); + } + if (typeof config.content === 'number') { + config.content = config.content.toString(); + } + return config; + } + _getDelegateConfig() { + const config = {}; + for (const [key, value] of Object.entries(this._config)) { + if (this.constructor.Default[key] !== value) { + config[key] = value; + } + } + config.selector = false; + config.trigger = 'manual'; + + // In the future can be replaced with: + // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]]) + // `Object.fromEntries(keysWithDifferentValues)` + return config; + } + _disposePopper() { + if (this._popper) { + this._popper.destroy(); + this._popper = null; + } + if (this.tip) { + this.tip.remove(); + this.tip = null; + } + } + + // Static + static jQueryInterface(config) { + return this.each(function () { + const data = Tooltip.getOrCreateInstance(this, config); + if (typeof config !== 'string') { + return; + } + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + data[config](); + }); + } + } + + /** + * jQuery + */ + + defineJQueryPlugin(Tooltip); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.3.0-alpha1): index.umd.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + const index_umd = { + // Alert, + // Button, + // Carousel, + // Collapse, + // Dropdown, + // Modal, + // Offcanvas, + // Popover, + // ScrollSpy, + // Tab, + // Toast, + Tooltip + }; + + return index_umd; + +})); +//# sourceMappingURL=bootstrap.bundle.js.map diff --git a/v5/static/js/bootstrap.bundle.js.map b/static/js/bootstrap.bundle.js.map similarity index 100% rename from v5/static/js/bootstrap.bundle.js.map rename to static/js/bootstrap.bundle.js.map diff --git a/v5/static/js/bootstrap.bundle.min.js b/static/js/bootstrap.bundle.min.js similarity index 100% rename from v5/static/js/bootstrap.bundle.min.js rename to static/js/bootstrap.bundle.min.js diff --git a/v5/static/js/bootstrap.bundle.min.js.map b/static/js/bootstrap.bundle.min.js.map similarity index 100% rename from v5/static/js/bootstrap.bundle.min.js.map rename to static/js/bootstrap.bundle.min.js.map diff --git a/v5/static/js/main.min.js b/static/js/main.min.js similarity index 95% rename from v5/static/js/main.min.js rename to static/js/main.min.js index db8ad4d..df25f35 100644 --- a/v5/static/js/main.min.js +++ b/static/js/main.min.js @@ -8,4 +8,4 @@ /* ----------------------------------------------- */ function hexToRgb(e) { var a = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; e = e.replace(a, function (e, a, t, i) { return a + a + t + t + i + i }); var t = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e); return t ? { r: parseInt(t[1], 16), g: parseInt(t[2], 16), b: parseInt(t[3], 16) } : null } function clamp(e, a, t) { return Math.min(Math.max(e, a), t) } function isInArray(e, a) { return a.indexOf(e) > -1 } var pJS = function (e, a) { var t = document.querySelector("#" + e + " > .particles-js-canvas-el"); this.pJS = { canvas: { el: t, w: t.offsetWidth, h: t.offsetHeight }, particles: { number: { value: 400, density: { enable: !0, value_area: 800 } }, color: { value: "#fff" }, shape: { type: "circle", stroke: { width: 0, color: "#ff0000" }, polygon: { nb_sides: 5 }, image: { src: "", width: 100, height: 100 } }, opacity: { value: 1, random: !1, anim: { enable: !1, speed: 2, opacity_min: 0, sync: !1 } }, size: { value: 20, random: !1, anim: { enable: !1, speed: 20, size_min: 0, sync: !1 } }, line_linked: { enable: !0, distance: 100, color: "#fff", opacity: 1, width: 1 }, move: { enable: !0, speed: 2, direction: "none", random: !1, straight: !1, out_mode: "out", bounce: !1, attract: { enable: !1, rotateX: 3e3, rotateY: 3e3 } }, array: [] }, interactivity: { detect_on: "canvas", events: { onhover: { enable: !0, mode: "grab" }, onclick: { enable: !0, mode: "push" }, resize: !0 }, modes: { grab: { distance: 100, line_linked: { opacity: 1 } }, bubble: { distance: 200, size: 80, duration: .4 }, repulse: { distance: 200, duration: .4 }, push: { particles_nb: 4 }, remove: { particles_nb: 2 } }, mouse: {} }, retina_detect: !1, fn: { interact: {}, modes: {}, vendors: {} }, tmp: {} }; var i = this.pJS; a && Object.deepExtend(i, a), i.tmp.obj = { size_value: i.particles.size.value, size_anim_speed: i.particles.size.anim.speed, move_speed: i.particles.move.speed, line_linked_distance: i.particles.line_linked.distance, line_linked_width: i.particles.line_linked.width, mode_grab_distance: i.interactivity.modes.grab.distance, mode_bubble_distance: i.interactivity.modes.bubble.distance, mode_bubble_size: i.interactivity.modes.bubble.size, mode_repulse_distance: i.interactivity.modes.repulse.distance }, i.fn.retinaInit = function () { i.retina_detect && window.devicePixelRatio > 1 ? (i.canvas.pxratio = window.devicePixelRatio, i.tmp.retina = !0) : (i.canvas.pxratio = 1, i.tmp.retina = !1), i.canvas.w = i.canvas.el.offsetWidth * i.canvas.pxratio, i.canvas.h = i.canvas.el.offsetHeight * i.canvas.pxratio, i.particles.size.value = i.tmp.obj.size_value * i.canvas.pxratio, i.particles.size.anim.speed = i.tmp.obj.size_anim_speed * i.canvas.pxratio, i.particles.move.speed = i.tmp.obj.move_speed * i.canvas.pxratio, i.particles.line_linked.distance = i.tmp.obj.line_linked_distance * i.canvas.pxratio, i.interactivity.modes.grab.distance = i.tmp.obj.mode_grab_distance * i.canvas.pxratio, i.interactivity.modes.bubble.distance = i.tmp.obj.mode_bubble_distance * i.canvas.pxratio, i.particles.line_linked.width = i.tmp.obj.line_linked_width * i.canvas.pxratio, i.interactivity.modes.bubble.size = i.tmp.obj.mode_bubble_size * i.canvas.pxratio, i.interactivity.modes.repulse.distance = i.tmp.obj.mode_repulse_distance * i.canvas.pxratio }, i.fn.canvasInit = function () { i.canvas.ctx = i.canvas.el.getContext("2d") }, i.fn.canvasSize = function () { i.canvas.el.width = i.canvas.w, i.canvas.el.height = i.canvas.h, i && i.interactivity.events.resize && window.addEventListener("resize", function () { i.canvas.w = i.canvas.el.offsetWidth, i.canvas.h = i.canvas.el.offsetHeight, i.tmp.retina && (i.canvas.w *= i.canvas.pxratio, i.canvas.h *= i.canvas.pxratio), i.canvas.el.width = i.canvas.w, i.canvas.el.height = i.canvas.h, i.particles.move.enable || (i.fn.particlesEmpty(), i.fn.particlesCreate(), i.fn.particlesDraw(), i.fn.vendors.densityAutoParticles()), i.fn.vendors.densityAutoParticles() }) }, i.fn.canvasPaint = function () { i.canvas.ctx.fillRect(0, 0, i.canvas.w, i.canvas.h) }, i.fn.canvasClear = function () { i.canvas.ctx.clearRect(0, 0, i.canvas.w, i.canvas.h) }, i.fn.particle = function (e, a, t) { if (this.radius = (i.particles.size.random ? Math.random() : 1) * i.particles.size.value, i.particles.size.anim.enable && (this.size_status = !1, this.vs = i.particles.size.anim.speed / 100, i.particles.size.anim.sync || (this.vs = this.vs * Math.random())), this.x = t ? t.x : Math.random() * i.canvas.w, this.y = t ? t.y : Math.random() * i.canvas.h, this.x > i.canvas.w - 2 * this.radius ? this.x = this.x - this.radius : this.x < 2 * this.radius && (this.x = this.x + this.radius), this.y > i.canvas.h - 2 * this.radius ? this.y = this.y - this.radius : this.y < 2 * this.radius && (this.y = this.y + this.radius), i.particles.move.bounce && i.fn.vendors.checkOverlap(this, t), this.color = {}, "object" == typeof e.value) if (e.value instanceof Array) { var s = e.value[Math.floor(Math.random() * i.particles.color.value.length)]; this.color.rgb = hexToRgb(s) } else void 0 != e.value.r && void 0 != e.value.g && void 0 != e.value.b && (this.color.rgb = { r: e.value.r, g: e.value.g, b: e.value.b }), void 0 != e.value.h && void 0 != e.value.s && void 0 != e.value.l && (this.color.hsl = { h: e.value.h, s: e.value.s, l: e.value.l }); else "random" == e.value ? this.color.rgb = { r: Math.floor(256 * Math.random()) + 0, g: Math.floor(256 * Math.random()) + 0, b: Math.floor(256 * Math.random()) + 0 } : "string" == typeof e.value && (this.color = e, this.color.rgb = hexToRgb(this.color.value)); this.opacity = (i.particles.opacity.random ? Math.random() : 1) * i.particles.opacity.value, i.particles.opacity.anim.enable && (this.opacity_status = !1, this.vo = i.particles.opacity.anim.speed / 100, i.particles.opacity.anim.sync || (this.vo = this.vo * Math.random())); var n = {}; switch (i.particles.move.direction) { case "top": n = { x: 0, y: -1 }; break; case "top-right": n = { x: .5, y: -.5 }; break; case "right": n = { x: 1, y: -0 }; break; case "bottom-right": n = { x: .5, y: .5 }; break; case "bottom": n = { x: 0, y: 1 }; break; case "bottom-left": n = { x: -.5, y: 1 }; break; case "left": n = { x: -1, y: 0 }; break; case "top-left": n = { x: -.5, y: -.5 }; break; default: n = { x: 0, y: 0 } }i.particles.move.straight ? (this.vx = n.x, this.vy = n.y, i.particles.move.random && (this.vx = this.vx * Math.random(), this.vy = this.vy * Math.random())) : (this.vx = n.x + Math.random() - .5, this.vy = n.y + Math.random() - .5), this.vx_i = this.vx, this.vy_i = this.vy; var r = i.particles.shape.type; if ("object" == typeof r) { if (r instanceof Array) { var c = r[Math.floor(Math.random() * r.length)]; this.shape = c } } else this.shape = r; if ("image" == this.shape) { var o = i.particles.shape; this.img = { src: o.image.src, ratio: o.image.width / o.image.height }, this.img.ratio || (this.img.ratio = 1), "svg" == i.tmp.img_type && void 0 != i.tmp.source_svg && (i.fn.vendors.createSvgImg(this), i.tmp.pushing && (this.img.loaded = !1)) } }, i.fn.particle.prototype.draw = function () { function e() { i.canvas.ctx.drawImage(r, a.x - t, a.y - t, 2 * t, 2 * t / a.img.ratio) } var a = this; if (void 0 != a.radius_bubble) var t = a.radius_bubble; else var t = a.radius; if (void 0 != a.opacity_bubble) var s = a.opacity_bubble; else var s = a.opacity; if (a.color.rgb) var n = "rgba(" + a.color.rgb.r + "," + a.color.rgb.g + "," + a.color.rgb.b + "," + s + ")"; else var n = "hsla(" + a.color.hsl.h + "," + a.color.hsl.s + "%," + a.color.hsl.l + "%," + s + ")"; switch (i.canvas.ctx.fillStyle = n, i.canvas.ctx.beginPath(), a.shape) { case "circle": i.canvas.ctx.arc(a.x, a.y, t, 0, 2 * Math.PI, !1); break; case "edge": i.canvas.ctx.rect(a.x - t, a.y - t, 2 * t, 2 * t); break; case "triangle": i.fn.vendors.drawShape(i.canvas.ctx, a.x - t, a.y + t / 1.66, 2 * t, 3, 2); break; case "polygon": i.fn.vendors.drawShape(i.canvas.ctx, a.x - t / (i.particles.shape.polygon.nb_sides / 3.5), a.y - t / .76, 2.66 * t / (i.particles.shape.polygon.nb_sides / 3), i.particles.shape.polygon.nb_sides, 1); break; case "star": i.fn.vendors.drawShape(i.canvas.ctx, a.x - 2 * t / (i.particles.shape.polygon.nb_sides / 4), a.y - t / 1.52, 2 * t * 2.66 / (i.particles.shape.polygon.nb_sides / 3), i.particles.shape.polygon.nb_sides, 2); break; case "image": if ("svg" == i.tmp.img_type) var r = a.img.obj; else var r = i.tmp.img_obj; r && e() }i.canvas.ctx.closePath(), i.particles.shape.stroke.width > 0 && (i.canvas.ctx.strokeStyle = i.particles.shape.stroke.color, i.canvas.ctx.lineWidth = i.particles.shape.stroke.width, i.canvas.ctx.stroke()), i.canvas.ctx.fill() }, i.fn.particlesCreate = function () { for (var e = 0; e < i.particles.number.value; e++)i.particles.array.push(new i.fn.particle(i.particles.color, i.particles.opacity.value)) }, i.fn.particlesUpdate = function () { for (var e = 0; e < i.particles.array.length; e++) { var a = i.particles.array[e]; if (i.particles.move.enable) { var t = i.particles.move.speed / 2; a.x += a.vx * t, a.y += a.vy * t } if (i.particles.opacity.anim.enable && (1 == a.opacity_status ? (a.opacity >= i.particles.opacity.value && (a.opacity_status = !1), a.opacity += a.vo) : (a.opacity <= i.particles.opacity.anim.opacity_min && (a.opacity_status = !0), a.opacity -= a.vo), a.opacity < 0 && (a.opacity = 0)), i.particles.size.anim.enable && (1 == a.size_status ? (a.radius >= i.particles.size.value && (a.size_status = !1), a.radius += a.vs) : (a.radius <= i.particles.size.anim.size_min && (a.size_status = !0), a.radius -= a.vs), a.radius < 0 && (a.radius = 0)), "bounce" == i.particles.move.out_mode) var s = { x_left: a.radius, x_right: i.canvas.w, y_top: a.radius, y_bottom: i.canvas.h }; else var s = { x_left: -a.radius, x_right: i.canvas.w + a.radius, y_top: -a.radius, y_bottom: i.canvas.h + a.radius }; switch (a.x - a.radius > i.canvas.w ? (a.x = s.x_left, a.y = Math.random() * i.canvas.h) : a.x + a.radius < 0 && (a.x = s.x_right, a.y = Math.random() * i.canvas.h), a.y - a.radius > i.canvas.h ? (a.y = s.y_top, a.x = Math.random() * i.canvas.w) : a.y + a.radius < 0 && (a.y = s.y_bottom, a.x = Math.random() * i.canvas.w), i.particles.move.out_mode) { case "bounce": a.x + a.radius > i.canvas.w ? a.vx = -a.vx : a.x - a.radius < 0 && (a.vx = -a.vx), a.y + a.radius > i.canvas.h ? a.vy = -a.vy : a.y - a.radius < 0 && (a.vy = -a.vy) }if (isInArray("grab", i.interactivity.events.onhover.mode) && i.fn.modes.grabParticle(a), (isInArray("bubble", i.interactivity.events.onhover.mode) || isInArray("bubble", i.interactivity.events.onclick.mode)) && i.fn.modes.bubbleParticle(a), (isInArray("repulse", i.interactivity.events.onhover.mode) || isInArray("repulse", i.interactivity.events.onclick.mode)) && i.fn.modes.repulseParticle(a), i.particles.line_linked.enable || i.particles.move.attract.enable) for (var n = e + 1; n < i.particles.array.length; n++) { var r = i.particles.array[n]; i.particles.line_linked.enable && i.fn.interact.linkParticles(a, r), i.particles.move.attract.enable && i.fn.interact.attractParticles(a, r), i.particles.move.bounce && i.fn.interact.bounceParticles(a, r) } } }, i.fn.particlesDraw = function () { i.canvas.ctx.clearRect(0, 0, i.canvas.w, i.canvas.h), i.fn.particlesUpdate(); for (var e = 0; e < i.particles.array.length; e++) { var a = i.particles.array[e]; a.draw() } }, i.fn.particlesEmpty = function () { i.particles.array = [] }, i.fn.particlesRefresh = function () { cancelRequestAnimFrame(i.fn.checkAnimFrame), cancelRequestAnimFrame(i.fn.drawAnimFrame), i.tmp.source_svg = void 0, i.tmp.img_obj = void 0, i.tmp.count_svg = 0, i.fn.particlesEmpty(), i.fn.canvasClear(), i.fn.vendors.start() }, i.fn.interact.linkParticles = function (e, a) { var t = e.x - a.x, s = e.y - a.y, n = Math.sqrt(t * t + s * s); if (n <= i.particles.line_linked.distance) { var r = i.particles.line_linked.opacity - n / (1 / i.particles.line_linked.opacity) / i.particles.line_linked.distance; if (r > 0) { var c = i.particles.line_linked.color_rgb_line; i.canvas.ctx.strokeStyle = "rgba(" + c.r + "," + c.g + "," + c.b + "," + r + ")", i.canvas.ctx.lineWidth = i.particles.line_linked.width, i.canvas.ctx.beginPath(), i.canvas.ctx.moveTo(e.x, e.y), i.canvas.ctx.lineTo(a.x, a.y), i.canvas.ctx.stroke(), i.canvas.ctx.closePath() } } }, i.fn.interact.attractParticles = function (e, a) { var t = e.x - a.x, s = e.y - a.y, n = Math.sqrt(t * t + s * s); if (n <= i.particles.line_linked.distance) { var r = t / (1e3 * i.particles.move.attract.rotateX), c = s / (1e3 * i.particles.move.attract.rotateY); e.vx -= r, e.vy -= c, a.vx += r, a.vy += c } }, i.fn.interact.bounceParticles = function (e, a) { var t = e.x - a.x, i = e.y - a.y, s = Math.sqrt(t * t + i * i), n = e.radius + a.radius; n >= s && (e.vx = -e.vx, e.vy = -e.vy, a.vx = -a.vx, a.vy = -a.vy) }, i.fn.modes.pushParticles = function (e, a) { i.tmp.pushing = !0; for (var t = 0; e > t; t++)i.particles.array.push(new i.fn.particle(i.particles.color, i.particles.opacity.value, { x: a ? a.pos_x : Math.random() * i.canvas.w, y: a ? a.pos_y : Math.random() * i.canvas.h })), t == e - 1 && (i.particles.move.enable || i.fn.particlesDraw(), i.tmp.pushing = !1) }, i.fn.modes.removeParticles = function (e) { i.particles.array.splice(0, e), i.particles.move.enable || i.fn.particlesDraw() }, i.fn.modes.bubbleParticle = function (e) { function a() { e.opacity_bubble = e.opacity, e.radius_bubble = e.radius } function t(a, t, s, n, c) { if (a != t) if (i.tmp.bubble_duration_end) { if (void 0 != s) { var o = n - p * (n - a) / i.interactivity.modes.bubble.duration, l = a - o; d = a + l, "size" == c && (e.radius_bubble = d), "opacity" == c && (e.opacity_bubble = d) } } else if (r <= i.interactivity.modes.bubble.distance) { if (void 0 != s) var v = s; else var v = n; if (v != a) { var d = n - p * (n - a) / i.interactivity.modes.bubble.duration; "size" == c && (e.radius_bubble = d), "opacity" == c && (e.opacity_bubble = d) } } else "size" == c && (e.radius_bubble = void 0), "opacity" == c && (e.opacity_bubble = void 0) } if (i.interactivity.events.onhover.enable && isInArray("bubble", i.interactivity.events.onhover.mode)) { var s = e.x - i.interactivity.mouse.pos_x, n = e.y - i.interactivity.mouse.pos_y, r = Math.sqrt(s * s + n * n), c = 1 - r / i.interactivity.modes.bubble.distance; if (r <= i.interactivity.modes.bubble.distance) { if (c >= 0 && "mousemove" == i.interactivity.status) { if (i.interactivity.modes.bubble.size != i.particles.size.value) if (i.interactivity.modes.bubble.size > i.particles.size.value) { var o = e.radius + i.interactivity.modes.bubble.size * c; o >= 0 && (e.radius_bubble = o) } else { var l = e.radius - i.interactivity.modes.bubble.size, o = e.radius - l * c; o > 0 ? e.radius_bubble = o : e.radius_bubble = 0 } if (i.interactivity.modes.bubble.opacity != i.particles.opacity.value) if (i.interactivity.modes.bubble.opacity > i.particles.opacity.value) { var v = i.interactivity.modes.bubble.opacity * c; v > e.opacity && v <= i.interactivity.modes.bubble.opacity && (e.opacity_bubble = v) } else { var v = e.opacity - (i.particles.opacity.value - i.interactivity.modes.bubble.opacity) * c; v < e.opacity && v >= i.interactivity.modes.bubble.opacity && (e.opacity_bubble = v) } } } else a(); "mouseleave" == i.interactivity.status && a() } else if (i.interactivity.events.onclick.enable && isInArray("bubble", i.interactivity.events.onclick.mode)) { if (i.tmp.bubble_clicking) { var s = e.x - i.interactivity.mouse.click_pos_x, n = e.y - i.interactivity.mouse.click_pos_y, r = Math.sqrt(s * s + n * n), p = ((new Date).getTime() - i.interactivity.mouse.click_time) / 1e3; p > i.interactivity.modes.bubble.duration && (i.tmp.bubble_duration_end = !0), p > 2 * i.interactivity.modes.bubble.duration && (i.tmp.bubble_clicking = !1, i.tmp.bubble_duration_end = !1) } i.tmp.bubble_clicking && (t(i.interactivity.modes.bubble.size, i.particles.size.value, e.radius_bubble, e.radius, "size"), t(i.interactivity.modes.bubble.opacity, i.particles.opacity.value, e.opacity_bubble, e.opacity, "opacity")) } }, i.fn.modes.repulseParticle = function (e) { function a() { var a = Math.atan2(d, p); if (e.vx = u * Math.cos(a), e.vy = u * Math.sin(a), "bounce" == i.particles.move.out_mode) { var t = { x: e.x + e.vx, y: e.y + e.vy }; t.x + e.radius > i.canvas.w ? e.vx = -e.vx : t.x - e.radius < 0 && (e.vx = -e.vx), t.y + e.radius > i.canvas.h ? e.vy = -e.vy : t.y - e.radius < 0 && (e.vy = -e.vy) } } if (i.interactivity.events.onhover.enable && isInArray("repulse", i.interactivity.events.onhover.mode) && "mousemove" == i.interactivity.status) { var t = e.x - i.interactivity.mouse.pos_x, s = e.y - i.interactivity.mouse.pos_y, n = Math.sqrt(t * t + s * s), r = { x: t / n, y: s / n }, c = i.interactivity.modes.repulse.distance, o = 100, l = clamp(1 / c * (-1 * Math.pow(n / c, 2) + 1) * c * o, 0, 50), v = { x: e.x + r.x * l, y: e.y + r.y * l }; "bounce" == i.particles.move.out_mode ? (v.x - e.radius > 0 && v.x + e.radius < i.canvas.w && (e.x = v.x), v.y - e.radius > 0 && v.y + e.radius < i.canvas.h && (e.y = v.y)) : (e.x = v.x, e.y = v.y) } else if (i.interactivity.events.onclick.enable && isInArray("repulse", i.interactivity.events.onclick.mode)) if (i.tmp.repulse_finish || (i.tmp.repulse_count++, i.tmp.repulse_count == i.particles.array.length && (i.tmp.repulse_finish = !0)), i.tmp.repulse_clicking) { var c = Math.pow(i.interactivity.modes.repulse.distance / 6, 3), p = i.interactivity.mouse.click_pos_x - e.x, d = i.interactivity.mouse.click_pos_y - e.y, m = p * p + d * d, u = -c / m * 1; c >= m && a() } else 0 == i.tmp.repulse_clicking && (e.vx = e.vx_i, e.vy = e.vy_i) }, i.fn.modes.grabParticle = function (e) { if (i.interactivity.events.onhover.enable && "mousemove" == i.interactivity.status) { var a = e.x - i.interactivity.mouse.pos_x, t = e.y - i.interactivity.mouse.pos_y, s = Math.sqrt(a * a + t * t); if (s <= i.interactivity.modes.grab.distance) { var n = i.interactivity.modes.grab.line_linked.opacity - s / (1 / i.interactivity.modes.grab.line_linked.opacity) / i.interactivity.modes.grab.distance; if (n > 0) { var r = i.particles.line_linked.color_rgb_line; i.canvas.ctx.strokeStyle = "rgba(" + r.r + "," + r.g + "," + r.b + "," + n + ")", i.canvas.ctx.lineWidth = i.particles.line_linked.width, i.canvas.ctx.beginPath(), i.canvas.ctx.moveTo(e.x, e.y), i.canvas.ctx.lineTo(i.interactivity.mouse.pos_x, i.interactivity.mouse.pos_y), i.canvas.ctx.stroke(), i.canvas.ctx.closePath() } } } }, i.fn.vendors.eventsListeners = function () { "window" == i.interactivity.detect_on ? i.interactivity.el = window : i.interactivity.el = i.canvas.el, (i.interactivity.events.onhover.enable || i.interactivity.events.onclick.enable) && (i.interactivity.el.addEventListener("mousemove", function (e) { if (i.interactivity.el == window) var a = e.clientX, t = e.clientY; else var a = e.offsetX || e.clientX, t = e.offsetY || e.clientY; i.interactivity.mouse.pos_x = a, i.interactivity.mouse.pos_y = t, i.tmp.retina && (i.interactivity.mouse.pos_x *= i.canvas.pxratio, i.interactivity.mouse.pos_y *= i.canvas.pxratio), i.interactivity.status = "mousemove" }), i.interactivity.el.addEventListener("mouseleave", function (e) { i.interactivity.mouse.pos_x = null, i.interactivity.mouse.pos_y = null, i.interactivity.status = "mouseleave" })), i.interactivity.events.onclick.enable && i.interactivity.el.addEventListener("click", function () { if (i.interactivity.mouse.click_pos_x = i.interactivity.mouse.pos_x, i.interactivity.mouse.click_pos_y = i.interactivity.mouse.pos_y, i.interactivity.mouse.click_time = (new Date).getTime(), i.interactivity.events.onclick.enable) switch (i.interactivity.events.onclick.mode) { case "push": i.particles.move.enable ? i.fn.modes.pushParticles(i.interactivity.modes.push.particles_nb, i.interactivity.mouse) : 1 == i.interactivity.modes.push.particles_nb ? i.fn.modes.pushParticles(i.interactivity.modes.push.particles_nb, i.interactivity.mouse) : i.interactivity.modes.push.particles_nb > 1 && i.fn.modes.pushParticles(i.interactivity.modes.push.particles_nb); break; case "remove": i.fn.modes.removeParticles(i.interactivity.modes.remove.particles_nb); break; case "bubble": i.tmp.bubble_clicking = !0; break; case "repulse": i.tmp.repulse_clicking = !0, i.tmp.repulse_count = 0, i.tmp.repulse_finish = !1, setTimeout(function () { i.tmp.repulse_clicking = !1 }, 1e3 * i.interactivity.modes.repulse.duration) } }) }, i.fn.vendors.densityAutoParticles = function () { if (i.particles.number.density.enable) { var e = i.canvas.el.width * i.canvas.el.height / 1e3; i.tmp.retina && (e /= 2 * i.canvas.pxratio); var a = e * i.particles.number.value / i.particles.number.density.value_area, t = i.particles.array.length - a; 0 > t ? i.fn.modes.pushParticles(Math.abs(t)) : i.fn.modes.removeParticles(t) } }, i.fn.vendors.checkOverlap = function (e, a) { for (var t = 0; t < i.particles.array.length; t++) { var s = i.particles.array[t], n = e.x - s.x, r = e.y - s.y, c = Math.sqrt(n * n + r * r); c <= e.radius + s.radius && (e.x = a ? a.x : Math.random() * i.canvas.w, e.y = a ? a.y : Math.random() * i.canvas.h, i.fn.vendors.checkOverlap(e)) } }, i.fn.vendors.createSvgImg = function (e) { var a = i.tmp.source_svg, t = /#([0-9A-F]{3,6})/gi, s = a.replace(t, function (a, t, i, s) { if (e.color.rgb) var n = "rgba(" + e.color.rgb.r + "," + e.color.rgb.g + "," + e.color.rgb.b + "," + e.opacity + ")"; else var n = "hsla(" + e.color.hsl.h + "," + e.color.hsl.s + "%," + e.color.hsl.l + "%," + e.opacity + ")"; return n }), n = new Blob([s], { type: "image/svg+xml;charset=utf-8" }), r = window.URL || window.webkitURL || window, c = r.createObjectURL(n), o = new Image; o.addEventListener("load", function () { e.img.obj = o, e.img.loaded = !0, r.revokeObjectURL(c), i.tmp.count_svg++ }), o.src = c }, i.fn.vendors.destroypJS = function () { cancelAnimationFrame(i.fn.drawAnimFrame), t.remove(), pJSDom = null }, i.fn.vendors.drawShape = function (e, a, t, i, s, n) { var r = s * n, c = s / n, o = 180 * (c - 2) / c, l = Math.PI - Math.PI * o / 180; e.save(), e.beginPath(), e.translate(a, t), e.moveTo(0, 0); for (var v = 0; r > v; v++)e.lineTo(i, 0), e.translate(i, 0), e.rotate(l); e.fill(), e.restore() }, i.fn.vendors.exportImg = function () { window.open(i.canvas.el.toDataURL("image/png"), "_blank") }, i.fn.vendors.loadImg = function (e) { if (i.tmp.img_error = void 0, "" != i.particles.shape.image.src) if ("svg" == e) { var a = new XMLHttpRequest; a.open("GET", i.particles.shape.image.src), a.onreadystatechange = function (e) { 4 == a.readyState && (200 == a.status ? (i.tmp.source_svg = e.currentTarget.response, i.fn.vendors.checkBeforeDraw()) : (console.log("Error pJS - Image not found"), i.tmp.img_error = !0)) }, a.send() } else { var t = new Image; t.addEventListener("load", function () { i.tmp.img_obj = t, i.fn.vendors.checkBeforeDraw() }), t.src = i.particles.shape.image.src } else console.log("Error pJS - No image.src"), i.tmp.img_error = !0 }, i.fn.vendors.draw = function () { "image" == i.particles.shape.type ? "svg" == i.tmp.img_type ? i.tmp.count_svg >= i.particles.number.value ? (i.fn.particlesDraw(), i.particles.move.enable ? i.fn.drawAnimFrame = requestAnimFrame(i.fn.vendors.draw) : cancelRequestAnimFrame(i.fn.drawAnimFrame)) : i.tmp.img_error || (i.fn.drawAnimFrame = requestAnimFrame(i.fn.vendors.draw)) : void 0 != i.tmp.img_obj ? (i.fn.particlesDraw(), i.particles.move.enable ? i.fn.drawAnimFrame = requestAnimFrame(i.fn.vendors.draw) : cancelRequestAnimFrame(i.fn.drawAnimFrame)) : i.tmp.img_error || (i.fn.drawAnimFrame = requestAnimFrame(i.fn.vendors.draw)) : (i.fn.particlesDraw(), i.particles.move.enable ? i.fn.drawAnimFrame = requestAnimFrame(i.fn.vendors.draw) : cancelRequestAnimFrame(i.fn.drawAnimFrame)) }, i.fn.vendors.checkBeforeDraw = function () { "image" == i.particles.shape.type ? "svg" == i.tmp.img_type && void 0 == i.tmp.source_svg ? i.tmp.checkAnimFrame = requestAnimFrame(check) : (cancelRequestAnimFrame(i.tmp.checkAnimFrame), i.tmp.img_error || (i.fn.vendors.init(), i.fn.vendors.draw())) : (i.fn.vendors.init(), i.fn.vendors.draw()) }, i.fn.vendors.init = function () { i.fn.retinaInit(), i.fn.canvasInit(), i.fn.canvasSize(), i.fn.canvasPaint(), i.fn.particlesCreate(), i.fn.vendors.densityAutoParticles(), i.particles.line_linked.color_rgb_line = hexToRgb(i.particles.line_linked.color) }, i.fn.vendors.start = function () { isInArray("image", i.particles.shape.type) ? (i.tmp.img_type = i.particles.shape.image.src.substr(i.particles.shape.image.src.length - 3), i.fn.vendors.loadImg(i.tmp.img_type)) : i.fn.vendors.checkBeforeDraw() }, i.fn.vendors.eventsListeners(), i.fn.vendors.start() }; Object.deepExtend = function (e, a) { for (var t in a) a[t] && a[t].constructor && a[t].constructor === Object ? (e[t] = e[t] || {}, arguments.callee(e[t], a[t])) : e[t] = a[t]; return e }, window.requestAnimFrame = function () { return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (e) { window.setTimeout(e, 1e3 / 60) } }(), window.cancelRequestAnimFrame = function () { return window.cancelAnimationFrame || window.webkitCancelRequestAnimationFrame || window.mozCancelRequestAnimationFrame || window.oCancelRequestAnimationFrame || window.msCancelRequestAnimationFrame || clearTimeout }(), window.pJSDom = [], window.particlesJS = function (e, a) { "string" != typeof e && (a = e, e = "particles-js"), e || (e = "particles-js"); var t = document.getElementById(e), i = "particles-js-canvas-el", s = t.getElementsByClassName(i); if (s.length) for (; s.length > 0;)t.removeChild(s[0]); var n = document.createElement("canvas"); n.className = i, n.style.width = "100%", n.style.height = "100%"; var r = document.getElementById(e).appendChild(n); null != r && pJSDom.push(new pJS(e, a)) }, window.particlesJS.load = function (e, a, t) { var i = new XMLHttpRequest; i.open("GET", a), i.onreadystatechange = function (a) { if (4 == i.readyState) if (200 == i.status) { var s = JSON.parse(a.currentTarget.response); window.particlesJS(e, s), t && t() } else console.log("Error pJS - XMLHttpRequest status: " + i.status), console.log("Error pJS - File config not found") }, i.send() }; // app.js -particlesJS("particles-js", { particles: { number: { value: 80, density: { enable: !0, value_area: 2e3 } }, color: { value: "#ffffff" }, shape: { type: "circle", stroke: { width: 0, color: "#000000" }, polygon: { nb_sides: 5 } }, opacity: { value: .5, random: !1, anim: { enable: !1, speed: 1, opacity_min: .1, sync: !1 } }, size: { value: 3, random: !0, anim: { enable: !1, speed: 40, size_min: .1, sync: !1 } }, line_linked: { enable: !0, distance: 150, color: "#ffffff", opacity: .4, width: 1 }, move: { enable: !0, speed: 6, direction: "none", random: !1, straight: !1, out_mode: "out", bounce: !1, attract: { enable: !1, rotateX: 600, rotateY: 1200 } } }, interactivity: { detect_on: "canvas", events: { onhover: { enable: !0, mode: "grab" }, onclick: { enable: !0, mode: "push" }, resize: !0 }, modes: { grab: { distance: 140, line_linked: { opacity: 1 } }, bubble: { distance: 400, size: 40, duration: 2, opacity: 8, speed: 3 }, repulse: { distance: 200, duration: .4 }, push: { particles_nb: 4 }, remove: { particles_nb: 2 } } }, retina_detect: !0 }); var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')), tooltipList = tooltipTriggerList.map(function (e) { return new bootstrap.Tooltip(e) }); +particlesJS("particles-js", { particles: { number: { value: 100, density: { enable: !0, value_area: 2e3 } }, color: { value: "#ffffff" }, shape: { type: "circle!", stroke: { width: 0, color: "#000000" }, polygon: { nb_sides: 5 } }, opacity: { value: .5, random: !1, anim: { enable: !1, speed: 1, opacity_min: .1, sync: !1 } }, size: { value: 3, random: !0, anim: { enable: !1, speed: 40, size_min: .1, sync: !1 } }, line_linked: { enable: !0, distance: 200, color: "#ffffff", opacity: .4, width: 1 }, move: { enable: !0, speed: 2, direction: "none", random: !1, straight: !1, out_mode: "out", bounce: !1, attract: { enable: !1, rotateX: 600, rotateY: 1200 } } }, interactivity: { detect_on: "window", events: { onhover: { enable: !0, mode: "grab" }, onclick: { enable: !0, mode: "repulse" }, resize: !0 }, modes: { grab: { distance: 160, line_linked: { opacity: 1 } }, bubble: { distance: 400, size: 40, duration: 2, opacity: 8, speed: 3 }, repulse: { distance: 200, duration: .4 }, push: { particles_nb: 4 }, remove: { particles_nb: 2 } } }, retina_detect: !0 }); var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')), tooltipList = tooltipTriggerList.map(function (e) { return new bootstrap.Tooltip(e) }); diff --git a/v1/js/particles.js b/static/js/particles.js similarity index 100% rename from v1/js/particles.js rename to static/js/particles.js diff --git a/v5/static/js/particles.min.js b/static/js/particles.min.js similarity index 100% rename from v5/static/js/particles.min.js rename to static/js/particles.min.js diff --git a/v1/js/typewrite.js b/static/js/typewrite.js similarity index 100% rename from v1/js/typewrite.js rename to static/js/typewrite.js diff --git a/v5/static/scss/404-page/_buttons.scss b/static/scss/404-page/_buttons.scss similarity index 100% rename from v5/static/scss/404-page/_buttons.scss rename to static/scss/404-page/_buttons.scss diff --git a/v5/static/scss/404-page/_container.scss b/static/scss/404-page/_container.scss similarity index 100% rename from v5/static/scss/404-page/_container.scss rename to static/scss/404-page/_container.scss diff --git a/v5/static/scss/404-page/_fonts.scss b/static/scss/404-page/_fonts.scss similarity index 100% rename from v5/static/scss/404-page/_fonts.scss rename to static/scss/404-page/_fonts.scss diff --git a/v5/static/scss/404-page/_text.scss b/static/scss/404-page/_text.scss similarity index 100% rename from v5/static/scss/404-page/_text.scss rename to static/scss/404-page/_text.scss diff --git a/v5/static/scss/404-page/main.scss b/static/scss/404-page/main.scss similarity index 100% rename from v5/static/scss/404-page/main.scss rename to static/scss/404-page/main.scss diff --git a/v5/static/scss/_bootstrap_components.scss b/static/scss/_bootstrap_components.scss similarity index 100% rename from v5/static/scss/_bootstrap_components.scss rename to static/scss/_bootstrap_components.scss diff --git a/v5/static/scss/_buttons.all.scss b/static/scss/_buttons.all.scss similarity index 99% rename from v5/static/scss/_buttons.all.scss rename to static/scss/_buttons.all.scss index b7eb381..1d90d23 100644 --- a/v5/static/scss/_buttons.all.scss +++ b/static/scss/_buttons.all.scss @@ -18,7 +18,7 @@ input[type="submit"] { cursor: pointer; display: inline-block; font-family: 'Roboto', sans-serif; - font-size: 16px; + font-size: 1.2rem; font-weight: 500; height: 38px; line-height: 38px; diff --git a/v5/static/scss/_buttons.selected.scss b/static/scss/_buttons.selected.scss similarity index 100% rename from v5/static/scss/_buttons.selected.scss rename to static/scss/_buttons.selected.scss diff --git a/static/scss/_container.scss b/static/scss/_container.scss new file mode 100644 index 0000000..d4eaa08 --- /dev/null +++ b/static/scss/_container.scss @@ -0,0 +1,31 @@ +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +.row { + &.main { + .logo { + margin-top: 1.8rem; + border-radius: 2.5%; + } + + .name { + margin-top: 1rem; + } + + .title { + margin-left: 3%; + color: #ccc; + font-style: italic; + font-size: 1.5rem !important; + } + } +} + +@media (min-width: 768px) { .container { width: 95%; } } +@media (min-width: 992px) { .container { width: 85%; } } +@media (min-width: 1200px) { .container { width: 80%; } } +@media (min-width: 1800px) { .container { width: 100rem; } } \ No newline at end of file diff --git a/v5/static/scss/_emoji.scss b/static/scss/_emoji.scss similarity index 100% rename from v5/static/scss/_emoji.scss rename to static/scss/_emoji.scss diff --git a/static/scss/_font_devicon.part.scss b/static/scss/_font_devicon.part.scss new file mode 100644 index 0000000..b4c1893 --- /dev/null +++ b/static/scss/_font_devicon.part.scss @@ -0,0 +1,33 @@ +[class*='devicon-']:before { + display: inline-block; + font-family: 'devicon'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale +} + +.icon-archlinux:before { + content: '\0041'; +} + +.devicon-c:before { content: "" } +.devicon-rust:before{ content:"" } +.devicon-python:before{ content:"" } +.devicon-typescript:before { content:"" } +.devicon-elixir:before { content: "" } +.devicon-html5:before { content:"" } +.devicon-css3:before { content:"" } +.devicon-sass:before { content:"" } + +.devicon-redis-plain:before{content:""} +.devicon-postgresql-plain:before{content:""} +.devicon-mongodb-plain:before{content:""} +.devicon-cassandra-plain:before{content:""} +.devicon-git-plain:before{content:""} +.devicon-docker-plain:before{content:""} +.devicon-archlinux-plain:before{content:""} +.devicon-redhat-plain:before{content:""} +.devicon-ubuntu-plain:before{content:""} +.devicon-debian-plain:before{content:""} \ No newline at end of file diff --git a/static/scss/_fonts.scss b/static/scss/_fonts.scss new file mode 100644 index 0000000..8c65a7f --- /dev/null +++ b/static/scss/_fonts.scss @@ -0,0 +1,22 @@ +// outdated font +// @font-face { +// font-family: 'Mfizz'; +// src: url('../font/mfizz-custom.eot'); +// src: url('../font/mfizz-custom.eot?#iefix') format('embedded-opentype'), +// url('../font/mfizz-custom.woff') format('woff'), +// url('../font/mfizz-custom.ttf') format('truetype'); +// font-weight: normal; +// font-style: normal; +// font-display: swap; +// } + +@font-face { + font-family: 'devicon'; + src: url('../font/devicon.eot'); + src: url('../font/devicon.eot?#iefix') format('embedded-opentype'), + url('../font/devicon.woff') format('woff'), + url('../font/devicon.ttf') format('truetype'); + font-weight: normal; + font-style: normal; + font-display: swap; +} \ No newline at end of file diff --git a/static/scss/_footer.scss b/static/scss/_footer.scss new file mode 100644 index 0000000..faae0e2 --- /dev/null +++ b/static/scss/_footer.scss @@ -0,0 +1,17 @@ +.footer { + margin-top: 25px; + text-align: left; + padding: 5px; + border-top: 2px rgba(0, 0, 0, .6) solid; + font-family: 'Courier New', Courier, monospace; + display: flex; + justify-content: center; + + .logo { + width: 100%; + max-width: 150px; + margin: 5px; + border-radius: 2.5%; + filter: invert(35%) sepia(95%) saturate(435%) hue-rotate(131deg) brightness(94%) contrast(101%); + } +} \ No newline at end of file diff --git a/v5/static/scss/_particles.scss b/static/scss/_particles.scss similarity index 63% rename from v5/static/scss/_particles.scss rename to static/scss/_particles.scss index 0101da2..78d1d55 100644 --- a/v5/static/scss/_particles.scss +++ b/static/scss/_particles.scss @@ -3,7 +3,8 @@ canvas { display: block; } position: fixed; width: 100%; height: 100%; - // background: #00356b; + pointer-events: none; + z-index: -10; } .particle-content { position: absolute; @@ -17,21 +18,4 @@ canvas { display: block; } padding: 2em 3em; background: rgba(0, 0, 0, 0.4); text-shadow: 0px 0px 2px #131415; -} - -#particles-js { - pointer-events: none; -} -/* -h1 { - font-size: 2.25em; - font-weight: 700; - letter-spacing: -1px; -} - - position: absolute; - top: 50%; - right: 50%; - transform: translate(50%, -50%); - -*/ +} \ No newline at end of file diff --git a/v5/static/scss/_text.scss b/static/scss/_text.scss similarity index 100% rename from v5/static/scss/_text.scss rename to static/scss/_text.scss diff --git a/v5/static/scss/_tooltips.scss b/static/scss/_tooltips.scss similarity index 100% rename from v5/static/scss/_tooltips.scss rename to static/scss/_tooltips.scss diff --git a/static/scss/bootstrap/.gitignore b/static/scss/bootstrap/.gitignore new file mode 100644 index 0000000..9f11b75 --- /dev/null +++ b/static/scss/bootstrap/.gitignore @@ -0,0 +1 @@ +.idea/ diff --git a/static/scss/bootstrap/LICENSE b/static/scss/bootstrap/LICENSE new file mode 100644 index 0000000..6633b55 --- /dev/null +++ b/static/scss/bootstrap/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2011-2023 The Bootstrap Authors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/static/scss/bootstrap/README.md b/static/scss/bootstrap/README.md new file mode 100644 index 0000000..ba412ed --- /dev/null +++ b/static/scss/bootstrap/README.md @@ -0,0 +1,84 @@ +# Bootstrap SCSS + +> Bootstrap's SCSS files (only) + +

+ + Bootstrap logo + +

+ +

Bootstrap

+ +

+ Sleek, intuitive, and powerful front-end framework for faster and easier web development. +
+ Explore Bootstrap docs » +
+
+ Report bug + · + Request feature + · + Themes + · + Blog +

+ +
+ +## Table of contents + +- [Quick start](#quick-start) +- [Status](#status) +- [What's included](#whats-included) +- [Documentation](#documentation) +- [Versioning](#versioning) +- [Copyright and license](#copyright-and-license) + +## Quick start + +Several quick start options are available: + +- Install with [npm](https://www.npmjs.com/): `npm install bootstrap-scss` +- Install with [yarn](https://yarnpkg.com/): `yarn add bootstrap-scss` + +Read the [Getting started page](https://getbootstrap.com/docs/5.3/getting-started/introduction/) for information on the framework contents, templates and examples, and more. + +## Status + +[![npm version](https://img.shields.io/npm/v/bootstrap-scss.svg)](https://www.npmjs.com/package/bootstrap-scss) + +## What's included + +Within this package you'll find the following directories and files, logically grouping common assets and providing only SCSS variations. You'll see something like this: + +``` +bootstrap-scss/ +├── bootstrap.scss +├── bootstrap-grid.scss +├── bootstrap-reboot.scss +├── bootstrap-utilities.css +├── mixins/ +│ └─ ... +└── utilities/ + └─ ... +└── vendor/ + └─ ... +``` + +## Documentation + +[Bootstrap's official documentation](https://getbootstrap.com/) powered by [Algolia's DocSearch](https://community.algolia.com/docsearch/). + +## Versioning + +For simplicity, this project will use the same version numbers as Bootstrap. + +## Changelog + +https://github.com/twbs/bootstrap/releases/tag/v5.3.3 + +## Copyright and license + +Code and documentation copyright 2011-2022 the [Bootstrap Authors](https://github.com/twbs/bootstrap/graphs/contributors) and [Twitter, Inc.](https://twitter.com) Code released under the [MIT License](https://github.com/twbs/bootstrap/blob/main/LICENSE). diff --git a/static/scss/bootstrap/_accordion.scss b/static/scss/bootstrap/_accordion.scss new file mode 100644 index 0000000..17e5436 --- /dev/null +++ b/static/scss/bootstrap/_accordion.scss @@ -0,0 +1,158 @@ +// +// Base styles +// + +.accordion { + // scss-docs-start accordion-css-vars + --#{$prefix}accordion-color: #{$accordion-color}; + --#{$prefix}accordion-bg: #{$accordion-bg}; + --#{$prefix}accordion-transition: #{$accordion-transition}; + --#{$prefix}accordion-border-color: #{$accordion-border-color}; + --#{$prefix}accordion-border-width: #{$accordion-border-width}; + --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; + --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; + --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; + --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; + --#{$prefix}accordion-btn-color: #{$accordion-button-color}; + --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; + --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; + --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; + --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; + --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; + --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; + --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; + --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; + --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; + --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; + --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; + // scss-docs-end accordion-css-vars +} + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); + @include font-size($font-size-base); + color: var(--#{$prefix}accordion-btn-color); + text-align: left; // Reset button style + background-color: var(--#{$prefix}accordion-btn-bg); + border: 0; + @include border-radius(0); + overflow-anchor: none; + @include transition(var(--#{$prefix}accordion-transition)); + + &:not(.collapsed) { + color: var(--#{$prefix}accordion-active-color); + background-color: var(--#{$prefix}accordion-active-bg); + box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list + + &::after { + background-image: var(--#{$prefix}accordion-btn-active-icon); + transform: var(--#{$prefix}accordion-btn-icon-transform); + } + } + + // Accordion icon + &::after { + flex-shrink: 0; + width: var(--#{$prefix}accordion-btn-icon-width); + height: var(--#{$prefix}accordion-btn-icon-width); + margin-left: auto; + content: ""; + background-image: var(--#{$prefix}accordion-btn-icon); + background-repeat: no-repeat; + background-size: var(--#{$prefix}accordion-btn-icon-width); + @include transition(var(--#{$prefix}accordion-btn-icon-transition)); + } + + &:hover { + z-index: 2; + } + + &:focus { + z-index: 3; + outline: 0; + box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); + } +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-item { + color: var(--#{$prefix}accordion-color); + background-color: var(--#{$prefix}accordion-bg); + border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); + + &:first-of-type { + @include border-top-radius(var(--#{$prefix}accordion-border-radius)); + + > .accordion-header .accordion-button { + @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); + } + } + + &:not(:first-of-type) { + border-top: 0; + } + + // Only set a border-radius on the last item if the accordion is collapsed + &:last-of-type { + @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); + + > .accordion-header .accordion-button { + &.collapsed { + @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); + } + } + + > .accordion-collapse { + @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); + } + } +} + +.accordion-body { + padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); +} + + +// Flush accordion items +// +// Remove borders and border-radius to keep accordion items edge-to-edge. + +.accordion-flush { + > .accordion-item { + border-right: 0; + border-left: 0; + @include border-radius(0); + + &:first-child { border-top: 0; } + &:last-child { border-bottom: 0; } + + // stylelint-disable selector-max-class + > .accordion-header .accordion-button { + &, + &.collapsed { + @include border-radius(0); + } + } + // stylelint-enable selector-max-class + + > .accordion-collapse { + @include border-radius(0); + } + } +} + +@if $enable-dark-mode { + @include color-mode(dark) { + .accordion-button::after { + --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; + --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; + } + } +} diff --git a/static/scss/bootstrap/_alert.scss b/static/scss/bootstrap/_alert.scss new file mode 100644 index 0000000..b8cff9b --- /dev/null +++ b/static/scss/bootstrap/_alert.scss @@ -0,0 +1,68 @@ +// +// Base styles +// + +.alert { + // scss-docs-start alert-css-vars + --#{$prefix}alert-bg: transparent; + --#{$prefix}alert-padding-x: #{$alert-padding-x}; + --#{$prefix}alert-padding-y: #{$alert-padding-y}; + --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; + --#{$prefix}alert-color: inherit; + --#{$prefix}alert-border-color: transparent; + --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); + --#{$prefix}alert-border-radius: #{$alert-border-radius}; + --#{$prefix}alert-link-color: inherit; + // scss-docs-end alert-css-vars + + position: relative; + padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); + margin-bottom: var(--#{$prefix}alert-margin-bottom); + color: var(--#{$prefix}alert-color); + background-color: var(--#{$prefix}alert-bg); + border: var(--#{$prefix}alert-border); + @include border-radius(var(--#{$prefix}alert-border-radius)); +} + +// Headings for larger alerts +.alert-heading { + // Specified to prevent conflicts of changing $headings-color + color: inherit; +} + +// Provide class for links that match alerts +.alert-link { + font-weight: $alert-link-font-weight; + color: var(--#{$prefix}alert-link-color); +} + + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissible { + padding-right: $alert-dismissible-padding-r; + + // Adjust close link position + .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: $stretched-link-z-index + 1; + padding: $alert-padding-y * 1.25 $alert-padding-x; + } +} + + +// scss-docs-start alert-modifiers +// Generate contextual modifier classes for colorizing the alert +@each $state in map-keys($theme-colors) { + .alert-#{$state} { + --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); + --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); + --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); + --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); + } +} +// scss-docs-end alert-modifiers diff --git a/v5/static/scss/bootstrap/_badge.scss b/static/scss/bootstrap/_badge.scss similarity index 100% rename from v5/static/scss/bootstrap/_badge.scss rename to static/scss/bootstrap/_badge.scss diff --git a/v5/static/scss/bootstrap/_breadcrumb.scss b/static/scss/bootstrap/_breadcrumb.scss similarity index 100% rename from v5/static/scss/bootstrap/_breadcrumb.scss rename to static/scss/bootstrap/_breadcrumb.scss diff --git a/static/scss/bootstrap/_button-group.scss b/static/scss/bootstrap/_button-group.scss new file mode 100644 index 0000000..55ae3f6 --- /dev/null +++ b/static/scss/bootstrap/_button-group.scss @@ -0,0 +1,142 @@ +// Make the div behave like a button +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; // match .btn alignment given font-size hack above + + > .btn { + position: relative; + flex: 1 1 auto; + } + + // Bring the hover, focused, and "active" buttons to the front to overlay + // the borders properly + > .btn-check:checked + .btn, + > .btn-check:focus + .btn, + > .btn:hover, + > .btn:focus, + > .btn:active, + > .btn.active { + z-index: 1; + } +} + +// Optional: Group multiple button groups together for a toolbar +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + + .input-group { + width: auto; + } +} + +.btn-group { + @include border-radius($btn-border-radius); + + // Prevent double borders when buttons are next to each other + > :not(.btn-check:first-child) + .btn, + > .btn-group:not(:first-child) { + margin-left: calc(#{$btn-border-width} * -1); // stylelint-disable-line function-disallowed-list + } + + // Reset rounded corners + > .btn:not(:last-child):not(.dropdown-toggle), + > .btn.dropdown-toggle-split:first-child, + > .btn-group:not(:last-child) > .btn { + @include border-end-radius(0); + } + + // The left radius should be 0 if the button is: + // - the "third or more" child + // - the second child and the previous element isn't `.btn-check` (making it the first child visually) + // - part of a btn-group which isn't the first child + > .btn:nth-child(n + 3), + > :not(.btn-check) + .btn, + > .btn-group:not(:first-child) > .btn { + @include border-start-radius(0); + } +} + +// Sizing +// +// Remix the default button sizing classes into new ones for easier manipulation. + +.btn-group-sm > .btn { @extend .btn-sm; } +.btn-group-lg > .btn { @extend .btn-lg; } + + +// +// Split button dropdowns +// + +.dropdown-toggle-split { + padding-right: $btn-padding-x * .75; + padding-left: $btn-padding-x * .75; + + &::after, + .dropup &::after, + .dropend &::after { + margin-left: 0; + } + + .dropstart &::before { + margin-right: 0; + } +} + +.btn-sm + .dropdown-toggle-split { + padding-right: $btn-padding-x-sm * .75; + padding-left: $btn-padding-x-sm * .75; +} + +.btn-lg + .dropdown-toggle-split { + padding-right: $btn-padding-x-lg * .75; + padding-left: $btn-padding-x-lg * .75; +} + + +// The clickable button for toggling the menu +// Set the same inset shadow as the :active state +.btn-group.show .dropdown-toggle { + @include box-shadow($btn-active-box-shadow); + + // Show no shadow for `.btn-link` since it has no other button styles. + &.btn-link { + @include box-shadow(none); + } +} + + +// +// Vertical button groups +// + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; + + > .btn, + > .btn-group { + width: 100%; + } + + > .btn:not(:first-child), + > .btn-group:not(:first-child) { + margin-top: calc(#{$btn-border-width} * -1); // stylelint-disable-line function-disallowed-list + } + + // Reset rounded corners + > .btn:not(:last-child):not(.dropdown-toggle), + > .btn-group:not(:last-child) > .btn { + @include border-bottom-radius(0); + } + + > .btn ~ .btn, + > .btn-group:not(:first-child) > .btn { + @include border-top-radius(0); + } +} diff --git a/static/scss/bootstrap/_buttons.scss b/static/scss/bootstrap/_buttons.scss new file mode 100644 index 0000000..caa4518 --- /dev/null +++ b/static/scss/bootstrap/_buttons.scss @@ -0,0 +1,216 @@ +// +// Base styles +// + +.btn { + // scss-docs-start btn-css-vars + --#{$prefix}btn-padding-x: #{$btn-padding-x}; + --#{$prefix}btn-padding-y: #{$btn-padding-y}; + --#{$prefix}btn-font-family: #{$btn-font-family}; + @include rfs($btn-font-size, --#{$prefix}btn-font-size); + --#{$prefix}btn-font-weight: #{$btn-font-weight}; + --#{$prefix}btn-line-height: #{$btn-line-height}; + --#{$prefix}btn-color: #{$btn-color}; + --#{$prefix}btn-bg: transparent; + --#{$prefix}btn-border-width: #{$btn-border-width}; + --#{$prefix}btn-border-color: transparent; + --#{$prefix}btn-border-radius: #{$btn-border-radius}; + --#{$prefix}btn-hover-border-color: transparent; + --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; + --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; + --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); + // scss-docs-end btn-css-vars + + display: inline-block; + padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); + font-family: var(--#{$prefix}btn-font-family); + @include font-size(var(--#{$prefix}btn-font-size)); + font-weight: var(--#{$prefix}btn-font-weight); + line-height: var(--#{$prefix}btn-line-height); + color: var(--#{$prefix}btn-color); + text-align: center; + text-decoration: if($link-decoration == none, null, none); + white-space: $btn-white-space; + vertical-align: middle; + cursor: if($enable-button-pointers, pointer, null); + user-select: none; + border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); + @include border-radius(var(--#{$prefix}btn-border-radius)); + @include gradient-bg(var(--#{$prefix}btn-bg)); + @include box-shadow(var(--#{$prefix}btn-box-shadow)); + @include transition($btn-transition); + + &:hover { + color: var(--#{$prefix}btn-hover-color); + text-decoration: if($link-hover-decoration == underline, none, null); + background-color: var(--#{$prefix}btn-hover-bg); + border-color: var(--#{$prefix}btn-hover-border-color); + } + + .btn-check + &:hover { + // override for the checkbox/radio buttons + color: var(--#{$prefix}btn-color); + background-color: var(--#{$prefix}btn-bg); + border-color: var(--#{$prefix}btn-border-color); + } + + &:focus-visible { + color: var(--#{$prefix}btn-hover-color); + @include gradient-bg(var(--#{$prefix}btn-hover-bg)); + border-color: var(--#{$prefix}btn-hover-border-color); + outline: 0; + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + + .btn-check:focus-visible + & { + border-color: var(--#{$prefix}btn-hover-border-color); + outline: 0; + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + + .btn-check:checked + &, + :not(.btn-check) + &:active, + &:first-child:active, + &.active, + &.show { + color: var(--#{$prefix}btn-active-color); + background-color: var(--#{$prefix}btn-active-bg); + // Remove CSS gradients if they're enabled + background-image: if($enable-gradients, none, null); + border-color: var(--#{$prefix}btn-active-border-color); + @include box-shadow(var(--#{$prefix}btn-active-shadow)); + + &:focus-visible { + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + } + + .btn-check:checked:focus-visible + & { + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + + &:disabled, + &.disabled, + fieldset:disabled & { + color: var(--#{$prefix}btn-disabled-color); + pointer-events: none; + background-color: var(--#{$prefix}btn-disabled-bg); + background-image: if($enable-gradients, none, null); + border-color: var(--#{$prefix}btn-disabled-border-color); + opacity: var(--#{$prefix}btn-disabled-opacity); + @include box-shadow(none); + } +} + + +// +// Alternate buttons +// + +// scss-docs-start btn-variant-loops +@each $color, $value in $theme-colors { + .btn-#{$color} { + @if $color == "light" { + @include button-variant( + $value, + $value, + $hover-background: shade-color($value, $btn-hover-bg-shade-amount), + $hover-border: shade-color($value, $btn-hover-border-shade-amount), + $active-background: shade-color($value, $btn-active-bg-shade-amount), + $active-border: shade-color($value, $btn-active-border-shade-amount) + ); + } @else if $color == "dark" { + @include button-variant( + $value, + $value, + $hover-background: tint-color($value, $btn-hover-bg-tint-amount), + $hover-border: tint-color($value, $btn-hover-border-tint-amount), + $active-background: tint-color($value, $btn-active-bg-tint-amount), + $active-border: tint-color($value, $btn-active-border-tint-amount) + ); + } @else { + @include button-variant($value, $value); + } + } +} + +@each $color, $value in $theme-colors { + .btn-outline-#{$color} { + @include button-outline-variant($value); + } +} +// scss-docs-end btn-variant-loops + + +// +// Link buttons +// + +// Make a button look and behave like a link +.btn-link { + --#{$prefix}btn-font-weight: #{$font-weight-normal}; + --#{$prefix}btn-color: #{$btn-link-color}; + --#{$prefix}btn-bg: transparent; + --#{$prefix}btn-border-color: transparent; + --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; + --#{$prefix}btn-hover-border-color: transparent; + --#{$prefix}btn-active-color: #{$btn-link-hover-color}; + --#{$prefix}btn-active-border-color: transparent; + --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; + --#{$prefix}btn-disabled-border-color: transparent; + --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows + --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; + + text-decoration: $link-decoration; + @if $enable-gradients { + background-image: none; + } + + &:hover, + &:focus-visible { + text-decoration: $link-hover-decoration; + } + + &:focus-visible { + color: var(--#{$prefix}btn-color); + } + + &:hover { + color: var(--#{$prefix}btn-hover-color); + } + + // No need for an active state here +} + + +// +// Button Sizes +// + +.btn-lg { + @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); +} + +.btn-sm { + @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); +} diff --git a/v5/static/scss/bootstrap/_card.scss b/static/scss/bootstrap/_card.scss similarity index 100% rename from v5/static/scss/bootstrap/_card.scss rename to static/scss/bootstrap/_card.scss diff --git a/static/scss/bootstrap/_carousel.scss b/static/scss/bootstrap/_carousel.scss new file mode 100644 index 0000000..3a13522 --- /dev/null +++ b/static/scss/bootstrap/_carousel.scss @@ -0,0 +1,236 @@ +// Notes on the classes: +// +// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) +// even when their scroll action started on a carousel, but for compatibility (with Firefox) +// we're preventing all actions instead +// 2. The .carousel-item-start and .carousel-item-end is used to indicate where +// the active slide is heading. +// 3. .active.carousel-item is the current slide. +// 4. .active.carousel-item-start and .active.carousel-item-end is the current +// slide in its in-transition state. Only one of these occurs at a time. +// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end +// is the upcoming slide in transition. + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; + @include clearfix(); +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + backface-visibility: hidden; + @include transition($carousel-transition); +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-start), +.active.carousel-item-end { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-end), +.active.carousel-item-start { + transform: translateX(-100%); +} + + +// +// Alternate transitions +// + +.carousel-fade { + .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; + } + + .carousel-item.active, + .carousel-item-next.carousel-item-start, + .carousel-item-prev.carousel-item-end { + z-index: 1; + opacity: 1; + } + + .active.carousel-item-start, + .active.carousel-item-end { + z-index: 0; + opacity: 0; + @include transition(opacity 0s $carousel-transition-duration); + } +} + + +// +// Left/right controls for nav +// + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + // Use flex for alignment (1-3) + display: flex; // 1. allow flex styles + align-items: center; // 2. vertically center contents + justify-content: center; // 3. horizontally center contents + width: $carousel-control-width; + padding: 0; + color: $carousel-control-color; + text-align: center; + background: none; + border: 0; + opacity: $carousel-control-opacity; + @include transition($carousel-control-transition); + + // Hover/focus state + &:hover, + &:focus { + color: $carousel-control-color; + text-decoration: none; + outline: 0; + opacity: $carousel-control-hover-opacity; + } +} +.carousel-control-prev { + left: 0; + background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); +} +.carousel-control-next { + right: 0; + background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); +} + +// Icons for within +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: $carousel-control-icon-width; + height: $carousel-control-icon-width; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; +} + +.carousel-control-prev-icon { + background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; +} +.carousel-control-next-icon { + background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; +} + +// Optional indicator pips/controls +// +// Add a container (such as a list) with the following class and add an item (ideally a focusable control, +// like a button) with data-bs-target for each slide your carousel holds. + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: flex; + justify-content: center; + padding: 0; + // Use the .carousel-control's width as margin so we don't overlay those + margin-right: $carousel-control-width; + margin-bottom: 1rem; + margin-left: $carousel-control-width; + + [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: $carousel-indicator-width; + height: $carousel-indicator-height; + padding: 0; + margin-right: $carousel-indicator-spacer; + margin-left: $carousel-indicator-spacer; + text-indent: -999px; + cursor: pointer; + background-color: $carousel-indicator-active-bg; + background-clip: padding-box; + border: 0; + // Use transparent borders to increase the hit area by 10px on top and bottom. + border-top: $carousel-indicator-hit-area-height solid transparent; + border-bottom: $carousel-indicator-hit-area-height solid transparent; + opacity: $carousel-indicator-opacity; + @include transition($carousel-indicator-transition); + } + + .active { + opacity: $carousel-indicator-active-opacity; + } +} + + +// Optional captions +// +// + +.carousel-caption { + position: absolute; + right: (100% - $carousel-caption-width) * .5; + bottom: $carousel-caption-spacer; + left: (100% - $carousel-caption-width) * .5; + padding-top: $carousel-caption-padding-y; + padding-bottom: $carousel-caption-padding-y; + color: $carousel-caption-color; + text-align: center; +} + +// Dark mode carousel + +@mixin carousel-dark() { + .carousel-control-prev-icon, + .carousel-control-next-icon { + filter: $carousel-dark-control-icon-filter; + } + + .carousel-indicators [data-bs-target] { + background-color: $carousel-dark-indicator-active-bg; + } + + .carousel-caption { + color: $carousel-dark-caption-color; + } +} + +.carousel-dark { + @include carousel-dark(); +} + +@if $enable-dark-mode { + @include color-mode(dark) { + @if $color-mode-type == "media-query" { + .carousel { + @include carousel-dark(); + } + } @else { + .carousel, + &.carousel { + @include carousel-dark(); + } + } + } +} diff --git a/v5/static/scss/bootstrap/_close.scss b/static/scss/bootstrap/_close.scss similarity index 100% rename from v5/static/scss/bootstrap/_close.scss rename to static/scss/bootstrap/_close.scss diff --git a/v5/static/scss/bootstrap/_containers.scss b/static/scss/bootstrap/_containers.scss similarity index 100% rename from v5/static/scss/bootstrap/_containers.scss rename to static/scss/bootstrap/_containers.scss diff --git a/v5/static/scss/bootstrap/_dropdown.scss b/static/scss/bootstrap/_dropdown.scss similarity index 100% rename from v5/static/scss/bootstrap/_dropdown.scss rename to static/scss/bootstrap/_dropdown.scss diff --git a/v5/static/scss/bootstrap/_forms.scss b/static/scss/bootstrap/_forms.scss similarity index 100% rename from v5/static/scss/bootstrap/_forms.scss rename to static/scss/bootstrap/_forms.scss diff --git a/v5/static/scss/bootstrap/_functions.scss b/static/scss/bootstrap/_functions.scss similarity index 100% rename from v5/static/scss/bootstrap/_functions.scss rename to static/scss/bootstrap/_functions.scss diff --git a/v5/static/scss/bootstrap/_grid.scss b/static/scss/bootstrap/_grid.scss similarity index 100% rename from v5/static/scss/bootstrap/_grid.scss rename to static/scss/bootstrap/_grid.scss diff --git a/v5/static/scss/bootstrap/_helpers.scss b/static/scss/bootstrap/_helpers.scss similarity index 100% rename from v5/static/scss/bootstrap/_helpers.scss rename to static/scss/bootstrap/_helpers.scss diff --git a/v5/static/scss/bootstrap/_images.scss b/static/scss/bootstrap/_images.scss similarity index 100% rename from v5/static/scss/bootstrap/_images.scss rename to static/scss/bootstrap/_images.scss diff --git a/static/scss/bootstrap/_list-group.scss b/static/scss/bootstrap/_list-group.scss new file mode 100644 index 0000000..455531e --- /dev/null +++ b/static/scss/bootstrap/_list-group.scss @@ -0,0 +1,197 @@ +// Base class +// +// Easily usable on