commit 2c58e6322707209b61898f5659ebc26b09c94d46 Author: crowetic Date: Wed Dec 11 14:40:32 2024 -0800 created Q-Mintership-Alpha repository diff --git a/.nextcloudsync.log b/.nextcloudsync.log new file mode 100644 index 0000000..e69de29 diff --git a/.sync_b2a788d19481.db b/.sync_b2a788d19481.db new file mode 100644 index 0000000..9d38a58 Binary files /dev/null and b/.sync_b2a788d19481.db differ diff --git a/.sync_b2a788d19481.db-shm b/.sync_b2a788d19481.db-shm new file mode 100644 index 0000000..2d49dfc Binary files /dev/null and b/.sync_b2a788d19481.db-shm differ diff --git a/.sync_b2a788d19481.db-wal b/.sync_b2a788d19481.db-wal new file mode 100644 index 0000000..305ea90 Binary files /dev/null and b/.sync_b2a788d19481.db-wal differ diff --git a/.sync_b48a6eedae0b.db b/.sync_b48a6eedae0b.db new file mode 100644 index 0000000..21809e6 Binary files /dev/null and b/.sync_b48a6eedae0b.db differ diff --git a/.sync_b48a6eedae0b.db-shm b/.sync_b48a6eedae0b.db-shm new file mode 100644 index 0000000..22d1832 Binary files /dev/null and b/.sync_b48a6eedae0b.db-shm differ diff --git a/.sync_b48a6eedae0b.db-wal b/.sync_b48a6eedae0b.db-wal new file mode 100644 index 0000000..e86421a Binary files /dev/null and b/.sync_b48a6eedae0b.db-wal differ diff --git a/BACKUP/index-Dec-9-afterRemovingBottomSection.html b/BACKUP/index-Dec-9-afterRemovingBottomSection.html new file mode 100644 index 0000000..e0585dc --- /dev/null +++ b/BACKUP/index-Dec-9-afterRemovingBottomSection.html @@ -0,0 +1,260 @@ + + + + + + + + + + + + + Home + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+
+
+

Q-Mintership Alpha

+

This is the initial 'alpha' of the Mintership Forum / Mintership tools that will be built into the final Q-Mintership app. This is a simplistic version built by crowetic that will offer a very simple communciations location, and the tools for the minter admins to accomplish the necessary GROUP_APPROVAL transactions. Scroll down for the currently available tools... 

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

+ Mintership Details

+

+ Learn more about the Mintership concept, and why it was needed. The days of 'sponsorship' are a thing of the past on the Qortal Network. No more will there be the ability to self-sponsor. A new era of Qortal begins! Join the conversation with the other minters and admins here!

+ +
+
+
+
+
+ +
+

Become A Minter

+

+ Not already minting? You've come to the right place to get started. The 'MINTERS.' links will take you to the 'Minter Board'. The Minter Board is a place to publish your intent to become a minter, and get support from the existing minters and Minter Admins.

+ +
+
+
+
+
+ +
+

Minter Admin Tools

+

+ Are you one of the initially selected Minter Admins? We have the tools here you need to create and approve GROUP_APPROVAL transactions, and communicate securely with your fellow admins. There is a private forum, and Minter Admin Tools section available for you!

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

+ More information...

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

+ This is the beginning...

+
+
+
+
+

+ This is the very start of the Q-Mintership app. It will be dramatically changing upon the beta release, and modification to the Q-Mintership Q-App. This initial version is a version that could be launched more quickly, and does not have nearly as much functionality as what will exist once the main app goes live. 

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

Q-Mintership Alpha

+
+
+ + + + +
+
+ +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BACKUP/index-Dec-9-beforeRemovingSection.html b/BACKUP/index-Dec-9-beforeRemovingSection.html new file mode 100644 index 0000000..c13a99a --- /dev/null +++ b/BACKUP/index-Dec-9-beforeRemovingSection.html @@ -0,0 +1,300 @@ + + + + + + + + + + + + + Home + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+
+
+

Q-Mintership Alpha

+

This is the initial 'alpha' of the Mintership Forum / Mintership tools that will be built into the final Q-Mintership app. This is a simplistic version built by crowetic that will offer a very simple communciations location, and the tools for the minter admins to accomplish the necessary GROUP_APPROVAL transactions. Scroll down for the currently available tools... 

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

+ Mintership Details

+

+ Learn more about the Mintership concept, and why it was needed. The days of 'sponsorship' are a thing of the past on the Qortal Network. No more will there be the ability to self-sponsor. A new era of Qortal begins!

+
+
+
+
+
+ +
+

Become A Minter

+

+ Not already minting? You've come to the right place to get started. The 'MINTERS.' links will take you to the 'Minter Board'. The Minter Board is a place to publish your intent to become a minter, and get support from the existing minters and Minter Admins.

+ +
+
+
+
+
+ +
+

Minter Admin Tools

+

+ Are you one of the initially selected Minter Admins? We have the tools here you need to create and approve GROUP_APPROVAL transactions, and communicate securely with your fellow admins.

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

+ More information...

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

+ Get Information

+

+ Would you like to become a minter? You've come to the right place! Obtain details about the new Mintership-based minting process on Qortal.

+
+
+
+
+
+ +
+

+ Minter Admin Tools

+

+ If you are a Minter Admin, you will need to know how to create and sign GROUP_APPROVAL transactions. You may do so here!

+
+
+
+
+
+ +
+

+ Start your Mission

+

+ Every mission has a beginning. If your mission is to become a minter, or a Minter Admin, then you've landed at the correct launchpad!

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

+ This is the beginning...

+
+
+
+
+

+ This is the very start of the Q-Mintership app. It will be dramatically changing upon the beta release, and modification to the Q-Mintership Q-App. This initial version is a version that could be launched more quickly, and does not have nearly as much functionality as what will exist once the main app goes live. 

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

Q-Mintership Alpha

+
+
+ + + + +
+
+ +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/animatecss/animate.css b/assets/animatecss/animate.css new file mode 100644 index 0000000..035443c --- /dev/null +++ b/assets/animatecss/animate.css @@ -0,0 +1,4074 @@ + +@charset "UTF-8"; +/*! + * animate.css - https://animate.style/ + * Version - 4.1.0 + * Licensed under the MIT license - http://opensource.org/licenses/MIT + * + * Copyright (c) 2020 Animate.css + */ +:root { + --animate-duration: 0.4s; + --animate-delay: 0.1s; + --animate-repeat: 1; +} +.animate__animated { + -webkit-animation-duration: var(--animate-duration)s; + animation-duration: var(--animate-duration); + -webkit-animation-duration: var(--animate-duration); + animation-duration: var(--animate-duration); + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} +.animate__animated.animate__infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; +} +.animate__animated.animate__repeat-1 { + -webkit-animation-iteration-count: 1; + animation-iteration-count: 1; + -webkit-animation-iteration-count: var(--animate-repeat); + animation-iteration-count: var(--animate-repeat); +} +.animate__animated.animate__repeat-2 { + -webkit-animation-iteration-count: calc(1 * 2); + animation-iteration-count: calc(1 * 2); + -webkit-animation-iteration-count: calc(var(--animate-repeat) * 2); + animation-iteration-count: calc(var(--animate-repeat) * 2); +} +.animate__animated.animate__repeat-3 { + -webkit-animation-iteration-count: calc(1 * 3); + animation-iteration-count: calc(1 * 3); + -webkit-animation-iteration-count: calc(var(--animate-repeat) * 3); + animation-iteration-count: calc(var(--animate-repeat) * 3); +} +.animate__animated.animate__delay-1s { + -webkit-animation-delay: 1s; + animation-delay: 1s; + -webkit-animation-delay: var(--animate-delay); + animation-delay: var(--animate-delay); +} +.animate__animated.animate__delay-2s { + -webkit-animation-delay: calc(1s * 2); + animation-delay: calc(1s * 2); + -webkit-animation-delay: calc(var(--animate-delay) * 2); + animation-delay: calc(var(--animate-delay) * 2); +} +.animate__animated.animate__delay-3s { + -webkit-animation-delay: calc(1s * 3); + animation-delay: calc(1s * 3); + -webkit-animation-delay: calc(var(--animate-delay) * 3); + animation-delay: calc(var(--animate-delay) * 3); +} +.animate__animated.animate__delay-4s { + -webkit-animation-delay: calc(1s * 4); + animation-delay: calc(1s * 4); + -webkit-animation-delay: calc(var(--animate-delay) * 4); + animation-delay: calc(var(--animate-delay) * 4); +} +.animate__animated.animate__delay-5s { + -webkit-animation-delay: calc(1s * 5); + animation-delay: calc(1s * 5); + -webkit-animation-delay: calc(var(--animate-delay) * 5); + animation-delay: calc(var(--animate-delay) * 5); +} +.animate__animated.animate__faster { + -webkit-animation-duration: calc(1s / 2); + animation-duration: calc(1s / 2); + -webkit-animation-duration: calc(var(--animate-duration) / 2); + animation-duration: calc(var(--animate-duration) / 2); +} +.animate__animated.animate__fast { + -webkit-animation-duration: calc(1s * 0.8); + animation-duration: calc(1s * 0.8); + -webkit-animation-duration: calc(var(--animate-duration) * 0.8); + animation-duration: calc(var(--animate-duration) * 0.8); +} +.animate__animated.animate__slow { + -webkit-animation-duration: calc(1s * 2); + animation-duration: calc(1s * 2); + -webkit-animation-duration: calc(var(--animate-duration) * 2); + animation-duration: calc(var(--animate-duration) * 2); +} +.animate__animated.animate__slower { + -webkit-animation-duration: calc(1s * 3); + animation-duration: calc(1s * 3); + -webkit-animation-duration: calc(var(--animate-duration) * 3); + animation-duration: calc(var(--animate-duration) * 3); +} +@media print, (prefers-reduced-motion: reduce) { + .animate__animated { + -webkit-animation-duration: 1ms !important; + animation-duration: 1ms !important; + -webkit-transition-duration: 1ms !important; + transition-duration: 1ms !important; + -webkit-animation-iteration-count: 1 !important; + animation-iteration-count: 1 !important; + } + + .animate__animated[class*='Out'] { + opacity: 0; + } +} +/* Attention seekers */ +@-webkit-keyframes bounce { + from, + 20%, + 53%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 40%, + 43% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + -webkit-transform: translate3d(0, -30px, 0) scaleY(1.1); + transform: translate3d(0, -30px, 0) scaleY(1.1); + } + + 70% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + -webkit-transform: translate3d(0, -15px, 0) scaleY(1.05); + transform: translate3d(0, -15px, 0) scaleY(1.05); + } + + 80% { + -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + -webkit-transform: translate3d(0, 0, 0) scaleY(0.95); + transform: translate3d(0, 0, 0) scaleY(0.95); + } + + 90% { + -webkit-transform: translate3d(0, -4px, 0) scaleY(1.02); + transform: translate3d(0, -4px, 0) scaleY(1.02); + } +} +@keyframes bounce { + from, + 20%, + 53%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 40%, + 43% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + -webkit-transform: translate3d(0, -30px, 0) scaleY(1.1); + transform: translate3d(0, -30px, 0) scaleY(1.1); + } + + 70% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + -webkit-transform: translate3d(0, -15px, 0) scaleY(1.05); + transform: translate3d(0, -15px, 0) scaleY(1.05); + } + + 80% { + -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + -webkit-transform: translate3d(0, 0, 0) scaleY(0.95); + transform: translate3d(0, 0, 0) scaleY(0.95); + } + + 90% { + -webkit-transform: translate3d(0, -4px, 0) scaleY(1.02); + transform: translate3d(0, -4px, 0) scaleY(1.02); + } +} +.animate__bounce { + -webkit-animation-name: bounce; + animation-name: bounce; + -webkit-transform-origin: center bottom; + transform-origin: center bottom; +} +@-webkit-keyframes flash { + from, + 50%, + to { + opacity: 1; + } + + 25%, + 75% { + opacity: 0; + } +} +@keyframes flash { + from, + 50%, + to { + opacity: 1; + } + + 25%, + 75% { + opacity: 0; + } +} +.animate__flash { + -webkit-animation-name: flash; + animation-name: flash; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ +@-webkit-keyframes pulse { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} +@keyframes pulse { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} +.animate__pulse { + -webkit-animation-name: pulse; + animation-name: pulse; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; +} +@-webkit-keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(0.95, 1.05, 1); + transform: scale3d(0.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, 0.95, 1); + transform: scale3d(1.05, 0.95, 1); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} +@keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(0.95, 1.05, 1); + transform: scale3d(0.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, 0.95, 1); + transform: scale3d(1.05, 0.95, 1); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} +.animate__rubberBand { + -webkit-animation-name: rubberBand; + animation-name: rubberBand; +} +@-webkit-keyframes shakeX { + from, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} +@keyframes shakeX { + from, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} +.animate__shakeX { + -webkit-animation-name: shakeX; + animation-name: shakeX; +} +@-webkit-keyframes shakeY { + from, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } +} +@keyframes shakeY { + from, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } +} +.animate__shakeY { + -webkit-animation-name: shakeY; + animation-name: shakeY; +} +@-webkit-keyframes headShake { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 6.5% { + -webkit-transform: translateX(-6px) rotateY(-9deg); + transform: translateX(-6px) rotateY(-9deg); + } + + 18.5% { + -webkit-transform: translateX(5px) rotateY(7deg); + transform: translateX(5px) rotateY(7deg); + } + + 31.5% { + -webkit-transform: translateX(-3px) rotateY(-5deg); + transform: translateX(-3px) rotateY(-5deg); + } + + 43.5% { + -webkit-transform: translateX(2px) rotateY(3deg); + transform: translateX(2px) rotateY(3deg); + } + + 50% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes headShake { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 6.5% { + -webkit-transform: translateX(-6px) rotateY(-9deg); + transform: translateX(-6px) rotateY(-9deg); + } + + 18.5% { + -webkit-transform: translateX(5px) rotateY(7deg); + transform: translateX(5px) rotateY(7deg); + } + + 31.5% { + -webkit-transform: translateX(-3px) rotateY(-5deg); + transform: translateX(-3px) rotateY(-5deg); + } + + 43.5% { + -webkit-transform: translateX(2px) rotateY(3deg); + transform: translateX(2px) rotateY(3deg); + } + + 50% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +.animate__headShake { + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + -webkit-animation-name: headShake; + animation-name: headShake; +} +@-webkit-keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} +@keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} +.animate__swing { + -webkit-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + animation-name: swing; +} +@-webkit-keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, + 20% { + -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + } + + 30%, + 50%, + 70%, + 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, + 60%, + 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} +@keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, + 20% { + -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + } + + 30%, + 50%, + 70%, + 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, + 60%, + 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} +.animate__tada { + -webkit-animation-name: tada; + animation-name: tada; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ +@-webkit-keyframes wobble { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes wobble { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__wobble { + -webkit-animation-name: wobble; + animation-name: wobble; +} +@-webkit-keyframes jello { + from, + 11.1%, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} +@keyframes jello { + from, + 11.1%, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} +.animate__jello { + -webkit-animation-name: jello; + animation-name: jello; + -webkit-transform-origin: center; + transform-origin: center; +} +@-webkit-keyframes heartBeat { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 14% { + -webkit-transform: scale(1.3); + transform: scale(1.3); + } + + 28% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 42% { + -webkit-transform: scale(1.3); + transform: scale(1.3); + } + + 70% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes heartBeat { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 14% { + -webkit-transform: scale(1.3); + transform: scale(1.3); + } + + 28% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 42% { + -webkit-transform: scale(1.3); + transform: scale(1.3); + } + + 70% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +.animate__heartBeat { + -webkit-animation-name: heartBeat; + animation-name: heartBeat; + -webkit-animation-duration: calc(1s * 1.3); + animation-duration: calc(1s * 1.3); + -webkit-animation-duration: calc(var(--animate-duration) * 1.3); + animation-duration: calc(var(--animate-duration) * 1.3); + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; +} +/* Back entrances */ +@-webkit-keyframes backInDown { + 0% { + -webkit-transform: translateY(-1200px) scale(0.7); + transform: translateY(-1200px) scale(0.7); + opacity: 0.7; + } + + 80% { + -webkit-transform: translateY(0px) scale(0.7); + transform: translateY(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } +} +@keyframes backInDown { + 0% { + -webkit-transform: translateY(-1200px) scale(0.7); + transform: translateY(-1200px) scale(0.7); + opacity: 0.7; + } + + 80% { + -webkit-transform: translateY(0px) scale(0.7); + transform: translateY(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } +} +.animate__backInDown { + -webkit-animation-name: backInDown; + animation-name: backInDown; +} +@-webkit-keyframes backInLeft { + 0% { + -webkit-transform: translateX(-2000px) scale(0.7); + transform: translateX(-2000px) scale(0.7); + opacity: 0.7; + } + + 80% { + -webkit-transform: translateX(0px) scale(0.7); + transform: translateX(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } +} +@keyframes backInLeft { + 0% { + -webkit-transform: translateX(-2000px) scale(0.7); + transform: translateX(-2000px) scale(0.7); + opacity: 0.7; + } + + 80% { + -webkit-transform: translateX(0px) scale(0.7); + transform: translateX(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } +} +.animate__backInLeft { + -webkit-animation-name: backInLeft; + animation-name: backInLeft; +} +@-webkit-keyframes backInRight { + 0% { + -webkit-transform: translateX(2000px) scale(0.7); + transform: translateX(2000px) scale(0.7); + opacity: 0.7; + } + + 80% { + -webkit-transform: translateX(0px) scale(0.7); + transform: translateX(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } +} +@keyframes backInRight { + 0% { + -webkit-transform: translateX(2000px) scale(0.7); + transform: translateX(2000px) scale(0.7); + opacity: 0.7; + } + + 80% { + -webkit-transform: translateX(0px) scale(0.7); + transform: translateX(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } +} +.animate__backInRight { + -webkit-animation-name: backInRight; + animation-name: backInRight; +} +@-webkit-keyframes backInUp { + 0% { + -webkit-transform: translateY(1200px) scale(0.7); + transform: translateY(1200px) scale(0.7); + opacity: 0.7; + } + + 80% { + -webkit-transform: translateY(0px) scale(0.7); + transform: translateY(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } +} +@keyframes backInUp { + 0% { + -webkit-transform: translateY(1200px) scale(0.7); + transform: translateY(1200px) scale(0.7); + opacity: 0.7; + } + + 80% { + -webkit-transform: translateY(0px) scale(0.7); + transform: translateY(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } +} +.animate__backInUp { + -webkit-animation-name: backInUp; + animation-name: backInUp; +} +/* Back exits */ +@-webkit-keyframes backOutDown { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } + + 20% { + -webkit-transform: translateY(0px) scale(0.7); + transform: translateY(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: translateY(700px) scale(0.7); + transform: translateY(700px) scale(0.7); + opacity: 0.7; + } +} +@keyframes backOutDown { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } + + 20% { + -webkit-transform: translateY(0px) scale(0.7); + transform: translateY(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: translateY(700px) scale(0.7); + transform: translateY(700px) scale(0.7); + opacity: 0.7; + } +} +.animate__backOutDown { + -webkit-animation-name: backOutDown; + animation-name: backOutDown; +} +@-webkit-keyframes backOutLeft { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } + + 20% { + -webkit-transform: translateX(0px) scale(0.7); + transform: translateX(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: translateX(-2000px) scale(0.7); + transform: translateX(-2000px) scale(0.7); + opacity: 0.7; + } +} +@keyframes backOutLeft { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } + + 20% { + -webkit-transform: translateX(0px) scale(0.7); + transform: translateX(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: translateX(-2000px) scale(0.7); + transform: translateX(-2000px) scale(0.7); + opacity: 0.7; + } +} +.animate__backOutLeft { + -webkit-animation-name: backOutLeft; + animation-name: backOutLeft; +} +@-webkit-keyframes backOutRight { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } + + 20% { + -webkit-transform: translateX(0px) scale(0.7); + transform: translateX(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: translateX(2000px) scale(0.7); + transform: translateX(2000px) scale(0.7); + opacity: 0.7; + } +} +@keyframes backOutRight { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } + + 20% { + -webkit-transform: translateX(0px) scale(0.7); + transform: translateX(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: translateX(2000px) scale(0.7); + transform: translateX(2000px) scale(0.7); + opacity: 0.7; + } +} +.animate__backOutRight { + -webkit-animation-name: backOutRight; + animation-name: backOutRight; +} +@-webkit-keyframes backOutUp { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } + + 20% { + -webkit-transform: translateY(0px) scale(0.7); + transform: translateY(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: translateY(-700px) scale(0.7); + transform: translateY(-700px) scale(0.7); + opacity: 0.7; + } +} +@keyframes backOutUp { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + } + + 20% { + -webkit-transform: translateY(0px) scale(0.7); + transform: translateY(0px) scale(0.7); + opacity: 0.7; + } + + 100% { + -webkit-transform: translateY(-700px) scale(0.7); + transform: translateY(-700px) scale(0.7); + opacity: 0.7; + } +} +.animate__backOutUp { + -webkit-animation-name: backOutUp; + animation-name: backOutUp; +} +/* Bouncing entrances */ +@-webkit-keyframes bounceIn { + from, + 20%, + 40%, + 60%, + 80%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(0.9, 0.9, 0.9); + transform: scale3d(0.9, 0.9, 0.9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(0.97, 0.97, 0.97); + transform: scale3d(0.97, 0.97, 0.97); + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} +@keyframes bounceIn { + from, + 20%, + 40%, + 60%, + 80%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(0.9, 0.9, 0.9); + transform: scale3d(0.9, 0.9, 0.9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(0.97, 0.97, 0.97); + transform: scale3d(0.97, 0.97, 0.97); + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} +.animate__bounceIn { + -webkit-animation-duration: calc(1s * 0.75); + animation-duration: calc(1s * 0.75); + -webkit-animation-duration: calc(var(--animate-duration) * 0.75); + animation-duration: calc(var(--animate-duration) * 0.75); + -webkit-animation-name: bounceIn; + animation-name: bounceIn; +} +@-webkit-keyframes bounceInDown { + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0) scaleY(3); + transform: translate3d(0, -3000px, 0) scaleY(3); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0) scaleY(0.9); + transform: translate3d(0, 25px, 0) scaleY(0.9); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0) scaleY(0.95); + transform: translate3d(0, -10px, 0) scaleY(0.95); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0) scaleY(0.985); + transform: translate3d(0, 5px, 0) scaleY(0.985); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes bounceInDown { + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0) scaleY(3); + transform: translate3d(0, -3000px, 0) scaleY(3); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0) scaleY(0.9); + transform: translate3d(0, 25px, 0) scaleY(0.9); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0) scaleY(0.95); + transform: translate3d(0, -10px, 0) scaleY(0.95); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0) scaleY(0.985); + transform: translate3d(0, 5px, 0) scaleY(0.985); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__bounceInDown { + -webkit-animation-name: bounceInDown; + animation-name: bounceInDown; +} +@-webkit-keyframes bounceInLeft { + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0) scaleX(3); + transform: translate3d(-3000px, 0, 0) scaleX(3); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0) scaleX(1); + transform: translate3d(25px, 0, 0) scaleX(1); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0) scaleX(0.98); + transform: translate3d(-10px, 0, 0) scaleX(0.98); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0) scaleX(0.995); + transform: translate3d(5px, 0, 0) scaleX(0.995); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes bounceInLeft { + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0) scaleX(3); + transform: translate3d(-3000px, 0, 0) scaleX(3); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0) scaleX(1); + transform: translate3d(25px, 0, 0) scaleX(1); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0) scaleX(0.98); + transform: translate3d(-10px, 0, 0) scaleX(0.98); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0) scaleX(0.995); + transform: translate3d(5px, 0, 0) scaleX(0.995); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__bounceInLeft { + -webkit-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} +@-webkit-keyframes bounceInRight { + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0) scaleX(3); + transform: translate3d(3000px, 0, 0) scaleX(3); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0) scaleX(1); + transform: translate3d(-25px, 0, 0) scaleX(1); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0) scaleX(0.98); + transform: translate3d(10px, 0, 0) scaleX(0.98); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0) scaleX(0.995); + transform: translate3d(-5px, 0, 0) scaleX(0.995); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes bounceInRight { + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0) scaleX(3); + transform: translate3d(3000px, 0, 0) scaleX(3); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0) scaleX(1); + transform: translate3d(-25px, 0, 0) scaleX(1); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0) scaleX(0.98); + transform: translate3d(10px, 0, 0) scaleX(0.98); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0) scaleX(0.995); + transform: translate3d(-5px, 0, 0) scaleX(0.995); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__bounceInRight { + -webkit-animation-name: bounceInRight; + animation-name: bounceInRight; +} +@-webkit-keyframes bounceInUp { + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0) scaleY(5); + transform: translate3d(0, 3000px, 0) scaleY(5); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0) scaleY(0.9); + transform: translate3d(0, -20px, 0) scaleY(0.9); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0) scaleY(0.95); + transform: translate3d(0, 10px, 0) scaleY(0.95); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0) scaleY(0.985); + transform: translate3d(0, -5px, 0) scaleY(0.985); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes bounceInUp { + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0) scaleY(5); + transform: translate3d(0, 3000px, 0) scaleY(5); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0) scaleY(0.9); + transform: translate3d(0, -20px, 0) scaleY(0.9); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0) scaleY(0.95); + transform: translate3d(0, 10px, 0) scaleY(0.95); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0) scaleY(0.985); + transform: translate3d(0, -5px, 0) scaleY(0.985); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__bounceInUp { + -webkit-animation-name: bounceInUp; + animation-name: bounceInUp; +} +/* Bouncing exits */ +@-webkit-keyframes bounceOut { + 20% { + -webkit-transform: scale3d(0.9, 0.9, 0.9); + transform: scale3d(0.9, 0.9, 0.9); + } + + 50%, + 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } +} +@keyframes bounceOut { + 20% { + -webkit-transform: scale3d(0.9, 0.9, 0.9); + transform: scale3d(0.9, 0.9, 0.9); + } + + 50%, + 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } +} +.animate__bounceOut { + -webkit-animation-duration: calc(1s * 0.75); + animation-duration: calc(1s * 0.75); + -webkit-animation-duration: calc(var(--animate-duration) * 0.75); + animation-duration: calc(var(--animate-duration) * 0.75); + -webkit-animation-name: bounceOut; + animation-name: bounceOut; +} +@-webkit-keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0) scaleY(0.985); + transform: translate3d(0, 10px, 0) scaleY(0.985); + } + + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0) scaleY(0.9); + transform: translate3d(0, -20px, 0) scaleY(0.9); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0) scaleY(3); + transform: translate3d(0, 2000px, 0) scaleY(3); + } +} +@keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0) scaleY(0.985); + transform: translate3d(0, 10px, 0) scaleY(0.985); + } + + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0) scaleY(0.9); + transform: translate3d(0, -20px, 0) scaleY(0.9); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0) scaleY(3); + transform: translate3d(0, 2000px, 0) scaleY(3); + } +} +.animate__bounceOutDown { + -webkit-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} +@-webkit-keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0) scaleX(0.9); + transform: translate3d(20px, 0, 0) scaleX(0.9); + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0) scaleX(2); + transform: translate3d(-2000px, 0, 0) scaleX(2); + } +} +@keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0) scaleX(0.9); + transform: translate3d(20px, 0, 0) scaleX(0.9); + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0) scaleX(2); + transform: translate3d(-2000px, 0, 0) scaleX(2); + } +} +.animate__bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} +@-webkit-keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0) scaleX(0.9); + transform: translate3d(-20px, 0, 0) scaleX(0.9); + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0) scaleX(2); + transform: translate3d(2000px, 0, 0) scaleX(2); + } +} +@keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0) scaleX(0.9); + transform: translate3d(-20px, 0, 0) scaleX(0.9); + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0) scaleX(2); + transform: translate3d(2000px, 0, 0) scaleX(2); + } +} +.animate__bounceOutRight { + -webkit-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} +@-webkit-keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0) scaleY(0.985); + transform: translate3d(0, -10px, 0) scaleY(0.985); + } + + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0) scaleY(0.9); + transform: translate3d(0, 20px, 0) scaleY(0.9); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0) scaleY(3); + transform: translate3d(0, -2000px, 0) scaleY(3); + } +} +@keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0) scaleY(0.985); + transform: translate3d(0, -10px, 0) scaleY(0.985); + } + + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0) scaleY(0.9); + transform: translate3d(0, 20px, 0) scaleY(0.9); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0) scaleY(3); + transform: translate3d(0, -2000px, 0) scaleY(3); + } +} +.animate__bounceOutUp { + -webkit-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} +/* Fading entrances */ +@-webkit-keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} +.animate__fadeIn { + -webkit-animation-name: fadeIn; + animation-name: fadeIn; +} +@-webkit-keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translateY(0, 300px, 0); + transform: translateY(0, 300px, 0); + } + + to { + opacity: 1; + -webkit-transform: translateY(0, 0, 0); + transform: translateY(0, 0, 0); + } +} +@keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translateY(0, 300px, 0); + transform: translateY(0, 300px, 0); + } + + to { + opacity: 1; + -webkit-transform: translateY(0, 0, 0); + transform: translateY(0, 0, 0); + } +} +.animate__fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown; +} +@-webkit-keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} +@-webkit-keyframes fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInLeft { + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} +@-webkit-keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} +@-webkit-keyframes fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInRight { + -webkit-animation-name: fadeInRight; + animation-name: fadeInRight; +} +@-webkit-keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} +@-webkit-keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translateY(150px); + transform: translateY(150px); + } + + to { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translateY(150px); + transform: translateY(150px); + } + + to { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } +} +.animate__fadeInUp { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp; +} +@-webkit-keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} +@-webkit-keyframes fadeInTopLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, -100%, 0); + transform: translate3d(-100%, -100%, 0); + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInTopLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, -100%, 0); + transform: translate3d(-100%, -100%, 0); + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInTopLeft { + -webkit-animation-name: fadeInTopLeft; + animation-name: fadeInTopLeft; +} +@-webkit-keyframes fadeInTopRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, -100%, 0); + transform: translate3d(100%, -100%, 0); + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInTopRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, -100%, 0); + transform: translate3d(100%, -100%, 0); + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInTopRight { + -webkit-animation-name: fadeInTopRight; + animation-name: fadeInTopRight; +} +@-webkit-keyframes fadeInBottomLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 100%, 0); + transform: translate3d(-100%, 100%, 0); + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInBottomLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 100%, 0); + transform: translate3d(-100%, 100%, 0); + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInBottomLeft { + -webkit-animation-name: fadeInBottomLeft; + animation-name: fadeInBottomLeft; +} +@-webkit-keyframes fadeInBottomRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 100%, 0); + transform: translate3d(100%, 100%, 0); + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes fadeInBottomRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 100%, 0); + transform: translate3d(100%, 100%, 0); + } + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__fadeInBottomRight { + -webkit-animation-name: fadeInBottomRight; + animation-name: fadeInBottomRight; +} +/* Fading exits */ +@-webkit-keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} +@keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} +.animate__fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} +@-webkit-keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} +@keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} +.animate__fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} +@-webkit-keyframes fadeOutDownBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} +@keyframes fadeOutDownBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} +.animate__fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} +@-webkit-keyframes fadeOutLeft { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} +@keyframes fadeOutLeft { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} +.animate__fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} +@-webkit-keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} +@keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} +.animate__fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} +@-webkit-keyframes fadeOutRight { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} +@keyframes fadeOutRight { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} +.animate__fadeOutRight { + -webkit-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} +@-webkit-keyframes fadeOutRightBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} +@keyframes fadeOutRightBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} +.animate__fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} +@-webkit-keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} +@keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} +.animate__fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} +@-webkit-keyframes fadeOutUpBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} +@keyframes fadeOutUpBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} +.animate__fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} +@-webkit-keyframes fadeOutTopLeft { + from { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + to { + opacity: 0; + -webkit-transform: translate3d(-100%, -100%, 0); + transform: translate3d(-100%, -100%, 0); + } +} +@keyframes fadeOutTopLeft { + from { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + to { + opacity: 0; + -webkit-transform: translate3d(-100%, -100%, 0); + transform: translate3d(-100%, -100%, 0); + } +} +.animate__fadeOutTopLeft { + -webkit-animation-name: fadeOutTopLeft; + animation-name: fadeOutTopLeft; +} +@-webkit-keyframes fadeOutTopRight { + from { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + to { + opacity: 0; + -webkit-transform: translate3d(100%, -100%, 0); + transform: translate3d(100%, -100%, 0); + } +} +@keyframes fadeOutTopRight { + from { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + to { + opacity: 0; + -webkit-transform: translate3d(100%, -100%, 0); + transform: translate3d(100%, -100%, 0); + } +} +.animate__fadeOutTopRight { + -webkit-animation-name: fadeOutTopRight; + animation-name: fadeOutTopRight; +} +@-webkit-keyframes fadeOutBottomRight { + from { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + to { + opacity: 0; + -webkit-transform: translate3d(100%, 100%, 0); + transform: translate3d(100%, 100%, 0); + } +} +@keyframes fadeOutBottomRight { + from { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + to { + opacity: 0; + -webkit-transform: translate3d(100%, 100%, 0); + transform: translate3d(100%, 100%, 0); + } +} +.animate__fadeOutBottomRight { + -webkit-animation-name: fadeOutBottomRight; + animation-name: fadeOutBottomRight; +} +@-webkit-keyframes fadeOutBottomLeft { + from { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 100%, 0); + transform: translate3d(-100%, 100%, 0); + } +} +@keyframes fadeOutBottomLeft { + from { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 100%, 0); + transform: translate3d(-100%, 100%, 0); + } +} +.animate__fadeOutBottomLeft { + -webkit-animation-name: fadeOutBottomLeft; + animation-name: fadeOutBottomLeft; +} +/* Flippers */ +@-webkit-keyframes flip { + from { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) + rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) + rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) + rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) + rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) + rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) + rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + to { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} +@keyframes flip { + from { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) + rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) + rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) + rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) + rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) + rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) + rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + to { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} +.animate__animated.animate__flip { + -webkit-backface-visibility: visible; + backface-visibility: visible; + -webkit-animation-name: flip; + animation-name: flip; +} +@-webkit-keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} +@keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} +.animate__flipInX { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInX; + animation-name: flipInX; +} +@-webkit-keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} +@keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} +.animate__flipInY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInY; + animation-name: flipInY; +} +@-webkit-keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} +@keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} +.animate__flipOutX { + -webkit-animation-duration: calc(1s * 0.75); + animation-duration: calc(1s * 0.75); + -webkit-animation-duration: calc(var(--animate-duration) * 0.75); + animation-duration: calc(var(--animate-duration) * 0.75); + -webkit-animation-name: flipOutX; + animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; +} +@-webkit-keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} +@keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} +.animate__flipOutY { + -webkit-animation-duration: calc(1s * 0.75); + animation-duration: calc(1s * 0.75); + -webkit-animation-duration: calc(var(--animate-duration) * 0.75); + animation-duration: calc(var(--animate-duration) * 0.75); + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + animation-name: flipOutY; +} +/* Lightspeed */ +@-webkit-keyframes lightSpeedInRight { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes lightSpeedInRight { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__lightSpeedInRight { + -webkit-animation-name: lightSpeedInRight; + animation-name: lightSpeedInRight; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} +@-webkit-keyframes lightSpeedInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0) skewX(30deg); + transform: translate3d(-100%, 0, 0) skewX(30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(-20deg); + transform: skewX(-20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(5deg); + transform: skewX(5deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes lightSpeedInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0) skewX(30deg); + transform: translate3d(-100%, 0, 0) skewX(30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(-20deg); + transform: skewX(-20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(5deg); + transform: skewX(5deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__lightSpeedInLeft { + -webkit-animation-name: lightSpeedInLeft; + animation-name: lightSpeedInLeft; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} +@-webkit-keyframes lightSpeedOutRight { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} +@keyframes lightSpeedOutRight { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} +.animate__lightSpeedOutRight { + -webkit-animation-name: lightSpeedOutRight; + animation-name: lightSpeedOutRight; + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} +@-webkit-keyframes lightSpeedOutLeft { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(-100%, 0, 0) skewX(-30deg); + transform: translate3d(-100%, 0, 0) skewX(-30deg); + opacity: 0; + } +} +@keyframes lightSpeedOutLeft { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(-100%, 0, 0) skewX(-30deg); + transform: translate3d(-100%, 0, 0) skewX(-30deg); + opacity: 0; + } +} +.animate__lightSpeedOutLeft { + -webkit-animation-name: lightSpeedOutLeft; + animation-name: lightSpeedOutLeft; + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} +/* Rotating entrances */ +@-webkit-keyframes rotateIn { + from { + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +@keyframes rotateIn { + from { + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +.animate__rotateIn { + -webkit-animation-name: rotateIn; + animation-name: rotateIn; + -webkit-transform-origin: center; + transform-origin: center; +} +@-webkit-keyframes rotateInDownLeft { + from { + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +@keyframes rotateInDownLeft { + from { + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +.animate__rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; + -webkit-transform-origin: left bottom; + transform-origin: left bottom; +} +@-webkit-keyframes rotateInDownRight { + from { + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +@keyframes rotateInDownRight { + from { + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +.animate__rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; + -webkit-transform-origin: right bottom; + transform-origin: right bottom; +} +@-webkit-keyframes rotateInUpLeft { + from { + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +@keyframes rotateInUpLeft { + from { + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +.animate__rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; + -webkit-transform-origin: left bottom; + transform-origin: left bottom; +} +@-webkit-keyframes rotateInUpRight { + from { + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +@keyframes rotateInUpRight { + from { + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} +.animate__rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; + -webkit-transform-origin: right bottom; + transform-origin: right bottom; +} +/* Rotating exits */ +@-webkit-keyframes rotateOut { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} +@keyframes rotateOut { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} +.animate__rotateOut { + -webkit-animation-name: rotateOut; + animation-name: rotateOut; + -webkit-transform-origin: center; + transform-origin: center; +} +@-webkit-keyframes rotateOutDownLeft { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} +@keyframes rotateOutDownLeft { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} +.animate__rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; + -webkit-transform-origin: left bottom; + transform-origin: left bottom; +} +@-webkit-keyframes rotateOutDownRight { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} +@keyframes rotateOutDownRight { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} +.animate__rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; + -webkit-transform-origin: right bottom; + transform-origin: right bottom; +} +@-webkit-keyframes rotateOutUpLeft { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} +@keyframes rotateOutUpLeft { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} +.animate__rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; + -webkit-transform-origin: left bottom; + transform-origin: left bottom; +} +@-webkit-keyframes rotateOutUpRight { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} +@keyframes rotateOutUpRight { + from { + opacity: 1; + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} +.animate__rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; + -webkit-transform-origin: right bottom; + transform-origin: right bottom; +} +/* Specials */ +@-webkit-keyframes hinge { + 0% { + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, + 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, + 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} +@keyframes hinge { + 0% { + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, + 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, + 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} +.animate__hinge { + -webkit-animation-duration: calc(1s * 2); + animation-duration: calc(1s * 2); + -webkit-animation-duration: calc(var(--animate-duration) * 2); + animation-duration: calc(var(--animate-duration) * 2); + -webkit-animation-name: hinge; + animation-name: hinge; + -webkit-transform-origin: top left; + transform-origin: top left; +} +@-webkit-keyframes jackInTheBox { + from { + opacity: 0; + -webkit-transform: scale(0.1) rotate(30deg); + transform: scale(0.1) rotate(30deg); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + } + + 50% { + -webkit-transform: rotate(-10deg); + transform: rotate(-10deg); + } + + 70% { + -webkit-transform: rotate(3deg); + transform: rotate(3deg); + } + + to { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes jackInTheBox { + from { + opacity: 0; + -webkit-transform: scale(0.1) rotate(30deg); + transform: scale(0.1) rotate(30deg); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + } + + 50% { + -webkit-transform: rotate(-10deg); + transform: rotate(-10deg); + } + + 70% { + -webkit-transform: rotate(3deg); + transform: rotate(3deg); + } + + to { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } +} +.animate__jackInTheBox { + -webkit-animation-name: jackInTheBox; + animation-name: jackInTheBox; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ +@-webkit-keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__rollIn { + -webkit-animation-name: rollIn; + animation-name: rollIn; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ +@-webkit-keyframes rollOut { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} +@keyframes rollOut { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} +.animate__rollOut { + -webkit-animation-name: rollOut; + animation-name: rollOut; +} +/* Zooming entrances */ +@-webkit-keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + 50% { + opacity: 1; + } +} +@keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + 50% { + opacity: 1; + } +} +.animate__zoomIn { + -webkit-animation-name: zoomIn; + animation-name: zoomIn; +} +@-webkit-keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +@keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +.animate__zoomInDown { + -webkit-animation-name: zoomInDown; + animation-name: zoomInDown; +} +@-webkit-keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +@keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +.animate__zoomInLeft { + -webkit-animation-name: zoomInLeft; + animation-name: zoomInLeft; +} +@-webkit-keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +@keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +.animate__zoomInRight { + -webkit-animation-name: zoomInRight; + animation-name: zoomInRight; +} +@-webkit-keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +@keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +.animate__zoomInUp { + -webkit-animation-name: zoomInUp; + animation-name: zoomInUp; +} +/* Zooming exits */ +@-webkit-keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + to { + opacity: 0; + } +} +@keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + to { + opacity: 0; + } +} +.animate__zoomOut { + -webkit-animation-name: zoomOut; + animation-name: zoomOut; +} +@-webkit-keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +@keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +.animate__zoomOutDown { + -webkit-animation-name: zoomOutDown; + animation-name: zoomOutDown; + -webkit-transform-origin: center bottom; + transform-origin: center bottom; +} +@-webkit-keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0); + transform: scale(0.1) translate3d(-2000px, 0, 0); + } +} +@keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0); + transform: scale(0.1) translate3d(-2000px, 0, 0); + } +} +.animate__zoomOutLeft { + -webkit-animation-name: zoomOutLeft; + animation-name: zoomOutLeft; + -webkit-transform-origin: left center; + transform-origin: left center; +} +@-webkit-keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(0.1) translate3d(2000px, 0, 0); + transform: scale(0.1) translate3d(2000px, 0, 0); + } +} +@keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(0.1) translate3d(2000px, 0, 0); + transform: scale(0.1) translate3d(2000px, 0, 0); + } +} +.animate__zoomOutRight { + -webkit-animation-name: zoomOutRight; + animation-name: zoomOutRight; + -webkit-transform-origin: right center; + transform-origin: right center; +} +@-webkit-keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +@keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} +.animate__zoomOutUp { + -webkit-animation-name: zoomOutUp; + animation-name: zoomOutUp; + -webkit-transform-origin: center bottom; + transform-origin: center bottom; +} +/* Sliding entrances */ +@-webkit-keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__slideInDown { + -webkit-animation-name: slideInDown; + animation-name: slideInDown; +} +@-webkit-keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__slideInLeft { + -webkit-animation-name: slideInLeft; + animation-name: slideInLeft; +} +@-webkit-keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__slideInRight { + -webkit-animation-name: slideInRight; + animation-name: slideInRight; +} +@-webkit-keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +@keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.animate__slideInUp { + -webkit-animation-name: slideInUp; + animation-name: slideInUp; +} +/* Sliding exits */ +@-webkit-keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} +@keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} +.animate__slideOutDown { + -webkit-animation-name: slideOutDown; + animation-name: slideOutDown; +} +@-webkit-keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} +@keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} +.animate__slideOutLeft { + -webkit-animation-name: slideOutLeft; + animation-name: slideOutLeft; +} +@-webkit-keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} +@keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} +.animate__slideOutRight { + -webkit-animation-name: slideOutRight; + animation-name: slideOutRight; +} +@-webkit-keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} +@keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} +.animate__slideOutUp { + -webkit-animation-name: slideOutUp; + animation-name: slideOutUp; +} diff --git a/assets/bootstrap/css/bootstrap-grid.min.css b/assets/bootstrap/css/bootstrap-grid.min.css new file mode 100644 index 0000000..f81480b --- /dev/null +++ b/assets/bootstrap/css/bootstrap-grid.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap Grid v5.0.1 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x)/ -2);margin-left:calc(var(--bs-gutter-x)/ -2)}.row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x)/ 2);padding-left:calc(var(--bs-gutter-x)/ 2);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.3333333333%}.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.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.3333333333%}.col-2{flex:0 0 auto;width:16.6666666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.3333333333%}.col-5{flex:0 0 auto;width:41.6666666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.3333333333%}.col-8{flex:0 0 auto;width:66.6666666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.3333333333%}.col-11{flex:0 0 auto;width:91.6666666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}.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.3333333333%}.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.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.3333333333%}.col-sm-2{flex:0 0 auto;width:16.6666666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.3333333333%}.col-sm-5{flex:0 0 auto;width:41.6666666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.3333333333%}.col-sm-8{flex:0 0 auto;width:66.6666666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.3333333333%}.col-sm-11{flex:0 0 auto;width:91.6666666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}.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.3333333333%}.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.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.3333333333%}.col-md-2{flex:0 0 auto;width:16.6666666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.3333333333%}.col-md-5{flex:0 0 auto;width:41.6666666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.3333333333%}.col-md-8{flex:0 0 auto;width:66.6666666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.3333333333%}.col-md-11{flex:0 0 auto;width:91.6666666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}.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.3333333333%}.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.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.3333333333%}.col-lg-2{flex:0 0 auto;width:16.6666666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.3333333333%}.col-lg-5{flex:0 0 auto;width:41.6666666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.3333333333%}.col-lg-8{flex:0 0 auto;width:66.6666666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.3333333333%}.col-lg-11{flex:0 0 auto;width:91.6666666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}.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.3333333333%}.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.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.3333333333%}.col-xl-2{flex:0 0 auto;width:16.6666666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.3333333333%}.col-xl-5{flex:0 0 auto;width:41.6666666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.3333333333%}.col-xl-8{flex:0 0 auto;width:66.6666666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.3333333333%}.col-xl-11{flex:0 0 auto;width:91.6666666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}.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.3333333333%}.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.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.3333333333%}.col-xxl-2{flex:0 0 auto;width:16.6666666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.3333333333%}.col-xxl-5{flex:0 0 auto;width:41.6666666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.3333333333%}.col-xxl-8{flex:0 0 auto;width:66.6666666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.3333333333%}.col-xxl-11{flex:0 0 auto;width:91.6666666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.3333333333%}.offset-xxl-2{margin-left:16.6666666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.3333333333%}.offset-xxl-5{margin-left:41.6666666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.3333333333%}.offset-xxl-8{margin-left:66.6666666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.3333333333%}.offset-xxl-11{margin-left:91.6666666667%}.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}}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}@media (min-width:576px){.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}}@media (min-width:768px){.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}}@media (min-width:992px){.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}}@media (min-width:1200px){.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}}@media (min-width:1400px){.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} \ No newline at end of file diff --git a/assets/bootstrap/css/bootstrap-reboot.min.css b/assets/bootstrap/css/bootstrap-reboot.min.css new file mode 100644 index 0000000..34e69f3 --- /dev/null +++ b/assets/bootstrap/css/bootstrap-reboot.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap Reboot v5.0.1 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) + */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .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[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{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:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}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:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,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]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button: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 + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-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-file-upload-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} \ No newline at end of file diff --git a/assets/bootstrap/css/bootstrap.min.css b/assets/bootstrap/css/bootstrap.min.css new file mode 100644 index 0000000..746ee96 --- /dev/null +++ b/assets/bootstrap/css/bootstrap.min.css @@ -0,0 +1,6 @@ +@charset "UTF-8";/*! + * Bootstrap v5.0.1 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */: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-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--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-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",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))}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{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,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}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:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,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]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button: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 + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-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-file-upload-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}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x)/ -2);margin-left:calc(var(--bs-gutter-x)/ -2)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x)/ 2);padding-left:calc(var(--bs-gutter-x)/ 2);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.3333333333%}.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.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.3333333333%}.col-2{flex:0 0 auto;width:16.6666666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.3333333333%}.col-5{flex:0 0 auto;width:41.6666666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.3333333333%}.col-8{flex:0 0 auto;width:66.6666666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.3333333333%}.col-11{flex:0 0 auto;width:91.6666666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}.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.3333333333%}.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.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.3333333333%}.col-sm-2{flex:0 0 auto;width:16.6666666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.3333333333%}.col-sm-5{flex:0 0 auto;width:41.6666666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.3333333333%}.col-sm-8{flex:0 0 auto;width:66.6666666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.3333333333%}.col-sm-11{flex:0 0 auto;width:91.6666666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}.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.3333333333%}.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.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.3333333333%}.col-md-2{flex:0 0 auto;width:16.6666666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.3333333333%}.col-md-5{flex:0 0 auto;width:41.6666666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.3333333333%}.col-md-8{flex:0 0 auto;width:66.6666666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.3333333333%}.col-md-11{flex:0 0 auto;width:91.6666666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}.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.3333333333%}.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.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.3333333333%}.col-lg-2{flex:0 0 auto;width:16.6666666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.3333333333%}.col-lg-5{flex:0 0 auto;width:41.6666666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.3333333333%}.col-lg-8{flex:0 0 auto;width:66.6666666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.3333333333%}.col-lg-11{flex:0 0 auto;width:91.6666666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}.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.3333333333%}.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.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.3333333333%}.col-xl-2{flex:0 0 auto;width:16.6666666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.3333333333%}.col-xl-5{flex:0 0 auto;width:41.6666666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.3333333333%}.col-xl-8{flex:0 0 auto;width:66.6666666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.3333333333%}.col-xl-11{flex:0 0 auto;width:91.6666666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}.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.3333333333%}.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.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.3333333333%}.col-xxl-2{flex:0 0 auto;width:16.6666666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.3333333333%}.col-xxl-5{flex:0 0 auto;width:41.6666666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.3333333333%}.col-xxl-8{flex:0 0 auto;width:66.6666666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.3333333333%}.col-xxl-11{flex:0 0 auto;width:91.6666666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.3333333333%}.offset-xxl-2{margin-left:16.6666666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.3333333333%}.offset-xxl-5{margin-left:41.6666666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.3333333333%}.offset-xxl-8{margin-left:66.6666666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.3333333333%}.offset-xxl-11{margin-left:91.6666666667%}.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}}.table{--bs-table-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{max-width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);padding:1rem .75rem}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.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}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast:not(.showing):not(.show){opacity:0}.toast.hide{display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1060;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;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;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;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;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid #d8d8d8;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1050;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{color:#0d6efd!important}.text-secondary{color:#6c757d!important}.text-success{color:#198754!important}.text-info{color:#0dcaf0!important}.text-warning{color:#ffc107!important}.text-danger{color:#dc3545!important}.text-light{color:#f8f9fa!important}.text-dark{color:#212529!important}.text-white{color:#fff!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-reset{color:inherit!important}.bg-primary{background-color:#0d6efd!important}.bg-secondary{background-color:#6c757d!important}.bg-success{background-color:#198754!important}.bg-info{background-color:#0dcaf0!important}.bg-warning{background-color:#ffc107!important}.bg-danger{background-color:#dc3545!important}.bg-light{background-color:#f8f9fa!important}.bg-dark{background-color:#212529!important}.bg-body{background-color:#fff!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} \ No newline at end of file diff --git a/assets/bootstrap/js/bootstrap.bundle.min.js b/assets/bootstrap/js/bootstrap.bundle.min.js new file mode 100644 index 0000000..1b5ec57 --- /dev/null +++ b/assets/bootstrap/js/bootstrap.bundle.min.js @@ -0,0 +1,6 @@ +/*! + * Bootstrap v5.0.1 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter(t=>t.matches(e)),parents(t,e){const i=[];let n=t.parentNode;for(;n&&n.nodeType===Node.ELEMENT_NODE&&3!==n.nodeType;)n.matches(e)&&i.push(n),n=n.parentNode;return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]}},e=t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t},i=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i="#"+i.split("#")[1]),e=i&&"#"!==i?i.trim():null}return e},n=t=>{const e=i(t);return e&&document.querySelector(e)?e:null},s=t=>{const e=i(t);return e?document.querySelector(e):null},o=t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0},r=t=>{t.dispatchEvent(new Event("transitionend"))},a=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),l=e=>a(e)?e.jquery?e[0]:e:"string"==typeof e&&e.length>0?t.findOne(e):null,c=(t,e)=>{let i=!1;const n=e+5;t.addEventListener("transitionend",(function e(){i=!0,t.removeEventListener("transitionend",e)})),setTimeout(()=>{i||r(t)},n)},d=(t,e,i)=>{Object.keys(i).forEach(n=>{const s=i[n],o=e[n],r=o&&a(o)?"element":null==(l=o)?""+l:{}.toString.call(l).match(/\s([a-z]+)/i)[1].toLowerCase();var l;if(!new RegExp(s).test(r))throw new TypeError(`${t.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)})},h=t=>{if(!t)return!1;if(t.style&&t.parentNode&&t.parentNode.style){const e=getComputedStyle(t),i=getComputedStyle(t.parentNode);return"none"!==e.display&&"none"!==i.display&&"hidden"!==e.visibility}return!1},u=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),f=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?f(t.parentNode):null},p=()=>{},m=t=>t.offsetHeight,g=()=>{const{jQuery:t}=window;return t&&!document.body.hasAttribute("data-bs-no-jquery")?t:null},_=()=>"rtl"===document.documentElement.dir,b=t=>{var e;e=()=>{const e=g();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?document.addEventListener("DOMContentLoaded",e):e()},v=t=>{"function"==typeof t&&t()},y=new Map;var w={set(t,e,i){y.has(t)||y.set(t,new Map);const n=y.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>y.has(t)&&y.get(t).get(e)||null,remove(t,e){if(!y.has(t))return;const i=y.get(t);i.delete(e),0===i.size&&y.delete(t)}};const E=/[^.]*(?=\..*)\.|.*/,T=/\..*/,A=/::\d+$/,L={};let O=1;const k={mouseenter:"mouseover",mouseleave:"mouseout"},C=/^(mouseenter|mouseleave)/i,x=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"]);function D(t,e){return e&&`${e}::${O++}`||t.uidEvent||O++}function N(t){const e=D(t);return t.uidEvent=e,L[e]=L[e]||{},L[e]}function S(t,e,i=null){const n=Object.keys(t);for(let s=0,o=n.length;sfunction(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};n?n=t(n):i=t(i)}const[o,r,a]=I(e,i,n),l=N(t),c=l[a]||(l[a]={}),d=S(c,r,o?i:null);if(d)return void(d.oneOff=d.oneOff&&s);const h=D(r,e.replace(E,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(let a=o.length;a--;)if(o[a]===r)return s.delegateTarget=r,n.oneOff&&H.off(t,s.type,e,i),i.apply(r,[s]);return null}}(t,i,n):function(t,e){return function i(n){return n.delegateTarget=t,i.oneOff&&H.off(t,n.type,e),e.apply(t,[n])}}(t,i);u.delegationSelector=o?i:null,u.originalHandler=r,u.oneOff=s,u.uidEvent=h,c[h]=u,t.addEventListener(a,u,o)}function P(t,e,i,n,s){const o=S(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function M(t){return t=t.replace(T,""),k[t]||t}const H={on(t,e,i,n){j(t,e,i,n,!1)},one(t,e,i,n){j(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=I(e,i,n),a=r!==e,l=N(t),c=e.startsWith(".");if(void 0!==o){if(!l||!l[r])return;return void P(t,l,r,o,s?i:null)}c&&Object.keys(l).forEach(i=>{!function(t,e,i,n){const s=e[i]||{};Object.keys(s).forEach(o=>{if(o.includes(n)){const n=s[o];P(t,e,i,n.originalHandler,n.delegationSelector)}})}(t,l,i,e.slice(1))});const d=l[r]||{};Object.keys(d).forEach(i=>{const n=i.replace(A,"");if(!a||e.includes(n)){const e=d[i];P(t,l,r,e.originalHandler,e.delegationSelector)}})},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=g(),s=M(e),o=e!==s,r=x.has(s);let a,l=!0,c=!0,d=!1,h=null;return o&&n&&(a=n.Event(e,i),n(t).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),d=a.isDefaultPrevented()),r?(h=document.createEvent("HTMLEvents"),h.initEvent(s,l,!0)):h=new CustomEvent(e,{bubbles:l,cancelable:!0}),void 0!==i&&Object.keys(i).forEach(t=>{Object.defineProperty(h,t,{get:()=>i[t]})}),d&&h.preventDefault(),c&&t.dispatchEvent(h),h.defaultPrevented&&void 0!==a&&a.preventDefault(),h}};class R{constructor(t){(t=l(t))&&(this._element=t,w.set(this._element,this.constructor.DATA_KEY,this))}dispose(){w.remove(this._element,this.constructor.DATA_KEY),H.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach(t=>{this[t]=null})}_queueCallback(t,e,i=!0){if(!i)return void v(t);const n=o(e);H.one(e,"transitionend",()=>v(t)),c(e,n)}static getInstance(t){return w.get(t,this.DATA_KEY)}static get VERSION(){return"5.0.1"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return"bs."+this.NAME}static get EVENT_KEY(){return"."+this.DATA_KEY}}class B extends R{static get NAME(){return"alert"}close(t){const e=t?this._getRootElement(t):this._element,i=this._triggerCloseEvent(e);null===i||i.defaultPrevented||this._removeElement(e)}_getRootElement(t){return s(t)||t.closest(".alert")}_triggerCloseEvent(t){return H.trigger(t,"close.bs.alert")}_removeElement(t){t.classList.remove("show");const e=t.classList.contains("fade");this._queueCallback(()=>this._destroyElement(t),t,e)}_destroyElement(t){t.parentNode&&t.parentNode.removeChild(t),H.trigger(t,"closed.bs.alert")}static jQueryInterface(t){return this.each((function(){let e=w.get(this,"bs.alert");e||(e=new B(this)),"close"===t&&e[t](this)}))}static handleDismiss(t){return function(e){e&&e.preventDefault(),t.close(this)}}}H.on(document,"click.bs.alert.data-api",'[data-bs-dismiss="alert"]',B.handleDismiss(new B)),b(B);class W extends R{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){let e=w.get(this,"bs.button");e||(e=new W(this)),"toggle"===t&&e[t]()}))}}function q(t){return"true"===t||"false"!==t&&(t===Number(t).toString()?Number(t):""===t||"null"===t?null:t)}function z(t){return t.replace(/[A-Z]/g,t=>"-"+t.toLowerCase())}H.on(document,"click.bs.button.data-api",'[data-bs-toggle="button"]',t=>{t.preventDefault();const e=t.target.closest('[data-bs-toggle="button"]');let i=w.get(e,"bs.button");i||(i=new W(e)),i.toggle()}),b(W);const U={setDataAttribute(t,e,i){t.setAttribute("data-bs-"+z(e),i)},removeDataAttribute(t,e){t.removeAttribute("data-bs-"+z(e))},getDataAttributes(t){if(!t)return{};const e={};return Object.keys(t.dataset).filter(t=>t.startsWith("bs")).forEach(i=>{let n=i.replace(/^bs/,"");n=n.charAt(0).toLowerCase()+n.slice(1,n.length),e[n]=q(t.dataset[i])}),e},getDataAttribute:(t,e)=>q(t.getAttribute("data-bs-"+z(e))),offset(t){const e=t.getBoundingClientRect();return{top:e.top+document.body.scrollTop,left:e.left+document.body.scrollLeft}},position:t=>({top:t.offsetTop,left:t.offsetLeft})},$={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},F={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},V="next",K="prev",X="left",Y="right";class Q extends R{constructor(e,i){super(e),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(i),this._indicatorsElement=t.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return $}static get NAME(){return"carousel"}next(){this._isSliding||this._slide(V)}nextWhenVisible(){!document.hidden&&h(this._element)&&this.next()}prev(){this._isSliding||this._slide(K)}pause(e){e||(this._isPaused=!0),t.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(r(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(e){this._activeElement=t.findOne(".active.carousel-item",this._element);const i=this._getItemIndex(this._activeElement);if(e>this._items.length-1||e<0)return;if(this._isSliding)return void H.one(this._element,"slid.bs.carousel",()=>this.to(e));if(i===e)return this.pause(),void this.cycle();const n=e>i?V:K;this._slide(n,this._items[e])}_getConfig(t){return t={...$,...t},d("carousel",t,F),t}_handleSwipe(){const t=Math.abs(this.touchDeltaX);if(t<=40)return;const e=t/this.touchDeltaX;this.touchDeltaX=0,e&&this._slide(e>0?Y:X)}_addEventListeners(){this._config.keyboard&&H.on(this._element,"keydown.bs.carousel",t=>this._keydown(t)),"hover"===this._config.pause&&(H.on(this._element,"mouseenter.bs.carousel",t=>this.pause(t)),H.on(this._element,"mouseleave.bs.carousel",t=>this.cycle(t))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const e=t=>{!this._pointerEvent||"pen"!==t.pointerType&&"touch"!==t.pointerType?this._pointerEvent||(this.touchStartX=t.touches[0].clientX):this.touchStartX=t.clientX},i=t=>{this.touchDeltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this.touchStartX},n=t=>{!this._pointerEvent||"pen"!==t.pointerType&&"touch"!==t.pointerType||(this.touchDeltaX=t.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(t=>this.cycle(t),500+this._config.interval))};t.find(".carousel-item img",this._element).forEach(t=>{H.on(t,"dragstart.bs.carousel",t=>t.preventDefault())}),this._pointerEvent?(H.on(this._element,"pointerdown.bs.carousel",t=>e(t)),H.on(this._element,"pointerup.bs.carousel",t=>n(t)),this._element.classList.add("pointer-event")):(H.on(this._element,"touchstart.bs.carousel",t=>e(t)),H.on(this._element,"touchmove.bs.carousel",t=>i(t)),H.on(this._element,"touchend.bs.carousel",t=>n(t)))}_keydown(t){/input|textarea/i.test(t.target.tagName)||("ArrowLeft"===t.key?(t.preventDefault(),this._slide(Y)):"ArrowRight"===t.key&&(t.preventDefault(),this._slide(X)))}_getItemIndex(e){return this._items=e&&e.parentNode?t.find(".carousel-item",e.parentNode):[],this._items.indexOf(e)}_getItemByOrder(t,e){const i=t===V,n=t===K,s=this._getItemIndex(e),o=this._items.length-1;if((n&&0===s||i&&s===o)&&!this._config.wrap)return e;const r=(s+(n?-1:1))%this._items.length;return-1===r?this._items[this._items.length-1]:this._items[r]}_triggerSlideEvent(e,i){const n=this._getItemIndex(e),s=this._getItemIndex(t.findOne(".active.carousel-item",this._element));return H.trigger(this._element,"slide.bs.carousel",{relatedTarget:e,direction:i,from:s,to:n})}_setActiveIndicatorElement(e){if(this._indicatorsElement){const i=t.findOne(".active",this._indicatorsElement);i.classList.remove("active"),i.removeAttribute("aria-current");const n=t.find("[data-bs-target]",this._indicatorsElement);for(let t=0;t{H.trigger(this._element,"slid.bs.carousel",{relatedTarget:r,direction:u,from:o,to:a})};if(this._element.classList.contains("slide")){r.classList.add(h),m(r),s.classList.add(d),r.classList.add(d);const t=()=>{r.classList.remove(d,h),r.classList.add("active"),s.classList.remove("active",h,d),this._isSliding=!1,setTimeout(f,0)};this._queueCallback(t,s,!0)}else s.classList.remove("active"),r.classList.add("active"),this._isSliding=!1,f();l&&this.cycle()}_directionToOrder(t){return[Y,X].includes(t)?_()?t===X?K:V:t===X?V:K:t}_orderToDirection(t){return[V,K].includes(t)?_()?t===K?X:Y:t===K?Y:X:t}static carouselInterface(t,e){let i=w.get(t,"bs.carousel"),n={...$,...U.getDataAttributes(t)};"object"==typeof e&&(n={...n,...e});const s="string"==typeof e?e:n.slide;if(i||(i=new Q(t,n)),"number"==typeof e)i.to(e);else if("string"==typeof s){if(void 0===i[s])throw new TypeError(`No method named "${s}"`);i[s]()}else n.interval&&n.ride&&(i.pause(),i.cycle())}static jQueryInterface(t){return this.each((function(){Q.carouselInterface(this,t)}))}static dataApiClickHandler(t){const e=s(this);if(!e||!e.classList.contains("carousel"))return;const i={...U.getDataAttributes(e),...U.getDataAttributes(this)},n=this.getAttribute("data-bs-slide-to");n&&(i.interval=!1),Q.carouselInterface(e,i),n&&w.get(e,"bs.carousel").to(n),t.preventDefault()}}H.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",Q.dataApiClickHandler),H.on(window,"load.bs.carousel.data-api",()=>{const e=t.find('[data-bs-ride="carousel"]');for(let t=0,i=e.length;tt===this._element);null!==o&&r.length&&(this._selector=o,this._triggerArray.push(i))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}static get Default(){return G}static get NAME(){return"collapse"}toggle(){this._element.classList.contains("show")?this.hide():this.show()}show(){if(this._isTransitioning||this._element.classList.contains("show"))return;let e,i;this._parent&&(e=t.find(".show, .collapsing",this._parent).filter(t=>"string"==typeof this._config.parent?t.getAttribute("data-bs-parent")===this._config.parent:t.classList.contains("collapse")),0===e.length&&(e=null));const n=t.findOne(this._selector);if(e){const t=e.find(t=>n!==t);if(i=t?w.get(t,"bs.collapse"):null,i&&i._isTransitioning)return}if(H.trigger(this._element,"show.bs.collapse").defaultPrevented)return;e&&e.forEach(t=>{n!==t&&J.collapseInterface(t,"hide"),i||w.set(t,"bs.collapse",null)});const s=this._getDimension();this._element.classList.remove("collapse"),this._element.classList.add("collapsing"),this._element.style[s]=0,this._triggerArray.length&&this._triggerArray.forEach(t=>{t.classList.remove("collapsed"),t.setAttribute("aria-expanded",!0)}),this.setTransitioning(!0);const o="scroll"+(s[0].toUpperCase()+s.slice(1));this._queueCallback(()=>{this._element.classList.remove("collapsing"),this._element.classList.add("collapse","show"),this._element.style[s]="",this.setTransitioning(!1),H.trigger(this._element,"shown.bs.collapse")},this._element,!0),this._element.style[s]=this._element[o]+"px"}hide(){if(this._isTransitioning||!this._element.classList.contains("show"))return;if(H.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=this._element.getBoundingClientRect()[t]+"px",m(this._element),this._element.classList.add("collapsing"),this._element.classList.remove("collapse","show");const e=this._triggerArray.length;if(e>0)for(let t=0;t{this.setTransitioning(!1),this._element.classList.remove("collapsing"),this._element.classList.add("collapse"),H.trigger(this._element,"hidden.bs.collapse")},this._element,!0)}setTransitioning(t){this._isTransitioning=t}_getConfig(t){return(t={...G,...t}).toggle=Boolean(t.toggle),d("collapse",t,Z),t}_getDimension(){return this._element.classList.contains("width")?"width":"height"}_getParent(){let{parent:e}=this._config;e=l(e);const i=`[data-bs-toggle="collapse"][data-bs-parent="${e}"]`;return t.find(i,e).forEach(t=>{const e=s(t);this._addAriaAndCollapsedClass(e,[t])}),e}_addAriaAndCollapsedClass(t,e){if(!t||!e.length)return;const i=t.classList.contains("show");e.forEach(t=>{i?t.classList.remove("collapsed"):t.classList.add("collapsed"),t.setAttribute("aria-expanded",i)})}static collapseInterface(t,e){let i=w.get(t,"bs.collapse");const n={...G,...U.getDataAttributes(t),..."object"==typeof e&&e?e:{}};if(!i&&n.toggle&&"string"==typeof e&&/show|hide/.test(e)&&(n.toggle=!1),i||(i=new J(t,n)),"string"==typeof e){if(void 0===i[e])throw new TypeError(`No method named "${e}"`);i[e]()}}static jQueryInterface(t){return this.each((function(){J.collapseInterface(this,t)}))}}H.on(document,"click.bs.collapse.data-api",'[data-bs-toggle="collapse"]',(function(e){("A"===e.target.tagName||e.delegateTarget&&"A"===e.delegateTarget.tagName)&&e.preventDefault();const i=U.getDataAttributes(this),s=n(this);t.find(s).forEach(t=>{const e=w.get(t,"bs.collapse");let n;e?(null===e._parent&&"string"==typeof i.parent&&(e._config.parent=i.parent,e._parent=e._getParent()),n="toggle"):n=i,J.collapseInterface(t,n)})})),b(J);var tt="top",et="bottom",it="right",nt="left",st=[tt,et,it,nt],ot=st.reduce((function(t,e){return t.concat([e+"-start",e+"-end"])}),[]),rt=[].concat(st,["auto"]).reduce((function(t,e){return t.concat([e,e+"-start",e+"-end"])}),[]),at=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function lt(t){return t?(t.nodeName||"").toLowerCase():null}function ct(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function dt(t){return t instanceof ct(t).Element||t instanceof Element}function ht(t){return t instanceof ct(t).HTMLElement||t instanceof HTMLElement}function ut(t){return"undefined"!=typeof ShadowRoot&&(t instanceof ct(t).ShadowRoot||t instanceof ShadowRoot)}var ft={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];ht(s)&<(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});ht(n)&<(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function pt(t){return t.split("-")[0]}function mt(t){var e=t.getBoundingClientRect();return{width:e.width,height:e.height,top:e.top,right:e.right,bottom:e.bottom,left:e.left,x:e.left,y:e.top}}function gt(t){var e=mt(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function _t(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ut(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function bt(t){return ct(t).getComputedStyle(t)}function vt(t){return["table","td","th"].indexOf(lt(t))>=0}function yt(t){return((dt(t)?t.ownerDocument:t.document)||window.document).documentElement}function wt(t){return"html"===lt(t)?t:t.assignedSlot||t.parentNode||(ut(t)?t.host:null)||yt(t)}function Et(t){return ht(t)&&"fixed"!==bt(t).position?t.offsetParent:null}function Tt(t){for(var e=ct(t),i=Et(t);i&&vt(i)&&"static"===bt(i).position;)i=Et(i);return i&&("html"===lt(i)||"body"===lt(i)&&"static"===bt(i).position)?e:i||function(t){var e=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&ht(t)&&"fixed"===bt(t).position)return null;for(var i=wt(t);ht(i)&&["html","body"].indexOf(lt(i))<0;){var n=bt(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function At(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}var Lt=Math.max,Ot=Math.min,kt=Math.round;function Ct(t,e,i){return Lt(t,Ot(e,i))}function xt(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Dt(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}var Nt={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=pt(i.placement),l=At(a),c=[nt,it].indexOf(a)>=0?"height":"width";if(o&&r){var d=function(t,e){return xt("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Dt(t,st))}(s.padding,i),h=gt(o),u="y"===l?tt:nt,f="y"===l?et:it,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=Tt(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=d[u],y=_-h[c]-d[f],w=_/2-h[c]/2+b,E=Ct(v,w,y),T=l;i.modifiersData[n]=((e={})[T]=E,e.centerOffset=E-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&_t(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},St={top:"auto",right:"auto",bottom:"auto",left:"auto"};function It(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.offsets,r=t.position,a=t.gpuAcceleration,l=t.adaptive,c=t.roundOffsets,d=!0===c?function(t){var e=t.x,i=t.y,n=window.devicePixelRatio||1;return{x:kt(kt(e*n)/n)||0,y:kt(kt(i*n)/n)||0}}(o):"function"==typeof c?c(o):o,h=d.x,u=void 0===h?0:h,f=d.y,p=void 0===f?0:f,m=o.hasOwnProperty("x"),g=o.hasOwnProperty("y"),_=nt,b=tt,v=window;if(l){var y=Tt(i),w="clientHeight",E="clientWidth";y===ct(i)&&"static"!==bt(y=yt(i)).position&&(w="scrollHeight",E="scrollWidth"),y=y,s===tt&&(b=et,p-=y[w]-n.height,p*=a?1:-1),s===nt&&(_=it,u-=y[E]-n.width,u*=a?1:-1)}var T,A=Object.assign({position:r},l&&St);return a?Object.assign({},A,((T={})[b]=g?"0":"",T[_]=m?"0":"",T.transform=(v.devicePixelRatio||1)<2?"translate("+u+"px, "+p+"px)":"translate3d("+u+"px, "+p+"px, 0)",T)):Object.assign({},A,((e={})[b]=g?p+"px":"",e[_]=m?u+"px":"",e.transform="",e))}var jt={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:pt(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,It(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,It(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}},Pt={passive:!0},Mt={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=ct(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,Pt)})),a&&l.addEventListener("resize",i.update,Pt),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,Pt)})),a&&l.removeEventListener("resize",i.update,Pt)}},data:{}},Ht={left:"right",right:"left",bottom:"top",top:"bottom"};function Rt(t){return t.replace(/left|right|bottom|top/g,(function(t){return Ht[t]}))}var Bt={start:"end",end:"start"};function Wt(t){return t.replace(/start|end/g,(function(t){return Bt[t]}))}function qt(t){var e=ct(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function zt(t){return mt(yt(t)).left+qt(t).scrollLeft}function Ut(t){var e=bt(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function $t(t,e){var i;void 0===e&&(e=[]);var n=function t(e){return["html","body","#document"].indexOf(lt(e))>=0?e.ownerDocument.body:ht(e)&&Ut(e)?e:t(wt(e))}(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=ct(n),r=s?[o].concat(o.visualViewport||[],Ut(n)?n:[]):n,a=e.concat(r);return s?a:a.concat($t(wt(r)))}function Ft(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Vt(t,e){return"viewport"===e?Ft(function(t){var e=ct(t),i=yt(t),n=e.visualViewport,s=i.clientWidth,o=i.clientHeight,r=0,a=0;return n&&(s=n.width,o=n.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(r=n.offsetLeft,a=n.offsetTop)),{width:s,height:o,x:r+zt(t),y:a}}(t)):ht(e)?function(t){var e=mt(t);return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}(e):Ft(function(t){var e,i=yt(t),n=qt(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=Lt(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=Lt(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+zt(t),l=-n.scrollTop;return"rtl"===bt(s||i).direction&&(a+=Lt(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(yt(t)))}function Kt(t){return t.split("-")[1]}function Xt(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?pt(s):null,r=s?Kt(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case tt:e={x:a,y:i.y-n.height};break;case et:e={x:a,y:i.y+i.height};break;case it:e={x:i.x+i.width,y:l};break;case nt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?At(o):null;if(null!=c){var d="y"===c?"height":"width";switch(r){case"start":e[c]=e[c]-(i[d]/2-n[d]/2);break;case"end":e[c]=e[c]+(i[d]/2-n[d]/2)}}return e}function Yt(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.boundary,r=void 0===o?"clippingParents":o,a=i.rootBoundary,l=void 0===a?"viewport":a,c=i.elementContext,d=void 0===c?"popper":c,h=i.altBoundary,u=void 0!==h&&h,f=i.padding,p=void 0===f?0:f,m=xt("number"!=typeof p?p:Dt(p,st)),g="popper"===d?"reference":"popper",_=t.elements.reference,b=t.rects.popper,v=t.elements[u?g:d],y=function(t,e,i){var n="clippingParents"===e?function(t){var e=$t(wt(t)),i=["absolute","fixed"].indexOf(bt(t).position)>=0&&ht(t)?Tt(t):t;return dt(i)?e.filter((function(t){return dt(t)&&_t(t,i)&&"body"!==lt(t)})):[]}(t):[].concat(e),s=[].concat(n,[i]),o=s[0],r=s.reduce((function(e,i){var n=Vt(t,i);return e.top=Lt(n.top,e.top),e.right=Ot(n.right,e.right),e.bottom=Ot(n.bottom,e.bottom),e.left=Lt(n.left,e.left),e}),Vt(t,o));return r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}(dt(v)?v:v.contextElement||yt(t.elements.popper),r,l),w=mt(_),E=Xt({reference:w,element:b,strategy:"absolute",placement:s}),T=Ft(Object.assign({},b,E)),A="popper"===d?T:w,L={top:y.top-A.top+m.top,bottom:A.bottom-y.bottom+m.bottom,left:y.left-A.left+m.left,right:A.right-y.right+m.right},O=t.modifiersData.offset;if("popper"===d&&O){var k=O[s];Object.keys(L).forEach((function(t){var e=[it,et].indexOf(t)>=0?1:-1,i=[tt,et].indexOf(t)>=0?"y":"x";L[t]+=k[i]*e}))}return L}function Qt(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?rt:l,d=Kt(n),h=d?a?ot:ot.filter((function(t){return Kt(t)===d})):st,u=h.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=h);var f=u.reduce((function(e,i){return e[i]=Yt(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[pt(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}var Gt={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,d=i.boundary,h=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=pt(g),b=l||(_!==g&&p?function(t){if("auto"===pt(t))return[];var e=Rt(t);return[Wt(t),e,Wt(e)]}(g):[Rt(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat("auto"===pt(i)?Qt(e,{placement:i,boundary:d,rootBoundary:h,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,E=new Map,T=!0,A=v[0],L=0;L=0,D=x?"width":"height",N=Yt(e,{placement:O,boundary:d,rootBoundary:h,altBoundary:u,padding:c}),S=x?C?it:nt:C?et:tt;y[D]>w[D]&&(S=Rt(S));var I=Rt(S),j=[];if(o&&j.push(N[k]<=0),a&&j.push(N[S]<=0,N[I]<=0),j.every((function(t){return t}))){A=O,T=!1;break}E.set(O,j)}if(T)for(var P=function(t){var e=v.find((function(e){var i=E.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return A=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==A&&(e.modifiersData[n]._skip=!0,e.placement=A,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function Zt(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function Jt(t){return[tt,it,et,nt].some((function(e){return t[e]>=0}))}var te={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=Yt(e,{elementContext:"reference"}),a=Yt(e,{altBoundary:!0}),l=Zt(r,n),c=Zt(a,s,o),d=Jt(l),h=Jt(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:d,hasPopperEscaped:h},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":d,"data-popper-escaped":h})}},ee={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=rt.reduce((function(t,i){return t[i]=function(t,e,i){var n=pt(t),s=[nt,tt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[nt,it].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ie={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=Xt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},ne={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,d=i.altBoundary,h=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=Yt(e,{boundary:l,rootBoundary:c,padding:h,altBoundary:d}),_=pt(e.placement),b=Kt(e.placement),v=!b,y=At(_),w="x"===y?"y":"x",E=e.modifiersData.popperOffsets,T=e.rects.reference,A=e.rects.popper,L="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O={x:0,y:0};if(E){if(o||a){var k="y"===y?tt:nt,C="y"===y?et:it,x="y"===y?"height":"width",D=E[y],N=E[y]+g[k],S=E[y]-g[C],I=f?-A[x]/2:0,j="start"===b?T[x]:A[x],P="start"===b?-A[x]:-T[x],M=e.elements.arrow,H=f&&M?gt(M):{width:0,height:0},R=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},B=R[k],W=R[C],q=Ct(0,T[x],H[x]),z=v?T[x]/2-I-q-B-L:j-q-B-L,U=v?-T[x]/2+I+q+W+L:P+q+W+L,$=e.elements.arrow&&Tt(e.elements.arrow),F=$?"y"===y?$.clientTop||0:$.clientLeft||0:0,V=e.modifiersData.offset?e.modifiersData.offset[e.placement][y]:0,K=E[y]+z-V-F,X=E[y]+U-V;if(o){var Y=Ct(f?Ot(N,K):N,D,f?Lt(S,X):S);E[y]=Y,O[y]=Y-D}if(a){var Q="x"===y?tt:nt,G="x"===y?et:it,Z=E[w],J=Z+g[Q],st=Z-g[G],ot=Ct(f?Ot(J,K):J,Z,f?Lt(st,X):st);E[w]=ot,O[w]=ot-Z}}e.modifiersData[n]=O}},requiresIfExists:["offset"]};function se(t,e,i){void 0===i&&(i=!1);var n,s,o=yt(e),r=mt(t),a=ht(e),l={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(a||!a&&!i)&&(("body"!==lt(e)||Ut(o))&&(l=(n=e)!==ct(n)&&ht(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:qt(n)),ht(e)?((c=mt(e)).x+=e.clientLeft,c.y+=e.clientTop):o&&(c.x=zt(o))),{x:r.left+l.scrollLeft-c.x,y:r.top+l.scrollTop-c.y,width:r.width,height:r.height}}var oe={placement:"bottom",modifiers:[],strategy:"absolute"};function re(){for(var t=arguments.length,e=new Array(t),i=0;i"applyStyles"===t.name&&!1===t.enabled);this._popper=de(e,this._menu,i),n&&U.setDataAttribute(this._menu,"popper","static")}"ontouchstart"in document.documentElement&&!t.closest(".navbar-nav")&&[].concat(...document.body.children).forEach(t=>H.on(t,"mouseover",p)),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.toggle("show"),this._element.classList.toggle("show"),H.trigger(this._element,"shown.bs.dropdown",e)}}hide(){if(u(this._element)||!this._menu.classList.contains("show"))return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_addEventListeners(){H.on(this._element,"click.bs.dropdown",t=>{t.preventDefault(),this.toggle()})}_completeHide(t){H.trigger(this._element,"hide.bs.dropdown",t).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>H.off(t,"mouseover",p)),this._popper&&this._popper.destroy(),this._menu.classList.remove("show"),this._element.classList.remove("show"),this._element.setAttribute("aria-expanded","false"),U.removeDataAttribute(this._menu,"popper"),H.trigger(this._element,"hidden.bs.dropdown",t))}_getConfig(t){if(t={...this.constructor.Default,...U.getDataAttributes(this._element),...t},d("dropdown",t,this.constructor.DefaultType),"object"==typeof t.reference&&!a(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError("dropdown".toUpperCase()+': Option "reference" provided type "object" without a required "getBoundingClientRect" method.');return t}_getMenuElement(){return t.next(this._element,".dropdown-menu")[0]}_getPlacement(){const t=this._element.parentNode;if(t.classList.contains("dropend"))return _e;if(t.classList.contains("dropstart"))return be;const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?pe:fe:e?ge:me}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem(e){const i=t.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(h);if(!i.length)return;let n=i.indexOf(e.target);"ArrowUp"===e.key&&n>0&&n--,"ArrowDown"===e.key&&nthis.matches('[data-bs-toggle="dropdown"]')?this:t.prev(this,'[data-bs-toggle="dropdown"]')[0];if("Escape"===e.key)return n().focus(),void we.clearMenus();i||"ArrowUp"!==e.key&&"ArrowDown"!==e.key?i&&"Space"!==e.key?we.getInstance(n())._selectMenuItem(e):we.clearMenus():n().click()}}H.on(document,"keydown.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',we.dataApiKeydownHandler),H.on(document,"keydown.bs.dropdown.data-api",".dropdown-menu",we.dataApiKeydownHandler),H.on(document,"click.bs.dropdown.data-api",we.clearMenus),H.on(document,"keyup.bs.dropdown.data-api",we.clearMenus),H.on(document,"click.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',(function(t){t.preventDefault(),we.dropdownInterface(this)})),b(we);const Ee=()=>{const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)},Te=(t=Ee())=>{Ae(),Le("body","paddingRight",e=>e+t),Le(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight",e=>e+t),Le(".sticky-top","marginRight",e=>e-t)},Ae=()=>{const t=document.body.style.overflow;t&&U.setDataAttribute(document.body,"overflow",t),document.body.style.overflow="hidden"},Le=(e,i,n)=>{const s=Ee();t.find(e).forEach(t=>{if(t!==document.body&&window.innerWidth>t.clientWidth+s)return;const e=t.style[i],o=window.getComputedStyle(t)[i];U.setDataAttribute(t,i,e),t.style[i]=n(Number.parseFloat(o))+"px"})},Oe=()=>{ke("body","overflow"),ke("body","paddingRight"),ke(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight"),ke(".sticky-top","marginRight")},ke=(e,i)=>{t.find(e).forEach(t=>{const e=U.getDataAttribute(t,i);void 0===e?t.style.removeProperty(i):(U.removeDataAttribute(t,i),t.style[i]=e)})},Ce={isVisible:!0,isAnimated:!1,rootElement:document.body,clickCallback:null},xe={isVisible:"boolean",isAnimated:"boolean",rootElement:"element",clickCallback:"(function|null)"};class De{constructor(t){this._config=this._getConfig(t),this._isAppended=!1,this._element=null}show(t){this._config.isVisible?(this._append(),this._config.isAnimated&&m(this._getElement()),this._getElement().classList.add("show"),this._emulateAnimation(()=>{v(t)})):v(t)}hide(t){this._config.isVisible?(this._getElement().classList.remove("show"),this._emulateAnimation(()=>{this.dispose(),v(t)})):v(t)}_getElement(){if(!this._element){const t=document.createElement("div");t.className="modal-backdrop",this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_getConfig(t){return(t={...Ce,..."object"==typeof t?t:{}}).rootElement=t.rootElement||document.body,d("backdrop",t,xe),t}_append(){this._isAppended||(this._config.rootElement.appendChild(this._getElement()),H.on(this._getElement(),"mousedown.bs.backdrop",()=>{v(this._config.clickCallback)}),this._isAppended=!0)}dispose(){this._isAppended&&(H.off(this._element,"mousedown.bs.backdrop"),this._getElement().parentNode.removeChild(this._element),this._isAppended=!1)}_emulateAnimation(t){if(!this._config.isAnimated)return void v(t);const e=o(this._getElement());H.one(this._getElement(),"transitionend",()=>v(t)),c(this._getElement(),e)}}const Ne={backdrop:!0,keyboard:!0,focus:!0},Se={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"};class Ie extends R{constructor(e,i){super(e),this._config=this._getConfig(i),this._dialog=t.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1}static get Default(){return Ne}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){if(this._isShown||this._isTransitioning)return;this._isAnimated()&&(this._isTransitioning=!0);const e=H.trigger(this._element,"show.bs.modal",{relatedTarget:t});this._isShown||e.defaultPrevented||(this._isShown=!0,Te(),document.body.classList.add("modal-open"),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),H.on(this._element,"click.dismiss.bs.modal",'[data-bs-dismiss="modal"]',t=>this.hide(t)),H.on(this._dialog,"mousedown.dismiss.bs.modal",()=>{H.one(this._element,"mouseup.dismiss.bs.modal",t=>{t.target===this._element&&(this._ignoreBackdropClick=!0)})}),this._showBackdrop(()=>this._showElement(t)))}hide(t){if(t&&t.preventDefault(),!this._isShown||this._isTransitioning)return;if(H.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const e=this._isAnimated();e&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),H.off(document,"focusin.bs.modal"),this._element.classList.remove("show"),H.off(this._element,"click.dismiss.bs.modal"),H.off(this._dialog,"mousedown.dismiss.bs.modal"),this._queueCallback(()=>this._hideModal(),this._element,e)}dispose(){[window,this._dialog].forEach(t=>H.off(t,".bs.modal")),this._backdrop.dispose(),super.dispose(),H.off(document,"focusin.bs.modal")}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new De({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_getConfig(t){return t={...Ne,...U.getDataAttributes(this._element),...t},d("modal",t,Se),t}_showElement(e){const i=this._isAnimated(),n=t.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0,n&&(n.scrollTop=0),i&&m(this._element),this._element.classList.add("show"),this._config.focus&&this._enforceFocus(),this._queueCallback(()=>{this._config.focus&&this._element.focus(),this._isTransitioning=!1,H.trigger(this._element,"shown.bs.modal",{relatedTarget:e})},this._dialog,i)}_enforceFocus(){H.off(document,"focusin.bs.modal"),H.on(document,"focusin.bs.modal",t=>{document===t.target||this._element===t.target||this._element.contains(t.target)||this._element.focus()})}_setEscapeEvent(){this._isShown?H.on(this._element,"keydown.dismiss.bs.modal",t=>{this._config.keyboard&&"Escape"===t.key?(t.preventDefault(),this.hide()):this._config.keyboard||"Escape"!==t.key||this._triggerBackdropTransition()}):H.off(this._element,"keydown.dismiss.bs.modal")}_setResizeEvent(){this._isShown?H.on(window,"resize.bs.modal",()=>this._adjustDialog()):H.off(window,"resize.bs.modal")}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove("modal-open"),this._resetAdjustments(),Oe(),H.trigger(this._element,"hidden.bs.modal")})}_showBackdrop(t){H.on(this._element,"click.dismiss.bs.modal",t=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:t.target===t.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())}),this._backdrop.show(t)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(H.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight;t||(this._element.style.overflowY="hidden"),this._element.classList.add("modal-static");const e=o(this._dialog);H.off(this._element,"transitionend"),H.one(this._element,"transitionend",()=>{this._element.classList.remove("modal-static"),t||(H.one(this._element,"transitionend",()=>{this._element.style.overflowY=""}),c(this._element,e))}),c(this._element,e),this._element.focus()}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=Ee(),i=e>0;(!i&&t&&!_()||i&&!t&&_())&&(this._element.style.paddingLeft=e+"px"),(i&&!t&&!_()||!i&&t&&_())&&(this._element.style.paddingRight=e+"px")}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Ie.getInstance(this)||new Ie(this,"object"==typeof t?t:{});if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}H.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=s(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),H.one(e,"show.bs.modal",t=>{t.defaultPrevented||H.one(e,"hidden.bs.modal",()=>{h(this)&&this.focus()})}),(Ie.getInstance(e)||new Ie(e)).toggle(this)})),b(Ie);const je={backdrop:!0,keyboard:!0,scroll:!1},Pe={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"};class Me extends R{constructor(t,e){super(t),this._config=this._getConfig(e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._addEventListeners()}static get NAME(){return"offcanvas"}static get Default(){return je}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||H.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||(Te(),this._enforceFocusOnElement(this._element)),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add("show"),this._queueCallback(()=>{H.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})},this._element,!0))}hide(){this._isShown&&(H.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(H.off(document,"focusin.bs.offcanvas"),this._element.blur(),this._isShown=!1,this._element.classList.remove("show"),this._backdrop.hide(),this._queueCallback(()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||Oe(),H.trigger(this._element,"hidden.bs.offcanvas")},this._element,!0)))}dispose(){this._backdrop.dispose(),super.dispose(),H.off(document,"focusin.bs.offcanvas")}_getConfig(t){return t={...je,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},d("offcanvas",t,Pe),t}_initializeBackDrop(){return new De({isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_enforceFocusOnElement(t){H.off(document,"focusin.bs.offcanvas"),H.on(document,"focusin.bs.offcanvas",e=>{document===e.target||t===e.target||t.contains(e.target)||t.focus()}),t.focus()}_addEventListeners(){H.on(this._element,"click.dismiss.bs.offcanvas",'[data-bs-dismiss="offcanvas"]',()=>this.hide()),H.on(this._element,"keydown.dismiss.bs.offcanvas",t=>{this._config.keyboard&&"Escape"===t.key&&this.hide()})}static jQueryInterface(t){return this.each((function(){const e=w.get(this,"bs.offcanvas")||new Me(this,"object"==typeof t?t:{});if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}H.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(e){const i=s(this);if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),u(this))return;H.one(i,"hidden.bs.offcanvas",()=>{h(this)&&this.focus()});const n=t.findOne(".offcanvas.show");n&&n!==i&&Me.getInstance(n).hide(),(w.get(i,"bs.offcanvas")||new Me(i)).toggle(this)})),H.on(window,"load.bs.offcanvas.data-api",()=>{t.find(".offcanvas.show").forEach(t=>(w.get(t,"bs.offcanvas")||new Me(t)).show())}),b(Me);const He=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Re=/^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i,Be=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,We=(t,e)=>{const i=t.nodeName.toLowerCase();if(e.includes(i))return!He.has(i)||Boolean(Re.test(t.nodeValue)||Be.test(t.nodeValue));const n=e.filter(t=>t instanceof RegExp);for(let t=0,e=n.length;t{We(t,a)||i.removeAttribute(t.nodeName)})}return n.body.innerHTML}const ze=new RegExp("(^|\\s)bs-tooltip\\S+","g"),Ue=new Set(["sanitize","allowList","sanitizeFn"]),$e={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},Fe={AUTO:"auto",TOP:"top",RIGHT:_()?"left":"right",BOTTOM:"bottom",LEFT:_()?"right":"left"},Ve={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],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:[]},popperConfig:null},Ke={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"};class Xe extends R{constructor(t,e){if(void 0===he)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(e),this.tip=null,this._setListeners()}static get Default(){return Ve}static get NAME(){return"tooltip"}static get Event(){return Ke}static get DefaultType(){return $e}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(t){if(this._isEnabled)if(t){const e=this._initializeOnDelegatedTarget(t);e._activeTrigger.click=!e._activeTrigger.click,e._isWithActiveTrigger()?e._enter(null,e):e._leave(null,e)}else{if(this.getTipElement().classList.contains("show"))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),H.off(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.tip&&this.tip.parentNode&&this.tip.parentNode.removeChild(this.tip),this._popper&&this._popper.destroy(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const t=H.trigger(this._element,this.constructor.Event.SHOW),i=f(this._element),n=null===i?this._element.ownerDocument.documentElement.contains(this._element):i.contains(this._element);if(t.defaultPrevented||!n)return;const s=this.getTipElement(),o=e(this.constructor.NAME);s.setAttribute("id",o),this._element.setAttribute("aria-describedby",o),this.setContent(),this._config.animation&&s.classList.add("fade");const r="function"==typeof this._config.placement?this._config.placement.call(this,s,this._element):this._config.placement,a=this._getAttachment(r);this._addAttachmentClass(a);const{container:l}=this._config;w.set(s,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(l.appendChild(s),H.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=de(this._element,s,this._getPopperConfig(a)),s.classList.add("show");const c="function"==typeof this._config.customClass?this._config.customClass():this._config.customClass;c&&s.classList.add(...c.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>{H.on(t,"mouseover",p)});const d=this.tip.classList.contains("fade");this._queueCallback(()=>{const t=this._hoverState;this._hoverState=null,H.trigger(this._element,this.constructor.Event.SHOWN),"out"===t&&this._leave(null,this)},this.tip,d)}hide(){if(!this._popper)return;const t=this.getTipElement();if(H.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;t.classList.remove("show"),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>H.off(t,"mouseover",p)),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const e=this.tip.classList.contains("fade");this._queueCallback(()=>{this._isWithActiveTrigger()||("show"!==this._hoverState&&t.parentNode&&t.parentNode.removeChild(t),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),H.trigger(this._element,this.constructor.Event.HIDDEN),this._popper&&(this._popper.destroy(),this._popper=null))},this.tip,e),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const t=document.createElement("div");return t.innerHTML=this._config.template,this.tip=t.children[0],this.tip}setContent(){const e=this.getTipElement();this.setElementContent(t.findOne(".tooltip-inner",e),this.getTitle()),e.classList.remove("fade","show")}setElementContent(t,e){if(null!==t)return a(e)?(e=l(e),void(this._config.html?e.parentNode!==t&&(t.innerHTML="",t.appendChild(e)):t.textContent=e.textContent)):void(this._config.html?(this._config.sanitize&&(e=qe(e,this._config.allowList,this._config.sanitizeFn)),t.innerHTML=e):t.textContent=e)}getTitle(){let t=this._element.getAttribute("data-bs-original-title");return t||(t="function"==typeof this._config.title?this._config.title.call(this._element):this._config.title),t}updateAttachment(t){return"right"===t?"end":"left"===t?"start":t}_initializeOnDelegatedTarget(t,e){const i=this.constructor.DATA_KEY;return(e=e||w.get(t.delegateTarget,i))||(e=new this.constructor(t.delegateTarget,this._getDelegateConfig()),w.set(t.delegateTarget,i,e)),e}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(t){const e={placement:t,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:"onChange",enabled:!0,phase:"afterWrite",fn:t=>this._handlePopperPlacementChange(t)}],onFirstUpdate:t=>{t.options.placement!==t.placement&&this._handlePopperPlacementChange(t)}};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_addAttachmentClass(t){this.getTipElement().classList.add("bs-tooltip-"+this.updateAttachment(t))}_getAttachment(t){return Fe[t.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach(t=>{if("click"===t)H.on(this._element,this.constructor.Event.CLICK,this._config.selector,t=>this.toggle(t));else if("manual"!==t){const e="hover"===t?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,i="hover"===t?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;H.on(this._element,e,this._config.selector,t=>this._enter(t)),H.on(this._element,i,this._config.selector,t=>this._leave(t))}}),this._hideModalHandler=()=>{this._element&&this.hide()},H.on(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");(t||"string"!==e)&&(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))}_enter(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),e.getTipElement().classList.contains("show")||"show"===e._hoverState?e._hoverState="show":(clearTimeout(e._timeout),e._hoverState="show",e._config.delay&&e._config.delay.show?e._timeout=setTimeout(()=>{"show"===e._hoverState&&e.show()},e._config.delay.show):e.show())}_leave(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusout"===t.type?"focus":"hover"]=e._element.contains(t.relatedTarget)),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState="out",e._config.delay&&e._config.delay.hide?e._timeout=setTimeout(()=>{"out"===e._hoverState&&e.hide()},e._config.delay.hide):e.hide())}_isWithActiveTrigger(){for(const t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1}_getConfig(t){const e=U.getDataAttributes(this._element);return Object.keys(e).forEach(t=>{Ue.has(t)&&delete e[t]}),(t={...this.constructor.Default,...e,..."object"==typeof t&&t?t:{}}).container=!1===t.container?document.body:l(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),d("tooltip",t,this.constructor.DefaultType),t.sanitize&&(t.template=qe(t.template,t.allowList,t.sanitizeFn)),t}_getDelegateConfig(){const t={};if(this._config)for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t}_cleanTipClass(){const t=this.getTipElement(),e=t.getAttribute("class").match(ze);null!==e&&e.length>0&&e.map(t=>t.trim()).forEach(e=>t.classList.remove(e))}_handlePopperPlacementChange(t){const{state:e}=t;e&&(this.tip=e.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(e.placement)))}static jQueryInterface(t){return this.each((function(){let e=w.get(this,"bs.tooltip");const i="object"==typeof t&&t;if((e||!/dispose|hide/.test(t))&&(e||(e=new Xe(this,i)),"string"==typeof t)){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}b(Xe);const Ye=new RegExp("(^|\\s)bs-popover\\S+","g"),Qe={...Xe.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:''},Ge={...Xe.DefaultType,content:"(string|element|function)"},Ze={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class Je extends Xe{static get Default(){return Qe}static get NAME(){return"popover"}static get Event(){return Ze}static get DefaultType(){return Ge}isWithContent(){return this.getTitle()||this._getContent()}setContent(){const e=this.getTipElement();this.setElementContent(t.findOne(".popover-header",e),this.getTitle());let i=this._getContent();"function"==typeof i&&(i=i.call(this._element)),this.setElementContent(t.findOne(".popover-body",e),i),e.classList.remove("fade","show")}_addAttachmentClass(t){this.getTipElement().classList.add("bs-popover-"+this.updateAttachment(t))}_getContent(){return this._element.getAttribute("data-bs-content")||this._config.content}_cleanTipClass(){const t=this.getTipElement(),e=t.getAttribute("class").match(Ye);null!==e&&e.length>0&&e.map(t=>t.trim()).forEach(e=>t.classList.remove(e))}static jQueryInterface(t){return this.each((function(){let e=w.get(this,"bs.popover");const i="object"==typeof t?t:null;if((e||!/dispose|hide/.test(t))&&(e||(e=new Je(this,i),w.set(this,"bs.popover",e)),"string"==typeof t)){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}b(Je);const ti={offset:10,method:"auto",target:""},ei={offset:"number",method:"string",target:"(string|element)"};class ii extends R{constructor(t,e){super(t),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(e),this._selector=`${this._config.target} .nav-link, ${this._config.target} .list-group-item, ${this._config.target} .dropdown-item`,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,H.on(this._scrollElement,"scroll.bs.scrollspy",()=>this._process()),this.refresh(),this._process()}static get Default(){return ti}static get NAME(){return"scrollspy"}refresh(){const e=this._scrollElement===this._scrollElement.window?"offset":"position",i="auto"===this._config.method?e:this._config.method,s="position"===i?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),t.find(this._selector).map(e=>{const o=n(e),r=o?t.findOne(o):null;if(r){const t=r.getBoundingClientRect();if(t.width||t.height)return[U[i](r).top+s,o]}return null}).filter(t=>t).sort((t,e)=>t[0]-e[0]).forEach(t=>{this._offsets.push(t[0]),this._targets.push(t[1])})}dispose(){H.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(t){if("string"!=typeof(t={...ti,...U.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}}).target&&a(t.target)){let{id:i}=t.target;i||(i=e("scrollspy"),t.target.id=i),t.target="#"+i}return d("scrollspy",t,ei),t}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),i=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=i){const t=this._targets[this._targets.length-1];this._activeTarget!==t&&this._activate(t)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(let e=this._offsets.length;e--;)this._activeTarget!==this._targets[e]&&t>=this._offsets[e]&&(void 0===this._offsets[e+1]||t`${t}[data-bs-target="${e}"],${t}[href="${e}"]`),n=t.findOne(i.join(","));n.classList.contains("dropdown-item")?(t.findOne(".dropdown-toggle",n.closest(".dropdown")).classList.add("active"),n.classList.add("active")):(n.classList.add("active"),t.parents(n,".nav, .list-group").forEach(e=>{t.prev(e,".nav-link, .list-group-item").forEach(t=>t.classList.add("active")),t.prev(e,".nav-item").forEach(e=>{t.children(e,".nav-link").forEach(t=>t.classList.add("active"))})})),H.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:e})}_clear(){t.find(this._selector).filter(t=>t.classList.contains("active")).forEach(t=>t.classList.remove("active"))}static jQueryInterface(t){return this.each((function(){const e=ii.getInstance(this)||new ii(this,"object"==typeof t?t:{});if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}H.on(window,"load.bs.scrollspy.data-api",()=>{t.find('[data-bs-spy="scroll"]').forEach(t=>new ii(t))}),b(ii);class ni extends R{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains("active"))return;let e;const i=s(this._element),n=this._element.closest(".nav, .list-group");if(n){const i="UL"===n.nodeName||"OL"===n.nodeName?":scope > li > .active":".active";e=t.find(i,n),e=e[e.length-1]}const o=e?H.trigger(e,"hide.bs.tab",{relatedTarget:this._element}):null;if(H.trigger(this._element,"show.bs.tab",{relatedTarget:e}).defaultPrevented||null!==o&&o.defaultPrevented)return;this._activate(this._element,n);const r=()=>{H.trigger(e,"hidden.bs.tab",{relatedTarget:this._element}),H.trigger(this._element,"shown.bs.tab",{relatedTarget:e})};i?this._activate(i,i.parentNode,r):r()}_activate(e,i,n){const s=(!i||"UL"!==i.nodeName&&"OL"!==i.nodeName?t.children(i,".active"):t.find(":scope > li > .active",i))[0],o=n&&s&&s.classList.contains("fade"),r=()=>this._transitionComplete(e,s,n);s&&o?(s.classList.remove("show"),this._queueCallback(r,e,!0)):r()}_transitionComplete(e,i,n){if(i){i.classList.remove("active");const e=t.findOne(":scope > .dropdown-menu .active",i.parentNode);e&&e.classList.remove("active"),"tab"===i.getAttribute("role")&&i.setAttribute("aria-selected",!1)}e.classList.add("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),m(e),e.classList.contains("fade")&&e.classList.add("show");let s=e.parentNode;if(s&&"LI"===s.nodeName&&(s=s.parentNode),s&&s.classList.contains("dropdown-menu")){const i=e.closest(".dropdown");i&&t.find(".dropdown-toggle",i).forEach(t=>t.classList.add("active")),e.setAttribute("aria-expanded",!0)}n&&n()}static jQueryInterface(t){return this.each((function(){const e=w.get(this,"bs.tab")||new ni(this);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}H.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),u(this)||(w.get(this,"bs.tab")||new ni(this)).show()})),b(ni);const si={animation:"boolean",autohide:"boolean",delay:"number"},oi={animation:!0,autohide:!0,delay:5e3};class ri extends R{constructor(t,e){super(t),this._config=this._getConfig(e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return si}static get Default(){return oi}static get NAME(){return"toast"}show(){H.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove("hide"),m(this._element),this._element.classList.add("showing"),this._queueCallback(()=>{this._element.classList.remove("showing"),this._element.classList.add("show"),H.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this._element.classList.contains("show")&&(H.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.remove("show"),this._queueCallback(()=>{this._element.classList.add("hide"),H.trigger(this._element,"hidden.bs.toast")},this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),super.dispose()}_getConfig(t){return t={...oi,...U.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}},d("toast",t,this.constructor.DefaultType),t}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){H.on(this._element,"click.dismiss.bs.toast",'[data-bs-dismiss="toast"]',()=>this.hide()),H.on(this._element,"mouseover.bs.toast",t=>this._onInteraction(t,!0)),H.on(this._element,"mouseout.bs.toast",t=>this._onInteraction(t,!1)),H.on(this._element,"focusin.bs.toast",t=>this._onInteraction(t,!0)),H.on(this._element,"focusout.bs.toast",t=>this._onInteraction(t,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){let e=w.get(this,"bs.toast");if(e||(e=new ri(this,"object"==typeof t&&t)),"string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return b(ri),{Alert:B,Button:W,Carousel:Q,Collapse:J,Dropdown:we,Modal:Ie,Offcanvas:Me,Popover:Je,ScrollSpy:ii,Tab:ni,Toast:ri,Tooltip:Xe}})); \ No newline at end of file diff --git a/assets/css/dm-sans.css b/assets/css/dm-sans.css new file mode 100644 index 0000000..213958f --- /dev/null +++ b/assets/css/dm-sans.css @@ -0,0 +1,324 @@ +/* latin-ext */ +@font-face { + font-family: 'DM Sans'; + font-style: italic; + font-weight: 100; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKK58VXh.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'DM Sans'; + font-style: italic; + font-weight: 100; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKy58Q.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'DM Sans'; + font-style: italic; + font-weight: 200; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKK58VXh.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'DM Sans'; + font-style: italic; + font-weight: 200; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKy58Q.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'DM Sans'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKK58VXh.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'DM Sans'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKy58Q.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'DM Sans'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKK58VXh.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'DM Sans'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKy58Q.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'DM Sans'; + font-style: italic; + font-weight: 500; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKK58VXh.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'DM Sans'; + font-style: italic; + font-weight: 500; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKy58Q.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'DM Sans'; + font-style: italic; + font-weight: 600; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKK58VXh.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'DM Sans'; + font-style: italic; + font-weight: 600; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKy58Q.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'DM Sans'; + font-style: italic; + font-weight: 700; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKK58VXh.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'DM Sans'; + font-style: italic; + font-weight: 700; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKy58Q.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'DM Sans'; + font-style: italic; + font-weight: 800; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKK58VXh.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'DM Sans'; + font-style: italic; + font-weight: 800; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKy58Q.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'DM Sans'; + font-style: italic; + font-weight: 900; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKK58VXh.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'DM Sans'; + font-style: italic; + font-weight: 900; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Wp2ywxg089UriCZaSExd86J3t9jz86MvyyKy58Q.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'DM Sans'; + font-style: normal; + font-weight: 100; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu6-K6h9Q.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'DM Sans'; + font-style: normal; + font-weight: 100; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu0-K4.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'DM Sans'; + font-style: normal; + font-weight: 200; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu6-K6h9Q.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'DM Sans'; + font-style: normal; + font-weight: 200; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu0-K4.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'DM Sans'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu6-K6h9Q.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'DM Sans'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu0-K4.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'DM Sans'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu6-K6h9Q.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'DM Sans'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu0-K4.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'DM Sans'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu6-K6h9Q.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'DM Sans'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu0-K4.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'DM Sans'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu6-K6h9Q.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'DM Sans'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu0-K4.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'DM Sans'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu6-K6h9Q.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'DM Sans'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu0-K4.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'DM Sans'; + font-style: normal; + font-weight: 800; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu6-K6h9Q.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'DM Sans'; + font-style: normal; + font-weight: 800; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu0-K4.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'DM Sans'; + font-style: normal; + font-weight: 900; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu6-K6h9Q.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'DM Sans'; + font-style: normal; + font-weight: 900; + font-display: swap; + src: url(https://fonts.gstatic.com/s/dmsans/v15/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu0-K4.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/assets/css/forum-styles.css b/assets/css/forum-styles.css new file mode 100644 index 0000000..9d4d7ce --- /dev/null +++ b/assets/css/forum-styles.css @@ -0,0 +1,803 @@ +/* forum-styles.css */ + +.forum-main { + color: #ffffff; + background-color: #000000; + padding: 0; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + width: 100vw; + box-sizing: border-box; + background-size: auto; + background-position: center; + background-attachment: fixed; +} + +.forum-header { + width: 100%; + padding: 2vh; + background-color: #000000; + color: #add8e6; /* Light blue color */ + text-align: center; + font-size: 1.75rem; + font-weight: bold; + margin-bottom: 0; +} + +.forum-submenu { + width: 100%; + padding: 1vh 2vh; + background: rgba(0, 0, 0, 0.8); + text-align: center; + margin-top: 0; +} + +.forum-rooms { + display: flex; + justify-content: center; + gap: 2vh; /* Increased gap for better spacing */ + margin-top: 0; + flex-wrap: wrap; +} + +.room-button { + background-color: #317e78; + color: #ffffff; + border: 2px solid #317e78; + border-radius: 2vh; + padding: 1vh 2vh; + font-size: 1.1rem; + cursor: pointer; +} + +.room-button:hover { + background-color: #19403d; +} + +.forum-content { + flex-grow: 1; + width: 90%; + padding: 3vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + box-sizing: border-box; + border: 3px solid #ffffff; /* Increased border width */ +} + +.room-content { + background: rgba(0, 0, 0, 0.6); + padding: 2vh; + border-radius: 1vh; + width: 100%; + box-sizing: border-box; + /* text-align: center; */ +} + +.room-title { + color: #add8e6; /* Light blue color for room name */ + text-align: center; + margin-bottom: 2vh; + font-size: 2rem; +} + +.message-item { + background: #1c1c1c; + color: #ffffff; + padding: 1vh; + margin-bottom: 1vh; + border-radius: 0.8vh; + width: 100%; + box-sizing: border-box; + display: flex; + flex-direction: column; + align-items: flex-start; + border: 1px solid #ffffff; +} + +.message-header { + display: flex; + justify-content: space-between; + width: 100%; + margin-bottom: 1vh; + font-size: 1.25rem; + color: white +} + + .message-header.username { + color: #1b8fc4; +} + +.reply-username { + font-weight: bold; + color:#58859a + } + +.reply-timestamp { + font-style: italic; + color: rgb(174, 202, 213) + } + +.reply-content { + margin: 0; + color: #747474; + font-size: 1.0rem; + background-color: #14212c; +} + +.username { + font-weight: bold; + color:#228ec0 +} + +.timestamp { + font-style: italic; + color: rgb(157, 167, 151) +} + + + +.reply-button { + align-self: flex-end; + margin-top: 1vh; + background-color: #167089; + color: #ffffff; + border: none; + border-radius: 1vh; + padding: 0.3vh 0.6vh; + cursor: pointer; +} + +.reply-button:hover { + background-color: #19403d; +} + +/* forum-styles.css additions */ + +.message-input-section { + display: flex; + flex-direction: column; + align-items: stretch; + box-sizing: border-box; + width: 100%; + gap: 1vh; /* Spacing between toolbar and editor */ + background-color: black; + padding: 1vh; +} + +/* .ql-editor { + flex-grow: 1; + font-size: 1.25rem; +} */ + +.message-input { + flex-grow: 1; + padding: 2vh; + border-radius: 1vh; + border: 1px solid #cccccc; + font-size: 1.25rem; + /* margin-right: 8vh; */ + box-sizing: border-box; + min-height: 15vh; +} + +.send-button { + background-color: #13a97c; + color: #ffffff; + border: none; + border-radius: 1vh; + padding: 2vh 4vh; + cursor: pointer; +} + +.send-button:hover { + background-color: #19403d; +} + +.messages-container { + width: 100%; + margin-bottom: 5vh; /* Ensure space above input section */ + overflow-y: auto; + padding-bottom: 1vh; + box-sizing: border-box; +} + +.load-more-button { + align-self: flex-end; + margin-top: 1vh; + background-color: #167089; + color: #ffffff; + border: 1px grey dashed; + border-radius: 1vh; + padding: 0.3vh 0.6vh; + cursor: pointer; +} + +.load-more-button:hover { + background-color: #19403d; +} + +.pagination-container button { + background-color: black; + color: white; + border: 1px solid white; + padding: 5px 10px; + margin: 5px; + cursor: pointer; +} + +.pagination-container button:hover { + background-color: white; + color: black; + border: 1px solid black; +} + +.pagination-container button.active-page { + background-color: lightblue; + color: black; + border: 1px solid lightblue; +} + +.tools-header { + width: 100%; + padding: 2vh; + background-color: #000000; + color: #add8e6; /* Light blue color */ + text-align: center; + font-size: 1.75rem; + font-weight: bold; + margin-bottom: 0; +} + +.tools-main { + color: #ffffff; + background-color: #000000; + padding: 0; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + width: 100vw; + box-sizing: border-box; + background-size: cover; + background-position: center; + background-attachment: fixed; +} + +.tools-content { + flex-grow: 1; + width: 90%; + padding: 3vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + box-sizing: border-box; + border: 3px solid #ffffff; /* Increased border width */ +} + +.tools-submenu { + width: 100%; + padding: 1vh 2vh; + background: rgba(5, 5, 6, 0.8); + text-align: center; + margin-top: 0; +} + +.tools-button { + background-color: #1d2c3d; + color: #ffffff; + border: 2px solid #317e78; + border-radius: 2vh; + padding: 1vh 2vh; + font-size: 1.1rem; + cursor: pointer; +} + +.tools-button:hover { + background-color: #191d40; +} + +.attachments-gallery { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); + gap: 10px; + margin-top: 10px; +} + +.attachment img { + width: 100%; + height: auto; + cursor: pointer; + border: 1px solid #ccc; + transition: transform 0.3s; +} + +.attachment img:hover { + transform: scale(1.25); +} + +.attachment button { + align-self: flex-end; + margin-top: 1vh; + background-color: #0f4c41; + color: #ffffff; + border: dotted; + border-radius: 1vh; + padding: 0.3vh 0.6vh; + cursor: pointer; +} + +.image-modal { + display: none; /* Hidden by default */ + position: fixed; /* Stay in place */ + z-index: 1000; /* Sit on top */ + left: 10%; + top: 10%; + width: 80%; + height: 80%; + overflow: none; /* Enable scroll if needed */ + background-color: rgba(0, 0, 0, 0.8); /* Black w/ opacity */ +} + +.modal-content { + margin: auto; + display: block; + border: 2px dashed #638b93; + width: 60%; + height: auto; + max-width: 1200vh; +} + +.close { + position: absolute; + top: 15px; + right: 25px; + color: #fff; + font-size: 35px; + font-weight: bold; + cursor: pointer; +} + +.download-button { + margin: 15px auto; + display: block; + color: white; + background-color: #436370; + border: none; + padding: 10px 20px; + cursor: pointer; +} + + +/* this is the text from the quill editor, hopefully these settings will prevent the page styles from affecting the formatted html from editor posts. */ +.message-text { + margin: 0; /* Reset unwanted margins */ + font-size: 1.25rem; /* Set a base font size */ + padding: 0; /* Reset unwanted padding */ + text-align: initial; /* Reset any forced text alignment */ + color: inherit; /* Ensure it takes the color correctly */ + text-decoration: none; /* Remove any unwanted underline */ +} + +/*----------------------------------------------------------------------------------------------------------------------------------MINTER-BOARD-STYLES---------*/ +/* background-image: url(../../assets/images/background.png); */ +/* General Page Styles */ +/* Main Container for Minter Board */ + +body { + background-color: black; +} +.minter-board-main { + background-color: #000000; + color: #ffffff; + border-radius: 1vh; + padding: 2vh; +} + +/* Heading Style */ +.minter-board-main h1 { + font-size: 4vh; + color: #76c7c0; + margin-bottom: 2vh; +} + +/* Publish Card Button */ +.publish-card-button { + background-color: #161820; + color: #ffffff; + border: none; + border-radius: 1vh; + padding: 2vh; + font-size: 2vh; + cursor: pointer; + transition: background-color 0.3s; +} + +.publish-card-button:hover { + background-color: #1b214a; +} + +/* Cards Container */ + +.cards-container { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + gap: 2vh; /* Adjust spacing as needed */ +} + +/* Publish Card View */ +.publish-card-view { + display: flex; + flex-direction: column; + justify-content: center; /* Centers vertically */ + align-items: center; /* Centers horizontally */ + min-height: 80vh; /* Ensures the view takes full height of the viewport */ +} + + +/* Form Heading */ +.publish-card-view h3 { + font-size: 2vh; + color: #86a5ae; + margin-bottom: 2vh; +} + +/* Form Label */ +.publish-card-view label { + display: block; + font-size: 1.8vh; + color: #76b4c7; + margin-bottom: 1vh; + font-weight: bold; +} + +/* Input and Textarea Styling */ +.publish-card-view input[type="text"], +.publish-card-view textarea { + width: 100%; + background-color: #121212; + color: #ffffff; + border: 0.2vh solid #444444; + border-radius: 0.5vh; + padding: 1.5vh; + font-size: 1.8vh; + margin-bottom: 2vh; +} + +.publish-card-view textarea { + min-height: 15vh; + resize: vertical; +} + +/* Links Container */ +#links-container { + margin-bottom: 2vh; +} + +.card-link { + width: 100%; + margin-bottom: 1.5vh; +} + +/* Buttons Inside Form */ +#publish-card-form button { + background-color: #76c7c0; + color: #1e1e1e; + border: none; + border-radius: 0.5vh; + padding: 1.5vh; + font-size: 2vh; + cursor: pointer; + margin-right: 1vh; + transition: background-color 0.3s; +} + +#publish-card-form button:hover { + background-color: #5e92a8; +} + +#publish-card-form #add-link-button { + background-color: #233748; + color: #ffffff; + margin-bottom: 2vh; +} + +#publish-card-form #add-link-button:hover { + background-color: #1b1936; +} + +/* Cancel Button */ +#publish-card-form #cancel-publish-button { + background-color: #463737; + color: #ffffff; +} + +#publish-card-form #cancel-publish-button:hover { + background-color: #281e1e; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .publish-card-view { + width: 90%; + padding: 2vh; + } + + .publish-card-button { + font-size: 1.8vh; + padding: 1.5vh; + } + + #publish-card-form button { + font-size: 1.8vh; + padding: 1.2vh; + } +} +@media (max-width: 768px) { + .minter-card { + flex: 1 1 calc(50% - 20px); /* Two cards per row on medium screens */ + } +} + +@media (max-width: 480px) { + .minter-card { + flex: 1 1 100%; /* Full-width cards on small screens */ + } +} + +.minter-card { + background-color: #1e1e2e; /* Dark background */ + flex: 1 1 calc(33%); + min-width: 25rem; /* Ensure the card never gets smaller than 15rem */ + max-width: calc(25% - 2rem); /* Prevent cards from growing larger than 1/4 */ + color: #ffffff; + border: 1px solid #333; + border-radius: 12px; + padding: 1vh; + min-height: 30vh; + max-height: auto; + margin: 1vh; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3); /* Soft shadow */ + font-family: 'Arial', sans-serif; + transition: transform 0.2s ease-in-out; +} + +.minter-card:hover { + transform: translateY(-5px); /* Slightly lift card on hover */ +} + +.minter-card-header h3 { + margin: 0; + font-size: 1.5em; + color: #ffae42; /* Highlight for the header */ +} + +.minter-card h5 { + margin: 0; + font-size: 1.0em; + color: lightgreen; + text-align: center; +} + +.minter-card-header p { + font-size: 0.9em; + color: #cccccc; /* Subdued color for additional header info */ +} + +.minter-card-results { + margin: 15px 0; + display: flex; + flex-direction: column; + gap: 8px; +} + +.minter-card-results h5 { + margin-bottom: 1vh; + font-size: 1.1vh; + color: lightgreen; + text-align: center; +} + +.minter-card-results div { + display: flex; + justify-content: space-between; +} + +.minter-card-results span { + padding: 5px 10px; + border-radius: 8px; + font-size: 0.9em; +} + +.minter-card-results .admin-yes { + background-color: #ccffcc; /* Light green */ + color: #006600; +} + +.minter-card-results .admin-no { + background-color: #ffcccc; /* Light red */ + color: #660000; +} + +.minter-card-results .minter-yes { + background-color: #99cc99; /* Medium green */ + color: #004d00; +} + +.minter-card-results .minter-no { + background-color: #cc9999; /* Medium red */ + color: #4d0000; +} + +.minter-card-results .total-yes { + background-color: #669966; /* Dark green */ + color: #003300; +} + +.minter-card-results .total-no { + background-color: #996666; /* Dark red */ + color: #330000; +} + +.info .content-preview { + font-size: 0.85em; + color: #dddddd; +} + +.minter-card .info { + background-color: #2a2a2a; /* Very dark grey background */ + border: 1px solid #d3d3d3; /* Light grey border */ + padding: 1rem; /* Add padding inside the section */ + margin: 1rem 0; /* Add margin outside the section for spacing */ + font-size: 0.75em; /* Set the font size */ + line-height: 1.5; /* Optional: Adjust line spacing for better readability */ + height: calc(1.5 * 1000 / 66 * 0.75em); /* Dynamically calculate height to fit 1000 characters */ + overflow-y: auto; /* Enable vertical scrolling if content overflows */ + border-radius: 8px; /* Optional: Add rounded corners */ + color: #f1f1f1; /* Optional: Light grey text color for readability */ +} + +.info .toggle-content-button { + background-color: #ffae42; /* Highlight for toggle button */ + color: #1e1e2e; + border: none; + font-size: 0.75em; + border-radius: 8px; + padding: 1px 2px; + cursor: pointer; +} + +.support-header { + margin-bottom: 1vh; + font-size: 1.1vh; + color: lightgreen; + text-align: center; +} + +.results-header { + margin-top: 1vh; +} + +.info-links button { + background-color: #1e90ff; /* Link button color */ + color: #ffffff; + border: none; + border-radius: 8px; + font-size: 0.8em; + padding: 0.15vh 0.3vh; + margin: 0.07vh; + cursor: pointer; +} + +.info-links button:hover { + background-color: #0055cc; +} + +.actions { + display: flex; + max-width: 100%; + justify-content: space-between; +} + +.actions h5{ + margin-bottom: 1vh; + font-size: 1.5vh; + color: lightgreen +} +.actions .yes { + background-color: #00cc00; /* Green for yes */ + color: #ffffff; + border: none; + border-radius: 8px; + padding: 1vh 2.5vh; + cursor: pointer; + transition: background-color 0.3s; +} + +.actions .yes:hover { + background-color: #009900; +} + +.actions .no { + background-color: #cc0000; /* Red for no */ + color: #ffffff; + border: none; + border-radius: 8px; + padding: 1.0vh 2.5vh; + cursor: pointer; + transition: background-color 0.3s; +} + +.actions .no:hover { + background-color: #990000; +} + +.actions .comment { + background-color: #cccccc; /* Grey for comments */ + color: #1e1e2e; + border: none; + border-radius: 8px; + padding: 1.0vh 1.5vh; + cursor: pointer; + transition: background-color 0.3s; +} + +.actions .comment:hover { + background-color: #999999; +} + +.comments-section { + background-color: #292929; /* Slightly lighter background */ + padding: 10px; + border-radius: 8px; + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.5); +} + +.comments-container { + margin-bottom: 10px; + max-height: 150px; + overflow-y: auto; +} + +textarea { + border: 1px solid #444444; + background-color: #1e1e2e; + color: #ffffff; + border-radius: 8px; + padding: 5px; + resize: vertical; +} + +textarea::placeholder { + color: #aaaaaa; +} + +.comments-section button { + background-color: #1e90ff; /* Blue for post comment */ + color: #ffffff; + border: none; + border-radius: 8px; + padding: 5px 10px; + cursor: pointer; +} + +.comments-section button:hover { + background-color: #0055cc; +} + +.minter-card p { + font-size: 12px; + color: gray; +} + + + + diff --git a/assets/css/space-grotesk.css b/assets/css/space-grotesk.css new file mode 100644 index 0000000..3383521 --- /dev/null +++ b/assets/css/space-grotesk.css @@ -0,0 +1,135 @@ +/* vietnamese */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(https://fonts.gstatic.com/s/spacegrotesk/v16/V8mDoQDjQSkFtoMM3T6r8E7mPb54C-s0.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(https://fonts.gstatic.com/s/spacegrotesk/v16/V8mDoQDjQSkFtoMM3T6r8E7mPb94C-s0.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(https://fonts.gstatic.com/s/spacegrotesk/v16/V8mDoQDjQSkFtoMM3T6r8E7mPbF4Cw.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* vietnamese */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/spacegrotesk/v16/V8mDoQDjQSkFtoMM3T6r8E7mPb54C-s0.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/spacegrotesk/v16/V8mDoQDjQSkFtoMM3T6r8E7mPb94C-s0.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(https://fonts.gstatic.com/s/spacegrotesk/v16/V8mDoQDjQSkFtoMM3T6r8E7mPbF4Cw.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* vietnamese */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(https://fonts.gstatic.com/s/spacegrotesk/v16/V8mDoQDjQSkFtoMM3T6r8E7mPb54C-s0.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(https://fonts.gstatic.com/s/spacegrotesk/v16/V8mDoQDjQSkFtoMM3T6r8E7mPb94C-s0.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(https://fonts.gstatic.com/s/spacegrotesk/v16/V8mDoQDjQSkFtoMM3T6r8E7mPbF4Cw.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* vietnamese */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(https://fonts.gstatic.com/s/spacegrotesk/v16/V8mDoQDjQSkFtoMM3T6r8E7mPb54C-s0.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(https://fonts.gstatic.com/s/spacegrotesk/v16/V8mDoQDjQSkFtoMM3T6r8E7mPb94C-s0.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(https://fonts.gstatic.com/s/spacegrotesk/v16/V8mDoQDjQSkFtoMM3T6r8E7mPbF4Cw.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* vietnamese */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(https://fonts.gstatic.com/s/spacegrotesk/v16/V8mDoQDjQSkFtoMM3T6r8E7mPb54C-s0.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(https://fonts.gstatic.com/s/spacegrotesk/v16/V8mDoQDjQSkFtoMM3T6r8E7mPb94C-s0.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(https://fonts.gstatic.com/s/spacegrotesk/v16/V8mDoQDjQSkFtoMM3T6r8E7mPbF4Cw.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/assets/dropdown/css/style.css b/assets/dropdown/css/style.css new file mode 100644 index 0000000..787288c --- /dev/null +++ b/assets/dropdown/css/style.css @@ -0,0 +1,265 @@ +.navbar-dropdown { + left: 0; + padding: 0; + position: absolute; + right: 0; + top: 0; + transition: all 0.45s ease; + z-index: 1030; + background: #282828; } + .navbar-dropdown .navbar-logo { + margin-right: 0.8rem; + transition: margin 0.3s ease-in-out; + vertical-align: middle; } + .navbar-dropdown .navbar-logo img { + height: 3.125rem; + transition: all 0.3s ease-in-out; } + .navbar-dropdown .navbar-logo.mbr-iconfont { + font-size: 3.125rem; + line-height: 3.125rem; } + .navbar-dropdown .navbar-caption { + font-weight: 700; + white-space: normal; + vertical-align: -4px; + line-height: 3.125rem !important; } + .navbar-dropdown .navbar-caption, .navbar-dropdown .navbar-caption:hover { + color: inherit; + text-decoration: none; } + .navbar-dropdown .mbr-iconfont + .navbar-caption { + vertical-align: -1px; } + .navbar-dropdown.navbar-fixed-top { + position: fixed; } + .navbar-dropdown .navbar-brand span { + vertical-align: -4px; } + .navbar-dropdown.bg-color.transparent { + background: none; } + .navbar-dropdown.navbar-short .navbar-brand { + padding: 0.625rem 0; } + .navbar-dropdown.navbar-short .navbar-brand span { + vertical-align: -1px; } + .navbar-dropdown.navbar-short .navbar-caption { + line-height: 2.375rem !important; + vertical-align: -2px; } + .navbar-dropdown.navbar-short .navbar-logo { + margin-right: 0.5rem; } + .navbar-dropdown.navbar-short .navbar-logo img { + height: 2.375rem; } + .navbar-dropdown.navbar-short .navbar-logo.mbr-iconfont { + font-size: 2.375rem; + line-height: 2.375rem; } + .navbar-dropdown.navbar-short .mbr-table-cell { + height: 3.625rem; } + .navbar-dropdown .navbar-close { + left: 0.6875rem; + position: fixed; + top: 0.75rem; + z-index: 1000; } + .navbar-dropdown .hamburger-icon { + content: ""; + display: inline-block; + vertical-align: middle; + width: 16px; + -webkit-box-shadow: 0 -6px 0 1px #282828,0 0 0 1px #282828,0 6px 0 1px #282828; + -moz-box-shadow: 0 -6px 0 1px #282828,0 0 0 1px #282828,0 6px 0 1px #282828; + box-shadow: 0 -6px 0 1px #282828,0 0 0 1px #282828,0 6px 0 1px #282828; } + +.dropdown-menu .dropdown-toggle[data-toggle="dropdown-submenu"]::after { + border-bottom: 0.35em solid transparent; + border-left: 0.35em solid; + border-right: 0; + border-top: 0.35em solid transparent; + margin-left: 0.3rem; } + +.dropdown-menu .dropdown-item:focus { + outline: 0; } + +.nav-dropdown { + font-size: 0.75rem; + font-weight: 500; + height: auto !important; } + .nav-dropdown .nav-btn { + padding-left: 1rem; } + .nav-dropdown .link { + margin: .667em 1.667em; + font-weight: 500; + padding: 0; + transition: color .2s ease-in-out; } + .nav-dropdown .link.dropdown-toggle { + margin-right: 2.583em; } + .nav-dropdown .link.dropdown-toggle::after { + margin-left: .25rem; + border-top: 0.35em solid; + border-right: 0.35em solid transparent; + border-left: 0.35em solid transparent; + border-bottom: 0; } + .nav-dropdown .link.dropdown-toggle[aria-expanded="true"] { + margin: 0; + padding: 0.667em 3.263em 0.667em 1.667em; } + .nav-dropdown .link::after, + .nav-dropdown .dropdown-item::after { + color: inherit; } + .nav-dropdown .btn { + font-size: 0.75rem; + font-weight: 700; + letter-spacing: 0; + margin-bottom: 0; + padding-left: 1.25rem; + padding-right: 1.25rem; } + .nav-dropdown .dropdown-menu { + border-radius: 0; + border: 0; + left: 0; + margin: 0; + padding-bottom: 1.25rem; + padding-top: 1.25rem; + position: relative; } + .nav-dropdown .dropdown-submenu { + margin-left: 0.125rem; + top: 0; } + .nav-dropdown .dropdown-item { + font-weight: 500; + line-height: 2; + padding: 0.3846em 4.615em 0.3846em 1.5385em; + position: relative; + transition: color .2s ease-in-out, background-color .2s ease-in-out; } + .nav-dropdown .dropdown-item::after { + margin-top: -0.3077em; + position: absolute; + right: 1.1538em; + top: 50%; } + .nav-dropdown .dropdown-item:focus, .nav-dropdown .dropdown-item:hover { + background: none; } + +@media (max-width: 767px) { + .nav-dropdown.navbar-toggleable-sm { + bottom: 0; + display: none; + left: 0; + overflow-x: hidden; + position: fixed; + top: 0; + transform: translateX(-100%); + -ms-transform: translateX(-100%); + -webkit-transform: translateX(-100%); + width: 18.75rem; + z-index: 999; } } +.nav-dropdown.navbar-toggleable-xl { + bottom: 0; + display: none; + left: 0; + overflow-x: hidden; + position: fixed; + top: 0; + transform: translateX(-100%); + -ms-transform: translateX(-100%); + -webkit-transform: translateX(-100%); + width: 18.75rem; + z-index: 999; } + +.nav-dropdown-sm { + display: block !important; + overflow-x: hidden; + overflow: auto; + padding-top: 3.875rem; } + .nav-dropdown-sm::after { + content: ""; + display: block; + height: 3rem; + width: 100%; } + .nav-dropdown-sm.collapse.in ~ .navbar-close { + display: block !important; } + .nav-dropdown-sm.collapsing, .nav-dropdown-sm.collapse.in { + transform: translateX(0); + -ms-transform: translateX(0); + -webkit-transform: translateX(0); + transition: all 0.25s ease-out; + -webkit-transition: all 0.25s ease-out; + background: #282828; } + .nav-dropdown-sm.collapsing[aria-expanded="false"] { + transform: translateX(-100%); + -ms-transform: translateX(-100%); + -webkit-transform: translateX(-100%); } + .nav-dropdown-sm .nav-item { + display: block; + margin-left: 0 !important; + padding-left: 0; } + .nav-dropdown-sm .link, + .nav-dropdown-sm .dropdown-item { + border-top: 1px dotted rgba(255, 255, 255, 0.1); + font-size: 0.8125rem; + line-height: 1.6; + margin: 0 !important; + padding: 0.875rem 2.4rem 0.875rem 1.5625rem !important; + position: relative; + white-space: normal; } + .nav-dropdown-sm .link:focus, .nav-dropdown-sm .link:hover, + .nav-dropdown-sm .dropdown-item:focus, + .nav-dropdown-sm .dropdown-item:hover { + background: rgba(0, 0, 0, 0.2) !important; + color: #c0a375; } + .nav-dropdown-sm .nav-btn { + position: relative; + padding: 1.5625rem 1.5625rem 0 1.5625rem; } + .nav-dropdown-sm .nav-btn::before { + border-top: 1px dotted rgba(255, 255, 255, 0.1); + content: ""; + left: 0; + position: absolute; + top: 0; + width: 100%; } + .nav-dropdown-sm .nav-btn + .nav-btn { + padding-top: 0.625rem; } + .nav-dropdown-sm .nav-btn + .nav-btn::before { + display: none; } + .nav-dropdown-sm .btn { + padding: 0.625rem 0; } + .nav-dropdown-sm .dropdown-toggle[data-toggle="dropdown-submenu"]::after { + margin-left: .25rem; + border-top: 0.35em solid; + border-right: 0.35em solid transparent; + border-left: 0.35em solid transparent; + border-bottom: 0; } + .nav-dropdown-sm .dropdown-toggle[data-toggle="dropdown-submenu"][aria-expanded="true"]::after { + border-top: 0; + border-right: 0.35em solid transparent; + border-left: 0.35em solid transparent; + border-bottom: 0.35em solid; } + .nav-dropdown-sm .dropdown-menu { + margin: 0; + padding: 0; + position: relative; + top: 0; + left: 0; + width: 100%; + border: 0; + float: none; + border-radius: 0; + background: none; } + .nav-dropdown-sm .dropdown-submenu { + left: 100%; + margin-left: 0.125rem; + margin-top: -1.25rem; + top: 0; } + +.navbar-toggleable-sm .nav-dropdown .dropdown-menu { + position: absolute; } + +.navbar-toggleable-sm .nav-dropdown .dropdown-submenu { + left: 100%; + margin-left: 0.125rem; + margin-top: -1.25rem; + top: 0; } + +.navbar-toggleable-sm.opened .nav-dropdown .dropdown-menu { + position: relative; } + +.navbar-toggleable-sm.opened .nav-dropdown .dropdown-submenu { + left: 0; + margin-left: 00rem; + margin-top: 0rem; + top: 0; } + +.is-builder .nav-dropdown.collapsing { + transition: none !important; } + + diff --git a/assets/dropdown/js/navbar-dropdown.js b/assets/dropdown/js/navbar-dropdown.js new file mode 100644 index 0000000..8496cf4 --- /dev/null +++ b/assets/dropdown/js/navbar-dropdown.js @@ -0,0 +1,6 @@ + +(function(){function d(a){"resize"===a.type&&(document.body.classList.remove("navbar-dropdown-open"),document.querySelector(".navbar-dropdown").querySelector(".navbar-collapse").classList.remove("show"),document.querySelector(".navbar-dropdown").classList.remove("opened"),Array.from(document.querySelector(".navbar-dropdown").querySelectorAll('.navbar-toggler[aria-expanded="true"]')).forEach(function(a){var b=a.querySelector(a.getAttribute("data-target"));b&&(b.classList.remove("in"),b.setAttribute("aria-expanded", +"false"),a.setAttribute("aria-expanded","false"))}));var b=document.documentElement.scrollTop;Array.from(document.querySelectorAll(".navbar-dropdown")).forEach(function(a){a.matches(".navbar-fixed-top")&&(a.matches(".transparent")&&!a.classList.contains("opened")&&(0 admin.member === userState.accountAddress && admin.isAdmin); +} + +document.addEventListener('DOMContentLoaded', async () => { + const isAdmin = await verifyUserIsAdmin(); + + if (isAdmin) { + console.log(`User is an Admin, buttons for MA Tools not removed. userState.isAdmin = ${userState.isMinterAdmin}`); + } else { + // Remove all "TOOLS" links and their related elements + const toolsLinks = document.querySelectorAll('a[href="TOOLS"]'); + toolsLinks.forEach(link => { + // If the link is within a button, remove the button + const buttonParent = link.closest('button'); + if (buttonParent) { + buttonParent.remove(); + } + + // If the link is within an image card or any other element, remove that element + const cardParent = link.closest('.item.features-image'); + if (cardParent) { + cardParent.remove(); + } + + // Finally, remove the link itself if it's not covered by the above removals + link.remove(); + }); + + console.log(`User is NOT a Minter Admin, buttons for MA Tools removed. userState.isMinterAdmin = ${userState.isMinterAdmin}`); + + // Center the remaining card if it exists + const remainingCard = document.querySelector('.features7 .row .item.features-image'); + if (remainingCard) { + remainingCard.classList.remove('col-lg-6', 'col-md-6'); + remainingCard.classList.add('col-12', 'text-center'); + } + + return; + } + + // Add event listener for admin tools link if the user is an admin + const toolsLinks = document.querySelectorAll('a[href="TOOLS"]'); + toolsLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + if (!userState.isLoggedIn) { + await login(); + } + await loadMinterAdminToolsPage(); + }); + }); +}); + + +async function loadMinterAdminToolsPage() { + // Remove all body content except for menu elements + const bodyChildren = document.body.children; + for (let i = bodyChildren.length - 1; i >= 0; i--) { + const child = bodyChildren[i]; + if (!child.classList.contains('menu')) { + child.remove(); + } + } + + const avatarUrl = `/arbitrary/THUMBNAIL/${userState.accountName}/qortal_avatar`; + + // Set the background image directly from a file + const mainContent = document.createElement('div'); + mainContent.innerHTML = ` +
+
+

MINTER ADMIN TOOLS for Admin =

+ +
+ +
+
+ + + +
+
+
+
+ `; + document.body.appendChild(mainContent); + + addToolsPageEventListeners(); +} + +function addToolsPageEventListeners() { + document.getElementById("display-pending").addEventListener("click", async () => { + await displayPendingApprovals(); + }); + + document.getElementById("create-group-invite").addEventListener("click", async () => { + createPendingGroupInvite(); + }); + + document.getElementById("create-promotion").addEventListener("click", async () => { + createPendingPromotion(); + }); +} + +// Fetch and display pending approvals +async function displayPendingApprovals() { + console.log("Fetching pending approval transactions..."); + const response = await qortalRequest({ + action: "SEARCH_TRANSACTIONS", + txGroupId: 694, + txType: [ + "ADD_GROUP_ADMIN", + "GROUP_INVITE" + ], + confirmationStatus: "UNCONFIRMED", + limit: 0, + offset: 0, + reverse: false + }); + + console.log("Fetched pending approvals: ", response); + + const toolsWindow = document.getElementById('tools-window'); + if (response && response.length > 0) { + toolsWindow.innerHTML = response.map(tx => ` +
+

Transaction Type: ${tx.type}

+

Amount: ${tx.amount}

+

Creator Address: ${tx.creatorAddress}

+

Recipient: ${tx.recipient}

+

Timestamp: ${new Date(tx.timestamp).toLocaleString()}

+ +
+ `).join(''); + } else { + toolsWindow.innerHTML = '

No pending approvals found.

'; + } +} + +// Placeholder function to create a pending group invite +async function createPendingGroupInvite() { + console.log("Creating a pending group invite..."); + // Placeholder code for creating a pending group invite + alert('Pending group invite created (placeholder).'); +} + +// Placeholder function to create a pending promotion +async function createPendingPromotion() { + console.log("Creating a pending promotion..."); + // Placeholder code for creating a pending promotion + alert('Pending promotion created (placeholder).'); +} + +// Placeholder function for approving a transaction +function approveTransaction(signature) { + console.log("Approving transaction with signature: ", signature); + // Placeholder code for approving transaction + alert(`Transaction with signature ${signature} approved (placeholder).`); +} diff --git a/assets/js/BACKUP/AdminTools-backup-before-linksCardEdit.js b/assets/js/BACKUP/AdminTools-backup-before-linksCardEdit.js new file mode 100644 index 0000000..59c816b --- /dev/null +++ b/assets/js/BACKUP/AdminTools-backup-before-linksCardEdit.js @@ -0,0 +1,157 @@ +let currentMinterToolPage = 'overview'; // Track the current page + +// Load latest state for admin verification +async function verifyMinterAdminState() { + const minterGroupAdmins = await fetchMinterGroupAdmins(); + return minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) +} + +document.addEventListener('DOMContentLoaded', async () => { + const isAdmin = await verifyUserIsAdmin(); + + if (isAdmin) { + console.log(`User is an Admin, buttons for MA Tools not removed. userState.isAdmin = ${userState.isMinterAdmin}`); + } else { + // Remove all "TOOLS" links and their related elements + const toolsLinks = document.querySelectorAll('a[href="TOOLS"]'); + toolsLinks.forEach(link => { + // If the link is within a button, remove the button + const buttonParent = link.closest('button'); + if (buttonParent) { + buttonParent.remove(); + } + + // If the link is within an image card or any other element, remove that element + const cardParent = link.closest('.item.features-image'); + if (cardParent) { + cardParent.remove(); + } + + // Finally, remove the link itself if it's not covered by the above removals + link.remove(); + }); + + console.log(`User is NOT a Minter Admin, buttons for MA Tools removed. userState.isMinterAdmin = ${userState.isMinterAdmin}`); + + // Center the remaining card if it exists + const remainingCard = document.querySelector('.features7 .row .item.features-image'); + if (remainingCard) { + remainingCard.classList.remove('col-lg-6', 'col-md-6'); + remainingCard.classList.add('col-12', 'text-center'); + } + + return; + } + + // Add event listener for admin tools link if the user is an admin + const toolsLinks = document.querySelectorAll('a[href="TOOLS"]'); + toolsLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + await loadMinterAdminToolsPage(); + }); + }); +}); + + +async function loadMinterAdminToolsPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + // Set the background image directly from a file + const mainContent = document.createElement('div'); + mainContent.innerHTML = ` +
+
+ MINTER ADMIN TOOLS (Alpha) +
+
+
+ + + +
+
+
+
+ `; + document.body.appendChild(mainContent); + + addToolsPageEventListeners(); + } + + +function addToolsPageEventListeners() { + document.getElementById("display-pending").addEventListener("click", async () => { + await displayPendingApprovals(); + }); + + document.getElementById("create-group-invite").addEventListener("click", async () => { + createPendingGroupInvite(); + }); + + document.getElementById("create-promotion").addEventListener("click", async () => { + createPendingPromotion(); + }); +} + +// Fetch and display pending approvals +async function displayPendingApprovals() { + console.log("Fetching pending approval transactions..."); + const response = await qortalRequest({ + action: "SEARCH_TRANSACTIONS", + txGroupId: 694, + txType: [ + "ADD_GROUP_ADMIN", + "GROUP_INVITE" + ], + confirmationStatus: "UNCONFIRMED", + limit: 0, + offset: 0, + reverse: false + }); + + console.log("Fetched pending approvals: ", response); + + const toolsWindow = document.getElementById('tools-window'); + if (response && response.length > 0) { + toolsWindow.innerHTML = response.map(tx => ` +
+

Transaction Type: ${tx.type}

+

Amount: ${tx.amount}

+

Creator Address: ${tx.creatorAddress}

+

Recipient: ${tx.recipient}

+

Timestamp: ${new Date(tx.timestamp).toLocaleString()}

+ +
+ `).join(''); + } else { + toolsWindow.innerHTML = '

No pending approvals found.

'; + } +} + +// Placeholder function to create a pending group invite +async function createPendingGroupInvite() { + console.log("Creating a pending group invite..."); + // Placeholder code for creating a pending group invite + alert('Pending group invite created (placeholder).'); +} + +// Placeholder function to create a pending promotion +async function createPendingPromotion() { + console.log("Creating a pending promotion..."); + // Placeholder code for creating a pending promotion + alert('Pending promotion created (placeholder).'); +} + +// Placeholder function for approving a transaction +function approveTransaction(signature) { + console.log("Approving transaction with signature: ", signature); + // Placeholder code for approving transaction + alert(`Transaction with signature ${signature} approved (placeholder).`); +} diff --git a/assets/js/BACKUP/AdminTools.js-notworkingwell-nov-29-2024.js b/assets/js/BACKUP/AdminTools.js-notworkingwell-nov-29-2024.js new file mode 100644 index 0000000..20c690c --- /dev/null +++ b/assets/js/BACKUP/AdminTools.js-notworkingwell-nov-29-2024.js @@ -0,0 +1,157 @@ +let currentMinterToolPage = 'overview'; // Track the current page + +// Load latest state for admin verification +async function verifyMinterAdminState() { + const minterGroupAdmins = await fetchMinterGroupAdmins(); + return minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) +} + +document.addEventListener('DOMContentLoaded', async () => { + const isAdmin = await verifyUserIsAdmin(); + + if (isAdmin) { + console.log(`User is an Admin, buttons for MA Tools not removed. userState.isAdmin = ${userState.isMinterAdmin}`); + } else { + // Remove all "TOOLS" links and their related elements + const toolsLinks = document.querySelectorAll('a[href="TOOLS"]'); + toolsLinks.forEach(link => { + // If the link is within a button, remove the button + const buttonParent = link.closest('button'); + if (buttonParent) { + buttonParent.remove(); + } + + // If the link is within an image card or any other element, remove that element + const cardParent = link.closest('.item.features-image'); + if (cardParent) { + cardParent.remove(); + } + + // Finally, remove the link itself if it's not covered by the above removals + link.remove(); + }); + + console.log(`User is NOT a Minter Admin, buttons for MA Tools removed. userState.isMinterAdmin = ${userState.isMinterAdmin}`); + + // Center the remaining card if it exists + const remainingCard = document.querySelector('.features7 .row .item.features-image'); + if (remainingCard) { + remainingCard.classList.remove('col-lg-6', 'col-md-6'); + remainingCard.classList.add('col-12', 'text-center'); + } + + return; + } + + // Add event listener for admin tools link if the user is an admin + const toolsLinks = document.querySelectorAll('a[href="TOOLS"]'); + toolsLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + await loadMinterAdminToolsPage(); + }); + }); +}); + + +async function loadMinterAdminToolsPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + // Set the background image directly from a file + const mainContent = document.createElement('div'); + mainContent.innerHTML = ` +
+
+ MINTER ADMIN TOOLS (Alpha) +
+
+
+ + + +
+
+
+
+ `; + document.body.appendChild(mainContent); + + addToolsPageEventListeners(); + } + + +function addToolsPageEventListeners() { + document.getElementById("display-pending").addEventListener("click", async () => { + await displayPendingApprovals(); + }); + + document.getElementById("create-group-invite").addEventListener("click", async () => { + createPendingGroupInvite(); + }); + + document.getElementById("create-promotion").addEventListener("click", async () => { + createPendingPromotion(); + }); +} + +// Fetch and display pending approvals +async function displayPendingApprovals() { + console.log("Fetching pending approval transactions..."); + const response = await qortalRequest({ + action: "SEARCH_TRANSACTIONS", + txGroupId: 694, + txType: [ + "ADD_GROUP_ADMIN", + "GROUP_INVITE" + ], + confirmationStatus: "UNCONFIRMED", + limit: 0, + offset: 0, + reverse: false + }); + + console.log("Fetched pending approvals: ", response); + + const toolsWindow = document.getElementById('tools-window'); + if (response && response.length > 0) { + toolsWindow.innerHTML = response.map(tx => ` +
+

Transaction Type: ${tx.type}

+

Amount: ${tx.amount}

+

Creator Address: ${tx.creatorAddress}

+

Recipient: ${tx.recipient}

+

Timestamp: ${new Date(tx.timestamp).toLocaleString()}

+ +
+ `).join(''); + } else { + toolsWindow.innerHTML = '

No pending approvals found.

'; + } +} + +// Placeholder function to create a pending group invite +async function createPendingGroupInvite() { + console.log("Creating a pending group invite..."); + // Placeholder code for creating a pending group invite + alert('Pending group invite created (placeholder).'); +} + +// Placeholder function to create a pending promotion +async function createPendingPromotion() { + console.log("Creating a pending promotion..."); + // Placeholder code for creating a pending promotion + alert('Pending promotion created (placeholder).'); +} + +// Placeholder function for approving a transaction +function approveTransaction(signature) { + console.log("Approving transaction with signature: ", signature); + // Placeholder code for approving transaction + alert(`Transaction with signature ${signature} approved (placeholder).`); +} diff --git a/assets/js/BACKUP/BU-Q-Mintership-ScrollingWeirdness-1841PM-11-18-2024.js b/assets/js/BACKUP/BU-Q-Mintership-ScrollingWeirdness-1841PM-11-18-2024.js new file mode 100644 index 0000000..ec87a77 --- /dev/null +++ b/assets/js/BACKUP/BU-Q-Mintership-ScrollingWeirdness-1841PM-11-18-2024.js @@ -0,0 +1,317 @@ +const messageIdentifierPrefix = `mintership-forum-message`; + +let replyToMessageIdentifier = null; +let latestMessageIdentifiers = {}; // To keep track of the latest message in each room +let currentPage = 0; // Track current pagination page + +// Load the latest message identifiers from local storage +if (localStorage.getItem("latestMessageIdentifiers")) { + latestMessageIdentifiers = JSON.parse(localStorage.getItem("latestMessageIdentifiers")); +} + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLinks = document.querySelectorAll('a[href="MINTERSHIP-FORUM"]'); + + mintershipForumLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + await login(); // Assuming login is an async function + await loadForumPage(); + loadRoomContent("general"); // Automatically load General Room on forum load + startPollingForNewMessages(); // Start polling for new messages after loading the forum page + }); + }); +}); + +async function loadForumPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + // Check if user is an admin + const minterGroupAdmins = await fetchMinterGroupAdmins(); + const isUserAdmin = minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) || await verifyUserIsAdmin(); + + // Create the forum layout, including a header, sub-menu, and keeping the original background imagestyle="background-image: url('/assets/images/background.jpg');"> + const mainContent = document.createElement('div'); + // const backgroundImage = document.querySelector('.header1')?.style.backgroundImage; + const backgroundImage = "url('/assets/images/background.jpg')" + mainContent.innerHTML = ` +
+
+ +
+
+
+ + ${isUserAdmin ? '' : ''} + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("minters"); + }); + if (isUserAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("general"); + }); +} + +function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+
+
+
+ +
+ +
+ `; + + // Initialize Quill editor for rich text input + const quill = new Quill('#editor', { + theme: 'snow', + modules: { + toolbar: [ + [{ 'font': [] }], // Add font family options + [{ 'size': ['small', false, 'large', 'huge'] }], // Add font size options + [{ 'header': [1, 2, false] }], + ['bold', 'italic', 'underline'], // Text formatting options + [{ 'list': 'ordered'}, { 'list': 'bullet' }], + ['link', 'blockquote', 'code-block'], + [{ 'color': [] }, { 'background': [] }], // Text color and background color options + [{ 'align': [] }], // Text alignment + ['clean'] // Remove formatting button + ] + } + }); + + // Load messages from QDN for the selected room + loadMessagesFromQDN(room, currentPage); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "") { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + + // Create message object with unique identifier and HTML content + const messageObject = { + messageHtml: messageHtml, + hasAttachment: false, + replyTo: replyToMessageIdentifier + }; + + try { + // Convert message object to base64 + let base64Message = await objectToBase64(messageObject); + if (!base64Message) { + console.log(`initial object creation with object failed, using btoa...`) + base64Message = btoa(JSON.stringify(messageObject)); + } + + console.log("Message Object:", messageObject); + console.log("Base64 Encoded Message:", base64Message); + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, // Publisher must own the registered name + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + console.log("Message published successfully"); + // Clear the editor after sending the message + quill.root.innerHTML = ""; + replyToMessageIdentifier = null; // Clear reply reference after sending + // Clear reply reference after sending if it exists. + if (replyToMessageIdentifier) { + replyToMessageIdentifier = null; + replyContainer.remove(); + } + replyToMessageIdentifier = null; + replyContainer.remove(); + // Update the latest message identifier + latestMessageIdentifiers[room] = messageIdentifier; + localStorage.setItem("latestMessageIdentifiers", JSON.stringify(latestMessageIdentifiers)); + // Reload messages + loadMessagesFromQDN(room, currentPage); + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + + // Add event listener for the load more button + document.getElementById("load-more-button").addEventListener("click", () => { + currentPage++; + loadMessagesFromQDN(room, currentPage); + }); + } +} + +// Load messages for any given room with pagination +async function loadMessagesFromQDN(room, page) { + try { + const offset = page * 10; + const limit = 10; + const response = await searchAllResources(`${messageIdentifierPrefix}-${room}`, offset, limit); + + const qdnMessages = response; + console.log("Messages fetched successfully:", qdnMessages); + + const messagesContainer = document.querySelector("#messages-container"); + if (messagesContainer) { + if (!qdnMessages || !qdnMessages.length) { + if (page === 0) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + } + return; + } + + // Clear messages only when loading the first page + if (page === 0) { + messagesContainer.innerHTML = ""; + } + + // Fetch all messages + const fetchMessages = await Promise.all(qdnMessages.map(async (resource) => { + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data if no 'encoding: base64' is set. + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { name: resource.name, content: messageObject.messageHtml, date: formattedTimestamp, identifier: resource.identifier, replyTo: messageObject.replyTo }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + // Render messages without duplication + const existingIdentifiers = new Set(Array.from(messagesContainer.querySelectorAll('.message-item')).map(item => item.dataset.identifier)); + + fetchMessages.forEach((message) => { + if (message && !existingIdentifiers.has(message.identifier)) { + let replyHtml = ""; + if (message.replyTo) { + const repliedMessage = fetchMessages.find(m => m && m.identifier === message.replyTo); + if (repliedMessage) { + replyHtml = ` +
+
In reply to: ${repliedMessage.name} ${repliedMessage.date}
+
${repliedMessage.content}
+
+ `; + } + } + + const isNewMessage = !latestMessageIdentifiers[room] || new Date(message.date) > new Date(latestMessageIdentifiers[room]); + + const messageHTML = ` +
+ ${replyHtml} +
+ ${message.name} + ${message.date} + ${isNewMessage ? 'NEW' : ''} +
+
${message.content}
+ +
+ `; + + messagesContainer.insertAdjacentHTML('beforeend', messageHTML); + } + }); + + // setTimeout(() => { + // messagesContainer.scrollTop = messagesContainer.scrollHeight; + // }, 1000); + + // Add event listeners to the reply buttons + const replyButtons = document.querySelectorAll(".reply-button"); + + replyButtons.forEach(button => { + button.addEventListener("click", () => { + replyToMessageIdentifier = button.dataset.messageIdentifier; + // Find the message being replied to + const repliedMessage = fetchMessages.find(m => m && m.identifier === replyToMessageIdentifier); + + if (repliedMessage) { + const replyContainer = document.createElement("div"); + replyContainer.className = "reply-container"; + replyContainer.innerHTML = ` +
+ Replying to: ${repliedMessage.content} + +
+ `; + + const messageInputSection = document.querySelector(".message-input-section"); + + if (messageInputSection) { + messageInputSection.insertBefore(replyContainer, messageInputSection.firstChild); + + // Add a listener for the cancel reply button + document.getElementById("cancel-reply").addEventListener("click", () => { + replyToMessageIdentifier = null; + replyContainer.remove(); + }); + } + } + }); + }); + + } + } catch (error) { + console.error('Error loading messages from QDN:', error); + } +} + + +// Polling function to check for new messages +function startPollingForNewMessages() { + setInterval(async () => { + const activeRoom = document.querySelector('.room-title')?.innerText.toLowerCase().split(" ")[0]; + if (activeRoom) { + await loadMessagesFromQDN(activeRoom, currentPage); + } + }, 20000); +} diff --git a/assets/js/BACKUP/BU-Q-Mintership-ScrollingWeirdness-1941PM-11-18-2024.js b/assets/js/BACKUP/BU-Q-Mintership-ScrollingWeirdness-1941PM-11-18-2024.js new file mode 100644 index 0000000..ec87a77 --- /dev/null +++ b/assets/js/BACKUP/BU-Q-Mintership-ScrollingWeirdness-1941PM-11-18-2024.js @@ -0,0 +1,317 @@ +const messageIdentifierPrefix = `mintership-forum-message`; + +let replyToMessageIdentifier = null; +let latestMessageIdentifiers = {}; // To keep track of the latest message in each room +let currentPage = 0; // Track current pagination page + +// Load the latest message identifiers from local storage +if (localStorage.getItem("latestMessageIdentifiers")) { + latestMessageIdentifiers = JSON.parse(localStorage.getItem("latestMessageIdentifiers")); +} + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLinks = document.querySelectorAll('a[href="MINTERSHIP-FORUM"]'); + + mintershipForumLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + await login(); // Assuming login is an async function + await loadForumPage(); + loadRoomContent("general"); // Automatically load General Room on forum load + startPollingForNewMessages(); // Start polling for new messages after loading the forum page + }); + }); +}); + +async function loadForumPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + // Check if user is an admin + const minterGroupAdmins = await fetchMinterGroupAdmins(); + const isUserAdmin = minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) || await verifyUserIsAdmin(); + + // Create the forum layout, including a header, sub-menu, and keeping the original background imagestyle="background-image: url('/assets/images/background.jpg');"> + const mainContent = document.createElement('div'); + // const backgroundImage = document.querySelector('.header1')?.style.backgroundImage; + const backgroundImage = "url('/assets/images/background.jpg')" + mainContent.innerHTML = ` +
+
+ +
+
+
+ + ${isUserAdmin ? '' : ''} + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("minters"); + }); + if (isUserAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("general"); + }); +} + +function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+
+
+
+ +
+ +
+ `; + + // Initialize Quill editor for rich text input + const quill = new Quill('#editor', { + theme: 'snow', + modules: { + toolbar: [ + [{ 'font': [] }], // Add font family options + [{ 'size': ['small', false, 'large', 'huge'] }], // Add font size options + [{ 'header': [1, 2, false] }], + ['bold', 'italic', 'underline'], // Text formatting options + [{ 'list': 'ordered'}, { 'list': 'bullet' }], + ['link', 'blockquote', 'code-block'], + [{ 'color': [] }, { 'background': [] }], // Text color and background color options + [{ 'align': [] }], // Text alignment + ['clean'] // Remove formatting button + ] + } + }); + + // Load messages from QDN for the selected room + loadMessagesFromQDN(room, currentPage); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "") { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + + // Create message object with unique identifier and HTML content + const messageObject = { + messageHtml: messageHtml, + hasAttachment: false, + replyTo: replyToMessageIdentifier + }; + + try { + // Convert message object to base64 + let base64Message = await objectToBase64(messageObject); + if (!base64Message) { + console.log(`initial object creation with object failed, using btoa...`) + base64Message = btoa(JSON.stringify(messageObject)); + } + + console.log("Message Object:", messageObject); + console.log("Base64 Encoded Message:", base64Message); + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, // Publisher must own the registered name + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + console.log("Message published successfully"); + // Clear the editor after sending the message + quill.root.innerHTML = ""; + replyToMessageIdentifier = null; // Clear reply reference after sending + // Clear reply reference after sending if it exists. + if (replyToMessageIdentifier) { + replyToMessageIdentifier = null; + replyContainer.remove(); + } + replyToMessageIdentifier = null; + replyContainer.remove(); + // Update the latest message identifier + latestMessageIdentifiers[room] = messageIdentifier; + localStorage.setItem("latestMessageIdentifiers", JSON.stringify(latestMessageIdentifiers)); + // Reload messages + loadMessagesFromQDN(room, currentPage); + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + + // Add event listener for the load more button + document.getElementById("load-more-button").addEventListener("click", () => { + currentPage++; + loadMessagesFromQDN(room, currentPage); + }); + } +} + +// Load messages for any given room with pagination +async function loadMessagesFromQDN(room, page) { + try { + const offset = page * 10; + const limit = 10; + const response = await searchAllResources(`${messageIdentifierPrefix}-${room}`, offset, limit); + + const qdnMessages = response; + console.log("Messages fetched successfully:", qdnMessages); + + const messagesContainer = document.querySelector("#messages-container"); + if (messagesContainer) { + if (!qdnMessages || !qdnMessages.length) { + if (page === 0) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + } + return; + } + + // Clear messages only when loading the first page + if (page === 0) { + messagesContainer.innerHTML = ""; + } + + // Fetch all messages + const fetchMessages = await Promise.all(qdnMessages.map(async (resource) => { + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data if no 'encoding: base64' is set. + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { name: resource.name, content: messageObject.messageHtml, date: formattedTimestamp, identifier: resource.identifier, replyTo: messageObject.replyTo }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + // Render messages without duplication + const existingIdentifiers = new Set(Array.from(messagesContainer.querySelectorAll('.message-item')).map(item => item.dataset.identifier)); + + fetchMessages.forEach((message) => { + if (message && !existingIdentifiers.has(message.identifier)) { + let replyHtml = ""; + if (message.replyTo) { + const repliedMessage = fetchMessages.find(m => m && m.identifier === message.replyTo); + if (repliedMessage) { + replyHtml = ` +
+
In reply to: ${repliedMessage.name} ${repliedMessage.date}
+
${repliedMessage.content}
+
+ `; + } + } + + const isNewMessage = !latestMessageIdentifiers[room] || new Date(message.date) > new Date(latestMessageIdentifiers[room]); + + const messageHTML = ` +
+ ${replyHtml} +
+ ${message.name} + ${message.date} + ${isNewMessage ? 'NEW' : ''} +
+
${message.content}
+ +
+ `; + + messagesContainer.insertAdjacentHTML('beforeend', messageHTML); + } + }); + + // setTimeout(() => { + // messagesContainer.scrollTop = messagesContainer.scrollHeight; + // }, 1000); + + // Add event listeners to the reply buttons + const replyButtons = document.querySelectorAll(".reply-button"); + + replyButtons.forEach(button => { + button.addEventListener("click", () => { + replyToMessageIdentifier = button.dataset.messageIdentifier; + // Find the message being replied to + const repliedMessage = fetchMessages.find(m => m && m.identifier === replyToMessageIdentifier); + + if (repliedMessage) { + const replyContainer = document.createElement("div"); + replyContainer.className = "reply-container"; + replyContainer.innerHTML = ` +
+ Replying to: ${repliedMessage.content} + +
+ `; + + const messageInputSection = document.querySelector(".message-input-section"); + + if (messageInputSection) { + messageInputSection.insertBefore(replyContainer, messageInputSection.firstChild); + + // Add a listener for the cancel reply button + document.getElementById("cancel-reply").addEventListener("click", () => { + replyToMessageIdentifier = null; + replyContainer.remove(); + }); + } + } + }); + }); + + } + } catch (error) { + console.error('Error loading messages from QDN:', error); + } +} + + +// Polling function to check for new messages +function startPollingForNewMessages() { + setInterval(async () => { + const activeRoom = document.querySelector('.room-title')?.innerText.toLowerCase().split(" ")[0]; + if (activeRoom) { + await loadMessagesFromQDN(activeRoom, currentPage); + } + }, 20000); +} diff --git a/assets/js/BACKUP/Q-Mintership-11-21-withAttachments-newer-1801PM.js b/assets/js/BACKUP/Q-Mintership-11-21-withAttachments-newer-1801PM.js new file mode 100644 index 0000000..7ca147e --- /dev/null +++ b/assets/js/BACKUP/Q-Mintership-11-21-withAttachments-newer-1801PM.js @@ -0,0 +1,423 @@ +const messageIdentifierPrefix = `mintership-forum-message`; +const messageAttachmentIdentifierPrefix = `mintership-forum-attachment`; + +let replyToMessageIdentifier = null; +let latestMessageIdentifiers = {}; // To keep track of the latest message in each room +let currentPage = 0; // Track current pagination page +let existingIdentifiers = new Set(); // Keep track of existing identifiers to not pull them more than once. + +// If there is a previous latest message identifiers, use them. Otherwise, use an empty. +if (localStorage.getItem("latestMessageIdentifiers")) { + latestMessageIdentifiers = JSON.parse(localStorage.getItem("latestMessageIdentifiers")); +} + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLinks = document.querySelectorAll('a[href="MINTERSHIP-FORUM"]'); + + mintershipForumLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + await login(); // Assuming login is an async function + await loadForumPage(); + loadRoomContent("general"); // Automatically load General Room on forum load + startPollingForNewMessages(); // Start polling for new messages after loading the forum page + }); + }); +}); + +async function loadForumPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + // Check if user is an admin + // const minterGroupAdmins = await fetchMinterGroupAdmins(); + // const isUserAdmin = minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) || await verifyUserIsAdmin(); + + // Create the forum layout, including a header, sub-menu, and keeping the original background imagestyle="background-image: url('/assets/images/background.jpg');"> + const mainContent = document.createElement('div'); + mainContent.innerHTML = ` +
+
+ +
+
+
+ + ${userState.isAdmin ? '' : ''} + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("minters"); + }); + if (userState.isAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("general"); + }); +} + +function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+
+
+
+
+
+ + +
+ +
+
+ `; + + // Initialize Quill editor for rich text input + const quill = new Quill('#editor', { + theme: 'snow', + modules: { + toolbar: [ + [{ 'font': [] }], // Add font family options + [{ 'size': ['small', false, 'large', 'huge'] }], // Add font size options + [{ 'header': [1, 2, false] }], + ['bold', 'italic', 'underline'], // Text formatting options + [{ 'list': 'ordered'}, { 'list': 'bullet' }], + ['link', 'blockquote', 'code-block'], + [{ 'color': [] }, { 'background': [] }], // Text color and background color options + [{ 'align': [] }], // Text alignment + ['clean'] // Remove formatting button + ] + } + }); + + // Load messages from QDN for the selected room + loadMessagesFromQDN(room, currentPage); + + let selectedFiles = []; + + // Add event listener to handle file selection + document.getElementById('file-input').addEventListener('change', (event) => { + selectedFiles = Array.from(event.target.files); + }); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "" || selectedFiles.length > 0) { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + let attachmentIdentifiers = []; + + // Handle attachments + for (const file of selectedFiles) { + const attachmentID = `${messageAttachmentIdentifierPrefix}-${room}-${randomID}`; + try { + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "FILE", + identifier: attachmentID, + file: file, + filename: file.name, + filetype: file.type, + }); + attachmentIdentifiers.push({ + identifier: attachmentID, + filename: file.name, + mimeType: file.type + }); + console.log(`Attachment ${file.name} published successfully with ID: ${attachmentID}`); + } catch (error) { + console.error(`Error publishing attachment ${file.name}:`, error); + } + } + + // Create message object with unique identifier, HTML content, and attachments + const messageObject = { + messageHtml: messageHtml, + hasAttachment: attachmentIdentifiers.length > 0, + attachments: attachmentIdentifiers, + replyTo: replyToMessageIdentifier + }; + + try { + // Convert message object to base64 + let base64Message = await objectToBase64(messageObject); + if (!base64Message) { + console.log(`initial object creation with object failed, using btoa...`); + base64Message = btoa(JSON.stringify(messageObject)); + } + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + + console.log("Message published successfully"); + + // Clear the editor after sending the message, including any potential attached files and replies. + quill.root.innerHTML = ""; + document.getElementById('file-input').value = ""; + selectedFiles = []; + replyToMessageIdentifier = null; + const replyContainer = document.querySelector(".reply-container"); + if (replyContainer) { + replyContainer.remove() + } + + // Show success notification + const notification = document.createElement('div'); + notification.innerText = "Message published successfully! Message will take a confirmation to show."; + notification.style.color = "green"; + notification.style.marginTop = "10px"; + document.querySelector(".message-input-section").appendChild(notification); + + setTimeout(() => { + notification.remove(); + }, 3000); + + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + + // Add event listener for the load more button + const loadMoreContainer = document.getElementById("load-more-container"); + if (loadMoreContainer) { + loadMoreContainer.innerHTML = ''; + document.getElementById("load-more-button").addEventListener("click", () => { + currentPage++; + loadMessagesFromQDN(room, currentPage); + }); + } + } +} +// Load messages for any given room with pagination +async function loadMessagesFromQDN(room, page, isPolling = false) { + try { + // const offset = page * 10; + const offset = page * 10; + const limit = 20; + + // Get the set of existing identifiers from the messages container + const messagesContainer = document.querySelector("#messages-container"); + existingIdentifiers = new Set(Array.from(messagesContainer.querySelectorAll('.message-item')).map(item => item.dataset.identifier)); + + // Fetch only messages that are not already present in the messages container + const response = await searchAllWithOffset(`${messageIdentifierPrefix}-${room}`, limit, offset); + + if (messagesContainer) { + // If there are no messages and we're not polling, display "no messages" message + if (!response || !response.length) { + if (page === 0 && !isPolling) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + } + return; + } + + // Define `mostRecentMessage` to track the latest message during this fetch + let mostRecentMessage = null; + + // Fetch all messages that haven't been fetched before + const fetchMessages = await Promise.all(response.map(async (resource) => { + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data if no 'encoding: base64' is set. + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { + name: resource.name, + content: messageObject.messageHtml, + date: formattedTimestamp, + identifier: resource.identifier, + replyTo: messageObject.replyTo, + timestamp, + attachments: messageObject.attachments || [] // Include attachments if they exist + }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + // Render new messages without duplication + for (const message of fetchMessages) { + if (message && !existingIdentifiers.has(message.identifier)) { + let replyHtml = ""; + if (message.replyTo) { + const repliedMessage = fetchMessages.find(m => m && m.identifier === message.replyTo); + if (repliedMessage) { + replyHtml = ` +
+
In reply to: ${repliedMessage.name} ${repliedMessage.date}
+
${repliedMessage.content}
+
+ `; + } + } + + const isNewMessage = !latestMessageIdentifiers[room] || new Date(message.date) > new Date(latestMessageIdentifiers[room]?.latestTimestamp); + + let attachmentHtml = ""; + if (message.attachments && message.attachments.length > 0) { + for (const attachment of message.attachments) { + if (attachment.mimeType.startsWith('image/')) { + try { + // Fetch the base64 string for the image + const image = await fetchFileBase64(attachment.service, attachment.name, attachment.identifier); + + // Create a data URL for the Base64 string + const dataUrl = `data:${attachment.mimeType};base64,${image}`; + + // Add the image HTML with the data URL + attachmentHtml += `
${attachment.filename}
`; + } catch (error) { + console.error(`Failed to fetch attachment ${attachment.filename}:`, error); + } + } else { + // Display a button to download other attachments + attachmentHtml += `
+ +
`; + } + } + } + + const messageHTML = ` +
+ ${replyHtml} +
+ ${message.name} + ${message.date} + ${isNewMessage ? 'NEW' : ''} +
+ ${attachmentHtml} +
${message.content}
+ +
+ `; + + // Append new message to the end of the container + messagesContainer.insertAdjacentHTML('beforeend', messageHTML); + + // Track the most recent message + if (!mostRecentMessage || new Date(message.timestamp) > new Date(mostRecentMessage?.timestamp || 0)) { + mostRecentMessage = message; + } + } + } + + // Update latestMessageIdentifiers for the room + if (mostRecentMessage) { + latestMessageIdentifiers[room] = { + latestIdentifier: mostRecentMessage.identifier, + latestTimestamp: mostRecentMessage.timestamp + }; + localStorage.setItem("latestMessageIdentifiers", JSON.stringify(latestMessageIdentifiers)); + } + + // Add event listeners to the reply buttons + const replyButtons = document.querySelectorAll(".reply-button"); + + replyButtons.forEach(button => { + button.addEventListener("click", () => { + replyToMessageIdentifier = button.dataset.messageIdentifier; + // Find the message being replied to + const repliedMessage = fetchMessages.find(m => m && m.identifier === replyToMessageIdentifier); + + if (repliedMessage) { + const replyContainer = document.createElement("div"); + replyContainer.className = "reply-container"; + replyContainer.innerHTML = ` +
+ Replying to: ${repliedMessage.content} + +
+ `; + + if (!document.querySelector(".reply-container")) { + const messageInputSection = document.querySelector(".message-input-section"); + + if (messageInputSection) { + messageInputSection.insertBefore(replyContainer, messageInputSection.firstChild); + + // Add a listener for the cancel reply button + document.getElementById("cancel-reply").addEventListener("click", () => { + replyToMessageIdentifier = null; + replyContainer.remove(); + }); + } + } + const messageInputSection = document.querySelector(".message-input-section"); + const editor = document.querySelector(".ql-editor"); + + if (messageInputSection) { + messageInputSection.scrollIntoView({ behavior: 'smooth', block: 'center' }); + } + + if (editor) { + editor.focus(); + } + } + }) + }) + if (response.length >= limit) { + document.getElementById("load-more-container").style.display = 'block'; + } else { + document.getElementById("load-more-container").style.display = 'none'; + } + } + } catch (error) { + console.error('Error loading messages from QDN:', error); + } +} + +// Polling function to check for new messages without clearing existing ones +function startPollingForNewMessages() { + setInterval(async () => { + const activeRoom = document.querySelector('.room-title')?.innerText.toLowerCase().split(" ")[0]; + if (activeRoom) { + await loadMessagesFromQDN(activeRoom, currentPage, true); + } + }, 20000); +} + diff --git a/assets/js/BACKUP/Q-Mintership-11-21-withAttachments.js b/assets/js/BACKUP/Q-Mintership-11-21-withAttachments.js new file mode 100644 index 0000000..7981e8d --- /dev/null +++ b/assets/js/BACKUP/Q-Mintership-11-21-withAttachments.js @@ -0,0 +1,418 @@ +const messageIdentifierPrefix = `mintership-forum-message`; +const messageAttachmentIdentifierPrefix = `mintership-forum-attachment`; + +let replyToMessageIdentifier = null; +let latestMessageIdentifiers = {}; // To keep track of the latest message in each room +let currentPage = 0; // Track current pagination page +let existingIdentifiers = new Set(); // Keep track of existing identifiers to not pull them more than once. + +// If there is a previous latest message identifiers, use them. Otherwise, use an empty. +if (localStorage.getItem("latestMessageIdentifiers")) { + latestMessageIdentifiers = JSON.parse(localStorage.getItem("latestMessageIdentifiers")); +} + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLinks = document.querySelectorAll('a[href="MINTERSHIP-FORUM"]'); + + mintershipForumLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + await login(); // Assuming login is an async function + await loadForumPage(); + loadRoomContent("general"); // Automatically load General Room on forum load + startPollingForNewMessages(); // Start polling for new messages after loading the forum page + }); + }); +}); + +async function loadForumPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + // Check if user is an admin + // const minterGroupAdmins = await fetchMinterGroupAdmins(); + // const isUserAdmin = minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) || await verifyUserIsAdmin(); + + // Create the forum layout, including a header, sub-menu, and keeping the original background imagestyle="background-image: url('/assets/images/background.jpg');"> + const mainContent = document.createElement('div'); + mainContent.innerHTML = ` +
+
+ +
+
+
+ + ${userState.isAdmin ? '' : ''} + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("minters"); + }); + if (userState.isAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("general"); + }); +} + +function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+ ${(existingIdentifiers.size > 10)? '' : ''} +
+
+
+
+ + +
+ +
+
+ `; + + // Initialize Quill editor for rich text input + const quill = new Quill('#editor', { + theme: 'snow', + modules: { + toolbar: [ + [{ 'font': [] }], // Add font family options + [{ 'size': ['small', false, 'large', 'huge'] }], // Add font size options + [{ 'header': [1, 2, false] }], + ['bold', 'italic', 'underline'], // Text formatting options + [{ 'list': 'ordered'}, { 'list': 'bullet' }], + ['link', 'blockquote', 'code-block'], + [{ 'color': [] }, { 'background': [] }], // Text color and background color options + [{ 'align': [] }], // Text alignment + ['clean'] // Remove formatting button + ] + } + }); + + // Load messages from QDN for the selected room + loadMessagesFromQDN(room, currentPage); + + let selectedFiles = []; + + // Add event listener to handle file selection + document.getElementById('file-input').addEventListener('change', (event) => { + selectedFiles = Array.from(event.target.files); + }); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "" || selectedFiles.length > 0) { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + let attachmentIdentifiers = []; + + // Handle attachments + for (const file of selectedFiles) { + const attachmentID = `${messageAttachmentIdentifierPrefix}-${room}-${randomID}`; + try { + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "FILE", + identifier: attachmentID, + file: file, + filename: file.name, + filetype: file.type, + }); + attachmentIdentifiers.push({ + identifier: attachmentID, + filename: file.name, + mimeType: file.type + }); + console.log(`Attachment ${file.name} published successfully with ID: ${attachmentID}`); + } catch (error) { + console.error(`Error publishing attachment ${file.name}:`, error); + } + } + + // Create message object with unique identifier, HTML content, and attachments + const messageObject = { + messageHtml: messageHtml, + hasAttachment: attachmentIdentifiers.length > 0, + attachments: attachmentIdentifiers, + replyTo: replyToMessageIdentifier + }; + + try { + // Convert message object to base64 + let base64Message = await objectToBase64(messageObject); + if (!base64Message) { + console.log(`initial object creation with object failed, using btoa...`); + base64Message = btoa(JSON.stringify(messageObject)); + } + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + + console.log("Message published successfully"); + + // Clear the editor after sending the message, including any potential attached files and replies. + quill.root.innerHTML = ""; + document.getElementById('file-input').value = ""; + selectedFiles = []; + replyToMessageIdentifier = null; + const replyContainer = document.querySelector(".reply-container"); + if (replyContainer) { + replyContainer.remove() + } + // Update the latest message identifier - DO NOT DO THIS ON PUBLISH, OR MESSAGE WILL NOT BE LOADED CORRECTLY. + // latestMessageIdentifiers[room] = messageIdentifier; + // localStorage.setItem("latestMessageIdentifiers", JSON.stringify(latestMessageIdentifiers)); + + // Show success notification + const notification = document.createElement('div'); + notification.innerText = "Message published successfully! Message will take a confirmation to show."; + notification.style.color = "green"; + notification.style.marginTop = "10px"; + document.querySelector(".message-input-section").appendChild(notification); + + setTimeout(() => { + notification.remove(); + }, 3000); + + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + + // Add event listener for the load more button + document.getElementById("load-more-button").addEventListener("click", () => { + currentPage++; + loadMessagesFromQDN(room, currentPage); + }); + } +} + +// Load messages for any given room with pagination +async function loadMessagesFromQDN(room, page, isPolling = false) { + try { + // const offset = page * 10; + const offset = 0; + const limit = 0; + + // Get the set of existing identifiers from the messages container + const messagesContainer = document.querySelector("#messages-container"); + existingIdentifiers = new Set(Array.from(messagesContainer.querySelectorAll('.message-item')).map(item => item.dataset.identifier)); + + // Fetch only messages that are not already present in the messages container + const response = await searchAllWithoutDuplicates(`${messageIdentifierPrefix}-${room}`, limit, offset, existingIdentifiers); + + if (messagesContainer) { + // If there are no messages and we're not polling, display "no messages" message + if (!response || !response.length) { + if (page === 0 && !isPolling) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + } + return; + } + + // Define `mostRecentMessage` to track the latest message during this fetch + let mostRecentMessage = null; + + // Fetch all messages that haven't been fetched before + const fetchMessages = await Promise.all(response.map(async (resource) => { + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data if no 'encoding: base64' is set. + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { + name: resource.name, + content: messageObject.messageHtml, + date: formattedTimestamp, + identifier: resource.identifier, + replyTo: messageObject.replyTo, + timestamp, + attachments: messageObject.attachments || [] // Include attachments if they exist + }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + // Render new messages without duplication + for (const message of fetchMessages) { + if (message && !existingIdentifiers.has(message.identifier)) { + let replyHtml = ""; + if (message.replyTo) { + const repliedMessage = fetchMessages.find(m => m && m.identifier === message.replyTo); + if (repliedMessage) { + replyHtml = ` +
+
In reply to: ${repliedMessage.name} ${repliedMessage.date}
+
${repliedMessage.content}
+
+ `; + } + } + + const isNewMessage = !latestMessageIdentifiers[room] || new Date(message.date) > new Date(latestMessageIdentifiers[room]?.latestTimestamp); + + let attachmentHtml = ""; + if (message.attachments && message.attachments.length > 0) { + for (const attachment of message.attachments) { + if (attachment.mimeType.startsWith('image/')) { + try { + // Fetch the base64 string for the image + const image = await fetchFileBase64(attachment.service, attachment.name, attachment.identifier); + + // Create a data URL for the Base64 string + const dataUrl = `data:${attachment.mimeType};base64,${image}`; + + // Add the image HTML with the data URL + attachmentHtml += `
${attachment.filename}
`; + } catch (error) { + console.error(`Failed to fetch attachment ${attachment.filename}:`, error); + } + } else { + // Display a button to download other attachments + attachmentHtml += `
+ +
`; + } + } + } + + const messageHTML = ` +
+ ${replyHtml} +
+ ${message.name} + ${message.date} + ${isNewMessage ? 'NEW' : ''} +
+ ${attachmentHtml} +
${message.content}
+ +
+ `; + + // Append new message to the end of the container + messagesContainer.insertAdjacentHTML('beforeend', messageHTML); + + // Track the most recent message + if (!mostRecentMessage || new Date(message.timestamp) > new Date(mostRecentMessage?.timestamp || 0)) { + mostRecentMessage = message; + } + } + } + + // Update latestMessageIdentifiers for the room + if (mostRecentMessage) { + latestMessageIdentifiers[room] = { + latestIdentifier: mostRecentMessage.identifier, + latestTimestamp: mostRecentMessage.timestamp + }; + localStorage.setItem("latestMessageIdentifiers", JSON.stringify(latestMessageIdentifiers)); + } + + // Add event listeners to the reply buttons + const replyButtons = document.querySelectorAll(".reply-button"); + + replyButtons.forEach(button => { + button.addEventListener("click", () => { + replyToMessageIdentifier = button.dataset.messageIdentifier; + // Find the message being replied to + const repliedMessage = fetchMessages.find(m => m && m.identifier === replyToMessageIdentifier); + + if (repliedMessage) { + const replyContainer = document.createElement("div"); + replyContainer.className = "reply-container"; + replyContainer.innerHTML = ` +
+ Replying to: ${repliedMessage.content} + +
+ `; + + if (!document.querySelector(".reply-container")) { + const messageInputSection = document.querySelector(".message-input-section"); + + if (messageInputSection) { + messageInputSection.insertBefore(replyContainer, messageInputSection.firstChild); + + // Add a listener for the cancel reply button + document.getElementById("cancel-reply").addEventListener("click", () => { + replyToMessageIdentifier = null; + replyContainer.remove(); + }); + } + } + const messageInputSection = document.querySelector(".message-input-section"); + const editor = document.querySelector(".ql-editor"); + + if (messageInputSection) { + messageInputSection.scrollIntoView({ behavior: 'smooth', block: 'center' }); + } + + if (editor) { + editor.focus(); + } + } + }); + }); + } + } catch (error) { + console.error('Error loading messages from QDN:', error); + } +} + +// Polling function to check for new messages without clearing existing ones +function startPollingForNewMessages() { + setInterval(async () => { + const activeRoom = document.querySelector('.room-title')?.innerText.toLowerCase().split(" ")[0]; + if (activeRoom) { + await loadMessagesFromQDN(activeRoom, currentPage, true); + } + }, 20000); +} + diff --git a/assets/js/BACKUP/Q-Mintership-Nov-29-workingWithAFewQwerks.js b/assets/js/BACKUP/Q-Mintership-Nov-29-workingWithAFewQwerks.js new file mode 100644 index 0000000..f32102b --- /dev/null +++ b/assets/js/BACKUP/Q-Mintership-Nov-29-workingWithAFewQwerks.js @@ -0,0 +1,505 @@ +const messageIdentifierPrefix = `mintership-forum-message`; +const messageAttachmentIdentifierPrefix = `mintership-forum-attachment`; + +// NOTE - SET adminGroups in QortalApi.js to enable admin access to forum for specific groups. Minter Admins will be fetched automatically. + +let replyToMessageIdentifier = null; +let latestMessageIdentifiers = {}; // To keep track of the latest message in each room +let currentPage = 0; // Track current pagination page +let existingIdentifiers = new Set(); // Keep track of existing identifiers to not pull them more than once. + +// If there is a previous latest message identifiers, use them. Otherwise, use an empty. +if (localStorage.getItem("latestMessageIdentifiers")) { + latestMessageIdentifiers = JSON.parse(localStorage.getItem("latestMessageIdentifiers")); +} + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLinks = document.querySelectorAll('a[href="MINTERSHIP-FORUM"]'); + + mintershipForumLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + //login if not already logged in. + if (!userState.isLoggedIn) { + await login(); + } + await loadForumPage(); + loadRoomContent("general"); // Automatically load General Room on forum load + startPollingForNewMessages(); // Start polling for new messages after loading the forum page + }); + }); +}); + +async function loadForumPage() { + // // Remove all sections except the menu + // const allSections = document.querySelectorAll('body > section'); + // allSections.forEach(section => { + // if (!section.classList.contains('menu')) { + // section.remove(); + // } + // }); + const bodyChildren = document.body.children; + for (let i = bodyChildren.length - 1; i >= 0; i--) { + const child = bodyChildren[i]; + if (!child.classList.contains('menu')) { + child.remove(); + } + } + + const avatarUrl = `/arbitrary/THUMBNAIL/${userState.accountName}/qortal_avatar`; + + // Create the forum layout, including a header, sub-menu, and keeping the original background imagestyle="background-image: url('/assets/images/background.jpg');"> + const mainContent = document.createElement('div'); + mainContent.innerHTML = ` +
+
+ +
+
+
+ + ${userState.isAdmin ? '' : ''} + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("minters"); + }); + if (userState.isAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("general"); + }); +} + +async function renderPaginationControls(room, totalMessages, limit) { + const paginationContainer = document.getElementById("pagination-container"); + if (!paginationContainer) return; + + paginationContainer.innerHTML = ""; // Clear existing buttons + + const totalPages = Math.ceil(totalMessages / limit); + + // Add "Previous" button + if (currentPage > 0) { + const prevButton = document.createElement("button"); + prevButton.innerText = "Previous"; + prevButton.addEventListener("click", () => { + if (currentPage > 0) { + currentPage--; + loadMessagesFromQDN(room, currentPage, false); + } + }); + paginationContainer.appendChild(prevButton); + } + + // Add numbered page buttons + for (let i = 0; i < totalPages; i++) { + const pageButton = document.createElement("button"); + pageButton.innerText = i + 1; + pageButton.className = i === currentPage ? "active-page" : ""; + pageButton.addEventListener("click", () => { + if (i !== currentPage) { + currentPage = i; + loadMessagesFromQDN(room, currentPage, false); + } + }); + paginationContainer.appendChild(pageButton); + } + + // Add "Next" button + if (currentPage < totalPages - 1) { + const nextButton = document.createElement("button"); + nextButton.innerText = "Next"; + nextButton.addEventListener("click", () => { + if (currentPage < totalPages - 1) { + currentPage++; + loadMessagesFromQDN(room, currentPage, false); + } + }); + paginationContainer.appendChild(nextButton); + } +} + + + +async function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+
+
+
+
+
+ + +
+ +
+
+ `; + + // Initialize Quill editor for rich text input + const quill = new Quill('#editor', { + theme: 'snow', + modules: { + toolbar: [ + [{ 'font': [] }], // Add font family options + [{ 'size': ['small', false, 'large', 'huge'] }], // Add font size options + [{ 'header': [1, 2, false] }], + ['bold', 'italic', 'underline'], // Text formatting options + [{ 'list': 'ordered'}, { 'list': 'bullet' }], + ['link', 'blockquote', 'code-block'], + [{ 'color': [] }, { 'background': [] }], // Text color and background color options + [{ 'align': [] }], // Text alignment + ['clean'] // Remove formatting button + ] + } + }); + + // Load messages from QDN for the selected room + await loadMessagesFromQDN(room, currentPage); + + let selectedFiles = []; + + // Add event listener to handle file selection + document.getElementById('file-input').addEventListener('change', (event) => { + selectedFiles = Array.from(event.target.files); + }); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "" || selectedFiles.length > 0) { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + let attachmentIdentifiers = []; + + // Handle attachments + for (const file of selectedFiles) { + const attachmentID = `${messageAttachmentIdentifierPrefix}-${room}-${randomID}`; + try { + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "FILE", + identifier: attachmentID, + file: file, + }); + attachmentIdentifiers.push({ + name: userState.accountName, + service: "FILE", + identifier: attachmentID, + filename: file.name, + mimeType: file.type + }); + console.log(`Attachment ${file.name} published successfully with ID: ${attachmentID}`); + } catch (error) { + console.error(`Error publishing attachment ${file.name}:`, error); + } + } + + // Create message object with unique identifier, HTML content, and attachments + const messageObject = { + messageHtml: messageHtml, + hasAttachment: attachmentIdentifiers.length > 0, + attachments: attachmentIdentifiers, + replyTo: replyToMessageIdentifier + }; + + try { + // Convert message object to base64 + let base64Message = await objectToBase64(messageObject); + if (!base64Message) { + console.log(`initial object creation with object failed, using btoa...`); + base64Message = btoa(JSON.stringify(messageObject)); + } + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + + console.log("Message published successfully"); + + // Clear the editor after sending the message, including any potential attached files and replies. + quill.root.innerHTML = ""; + document.getElementById('file-input').value = ""; + selectedFiles = []; + replyToMessageIdentifier = null; + const replyContainer = document.querySelector(".reply-container"); + if (replyContainer) { + replyContainer.remove() + } + + // Show success notification + const notification = document.createElement('div'); + notification.innerText = "Message published successfully! Message will take a confirmation to show."; + notification.style.color = "green"; + notification.style.marginTop = "10px"; + document.querySelector(".message-input-section").appendChild(notification); + + setTimeout(() => { + notification.remove(); + }, 3000); + + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + // Add event listener for the load more button + const loadMoreContainer = document.getElementById("load-more-container"); + if (loadMoreContainer) { + loadMoreContainer.innerHTML = ''; + document.getElementById("load-more-button").addEventListener("click", () => { + currentPage++; + loadMessagesFromQDN(room, currentPage); + }); + } + } +} + +async function loadMessagesFromQDN(room, page, isPolling = false) { + try { + const limit = 10; + const offset = page * limit; + console.log(`Loading messages for room: ${room}, page: ${page}, offset: ${offset}, limit: ${limit}`); + + // Get the messages container + const messagesContainer = document.querySelector("#messages-container"); + if (!messagesContainer) return; + + // If not polling, clear the message container and the existing identifiers for a fresh load + if (!isPolling) { + messagesContainer.innerHTML = ""; // Clear the messages container before loading new page + existingIdentifiers.clear(); // Clear the existing identifiers set for fresh page load + } + + // Get the set of existing identifiers from the messages container + existingIdentifiers = new Set(Array.from(messagesContainer.querySelectorAll('.message-item')).map(item => item.dataset.identifier)); + + // Fetch messages for the current room and page + const response = await searchAllWithOffset(`${messageIdentifierPrefix}-${room}`, limit, offset); + console.log(`Fetched messages count: ${response.length} for page: ${page}`); + + if (response.length === 0) { + // If no messages are fetched and it's not polling, display "no messages" for the initial load + if (page === 0 && !isPolling) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + } + return; + } + + // Define `mostRecentMessage` to track the latest message during this fetch + let mostRecentMessage = latestMessageIdentifiers[room]?.latestTimestamp ? latestMessageIdentifiers[room] : null; + + // Fetch all messages that haven't been fetched before + const fetchMessages = await Promise.all(response.map(async (resource) => { + if (existingIdentifiers.has(resource.identifier)) { + return null; // Skip messages that are already displayed + } + + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data if no 'encoding: base64' is set. + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { + name: resource.name, + content: messageObject.messageHtml, + date: formattedTimestamp, + identifier: resource.identifier, + replyTo: messageObject.replyTo, + timestamp, + attachments: messageObject.attachments || [] // Include attachments if they exist + }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + // Render new messages without duplication + for (const message of fetchMessages) { + if (message && !existingIdentifiers.has(message.identifier)) { + let replyHtml = ""; + if (message.replyTo) { + const repliedMessage = fetchMessages.find(m => m && m.identifier === message.replyTo); + if (repliedMessage) { + replyHtml = ` +
+
In reply to: ${repliedMessage.name} ${repliedMessage.date}
+
${repliedMessage.content}
+
+ `; + } + } + + const isNewMessage = !mostRecentMessage || new Date(message.timestamp) > new Date(mostRecentMessage?.latestTimestamp); + + let attachmentHtml = ""; + if (message.attachments && message.attachments.length > 0) { + for (const attachment of message.attachments) { + if (attachment.mimeType.startsWith('image/')) { + try { + // OTHER METHOD NOT BEING USED HERE. WE CAN LOAD THE IMAGE DIRECTLY SINCE IT WILL BE PUBLISHED UNENCRYPTED/UNENCODED. + // const imageHtml = await loadImageHtml(attachment.service, attachment.name, attachment.identifier, attachment.filename, attachment.mimeType); + const imageUrl = `/arbitrary/${attachment.service}/${attachment.name}/${attachment.identifier}`; + + // Add the image HTML with the direct URL + attachmentHtml += `
+ ${attachment.filename} +
`; + // FOR OTHER METHOD NO LONGER USED + // attachmentHtml += imageHtml; + } catch (error) { + console.error(`Failed to fetch attachment ${attachment.filename}:`, error); + } + } else { + // Display a button to download other attachments + attachmentHtml += `
+ +
`; + } + } + } + + const avatarUrl = `/arbitrary/THUMBNAIL/${message.name}/qortal_avatar`; + const messageHTML = ` +
+
+
+ Avatar + ${message.name} +
+ ${message.date} +
+ ${replyHtml} + ${attachmentHtml} +
${message.content}
+ +
+ `; + + // Append new message to the end of the container + messagesContainer.insertAdjacentHTML('beforeend', messageHTML); + + // Update mostRecentMessage if this message is newer + if (!mostRecentMessage || new Date(message.timestamp) > new Date(mostRecentMessage?.latestTimestamp || 0)) { + mostRecentMessage = { + latestIdentifier: message.identifier, + latestTimestamp: message.timestamp + }; + } + + // Add the identifier to the existingIdentifiers set + existingIdentifiers.add(message.identifier); + } + } + + // Update latestMessageIdentifiers for the room + if (mostRecentMessage) { + latestMessageIdentifiers[room] = mostRecentMessage; + localStorage.setItem("latestMessageIdentifiers", JSON.stringify(latestMessageIdentifiers)); + } + + // Add event listeners to the reply buttons + const replyButtons = document.querySelectorAll(".reply-button"); + replyButtons.forEach(button => { + button.addEventListener("click", () => { + replyToMessageIdentifier = button.dataset.messageIdentifier; + // Find the message being replied to + const repliedMessage = fetchMessages.find(m => m && m.identifier === replyToMessageIdentifier); + + if (repliedMessage) { + const replyContainer = document.createElement("div"); + replyContainer.className = "reply-container"; + replyContainer.innerHTML = ` +
+ Replying to: ${repliedMessage.content} + +
+ `; + + if (!document.querySelector(".reply-container")) { + const messageInputSection = document.querySelector(".message-input-section"); + + if (messageInputSection) { + messageInputSection.insertBefore(replyContainer, messageInputSection.firstChild); + + // Add a listener for the cancel reply button + document.getElementById("cancel-reply").addEventListener("click", () => { + replyToMessageIdentifier = null; + replyContainer.remove(); + }); + } + } + const messageInputSection = document.querySelector(".message-input-section"); + const editor = document.querySelector(".ql-editor"); + + if (messageInputSection) { + messageInputSection.scrollIntoView({ behavior: 'smooth', block: 'center' }); + } + + if (editor) { + editor.focus(); + } + } + }); + }); + + // Render pagination controls + const totalMessages = await searchAllCountOnly(`${messageIdentifierPrefix}-${room}`); + renderPaginationControls(room, totalMessages, limit); + } catch (error) { + console.error('Error loading messages from QDN:', error); + } +} + + +// Polling function to check for new messages without clearing existing ones +function startPollingForNewMessages() { + setInterval(async () => { + const activeRoom = document.querySelector('.room-title')?.innerText.toLowerCase().split(" ")[0]; + if (activeRoom) { + await loadMessagesFromQDN(activeRoom, currentPage, true); + } + }, 20000); +} + diff --git a/assets/js/BACKUP/Q-Mintership-with-few-bugs-Nov26-2024.js b/assets/js/BACKUP/Q-Mintership-with-few-bugs-Nov26-2024.js new file mode 100644 index 0000000..9ef2291 --- /dev/null +++ b/assets/js/BACKUP/Q-Mintership-with-few-bugs-Nov26-2024.js @@ -0,0 +1,485 @@ +const messageIdentifierPrefix = `mintership-forum-message`; +const messageAttachmentIdentifierPrefix = `mintership-forum-attachment`; + +// NOTE - SET adminGroups in QortalApi.js to enable admin access to forum for specific groups. Minter Admins will be fetched automatically. + +let replyToMessageIdentifier = null; +let latestMessageIdentifiers = {}; // To keep track of the latest message in each room +let currentPage = 0; // Track current pagination page +let existingIdentifiers = new Set(); // Keep track of existing identifiers to not pull them more than once. + +// If there is a previous latest message identifiers, use them. Otherwise, use an empty. +if (localStorage.getItem("latestMessageIdentifiers")) { + latestMessageIdentifiers = JSON.parse(localStorage.getItem("latestMessageIdentifiers")); +} + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLinks = document.querySelectorAll('a[href="MINTERSHIP-FORUM"]'); + + mintershipForumLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + await login(); // Assuming login is an async function + await loadForumPage(); + loadRoomContent("general"); // Automatically load General Room on forum load + startPollingForNewMessages(); // Start polling for new messages after loading the forum page + }); + }); +}); + +async function loadForumPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + // Check if user is an admin + // const minterGroupAdmins = await fetchMinterGroupAdmins(); + // const isUserAdmin = minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) || await verifyUserIsAdmin(); + + // Create the forum layout, including a header, sub-menu, and keeping the original background imagestyle="background-image: url('/assets/images/background.jpg');"> + const mainContent = document.createElement('div'); + mainContent.innerHTML = ` +
+
+ +
+
+
+ + ${userState.isAdmin ? '' : ''} + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("minters"); + }); + if (userState.isAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("general"); + }); +} + +async function renderPaginationControls(room, totalMessages, limit) { + const paginationContainer = document.getElementById("pagination-container"); + if (!paginationContainer) return; + + paginationContainer.innerHTML = ""; // Clear existing buttons + + const totalPages = Math.ceil(totalMessages / limit); + + // Add "Previous" button + if (currentPage > 0) { + const prevButton = document.createElement("button"); + prevButton.innerText = "Previous"; + prevButton.addEventListener("click", () => { + if (currentPage > 0) { + currentPage--; + loadMessagesFromQDN(room, currentPage); + } + }); + paginationContainer.appendChild(prevButton); + } + + // Add numbered page buttons + for (let i = 0; i < totalPages; i++) { + const pageButton = document.createElement("button"); + pageButton.innerText = i + 1; + pageButton.className = i === currentPage ? "active-page" : ""; + pageButton.addEventListener("click", () => { + if (i !== currentPage) { + currentPage = i; + loadMessagesFromQDN(room, currentPage); + } + }); + paginationContainer.appendChild(pageButton); + } + + // Add "Next" button + if (currentPage < totalPages - 1) { + const nextButton = document.createElement("button"); + nextButton.innerText = "Next"; + nextButton.addEventListener("click", () => { + if (currentPage < totalPages - 1) { + currentPage++; + loadMessagesFromQDN(room, currentPage); + } + }); + paginationContainer.appendChild(nextButton); + } +} + + +function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+
+
+
+
+
+ + +
+ +
+
+ `; + + // Initialize Quill editor for rich text input + const quill = new Quill('#editor', { + theme: 'snow', + modules: { + toolbar: [ + [{ 'font': [] }], // Add font family options + [{ 'size': ['small', false, 'large', 'huge'] }], // Add font size options + [{ 'header': [1, 2, false] }], + ['bold', 'italic', 'underline'], // Text formatting options + [{ 'list': 'ordered'}, { 'list': 'bullet' }], + ['link', 'blockquote', 'code-block'], + [{ 'color': [] }, { 'background': [] }], // Text color and background color options + [{ 'align': [] }], // Text alignment + ['clean'] // Remove formatting button + ] + } + }); + + // Load messages from QDN for the selected room + loadMessagesFromQDN(room, currentPage); + + let selectedFiles = []; + + // Add event listener to handle file selection + document.getElementById('file-input').addEventListener('change', (event) => { + selectedFiles = Array.from(event.target.files); + }); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "" || selectedFiles.length > 0) { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + let attachmentIdentifiers = []; + + // Handle attachments + for (const file of selectedFiles) { + const attachmentID = `${messageAttachmentIdentifierPrefix}-${room}-${randomID}`; + try { + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "FILE", + identifier: attachmentID, + file: file, + filename: file.name, + filetype: file.type, + }); + attachmentIdentifiers.push({ + identifier: attachmentID, + filename: file.name, + mimeType: file.type + }); + console.log(`Attachment ${file.name} published successfully with ID: ${attachmentID}`); + } catch (error) { + console.error(`Error publishing attachment ${file.name}:`, error); + } + } + + // Create message object with unique identifier, HTML content, and attachments + const messageObject = { + messageHtml: messageHtml, + hasAttachment: attachmentIdentifiers.length > 0, + attachments: attachmentIdentifiers, + replyTo: replyToMessageIdentifier + }; + + try { + // Convert message object to base64 + let base64Message = await objectToBase64(messageObject); + if (!base64Message) { + console.log(`initial object creation with object failed, using btoa...`); + base64Message = btoa(JSON.stringify(messageObject)); + } + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + + console.log("Message published successfully"); + + // Clear the editor after sending the message, including any potential attached files and replies. + quill.root.innerHTML = ""; + document.getElementById('file-input').value = ""; + selectedFiles = []; + replyToMessageIdentifier = null; + const replyContainer = document.querySelector(".reply-container"); + if (replyContainer) { + replyContainer.remove() + } + + // Show success notification + const notification = document.createElement('div'); + notification.innerText = "Message published successfully! Message will take a confirmation to show."; + notification.style.color = "green"; + notification.style.marginTop = "10px"; + document.querySelector(".message-input-section").appendChild(notification); + + setTimeout(() => { + notification.remove(); + }, 3000); + + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + + // Add event listener for the load more button + const loadMoreContainer = document.getElementById("load-more-container"); + if (loadMoreContainer) { + loadMoreContainer.innerHTML = ''; + document.getElementById("load-more-button").addEventListener("click", () => { + currentPage++; + loadMessagesFromQDN(room, currentPage); + }); + } + } +} +// Load messages for any given room with pagination +async function loadMessagesFromQDN(room, page, isPolling = false) { + try { + // const offset = page * 10; + + const limit = 10; + const offset = page * limit; + console.log(`Loading messages for room: ${room}, page: ${page}, offset: ${offset}, limit: ${limit}`); + + // Get the set of existing identifiers from the messages container + const messagesContainer = document.querySelector("#messages-container"); + existingIdentifiers = new Set(Array.from(messagesContainer.querySelectorAll('.message-item')).map(item => item.dataset.identifier)); + + // Fetch only messages that are not already present in the messages container + const response = await searchAllWithOffset(`${messageIdentifierPrefix}-${room}`, limit, offset); + console.log(`Fetched messages count: ${response.length} for page: ${page}`); + + if (messagesContainer) { + // If there are no messages and we're not polling, display "no messages" message + if (!response || !response.length) { + if (page === 0 && !isPolling) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + } + return; + } + + if (!isPolling) { + messagesContainer.innerHTML = ""; + } + + // Define `mostRecentMessage` to track the latest message during this fetch + let mostRecentMessage = null; + + // Fetch all messages that haven't been fetched before + const fetchMessages = await Promise.all(response.map(async (resource) => { + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data if no 'encoding: base64' is set. + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { + name: resource.name, + content: messageObject.messageHtml, + date: formattedTimestamp, + identifier: resource.identifier, + replyTo: messageObject.replyTo, + timestamp, + attachments: messageObject.attachments || [] // Include attachments if they exist + }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + // Render new messages without duplication + for (const message of fetchMessages) { + if (message && !existingIdentifiers.has(message.identifier)) { + let replyHtml = ""; + if (message.replyTo) { + const repliedMessage = fetchMessages.find(m => m && m.identifier === message.replyTo); + if (repliedMessage) { + replyHtml = ` +
+
In reply to: ${repliedMessage.name} ${repliedMessage.date}
+
${repliedMessage.content}
+
+ `; + } + } + + const isNewMessage = !latestMessageIdentifiers[room] || new Date(message.date) > new Date(latestMessageIdentifiers[room]?.latestTimestamp); + + let attachmentHtml = ""; + if (message.attachments && message.attachments.length > 0) { + for (const attachment of message.attachments) { + if (attachment.mimeType.startsWith('image/')) { + try { + // Fetch the base64 string for the image + const imageHtml = await loadImageHtml(attachment.service, attachment.name, attachment.identifier); + + // Create a data URL for the Base64 string - THIS CAN BE USED IF IMAGES ARE POSTED IN BASE64, ALONG WITH obtain + //const dataUrl = `data:${attachment.mimeType};base64,${image}`; + + // Add the image HTML with the data URL + attachmentHtml += imageHtml; + } catch (error) { + console.error(`Failed to fetch attachment ${attachment.filename}:`, error); + } + } else { + // Display a button to download other attachments + attachmentHtml += `
+ +
`; + } + } + } + + const messageHTML = ` +
+ ${replyHtml} +
+ ${message.name} + ${message.date} + ${isNewMessage ? 'NEW' : ''} +
+ ${attachmentHtml} +
${message.content}
+ +
+ `; + + // Append new message to the end of the container + messagesContainer.insertAdjacentHTML('beforeend', messageHTML); + + // Track the most recent message + if (!mostRecentMessage || new Date(message.timestamp) > new Date(mostRecentMessage?.timestamp || 0)) { + mostRecentMessage = message; + } + } + } + + // Update latestMessageIdentifiers for the room + if (mostRecentMessage) { + latestMessageIdentifiers[room] = { + latestIdentifier: mostRecentMessage.identifier, + latestTimestamp: mostRecentMessage.timestamp + }; + localStorage.setItem("latestMessageIdentifiers", JSON.stringify(latestMessageIdentifiers)); + } + + // Add event listeners to the reply buttons + const replyButtons = document.querySelectorAll(".reply-button"); + + replyButtons.forEach(button => { + button.addEventListener("click", () => { + replyToMessageIdentifier = button.dataset.messageIdentifier; + // Find the message being replied to + const repliedMessage = fetchMessages.find(m => m && m.identifier === replyToMessageIdentifier); + + if (repliedMessage) { + const replyContainer = document.createElement("div"); + replyContainer.className = "reply-container"; + replyContainer.innerHTML = ` +
+ Replying to: ${repliedMessage.content} + +
+ `; + + if (!document.querySelector(".reply-container")) { + const messageInputSection = document.querySelector(".message-input-section"); + + if (messageInputSection) { + messageInputSection.insertBefore(replyContainer, messageInputSection.firstChild); + + // Add a listener for the cancel reply button + document.getElementById("cancel-reply").addEventListener("click", () => { + replyToMessageIdentifier = null; + replyContainer.remove(); + }); + } + } + const messageInputSection = document.querySelector(".message-input-section"); + const editor = document.querySelector(".ql-editor"); + + if (messageInputSection) { + messageInputSection.scrollIntoView({ behavior: 'smooth', block: 'center' }); + } + + if (editor) { + editor.focus(); + } + } + }) + }) + // if (response.length >= limit) { + // document.getElementById("load-more-container").style.display = 'block'; + // } else { + // document.getElementById("load-more-container").style.display = 'none'; + // } + + const totalMessages = await searchAllCountOnly(`${messageIdentifierPrefix}-${room}`); + renderPaginationControls(room, totalMessages, limit); + } + } catch (error) { + console.error('Error loading messages from QDN:', error); + } +} + +// Polling function to check for new messages without clearing existing ones +function startPollingForNewMessages() { + setInterval(async () => { + const activeRoom = document.querySelector('.room-title')?.innerText.toLowerCase().split(" ")[0]; + if (activeRoom) { + await loadMessagesFromQDN(activeRoom, currentPage, true); + } + }, 20000); +} + diff --git a/assets/js/BACKUP/Q-Mintership-working-embeds-avatars-spacing-issue-nov-27.js b/assets/js/BACKUP/Q-Mintership-working-embeds-avatars-spacing-issue-nov-27.js new file mode 100644 index 0000000..51b1d2d --- /dev/null +++ b/assets/js/BACKUP/Q-Mintership-working-embeds-avatars-spacing-issue-nov-27.js @@ -0,0 +1,494 @@ +const messageIdentifierPrefix = `mintership-forum-message`; +const messageAttachmentIdentifierPrefix = `mintership-forum-attachment`; + +// NOTE - SET adminGroups in QortalApi.js to enable admin access to forum for specific groups. Minter Admins will be fetched automatically. + +let replyToMessageIdentifier = null; +let latestMessageIdentifiers = {}; // To keep track of the latest message in each room +let currentPage = 0; // Track current pagination page +let existingIdentifiers = new Set(); // Keep track of existing identifiers to not pull them more than once. + +// If there is a previous latest message identifiers, use them. Otherwise, use an empty. +if (localStorage.getItem("latestMessageIdentifiers")) { + latestMessageIdentifiers = JSON.parse(localStorage.getItem("latestMessageIdentifiers")); +} + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLinks = document.querySelectorAll('a[href="MINTERSHIP-FORUM"]'); + + mintershipForumLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + await login(); // Assuming login is an async function + await loadForumPage(); + loadRoomContent("general"); // Automatically load General Room on forum load + startPollingForNewMessages(); // Start polling for new messages after loading the forum page + }); + }); +}); + +async function loadForumPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + const avatarUrl = `/arbitrary/THUMBNAIL/${userState.accountName}/qortal_avatar`; + + // Create the forum layout, including a header, sub-menu, and keeping the original background imagestyle="background-image: url('/assets/images/background.jpg');"> + const mainContent = document.createElement('div'); + mainContent.innerHTML = ` +
+
+ +
+
+
+ + ${userState.isAdmin ? '' : ''} + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("minters"); + }); + if (userState.isAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("general"); + }); +} + +async function renderPaginationControls(room, totalMessages, limit) { + const paginationContainer = document.getElementById("pagination-container"); + if (!paginationContainer) return; + + paginationContainer.innerHTML = ""; // Clear existing buttons + + const totalPages = Math.ceil(totalMessages / limit); + + // Add "Previous" button + if (currentPage > 0) { + const prevButton = document.createElement("button"); + prevButton.innerText = "Previous"; + prevButton.addEventListener("click", () => { + if (currentPage > 0) { + currentPage--; + loadMessagesFromQDN(room, currentPage, false); + } + }); + paginationContainer.appendChild(prevButton); + } + + // Add numbered page buttons + for (let i = 0; i < totalPages; i++) { + const pageButton = document.createElement("button"); + pageButton.innerText = i + 1; + pageButton.className = i === currentPage ? "active-page" : ""; + pageButton.addEventListener("click", () => { + if (i !== currentPage) { + currentPage = i; + loadMessagesFromQDN(room, currentPage, false); + } + }); + paginationContainer.appendChild(pageButton); + } + + // Add "Next" button + if (currentPage < totalPages - 1) { + const nextButton = document.createElement("button"); + nextButton.innerText = "Next"; + nextButton.addEventListener("click", () => { + if (currentPage < totalPages - 1) { + currentPage++; + loadMessagesFromQDN(room, currentPage, false); + } + }); + paginationContainer.appendChild(nextButton); + } +} + + + +function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+
+
+
+
+
+ + +
+ +
+
+ `; + + // Initialize Quill editor for rich text input + const quill = new Quill('#editor', { + theme: 'snow', + modules: { + toolbar: [ + [{ 'font': [] }], // Add font family options + [{ 'size': ['small', false, 'large', 'huge'] }], // Add font size options + [{ 'header': [1, 2, false] }], + ['bold', 'italic', 'underline'], // Text formatting options + [{ 'list': 'ordered'}, { 'list': 'bullet' }], + ['link', 'blockquote', 'code-block'], + [{ 'color': [] }, { 'background': [] }], // Text color and background color options + [{ 'align': [] }], // Text alignment + ['clean'] // Remove formatting button + ] + } + }); + + // Load messages from QDN for the selected room + loadMessagesFromQDN(room, currentPage); + + let selectedFiles = []; + + // Add event listener to handle file selection + document.getElementById('file-input').addEventListener('change', (event) => { + selectedFiles = Array.from(event.target.files); + }); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "" || selectedFiles.length > 0) { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + let attachmentIdentifiers = []; + + // Handle attachments + for (const file of selectedFiles) { + const attachmentID = `${messageAttachmentIdentifierPrefix}-${room}-${randomID}`; + try { + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "FILE", + identifier: attachmentID, + file: file, + }); + attachmentIdentifiers.push({ + name: userState.accountName, + service: "FILE", + identifier: attachmentID, + filename: file.name, + mimeType: file.type + }); + console.log(`Attachment ${file.name} published successfully with ID: ${attachmentID}`); + } catch (error) { + console.error(`Error publishing attachment ${file.name}:`, error); + } + } + + // Create message object with unique identifier, HTML content, and attachments + const messageObject = { + messageHtml: messageHtml, + hasAttachment: attachmentIdentifiers.length > 0, + attachments: attachmentIdentifiers, + replyTo: replyToMessageIdentifier + }; + + try { + // Convert message object to base64 + let base64Message = await objectToBase64(messageObject); + if (!base64Message) { + console.log(`initial object creation with object failed, using btoa...`); + base64Message = btoa(JSON.stringify(messageObject)); + } + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + + console.log("Message published successfully"); + + // Clear the editor after sending the message, including any potential attached files and replies. + quill.root.innerHTML = ""; + document.getElementById('file-input').value = ""; + selectedFiles = []; + replyToMessageIdentifier = null; + const replyContainer = document.querySelector(".reply-container"); + if (replyContainer) { + replyContainer.remove() + } + + // Show success notification + const notification = document.createElement('div'); + notification.innerText = "Message published successfully! Message will take a confirmation to show."; + notification.style.color = "green"; + notification.style.marginTop = "10px"; + document.querySelector(".message-input-section").appendChild(notification); + + setTimeout(() => { + notification.remove(); + }, 3000); + + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + // Add event listener for the load more button + const loadMoreContainer = document.getElementById("load-more-container"); + if (loadMoreContainer) { + loadMoreContainer.innerHTML = ''; + document.getElementById("load-more-button").addEventListener("click", () => { + currentPage++; + loadMessagesFromQDN(room, currentPage); + }); + } + } +} + +async function loadMessagesFromQDN(room, page, isPolling = false) { + try { + const limit = 10; + const offset = page * limit; + console.log(`Loading messages for room: ${room}, page: ${page}, offset: ${offset}, limit: ${limit}`); + + // Get the messages container + const messagesContainer = document.querySelector("#messages-container"); + if (!messagesContainer) return; + + // If not polling, clear the message container and the existing identifiers for a fresh load + if (!isPolling) { + messagesContainer.innerHTML = ""; // Clear the messages container before loading new page + existingIdentifiers.clear(); // Clear the existing identifiers set for fresh page load + } + + // Get the set of existing identifiers from the messages container + existingIdentifiers = new Set(Array.from(messagesContainer.querySelectorAll('.message-item')).map(item => item.dataset.identifier)); + + // Fetch messages for the current room and page + const response = await searchAllWithOffset(`${messageIdentifierPrefix}-${room}`, limit, offset); + console.log(`Fetched messages count: ${response.length} for page: ${page}`); + + if (response.length === 0) { + // If no messages are fetched and it's not polling, display "no messages" for the initial load + if (page === 0 && !isPolling) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + } + return; + } + + // Define `mostRecentMessage` to track the latest message during this fetch + let mostRecentMessage = latestMessageIdentifiers[room]?.latestTimestamp ? latestMessageIdentifiers[room] : null; + + // Fetch all messages that haven't been fetched before + const fetchMessages = await Promise.all(response.map(async (resource) => { + if (existingIdentifiers.has(resource.identifier)) { + return null; // Skip messages that are already displayed + } + + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data if no 'encoding: base64' is set. + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { + name: resource.name, + content: messageObject.messageHtml, + date: formattedTimestamp, + identifier: resource.identifier, + replyTo: messageObject.replyTo, + timestamp, + attachments: messageObject.attachments || [] // Include attachments if they exist + }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + // Render new messages without duplication + for (const message of fetchMessages) { + if (message && !existingIdentifiers.has(message.identifier)) { + let replyHtml = ""; + if (message.replyTo) { + const repliedMessage = fetchMessages.find(m => m && m.identifier === message.replyTo); + if (repliedMessage) { + replyHtml = ` +
+
In reply to: ${repliedMessage.name} ${repliedMessage.date}
+
${repliedMessage.content}
+
+ `; + } + } + + const isNewMessage = !mostRecentMessage || new Date(message.timestamp) > new Date(mostRecentMessage?.latestTimestamp); + + let attachmentHtml = ""; + if (message.attachments && message.attachments.length > 0) { + for (const attachment of message.attachments) { + if (attachment.mimeType.startsWith('image/')) { + try { + // OTHER METHOD NOT BEING USED HERE. WE CAN LOAD THE IMAGE DIRECTLY SINCE IT WILL BE PUBLISHED UNENCRYPTED/UNENCODED. + // const imageHtml = await loadImageHtml(attachment.service, attachment.name, attachment.identifier, attachment.filename, attachment.mimeType); + const imageUrl = `/arbitrary/${attachment.service}/${attachment.name}/${attachment.identifier}`; + + // Add the image HTML with the direct URL + attachmentHtml += `
+ ${attachment.filename} +
`; + // FOR OTHER METHOD NO LONGER USED + // attachmentHtml += imageHtml; + } catch (error) { + console.error(`Failed to fetch attachment ${attachment.filename}:`, error); + } + } else { + // Display a button to download other attachments + attachmentHtml += `
+ +
`; + } + } + } + + const avatarUrl = `/arbitrary/THUMBNAIL/${message.name}/qortal_avatar`; + const messageHTML = ` +
+ ${replyHtml} +
+ ${message.name}'s Avatar + ${message.name} + ${message.date} + ${isNewMessage ? 'NEW' : ''} +
+ ${attachmentHtml} +
${message.content}
+ +
+ `; + + // Append new message to the end of the container + messagesContainer.insertAdjacentHTML('beforeend', messageHTML); + + // Update mostRecentMessage if this message is newer + if (!mostRecentMessage || new Date(message.timestamp) > new Date(mostRecentMessage?.latestTimestamp || 0)) { + mostRecentMessage = { + latestIdentifier: message.identifier, + latestTimestamp: message.timestamp + }; + } + + // Add the identifier to the existingIdentifiers set + existingIdentifiers.add(message.identifier); + } + } + + // Update latestMessageIdentifiers for the room + if (mostRecentMessage) { + latestMessageIdentifiers[room] = mostRecentMessage; + localStorage.setItem("latestMessageIdentifiers", JSON.stringify(latestMessageIdentifiers)); + } + + // Add event listeners to the reply buttons + const replyButtons = document.querySelectorAll(".reply-button"); + replyButtons.forEach(button => { + button.addEventListener("click", () => { + replyToMessageIdentifier = button.dataset.messageIdentifier; + // Find the message being replied to + const repliedMessage = fetchMessages.find(m => m && m.identifier === replyToMessageIdentifier); + + if (repliedMessage) { + const replyContainer = document.createElement("div"); + replyContainer.className = "reply-container"; + replyContainer.innerHTML = ` +
+ Replying to: ${repliedMessage.content} + +
+ `; + + if (!document.querySelector(".reply-container")) { + const messageInputSection = document.querySelector(".message-input-section"); + + if (messageInputSection) { + messageInputSection.insertBefore(replyContainer, messageInputSection.firstChild); + + // Add a listener for the cancel reply button + document.getElementById("cancel-reply").addEventListener("click", () => { + replyToMessageIdentifier = null; + replyContainer.remove(); + }); + } + } + const messageInputSection = document.querySelector(".message-input-section"); + const editor = document.querySelector(".ql-editor"); + + if (messageInputSection) { + messageInputSection.scrollIntoView({ behavior: 'smooth', block: 'center' }); + } + + if (editor) { + editor.focus(); + } + } + }); + }); + + // Render pagination controls + const totalMessages = await searchAllCountOnly(`${messageIdentifierPrefix}-${room}`); + renderPaginationControls(room, totalMessages, limit); + } catch (error) { + console.error('Error loading messages from QDN:', error); + } +} + + +// Polling function to check for new messages without clearing existing ones +function startPollingForNewMessages() { + setInterval(async () => { + const activeRoom = document.querySelector('.room-title')?.innerText.toLowerCase().split(" ")[0]; + if (activeRoom) { + await loadMessagesFromQDN(activeRoom, currentPage, true); + } + }, 20000); +} + diff --git a/assets/js/BACKUP/Q-Mintership-working-embeds-nov-27.js b/assets/js/BACKUP/Q-Mintership-working-embeds-nov-27.js new file mode 100644 index 0000000..15fb826 --- /dev/null +++ b/assets/js/BACKUP/Q-Mintership-working-embeds-nov-27.js @@ -0,0 +1,491 @@ +const messageIdentifierPrefix = `mintership-forum-message`; +const messageAttachmentIdentifierPrefix = `mintership-forum-attachment`; + +// NOTE - SET adminGroups in QortalApi.js to enable admin access to forum for specific groups. Minter Admins will be fetched automatically. + +let replyToMessageIdentifier = null; +let latestMessageIdentifiers = {}; // To keep track of the latest message in each room +let currentPage = 0; // Track current pagination page +let existingIdentifiers = new Set(); // Keep track of existing identifiers to not pull them more than once. + +// If there is a previous latest message identifiers, use them. Otherwise, use an empty. +if (localStorage.getItem("latestMessageIdentifiers")) { + latestMessageIdentifiers = JSON.parse(localStorage.getItem("latestMessageIdentifiers")); +} + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLinks = document.querySelectorAll('a[href="MINTERSHIP-FORUM"]'); + + mintershipForumLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + await login(); // Assuming login is an async function + await loadForumPage(); + loadRoomContent("general"); // Automatically load General Room on forum load + startPollingForNewMessages(); // Start polling for new messages after loading the forum page + }); + }); +}); + +async function loadForumPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + // Check if user is an admin + // const minterGroupAdmins = await fetchMinterGroupAdmins(); + // const isUserAdmin = minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) || await verifyUserIsAdmin(); + + // Create the forum layout, including a header, sub-menu, and keeping the original background imagestyle="background-image: url('/assets/images/background.jpg');"> + const mainContent = document.createElement('div'); + mainContent.innerHTML = ` +
+
+ +
+
+
+ + ${userState.isAdmin ? '' : ''} + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("minters"); + }); + if (userState.isAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("general"); + }); +} + +async function renderPaginationControls(room, totalMessages, limit) { + const paginationContainer = document.getElementById("pagination-container"); + if (!paginationContainer) return; + + paginationContainer.innerHTML = ""; // Clear existing buttons + + const totalPages = Math.ceil(totalMessages / limit); + + // Add "Previous" button + if (currentPage > 0) { + const prevButton = document.createElement("button"); + prevButton.innerText = "Previous"; + prevButton.addEventListener("click", () => { + if (currentPage > 0) { + currentPage--; + loadMessagesFromQDN(room, currentPage, false); + } + }); + paginationContainer.appendChild(prevButton); + } + + // Add numbered page buttons + for (let i = 0; i < totalPages; i++) { + const pageButton = document.createElement("button"); + pageButton.innerText = i + 1; + pageButton.className = i === currentPage ? "active-page" : ""; + pageButton.addEventListener("click", () => { + if (i !== currentPage) { + currentPage = i; + loadMessagesFromQDN(room, currentPage, false); + } + }); + paginationContainer.appendChild(pageButton); + } + + // Add "Next" button + if (currentPage < totalPages - 1) { + const nextButton = document.createElement("button"); + nextButton.innerText = "Next"; + nextButton.addEventListener("click", () => { + if (currentPage < totalPages - 1) { + currentPage++; + loadMessagesFromQDN(room, currentPage, false); + } + }); + paginationContainer.appendChild(nextButton); + } +} + + + +function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+
+
+
+
+
+ + +
+ +
+
+ `; + + // Initialize Quill editor for rich text input + const quill = new Quill('#editor', { + theme: 'snow', + modules: { + toolbar: [ + [{ 'font': [] }], // Add font family options + [{ 'size': ['small', false, 'large', 'huge'] }], // Add font size options + [{ 'header': [1, 2, false] }], + ['bold', 'italic', 'underline'], // Text formatting options + [{ 'list': 'ordered'}, { 'list': 'bullet' }], + ['link', 'blockquote', 'code-block'], + [{ 'color': [] }, { 'background': [] }], // Text color and background color options + [{ 'align': [] }], // Text alignment + ['clean'] // Remove formatting button + ] + } + }); + + // Load messages from QDN for the selected room + loadMessagesFromQDN(room, currentPage); + + let selectedFiles = []; + + // Add event listener to handle file selection + document.getElementById('file-input').addEventListener('change', (event) => { + selectedFiles = Array.from(event.target.files); + }); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "" || selectedFiles.length > 0) { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + let attachmentIdentifiers = []; + + // Handle attachments + for (const file of selectedFiles) { + const attachmentID = `${messageAttachmentIdentifierPrefix}-${room}-${randomID}`; + try { + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "FILE", + identifier: attachmentID, + file: file, + }); + attachmentIdentifiers.push({ + name: userState.accountName, + service: "FILE", + identifier: attachmentID, + filename: file.name, + mimeType: file.type + }); + console.log(`Attachment ${file.name} published successfully with ID: ${attachmentID}`); + } catch (error) { + console.error(`Error publishing attachment ${file.name}:`, error); + } + } + + // Create message object with unique identifier, HTML content, and attachments + const messageObject = { + messageHtml: messageHtml, + hasAttachment: attachmentIdentifiers.length > 0, + attachments: attachmentIdentifiers, + replyTo: replyToMessageIdentifier + }; + + try { + // Convert message object to base64 + let base64Message = await objectToBase64(messageObject); + if (!base64Message) { + console.log(`initial object creation with object failed, using btoa...`); + base64Message = btoa(JSON.stringify(messageObject)); + } + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + + console.log("Message published successfully"); + + // Clear the editor after sending the message, including any potential attached files and replies. + quill.root.innerHTML = ""; + document.getElementById('file-input').value = ""; + selectedFiles = []; + replyToMessageIdentifier = null; + const replyContainer = document.querySelector(".reply-container"); + if (replyContainer) { + replyContainer.remove() + } + + // Show success notification + const notification = document.createElement('div'); + notification.innerText = "Message published successfully! Message will take a confirmation to show."; + notification.style.color = "green"; + notification.style.marginTop = "10px"; + document.querySelector(".message-input-section").appendChild(notification); + + setTimeout(() => { + notification.remove(); + }, 3000); + + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + // Add event listener for the load more button + const loadMoreContainer = document.getElementById("load-more-container"); + if (loadMoreContainer) { + loadMoreContainer.innerHTML = ''; + document.getElementById("load-more-button").addEventListener("click", () => { + currentPage++; + loadMessagesFromQDN(room, currentPage); + }); + } + } +} + +async function loadMessagesFromQDN(room, page, isPolling = false) { + try { + const limit = 10; + const offset = page * limit; + console.log(`Loading messages for room: ${room}, page: ${page}, offset: ${offset}, limit: ${limit}`); + + // Get the messages container + const messagesContainer = document.querySelector("#messages-container"); + if (!messagesContainer) return; + + // If not polling, clear the message container and the existing identifiers for a fresh load + if (!isPolling) { + messagesContainer.innerHTML = ""; // Clear the messages container before loading new page + existingIdentifiers.clear(); // Clear the existing identifiers set for fresh page load + } + + // Get the set of existing identifiers from the messages container + existingIdentifiers = new Set(Array.from(messagesContainer.querySelectorAll('.message-item')).map(item => item.dataset.identifier)); + + // Fetch messages for the current room and page + const response = await searchAllWithOffset(`${messageIdentifierPrefix}-${room}`, limit, offset); + console.log(`Fetched messages count: ${response.length} for page: ${page}`); + + if (response.length === 0) { + // If no messages are fetched and it's not polling, display "no messages" for the initial load + if (page === 0 && !isPolling) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + } + return; + } + + // Define `mostRecentMessage` to track the latest message during this fetch + let mostRecentMessage = latestMessageIdentifiers[room]?.latestTimestamp ? latestMessageIdentifiers[room] : null; + + // Fetch all messages that haven't been fetched before + const fetchMessages = await Promise.all(response.map(async (resource) => { + if (existingIdentifiers.has(resource.identifier)) { + return null; // Skip messages that are already displayed + } + + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data if no 'encoding: base64' is set. + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { + name: resource.name, + content: messageObject.messageHtml, + date: formattedTimestamp, + identifier: resource.identifier, + replyTo: messageObject.replyTo, + timestamp, + attachments: messageObject.attachments || [] // Include attachments if they exist + }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + // Render new messages without duplication + for (const message of fetchMessages) { + if (message && !existingIdentifiers.has(message.identifier)) { + let replyHtml = ""; + if (message.replyTo) { + const repliedMessage = fetchMessages.find(m => m && m.identifier === message.replyTo); + if (repliedMessage) { + replyHtml = ` +
+
In reply to: ${repliedMessage.name} ${repliedMessage.date}
+
${repliedMessage.content}
+
+ `; + } + } + + const isNewMessage = !mostRecentMessage || new Date(message.timestamp) > new Date(mostRecentMessage?.latestTimestamp); + + let attachmentHtml = ""; + if (message.attachments && message.attachments.length > 0) { + for (const attachment of message.attachments) { + if (attachment.mimeType.startsWith('image/')) { + try { + // OTHER METHOD NOT BEING USED HERE. WE CAN LOAD THE IMAGE DIRECTLY SINCE IT WILL BE PUBLISHED UNENCRYPTED/UNENCODED. + // const imageHtml = await loadImageHtml(attachment.service, attachment.name, attachment.identifier, attachment.filename, attachment.mimeType); + const imageUrl = `/arbitrary/${attachment.service}/${attachment.name}/${attachment.identifier}`; + + // Add the image HTML with the direct URL + attachmentHtml += `
+ ${attachment.filename} +
`; + // FOR OTHER METHOD NO LONGER USED + // attachmentHtml += imageHtml; + } catch (error) { + console.error(`Failed to fetch attachment ${attachment.filename}:`, error); + } + } else { + // Display a button to download other attachments + attachmentHtml += `
+ +
`; + } + } + } + + const messageHTML = ` +
+ ${replyHtml} +
+ ${message.name} + ${message.date} + ${isNewMessage ? 'NEW' : ''} +
+ ${attachmentHtml} +
${message.content}
+ +
+ `; + + // Append new message to the end of the container + messagesContainer.insertAdjacentHTML('beforeend', messageHTML); + + // Update mostRecentMessage if this message is newer + if (!mostRecentMessage || new Date(message.timestamp) > new Date(mostRecentMessage?.latestTimestamp || 0)) { + mostRecentMessage = { + latestIdentifier: message.identifier, + latestTimestamp: message.timestamp + }; + } + + // Add the identifier to the existingIdentifiers set + existingIdentifiers.add(message.identifier); + } + } + + // Update latestMessageIdentifiers for the room + if (mostRecentMessage) { + latestMessageIdentifiers[room] = mostRecentMessage; + localStorage.setItem("latestMessageIdentifiers", JSON.stringify(latestMessageIdentifiers)); + } + + // Add event listeners to the reply buttons + const replyButtons = document.querySelectorAll(".reply-button"); + replyButtons.forEach(button => { + button.addEventListener("click", () => { + replyToMessageIdentifier = button.dataset.messageIdentifier; + // Find the message being replied to + const repliedMessage = fetchMessages.find(m => m && m.identifier === replyToMessageIdentifier); + + if (repliedMessage) { + const replyContainer = document.createElement("div"); + replyContainer.className = "reply-container"; + replyContainer.innerHTML = ` +
+ Replying to: ${repliedMessage.content} + +
+ `; + + if (!document.querySelector(".reply-container")) { + const messageInputSection = document.querySelector(".message-input-section"); + + if (messageInputSection) { + messageInputSection.insertBefore(replyContainer, messageInputSection.firstChild); + + // Add a listener for the cancel reply button + document.getElementById("cancel-reply").addEventListener("click", () => { + replyToMessageIdentifier = null; + replyContainer.remove(); + }); + } + } + const messageInputSection = document.querySelector(".message-input-section"); + const editor = document.querySelector(".ql-editor"); + + if (messageInputSection) { + messageInputSection.scrollIntoView({ behavior: 'smooth', block: 'center' }); + } + + if (editor) { + editor.focus(); + } + } + }); + }); + + // Render pagination controls + const totalMessages = await searchAllCountOnly(`${messageIdentifierPrefix}-${room}`); + renderPaginationControls(room, totalMessages, limit); + } catch (error) { + console.error('Error loading messages from QDN:', error); + } +} + + +// Polling function to check for new messages without clearing existing ones +function startPollingForNewMessages() { + setInterval(async () => { + const activeRoom = document.querySelector('.room-title')?.innerText.toLowerCase().split(" ")[0]; + if (activeRoom) { + await loadMessagesFromQDN(activeRoom, currentPage, true); + } + }, 20000); +} + diff --git a/assets/js/BACKUP/backup-Dec-9-MinterBoard.js b/assets/js/BACKUP/backup-Dec-9-MinterBoard.js new file mode 100644 index 0000000..cf85537 --- /dev/null +++ b/assets/js/BACKUP/backup-Dec-9-MinterBoard.js @@ -0,0 +1,175 @@ +// const cardIdentifier = `minter-board-card-${Date.now()}`; +const cardIdentifier = `test-board-card-${await uid()}`; + + +document.addEventListener("DOMContentLoaded", async () => { + const minterBoardLinks = document.querySelectorAll('a[href="MINTER-BOARD"], a[href="MINTERS"]'); + + minterBoardLinks.forEach(link => { + link.addEventListener("click", async (event) => { + event.preventDefault(); + if (!userState.isLoggedIn) { + await login(); + } + await loadMinterBoardPage(); + }); + }); +}); + + +async function loadMinterBoardPage() { + // Clear existing content on the page + const bodyChildren = document.body.children; + for (let i = bodyChildren.length - 1; i >= 0; i--) { + const child = bodyChildren[i]; + if (!child.classList.contains('menu')) { + child.remove(); + } + } + + // Add the "Minter Board" content + const mainContent = document.createElement("div"); + mainContent.innerHTML = ` +
+

Minter Board

+ +
+ +
+ `; + document.body.appendChild(mainContent); + + document.getElementById("publish-card-button").addEventListener("click", () => { + document.getElementById("publish-card-view").style.display = "block"; + document.getElementById("cards-container").style.display = "none"; + }); + + document.getElementById("cancel-publish").addEventListener("click", () => { + document.getElementById("publish-card-view").style.display = "none"; + document.getElementById("cards-container").style.display = "block"; + }); + + document.getElementById("add-link-button").addEventListener("click", () => { + const linksContainer = document.getElementById("links-container"); + const newLinkInput = document.createElement("input"); + newLinkInput.type = "text"; + newLinkInput.className = "card-link"; + newLinkInput.placeholder = "Enter QDN link"; + linksContainer.appendChild(newLinkInput); + }); + + document.getElementById("publish-card-form").addEventListener("submit", async (event) => { + event.preventDefault(); + await publishCard(); + }); + + await loadCards(); +} + +async function publishCard() { + const header = document.getElementById("card-header").value.trim(); + const content = document.getElementById("card-content").value.trim(); + const links = Array.from(document.querySelectorAll(".card-link")) + .map(input => input.value.trim()) + .filter(link => link.startsWith("qortal://")); + + if (!header || !content) { + alert("Header and content are required!"); + return; + } + + const cardData = { + header, + content, + links, + creator: userState.accountName, + timestamp: new Date().toISOString(), + }; + + + + try { + const base64CardData = btoa(JSON.stringify(cardData)); + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "BLOG_POST", + identifier: cardIdentifier, + data64: base64CardData, + }); + + alert("Card published successfully!"); + document.getElementById("publish-card-form").reset(); + document.getElementById("publish-card-view").style.display = "none"; + document.getElementById("cards-container").style.display = "block"; + await loadCards(); + } catch (error) { + console.error("Error publishing card:", error); + alert("Failed to publish card."); + } +} + +async function loadCards() { + const cardsContainer = document.getElementById("cards-container"); + cardsContainer.innerHTML = "

Loading cards...

"; + + try { + const response = await qortalRequest({ + action: "SEARCH_QDN_RESOURCES", + service: "BLOG_POST", + identifierPrefix: "minter-board-card-", + }); + + if (!response || response.length === 0) { + cardsContainer.innerHTML = "

No cards found.

"; + return; + } + + cardsContainer.innerHTML = ""; + for (const card of response) { + const cardDataResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: card.name, + service: "BLOG_POST", + identifier: card.identifier, + }); + + const cardData = JSON.parse(atob(cardDataResponse)); + const cardHTML = createCardHTML(cardData); + cardsContainer.insertAdjacentHTML("beforeend", cardHTML); + } + } catch (error) { + console.error("Error loading cards:", error); + cardsContainer.innerHTML = "

Failed to load cards.

"; + } +} + +function createCardHTML(cardData) { + const { header, content, links, creator, timestamp } = cardData; + const formattedDate = new Date(timestamp).toLocaleString(); + const linksHTML = links.map(link => `${link}`).join("
"); + + return ` +
+

${header}

+

${content}

+
${linksHTML}
+

Published by: ${creator} on ${formattedDate}

+
+ `; +} diff --git a/assets/js/BACKUP/backup-Q-Mintership.js-startedNewStyling-messagesDuplicating.js b/assets/js/BACKUP/backup-Q-Mintership.js-startedNewStyling-messagesDuplicating.js new file mode 100644 index 0000000..abd625c --- /dev/null +++ b/assets/js/BACKUP/backup-Q-Mintership.js-startedNewStyling-messagesDuplicating.js @@ -0,0 +1,302 @@ +const messageIdentifierPrefix = `mintership-forum-message`; + +let replyToMessageIdentifier = null; +let latestMessageIdentifiers = {}; // To keep track of the latest message in each room +let currentPage = 0; // Track current pagination page + +// Load the latest message identifiers from local storage +if (localStorage.getItem("latestMessageIdentifiers")) { + latestMessageIdentifiers = JSON.parse(localStorage.getItem("latestMessageIdentifiers")); +} + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLinks = document.querySelectorAll('a[href="MINTERSHIP-FORUM"]'); + + mintershipForumLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + await login(); // Assuming login is an async function + await loadForumPage(); + loadRoomContent("general"); // Automatically load General Room on forum load + startPollingForNewMessages(); // Start polling for new messages after loading the forum page + }); + }); +}); + +async function loadForumPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + // Check if user is an admin + const minterGroupAdmins = await fetchMinterGroupAdmins(); + const isUserAdmin = minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) || await verifyUserIsAdmin(); + + // Create the forum layout, including a header, sub-menu, and keeping the original background image + const mainContent = document.createElement('div'); + const backgroundImage = document.querySelector('.header1')?.style.backgroundImage; + mainContent.innerHTML = ` +
+
+ MINTERSHIP FORUM (Alpha) + +
+
+
+ + ${isUserAdmin ? '' : ''} + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("minters"); + }); + if (isUserAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("general"); + }); +} + +function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+
+
+
+ +
+ +
+ `; + + // Initialize Quill editor for rich text input + const quill = new Quill('#editor', { + theme: 'snow', + modules: { + toolbar: [ + [{ 'font': [] }], // Add font family options + [{ 'size': ['small', false, 'large', 'huge'] }], // Add font size options + [{ 'header': [1, 2, false] }], + ['bold', 'italic', 'underline'], // Text formatting options + [{ 'list': 'ordered'}, { 'list': 'bullet' }], + ['link', 'blockquote', 'code-block'], + [{ 'color': [] }, { 'background': [] }], // Text color and background color options + [{ 'align': [] }], // Text alignment + ['clean'] // Remove formatting button + ] + } + }); + + // Load messages from QDN for the selected room + loadMessagesFromQDN(room, currentPage); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "") { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + + // Create message object with unique identifier and HTML content + const messageObject = { + messageHtml: messageHtml, + hasAttachment: false, + replyTo: replyToMessageIdentifier + }; + + try { + // Convert message object to base64 + let base64Message = await objectToBase64(messageObject); + if (!base64Message) { + console.log(`initial object creation with object failed, using btoa...`) + base64Message = btoa(JSON.stringify(messageObject)); + } + + console.log("Message Object:", messageObject); + console.log("Base64 Encoded Message:", base64Message); + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, // Publisher must own the registered name + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + console.log("Message published successfully"); + // Clear the editor after sending the message + quill.root.innerHTML = ""; + replyToMessageIdentifier = null; // Clear reply reference after sending + // Update the latest message identifier + latestMessageIdentifiers[room] = messageIdentifier; + localStorage.setItem("latestMessageIdentifiers", JSON.stringify(latestMessageIdentifiers)); + // Reload messages + loadMessagesFromQDN(room, currentPage); + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + + // Add event listener for the load more button + document.getElementById("load-more-button").addEventListener("click", () => { + currentPage++; + loadMessagesFromQDN(room, currentPage); + }); + } +} + +// Load messages for any given room with pagination +async function loadMessagesFromQDN(room, page) { + try { + const offset = page * 10; + const limit = 10; + const response = await searchAllResources(`${messageIdentifierPrefix}-${room}`, offset, limit); + + const qdnMessages = response; + console.log("Messages fetched successfully:", qdnMessages); + + const messagesContainer = document.querySelector("#messages-container"); + if (messagesContainer) { + if (!qdnMessages || !qdnMessages.length) { + if (page === 0) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + } + return; + } + + let messagesHTML = messagesContainer.innerHTML; + + const fetchMessages = await Promise.all(qdnMessages.map(async (resource) => { + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data if no 'encoding: base64' is set. + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { name: resource.name, content: messageObject.messageHtml, date: formattedTimestamp, identifier: resource.identifier, replyTo: messageObject.replyTo }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + fetchMessages.forEach(async (message) => { + if (message) { + let replyHtml = ""; + if (message.replyTo) { + const repliedMessage = fetchMessages.find(m => m && m.identifier === message.replyTo); + if (repliedMessage) { + replyHtml = ` +
+
In reply to: ${repliedMessage.name} ${repliedMessage.date}
+
${repliedMessage.content}
+
+ `; + } + } + + const isNewMessage = !latestMessageIdentifiers[room] || new Date(message.date) > new Date(latestMessageIdentifiers[room]); + + messagesHTML += ` +
+ ${replyHtml} +
+ ${message.name} + ${message.date} + ${isNewMessage ? 'NEW' : ''} +
+
${message.content}
+ +
+ `; + } + }); + + messagesContainer.innerHTML = messagesHTML; + + setTimeout(() => { + messagesContainer.scrollTop = messagesContainer.scrollHeight; + }, 1000); + + // Add event listeners to the reply buttons + const replyButtons = document.querySelectorAll(".reply-button"); + + replyButtons.forEach(button => { + button.addEventListener("click", () => { + replyToMessageIdentifier = button.dataset.messageIdentifier; + // Find the message being replied to + const repliedMessage = fetchMessages.find(m => m && m.identifier === replyToMessageIdentifier); + + if (repliedMessage) { + const replyContainer = document.createElement("div"); + replyContainer.className = "reply-container"; + replyContainer.innerHTML = ` +
+ Replying to: ${repliedMessage.content} + +
+ `; + + const messageInputSection = document.querySelector(".message-input-section"); + + if (messageInputSection) { + messageInputSection.insertBefore(replyContainer, messageInputSection.firstChild); + + // Add a listener for the cancel reply button + document.getElementById("cancel-reply").addEventListener("click", () => { + replyToMessageIdentifier = null; + replyContainer.remove(); + }); + } + } + }); + }); + + } + } catch (error) { + console.error('Error loading messages from QDN:', error); + } +} + +// Polling function to check for new messages +function startPollingForNewMessages() { + setInterval(async () => { + const activeRoom = document.querySelector('.room-title')?.innerText.toLowerCase().split(" ")[0]; + if (activeRoom) { + await loadMessagesFromQDN(activeRoom, currentPage); + } + }, 10000); +} diff --git a/assets/js/BACKUP/backup-Q-Mintership.js-startedNewStyling.js b/assets/js/BACKUP/backup-Q-Mintership.js-startedNewStyling.js new file mode 100644 index 0000000..35252f7 --- /dev/null +++ b/assets/js/BACKUP/backup-Q-Mintership.js-startedNewStyling.js @@ -0,0 +1,289 @@ +const messageIdentifierPrefix = `mintership-forum-message`; + +let replyToMessageIdentifier = null; +let latestMessageIdentifiers = {}; // To keep track of the latest message in each room + +// Load the latest message identifiers from local storage +if (localStorage.getItem("latestMessageIdentifiers")) { + latestMessageIdentifiers = JSON.parse(localStorage.getItem("latestMessageIdentifiers")); +} + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLinks = document.querySelectorAll('a[href="MINTERSHIP-FORUM"]'); + + mintershipForumLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + await login(); // Assuming login is an async function + await loadForumPage(); + startPollingForNewMessages(); // Start polling for new messages after loading the forum page + }); +}); +}); + +async function loadForumPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + // Check if user is an admin + const minterGroupAdmins = await fetchMinterGroupAdmins(); + const isUserAdmin = minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) || await verifyUserIsAdmin(); + + // Create the forum layout, including a header, sub-menu, and keeping the original background image + const mainContent = document.createElement('div'); + const backgroundImage = document.querySelector('.header1')?.style.backgroundImage; + mainContent.innerHTML = ` +
+
MINTERSHIP FORUM (Alpha)
+
+
+ + ${isUserAdmin ? '' : ''} + + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + loadRoomContent("minters"); + }); + if (isUserAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + loadRoomContent("general"); + }); +} + +function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+
+
+
+ +
+
+ `; + + // Initialize Quill editor for rich text input + // const quill = new Quill('#editor', { + // theme: 'snow', + // modules: { + // toolbar: '#toolbar' // Link to the external toolbar element + // } + // }); + + const quill = new Quill('#editor', { + theme: 'snow', + modules: { + toolbar: [ + [{ 'header': [1, 2, false] }], + ['bold', 'italic', 'underline'], + [{ 'list': 'ordered'}, { 'list': 'bullet' }], + ['link', 'blockquote', 'code-block'], + [{ 'color': [] }, { 'background': [] }], + ['clean'] // remove formatting button + ] + } + }); + + // Load messages from QDN for the selected room + loadMessagesFromQDN(room); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "") { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + + // Create message object with unique identifier and HTML content + const messageObject = { + messageHtml: messageHtml, + hasAttachment: false, + replyTo: replyToMessageIdentifier + }; + + try { + // Convert message object to base64 + let base64Message = await objectToBase64(messageObject); + if (!base64Message) { + console.log(`initial object creation with object failed, using btoa...`) + base64Message = btoa(JSON.stringify(messageObject)); + } + + console.log("Message Object:", messageObject); + console.log("Base64 Encoded Message:", base64Message); + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, // Publisher must own the registered name + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + console.log("Message published successfully"); + // Clear the editor after sending the message + quill.root.innerHTML = ""; + replyToMessageIdentifier = null; // Clear reply reference after sending + // Update the latest message identifier + latestMessageIdentifiers[room] = messageIdentifier; + localStorage.setItem("latestMessageIdentifiers", JSON.stringify(latestMessageIdentifiers)); + // Reload messages + loadMessagesFromQDN(room); + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + } +} + + +// Load messages for any given room +async function loadMessagesFromQDN(room) { + try { + const response = await searchAllResources(`${messageIdentifierPrefix}-${room}`, 0, false); + + const qdnMessages = response; + console.log("Messages fetched successfully:", qdnMessages); + + const messagesContainer = document.querySelector("#messages-container"); + if (messagesContainer) { + if (!qdnMessages || !qdnMessages.length) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + return; + } + + let messagesHTML = ""; + + const fetchMessages = await Promise.all(qdnMessages.map(async (resource) => { + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data if no 'encoding: base64' is set. + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { name: resource.name, content: messageObject.messageHtml, date: formattedTimestamp, identifier: resource.identifier, replyTo: messageObject.replyTo }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + fetchMessages.forEach(async (message) => { + if (message) { + let replyHtml = ""; + if (message.replyTo) { + const repliedMessage = fetchMessages.find(m => m && m.identifier === message.replyTo); + if (repliedMessage) { + replyHtml = ` +
+
In reply to: ${repliedMessage.name} ${repliedMessage.date}
+
${repliedMessage.content}
+
+ `; + } + } + + const isNewMessage = !latestMessageIdentifiers[room] || new Date(message.date) > new Date(latestMessageIdentifiers[room]); + + messagesHTML += ` +
+ ${replyHtml} +
+ ${message.name} + ${message.date} + ${isNewMessage ? 'NEW' : ''} +
+
${message.content}
+ +
+ `; + } + }); + + messagesContainer.innerHTML = messagesHTML; + + setTimeout(() => { + messagesContainer.scrollTop = messagesContainer.scrollHeight; + }, 1000); + + // Add event listeners to the reply buttons + const replyButtons = document.querySelectorAll(".reply-button"); + + replyButtons.forEach(button => { + button.addEventListener("click", () => { + replyToMessageIdentifier = button.dataset.messageIdentifier; + // Find the message being replied to + const repliedMessage = fetchMessages.find(m => m && m.identifier === replyToMessageIdentifier); + + if (repliedMessage) { + const replyContainer = document.createElement("div"); + replyContainer.className = "reply-container"; + replyContainer.innerHTML = ` +
+ Replying to: ${repliedMessage.content} + +
+ `; + + const messageInputSection = document.querySelector(".message-input-section"); + + if (messageInputSection) { + messageInputSection.insertBefore(replyContainer, messageInputSection.firstChild); + + // Add a listener for the cancel reply button + document.getElementById("cancel-reply").addEventListener("click", () => { + replyToMessageIdentifier = null; + replyContainer.remove(); + }); + } + } + }); + }); + + } + } catch (error) { + console.error('Error loading messages from QDN:', error); + } +} + +// Polling function to check for new messages +function startPollingForNewMessages() { + setInterval(async () => { + const activeRoom = document.querySelector('.room-title')?.innerText.toLowerCase().split(" ")[0]; + if (activeRoom) { + await loadMessagesFromQDN(activeRoom); + } + }, 10000); +} diff --git a/assets/js/BACKUP/backup-Q-Mintership.js-workingButNeedsFurtherFormattingEtc-.js b/assets/js/BACKUP/backup-Q-Mintership.js-workingButNeedsFurtherFormattingEtc-.js new file mode 100644 index 0000000..1e68fbc --- /dev/null +++ b/assets/js/BACKUP/backup-Q-Mintership.js-workingButNeedsFurtherFormattingEtc-.js @@ -0,0 +1,192 @@ +const messageIdentifierPrefix = `mintership-forum-message` + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLink = document.querySelector('a[href="MINTERSHIP-FORUM"]'); + + if (mintershipForumLink) { + mintershipForumLink.addEventListener('click', async (event) => { + event.preventDefault(); + await login(); // Assuming login is an async function + await loadForumPage(); + }); + } +}); + +async function loadForumPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + // Check if user is an admin + const minterGroupAdmins = await fetchMinterGroupAdmins(); + const isUserAdmin = minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) || await verifyUserIsAdmin(); + + // Create the forum layout, including a header, sub-menu, and keeping the original background image + const mainContent = document.createElement('div'); + const backgroundImage = document.querySelector('.header1')?.style.backgroundImage; + mainContent.innerHTML = ` +
+
MINTERSHIP FORUM (Alpha)
+
+
+ + ${isUserAdmin ? '' : ''} + + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + loadRoomContent("minters"); + }); + if (isUserAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + loadRoomContent("general"); + }); +} + +function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+
+
+ +
+
+ `; + // Initialize Quill editor for rich text input + const quill = new Quill('#editor', { + theme: 'snow' + }); + + // Load messages from QDN for the selected room + loadMessagesFromQDN(room); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "") { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + + // Create message object with unique identifier and HTML content + const messageObject = { + messageHtml: messageHtml, + hasAttachment: false + }; + + try { + // Convert message object to base64 + const base64Message = await objectToBase64(messageObject); + if (!messageObject) { + console.log(`initial object creation with object failed, using btoa...`) + base64Message = btoa(JSON.stringify(messageObject)); + } + + console.log("Message Object:", messageObject); + console.log("Base64 Encoded Message:", base64Message); + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, // Publisher must own the registered name + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + console.log("Message published successfully"); + // Clear the editor after sending the message + quill.root.innerHTML = ""; + // Reload messages + loadMessagesFromQDN(room); + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + } +} + +// Helper function to load messages from QDN for a specific room +async function loadMessagesFromQDN(room) { + try { + const response = await searchAllResources(`${messageIdentifierPrefix}-${room}`, 0, false); + + const qdnMessages = response; + console.log("Messages fetched successfully:", qdnMessages); + + const messagesContainer = document.querySelector("#messages-container"); + if (messagesContainer) { + if (!qdnMessages || !qdnMessages.length) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + return; + } + + let messagesHTML = ""; + + const fetchMessages = await Promise.all(qdnMessages.map(async (resource) => { + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { name: resource.name, content: messageObject.messageHtml, date: formattedTimestamp }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + fetchMessages.forEach(async (message) => { + if (message) { + messagesHTML += ` +
+
+ ${message.name} + ${message.date} +
+
${message.content}
+ +
+ `; + } + }); + + messagesContainer.innerHTML = messagesHTML; + setTimeout(() => { + messagesContainer.scrollTop = messagesContainer.scrollHeight; + }, 5000); + } + } catch (error) { + console.error("Error loading messages from QDN:", error); + } +} diff --git a/assets/js/BACKUP/backup-Q-Mintership.js-workingWithOtherStyle-butToolbarStillIsNotRight.js b/assets/js/BACKUP/backup-Q-Mintership.js-workingWithOtherStyle-butToolbarStillIsNotRight.js new file mode 100644 index 0000000..a078638 --- /dev/null +++ b/assets/js/BACKUP/backup-Q-Mintership.js-workingWithOtherStyle-butToolbarStillIsNotRight.js @@ -0,0 +1,282 @@ +const messageIdentifierPrefix = `mintership-forum-message`; + +let replyToMessageIdentifier = null; +let latestMessageIdentifiers = {}; // To keep track of the latest message in each room + +// Load the latest message identifiers from local storage +if (localStorage.getItem("latestMessageIdentifiers")) { + latestMessageIdentifiers = JSON.parse(localStorage.getItem("latestMessageIdentifiers")); +} + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLinks = document.querySelectorAll('a[href="MINTERSHIP-FORUM"]'); + + mintershipForumLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + await login(); // Assuming login is an async function + await loadForumPage(); + startPollingForNewMessages(); // Start polling for new messages after loading the forum page + }); +}); +}); + +async function loadForumPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + // Check if user is an admin + const minterGroupAdmins = await fetchMinterGroupAdmins(); + const isUserAdmin = minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) || await verifyUserIsAdmin(); + + // Create the forum layout, including a header, sub-menu, and keeping the original background image + const mainContent = document.createElement('div'); + const backgroundImage = document.querySelector('.header1')?.style.backgroundImage; + mainContent.innerHTML = ` +
+
MINTERSHIP FORUM (Alpha)
+
+
+ + ${isUserAdmin ? '' : ''} + + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + loadRoomContent("minters"); + }); + if (isUserAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + loadRoomContent("general"); + }); +} + +function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+
+
+
+ +
+
+ `; + + // Initialize Quill editor for rich text input + const quill = new Quill('#editor', { + theme: 'snow', + modules: { + toolbar: [ + [{ 'header': [1, 2, false] }], + ['bold', 'italic', 'underline'], + [{ 'list': 'ordered'}, { 'list': 'bullet' }], + ['link', 'blockquote', 'code-block'], + [{ 'color': [] }, { 'background': [] }], + ['clean'] // remove formatting button + ] + } + }); + + // Load messages from QDN for the selected room + loadMessagesFromQDN(room); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "") { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + + // Create message object with unique identifier and HTML content + const messageObject = { + messageHtml: messageHtml, + hasAttachment: false, + replyTo: replyToMessageIdentifier + }; + + try { + // Convert message object to base64 + let base64Message = await objectToBase64(messageObject); + if (!base64Message) { + console.log(`initial object creation with object failed, using btoa...`) + base64Message = btoa(JSON.stringify(messageObject)); + } + + console.log("Message Object:", messageObject); + console.log("Base64 Encoded Message:", base64Message); + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, // Publisher must own the registered name + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + console.log("Message published successfully"); + // Clear the editor after sending the message + quill.root.innerHTML = ""; + replyToMessageIdentifier = null; // Clear reply reference after sending + // Update the latest message identifier + latestMessageIdentifiers[room] = messageIdentifier; + localStorage.setItem("latestMessageIdentifiers", JSON.stringify(latestMessageIdentifiers)); + // Reload messages + loadMessagesFromQDN(room); + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + } +} + + +// Load messages for any given room +async function loadMessagesFromQDN(room) { + try { + const response = await searchAllResources(`${messageIdentifierPrefix}-${room}`, 0, false); + + const qdnMessages = response; + console.log("Messages fetched successfully:", qdnMessages); + + const messagesContainer = document.querySelector("#messages-container"); + if (messagesContainer) { + if (!qdnMessages || !qdnMessages.length) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + return; + } + + let messagesHTML = ""; + + const fetchMessages = await Promise.all(qdnMessages.map(async (resource) => { + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data if no 'encoding: base64' is set. + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { name: resource.name, content: messageObject.messageHtml, date: formattedTimestamp, identifier: resource.identifier, replyTo: messageObject.replyTo }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + fetchMessages.forEach(async (message) => { + if (message) { + let replyHtml = ""; + if (message.replyTo) { + const repliedMessage = fetchMessages.find(m => m && m.identifier === message.replyTo); + if (repliedMessage) { + replyHtml = ` +
+
In reply to: ${repliedMessage.name} ${repliedMessage.date}
+
${repliedMessage.content}
+
+ `; + } + } + + const isNewMessage = !latestMessageIdentifiers[room] || new Date(message.date) > new Date(latestMessageIdentifiers[room]); + + messagesHTML += ` +
+ ${replyHtml} +
+ ${message.name} + ${message.date} + ${isNewMessage ? 'NEW' : ''} +
+
${message.content}
+ +
+ `; + } + }); + + messagesContainer.innerHTML = messagesHTML; + + setTimeout(() => { + messagesContainer.scrollTop = messagesContainer.scrollHeight; + }, 1000); + + // Add event listeners to the reply buttons + const replyButtons = document.querySelectorAll(".reply-button"); + + replyButtons.forEach(button => { + button.addEventListener("click", () => { + replyToMessageIdentifier = button.dataset.messageIdentifier; + // Find the message being replied to + const repliedMessage = fetchMessages.find(m => m && m.identifier === replyToMessageIdentifier); + + if (repliedMessage) { + const replyContainer = document.createElement("div"); + replyContainer.className = "reply-container"; + replyContainer.innerHTML = ` +
+ Replying to: ${repliedMessage.content} + +
+ `; + + const messageInputSection = document.querySelector(".message-input-section"); + + if (messageInputSection) { + messageInputSection.insertBefore(replyContainer, messageInputSection.firstChild); + + // Add a listener for the cancel reply button + document.getElementById("cancel-reply").addEventListener("click", () => { + replyToMessageIdentifier = null; + replyContainer.remove(); + }); + } + } + }); + }); + + } + } catch (error) { + console.error('Error loading messages from QDN:', error); + } +} + +// Polling function to check for new messages +function startPollingForNewMessages() { + setInterval(async () => { + const activeRoom = document.querySelector('.room-title')?.innerText.toLowerCase().split(" ")[0]; + if (activeRoom) { + await loadMessagesFromQDN(activeRoom); + } + }, 10000); +} diff --git a/assets/js/BACKUP/backup-Q-Mintership.js-workingWithOtherStyle-stillNeedsImprovements.js b/assets/js/BACKUP/backup-Q-Mintership.js-workingWithOtherStyle-stillNeedsImprovements.js new file mode 100644 index 0000000..10eb409 --- /dev/null +++ b/assets/js/BACKUP/backup-Q-Mintership.js-workingWithOtherStyle-stillNeedsImprovements.js @@ -0,0 +1,274 @@ +const messageIdentifierPrefix = `mintership-forum-message`; + +let replyToMessageIdentifier = null; +let latestMessageIdentifiers = {}; // To keep track of the latest message in each room + +// Load the latest message identifiers from local storage +if (localStorage.getItem("latestMessageIdentifiers")) { + latestMessageIdentifiers = JSON.parse(localStorage.getItem("latestMessageIdentifiers")); +} + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLinks = document.querySelectorAll('a[href="MINTERSHIP-FORUM"]'); + mintershipForumLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + await login(); // Assuming login is an async function + await loadForumPage(); + startPollingForNewMessages(); // Start polling for new messages after loading the forum page + }); +}); + + // if (mintershipForumLink) { + // mintershipForumLink.addEventListener('click', async (event) => { + // event.preventDefault(); + // await login(); // Assuming login is an async function + // await loadForumPage(); + // startPollingForNewMessages(); // Start polling for new messages after loading the forum page + // }); + // } +}); + +async function loadForumPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + // Check if user is an admin + const minterGroupAdmins = await fetchMinterGroupAdmins(); + const isUserAdmin = minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) || await verifyUserIsAdmin(); + + // Create the forum layout, including a header, sub-menu, and keeping the original background image + const mainContent = document.createElement('div'); + const backgroundImage = document.querySelector('.header1')?.style.backgroundImage; + mainContent.innerHTML = ` +
+
MINTERSHIP FORUM (Alpha)
+
+
+ + ${isUserAdmin ? '' : ''} + + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + loadRoomContent("minters"); + }); + if (isUserAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + loadRoomContent("general"); + }); +} + +function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+
+
+ +
+
+ `; + // Initialize Quill editor for rich text input + const quill = new Quill('#editor', { + theme: 'snow' + }); + + // Load messages from QDN for the selected room + loadMessagesFromQDN(room); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "") { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + + // Create message object with unique identifier and HTML content + const messageObject = { + messageHtml: messageHtml, + hasAttachment: false, + replyTo: replyToMessageIdentifier + }; + + try { + // Convert message object to base64 + const base64Message = await objectToBase64(messageObject); + if (!messageObject) { + console.log(`initial object creation with object failed, using btoa...`) + base64Message = btoa(JSON.stringify(messageObject)); + } + + console.log("Message Object:", messageObject); + console.log("Base64 Encoded Message:", base64Message); + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, // Publisher must own the registered name + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + console.log("Message published successfully"); + // Clear the editor after sending the message + quill.root.innerHTML = ""; + replyToMessageIdentifier = null; // Clear reply reference after sending + // Update the latest message identifier + latestMessageIdentifiers[room] = messageIdentifier; + localStorage.setItem("latestMessageIdentifiers", JSON.stringify(latestMessageIdentifiers)); + // Reload messages + loadMessagesFromQDN(room); + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + } +} + +// Helper function to load messages from QDN for a specific room +async function loadMessagesFromQDN(room) { + try { + const response = await searchAllResources(`${messageIdentifierPrefix}-${room}`, 0, false); + + const qdnMessages = response; + console.log("Messages fetched successfully:", qdnMessages); + + const messagesContainer = document.querySelector("#messages-container"); + if (messagesContainer) { + if (!qdnMessages || !qdnMessages.length) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + return; + } + + let messagesHTML = ""; + + const fetchMessages = await Promise.all(qdnMessages.map(async (resource) => { + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { name: resource.name, content: messageObject.messageHtml, date: formattedTimestamp, identifier: resource.identifier, replyTo: messageObject.replyTo }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + fetchMessages.forEach(async (message) => { + if (message) { + let replyHtml = ""; + if (message.replyTo) { + const repliedMessage = fetchMessages.find(m => m && m.identifier === message.replyTo); + if (repliedMessage) { + replyHtml = ` +
+
In reply to: ${repliedMessage.name} ${repliedMessage.date}
+
${repliedMessage.content}
+
+ `; + } + } + + const isNewMessage = !latestMessageIdentifiers[room] || new Date(message.date) > new Date(latestMessageIdentifiers[room]); + + messagesHTML += ` +
+ ${replyHtml} +
+ ${message.name} + ${message.date} + ${isNewMessage ? 'NEW' : ''} +
+
${message.content}
+ +
+ `; + } + }); + + messagesContainer.innerHTML = messagesHTML; + setTimeout(() => { + messagesContainer.scrollTop = messagesContainer.scrollHeight; + }, 1000); + + // Add event listeners to the reply buttons + const replyButtons = document.querySelectorAll(".reply-button"); + replyButtons.forEach(button => { + button.addEventListener("click", () => { + replyToMessageIdentifier = button.dataset.messageIdentifier; + + // Find the message being replied to + const repliedMessage = fetchMessages.find(m => m && m.identifier === replyToMessageIdentifier); + if (repliedMessage) { + const replyContainer = document.createElement("div"); + replyContainer.className = "reply-container"; + replyContainer.innerHTML = ` +
+ Replying to: ${repliedMessage.content} + +
+ `; + const messageInputSection = document.querySelector(".message-input-section"); + if (messageInputSection) { + messageInputSection.insertBefore(replyContainer, messageInputSection.firstChild); + + // Add a listener for the cancel reply button + document.getElementById("cancel-reply").addEventListener("click", () => { + replyToMessageIdentifier = null; + replyContainer.remove(); + }); + } + } + }); + }); + + } + } catch (error) { + console.error('Error loading messages from QDN:', error); + } +} + + +// Polling function to check for new messages +function startPollingForNewMessages() { + setInterval(async () => { + const activeRoom = document.querySelector('.room-title')?.innerText.toLowerCase().split(" ")[0]; + if (activeRoom) { + await loadMessagesFromQDN(activeRoom); + } + }, 10000); +} diff --git a/assets/js/BACKUP/backup-Q-Mintership.js-workingWithOtherStyle.js b/assets/js/BACKUP/backup-Q-Mintership.js-workingWithOtherStyle.js new file mode 100644 index 0000000..198a9d2 --- /dev/null +++ b/assets/js/BACKUP/backup-Q-Mintership.js-workingWithOtherStyle.js @@ -0,0 +1,219 @@ +const messageIdentifierPrefix = `mintership-forum-message`; + +let replyToMessageIdentifier = null; + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLink = document.querySelector('a[href="MINTERSHIP-FORUM"]'); + + if (mintershipForumLink) { + mintershipForumLink.addEventListener('click', async (event) => { + event.preventDefault(); + await login(); // Assuming login is an async function + await loadForumPage(); + }); + } +}); + +async function loadForumPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + // Check if user is an admin + const minterGroupAdmins = await fetchMinterGroupAdmins(); + const isUserAdmin = minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) || await verifyUserIsAdmin(); + + // Create the forum layout, including a header, sub-menu, and keeping the original background image + const mainContent = document.createElement('div'); + const backgroundImage = document.querySelector('.header1')?.style.backgroundImage; + mainContent.innerHTML = ` +
+
MINTERSHIP FORUM (Alpha)
+
+
+ + ${isUserAdmin ? '' : ''} + + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + loadRoomContent("minters"); + }); + if (isUserAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + loadRoomContent("general"); + }); +} + +function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+
+
+ +
+
+ `; + // Initialize Quill editor for rich text input + const quill = new Quill('#editor', { + theme: 'snow' + }); + + // Load messages from QDN for the selected room + loadMessagesFromQDN(room); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "") { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + + // Create message object with unique identifier and HTML content + const messageObject = { + messageHtml: messageHtml, + hasAttachment: false, + replyTo: replyToMessageIdentifier + }; + + try { + // Convert message object to base64 + const base64Message = await objectToBase64(messageObject); + if (!messageObject) { + console.log(`initial object creation with object failed, using btoa...`) + base64Message = btoa(JSON.stringify(messageObject)); + } + + console.log("Message Object:", messageObject); + console.log("Base64 Encoded Message:", base64Message); + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, // Publisher must own the registered name + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + console.log("Message published successfully"); + // Clear the editor after sending the message + quill.root.innerHTML = ""; + replyToMessageIdentifier = null; // Clear reply reference after sending + // Reload messages + loadMessagesFromQDN(room); + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + } +} + +// Helper function to load messages from QDN for a specific room +async function loadMessagesFromQDN(room) { + try { + const response = await searchAllResources(`${messageIdentifierPrefix}-${room}`, 0, false); + + const qdnMessages = response; + console.log("Messages fetched successfully:", qdnMessages); + + const messagesContainer = document.querySelector("#messages-container"); + if (messagesContainer) { + if (!qdnMessages || !qdnMessages.length) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + return; + } + + let messagesHTML = ""; + + const fetchMessages = await Promise.all(qdnMessages.map(async (resource) => { + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { name: resource.name, content: messageObject.messageHtml, date: formattedTimestamp, identifier: resource.identifier, replyTo: messageObject.replyTo }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + fetchMessages.forEach(async (message) => { + if (message) { + let replyHtml = ""; + if (message.replyTo) { + const repliedMessage = fetchMessages.find(m => m && m.identifier === message.replyTo); + if (repliedMessage) { + replyHtml = ` +
+
In reply to: ${repliedMessage.name} ${repliedMessage.date}
+
${repliedMessage.content}
+
+ `; + } + } + + messagesHTML += ` +
+ ${replyHtml} +
+ ${message.name} + ${message.date} +
+
${message.content}
+ +
+ `; + } + }); + + messagesContainer.innerHTML = messagesHTML; + setTimeout(() => { + messagesContainer.scrollTop = messagesContainer.scrollHeight; + }, 5000); + + // Add event listeners to reply buttons + const replyButtons = document.querySelectorAll(".reply-button"); + replyButtons.forEach(button => { + button.addEventListener("click", (event) => { + replyToMessageIdentifier = event.target.getAttribute("data-message-identifier"); + console.log("Replying to message with identifier:", replyToMessageIdentifier); + }); + }); + } + } catch (error) { + console.error("Error loading messages from QDN:", error); + } +} diff --git a/assets/js/BACKUP/backup-dec-10-2024-KindaWorkingKindaStyled-2-MinterBoard.js b/assets/js/BACKUP/backup-dec-10-2024-KindaWorkingKindaStyled-2-MinterBoard.js new file mode 100644 index 0000000..9c74a3c --- /dev/null +++ b/assets/js/BACKUP/backup-dec-10-2024-KindaWorkingKindaStyled-2-MinterBoard.js @@ -0,0 +1,464 @@ +const cardIdentifierPrefix = "test-board-card"; +let isExistingCard = false +let existingCard = {} +document.addEventListener("DOMContentLoaded", async () => { + const minterBoardLinks = document.querySelectorAll('a[href="MINTER-BOARD"], a[href="MINTERS"]'); + + minterBoardLinks.forEach(link => { + link.addEventListener("click", async (event) => { + event.preventDefault(); + if (!userState.isLoggedIn) { + await login(); + } + await loadMinterBoardPage(); + }); + }); +}); + +async function loadMinterBoardPage() { + // Clear existing content on the page + const bodyChildren = document.body.children; + for (let i = bodyChildren.length - 1; i >= 0; i--) { + const child = bodyChildren[i]; + if (!child.classList.contains("menu")) { + child.remove(); + } + } + + // Add the "Minter Board" content + const mainContent = document.createElement("div"); + mainContent.innerHTML = ` +
+

Minter Board

+ +
+ +
+ `; + document.body.appendChild(mainContent); + + document.getElementById("publish-card-button").addEventListener("click", async () => { + existingCard = await fetchExistingCard(); + if (existingCard) { + const updateCard = confirm("You already have a card. Do you want to update it?"); + isExistingCard = true + if (updateCard) { + loadCardIntoForm(existingCard); + document.getElementById("publish-card-view").style.display = "block"; + document.getElementById("cards-container").style.display = "none"; + } + } else { + document.getElementById("publish-card-view").style.display = "block"; + document.getElementById("cards-container").style.display = "none"; + } + }); + + document.getElementById("cancel-publish").addEventListener("click", () => { + document.getElementById("publish-card-view").style.display = "none"; + document.getElementById("cards-container").style.display = "block"; + }); + + document.getElementById("add-link-button").addEventListener("click", () => { + const linksContainer = document.getElementById("links-container"); + const newLinkInput = document.createElement("input"); + newLinkInput.type = "text"; + newLinkInput.className = "card-link"; + newLinkInput.placeholder = "Enter QDN link"; + linksContainer.appendChild(newLinkInput); + }); + + document.getElementById("publish-card-form").addEventListener("submit", async (event) => { + event.preventDefault(); + await publishCard(); + }); + + await loadCards(); +} + +async function fetchExistingCard() { + try { + const response = await qortalRequest({ + action: "SEARCH_QDN_RESOURCES", + service: "BLOG_POST", + nameListFilter: userState.accountName, + query: cardIdentifierPrefix, + }); + + existingCard = response.find(card => card.name === userState.accountName); + if (existingCard) { + const cardDataResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: existingCard.name, + service: "BLOG_POST", + identifier: existingCard.identifier, + }); + + return cardDataResponse; + } + return null; + } catch (error) { + console.error("Error fetching existing card:", error); + return null; + } +} + +function loadCardIntoForm(cardData) { + document.getElementById("card-header").value = cardData.header; + document.getElementById("card-content").value = cardData.content; + + const linksContainer = document.getElementById("links-container"); + linksContainer.innerHTML = ""; // Clear previous links + cardData.links.forEach(link => { + const linkInput = document.createElement("input"); + linkInput.type = "text"; + linkInput.className = "card-link"; + linkInput.value = link; + linksContainer.appendChild(linkInput); + }); +} + +async function publishCard() { + const header = document.getElementById("card-header").value.trim(); + const content = document.getElementById("card-content").value.trim(); + const links = Array.from(document.querySelectorAll(".card-link")) + .map(input => input.value.trim()) + .filter(link => link.startsWith("qortal://")); + + if (!header || !content) { + alert("Header and content are required!"); + return; + } + + const cardIdentifier = isExistingCard ? existingCard.identifier : `${cardIdentifierPrefix}-${await uid()}`; + const pollName = `${cardIdentifier}-poll`; + const pollDescription = `Mintership Board Poll for ${userState.accountName}`; + + const cardData = { + header, + content, + links, + creator: userState.accountName, + timestamp: Date.now(), + poll: pollName, + }; + // new Date().toISOString() + try { + + let base64CardData = await objectToBase64(cardData); + if (!base64CardData) { + console.log(`initial base64 object creation with objectToBase64 failed, using btoa...`); + base64CardData = btoa(JSON.stringify(cardData)); + } + // const base64CardData = btoa(JSON.stringify(cardData)); + + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "BLOG_POST", + identifier: cardIdentifier, + data64: base64CardData, + }); + + await qortalRequest({ + action: "CREATE_POLL", + pollName, + pollDescription, + pollOptions: ["Yes", "No", "Comment"], + pollOwnerAddress: userState.accountAddress, + }); + + alert("Card and poll published successfully!"); + document.getElementById("publish-card-form").reset(); + document.getElementById("publish-card-view").style.display = "none"; + document.getElementById("cards-container").style.display = "block"; + await loadCards(); + } catch (error) { + console.error("Error publishing card or poll:", error); + alert("Failed to publish card and poll."); + } +} + +async function loadCards() { + const cardsContainer = document.getElementById("cards-container"); + cardsContainer.innerHTML = "

Loading cards...

"; + + try { + const response = await qortalRequest({ + action: "SEARCH_QDN_RESOURCES", + service: "BLOG_POST", + query: cardIdentifierPrefix, + }); + + if (!response || response.length === 0) { + cardsContainer.innerHTML = "

No cards found.

"; + return; + } + + cardsContainer.innerHTML = ""; + const pollResultsCache = {}; + + for (const card of response) { + const cardDataResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: card.name, + service: "BLOG_POST", + identifier: card.identifier, + }); + + const cardData = cardDataResponse; + // Cache poll results + if (!pollResultsCache[cardData.poll]) { + pollResultsCache[cardData.poll] = await fetchPollResults(cardData.poll); + } + + const pollResults = pollResultsCache[cardData.poll]; + const cardHTML = await createCardHTML(cardData, pollResults); + cardsContainer.insertAdjacentHTML("beforeend", cardHTML); + } + } catch (error) { + console.error("Error loading cards:", error); + cardsContainer.innerHTML = "

Failed to load cards.

"; + } +} + +const calculatePollResults = (pollData, minterGroupMembers) => { + const memberAddresses = minterGroupMembers.map(member => member.member); + let adminYes = 0, adminNo = 0, minterYes = 0, minterNo = 0; + + pollData.votes.forEach(vote => { + const voterAddress = vote.voterPublicKey; + const isAdmin = minterGroupMembers.some(member => member.member === voterAddress && member.isAdmin); + + if (vote.optionIndex === 1) { + isAdmin ? adminYes++ : memberAddresses.includes(voterAddress) ? minterYes++ : null; + } else if (vote.optionIndex === 0) { + isAdmin ? adminNo++ : memberAddresses.includes(voterAddress) ? minterNo++ : null; + } + }); + + const totalYes = adminYes + minterYes; + const totalNo = adminNo + minterNo; + + return { adminYes, adminNo, minterYes, minterNo, totalYes, totalNo }; +}; + +const postComment = async (cardIdentifier) => { + const commentInput = document.getElementById(`new-comment-${cardIdentifier}`); + const commentText = commentInput.value.trim(); + if (!commentText) { + alert('Comment cannot be empty!'); + return; + } + + const commentData = { + content: commentText, + creator: userState.accountName, + timestamp: Date.now(), + }; + + const commentIdentifier = `${cardIdentifier}-comment-${await uid()}`; + + try { + const base64CommentData = await objectToBase64(commentData); + if (!base64CommentData) { + console.log(`initial base64 object creation with objectToBase64 failed, using btoa...`); + base64CommentData = btoa(JSON.stringify(commentData)); + } + // const base64CommentData = btoa(JSON.stringify(commentData)); + await qortalRequest({ + action: 'PUBLISH_QDN_RESOURCE', + name: userState.accountName, + service: 'BLOG_POST', + identifier: commentIdentifier, + data64: base64CommentData, + }); + alert('Comment posted successfully!'); + commentInput.value = ''; // Clear input + await displayComments(cardIdentifier); // Refresh comments + } catch (error) { + console.error('Error posting comment:', error); + alert('Failed to post comment.'); + } +}; + +const fetchCommentsForCard = async (cardIdentifier) => { + try { + const response = await qortalRequest({ + action: 'SEARCH_QDN_RESOURCES', + service: 'BLOG_POST', + query: `${cardIdentifier}-comment`, + }); + return response; + } catch (error) { + console.error(`Error fetching comments for ${cardIdentifier}:`, error); + return []; + } +}; + +const displayComments = async (cardIdentifier) => { + const comments = await fetchCommentsForCard(cardIdentifier); + const commentsContainer = document.getElementById(`comments-container-${cardIdentifier}`); + commentsContainer.innerHTML = comments.map(comment => ` +
+

${comment.creator}:

+

${comment.content}

+

${timestampToHumanReadableDate(comment.timestamp)}

+
+ `).join(''); +}; + +const toggleComments = async (cardIdentifier) => { + const commentsSection = document.getElementById(`comments-section-${cardIdentifier}`); + if (commentsSection.style.display === 'none' || !commentsSection.style.display) { + await displayComments(cardIdentifier); + commentsSection.style.display = 'block'; + } else { + commentsSection.style.display = 'none'; + } +}; + + +async function loadCards() { + const cardsContainer = document.getElementById("cards-container"); + cardsContainer.innerHTML = "

Loading cards...

"; + + try { + const response = await qortalRequest({ + action: "SEARCH_QDN_RESOURCES", + service: "BLOG_POST", + query: cardIdentifierPrefix, + }); + + if (!response || response.length === 0) { + cardsContainer.innerHTML = "

No cards found.

"; + return; + } + + cardsContainer.innerHTML = ""; + const pollResultsCache = {}; + + for (const card of response) { + const cardDataResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: card.name, + service: "BLOG_POST", + identifier: card.identifier, + }); + + const cardData = cardDataResponse; + // Cache poll results + if (!pollResultsCache[cardData.poll]) { + pollResultsCache[cardData.poll] = await fetchPollResults(cardData.poll); + } + + const pollResults = pollResultsCache[cardData.poll]; + const cardHTML = await createCardHTML(cardData, pollResults); + cardsContainer.insertAdjacentHTML("beforeend", cardHTML); + } + } catch (error) { + console.error("Error loading cards:", error); + cardsContainer.innerHTML = "

Failed to load cards.

"; + } +} + +function toggleFullContent(cardIdentifier, fullContent) { + const contentPreview = document.getElementById(`content-preview-${cardIdentifier}`); + const toggleButton = document.getElementById(`toggle-content-${cardIdentifier}`); + const isExpanded = contentPreview.getAttribute("data-expanded") === "true"; + + if (isExpanded) { + // Collapse the content + contentPreview.innerText = `${fullContent.substring(0, 150)}...`; + toggleButton.innerText = "Display Full Text"; + contentPreview.setAttribute("data-expanded", "false"); + } else { + // Expand the content + contentPreview.innerText = fullContent; + toggleButton.innerText = "Show Less"; + contentPreview.setAttribute("data-expanded", "true"); + } +} + +async function createCardHTML(cardData, pollResults) { + const { header, content, links, creator, timestamp, poll } = cardData; + const formattedDate = new Date(timestamp).toLocaleString(); + const linksHTML = links.map((link, index) => ` + + `).join(""); + + const minterGroupMembers = await fetchMinterGroupMembers(); + const { adminYes, adminNo, minterYes, minterNo, totalYes, totalNo } = + calculatePollResults(pollResults, minterGroupMembers); + + const trimmedContent = content.length > 150 ? `${content.substring(0, 150)}...` : content; + + return ` +
+
+

${creator}

+

${header}

+
+
+
Minter's Message
+
+ ${trimmedContent} +
+ ${ + content.length > 150 + ? `` + : "" + } +
+ +
+
+ Admin Yes: ${adminYes} + Admin No: ${adminNo} +
+
+ Minter Yes: ${minterYes} + Minter No: ${minterNo} +
+
+ Total Yes: ${totalYes} + Total No: ${totalNo} +
+
+
+
Support Minter
+ + + +
+ +

Published by: ${creator} on ${formattedDate}

+
+` +} + + + + diff --git a/assets/js/BACKUP/backup-dec-10-2024-KindaWorkingKindaStyled-MinterBoard.js b/assets/js/BACKUP/backup-dec-10-2024-KindaWorkingKindaStyled-MinterBoard.js new file mode 100644 index 0000000..53d2796 --- /dev/null +++ b/assets/js/BACKUP/backup-dec-10-2024-KindaWorkingKindaStyled-MinterBoard.js @@ -0,0 +1,461 @@ +const cardIdentifierPrefix = "test-board-card"; +let isExistingCard = false +let existingCard = {} +document.addEventListener("DOMContentLoaded", async () => { + const minterBoardLinks = document.querySelectorAll('a[href="MINTER-BOARD"], a[href="MINTERS"]'); + + minterBoardLinks.forEach(link => { + link.addEventListener("click", async (event) => { + event.preventDefault(); + if (!userState.isLoggedIn) { + await login(); + } + await loadMinterBoardPage(); + }); + }); +}); + +async function loadMinterBoardPage() { + // Clear existing content on the page + const bodyChildren = document.body.children; + for (let i = bodyChildren.length - 1; i >= 0; i--) { + const child = bodyChildren[i]; + if (!child.classList.contains("menu")) { + child.remove(); + } + } + + // Add the "Minter Board" content + const mainContent = document.createElement("div"); + mainContent.innerHTML = ` +
+

Minter Board

+ +
+ +
+ `; + document.body.appendChild(mainContent); + + document.getElementById("publish-card-button").addEventListener("click", async () => { + existingCard = await fetchExistingCard(); + if (existingCard) { + const updateCard = confirm("You already have a card. Do you want to update it?"); + isExistingCard = true + if (updateCard) { + loadCardIntoForm(existingCard); + document.getElementById("publish-card-view").style.display = "block"; + document.getElementById("cards-container").style.display = "none"; + } + } else { + document.getElementById("publish-card-view").style.display = "block"; + document.getElementById("cards-container").style.display = "none"; + } + }); + + document.getElementById("cancel-publish").addEventListener("click", () => { + document.getElementById("publish-card-view").style.display = "none"; + document.getElementById("cards-container").style.display = "block"; + }); + + document.getElementById("add-link-button").addEventListener("click", () => { + const linksContainer = document.getElementById("links-container"); + const newLinkInput = document.createElement("input"); + newLinkInput.type = "text"; + newLinkInput.className = "card-link"; + newLinkInput.placeholder = "Enter QDN link"; + linksContainer.appendChild(newLinkInput); + }); + + document.getElementById("publish-card-form").addEventListener("submit", async (event) => { + event.preventDefault(); + await publishCard(); + }); + + await loadCards(); +} + +async function fetchExistingCard() { + try { + const response = await qortalRequest({ + action: "SEARCH_QDN_RESOURCES", + service: "BLOG_POST", + nameListFilter: userState.accountName, + query: cardIdentifierPrefix, + }); + + existingCard = response.find(card => card.name === userState.accountName); + if (existingCard) { + const cardDataResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: existingCard.name, + service: "BLOG_POST", + identifier: existingCard.identifier, + }); + + return cardDataResponse; + } + return null; + } catch (error) { + console.error("Error fetching existing card:", error); + return null; + } +} + +function loadCardIntoForm(cardData) { + document.getElementById("card-header").value = cardData.header; + document.getElementById("card-content").value = cardData.content; + + const linksContainer = document.getElementById("links-container"); + linksContainer.innerHTML = ""; // Clear previous links + cardData.links.forEach(link => { + const linkInput = document.createElement("input"); + linkInput.type = "text"; + linkInput.className = "card-link"; + linkInput.value = link; + linksContainer.appendChild(linkInput); + }); +} + +async function publishCard() { + const header = document.getElementById("card-header").value.trim(); + const content = document.getElementById("card-content").value.trim(); + const links = Array.from(document.querySelectorAll(".card-link")) + .map(input => input.value.trim()) + .filter(link => link.startsWith("qortal://")); + + if (!header || !content) { + alert("Header and content are required!"); + return; + } + + const cardIdentifier = isExistingCard ? existingCard.identifier : `${cardIdentifierPrefix}-${await uid()}`; + const pollName = `${cardIdentifier}-poll`; + const pollDescription = `Mintership Board Poll for ${userState.accountName}`; + + const cardData = { + header, + content, + links, + creator: userState.accountName, + timestamp: Date.now(), + poll: pollName, + }; + // new Date().toISOString() + try { + + let base64CardData = await objectToBase64(cardData); + if (!base64CardData) { + console.log(`initial base64 object creation with objectToBase64 failed, using btoa...`); + base64CardData = btoa(JSON.stringify(cardData)); + } + // const base64CardData = btoa(JSON.stringify(cardData)); + + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "BLOG_POST", + identifier: cardIdentifier, + data64: base64CardData, + }); + + await qortalRequest({ + action: "CREATE_POLL", + pollName, + pollDescription, + pollOptions: ["Yes", "No", "Comment"], + pollOwnerAddress: userState.accountAddress, + }); + + alert("Card and poll published successfully!"); + document.getElementById("publish-card-form").reset(); + document.getElementById("publish-card-view").style.display = "none"; + document.getElementById("cards-container").style.display = "block"; + await loadCards(); + } catch (error) { + console.error("Error publishing card or poll:", error); + alert("Failed to publish card and poll."); + } +} + +async function loadCards() { + const cardsContainer = document.getElementById("cards-container"); + cardsContainer.innerHTML = "

Loading cards...

"; + + try { + const response = await qortalRequest({ + action: "SEARCH_QDN_RESOURCES", + service: "BLOG_POST", + query: cardIdentifierPrefix, + }); + + if (!response || response.length === 0) { + cardsContainer.innerHTML = "

No cards found.

"; + return; + } + + cardsContainer.innerHTML = ""; + const pollResultsCache = {}; + + for (const card of response) { + const cardDataResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: card.name, + service: "BLOG_POST", + identifier: card.identifier, + }); + + const cardData = cardDataResponse; + // Cache poll results + if (!pollResultsCache[cardData.poll]) { + pollResultsCache[cardData.poll] = await fetchPollResults(cardData.poll); + } + + const pollResults = pollResultsCache[cardData.poll]; + const cardHTML = await createCardHTML(cardData, pollResults); + cardsContainer.insertAdjacentHTML("beforeend", cardHTML); + } + } catch (error) { + console.error("Error loading cards:", error); + cardsContainer.innerHTML = "

Failed to load cards.

"; + } +} + +const calculatePollResults = (pollData, minterGroupMembers) => { + const memberAddresses = minterGroupMembers.map(member => member.member); + let adminYes = 0, adminNo = 0, minterYes = 0, minterNo = 0; + + pollData.votes.forEach(vote => { + const voterAddress = vote.voterPublicKey; + const isAdmin = minterGroupMembers.some(member => member.member === voterAddress && member.isAdmin); + + if (vote.optionIndex === 1) { + isAdmin ? adminYes++ : memberAddresses.includes(voterAddress) ? minterYes++ : null; + } else if (vote.optionIndex === 0) { + isAdmin ? adminNo++ : memberAddresses.includes(voterAddress) ? minterNo++ : null; + } + }); + + const totalYes = adminYes + minterYes; + const totalNo = adminNo + minterNo; + + return { adminYes, adminNo, minterYes, minterNo, totalYes, totalNo }; +}; + +const postComment = async (cardIdentifier) => { + const commentInput = document.getElementById(`new-comment-${cardIdentifier}`); + const commentText = commentInput.value.trim(); + if (!commentText) { + alert('Comment cannot be empty!'); + return; + } + + const commentData = { + content: commentText, + creator: userState.accountName, + timestamp: Date.now(), + }; + + const commentIdentifier = `${cardIdentifier}-comment-${await uid()}`; + + try { + const base64CommentData = await objectToBase64(commentData); + if (!base64CommentData) { + console.log(`initial base64 object creation with objectToBase64 failed, using btoa...`); + base64CommentData = btoa(JSON.stringify(commentData)); + } + // const base64CommentData = btoa(JSON.stringify(commentData)); + await qortalRequest({ + action: 'PUBLISH_QDN_RESOURCE', + name: userState.accountName, + service: 'BLOG_POST', + identifier: commentIdentifier, + data64: base64CommentData, + }); + alert('Comment posted successfully!'); + commentInput.value = ''; // Clear input + await displayComments(cardIdentifier); // Refresh comments + } catch (error) { + console.error('Error posting comment:', error); + alert('Failed to post comment.'); + } +}; + +const fetchCommentsForCard = async (cardIdentifier) => { + try { + const response = await qortalRequest({ + action: 'SEARCH_QDN_RESOURCES', + service: 'BLOG_POST', + query: `${cardIdentifier}-comment`, + }); + return response; + } catch (error) { + console.error(`Error fetching comments for ${cardIdentifier}:`, error); + return []; + } +}; + +const displayComments = async (cardIdentifier) => { + const comments = await fetchCommentsForCard(cardIdentifier); + const commentsContainer = document.getElementById(`comments-container-${cardIdentifier}`); + commentsContainer.innerHTML = comments.map(comment => ` +
+

${comment.creator}:

+

${comment.content}

+

${timestampToHumanReadableDate(comment.timestamp)}

+
+ `).join(''); +}; + +const toggleComments = async (cardIdentifier) => { + const commentsSection = document.getElementById(`comments-section-${cardIdentifier}`); + if (commentsSection.style.display === 'none' || !commentsSection.style.display) { + await displayComments(cardIdentifier); + commentsSection.style.display = 'block'; + } else { + commentsSection.style.display = 'none'; + } +}; + + +async function loadCards() { + const cardsContainer = document.getElementById("cards-container"); + cardsContainer.innerHTML = "

Loading cards...

"; + + try { + const response = await qortalRequest({ + action: "SEARCH_QDN_RESOURCES", + service: "BLOG_POST", + query: cardIdentifierPrefix, + }); + + if (!response || response.length === 0) { + cardsContainer.innerHTML = "

No cards found.

"; + return; + } + + cardsContainer.innerHTML = ""; + const pollResultsCache = {}; + + for (const card of response) { + const cardDataResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: card.name, + service: "BLOG_POST", + identifier: card.identifier, + }); + + const cardData = cardDataResponse; + // Cache poll results + if (!pollResultsCache[cardData.poll]) { + pollResultsCache[cardData.poll] = await fetchPollResults(cardData.poll); + } + + const pollResults = pollResultsCache[cardData.poll]; + const cardHTML = await createCardHTML(cardData, pollResults); + cardsContainer.insertAdjacentHTML("beforeend", cardHTML); + } + } catch (error) { + console.error("Error loading cards:", error); + cardsContainer.innerHTML = "

Failed to load cards.

"; + } +} + +function toggleFullContent(cardIdentifier, fullContent) { + const contentPreview = document.getElementById(`content-preview-${cardIdentifier}`); + const toggleButton = document.getElementById(`toggle-content-${cardIdentifier}`); + + if (contentPreview.innerText.length > 150) { + // Collapse the content + contentPreview.innerText = `${fullContent.substring(0, 150)}...`; + toggleButton.innerText = "Display Full Content"; + } else { + // Expand the content + contentPreview.innerText = fullContent; + toggleButton.innerText = "Show Less"; + } +} + +async function createCardHTML(cardData, pollResults) { + const { header, content, links, creator, timestamp, poll } = cardData; + const formattedDate = new Date(timestamp).toLocaleString(); + const linksHTML = links.map((link, index) => ` + + `).join(""); + + const minterGroupMembers = await fetchMinterGroupMembers(); + const { adminYes, adminNo, minterYes, minterNo, totalYes, totalNo } = + calculatePollResults(pollResults, minterGroupMembers); + + const trimmedContent = content.length > 150 ? `${content.substring(0, 150)}...` : content; + + return ` +
+
+

${creator}

+

${header}

+
+
+
Minter's Message
+
+ ${trimmedContent} +
+ ${ + content.length > 150 + ? `` + : "" + } +
+ +
+
+ Admin Yes: ${adminYes} + Admin No: ${adminNo} +
+
+ Minter Yes: ${minterYes} + Minter No: ${minterNo} +
+
+ Total Yes: ${totalYes} + Total No: ${totalNo} +
+
+
+
Support Minter
+ + + +
+ +

Published by: ${creator} on ${formattedDate}

+
+` +} + + + + diff --git a/assets/js/BACKUP/backup-dec-10-2024-workingButNotStyled-MinterBoard.js b/assets/js/BACKUP/backup-dec-10-2024-workingButNotStyled-MinterBoard.js new file mode 100644 index 0000000..4451c39 --- /dev/null +++ b/assets/js/BACKUP/backup-dec-10-2024-workingButNotStyled-MinterBoard.js @@ -0,0 +1,450 @@ +const cardIdentifierPrefix = "test-board-card"; +let isExistingCard = false +let existingCard = {} +document.addEventListener("DOMContentLoaded", async () => { + const minterBoardLinks = document.querySelectorAll('a[href="MINTER-BOARD"], a[href="MINTERS"]'); + + minterBoardLinks.forEach(link => { + link.addEventListener("click", async (event) => { + event.preventDefault(); + if (!userState.isLoggedIn) { + await login(); + } + await loadMinterBoardPage(); + }); + }); +}); + +async function loadMinterBoardPage() { + // Clear existing content on the page + const bodyChildren = document.body.children; + for (let i = bodyChildren.length - 1; i >= 0; i--) { + const child = bodyChildren[i]; + if (!child.classList.contains("menu")) { + child.remove(); + } + } + + // Add the "Minter Board" content + const mainContent = document.createElement("div"); + mainContent.innerHTML = ` +
+

Minter Board

+ +
+ +
+ `; + document.body.appendChild(mainContent); + + document.getElementById("publish-card-button").addEventListener("click", async () => { + const existingCard = await fetchExistingCard(); + if (existingCard) { + const updateCard = confirm("You already have a card. Do you want to update it?"); + isExistingCard = true + if (updateCard) { + loadCardIntoForm(existingCard); + document.getElementById("publish-card-view").style.display = "block"; + document.getElementById("cards-container").style.display = "none"; + } + } else { + document.getElementById("publish-card-view").style.display = "block"; + document.getElementById("cards-container").style.display = "none"; + } + }); + + document.getElementById("cancel-publish").addEventListener("click", () => { + document.getElementById("publish-card-view").style.display = "none"; + document.getElementById("cards-container").style.display = "block"; + }); + + document.getElementById("add-link-button").addEventListener("click", () => { + const linksContainer = document.getElementById("links-container"); + const newLinkInput = document.createElement("input"); + newLinkInput.type = "text"; + newLinkInput.className = "card-link"; + newLinkInput.placeholder = "Enter QDN link"; + linksContainer.appendChild(newLinkInput); + }); + + document.getElementById("publish-card-form").addEventListener("submit", async (event) => { + event.preventDefault(); + await publishCard(); + }); + + await loadCards(); +} + +async function fetchExistingCard() { + try { + const response = await qortalRequest({ + action: "SEARCH_QDN_RESOURCES", + service: "BLOG_POST", + nameListFilter: userState.accountName, + query: cardIdentifierPrefix, + }); + + existingCard = response.find(card => card.name === userState.accountName); + if (existingCard) { + const cardDataResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: existingCard.name, + service: "BLOG_POST", + identifier: existingCard.identifier, + }); + + return cardDataResponse; + } + return null; + } catch (error) { + console.error("Error fetching existing card:", error); + return null; + } +} + +function loadCardIntoForm(cardData) { + document.getElementById("card-header").value = cardData.header; + document.getElementById("card-content").value = cardData.content; + + const linksContainer = document.getElementById("links-container"); + linksContainer.innerHTML = ""; // Clear previous links + cardData.links.forEach(link => { + const linkInput = document.createElement("input"); + linkInput.type = "text"; + linkInput.className = "card-link"; + linkInput.value = link; + linksContainer.appendChild(linkInput); + }); +} + +async function publishCard() { + const header = document.getElementById("card-header").value.trim(); + const content = document.getElementById("card-content").value.trim(); + const links = Array.from(document.querySelectorAll(".card-link")) + .map(input => input.value.trim()) + .filter(link => link.startsWith("qortal://")); + + if (!header || !content) { + alert("Header and content are required!"); + return; + } + + const cardIdentifier = isExistingCard ? existingCard.identifier : `${cardIdentifierPrefix}-${await uid()}`; + const pollName = `${cardIdentifier}-poll`; + const pollDescription = `Mintership Board Poll for ${userState.accountName}`; + + const cardData = { + header, + content, + links, + creator: userState.accountName, + timestamp: Date.now(), + poll: pollName, + }; + // new Date().toISOString() + try { + + let base64CardData = await objectToBase64(cardData); + if (!base64CardData) { + console.log(`initial base64 object creation with objectToBase64 failed, using btoa...`); + base64CardData = btoa(JSON.stringify(cardData)); + } + // const base64CardData = btoa(JSON.stringify(cardData)); + + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "BLOG_POST", + identifier: cardIdentifier, + data64: base64CardData, + }); + + await qortalRequest({ + action: "CREATE_POLL", + pollName, + pollDescription, + pollOptions: ["Yes", "No", "Comment"], + pollOwnerAddress: userState.accountAddress, + }); + + alert("Card and poll published successfully!"); + document.getElementById("publish-card-form").reset(); + document.getElementById("publish-card-view").style.display = "none"; + document.getElementById("cards-container").style.display = "block"; + await loadCards(); + } catch (error) { + console.error("Error publishing card or poll:", error); + alert("Failed to publish card and poll."); + } +} + +const postComment = async (cardIdentifier) => { + const commentInput = document.getElementById(`new-comment-${cardIdentifier}`); + const commentText = commentInput.value.trim(); + if (!commentText) { + alert('Comment cannot be empty!'); + return; + } + + const commentData = { + content: commentText, + creator: userState.accountName, + timestamp: new Date().toISOString(), + }; + + const commentIdentifier = `${cardIdentifier}-comment-${await uid()}`; + + try { + const base64CommentData = btoa(JSON.stringify(commentData)); + await qortalRequest({ + action: 'PUBLISH_QDN_RESOURCE', + name: userState.accountName, + service: 'BLOG_POST', + identifier: commentIdentifier, + data64: base64CommentData, + }); + alert('Comment posted successfully!'); + commentInput.value = ''; // Clear input + await displayComments(cardIdentifier); // Refresh comments + } catch (error) { + console.error('Error posting comment:', error); + alert('Failed to post comment.'); + } +}; + + +async function loadCards() { + const cardsContainer = document.getElementById("cards-container"); + cardsContainer.innerHTML = "

Loading cards...

"; + + try { + const response = await qortalRequest({ + action: "SEARCH_QDN_RESOURCES", + service: "BLOG_POST", + query: cardIdentifierPrefix, + }); + + if (!response || response.length === 0) { + cardsContainer.innerHTML = "

No cards found.

"; + return; + } + + cardsContainer.innerHTML = ""; + const pollResultsCache = {}; + + for (const card of response) { + const cardDataResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: card.name, + service: "BLOG_POST", + identifier: card.identifier, + }); + + const cardData = cardDataResponse; + // Cache poll results + if (!pollResultsCache[cardData.poll]) { + pollResultsCache[cardData.poll] = await fetchPollResults(cardData.poll); + } + + const pollResults = pollResultsCache[cardData.poll]; + const cardHTML = await createCardHTML(cardData, pollResults); + cardsContainer.insertAdjacentHTML("beforeend", cardHTML); + } + } catch (error) { + console.error("Error loading cards:", error); + cardsContainer.innerHTML = "

Failed to load cards.

"; + } +} + + +const calculatePollResults = (pollData, minterGroupMembers) => { + const memberAddresses = minterGroupMembers.map(member => member.member); + let adminYes = 0, adminNo = 0, minterYes = 0, minterNo = 0; + + pollData.votes.forEach(vote => { + const voterAddress = vote.voterPublicKey; + const isAdmin = minterGroupMembers.some(member => member.member === voterAddress && member.isAdmin); + + if (vote.optionIndex === 1) { + isAdmin ? adminYes++ : memberAddresses.includes(voterAddress) ? minterYes++ : null; + } else if (vote.optionIndex === 0) { + isAdmin ? adminNo++ : memberAddresses.includes(voterAddress) ? minterNo++ : null; + } + }); + + const totalYes = adminYes + minterYes; + const totalNo = adminNo + minterNo; + + return { adminYes, adminNo, minterYes, minterNo, totalYes, totalNo }; +}; + +const fetchCommentsForCard = async (cardIdentifier) => { + try { + const response = await qortalRequest({ + action: 'SEARCH_QDN_RESOURCES', + service: 'BLOG_POST', + identifier: `${cardIdentifier}-comments`, + }); + return response; + } catch (error) { + console.error(`Error fetching comments for ${cardIdentifier}:`, error); + return []; + } +}; + +const displayComments = async (cardIdentifier) => { + const comments = await fetchCommentsForCard(cardIdentifier); + const commentsContainer = document.getElementById(`comments-container-${cardIdentifier}`); + commentsContainer.innerHTML = comments.map(comment => ` +
+

${comment.creator}:

+

${comment.content}

+
+ `).join(''); +}; + +const toggleComments = async (cardIdentifier) => { + const commentsSection = document.getElementById(`comments-section-${cardIdentifier}`); + if (commentsSection.style.display === 'none' || !commentsSection.style.display) { + await displayComments(cardIdentifier); + commentsSection.style.display = 'block'; + } else { + commentsSection.style.display = 'none'; + } +}; + + +async function loadCards() { + const cardsContainer = document.getElementById("cards-container"); + cardsContainer.innerHTML = "

Loading cards...

"; + + try { + const response = await qortalRequest({ + action: "SEARCH_QDN_RESOURCES", + service: "BLOG_POST", + query: cardIdentifierPrefix, + }); + + if (!response || response.length === 0) { + cardsContainer.innerHTML = "

No cards found.

"; + return; + } + + cardsContainer.innerHTML = ""; + const pollResultsCache = {}; + + for (const card of response) { + const cardDataResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: card.name, + service: "BLOG_POST", + identifier: card.identifier, + }); + + const cardData = cardDataResponse; + // Cache poll results + if (!pollResultsCache[cardData.poll]) { + pollResultsCache[cardData.poll] = await fetchPollResults(cardData.poll); + } + + const pollResults = pollResultsCache[cardData.poll]; + const cardHTML = await createCardHTML(cardData, pollResults); + cardsContainer.insertAdjacentHTML("beforeend", cardHTML); + } + } catch (error) { + console.error("Error loading cards:", error); + cardsContainer.innerHTML = "

Failed to load cards.

"; + } +} + +function toggleFullContent(cardIdentifier, fullContent) { + const contentPreview = document.getElementById(`content-preview-${cardIdentifier}`); + const toggleButton = document.getElementById(`toggle-content-${cardIdentifier}`); + + if (contentPreview.innerText.length > 150) { + // Collapse the content + contentPreview.innerText = `${fullContent.substring(0, 150)}...`; + toggleButton.innerText = "Display Full Content"; + } else { + // Expand the content + contentPreview.innerText = fullContent; + toggleButton.innerText = "Show Less"; + } +} + +async function createCardHTML(cardData, pollResults) { + const { header, content, links, creator, timestamp, poll } = cardData; + const formattedDate = new Date(timestamp).toLocaleString(); + const linksHTML = links.map((link, index) => ` + + `).join(""); + + const minterGroupMembers = await fetchMinterGroupMembers(); + const { adminYes, adminNo, minterYes, minterNo, totalYes, totalNo } = + calculatePollResults(pollResults, minterGroupMembers); + + const trimmedContent = content.length > 150 ? `${content.substring(0, 150)}...` : content; + + return ` +
+
+

${creator}

+

${header}

+
+
+
Admin Yes: ${adminYes}
+
Admin No: ${adminNo}
+
Minter Yes: ${minterYes}
+
Minter No: ${minterNo}
+
Total Yes: ${totalYes}
+
Total No: ${totalNo}
+
+
+
+ ${trimmedContent} +
+ ${ + content.length > 150 + ? `` + : "" + } +
+ +
+ + + +
+ +

Published by: ${creator} on ${formattedDate}

+
+ `; +} + + + + diff --git a/assets/js/BACKUP/backup-forum-styles.css b/assets/js/BACKUP/backup-forum-styles.css new file mode 100644 index 0000000..3c4379c --- /dev/null +++ b/assets/js/BACKUP/backup-forum-styles.css @@ -0,0 +1,195 @@ +/* forum-styles.css */ + +.forum-main { + color: #ffffff; + background-color: #000000; + padding: 0; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + width: 100vw; + box-sizing: border-box; + background-size: cover; + background-position: center; + } + + .forum-header { + width: 100%; + padding: 2vh; + background-color: #000000; + color: #add8e6; /* Light blue color */ + text-align: center; + font-size: 2.5rem; + font-weight: bold; + margin-bottom: 0; + } + + .forum-submenu { + width: 100%; + padding: 1vh 2vh; + background: rgba(0, 0, 0, 0.8); + text-align: center; + margin-top: 0; + } + + .forum-rooms { + display: flex; + justify-content: center; + gap: 2vh; /* Increased gap for better spacing */ + margin-top: 0; + flex-wrap: wrap; + } + + .room-button { + background-color: #317e78; + color: #ffffff; + border: 2px solid #317e78; + border-radius: 2vh; + padding: 1vh 2vh; + font-size: 1.1rem; + cursor: pointer; + } + + .room-button:hover { + background-color: #19403d; + } + + .forum-content { + flex-grow: 1; + width: 90%; + padding: 3vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + box-sizing: border-box; + border: 3px solid #ffffff; /* Increased border width */ + } + + .room-content { + background: rgba(0, 0, 0, 0.6); + padding: 2vh; + border-radius: 1vh; + width: 100%; + box-sizing: border-box; + text-align: center; + } + + .room-title { + color: #add8e6; /* Light blue color for room name */ + text-align: center; + margin-bottom: 2vh; + font-size: 2rem; + } + + .message-item { + background: #1c1c1c; + color: #ffffff; + padding: 1vh; + margin-bottom: 1vh; + border-radius: 0.8vh; + width: 100%; + box-sizing: border-box; + display: flex; + flex-direction: column; + align-items: flex-start; + border: 1px solid #ffffff; + } + + .message-header { + display: flex; + justify-content: space-between; + width: 100%; + margin-bottom: 1vh; + font-size: 1.25rem; + color: white + } + + .message-header.username { + color: #228ec0; + } + + .username { + font-weight: bold; + color:#228ec0 + } + + .timestamp { + font-style: italic; + color: rgb(157, 167, 151) + } + + .message-text { + margin: 0; + font-size: 1.25rem; + } + + .reply-button { + align-self: flex-end; + margin-top: 1vh; + background-color: #167089; + color: #ffffff; + border: none; + border-radius: 1vh; + padding: 0.3vh 0.6vh; + cursor: pointer; + } + + .reply-button:hover { + background-color: #19403d; + } + +/* forum-styles.css additions */ + + .message-input-section { + display: flex; + flex-direction: column; + align-items: stretch; + box-sizing: border-box; + width: 100%; + gap: 1vh; /* Spacing between toolbar and editor */ + background-color: black; + padding: 1vh; + } + + .ql-editor { + flex-grow: 1; + text-size: 1.25rem; + } + + .message-input { + flex-grow: 1; + padding: 2vh; + border-radius: 1vh; + border: 1px solid #cccccc; + font-size: 1.25rem; + /* margin-right: 8vh; */ + box-sizing: border-box; + min-height: 15vh; + } + + .send-button { + background-color: #13a97c; + color: #ffffff; + border: none; + border-radius: 1vh; + padding: 2vh 4vh; + cursor: pointer; + } + + .send-button:hover { + background-color: #19403d; + } + + .messages-container { + width: 100%; + margin-bottom: 5vh; /* Ensure space above input section */ + overflow-y: auto; + padding-bottom: 1vh; + box-sizing: border-box; + } + + + \ No newline at end of file diff --git a/assets/js/BACKUP/dec-11-MinterBoardDoubleCardsFuntionButWithOtherThingsFixed.js b/assets/js/BACKUP/dec-11-MinterBoardDoubleCardsFuntionButWithOtherThingsFixed.js new file mode 100644 index 0000000..4f80522 --- /dev/null +++ b/assets/js/BACKUP/dec-11-MinterBoardDoubleCardsFuntionButWithOtherThingsFixed.js @@ -0,0 +1,508 @@ +const cardIdentifierPrefix = "test-board-card"; +let isExistingCard = false; +let existingCardData = {}; +let existingCardInfo ={}; + +document.addEventListener("DOMContentLoaded", async () => { + const minterBoardLinks = document.querySelectorAll('a[href="MINTER-BOARD"], a[href="MINTERS"]'); + + minterBoardLinks.forEach(link => { + link.addEventListener("click", async (event) => { + event.preventDefault(); + if (!userState.isLoggedIn) { + await login(); + } + await loadMinterBoardPage(); + }); + }); +}); + +async function loadMinterBoardPage() { + // Clear existing content on the page + const bodyChildren = document.body.children; + for (let i = bodyChildren.length - 1; i >= 0; i--) { + const child = bodyChildren[i]; + if (!child.classList.contains("menu")) { + child.remove(); + } + } + + // Add the "Minter Board" content + const mainContent = document.createElement("div"); + mainContent.innerHTML = ` +
+

Minter Board

+ +
+ +
+ `; + document.body.appendChild(mainContent); + + document.getElementById("publish-card-button").addEventListener("click", async () => { + try { + const {cardData, cardIdentifier} = await fetchExistingCard(); + + if (cardIdentifier) { + // Update existing card + const updateCard = confirm("A card already exists. Do you want to update it?"); + isExistingCard = true; + + if (updateCard) { + // Load existing card into the form for editing + loadCardIntoForm(cardData); + alert("Edit your existing card and publish."); + } else { + // Allow creating a new card for testing purposes + alert("You can now create a new card for testing."); + isExistingCard = false; + existingCardData = {}; // Reset to allow new card creation + document.getElementById("publish-card-form").reset(); + } + } else { + alert("No existing card found. Create a new card."); + isExistingCard = false; + } + + // Show the form for publishing a card + const publishCardView = document.getElementById("publish-card-view"); + publishCardView.style.display = "flex"; + document.getElementById("cards-container").style.display = "none"; + } catch (error) { + console.error("Error checking for existing card:", error); + alert("Failed to check for existing card. Please try again."); + } + }); + + document.getElementById("cancel-publish-button").addEventListener("click", () => { + const cardsContainer = document.getElementById("cards-container"); + cardsContainer.style.display = "flex"; // Restore visibility + const publishCardView = document.getElementById("publish-card-view"); + publishCardView.style.display = "none"; // Hide the publish form + }); + + document.getElementById("add-link-button").addEventListener("click", () => { + const linksContainer = document.getElementById("links-container"); + const newLinkInput = document.createElement("input"); + newLinkInput.type = "text"; + newLinkInput.className = "card-link"; + newLinkInput.placeholder = "Enter QDN link"; + linksContainer.appendChild(newLinkInput); + }); + + document.getElementById("publish-card-form").addEventListener("submit", async (event) => { + event.preventDefault(); + await publishCard(); + }); + + await loadCards(); +} + +async function fetchExistingCard() { + try { + const response = await qortalRequest({ + action: "SEARCH_QDN_RESOURCES", + service: "BLOG_POST", + query: userState.accountName, + identifier: cardIdentifierPrefix + }); + + existingCardInfo = response; + + if (existingCard) { + const cardDataResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: existingCardInfo.name, + service: "BLOG_POST", + identifier: existingCardInfo.identifier, + }); + + const existingCardIdentifier = existingCardInfo.identifier; + existingCardData = cardDataResponse + return {cardDataResponse, existingCardIdentifier}; + + } + return null; + } catch (error) { + console.error("Error fetching existing card:", error); + return null; + } +} + + +function loadCardIntoForm(cardData) { + document.getElementById("card-header").value = cardData.header; + document.getElementById("card-content").value = cardData.content; + + const linksContainer = document.getElementById("links-container"); + linksContainer.innerHTML = ""; // Clear previous links + cardData.links.forEach(link => { + const linkInput = document.createElement("input"); + linkInput.type = "text"; + linkInput.className = "card-link"; + linkInput.value = link; + linksContainer.appendChild(linkInput); + }); +} + +async function publishCard() { + const header = document.getElementById("card-header").value.trim(); + const content = document.getElementById("card-content").value.trim(); + const links = Array.from(document.querySelectorAll(".card-link")) + .map(input => input.value.trim()) + .filter(link => link.startsWith("qortal://")); + + if (!header || !content) { + alert("Header and content are required!"); + return; + } + + const cardIdentifier = isExistingCard ? existingCardInfo.identifier : `${cardIdentifierPrefix}-${await uid()}`; + const pollName = `${cardIdentifier}-poll`; + const pollDescription = `Mintership Board Poll for ${userState.accountName}`; + + const cardData = { + header, + content, + links, + creator: userState.accountName, + timestamp: Date.now(), + poll: pollName, + }; + // new Date().toISOString() + try { + + let base64CardData = await objectToBase64(cardData); + if (!base64CardData) { + console.log(`initial base64 object creation with objectToBase64 failed, using btoa...`); + base64CardData = btoa(JSON.stringify(cardData)); + } + // const base64CardData = btoa(JSON.stringify(cardData)); + + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "BLOG_POST", + identifier: cardIdentifier, + data64: base64CardData, + }); + + await qortalRequest({ + action: "CREATE_POLL", + pollName, + pollDescription, + pollOptions: ["Allow", "Deny"], + pollOwnerAddress: userState.accountAddress, + }); + + alert("Card and poll published successfully!"); + document.getElementById("publish-card-form").reset(); + document.getElementById("publish-card-view").style.display = "none"; + document.getElementById("cards-container").style.display = "flex"; + await loadCards(); + } catch (error) { + console.error("Error publishing card or poll:", error); + alert("Failed to publish card and poll."); + } +} + +async function loadCards() { + const cardsContainer = document.getElementById("cards-container"); + cardsContainer.innerHTML = "

Loading cards...

"; + + try { + const response = await qortalRequest({ + action: "SEARCH_QDN_RESOURCES", + service: "BLOG_POST", + query: cardIdentifierPrefix, + }); + + if (!response || response.length === 0) { + cardsContainer.innerHTML = "

No cards found.

"; + return; + } + + cardsContainer.innerHTML = "" + + for (const card of response) { + const cardDataResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: card.name, + service: "BLOG_POST", + identifier: card.identifier, + }); + + const cardData = cardDataResponse; + // Cache poll results + + const pollResults = await fetchPollResults(cardData.poll) + const cardHTML = await createCardHTML(cardData, pollResults, card.identifier); + cardsContainer.insertAdjacentHTML("beforeend", cardHTML); + } + } catch (error) { + console.error("Error loading cards:", error); + cardsContainer.innerHTML = "

Failed to load cards.

"; + } +} + +const calculatePollResults = (pollData, minterGroupMembers) => { + const memberAddresses = minterGroupMembers.map(member => member.member); + let adminYes = 0, adminNo = 0, minterYes = 0, minterNo = 0; + + pollData.votes.forEach(vote => { + const voterAddress = vote.voterPublicKey; + const isAdmin = minterGroupMembers.some(member => member.member === voterAddress && member.isAdmin); + + if (vote.optionIndex === 1) { + isAdmin ? adminYes++ : memberAddresses.includes(voterAddress) ? minterYes++ : null; + } else if (vote.optionIndex === 0) { + isAdmin ? adminNo++ : memberAddresses.includes(voterAddress) ? minterNo++ : null; + } + }); + + const totalYes = adminYes + minterYes; + const totalNo = adminNo + minterNo; + + return { adminYes, adminNo, minterYes, minterNo, totalYes, totalNo }; +}; + +const postComment = async (cardIdentifier) => { + const commentInput = document.getElementById(`new-comment-${cardIdentifier}`); + const commentText = commentInput.value.trim(); + if (!commentText) { + alert('Comment cannot be empty!'); + return; + } + + const commentData = { + content: commentText, + creator: userState.accountName, + timestamp: Date.now(), + }; + + const commentIdentifier = `${cardIdentifier}-comment-${await uid()}`; + + try { + const base64CommentData = await objectToBase64(commentData); + if (!base64CommentData) { + console.log(`initial base64 object creation with objectToBase64 failed, using btoa...`); + base64CommentData = btoa(JSON.stringify(commentData)); + } + // const base64CommentData = btoa(JSON.stringify(commentData)); + await qortalRequest({ + action: 'PUBLISH_QDN_RESOURCE', + name: userState.accountName, + service: 'BLOG_POST', + identifier: commentIdentifier, + data64: base64CommentData, + }); + alert('Comment posted successfully!'); + commentInput.value = ''; // Clear input + await displayComments(cardIdentifier); // Refresh comments + } catch (error) { + console.error('Error posting comment:', error); + alert('Failed to post comment.'); + } +}; + +const fetchCommentsForCard = async (cardIdentifier) => { + try { + const response = await qortalRequest({ + action: 'SEARCH_QDN_RESOURCES', + service: 'BLOG_POST', + query: `${cardIdentifier}-comment`, + }); + return response; + } catch (error) { + console.error(`Error fetching comments for ${cardIdentifier}:`, error); + return []; + } +}; + +const displayComments = async (cardIdentifier) => { + try { + const comments = await fetchCommentsForCard(cardIdentifier); + const commentsContainer = document.getElementById(`comments-container-${cardIdentifier}`); + + // Clear previous comments + commentsContainer.innerHTML = ''; + + // Fetch and display each comment + for (const comment of comments) { + const commentDataResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: comment.name, + service: "BLOG_POST", + identifier: comment.identifier, + }); + const timestamp = await timestampToHumanReadableDate(commentDataResponse.timestamp); + const commentHTML = ` +
+

${commentDataResponse.creator}:

+

${commentDataResponse.content}

+

${timestamp}

+
+ `; + commentsContainer.insertAdjacentHTML('beforeend', commentHTML); + } + } catch (error) { + console.error(`Error displaying comments for ${cardIdentifier}:`, error); + alert("Failed to load comments. Please try again."); + } +}; + + +const toggleComments = async (cardIdentifier) => { + const commentsSection = document.getElementById(`comments-section-${cardIdentifier}`); + if (commentsSection.style.display === 'none' || !commentsSection.style.display) { + await displayComments(cardIdentifier); + commentsSection.style.display = 'block'; + } else { + commentsSection.style.display = 'none'; + } +}; + + +async function loadCards() { + const cardsContainer = document.getElementById("cards-container"); + cardsContainer.innerHTML = "

Loading cards...

"; + + try { + const response = await qortalRequest({ + action: "SEARCH_QDN_RESOURCES", + service: "BLOG_POST", + query: cardIdentifierPrefix, + }); + + if (!response || response.length === 0) { + cardsContainer.innerHTML = "

No cards found.

"; + return; + } + + cardsContainer.innerHTML = ""; + const pollResultsCache = {}; + + for (const card of response) { + const cardDataResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: card.name, + service: "BLOG_POST", + identifier: card.identifier, + }); + + const cardData = cardDataResponse; + // Cache poll results + if (!pollResultsCache[cardData.poll]) { + pollResultsCache[cardData.poll] = await fetchPollResults(cardData.poll); + } + + const pollResults = pollResultsCache[cardData.poll]; + const cardHTML = await createCardHTML(cardData, pollResults, card.identifier); + cardsContainer.insertAdjacentHTML("beforeend", cardHTML); + } + } catch (error) { + console.error("Error loading cards:", error); + cardsContainer.innerHTML = "

Failed to load cards.

"; + } +} + +function toggleFullContent(cardIdentifier, fullContent) { + const contentPreview = document.getElementById(`content-preview-${cardIdentifier}`); + const toggleButton = document.getElementById(`toggle-content-${cardIdentifier}`); + const isExpanded = contentPreview.getAttribute("data-expanded") === "true"; + + if (isExpanded) { + // Collapse the content + contentPreview.innerText = `${fullContent.substring(0, 150)}...`; + toggleButton.innerText = "Display Full Text"; + contentPreview.setAttribute("data-expanded", "false"); + } else { + // Expand the content + contentPreview.innerText = fullContent; + toggleButton.innerText = "Show Less"; + contentPreview.setAttribute("data-expanded", "true"); + } +} + +async function createCardHTML(cardData, pollResults, cardIdentifier) { + const { header, content, links, creator, timestamp, poll } = cardData; + const formattedDate = new Date(timestamp).toLocaleString(); + const linksHTML = links.map((link, index) => ` + + `).join(""); + + const minterGroupMembers = await fetchMinterGroupMembers(); + const { adminYes, adminNo, minterYes, minterNo, totalYes, totalNo } = + calculatePollResults(pollResults, minterGroupMembers); + + const trimmedContent = content.length > 150 ? `${content.substring(0, 150)}...` : content; + + return ` +
+
+

${creator}

+

${header}

+
+
+
+ ${trimmedContent} +
+ ${ + content.length > 150 + ? `` + : "" + } +
+ +
+
Current Support Results
+
+ Admin Yes: ${adminYes} + Admin No: ${adminNo} +
+
+ Minter Yes: ${minterYes} + Minter No: ${minterNo} +
+
+ Total Yes: ${totalYes} + Total No: ${totalNo} +
+
+
+
Support Minter
+
+ + + +
+
+ +

Published by: ${creator} on ${formattedDate}

+
+ `; +} + diff --git a/assets/js/BACKUP/working-beforeAddingFileAttachments-1143AM-11-19-2024.js b/assets/js/BACKUP/working-beforeAddingFileAttachments-1143AM-11-19-2024.js new file mode 100644 index 0000000..b842e9c --- /dev/null +++ b/assets/js/BACKUP/working-beforeAddingFileAttachments-1143AM-11-19-2024.js @@ -0,0 +1,329 @@ +const messageIdentifierPrefix = `mintership-forum-message`; +const messageAttachmentIdentifierPrefix = `mintership-forum-attachment`; + +let replyToMessageIdentifier = null; +let latestMessageIdentifiers = {}; // To keep track of the latest message in each room +let currentPage = 0; // Track current pagination page +let existingIdentifiers = new Set(); // Keep track of existing identifiers to not pull them more than once. + +// If there is a previous latest message identifiers, use them. Otherwise, use an empty. +if (localStorage.getItem("latestMessageIdentifiers")) { + latestMessageIdentifiers = JSON.parse(localStorage.getItem("latestMessageIdentifiers")); +} + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLinks = document.querySelectorAll('a[href="MINTERSHIP-FORUM"]'); + + mintershipForumLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + await login(); // Assuming login is an async function + await loadForumPage(); + loadRoomContent("general"); // Automatically load General Room on forum load + startPollingForNewMessages(); // Start polling for new messages after loading the forum page + }); + }); +}); + +async function loadForumPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + // Check if user is an admin + const minterGroupAdmins = await fetchMinterGroupAdmins(); + const isUserAdmin = minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) || await verifyUserIsAdmin(); + + // Create the forum layout, including a header, sub-menu, and keeping the original background imagestyle="background-image: url('/assets/images/background.jpg');"> + const mainContent = document.createElement('div'); + mainContent.innerHTML = ` +
+
+ +
+
+
+ + ${isUserAdmin ? '' : ''} + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("minters"); + }); + if (isUserAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("general"); + }); +} + +function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+ ${(existingIdentifiers.size > 10)? '' : ''} +
+
+
+ +
+
+ `; + + // Initialize Quill editor for rich text input + const quill = new Quill('#editor', { + theme: 'snow', + modules: { + toolbar: [ + [{ 'font': [] }], // Add font family options + [{ 'size': ['small', false, 'large', 'huge'] }], // Add font size options + [{ 'header': [1, 2, false] }], + ['bold', 'italic', 'underline'], // Text formatting options + [{ 'list': 'ordered'}, { 'list': 'bullet' }], + ['link', 'blockquote', 'code-block'], + [{ 'color': [] }, { 'background': [] }], // Text color and background color options + [{ 'align': [] }], // Text alignment + ['clean'] // Remove formatting button + ] + } + }); + + // Load messages from QDN for the selected room + loadMessagesFromQDN(room, currentPage); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "") { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + + // Create message object with unique identifier and HTML content + const messageObject = { + messageHtml: messageHtml, + hasAttachment: false, + replyTo: replyToMessageIdentifier + }; + + try { + // Convert message object to base64 + let base64Message = await objectToBase64(messageObject); + if (!base64Message) { + console.log(`initial object creation with object failed, using btoa...`) + base64Message = btoa(JSON.stringify(messageObject)); + } + + console.log("Message Object:", messageObject); + console.log("Base64 Encoded Message:", base64Message); + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, // Publisher must own the registered name + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + + console.log("Message published successfully"); + // Clear the editor after sending the message + quill.root.innerHTML = ""; + + // Clear reply reference after sending if it exists. + if (replyToMessageIdentifier) { + replyToMessageIdentifier = null; + replyContainer.remove(); + } + // Update the latest message identifier + latestMessageIdentifiers[room] = messageIdentifier; + localStorage.setItem("latestMessageIdentifiers", JSON.stringify(latestMessageIdentifiers)); + + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + + // Add event listener for the load more button + document.getElementById("load-more-button").addEventListener("click", () => { + currentPage++; + loadMessagesFromQDN(room, currentPage); + }); + } +} + +// Load messages for any given room with pagination +async function loadMessagesFromQDN(room, page, isPolling = false) { + try { + const offset = page * 10; + const limit = 10; + + // Get the set of existing identifiers from the messages container + const messagesContainer = document.querySelector("#messages-container"); + existingIdentifiers = new Set(Array.from(messagesContainer.querySelectorAll('.message-item')).map(item => item.dataset.identifier)); + + // Fetch only messages that are not already present in the messages container + const response = await searchAllWithoutDuplicates(`${messageIdentifierPrefix}-${room}`, limit, offset, existingIdentifiers); + + if (messagesContainer) { + // If there are no messages and we're not polling, display "no messages" message + if (!response || !response.length) { + if (page === 0 && !isPolling) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + } + return; + } + + // Fetch all messages that haven't been fetched before + const fetchMessages = await Promise.all(response.map(async (resource) => { + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data if no 'encoding: base64' is set. + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { name: resource.name, content: messageObject.messageHtml, date: formattedTimestamp, identifier: resource.identifier, replyTo: messageObject.replyTo }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + // Render new messages without duplication + fetchMessages.forEach((message) => { + if (message && !existingIdentifiers.has(message.identifier)) { + let replyHtml = ""; + if (message.replyTo) { + const repliedMessage = fetchMessages.find(m => m && m.identifier === message.replyTo); + if (repliedMessage) { + replyHtml = ` +
+
In reply to: ${repliedMessage.name} ${repliedMessage.date}
+
${repliedMessage.content}
+
+ `; + } + } + let mostRecentMessage = null; + const isNewMessage = !latestMessageIdentifiers[room] || new Date(message.date) > new Date(latestMessageIdentifiers[room]); + + const messageHTML = ` +
+ ${replyHtml} +
+ ${message.name} + ${message.date} + ${isNewMessage ? 'NEW' : ''} +
+
${message.content}
+ +
+ `; + + // Append new message to the end of the container + messagesContainer.insertAdjacentHTML('beforeend', messageHTML); + // Track the most recent message + if (!mostRecentMessage || new Date(message.timestamp) > new Date(mostRecentMessage.timestamp)) { + mostRecentMessage = message; + } + } + }); + // Update latestMessageIdentifiers for the room + if (mostRecentMessage) { + latestMessageIdentifiers[room] = { + latestIdentifier: mostRecentMessage.identifier, + latestTimestamp: mostRecentMessage.timestamp + }; + } + // Add event listeners to the reply buttons + const replyButtons = document.querySelectorAll(".reply-button"); + + replyButtons.forEach(button => { + button.addEventListener("click", () => { + replyToMessageIdentifier = button.dataset.messageIdentifier; + // Find the message being replied to + const repliedMessage = fetchMessages.find(m => m && m.identifier === replyToMessageIdentifier); + + if (repliedMessage) { + const replyContainer = document.createElement("div"); + replyContainer.className = "reply-container"; + replyContainer.innerHTML = ` +
+ Replying to: ${repliedMessage.content} + +
+ `; + + if (!document.querySelector(".reply-container")) { + const messageInputSection = document.querySelector(".message-input-section"); + + if (messageInputSection) { + messageInputSection.insertBefore(replyContainer, messageInputSection.firstChild); + + // Add a listener for the cancel reply button + document.getElementById("cancel-reply").addEventListener("click", () => { + replyToMessageIdentifier = null; + replyContainer.remove(); + }); + } + } + const messageInputSection = document.querySelector(".message-input-section"); + const editor = document.querySelector(".ql-editor"); + + if (messageInputSection) { + messageInputSection.scrollIntoView({ behavior: 'smooth', block: 'center' }); + } + + if (editor) { + editor.focus(); + } + } + }); + }); + } + } catch (error) { + console.error('Error loading messages from QDN:', error); + } +} + +// Polling function to check for new messages without clearing existing ones +function startPollingForNewMessages() { + setInterval(async () => { + const activeRoom = document.querySelector('.room-title')?.innerText.toLowerCase().split(" ")[0]; + if (activeRoom) { + await loadMessagesFromQDN(activeRoom, currentPage, true); + } + }, 20000); +} + diff --git a/assets/js/BACKUP/working-fewLittleIssues-0858AM-11-19-2024.js b/assets/js/BACKUP/working-fewLittleIssues-0858AM-11-19-2024.js new file mode 100644 index 0000000..b96be58 --- /dev/null +++ b/assets/js/BACKUP/working-fewLittleIssues-0858AM-11-19-2024.js @@ -0,0 +1,319 @@ +const messageIdentifierPrefix = `mintership-forum-message`; + +let replyToMessageIdentifier = null; +let latestMessageIdentifiers = {}; // To keep track of the latest message in each room +let currentPage = 0; // Track current pagination page + +// Load the latest message identifiers from local storage +if (localStorage.getItem("latestMessageIdentifiers")) { + latestMessageIdentifiers = JSON.parse(localStorage.getItem("latestMessageIdentifiers")); +} + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLinks = document.querySelectorAll('a[href="MINTERSHIP-FORUM"]'); + + mintershipForumLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + await login(); // Assuming login is an async function + await loadForumPage(); + loadRoomContent("general"); // Automatically load General Room on forum load + startPollingForNewMessages(); // Start polling for new messages after loading the forum page + }); + }); +}); + +async function loadForumPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + // Check if user is an admin + const minterGroupAdmins = await fetchMinterGroupAdmins(); + const isUserAdmin = minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) || await verifyUserIsAdmin(); + + // Create the forum layout, including a header, sub-menu, and keeping the original background imagestyle="background-image: url('/assets/images/background.jpg');"> + const mainContent = document.createElement('div'); + // const backgroundImage = document.querySelector('.header1')?.style.backgroundImage; + const backgroundImage = "url('/assets/images/background.jpg')" + mainContent.innerHTML = ` +
+
+ +
+
+
+ + ${isUserAdmin ? '' : ''} + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("minters"); + }); + if (isUserAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("general"); + }); +} + +function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+
+
+
+ +
+ +
+ `; + + // Initialize Quill editor for rich text input + const quill = new Quill('#editor', { + theme: 'snow', + modules: { + toolbar: [ + [{ 'font': [] }], // Add font family options + [{ 'size': ['small', false, 'large', 'huge'] }], // Add font size options + [{ 'header': [1, 2, false] }], + ['bold', 'italic', 'underline'], // Text formatting options + [{ 'list': 'ordered'}, { 'list': 'bullet' }], + ['link', 'blockquote', 'code-block'], + [{ 'color': [] }, { 'background': [] }], // Text color and background color options + [{ 'align': [] }], // Text alignment + ['clean'] // Remove formatting button + ] + } + }); + + // Load messages from QDN for the selected room + loadMessagesFromQDN(room, currentPage); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "") { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + + // Create message object with unique identifier and HTML content + const messageObject = { + messageHtml: messageHtml, + hasAttachment: false, + replyTo: replyToMessageIdentifier + }; + + try { + // Convert message object to base64 + let base64Message = await objectToBase64(messageObject); + if (!base64Message) { + console.log(`initial object creation with object failed, using btoa...`) + base64Message = btoa(JSON.stringify(messageObject)); + } + + console.log("Message Object:", messageObject); + console.log("Base64 Encoded Message:", base64Message); + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, // Publisher must own the registered name + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + console.log("Message published successfully"); + // Clear the editor after sending the message + quill.root.innerHTML = ""; + replyToMessageIdentifier = null; // Clear reply reference after sending + // Clear reply reference after sending if it exists. + if (replyToMessageIdentifier) { + replyToMessageIdentifier = null; + replyContainer.remove(); + } + replyToMessageIdentifier = null; + replyContainer.remove(); + // Update the latest message identifier + latestMessageIdentifiers[room] = messageIdentifier; + localStorage.setItem("latestMessageIdentifiers", JSON.stringify(latestMessageIdentifiers)); + // Reload messages + loadMessagesFromQDN(room, currentPage); + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + + // Add event listener for the load more button + document.getElementById("load-more-button").addEventListener("click", () => { + currentPage++; + loadMessagesFromQDN(room, currentPage); + }); + } +} + +// Load messages for any given room with pagination +async function loadMessagesFromQDN(room, page) { + try { + const offset = page * 10; + const limit = 10; + const response = await searchAllResources(`${messageIdentifierPrefix}-${room}`, limit, 0, false); + + const qdnMessages = response; + console.log("Messages fetched successfully:", qdnMessages); + + const messagesContainer = document.querySelector("#messages-container"); + if (messagesContainer) { + if (!qdnMessages || !qdnMessages.length) { + if (page === 0) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + } + return; + } + + // Fetch all messages + const fetchMessages = await Promise.all(qdnMessages.map(async (resource) => { + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data if no 'encoding: base64' is set. + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { name: resource.name, content: messageObject.messageHtml, date: formattedTimestamp, identifier: resource.identifier, replyTo: messageObject.replyTo }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + // Render messages without duplication + const existingIdentifiers = new Set(Array.from(messagesContainer.querySelectorAll('.message-item')).map(item => item.dataset.identifier)); + + fetchMessages.forEach((message) => { + if (message && !existingIdentifiers.has(message.identifier)) { + let replyHtml = ""; + if (message.replyTo) { + const repliedMessage = fetchMessages.find(m => m && m.identifier === message.replyTo); + if (repliedMessage) { + replyHtml = ` +
+
In reply to: ${repliedMessage.name} ${repliedMessage.date}
+
${repliedMessage.content}
+
+ `; + } + } + + const isNewMessage = !latestMessageIdentifiers[room] || new Date(message.date) > new Date(latestMessageIdentifiers[room]); + + const messageHTML = ` +
+ ${replyHtml} +
+ ${message.name} + ${message.date} + ${isNewMessage ? 'NEW' : ''} +
+
${message.content}
+ +
+ `; + + messagesContainer.insertAdjacentHTML('beforeend', messageHTML); + } + }); + + // Only scroll to bottom if user is not interacting with the input section + const messageInputSection = document.querySelector(".message-input-section"); + if (document.activeElement !== messageInputSection) { + setTimeout(() => { + messagesContainer.scrollTop = messagesContainer.scrollHeight; + }, 1000); + } + + // Add event listeners to the reply buttons + const replyButtons = document.querySelectorAll(".reply-button"); + + replyButtons.forEach(button => { + button.addEventListener("click", () => { + replyToMessageIdentifier = button.dataset.messageIdentifier; + // Find the message being replied to + const repliedMessage = fetchMessages.find(m => m && m.identifier === replyToMessageIdentifier); + + if (repliedMessage) { + const replyContainer = document.createElement("div"); + replyContainer.className = "reply-container"; + replyContainer.innerHTML = ` +
+ Replying to: ${repliedMessage.content} + +
+ `; + + if (!document.querySelector(".reply-container")) { + const messageInputSection = document.querySelector(".message-input-section"); + + if (messageInputSection) { + messageInputSection.insertBefore(replyContainer, messageInputSection.firstChild); + + // Add a listener for the cancel reply button + document.getElementById("cancel-reply").addEventListener("click", () => { + replyToMessageIdentifier = null; + replyContainer.remove(); + }); + } + } + } + }); + }); + + } + } catch (error) { + console.error('Error loading messages from QDN:', error); + } +} + + + +// Polling function to check for new messages +function startPollingForNewMessages() { + setInterval(async () => { + const activeRoom = document.querySelector('.room-title')?.innerText.toLowerCase().split(" ")[0]; + if (activeRoom) { + await loadMessagesFromQDN(activeRoom, currentPage); + } + }, 20000); +} diff --git a/assets/js/MinterBoard.js b/assets/js/MinterBoard.js new file mode 100644 index 0000000..576297d --- /dev/null +++ b/assets/js/MinterBoard.js @@ -0,0 +1,497 @@ +const cardIdentifierPrefix = "test-board-card"; +let isExistingCard = false; +let existingCardData = {}; +let existingCardIdentifier ={}; + +document.addEventListener("DOMContentLoaded", async () => { + const minterBoardLinks = document.querySelectorAll('a[href="MINTER-BOARD"], a[href="MINTERS"]'); + + minterBoardLinks.forEach(link => { + link.addEventListener("click", async (event) => { + event.preventDefault(); + if (!userState.isLoggedIn) { + await login(); + } + await loadMinterBoardPage(); + }); + }); +}); + +async function loadMinterBoardPage() { + // Clear existing content on the page + const bodyChildren = document.body.children; + for (let i = bodyChildren.length - 1; i >= 0; i--) { + const child = bodyChildren[i]; + if (!child.classList.contains("menu")) { + child.remove(); + } + } + + // Add the "Minter Board" content + const mainContent = document.createElement("div"); + mainContent.innerHTML = ` +
+

Minter Board

+

The Minter Board is a place to publish information about yourself in order to obtain support from existing Minters and Minter Admins on the Qortal network. You may publish a header, content, and links to other QDN-published content in order to support you in your mission. Minter Admins and Existing Minters will then support you (or not) by way of a vote on your card. Card details you publish, along with existing poll results, and comments from others, will be displayed here. Good Luck on your Qortal journey to becoming a minter!

+ +
+ +
+ `; + document.body.appendChild(mainContent); + + document.getElementById("publish-card-button").addEventListener("click", async () => { + try { + await fetchExistingCard(); + const cardIdentifier = existingCardIdentifier + if (cardIdentifier) { + // Update existing card + const updateCard = confirm("A card already exists. Do you want to update it?"); + isExistingCard = true; + + if (updateCard) { + // Load existing card into the form for editing + loadCardIntoForm(existingCardData); + alert("Edit your existing card and publish."); + } else { + // Allow creating a new card for testing purposes + alert("You can now create a new card for testing."); + isExistingCard = false; + existingCardData = {}; // Reset to allow new card creation + document.getElementById("publish-card-form").reset(); + } + } else { + alert("No existing card found. Create a new card."); + isExistingCard = false; + } + + // Show the form for publishing a card + const publishCardView = document.getElementById("publish-card-view"); + publishCardView.style.display = "flex"; + document.getElementById("cards-container").style.display = "none"; + } catch (error) { + console.error("Error checking for existing card:", error); + alert("Failed to check for existing card. Please try again."); + } + }); + + document.getElementById("cancel-publish-button").addEventListener("click", () => { + const cardsContainer = document.getElementById("cards-container"); + cardsContainer.style.display = "flex"; // Restore visibility + const publishCardView = document.getElementById("publish-card-view"); + publishCardView.style.display = "none"; // Hide the publish form + }); + + document.getElementById("add-link-button").addEventListener("click", () => { + const linksContainer = document.getElementById("links-container"); + const newLinkInput = document.createElement("input"); + newLinkInput.type = "text"; + newLinkInput.className = "card-link"; + newLinkInput.placeholder = "Enter QDN link"; + linksContainer.appendChild(newLinkInput); + }); + + document.getElementById("publish-card-form").addEventListener("submit", async (event) => { + event.preventDefault(); + await publishCard(); + }); + + await loadCards(); +} + +async function fetchExistingCard() { + try { + // Step 1: Perform the search + const response = await qortalRequest({ + action: "SEARCH_QDN_RESOURCES", + service: "BLOG_POST", + query: userState.accountName, // Scoped to the user + identifier: cardIdentifierPrefix, + }); + + console.log(`SEARCH_QDN_RESOURCES response: ${JSON.stringify(response, null, 2)}`); + + // Step 2: Check if the response is an array and not empty + if (!response || !Array.isArray(response) || response.length === 0) { + console.log("No cards found for the current user."); + return null; + } + + const validCards = response.filter(card => validateCardStructure(card)); + + if (validCards.length > 0) { + // Sort by most recent timestamp + const mostRecentCard = validCards.sort((a, b) => b.created - a.created)[0]; + + // Step 3: Find the object with the most recent timestamp + // const mostRecentCard = response.reduce((latest, card) => { + // const currentTimestamp = card.created || card.updated || 0; // Ensure there's a timestamp + // const latestTimestamp = latest.created || latest.updated || 0; + // return currentTimestamp > latestTimestamp ? card : latest; + // }, {}); + + // console.log(`Most recent card found: ${JSON.stringify(mostRecentCard, null, 2)}`); + + // // Step 4: Validate the card and fetch its full data + // if (!mostRecentCard.identifier) { + // console.error("Identifier is missing in the most recent card."); + // return null; + // } + + const cardDataResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: userState.accountName, // User's account name + service: "BLOG_POST", + identifier: mostRecentCard.identifier, + }); + + existingCardIdentifier = mostRecentCard.identifier + existingCardData = cardDataResponse + + console.log("Full card data fetched successfully:", cardDataResponse); + + return cardDataResponse; // Return full card data + } + + console.log("No valid cards found."); + return null; + + } catch (error) { + console.error("Error fetching existing card:", error); + return null; + } +} + +const validateCardStructure = (card) => { + return ( + typeof card === "object" && + card.name && + card.service === "BLOG_POST" && + card.identifier && !card.identifier.includes("comment") && + card.created + ); +} + +function loadCardIntoForm(cardData) { + document.getElementById("card-header").value = cardData.header; + document.getElementById("card-content").value = cardData.content; + + const linksContainer = document.getElementById("links-container"); + linksContainer.innerHTML = ""; // Clear previous links + cardData.links.forEach(link => { + const linkInput = document.createElement("input"); + linkInput.type = "text"; + linkInput.className = "card-link"; + linkInput.value = link; + linksContainer.appendChild(linkInput); + }); +} + +async function publishCard() { + const header = document.getElementById("card-header").value.trim(); + const content = document.getElementById("card-content").value.trim(); + const links = Array.from(document.querySelectorAll(".card-link")) + .map(input => input.value.trim()) + .filter(link => link.startsWith("qortal://")); + + if (!header || !content) { + alert("Header and content are required!"); + return; + } + + const cardIdentifier = isExistingCard ? existingCardInfo.identifier : `${cardIdentifierPrefix}-${await uid()}`; + const pollName = `${cardIdentifier}-poll`; + const pollDescription = `Mintership Board Poll for ${userState.accountName}`; + + const cardData = { + header, + content, + links, + creator: userState.accountName, + timestamp: Date.now(), + poll: pollName, + }; + // new Date().toISOString() + try { + + let base64CardData = await objectToBase64(cardData); + if (!base64CardData) { + console.log(`initial base64 object creation with objectToBase64 failed, using btoa...`); + base64CardData = btoa(JSON.stringify(cardData)); + } + // const base64CardData = btoa(JSON.stringify(cardData)); + + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "BLOG_POST", + identifier: cardIdentifier, + data64: base64CardData, + }); + + await qortalRequest({ + action: "CREATE_POLL", + pollName, + pollDescription, + pollOptions: ['Yes, No'], + pollOwnerAddress: userState.accountAddress, + }); + + alert("Card and poll published successfully!"); + document.getElementById("publish-card-form").reset(); + document.getElementById("publish-card-view").style.display = "none"; + document.getElementById("cards-container").style.display = "flex"; + await loadCards(); + } catch (error) { + console.error("Error publishing card or poll:", error); + alert("Failed to publish card and poll."); + } +} + +async function loadCards() { + const cardsContainer = document.getElementById("cards-container"); + cardsContainer.innerHTML = "

Loading cards...

"; + + try { + const response = await qortalRequest({ + action: "SEARCH_QDN_RESOURCES", + service: "BLOG_POST", + query: cardIdentifierPrefix, + }); + + if (!response || response.length === 0) { + cardsContainer.innerHTML = "

No cards found.

"; + return; + } + + cardsContainer.innerHTML = "" + const pollResultsCache = {}; + + for (const card of response) { + const cardDataResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: card.name, + service: "BLOG_POST", + identifier: card.identifier, + }); + + const cardData = cardDataResponse; + + if (!cardData || !cardData.poll) { + console.warn(`Skipping card with missing poll data: ${JSON.stringify(cardData)}`); + continue; // Skip to the next card + } + + // Cache poll results + if (!pollResultsCache[cardData.poll]) { + try { + pollResultsCache[cardData.poll] = await fetchPollResults(cardData.poll); + } catch (error) { + console.warn(`Failed to fetch poll results for poll: ${cardData.poll}`, error); + pollResultsCache[cardData.poll] = null; // Store as null to avoid repeated attempts + } + } + + const pollResults = pollResultsCache[cardData.poll]; + const cardHTML = await createCardHTML(cardData, pollResults, card.identifier); + cardsContainer.insertAdjacentHTML("beforeend", cardHTML); + } + } catch (error) { + console.error("Error loading cards:", error); + cardsContainer.innerHTML = "

Failed to load cards.

"; + } +} + +const calculatePollResults = (pollData, minterGroupMembers) => { + const memberAddresses = minterGroupMembers.map(member => member.member); + let adminYes = 0, adminNo = 0, minterYes = 0, minterNo = 0; + + pollData.votes.forEach(vote => { + const voterAddress = getAddressFromPublicKey(vote.voterPublicKey); + const isAdmin = minterGroupMembers.some(member => member.member === voterAddress && member.isAdmin); + + if (vote.optionIndex === 1) { + isAdmin ? adminYes++ : memberAddresses.includes(voterAddress) ? minterYes++ : null; + } else if (vote.optionIndex === 0) { + isAdmin ? adminNo++ : memberAddresses.includes(voterAddress) ? minterNo++ : null; + } + }); + + const totalYes = adminYes + minterYes; + const totalNo = adminNo + minterNo; + + return { adminYes, adminNo, minterYes, minterNo, totalYes, totalNo }; +}; + +const postComment = async (cardIdentifier) => { + const commentInput = document.getElementById(`new-comment-${cardIdentifier}`); + const commentText = commentInput.value.trim(); + if (!commentText) { + alert('Comment cannot be empty!'); + return; + } + + const commentData = { + content: commentText, + creator: userState.accountName, + timestamp: Date.now(), + }; + + const commentIdentifier = `comment-${cardIdentifier}-${await uid()}`; + + try { + const base64CommentData = await objectToBase64(commentData); + if (!base64CommentData) { + console.log(`initial base64 object creation with objectToBase64 failed, using btoa...`); + base64CommentData = btoa(JSON.stringify(commentData)); + } + // const base64CommentData = btoa(JSON.stringify(commentData)); + await qortalRequest({ + action: 'PUBLISH_QDN_RESOURCE', + name: userState.accountName, + service: 'BLOG_POST', + identifier: commentIdentifier, + data64: base64CommentData, + }); + alert('Comment posted successfully!'); + commentInput.value = ''; // Clear input + await displayComments(cardIdentifier); // Refresh comments + } catch (error) { + console.error('Error posting comment:', error); + alert('Failed to post comment.'); + } +}; + +const fetchCommentsForCard = async (cardIdentifier) => { + try { + const response = await qortalRequest({ + action: 'SEARCH_QDN_RESOURCES', + service: 'BLOG_POST', + query: `comment-${cardIdentifier}`, + }); + return response; + } catch (error) { + console.error(`Error fetching comments for ${cardIdentifier}:`, error); + return []; + } +}; + +const displayComments = async (cardIdentifier) => { + try { + const comments = await fetchCommentsForCard(cardIdentifier); + const commentsContainer = document.getElementById(`comments-container-${cardIdentifier}`); + + // Clear previous comments + commentsContainer.innerHTML = ''; + + // Fetch and display each comment + for (const comment of comments) { + const commentDataResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: comment.name, + service: "BLOG_POST", + identifier: comment.identifier, + }); + const timestamp = await timestampToHumanReadableDate(commentDataResponse.timestamp); + const commentHTML = ` +
+

${commentDataResponse.creator}:

+

${commentDataResponse.content}

+

${timestamp}

+
+ `; + commentsContainer.insertAdjacentHTML('beforeend', commentHTML); + } + } catch (error) { + console.error(`Error displaying comments for ${cardIdentifier}:`, error); + alert("Failed to load comments. Please try again."); + } +}; + + +const toggleComments = async (cardIdentifier) => { + const commentsSection = document.getElementById(`comments-section-${cardIdentifier}`); + if (commentsSection.style.display === 'none' || !commentsSection.style.display) { + await displayComments(cardIdentifier); + commentsSection.style.display = 'block'; + } else { + commentsSection.style.display = 'none'; + } +}; + +async function createCardHTML(cardData, pollResults, cardIdentifier) { + const { header, content, links, creator, timestamp, poll } = cardData; + const formattedDate = new Date(timestamp).toLocaleString(); + const linksHTML = links.map((link, index) => ` + + `).join(""); + + const minterGroupMembers = await fetchMinterGroupMembers(); + const { adminYes = 0, adminNo = 0, minterYes = 0, minterNo = 0, totalYes = 0, totalNo = 0 } = + calculatePollResults(pollResults, minterGroupMembers) || {}; + + + return ` +
+
+

${creator}

+

${header}

+
+
Minter Post:
+
+ ${content} +
+
Minter Links:
+ +
Current Results:
+
+
+ Admin Yes: ${adminYes} + Admin No: ${adminNo} +
+
+ Minter Yes: ${minterYes} + Minter No: ${minterNo} +
+
+ Total Yes: ${totalYes} + Total No: ${totalNo} +
+
+
Support Minter?
+
+
+ + + +
+
+ +

Published by: ${creator} on ${formattedDate}

+
+ `; +} + diff --git a/assets/js/Q-Mintership.js b/assets/js/Q-Mintership.js new file mode 100644 index 0000000..86f987e --- /dev/null +++ b/assets/js/Q-Mintership.js @@ -0,0 +1,569 @@ +const messageIdentifierPrefix = `mintership-forum-message`; +const messageAttachmentIdentifierPrefix = `mintership-forum-attachment`; + +// NOTE - SET adminGroups in QortalApi.js to enable admin access to forum for specific groups. Minter Admins will be fetched automatically. + +let replyToMessageIdentifier = null; +let latestMessageIdentifiers = {}; // To keep track of the latest message in each room +let currentPage = 0; // Track current pagination page +let existingIdentifiers = new Set(); // Keep track of existing identifiers to not pull them more than once. + +// If there is a previous latest message identifiers, use them. Otherwise, use an empty. +if (localStorage.getItem("latestMessageIdentifiers")) { + latestMessageIdentifiers = JSON.parse(localStorage.getItem("latestMessageIdentifiers")); +} + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLinks = document.querySelectorAll('a[href="MINTERSHIP-FORUM"]'); + + mintershipForumLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + //login if not already logged in. + if (!userState.isLoggedIn) { + await login(); + } + await loadForumPage(); + loadRoomContent("general"); // Automatically load General Room on forum load + startPollingForNewMessages(); // Start polling for new messages after loading the forum page + }); + }); +}); + +async function loadForumPage() { + // // Remove all sections except the menu + // const allSections = document.querySelectorAll('body > section'); + // allSections.forEach(section => { + // if (!section.classList.contains('menu')) { + // section.remove(); + // } + // }); + const bodyChildren = document.body.children; + for (let i = bodyChildren.length - 1; i >= 0; i--) { + const child = bodyChildren[i]; + if (!child.classList.contains('menu')) { + child.remove(); + } + } + + const avatarUrl = `/arbitrary/THUMBNAIL/${userState.accountName}/qortal_avatar`; + + // Create the forum layout, including a header, sub-menu, and keeping the original background imagestyle="background-image: url('/assets/images/background.jpg');"> + const mainContent = document.createElement('div'); + mainContent.innerHTML = ` +
+
+ +
+
+
+ + ${userState.isAdmin ? '' : ''} + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("minters"); + }); + if (userState.isAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("general"); + }); +} + +async function renderPaginationControls(room, totalMessages, limit) { + const paginationContainer = document.getElementById("pagination-container"); + if (!paginationContainer) return; + + paginationContainer.innerHTML = ""; // Clear existing buttons + + const totalPages = Math.ceil(totalMessages / limit); + + // Add "Previous" button + if (currentPage > 0) { + const prevButton = document.createElement("button"); + prevButton.innerText = "Previous"; + prevButton.addEventListener("click", () => { + if (currentPage > 0) { + currentPage--; + loadMessagesFromQDN(room, currentPage, false); + } + }); + paginationContainer.appendChild(prevButton); + } + + // Add numbered page buttons + for (let i = 0; i < totalPages; i++) { + const pageButton = document.createElement("button"); + pageButton.innerText = i + 1; + pageButton.className = i === currentPage ? "active-page" : ""; + pageButton.addEventListener("click", () => { + if (i !== currentPage) { + currentPage = i; + loadMessagesFromQDN(room, currentPage, false); + } + }); + paginationContainer.appendChild(pageButton); + } + + // Add "Next" button + if (currentPage < totalPages - 1) { + const nextButton = document.createElement("button"); + nextButton.innerText = "Next"; + nextButton.addEventListener("click", () => { + if (currentPage < totalPages - 1) { + currentPage++; + loadMessagesFromQDN(room, currentPage, false); + } + }); + paginationContainer.appendChild(nextButton); + } +} + + + +async function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+
+
+
+
+
+ + +
+ +
+
+ `; + + const imageModalHTML = ` +
+ × + +
+ +
+ `; + forumContent.insertAdjacentHTML('beforeend', imageModalHTML); + + // Initialize Quill editor for rich text input + const quill = new Quill('#editor', { + theme: 'snow', + modules: { + toolbar: [ + [{ 'font': [] }], // Add font family options + [{ 'size': ['small', false, 'large', 'huge'] }], // Add font size options + [{ 'header': [1, 2, false] }], + ['bold', 'italic', 'underline'], // Text formatting options + [{ 'list': 'ordered'}, { 'list': 'bullet' }], + ['link', 'blockquote', 'code-block'], + [{ 'color': [] }, { 'background': [] }], // Text color and background color options + [{ 'align': [] }], // Text alignment + ['clean'] // Remove formatting button + ] + } + }); + + // Load messages from QDN for the selected room + await loadMessagesFromQDN(room, currentPage); + + document.addEventListener("click", (event) => { + if (event.target.classList.contains("inline-image")) { + const modal = document.getElementById("image-modal"); + const modalImage = document.getElementById("modal-image"); + const caption = document.getElementById("caption"); + // const downloadButton = document.getElementById("download-button"); + + // Set the modal content + modalImage.src = event.target.src; + caption.textContent = event.target.alt; + + // Set download button link - This has been moved to the Message Rendering Section of the code. + // downloadButton.onclick = () => { + // fetchAndSaveAttachment( + // "FILE", + // event.target.dataset.name, + // event.target.dataset.identifier, + // event.target.dataset.filename, + // event.target.dataset.mimeType + // ); + // }; + + // Show the modal + modal.style.display = "block"; + } + }); + + // Close the modal + document.getElementById("close-modal").addEventListener("click", () => { + document.getElementById("image-modal").style.display = "none"; + }); + + // Hide the modal when clicking outside of the image or close button + window.addEventListener("click", (event) => { + const modal = document.getElementById("image-modal"); + if (event.target == modal) { + modal.style.display = "none"; + } + }); + + + let selectedFiles = []; + + // Add event listener to handle file selection + document.getElementById('file-input').addEventListener('change', (event) => { + selectedFiles = Array.from(event.target.files); + }); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "" || selectedFiles.length > 0) { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + let attachmentIdentifiers = []; + + // Handle attachments + for (const file of selectedFiles) { + const attachmentID = `${messageAttachmentIdentifierPrefix}-${room}-${randomID}`; + try { + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "FILE", + identifier: attachmentID, + file: file, + }); + attachmentIdentifiers.push({ + name: userState.accountName, + service: "FILE", + identifier: attachmentID, + filename: file.name, + mimeType: file.type + }); + console.log(`Attachment ${file.name} published successfully with ID: ${attachmentID}`); + } catch (error) { + console.error(`Error publishing attachment ${file.name}:`, error); + } + } + + // Create message object with unique identifier, HTML content, and attachments + const messageObject = { + messageHtml: messageHtml, + hasAttachment: attachmentIdentifiers.length > 0, + attachments: attachmentIdentifiers, + replyTo: replyToMessageIdentifier + }; + + try { + // Convert message object to base64 + let base64Message = await objectToBase64(messageObject); + if (!base64Message) { + console.log(`initial object creation with object failed, using btoa...`); + base64Message = btoa(JSON.stringify(messageObject)); + } + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + + console.log("Message published successfully"); + + // Clear the editor after sending the message, including any potential attached files and replies. + quill.root.innerHTML = ""; + document.getElementById('file-input').value = ""; + selectedFiles = []; + replyToMessageIdentifier = null; + const replyContainer = document.querySelector(".reply-container"); + if (replyContainer) { + replyContainer.remove() + } + + // Show success notification + const notification = document.createElement('div'); + notification.innerText = "Message published successfully! Message will take a confirmation to show."; + notification.style.color = "green"; + notification.style.marginTop = "10px"; + document.querySelector(".message-input-section").appendChild(notification); + + setTimeout(() => { + notification.remove(); + }, 3000); + + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + // Add event listener for the load more button + const loadMoreContainer = document.getElementById("load-more-container"); + if (loadMoreContainer) { + loadMoreContainer.innerHTML = ''; + document.getElementById("load-more-button").addEventListener("click", () => { + currentPage++; + loadMessagesFromQDN(room, currentPage); + }); + } + } +} + +async function loadMessagesFromQDN(room, page, isPolling = false) { + try { + const limit = 10; + const offset = page * limit; + console.log(`Loading messages for room: ${room}, page: ${page}, offset: ${offset}, limit: ${limit}`); + + // Get the messages container + const messagesContainer = document.querySelector("#messages-container"); + if (!messagesContainer) return; + + // If not polling, clear the message container and the existing identifiers for a fresh load + if (!isPolling) { + messagesContainer.innerHTML = ""; // Clear the messages container before loading new page + existingIdentifiers.clear(); // Clear the existing identifiers set for fresh page load + } + + // Get the set of existing identifiers from the messages container + existingIdentifiers = new Set(Array.from(messagesContainer.querySelectorAll('.message-item')).map(item => item.dataset.identifier)); + + // Fetch messages for the current room and page + const response = await searchAllWithOffset(`${messageIdentifierPrefix}-${room}`, limit, offset); + console.log(`Fetched messages count: ${response.length} for page: ${page}`); + + if (response.length === 0) { + // If no messages are fetched and it's not polling, display "no messages" for the initial load + if (page === 0 && !isPolling) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + } + return; + } + + // Define `mostRecentMessage` to track the latest message during this fetch + let mostRecentMessage = latestMessageIdentifiers[room]?.latestTimestamp ? latestMessageIdentifiers[room] : null; + + // Fetch all messages that haven't been fetched before + const fetchMessages = await Promise.all(response.map(async (resource) => { + if (existingIdentifiers.has(resource.identifier)) { + return null; // Skip messages that are already displayed + } + + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data if no 'encoding: base64' is set. + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { + name: resource.name, + content: messageObject.messageHtml, + date: formattedTimestamp, + identifier: resource.identifier, + replyTo: messageObject.replyTo, + timestamp, + attachments: messageObject.attachments || [] // Include attachments if they exist + }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + // Render new messages without duplication + for (const message of fetchMessages) { + if (message && !existingIdentifiers.has(message.identifier)) { + let replyHtml = ""; + if (message.replyTo) { + const repliedMessage = fetchMessages.find(m => m && m.identifier === message.replyTo); + if (repliedMessage) { + replyHtml = ` +
+
In reply to: ${repliedMessage.name} ${repliedMessage.date}
+
${repliedMessage.content}
+
+ `; + } + } + + const isNewMessage = !mostRecentMessage || new Date(message.timestamp) > new Date(mostRecentMessage?.latestTimestamp); + + let attachmentHtml = ""; + if (message.attachments && message.attachments.length > 0) { + for (const attachment of message.attachments) { + if (attachment.mimeType.startsWith('image/')) { + try { + // OTHER METHOD NOT BEING USED HERE. WE CAN LOAD THE IMAGE DIRECTLY SINCE IT WILL BE PUBLISHED UNENCRYPTED/UNENCODED. + // const imageHtml = await loadImageHtml(attachment.service, attachment.name, attachment.identifier, attachment.filename, attachment.mimeType); + const imageUrl = `/arbitrary/${attachment.service}/${attachment.name}/${attachment.identifier}`; + + // Add the image HTML with the direct URL + attachmentHtml += `
+ ${attachment.filename} +
`; + // Add the modal download button details as well, in order to pass correct information to the modal + const downloadButton = document.getElementById("download-button"); + downloadButton.onclick = () => { + fetchAndSaveAttachment( + attachment.service, + attachment.name, + attachment.identifier, + attachment.filename, + attachment.mimeType + ); + }; + // FOR OTHER METHOD NO LONGER USED + // attachmentHtml += imageHtml; + } catch (error) { + console.error(`Failed to fetch attachment ${attachment.filename}:`, error); + } + } else { + // Display a button to download other attachments + attachmentHtml += `
+ +
`; + } + } + } + + const avatarUrl = `/arbitrary/THUMBNAIL/${message.name}/qortal_avatar`; + const messageHTML = ` +
+
+
+ Avatar + ${message.name} +
+ ${message.date} +
+ ${replyHtml} +
${message.content}
+ + +
+ `; + + // Append new message to the end of the container + messagesContainer.insertAdjacentHTML('beforeend', messageHTML); + + // Update mostRecentMessage if this message is newer + if (!mostRecentMessage || new Date(message.timestamp) > new Date(mostRecentMessage?.latestTimestamp || 0)) { + mostRecentMessage = { + latestIdentifier: message.identifier, + latestTimestamp: message.timestamp + }; + } + + // Add the identifier to the existingIdentifiers set + existingIdentifiers.add(message.identifier); + } + } + + // Update latestMessageIdentifiers for the room + if (mostRecentMessage) { + latestMessageIdentifiers[room] = mostRecentMessage; + localStorage.setItem("latestMessageIdentifiers", JSON.stringify(latestMessageIdentifiers)); + } + + // Add event listeners to the reply buttons + const replyButtons = document.querySelectorAll(".reply-button"); + replyButtons.forEach(button => { + button.addEventListener("click", () => { + replyToMessageIdentifier = button.dataset.messageIdentifier; + // Find the message being replied to + const repliedMessage = fetchMessages.find(m => m && m.identifier === replyToMessageIdentifier); + + if (repliedMessage) { + const replyContainer = document.createElement("div"); + replyContainer.className = "reply-container"; + replyContainer.innerHTML = ` +
+ Replying to: ${repliedMessage.content} + +
+ `; + + if (!document.querySelector(".reply-container")) { + const messageInputSection = document.querySelector(".message-input-section"); + + if (messageInputSection) { + messageInputSection.insertBefore(replyContainer, messageInputSection.firstChild); + + // Add a listener for the cancel reply button + document.getElementById("cancel-reply").addEventListener("click", () => { + replyToMessageIdentifier = null; + replyContainer.remove(); + }); + } + } + const messageInputSection = document.querySelector(".message-input-section"); + const editor = document.querySelector(".ql-editor"); + + if (messageInputSection) { + messageInputSection.scrollIntoView({ behavior: 'smooth', block: 'center' }); + } + + if (editor) { + editor.focus(); + } + } + }); + }); + + // Render pagination controls + const totalMessages = await searchAllCountOnly(`${messageIdentifierPrefix}-${room}`); + renderPaginationControls(room, totalMessages, limit); + } catch (error) { + console.error('Error loading messages from QDN:', error); + } +} + + +// Polling function to check for new messages without clearing existing ones +function startPollingForNewMessages() { + setInterval(async () => { + const activeRoom = document.querySelector('.room-title')?.innerText.toLowerCase().split(" ")[0]; + if (activeRoom) { + await loadMessagesFromQDN(activeRoom, currentPage, true); + } + }, 20000); +} + diff --git a/assets/js/QortalApi.js b/assets/js/QortalApi.js new file mode 100644 index 0000000..1c8f6f3 --- /dev/null +++ b/assets/js/QortalApi.js @@ -0,0 +1,712 @@ +// Set the forumAdminGroups variable +let adminGroups = ["Q-Mintership-admin", "dev-group", "Mintership-Forum-Admins"]; + +// Settings to allow non-devmode development with 'live-server' module +let baseUrl = ''; +let isOutsideOfUiDevelopment = false; + +if (typeof qortalRequest === 'function') { + console.log('qortalRequest is available as a function. Setting development mode to false and baseUrl to nothing.'); + isOutsideOfUiDevelopment = false; + baseUrl = ''; +} else { + console.log('qortalRequest is not available as a function. Setting baseUrl to localhost.'); + isOutsideOfUiDevelopment = true; + baseUrl = "http://localhost:12391"; +}; + +// USEFUL UTILITIES ----- ----- ----- +// Generate a short random ID to utilize at the end of unique identifiers. +const uid = async () => { + console.log('uid function called'); + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + let result = ''; + const charactersLength = characters.length; + for (let i = 0; i < 6; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + }; + console.log('Generated uid:', result); + return result; +}; +// Turn a unix timestamp into a human-readable date +const timestampToHumanReadableDate = async(timestamp) => { + console.log('timestampToHumanReadableDate called'); + const date = new Date(timestamp); + const day = date.getDate(); + const month = date.getMonth() + 1; + const year = date.getFullYear() - 2000; + const hours = date.getHours(); + const minutes = date.getMinutes(); + const seconds = date.getSeconds(); + + const formattedDate = `${month}.${day}.${year}@${hours}:${minutes}:${seconds}`; + console.log('Formatted date:', formattedDate); + return formattedDate; +}; +// Base64 encode a string +const base64EncodeString = async (str) => { + console.log('base64EncodeString called'); + const encodedString = btoa(String.fromCharCode.apply(null, new Uint8Array(new TextEncoder().encode(str).buffer))); + console.log('Encoded string:', encodedString); + return encodedString; +}; + +const objectToBase64 = async (obj) => { + // Step 1: Convert the object to a JSON string + const jsonString = JSON.stringify(obj); + // Step 2: Create a Blob from the JSON string + const blob = new Blob([jsonString], { type: 'application/json' }); + // Step 3: Create a FileReader to read the Blob as a base64-encoded string + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onloadend = () => { + if (typeof reader.result === 'string') { + // Remove 'data:application/json;base64,' prefix + const base64 = reader.result.replace('data:application/json;base64,', ''); + console.log(`base64 resolution: ${base64}`); + resolve(base64); + } else { + reject(new Error('Failed to read the Blob as a base64-encoded string')); + } + }; + reader.onerror = () => { + reject(reader.error); + }; + reader.readAsDataURL(blob); + }); +}; + +// User state util +const userState = { + isLoggedIn: false, + accountName: null, + accountAddress: null, + isAdmin: false, + isMinterAdmin: false, + isForumAdmin: false +}; + +// USER-RELATED QORTAL CALLS ------------------------------------------ +// Obtain the address of the authenticated user checking userState.accountAddress first. +const getUserAddress = async () => { + console.log('getUserAddress called'); + try { + if (userState.accountAddress) { + console.log('User address found in state:', userState.accountAddress); + return userState.accountAddress; + }; + const userAccount = await qortalRequest({ action: "GET_USER_ACCOUNT" }); + if (userAccount) { + console.log('Account address:', userAccount.address); + userState.accountAddress = userAccount.address; + console.log('Account address added to state:', userState.accountAddress); + return userState.accountAddress; + }; + } catch (error) { + console.error('Error fetching account address:', error); + throw error; + }; +}; + +const fetchOwnerAddressFromName = async (name) => { + console.log('fetchOwnerAddressFromName called'); + console.log('name:', name); + try { + const response = await fetch(`${baseUrl}/names/${name}`, { + headers: { 'Accept': 'application/json' }, + method: 'GET', + }); + const data = await response.json(); + console.log('Fetched owner address:', data.owner); + return data.owner; + } catch (error) { + console.error('Error fetching owner address:', error); + return null; + }; +}; + +const verifyUserIsAdmin = async () => { + console.log('verifyUserIsAdmin called (QortalApi.js)'); + try { + const accountAddress = userState.accountAddress || await getUserAddress(); + userState.accountAddress = accountAddress; + const userGroups = await getUserGroups(accountAddress); + const minterGroupAdmins = await fetchMinterGroupAdmins(); + const isAdmin = await userGroups.some(group => adminGroups.includes(group.groupName)) + const isMinterAdmin = minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) + if (isMinterAdmin) { + userState.isMinterAdmin = true + } + if (isAdmin) { + userState.isAdmin = true; + userState.isForumAdmin = true + } + return userState.isAdmin; + } catch (error) { + console.error('Error verifying user admin status:', error); + throw error; + } +}; + +const verifyAddressIsAdmin = async (address) => { + console.log('verifyAddressIsAdmin called'); + console.log('address:', address); + try { + if (!address) { + console.log('No address provided'); + return false; + }; + const userGroups = await getUserGroups(address); + const minterGroupAdmins = await fetchMinterGroupAdmins(); + const isAdmin = await userGroups.some(group => adminGroups.includes(group.groupName)) + const isMinterAdmin = minterGroupAdmins.members.some(admin => admin.member === address && admin.isAdmin) + if ((isMinterAdmin) || (isAdmin)) { + return true; + } else { + return false + }; + } catch (error) { + console.error('Error verifying address admin status:', error); + throw error + } +}; + +const getNameInfo = async (name) => { + console.log('getNameInfo called'); + console.log('name:', name); + try { + const response = await fetch(`${baseUrl}/names/${name}`); + const data = await response.json(); + console.log('Fetched name info:', data); + return { + name: data.name, + reducedName: data.reducedName, + owner: data.owner, + data: data.data, + registered: data.registered, + updated: data.updated, + isForSale: data.isForSale, + salePrice: data.salePrice + }; + } catch (error) { + console.log('Error fetching name info:', error); + return null; + } +}; + +const getPublicKeyByName = async (name) => { + console.log('getPublicKeyByName called'); + console.log('name:', name); + try { + const nameInfo = await getNameInfo(name); + const address = nameInfo.owner; + const publicKey = await getPublicKeyFromAddress(address); + console.log(`Found public key: for name: ${name}`, publicKey); + return publicKey; + } catch (error) { + console.log('Error obtaining public key from name:', error); + return null; + } +}; + +const getPublicKeyFromAddress = async (address) => { + console.log('getPublicKeyFromAddress called'); + console.log('address:', address); + try { + const response = await fetch(`${baseUrl}/addresses/${address}`,{ + method: 'GET', + headers: { 'Accept': 'application/json' } + }); + const data = await response.json(); + const publicKey = data.publicKey; + console.log('Fetched public key:', publicKey); + return publicKey; + } catch (error) { + console.log('Error fetching public key from address:', error); + return null; + } +}; + +const getAddressFromPublicKey = async (publicKey) => { + console.log('getAddressFromPublicKey called'); + try { + const response = await fetch(`${baseUrl}/addresses/convert/${publicKey}`,{ + method: 'GET', + headers: { 'Accept': 'text/plain' } + }); + const data = await response.text(); + const address = data; + console.log('Converted Address:', address); + return address; + } catch (error) { + console.log('Error converting public key to address:', error); + return null; + } +}; + +const login = async () => { + console.log('login called'); + try { + if (userState.accountName && (userState.isAdmin || userState.isLoggedIn) && userState.accountAddress) { + console.log(`Account name found in userState: '${userState.accountName}', no need to call API...skipping API call.`); + return userState.accountName; + } + + const accountAddress = userState.accountAddress || await getUserAddress(); + const accountNames = await qortalRequest({ + action: "GET_ACCOUNT_NAMES", + address: accountAddress, + }); + + if (accountNames) { + userState.isLoggedIn = true; + userState.accountName = accountNames[0].name; + userState.accountAddress = accountAddress; + console.log('All account names:', accountNames); + console.log('Main name (in state):', userState.accountName); + console.log('User has been logged in successfully!'); + return userState.accountName; + } else { + throw new Error("No account names found. Are you logged in? Do you have a registered name?"); + } + } catch (error) { + console.error('Error fetching account names:', error); + throw error; + } +}; + +const getNamesFromAddress = async (address) => { +try { + const response = await fetch(`${baseUrl}/names/address/${address}?limit=20`, { + method: 'GET', + headers: { 'Accept': 'application/json' } + }); + const names = await response.json(); + return names.length > 0 ? names[0].name : address; // Return name if found, else return address +} catch (error) { + console.error(`Error fetching names for address ${address}:`, error); + return address; +} +}; + + +// QORTAL GROUP-RELATED CALLS ------------------------------------------ +const getUserGroups = async (userAddress) => { + console.log('getUserGroups called'); + console.log('userAddress:', userAddress); + try { + if (!userAddress && userState.accountAddress) { + console.log('No address passed to getUserGroups call... using address from state...'); + userAddress = userState.accountAddress; + } + const response = await fetch(`${baseUrl}/groups/member/${userAddress}`, { + method: 'GET', + headers: { 'accept': 'application/json' } + }); + const data = await response.json(); + console.log('Fetched user groups:', data); + return data; + } catch (error) { + console.error('Error fetching user groups:', error); + throw error; + } +}; + +const fetchMinterGroupAdmins = async () => { + console.log('calling for minter admins') + const response = await fetch(`${baseUrl}/groups/members/694?onlyAdmins=true&limit=0&reverse=true`,{ + method: 'GET', + headers: { 'Accept': 'application/json' } + }); + const admins = await response.json(); + console.log('Fetched minter admins', admins); + return admins; +} + +const fetchMinterGroupMembers = async () => { + try { + const response = await fetch(`${baseUrl}/groups/members/694?limit=0`, { + method: 'GET', + headers: { 'Accept': 'application/json' }, + }); + + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + + const data = await response.json(); + + // Ensure the structure of the response is as expected + if (!Array.isArray(data.members)) { + throw new Error("Expected 'members' to be an array but got a different structure"); + } + + return data.members; // Assuming 'members' is the key in the response JSON + } catch (error) { + console.error("Error fetching minter group members:", error); + return []; // Return an empty array to prevent further errors + } + }; + + + + +const fetchAllGroups = async (limit) => { + console.log('fetchAllGroups called'); + console.log('limit:', limit); + if (!limit) { + limit = 2000; + } + try { + const response = await fetch(`${baseUrl}/groups?limit=${limit}&reverse=true`); + const data = await response.json(); + console.log('Fetched all groups:', data); + return data; + } catch (error) { + console.error('Error fetching all groups:', error); + } +}; + +// QDN data calls +const searchLatestDataByIdentifier = async (identifier) => { + console.log('fetchAllDataByIdentifier called'); + console.log('identifier:', identifier); + try { + const response = await fetch(`${baseUrl}/arbitrary/resources/search?service=DOCUMENT&identifier=${identifier}&includestatus=true&mode=ALL&limit=0&reverse=true`, { + method: 'GET', + headers: { 'Accept': 'application/json' } + }); + const latestData = await response.json(); + console.log('Fetched latest data by identifier:', latestData); + return latestData; + } catch (error) { + console.error('Error fetching latest published data:', error); + return null; + } +}; + +const publishMultipleResources = async (resources, publicKeys = null, isPrivate = false) => { + console.log('publishMultipleResources called'); + console.log('resources:', resources); + + const request = { + action: 'PUBLISH_MULTIPLE_QDN_RESOURCES', + resources: resources, + }; + + if (isPrivate && publicKeys) { + request.encrypt = true; + request.publicKeys = publicKeys; + }; + + try { + const response = await qortalRequest(request); + console.log('Multiple resources published successfully:', response); + } catch (error) { + console.error('Error publishing multiple resources:', error); + }; +}; + + +const searchResourcesWithMetadata = async (query, limit) => { + console.log('searchResourcesWithMetadata called'); + try { + if (limit == 0) { + limit = 0; + } else if (!limit || (limit < 10 && limit != 0)) { + limit = 200; + } + const response = await fetch(`${baseUrl}/arbitrary/resources/search?query=${query}&mode=ALL&includestatus=true&includemetadata=true&limit=${limit}&reverse=true`, { + method: 'GET', + headers: { 'accept': 'application/json' } + }); + const data = await response.json(); + console.log('Search results with metadata:', data); + return data; + } catch (error) { + console.error('Error searching for resources with metadata:', error); + throw error; + } +}; + +const searchAllResources = async (query, limit, after, reverse=false) => { + console.log('searchAllResources called. Query:', query, 'Limit:', limit,'Reverse:', reverse); + try { + if (limit == 0) { + limit = 0; + } + if (!limit || (limit < 10 && limit != 0)) { + limit = 200; + } + if (after == null || after === undefined) { + after = 0; + } + const response = await fetch(`${baseUrl}/arbitrary/resources/search?query=${query}&mode=ALL&after=${after}&includestatus=false&includemetadata=false&limit=${limit}&reverse=${reverse}`, { + method: 'GET', + headers: { 'accept': 'application/json' } + }); + const data = await response.json(); + console.log('Search results with metadata:', data); + return data; + } catch (error) { + console.error('Error searching for resources with metadata:', error); + throw error; + } +}; + +const searchAllWithOffset = async (query, limit, offset) =>{ + try { + const response = await qortalRequest({ + action: "SEARCH_QDN_RESOURCES", + service: "BLOG_POST", + query: query, + limit: limit, + offset: offset, + mode: "ALL", + reverse: false + }); + return response + } catch (error) { + console.error("Error during SEARCH_QDN_RESOURCES:", error); + return []; + } +} + +const searchAllCountOnly = async (query) => { + try { + let offset = 0; + const limit = 100; // Chunk size for fetching + let totalCount = 0; + let hasMore = true; + + // Fetch in chunks to accumulate the count + while (hasMore) { + const response = await qortalRequest({ + action: "SEARCH_QDN_RESOURCES", + service: "BLOG_POST", + query: query, + limit: limit, + offset: offset, + mode: "ALL", + reverse: false + }); + + if (response && response.length > 0) { + totalCount += response.length; + offset += limit; + console.log(`Fetched ${response.length} items, total count: ${totalCount}, current offset: ${offset}`); + } else { + hasMore = false; + } + } + + return totalCount; + } catch (error) { + console.error("Error during SEARCH_QDN_RESOURCES:", error); + throw error; + } +} + +const searchResourcesWithStatus = async (query, limit, status = 'local') => { + console.log('searchResourcesWithStatus called'); + console.log('query:', query); + console.log('limit:', limit); + console.log('status:', status); + try { + // Set default limit if not provided or too low + if (!limit || limit < 10) { + limit = 200; + } + // Make API request + const response = await fetch(`${baseUrl}/arbitrary/resources/search?query=${query}&includestatus=true&limit=${limit}&reverse=true`, { + method: 'GET', + headers: { 'accept': 'application/json' } + }); + + const data = await response.json(); + // Filter based on status if provided + if (status) { + if (status === 'notLocal') { + const notDownloaded = data.filter((resource) => resource.status.status === 'published'); + console.log('notDownloaded:', notDownloaded); + return notDownloaded; + } else if (status === 'local') { + const downloaded = data.filter((resource) => + resource.status.status === 'ready' || + resource.status.status === 'downloaded' || + resource.status.status === 'building' || + (resource.status.status && resource.status.status !== 'published') + ); + return downloaded; + } + } + // Return all data if no specific status is provided + console.log('Returning all data...'); + return data; + } catch (error) { + console.error('Error searching for resources with metadata:', error); + throw error; + } +}; + +const getResourceMetadata = async (service, name, identifier) => { + console.log('getResourceMetadata called'); + console.log('service:', service); + console.log('name:', name); + console.log('identifier:', identifier); + try { + const response = await fetch(`${baseUrl}/arbitrary/metadata/${service}/${name}/${identifier}`, { + method: 'GET', + headers: { 'accept': 'application/json' } + }); + const data = await response.json(); + console.log('Fetched resource metadata:', data); + return data; + } catch (error) { + console.error('Error fetching resource metadata:', error); + throw error; + } +}; + +const fetchFileBase64 = async (service, name, identifier) => { + const url = `${baseUrl}/arbitrary/${service}/${name}/${identifier}/?encoding=base64`; + try { + const response = await fetch(url,{ + method: 'GET', + headers: { 'accept': 'text/plain' } + }); + return response; + } catch (error) { + console.error("Error fetching the image file:", error); + } +}; + +async function loadImageHtml(service, name, identifier, filename, mimeType) { + try { + const url = `${baseUrl}/arbitrary/${service}/${name}/${identifier}`; + // Fetch the file as a blob + const response = await fetch(url); + // Convert the response to a Blob + const fileBlob = new Blob([response], { type: mimeType }); + // Create an Object URL from the Blob + const objectUrl = URL.createObjectURL(fileBlob); + // Use the Object URL as the image source + const attachmentHtml = `
${filename}
`; + + return attachmentHtml; + + } catch (error) { + console.error("Error fetching the image:", error); + } +} + +const fetchAndSaveAttachment = async (service, name, identifier, filename, mimeType) => { + const url = `${baseUrl}/arbitrary/${service}/${name}/${identifier}`; + try { + const response = await fetch(url); + const blob = await response.blob(); + await qortalRequest({ + action: "SAVE_FILE", + blob, + filename: filename, + mimeType + }); + } catch (error) { + console.error("Error fetching or saving the attachment:", error); + } +} + +const renderData = async (service, name, identifier) => { + console.log('renderData called'); + console.log('service:', service); + console.log('name:', name); + console.log('identifier:', identifier); + + try { + const response = await fetch(`${baseUrl}/render/${service}/${name}?identifier=${identifier}`, { + method: 'GET', + headers: { 'accept': '*/*' } + }); + // If the response is not OK (status 200-299), throw an error + if (!response.ok) { + throw new Error('Error rendering data'); + } + + const responseText = await response.text(); + // Check if the response includes indicating it's an HTML document + if (responseText.includes(' { + console.log('getProductDetails called'); + console.log('service:', service); + console.log('name:', name); + console.log('identifier:', identifier); + try { + const response = await fetch(`${baseUrl}/arbitrary/metadata/${service}/${name}/${identifier}`, { + method: 'GET', + headers: { 'accept': 'application/json' } + }); + const data = await response.json(); + console.log('Fetched product details:', data); + return data; + } catch (error) { + console.error('Error fetching product details:', error); + throw error; + } +}; + + +// Qortal poll-related calls ---------------------------------------------------------------------- + +const fetchPollResults = async (pollName) => { + try { + const response = await fetch(`${baseUrl}/polls/votes/${pollName}`, { + method: 'GET', + headers: { 'Accept': 'application/json' } + }); + const pollData = await response.json(); + return pollData; + } catch (error) { + console.error(`Error fetching poll results for ${pollName}:`, error); + return null; + } + }; + +// export { +// userState, +// adminGroups, +// searchResourcesWithMetadata, +// searchResourcesWithStatus, +// getResourceMetadata, +// renderData, +// getProductDetails, +// getUserGroups, +// getUserAddress, +// login, +// timestampToHumanReadableDate, +// base64EncodeString, +// verifyUserIsAdmin, +// fetchAllDataByIdentifier, +// fetchOwnerAddressFromName, +// verifyAddressIsAdmin, +// uid, +// fetchAllGroups, +// getNameInfo, +// publishMultipleResources, +// getPublicKeyByName, +// objectToBase64, +// fetchMinterGroupAdmins +// }; diff --git a/assets/js/css-scratch.css b/assets/js/css-scratch.css new file mode 100644 index 0000000..3c4379c --- /dev/null +++ b/assets/js/css-scratch.css @@ -0,0 +1,195 @@ +/* forum-styles.css */ + +.forum-main { + color: #ffffff; + background-color: #000000; + padding: 0; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + width: 100vw; + box-sizing: border-box; + background-size: cover; + background-position: center; + } + + .forum-header { + width: 100%; + padding: 2vh; + background-color: #000000; + color: #add8e6; /* Light blue color */ + text-align: center; + font-size: 2.5rem; + font-weight: bold; + margin-bottom: 0; + } + + .forum-submenu { + width: 100%; + padding: 1vh 2vh; + background: rgba(0, 0, 0, 0.8); + text-align: center; + margin-top: 0; + } + + .forum-rooms { + display: flex; + justify-content: center; + gap: 2vh; /* Increased gap for better spacing */ + margin-top: 0; + flex-wrap: wrap; + } + + .room-button { + background-color: #317e78; + color: #ffffff; + border: 2px solid #317e78; + border-radius: 2vh; + padding: 1vh 2vh; + font-size: 1.1rem; + cursor: pointer; + } + + .room-button:hover { + background-color: #19403d; + } + + .forum-content { + flex-grow: 1; + width: 90%; + padding: 3vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + box-sizing: border-box; + border: 3px solid #ffffff; /* Increased border width */ + } + + .room-content { + background: rgba(0, 0, 0, 0.6); + padding: 2vh; + border-radius: 1vh; + width: 100%; + box-sizing: border-box; + text-align: center; + } + + .room-title { + color: #add8e6; /* Light blue color for room name */ + text-align: center; + margin-bottom: 2vh; + font-size: 2rem; + } + + .message-item { + background: #1c1c1c; + color: #ffffff; + padding: 1vh; + margin-bottom: 1vh; + border-radius: 0.8vh; + width: 100%; + box-sizing: border-box; + display: flex; + flex-direction: column; + align-items: flex-start; + border: 1px solid #ffffff; + } + + .message-header { + display: flex; + justify-content: space-between; + width: 100%; + margin-bottom: 1vh; + font-size: 1.25rem; + color: white + } + + .message-header.username { + color: #228ec0; + } + + .username { + font-weight: bold; + color:#228ec0 + } + + .timestamp { + font-style: italic; + color: rgb(157, 167, 151) + } + + .message-text { + margin: 0; + font-size: 1.25rem; + } + + .reply-button { + align-self: flex-end; + margin-top: 1vh; + background-color: #167089; + color: #ffffff; + border: none; + border-radius: 1vh; + padding: 0.3vh 0.6vh; + cursor: pointer; + } + + .reply-button:hover { + background-color: #19403d; + } + +/* forum-styles.css additions */ + + .message-input-section { + display: flex; + flex-direction: column; + align-items: stretch; + box-sizing: border-box; + width: 100%; + gap: 1vh; /* Spacing between toolbar and editor */ + background-color: black; + padding: 1vh; + } + + .ql-editor { + flex-grow: 1; + text-size: 1.25rem; + } + + .message-input { + flex-grow: 1; + padding: 2vh; + border-radius: 1vh; + border: 1px solid #cccccc; + font-size: 1.25rem; + /* margin-right: 8vh; */ + box-sizing: border-box; + min-height: 15vh; + } + + .send-button { + background-color: #13a97c; + color: #ffffff; + border: none; + border-radius: 1vh; + padding: 2vh 4vh; + cursor: pointer; + } + + .send-button:hover { + background-color: #19403d; + } + + .messages-container { + width: 100%; + margin-bottom: 5vh; /* Ensure space above input section */ + overflow-y: auto; + padding-bottom: 1vh; + box-sizing: border-box; + } + + + \ No newline at end of file diff --git a/assets/js/scratch-2.js b/assets/js/scratch-2.js new file mode 100644 index 0000000..057f7bf --- /dev/null +++ b/assets/js/scratch-2.js @@ -0,0 +1,305 @@ +const messageIdentifierPrefix = `mintership-forum-message`; + +let replyToMessageIdentifier = null; +let latestMessageIdentifiers = {}; // To keep track of the latest message in each room +let currentPage = 0; // Track current pagination page + +// Load the latest message identifiers from local storage +if (localStorage.getItem("latestMessageIdentifiers")) { + latestMessageIdentifiers = JSON.parse(localStorage.getItem("latestMessageIdentifiers")); +} + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLinks = document.querySelectorAll('a[href="MINTERSHIP-FORUM"]'); + + mintershipForumLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + await login(); // Assuming login is an async function + await loadForumPage(); + loadRoomContent("general"); // Automatically load General Room on forum load + startPollingForNewMessages(); // Start polling for new messages after loading the forum page + }); + }); +}); + +async function loadForumPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + // Check if user is an admin + const minterGroupAdmins = await fetchMinterGroupAdmins(); + const isUserAdmin = minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) || await verifyUserIsAdmin(); + + // Create the forum layout, including a header, sub-menu, and keeping the original background imagestyle="background-image: url('/assets/images/background.jpg');"> + const mainContent = document.createElement('div'); + mainContent.innerHTML = ` +
+
+ +
+
+
+ + ${isUserAdmin ? '' : ''} + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("minters"); + }); + if (isUserAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("general"); + }); +} + +function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+ +
+
+
+ +
+
+ `; + + // Initialize Quill editor for rich text input + const quill = new Quill('#editor', { + theme: 'snow', + modules: { + toolbar: [ + [{ 'font': [] }], // Add font family options + [{ 'size': ['small', false, 'large', 'huge'] }], // Add font size options + [{ 'header': [1, 2, false] }], + ['bold', 'italic', 'underline'], // Text formatting options + [{ 'list': 'ordered'}, { 'list': 'bullet' }], + ['link', 'blockquote', 'code-block'], + [{ 'color': [] }, { 'background': [] }], // Text color and background color options + [{ 'align': [] }], // Text alignment + ['clean'] // Remove formatting button + ] + } + }); + + // Load messages from QDN for the selected room + loadMessagesFromQDN(room, currentPage); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "") { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + + // Create message object with unique identifier and HTML content + const messageObject = { + messageHtml: messageHtml, + hasAttachment: false, + replyTo: replyToMessageIdentifier + }; + + try { + // Convert message object to base64 + let base64Message = await objectToBase64(messageObject); + if (!base64Message) { + console.log(`initial object creation with object failed, using btoa...`) + base64Message = btoa(JSON.stringify(messageObject)); + } + + console.log("Message Object:", messageObject); + console.log("Base64 Encoded Message:", base64Message); + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, // Publisher must own the registered name + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + console.log("Message published successfully"); + // Clear the editor after sending the message + quill.root.innerHTML = ""; + replyToMessageIdentifier = null; // Clear reply reference after sending + // Clear reply reference after sending if it exists. + if (replyToMessageIdentifier) { + replyToMessageIdentifier = null; + replyContainer.remove(); + } + // Update the latest message identifier + latestMessageIdentifiers[room] = messageIdentifier; + localStorage.setItem("latestMessageIdentifiers", JSON.stringify(latestMessageIdentifiers)); + // Reload messages + loadMessagesFromQDN(room, currentPage); + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + + // Add event listener for the load more button + document.getElementById("load-more-button").addEventListener("click", () => { + currentPage++; + loadMessagesFromQDN(room, currentPage); + }); + } +} + +// Load messages for any given room with pagination +async function loadMessagesFromQDN(room, page) { + try { + const offset = page * 10; + const limit = 10; + + // Get the set of existing identifiers from the messages container + const messagesContainer = document.querySelector("#messages-container"); + const existingIdentifiers = new Set(Array.from(messagesContainer.querySelectorAll('.message-item')).map(item => item.dataset.identifier)); + + // Fetch only messages that are not already present in the messages container + const response = await searchAllWithoutDuplicates(`${messageIdentifierPrefix}-${room}`, limit, offset, existingIdentifiers); + + if (messagesContainer) { + if (!response || !response.length) { + if (page === 0) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + } + return; + } + + // Fetch all messages + const fetchMessages = await Promise.all(response.map(async (resource) => { + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data if no 'encoding: base64' is set. + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { name: resource.name, content: messageObject.messageHtml, date: formattedTimestamp, identifier: resource.identifier, replyTo: messageObject.replyTo }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + // Render messages without duplication + fetchMessages.forEach((message) => { + if (message && !existingIdentifiers.has(message.identifier)) { + let replyHtml = ""; + if (message.replyTo) { + const repliedMessage = fetchMessages.find(m => m && m.identifier === message.replyTo); + if (repliedMessage) { + replyHtml = ` +
+
In reply to: ${repliedMessage.name} ${repliedMessage.date}
+
${repliedMessage.content}
+
+ `; + } + } + + const isNewMessage = !latestMessageIdentifiers[room] || new Date(message.date) > new Date(latestMessageIdentifiers[room]); + + const messageHTML = ` +
+ ${replyHtml} +
+ ${message.name} + ${message.date} + ${isNewMessage ? 'NEW' : ''} +
+
${message.content}
+ +
+ `; + + messagesContainer.insertAdjacentHTML('beforeend', messageHTML); + } + }); + + // Add event listeners to the reply buttons + const replyButtons = document.querySelectorAll(".reply-button"); + + replyButtons.forEach(button => { + button.addEventListener("click", () => { + replyToMessageIdentifier = button.dataset.messageIdentifier; + // Find the message being replied to + const repliedMessage = fetchMessages.find(m => m && m.identifier === replyToMessageIdentifier); + + if (repliedMessage) { + const replyContainer = document.createElement("div"); + replyContainer.className = "reply-container"; + replyContainer.innerHTML = ` +
+ Replying to: ${repliedMessage.content} + +
+ `; + + if (!document.querySelector(".reply-container")) { + const messageInputSection = document.querySelector(".message-input-section"); + + if (messageInputSection) { + messageInputSection.insertBefore(replyContainer, messageInputSection.firstChild); + + // Add a listener for the cancel reply button + document.getElementById("cancel-reply").addEventListener("click", () => { + replyToMessageIdentifier = null; + replyContainer.remove(); + }); + } + } + } + }); + }); + + } + } catch (error) { + console.error('Error loading messages from QDN:', error); + } +} + +// Polling function to check for new messages +function startPollingForNewMessages() { + setInterval(async () => { + const activeRoom = document.querySelector('.room-title')?.innerText.toLowerCase().split(" ")[0]; + if (activeRoom) { + await loadMessagesFromQDN(activeRoom, currentPage); + } + }, 20000); +} diff --git a/assets/js/scratch.js b/assets/js/scratch.js new file mode 100644 index 0000000..119767c --- /dev/null +++ b/assets/js/scratch.js @@ -0,0 +1,392 @@ +const messageIdentifierPrefix = `mintership-forum-message`; +const messageAttachmentIdentifierPrefix = `mintership-forum-attachment`; + +let replyToMessageIdentifier = null; +let latestMessageIdentifiers = {}; // To keep track of the latest message in each room +let currentPage = 0; // Track current pagination page +let existingIdentifiers = new Set(); // Keep track of existing identifiers to not pull them more than once. + +// If there is a previous latest message identifiers, use them. Otherwise, use an empty. +if (localStorage.getItem("latestMessageIdentifiers")) { + latestMessageIdentifiers = JSON.parse(localStorage.getItem("latestMessageIdentifiers")); +} + +document.addEventListener("DOMContentLoaded", async () => { + // Identify the link for 'Mintership Forum' + const mintershipForumLinks = document.querySelectorAll('a[href="MINTERSHIP-FORUM"]'); + + mintershipForumLinks.forEach(link => { + link.addEventListener('click', async (event) => { + event.preventDefault(); + await login(); // Assuming login is an async function + await loadForumPage(); + loadRoomContent("general"); // Automatically load General Room on forum load + startPollingForNewMessages(); // Start polling for new messages after loading the forum page + }); + }); +}); + +async function loadForumPage() { + // Remove all sections except the menu + const allSections = document.querySelectorAll('body > section'); + allSections.forEach(section => { + if (!section.classList.contains('menu')) { + section.remove(); + } + }); + + // Check if user is an admin + const minterGroupAdmins = await fetchMinterGroupAdmins(); + const isUserAdmin = minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) || await verifyUserIsAdmin(); + + // Create the forum layout, including a header, sub-menu, and keeping the original background imagestyle="background-image: url('/assets/images/background.jpg');"> + const mainContent = document.createElement('div'); + mainContent.innerHTML = ` +
+
+ +
+
+
+ + ${isUserAdmin ? '' : ''} + +
+
+
+
+ `; + + document.body.appendChild(mainContent); + + // Add event listeners to room buttons + document.getElementById("minters-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("minters"); + }); + if (isUserAdmin) { + document.getElementById("admins-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("admins"); + }); + } + document.getElementById("general-room").addEventListener("click", () => { + currentPage = 0; + loadRoomContent("general"); + }); +} + +function loadRoomContent(room) { + const forumContent = document.getElementById("forum-content"); + if (forumContent) { + forumContent.innerHTML = ` +
+

${room.charAt(0).toUpperCase() + room.slice(1)} Room

+
+ ${(existingIdentifiers.size > 10)? '' : ''} +
+
+
+
+ + +
+ +
+
+ `; + + // Initialize Quill editor for rich text input + const quill = new Quill('#editor', { + theme: 'snow', + modules: { + toolbar: [ + [{ 'font': [] }], // Add font family options + [{ 'size': ['small', false, 'large', 'huge'] }], // Add font size options + [{ 'header': [1, 2, false] }], + ['bold', 'italic', 'underline'], // Text formatting options + [{ 'list': 'ordered'}, { 'list': 'bullet' }], + ['link', 'blockquote', 'code-block'], + [{ 'color': [] }, { 'background': [] }], // Text color and background color options + [{ 'align': [] }], // Text alignment + ['clean'] // Remove formatting button + ] + } + }); + + // Load messages from QDN for the selected room + loadMessagesFromQDN(room, currentPage); + + let selectedFiles = []; + + // Add event listener to handle file selection + document.getElementById('file-input').addEventListener('change', (event) => { + selectedFiles = Array.from(event.target.files); + }); + + // Add event listener for the send button + document.getElementById("send-button").addEventListener("click", async () => { + const messageHtml = quill.root.innerHTML.trim(); + if (messageHtml !== "" || selectedFiles.length > 0) { + const randomID = await uid(); + const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; + let attachmentIdentifiers = []; + + // Handle attachments + for (const file of selectedFiles) { + const attachmentID = `${messageAttachmentIdentifierPrefix}-${randomID}-${file.name}`; + try { + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, // Publisher must own the registered name + service: "IMAGE", // Adjust based on file type + identifier: attachmentID, + file: file + }); + attachmentIdentifiers.push(attachmentID); + console.log(`Attachment ${file.name} published successfully with ID: ${attachmentID}`); + } catch (error) { + console.error(`Error publishing attachment ${file.name}:`, error); + } + } + + // Create message object with unique identifier, HTML content, and attachments + const messageObject = { + messageHtml: messageHtml, + hasAttachment: attachmentIdentifiers.length > 0, + attachments: attachmentIdentifiers, + replyTo: replyToMessageIdentifier + }; + if (!messageObject.attachments) { + messageObject.attachments = []; + } + messageObject.attachments.push({ + identifier: attachmentIdentifier, + filename: file.name, + mimeType: file.type + }); + + try { + // Convert message object to base64 + let base64Message = await objectToBase64(messageObject); + if (!base64Message) { + console.log(`initial object creation with object failed, using btoa...`) + base64Message = btoa(JSON.stringify(messageObject)); + } + + console.log("Message Object:", messageObject); + console.log("Base64 Encoded Message:", base64Message); + + // Publish message to QDN + await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userState.accountName, // Publisher must own the registered name + service: "BLOG_POST", + identifier: messageIdentifier, + data64: base64Message + }); + console.log("Message published successfully"); + + // Clear the editor after sending the message + quill.root.innerHTML = ""; + replyToMessageIdentifier = null; + document.getElementById('file-input').value = ""; + selectedFiles = []; + + // Clear reply reference after sending if it exists. + if (replyToMessageIdentifier) { + replyToMessageIdentifier = null; + replyContainer.remove(); + } + + // Update the latest message identifier + latestMessageIdentifiers[room] = messageIdentifier; + localStorage.setItem("latestMessageIdentifiers", JSON.stringify(latestMessageIdentifiers)); + + // Reload messages - - - - - - - - - - - - - - - - - - CHANGE THIS TO DISPLAY THE LAST MESSAGE IN THE CONTAINER INSTEAD OF RELOADING ALL MESSAGES, AND DISPLAY NOTIFICATION OF SUCCESSFUL PUBLISH. + + } catch (error) { + console.error("Error publishing message:", error); + } + } + }); + + // Add event listener for the load more button + document.getElementById("load-more-button").addEventListener("click", () => { + currentPage++; + loadMessagesFromQDN(room, currentPage); + }); + } +} + +// Load messages for any given room with pagination +async function loadMessagesFromQDN(room, page, isPolling = false) { + try { + const offset = page * 10; + const limit = 10; + + // Get the set of existing identifiers from the messages container + const messagesContainer = document.querySelector("#messages-container"); + existingIdentifiers = new Set(Array.from(messagesContainer.querySelectorAll('.message-item')).map(item => item.dataset.identifier)); + + // Fetch only messages that are not already present in the messages container + const response = await searchAllWithoutDuplicates(`${messageIdentifierPrefix}-${room}`, limit, offset, existingIdentifiers); + + if (messagesContainer) { + // If there are no messages and we're not polling, display "no messages" message + if (!response || !response.length) { + if (page === 0 && !isPolling) { + messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; + } + return; + } + + // Fetch all messages that haven't been fetched before + const fetchMessages = await Promise.all(response.map(async (resource) => { + try { + console.log(`Fetching message with identifier: ${resource.identifier}`); + const messageResponse = await qortalRequest({ + action: "FETCH_QDN_RESOURCE", + name: resource.name, + service: "BLOG_POST", + identifier: resource.identifier, + }); + + console.log("Fetched message response:", messageResponse); + + // No need to decode, as qortalRequest returns the decoded data if no 'encoding: base64' is set. + const messageObject = messageResponse; + const timestamp = resource.updated || resource.created; + const formattedTimestamp = await timestampToHumanReadableDate(timestamp); + return { name: resource.name, content: messageObject.messageHtml, date: formattedTimestamp, identifier: resource.identifier, replyTo: messageObject.replyTo }; + } catch (error) { + console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); + return null; + } + })); + + // Render new messages without duplication + fetchMessages.forEach((message) => { + if (message && !existingIdentifiers.has(message.identifier)) { + let replyHtml = ""; + if (message.replyTo) { + const repliedMessage = fetchMessages.find(m => m && m.identifier === message.replyTo); + if (repliedMessage) { + replyHtml = ` +
+
In reply to: ${repliedMessage.name} ${repliedMessage.date}
+
${repliedMessage.content}
+
+ `; + } + } + + let mostRecentMessage = null; + const isNewMessage = !latestMessageIdentifiers[room] || new Date(message.date) > new Date(latestMessageIdentifiers[room]); + + let attachmentHtml = ""; + if (message.attachments && message.attachments.length > 0) { + for (const attachment of message.attachments) { + if (attachment.mimeType.startsWith('image/')) { + // Display images inline + const url = `/arbitrary/${attachment.service}/${message.name}/${attachment.identifier}`; + attachmentHtml += `
${attachment.filename}
`; + } else { + // Display a button to download other attachments + attachmentHtml += `
+ +
`; + } + } + } + + const messageHTML = ` +
+ ${replyHtml} +
+ ${message.name} + ${message.date} + ${isNewMessage ? 'NEW' : ''} +
+ ${attachmentHtml} +
${message.content}
+ +
+ `; + + // Append new message to the end of the container + messagesContainer.insertAdjacentHTML('beforeend', messageHTML); + // Track the most recent message + if (!mostRecentMessage || new Date(message.timestamp) > new Date(mostRecentMessage.timestamp)) { + mostRecentMessage = message; + } + } + }); + // Update latestMessageIdentifiers for the room + if (mostRecentMessage) { + latestMessageIdentifiers[room] = { + latestIdentifier: mostRecentMessage.identifier, + latestTimestamp: mostRecentMessage.timestamp + }; + } + // Add event listeners to the reply buttons + const replyButtons = document.querySelectorAll(".reply-button"); + + replyButtons.forEach(button => { + button.addEventListener("click", () => { + replyToMessageIdentifier = button.dataset.messageIdentifier; + // Find the message being replied to + const repliedMessage = fetchMessages.find(m => m && m.identifier === replyToMessageIdentifier); + + if (repliedMessage) { + const replyContainer = document.createElement("div"); + replyContainer.className = "reply-container"; + replyContainer.innerHTML = ` +
+ Replying to: ${repliedMessage.content} + +
+ `; + + if (!document.querySelector(".reply-container")) { + const messageInputSection = document.querySelector(".message-input-section"); + + if (messageInputSection) { + messageInputSection.insertBefore(replyContainer, messageInputSection.firstChild); + + // Add a listener for the cancel reply button + document.getElementById("cancel-reply").addEventListener("click", () => { + replyToMessageIdentifier = null; + replyContainer.remove(); + }); + } + } + const messageInputSection = document.querySelector(".message-input-section"); + const editor = document.querySelector(".ql-editor"); + + if (messageInputSection) { + messageInputSection.scrollIntoView({ behavior: 'smooth', block: 'center' }); + } + + if (editor) { + editor.focus(); + } + } + }); + }); + } + } catch (error) { + console.error('Error loading messages from QDN:', error); + } +} + +// Polling function to check for new messages without clearing existing ones +function startPollingForNewMessages() { + setInterval(async () => { + const activeRoom = document.querySelector('.room-title')?.innerText.toLowerCase().split(" ")[0]; + if (activeRoom) { + await loadMessagesFromQDN(activeRoom, currentPage, true); + } + }, 20000); +} + diff --git a/assets/mobirise/css/mbr-additional.css b/assets/mobirise/css/mbr-additional.css new file mode 100644 index 0000000..d3a5057 --- /dev/null +++ b/assets/mobirise/css/mbr-additional.css @@ -0,0 +1,1781 @@ +body { + font-family: Space Grotesk; + background-color: black; +} +.display-1 { + font-family: 'DM Sans', sans-serif; + font-size: 4.4rem; + line-height: 1.1285em; + letter-spacing: .02em; +} +.display-1 > .mbr-iconfont { + font-size: 5.5rem; +} +.display-2 { + font-family: 'DM Sans', sans-serif; + font-size: 2.6rem; + line-height: 1.1666em; + letter-spacing: .02em; +} +.display-2 > .mbr-iconfont { + font-size: 3.25rem; +} +.display-4 { + font-family: 'Space Grotesk', sans-serif; + font-size: 1.25rem; + line-height: 1.33334em; +} +.display-4 > .mbr-iconfont { + font-size: 1.5625rem; +} +.display-5 { + font-family: 'DM Sans', sans-serif; + font-size: 1.5rem; + line-height: 1.2058em; + letter-spacing: .02em; +} +.display-5 > .mbr-iconfont { + font-size: 1.875rem; +} +.display-7 { + font-family: 'DM Sans', sans-serif; + font-size: 1.125rem; + line-height: 1.4em; +} +.display-7 > .mbr-iconfont { + font-size: 1.40625rem; +} +/* ---- Fluid typography for mobile devices ---- */ +/* 1.4 - font scale ratio ( bootstrap == 1.42857 ) */ +/* 100vw - current viewport width */ +/* (48 - 20) 48 == 48rem == 768px, 20 == 20rem == 320px(minimal supported viewport) */ +/* 0.65 - min scale variable, may vary */ +@media (max-width: 992px) { + .display-1 { + font-size: 3.52rem; + } +} +@media (max-width: 768px) { + .display-1 { + font-size: 3.08rem; + font-size: calc( 2.19rem + (4.4 - 2.19) * ((100vw - 20rem) / (48 - 20))); + line-height: calc( 1.1 * (2.19rem + (4.4 - 2.19) * ((100vw - 20rem) / (48 - 20)))); + } + .display-2 { + font-size: 2.08rem; + font-size: calc( 1.56rem + (2.6 - 1.56) * ((100vw - 20rem) / (48 - 20))); + line-height: calc( 1.3 * (1.56rem + (2.6 - 1.56) * ((100vw - 20rem) / (48 - 20)))); + } + .display-4 { + font-size: 1rem; + font-size: calc( 1.0875rem + (1.25 - 1.0875) * ((100vw - 20rem) / (48 - 20))); + line-height: calc( 1.4 * (1.0875rem + (1.25 - 1.0875) * ((100vw - 20rem) / (48 - 20)))); + } + .display-5 { + font-size: 1.2rem; + font-size: calc( 1.175rem + (1.5 - 1.175) * ((100vw - 20rem) / (48 - 20))); + line-height: calc( 1.4 * (1.175rem + (1.5 - 1.175) * ((100vw - 20rem) / (48 - 20)))); + } + .display-7 { + font-size: 0.9rem; + font-size: calc( 1.04375rem + (1.125 - 1.04375) * ((100vw - 20rem) / (48 - 20))); + line-height: calc( 1.4 * (1.04375rem + (1.125 - 1.04375) * ((100vw - 20rem) / (48 - 20)))); + } +} +/* Buttons */ +.btn { + padding: 0.6rem 1.2rem; + border-radius: 22px; +} +.btn-sm { + padding: 0.6rem 1.2rem; + border-radius: 22px; +} +.btn-md { + padding: 0.6rem 1.2rem; + border-radius: 22px; +} +.btn-lg { + padding: 1rem 2.6rem; + border-radius: 22px; +} +.bg-primary { + background-color: #ffffff !important; +} +.bg-success { + background-color: #324c6d !important; +} +.bg-info { + background-color: #000000 !important; +} +.bg-warning { + background-color: #265e98 !important; +} +.bg-danger { + background-color: #b6b6b6 !important; +} +.btn-primary, +.btn-primary:active { + background-color: #ffffff !important; + border-color: #ffffff !important; + color: #808080 !important; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2); +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary.focus, +.btn-primary.active { + color: #545454 !important; + background-color: #d4d4d4 !important; + border-color: #d4d4d4 !important; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.2); +} +.btn-primary.disabled, +.btn-primary:disabled { + color: #808080 !important; + background-color: #d4d4d4 !important; + border-color: #d4d4d4 !important; +} +.btn-secondary, +.btn-secondary:active { + background-color: #a4a2a2 !important; + border-color: #a4a2a2 !important; + color: #ffffff !important; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2); +} +.btn-secondary:hover, +.btn-secondary:focus, +.btn-secondary.focus, +.btn-secondary.active { + color: #ffffff !important; + background-color: #797676 !important; + border-color: #797676 !important; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.2); +} +.btn-secondary.disabled, +.btn-secondary:disabled { + color: #ffffff !important; + background-color: #797676 !important; + border-color: #797676 !important; +} +.btn-info, +.btn-info:active { + background-color: #000000 !important; + border-color: #000000 !important; + color: #ffffff !important; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2); +} +.btn-info:hover, +.btn-info:focus, +.btn-info.focus, +.btn-info.active { + color: #ffffff !important; + background-color: #000000 !important; + border-color: #000000 !important; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.2); +} +.btn-info.disabled, +.btn-info:disabled { + color: #ffffff !important; + background-color: #000000 !important; + border-color: #000000 !important; +} +.btn-success, +.btn-success:active { + background-color: #324c6d !important; + border-color: #324c6d !important; + color: #ffffff !important; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2); +} +.btn-success:hover, +.btn-success:focus, +.btn-success.focus, +.btn-success.active { + color: #ffffff !important; + background-color: #172332 !important; + border-color: #172332 !important; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.2); +} +.btn-success.disabled, +.btn-success:disabled { + color: #ffffff !important; + background-color: #172332 !important; + border-color: #172332 !important; +} +.btn-warning, +.btn-warning:active { + background-color: #265e98 !important; + border-color: #265e98 !important; + color: #ffffff !important; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2); +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning.focus, +.btn-warning.active { + color: #ffffff !important; + background-color: #153353 !important; + border-color: #153353 !important; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.2); +} +.btn-warning.disabled, +.btn-warning:disabled { + color: #ffffff !important; + background-color: #153353 !important; + border-color: #153353 !important; +} +.btn-danger, +.btn-danger:active { + background-color: #b6b6b6 !important; + border-color: #b6b6b6 !important; + color: #ffffff !important; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2); +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger.focus, +.btn-danger.active { + color: #ffffff !important; + background-color: #8b8b8b !important; + border-color: #8b8b8b !important; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.2); +} +.btn-danger.disabled, +.btn-danger:disabled { + color: #ffffff !important; + background-color: #8b8b8b !important; + border-color: #8b8b8b !important; +} +.btn-white, +.btn-white:active { + background-color: #fafafa !important; + border-color: #fafafa !important; + color: #7a7a7a !important; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2); +} +.btn-white:hover, +.btn-white:focus, +.btn-white.focus, +.btn-white.active { + color: #4f4f4f !important; + background-color: #cfcfcf !important; + border-color: #cfcfcf !important; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.2); +} +.btn-white.disabled, +.btn-white:disabled { + color: #7a7a7a !important; + background-color: #cfcfcf !important; + border-color: #cfcfcf !important; +} +.btn-black, +.btn-black:active { + background-color: #232323 !important; + border-color: #232323 !important; + color: #ffffff !important; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2); +} +.btn-black:hover, +.btn-black:focus, +.btn-black.focus, +.btn-black.active { + color: #ffffff !important; + background-color: #000000 !important; + border-color: #000000 !important; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.2); +} +.btn-black.disabled, +.btn-black:disabled { + color: #ffffff !important; + background-color: #000000 !important; + border-color: #000000 !important; +} +.btn-primary-outline, +.btn-primary-outline:active { + background-color: transparent !important; + border-color: transparent; + color: #ffffff; +} +.btn-primary-outline:hover, +.btn-primary-outline:focus, +.btn-primary-outline.focus, +.btn-primary-outline.active { + color: #d4d4d4 !important; + background-color: transparent!important; + border-color: transparent!important; + box-shadow: none!important; +} +.btn-primary-outline.disabled, +.btn-primary-outline:disabled { + color: #808080 !important; + background-color: #ffffff !important; + border-color: #ffffff !important; +} +.btn-secondary-outline, +.btn-secondary-outline:active { + background-color: transparent !important; + border-color: transparent; + color: #a4a2a2; +} +.btn-secondary-outline:hover, +.btn-secondary-outline:focus, +.btn-secondary-outline.focus, +.btn-secondary-outline.active { + color: #797676 !important; + background-color: transparent!important; + border-color: transparent!important; + box-shadow: none!important; +} +.btn-secondary-outline.disabled, +.btn-secondary-outline:disabled { + color: #ffffff !important; + background-color: #a4a2a2 !important; + border-color: #a4a2a2 !important; +} +.btn-info-outline, +.btn-info-outline:active { + background-color: transparent !important; + border-color: transparent; + color: #000000; +} +.btn-info-outline:hover, +.btn-info-outline:focus, +.btn-info-outline.focus, +.btn-info-outline.active { + color: #000000 !important; + background-color: transparent!important; + border-color: transparent!important; + box-shadow: none!important; +} +.btn-info-outline.disabled, +.btn-info-outline:disabled { + color: #ffffff !important; + background-color: #000000 !important; + border-color: #000000 !important; +} +.btn-success-outline, +.btn-success-outline:active { + background-color: transparent !important; + border-color: transparent; + color: #324c6d; +} +.btn-success-outline:hover, +.btn-success-outline:focus, +.btn-success-outline.focus, +.btn-success-outline.active { + color: #172332 !important; + background-color: transparent!important; + border-color: transparent!important; + box-shadow: none!important; +} +.btn-success-outline.disabled, +.btn-success-outline:disabled { + color: #ffffff !important; + background-color: #324c6d !important; + border-color: #324c6d !important; +} +.btn-warning-outline, +.btn-warning-outline:active { + background-color: transparent !important; + border-color: transparent; + color: #265e98; +} +.btn-warning-outline:hover, +.btn-warning-outline:focus, +.btn-warning-outline.focus, +.btn-warning-outline.active { + color: #153353 !important; + background-color: transparent!important; + border-color: transparent!important; + box-shadow: none!important; +} +.btn-warning-outline.disabled, +.btn-warning-outline:disabled { + color: #ffffff !important; + background-color: #265e98 !important; + border-color: #265e98 !important; +} +.btn-danger-outline, +.btn-danger-outline:active { + background-color: transparent !important; + border-color: transparent; + color: #b6b6b6; +} +.btn-danger-outline:hover, +.btn-danger-outline:focus, +.btn-danger-outline.focus, +.btn-danger-outline.active { + color: #8b8b8b !important; + background-color: transparent!important; + border-color: transparent!important; + box-shadow: none!important; +} +.btn-danger-outline.disabled, +.btn-danger-outline:disabled { + color: #ffffff !important; + background-color: #b6b6b6 !important; + border-color: #b6b6b6 !important; +} +.btn-black-outline, +.btn-black-outline:active { + background-color: transparent !important; + border-color: transparent; + color: #232323; +} +.btn-black-outline:hover, +.btn-black-outline:focus, +.btn-black-outline.focus, +.btn-black-outline.active { + color: #000000 !important; + background-color: transparent!important; + border-color: transparent!important; + box-shadow: none!important; +} +.btn-black-outline.disabled, +.btn-black-outline:disabled { + color: #ffffff !important; + background-color: #232323 !important; + border-color: #232323 !important; +} +.btn-white-outline, +.btn-white-outline:active { + background-color: transparent !important; + border-color: transparent; + color: #fafafa; +} +.btn-white-outline:hover, +.btn-white-outline:focus, +.btn-white-outline.focus, +.btn-white-outline.active { + color: #cfcfcf !important; + background-color: transparent!important; + border-color: transparent!important; + box-shadow: none!important; +} +.btn-white-outline.disabled, +.btn-white-outline:disabled { + color: #7a7a7a !important; + background-color: #fafafa !important; + border-color: #fafafa !important; +} +.text-primary { + color: #ffffff !important; +} +.text-secondary { + color: #a4a2a2 !important; +} +.text-success { + color: #324c6d !important; +} +.text-info { + color: #000000 !important; +} +.text-warning { + color: #265e98 !important; +} +.text-danger { + color: #b6b6b6 !important; +} +.text-white { + color: #fafafa !important; +} +.text-black { + color: #232323 !important; +} +a.text-primary:hover, +a.text-primary:focus, +a.text-primary.active { + color: #cccccc !important; +} +a.text-secondary:hover, +a.text-secondary:focus, +a.text-secondary.active { + color: #716f6f !important; +} +a.text-success:hover, +a.text-success:focus, +a.text-success.active { + color: #121b27 !important; +} +a.text-info:hover, +a.text-info:focus, +a.text-info.active { + color: #000000 !important; +} +a.text-warning:hover, +a.text-warning:focus, +a.text-warning.active { + color: #122c46 !important; +} +a.text-danger:hover, +a.text-danger:focus, +a.text-danger.active { + color: #838383 !important; +} +a.text-white:hover, +a.text-white:focus, +a.text-white.active { + color: #c7c7c7 !important; +} +a.text-black:hover, +a.text-black:focus, +a.text-black.active { + color: #000000 !important; +} +a[class*="text-"]:not(.nav-link):not(.dropdown-item):not([role]):not(.navbar-caption) { + position: relative; + background-image: transparent; + background-size: 10000px 2px; + background-repeat: no-repeat; + background-position: 0px 1.2em; + background-position: -10000px 1.2em; +} +a[class*="text-"]:not(.nav-link):not(.dropdown-item):not([role]):not(.navbar-caption):hover { + transition: background-position 2s ease-in-out; + background-image: linear-gradient(currentColor 50%, currentColor 50%); + background-position: 0px 1.2em; +} +.nav-tabs .nav-link.active { + color: #ffffff; +} +.nav-tabs .nav-link:not(.active) { + color: #232323; +} +.alert-success { + background-color: #70c770; +} +.alert-info { + background-color: #000000; +} +.alert-warning { + background-color: #265e98; +} +.alert-danger { + background-color: #b6b6b6; +} +.mbr-section-btn a.btn:not(.btn-form) { + border-radius: 100px; +} +.mbr-gallery-filter li a { + border-radius: 100px !important; +} +.mbr-gallery-filter li.active .btn { + background-color: #ffffff; + border-color: #ffffff; + color: #8c8c8c; +} +.mbr-gallery-filter li.active .btn:focus { + box-shadow: none; +} +.nav-tabs .nav-link { + border-radius: 100px !important; +} +a, +a:hover { + color: #ffffff; +} +.mbr-plan-header.bg-primary .mbr-plan-subtitle, +.mbr-plan-header.bg-primary .mbr-plan-price-desc { + color: #ffffff; +} +.mbr-plan-header.bg-success .mbr-plan-subtitle, +.mbr-plan-header.bg-success .mbr-plan-price-desc { + color: #668ab9; +} +.mbr-plan-header.bg-info .mbr-plan-subtitle, +.mbr-plan-header.bg-info .mbr-plan-price-desc { + color: #b3b3b3; +} +.mbr-plan-header.bg-warning .mbr-plan-subtitle, +.mbr-plan-header.bg-warning .mbr-plan-price-desc { + color: #659ed9; +} +.mbr-plan-header.bg-danger .mbr-plan-subtitle, +.mbr-plan-header.bg-danger .mbr-plan-price-desc { + color: #f6f6f6; +} +/* Scroll to top button*/ +.scrollToTop_wraper { + display: none; +} +.form-control { + font-family: 'Space Grotesk', sans-serif; + font-size: 1.25rem; + line-height: 1.33334em; + font-weight: 400; +} +.form-control > .mbr-iconfont { + font-size: 1.5625rem; +} +.form-control:hover, +.form-control:focus { + box-shadow: rgba(0, 0, 0, 0.07) 0px 1px 1px 0px, rgba(0, 0, 0, 0.07) 0px 1px 3px 0px, rgba(0, 0, 0, 0.03) 0px 0px 0px 1px; + border-color: #ffffff !important; +} +.form-control:-webkit-input-placeholder { + font-family: 'Space Grotesk', sans-serif; + font-size: 1.25rem; + line-height: 1.33334em; + font-weight: 400; +} +.form-control:-webkit-input-placeholder > .mbr-iconfont { + font-size: 1.5625rem; +} +blockquote { + border-color: #ffffff; +} +/* Forms */ +.mbr-form .input-group-btn a.btn { + border-radius: 100px !important; +} +.mbr-form .input-group-btn a.btn:hover { + box-shadow: 0 10px 40px 0 rgba(0, 0, 0, 0.2); +} +.mbr-form .input-group-btn button[type="submit"] { + border-radius: 100px !important; + padding: 1rem 3rem; +} +.mbr-form .input-group-btn button[type="submit"]:hover { + box-shadow: 0 10px 40px 0 rgba(0, 0, 0, 0.2); +} +.jq-selectbox li:hover, +.jq-selectbox li.selected { + background-color: #ffffff; + color: #000000; +} +.jq-number__spin { + transition: 0.25s ease; +} +.jq-number__spin:hover { + border-color: #ffffff; +} +.jq-selectbox .jq-selectbox__trigger-arrow, +.jq-number__spin.minus:after, +.jq-number__spin.plus:after { + transition: 0.4s; + border-top-color: #353535; + border-bottom-color: #353535; +} +.jq-selectbox:hover .jq-selectbox__trigger-arrow, +.jq-number__spin.minus:hover:after, +.jq-number__spin.plus:hover:after { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} +.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_default, +.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_current, +.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div.xdsoft_current { + color: #000000 !important; + background-color: #ffffff !important; + box-shadow: none !important; +} +.xdsoft_datetimepicker .xdsoft_calendar td:hover, +.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div:hover { + color: #000000 !important; + background: #a4a2a2 !important; + box-shadow: none !important; +} +.lazy-bg { + background-image: none !important; +} +.lazy-placeholder:not(section), +.lazy-none { + display: block; + position: relative; + padding-bottom: 56.25%; + width: 100%; + height: auto; +} +iframe.lazy-placeholder, +.lazy-placeholder:after { + content: ''; + position: absolute; + width: 200px; + height: 200px; + background: transparent no-repeat center; + background-size: contain; + top: 50%; + left: 50%; + transform: translateX(-50%) translateY(-50%); + background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg width='32' height='32' viewBox='0 0 64 64' xmlns='http://www.w3.org/2000/svg' stroke='%23ffffff' %3e%3cg fill='none' fill-rule='evenodd'%3e%3cg transform='translate(16 16)' stroke-width='2'%3e%3ccircle stroke-opacity='.5' cx='16' cy='16' r='16'/%3e%3cpath d='M32 16c0-9.94-8.06-16-16-16'%3e%3canimateTransform attributeName='transform' type='rotate' from='0 16 16' to='360 16 16' dur='1s' repeatCount='indefinite'/%3e%3c/path%3e%3c/g%3e%3c/g%3e%3c/svg%3e"); +} +section.lazy-placeholder:after { + opacity: 0.5; +} +body { + overflow-x: hidden; +} +a { + transition: color 0.6s; +} +.mbr-section-btn .btn, +.mbr-section-btn-main .btn { + height: 44px; + padding: 12px 26px; + box-shadow: none; + background-image: linear-gradient(99deg, rgba(255, 255, 255, 0) 30%, #ffffff 100%), radial-gradient(circle at 50% 50%, #ffffff 0, rgba(255, 255, 255, 0) 70%); + background-size: 100% 100%,90% 100%; + background-position: 0 0, -1000% 0; + background-repeat: no-repeat; + transition: all 0.6s ease-out; + color: #000000 !important; + border: none; + font-weight: 400; +} +.mbr-section-btn .btn:hover, +.mbr-section-btn-main .btn:hover { + background-position: 0 0,150% 0; +} +.mbr-section-btn .btn:hover .mbr-iconfont, +.mbr-section-btn-main .btn:hover .mbr-iconfont { + margin-left: 15px; + margin-right: 3px; +} +.mbr-section-btn .btn .mbr-iconfont, +.mbr-section-btn-main .btn .mbr-iconfont { + margin-left: 18px; + font-size: 16px; + transition: all 0.6s ease-out; +} +.cid-ttRnktJ11Q .navbar-dropdown { + background-color: #000000 !important; + padding: 0; +} +.cid-ttRnktJ11Q .navbar.navbar-expand-lg .dropdown .dropdown-menu { + background-color: #000000 !important; + background: #000000; +} +.cid-ttRnktJ11Q .navbar.navbar-expand-lg .dropdown .dropdown-menu .dropdown-submenu { + margin: 0; + left: 100%; +} +@media (max-width: 991px) { + .cid-ttRnktJ11Q .menu_box .navbar.opened, + .cid-ttRnktJ11Q .menu_box .navbar-collapse { + background-color: #000000 !important; + transition: all 0s ease 0s; + } +} +.cid-ttRnktJ11Q .navbar-dropdown { + position: relative !important; +} +.cid-ttRnktJ11Q .icons-menu-main { + display: flex; + flex-wrap: wrap; + max-width: 150px; +} +@media (max-width: 991px) { + .cid-ttRnktJ11Q .icons-menu-main { + max-width: 100%; + margin: 1rem 0 1rem 1rem; + } +} +@media (max-width: 991px) { + .cid-ttRnktJ11Q .mbr-section-btn-main { + margin-top: 1rem; + } +} +.cid-ttRnktJ11Q .btn { + min-height: auto; + box-shadow: none; + margin-top: 0; +} +.cid-ttRnktJ11Q .btn:hover { + box-shadow: none; +} +@media (min-width: 992px) { + .cid-ttRnktJ11Q .offcanvas { + padding: 12rem 80px 0; + width: 30%; + background-color: #b6b6b6; + } + .cid-ttRnktJ11Q .offcanvas_image img { + width: auto; + object-fit: cover; + display: inline-block; + } + .cid-ttRnktJ11Q .offcanvas-header { + position: relative; + padding: 0; + } + .cid-ttRnktJ11Q .offcanvas-header .btn-close { + position: absolute; + top: -70px; + right: 0; + width: 35px; + height: 30px; + } + .cid-ttRnktJ11Q .offcanvas-body { + text-align: center; + padding: 0; + } + .cid-ttRnktJ11Q .offcanvas-body .mbr-text, + .cid-ttRnktJ11Q .offcanvas-body .mbr-section-subtitle { + margin-top: 14px; + } + .cid-ttRnktJ11Q .offcanvas-body .offcanvas_contact { + margin: 35px 0; + } + .cid-ttRnktJ11Q .offcanvas_box button.btn_offcanvas { + outline: none; + width: 40px; + height: 40px; + cursor: pointer; + transition: all 0.2s; + position: relative; + align-self: center; + } + .cid-ttRnktJ11Q .offcanvas_box button.btn_offcanvas .hamburger span { + position: absolute; + right: 0; + width: 40px; + height: 2px; + border-right: 5px; + background-color: #ffffff; + } + .cid-ttRnktJ11Q .offcanvas_box button.btn_offcanvas .hamburger span:nth-child(1) { + top: 18px; + transition: all 0.2s; + } + .cid-ttRnktJ11Q .offcanvas_box button.btn_offcanvas .hamburger span:nth-child(2) { + top: 25px; + transition: all 0.2s; + } + .cid-ttRnktJ11Q .offcanvas_box button.btn_offcanvas:hover .hamburger span { + width: 36px; + } + .cid-ttRnktJ11Q .offcanvas_box button.btn_offcanvas:hover .hamburger span:nth-child(2) { + width: 33px; + transition-delay: 0.2s; + } + .cid-ttRnktJ11Q ul.navbar-nav { + padding-bottom: 1.5rem; + } + .cid-ttRnktJ11Q .dropdown-menu .dropdown-toggle[data-toggle="dropdown-submenu"]::after, + .cid-ttRnktJ11Q .link.dropdown-toggle::after { + display: inline-block; + width: 7px; + height: 7px; + margin-left: .5rem; + margin-bottom: 2px; + content: ""; + border: 2px solid; + border-left: none; + border-top: none; + transform: rotate(-45deg); + } + .cid-ttRnktJ11Q .link.dropdown-toggle::after { + padding: 0 !important; + transform: rotate(45deg); + } + .cid-ttRnktJ11Q li.nav-item { + position: relative; + display: inline-block; + padding: 1px 7px !important; + vertical-align: middle; + line-height: 2em !important; + font-weight: 600 !important; + text-decoration: none; + letter-spacing: 0 !important; + z-index: 1; + } + .cid-ttRnktJ11Q .lg_brand { + margin: 0 1rem; + } +} +.cid-ttRnktJ11Q .nav-item { + margin: 4px 15px; +} +@media (min-width: 1200px) { + .cid-ttRnktJ11Q .nav-item { + margin: 4px 20px; + } +} +@media (max-width: 991px) { + .cid-ttRnktJ11Q .nav-item { + margin: 0 !important; + } +} +.cid-ttRnktJ11Q .dropdown-menu { + border-radius: 0; + box-shadow: none; + text-align: left; +} +@media (min-width: 992px) { + .cid-ttRnktJ11Q .dropdown-menu { + padding: 18px 34px 22px; + min-width: 250px; + top: auto !important; + left: -40px !important; + } + .cid-ttRnktJ11Q .dropdown-menu.dropdown-submenu { + left: 215px !important; + top: -45% !important; + } +} +@media (max-width: 991px) { + .cid-ttRnktJ11Q .dropdown-menu .dropdown-toggle[data-toggle="dropdown-submenu"]::after, + .cid-ttRnktJ11Q .link.dropdown-toggle::after { + display: inline-block; + width: 7px; + height: 7px; + margin-left: .5rem; + margin-bottom: 2px; + content: ""; + border: 2px solid; + border-left: none; + border-top: none; + transform: rotate(-45deg); + right: 15px; + position: absolute; + margin-top: -2px; + } + .cid-ttRnktJ11Q .show.dropdown-toggle[aria-expanded="true"]::after { + transform: rotate(45deg); + margin-top: -4px; + } + .cid-ttRnktJ11Q .offcanvas_box { + display: none; + } +} +.cid-ttRnktJ11Q .dropdown-item { + border: none; + font-weight: 400 !important; +} +.cid-ttRnktJ11Q .nav-dropdown .link { + font-weight: 400 !important; + padding: 0 !important; + margin: 0 !important; +} +.cid-ttRnktJ11Q .nav-dropdown .link.dropdown-toggle::after { + margin-left: 0.5rem; + margin-top: 0; +} +.cid-ttRnktJ11Q .container { + display: flex; + margin: auto; +} +.cid-ttRnktJ11Q .iconfont-wrapper { + color: #ffffff; + font-size: 17px; + margin-right: 10px; + margin-bottom: 5px; + width: 25px; + height: 25px; + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; + transition: all 0.2s ease-in-out; +} +.cid-ttRnktJ11Q .iconfont-wrapper:last-child { + margin-right: 0; +} +.cid-ttRnktJ11Q .iconfont-wrapper:hover { + opacity: .5; +} +.cid-ttRnktJ11Q .navbar-caption { + color: #ffffff; +} +.cid-ttRnktJ11Q .navbar-nav { + margin: 0 1rem; +} +@media (min-width: 992px) { + .cid-ttRnktJ11Q .navbar-nav { + margin: 0; + } +} +.cid-ttRnktJ11Q .dropdown-menu, +.cid-ttRnktJ11Q .navbar.opened { + background-color: false !important; +} +.cid-ttRnktJ11Q .nav-item:focus, +.cid-ttRnktJ11Q .nav-link:focus { + outline: none; +} +.cid-ttRnktJ11Q .dropdown .dropdown-menu .dropdown-item { + width: auto; + transition: all 0.25s ease-in-out; +} +.cid-ttRnktJ11Q .dropdown .dropdown-menu .dropdown-item::after { + right: 0.5rem; +} +.cid-ttRnktJ11Q .dropdown .dropdown-menu .dropdown-item .mbr-iconfont { + margin-right: 0.5rem; + vertical-align: sub; +} +.cid-ttRnktJ11Q .dropdown .dropdown-menu .dropdown-item .mbr-iconfont:before { + display: inline-block; + transform: scale(1, 1); + transition: all 0.25s ease-in-out; +} +.cid-ttRnktJ11Q .collapsed .dropdown-menu .dropdown-item:before { + display: none; +} +.cid-ttRnktJ11Q .collapsed .dropdown .dropdown-menu .dropdown-item { + padding: 0.235em 1.5em 0.235em 1.5em !important; + transition: none; + margin: 0 !important; +} +.cid-ttRnktJ11Q .navbar { + min-height: 70px; + padding: 20px 0; + transition: all 0.3s; + border-bottom-width: 0; +} +@media (max-width: 992px) { + .cid-ttRnktJ11Q .navbar { + min-height: 30px; + max-height: none; + } +} +.cid-ttRnktJ11Q .navbar.opened { + transition: all 0.3s; +} +.cid-ttRnktJ11Q .navbar .dropdown-item { + padding: 0; + margin: 8px 0; +} +.cid-ttRnktJ11Q .navbar .navbar-logo img { + max-width: 130px; + max-height: 130px; + object-fit: contain; +} +.cid-ttRnktJ11Q .navbar .navbar-collapse { + justify-content: space-between; + z-index: 1; +} +.cid-ttRnktJ11Q .navbar.collapsed { + justify-content: center; +} +.cid-ttRnktJ11Q .navbar.collapsed .nav-item .nav-link::before { + display: none; +} +.cid-ttRnktJ11Q .navbar.collapsed.opened .dropdown-menu { + top: 0; +} +.cid-ttRnktJ11Q .navbar.collapsed .dropdown-menu .dropdown-submenu { + left: 0 !important; +} +.cid-ttRnktJ11Q .navbar.collapsed .dropdown-menu .dropdown-item:after { + right: auto; +} +.cid-ttRnktJ11Q .navbar.collapsed ul.navbar-nav li { + margin: auto; +} +.cid-ttRnktJ11Q .navbar.collapsed .dropdown-menu .dropdown-item { + padding: 0.25rem 1.5rem; + text-align: left; +} +.cid-ttRnktJ11Q .navbar.collapsed .icons-menu { + padding: 0; +} +@media (max-width: 991px) { + .cid-ttRnktJ11Q .navbar .nav-item { + padding: .5rem 0; + } + .cid-ttRnktJ11Q .navbar .navbar-collapse { + padding: 34px 0; + border-radius: 25px; + } + .cid-ttRnktJ11Q .navbar .nav-item .nav-link::before { + display: none; + } + .cid-ttRnktJ11Q .navbar.opened .dropdown-menu { + top: 0; + } + .cid-ttRnktJ11Q .navbar .dropdown-menu { + padding: 6px 0 6px 15px; + } + .cid-ttRnktJ11Q .navbar .dropdown-menu .dropdown-submenu { + left: 0 !important; + } + .cid-ttRnktJ11Q .navbar .dropdown-menu .dropdown-item:after { + right: auto; + margin-top: -0.4rem; + } + .cid-ttRnktJ11Q .navbar .navbar-logo img { + height: 3rem !important; + } + .cid-ttRnktJ11Q .navbar ul.navbar-nav { + overflow: hidden; + } + .cid-ttRnktJ11Q .navbar ul.navbar-nav li { + margin: 0; + } + .cid-ttRnktJ11Q .navbar .dropdown-menu .dropdown-item { + padding: 0 !important; + margin: 0; + margin-top: 8px; + text-align: left; + } + .cid-ttRnktJ11Q .navbar .navbar-brand { + flex-shrink: initial; + flex-basis: auto; + word-break: break-word; + padding-right: 2rem; + } + .cid-ttRnktJ11Q .navbar .navbar-toggler { + flex-basis: auto; + } + .cid-ttRnktJ11Q .navbar .icons-menu { + padding: 0; + } +} +.cid-ttRnktJ11Q .navbar.navbar-short { + min-height: 60px; +} +.cid-ttRnktJ11Q .navbar.navbar-short .navbar-logo img { + height: 2.5rem !important; +} +.cid-ttRnktJ11Q .navbar.navbar-short .navbar-brand { + min-height: 60px; + padding: 0; +} +.cid-ttRnktJ11Q .navbar-brand { + min-height: 70px; + flex-shrink: 0; + align-items: center; + margin-right: 0; + padding: 10px 0; + transition: all 0.3s; + word-break: break-word; + z-index: 1; +} +.cid-ttRnktJ11Q .navbar-brand .navbar-caption { + line-height: inherit !important; +} +.cid-ttRnktJ11Q .navbar-brand .navbar-logo a { + outline: none; +} +.cid-ttRnktJ11Q .dropdown-item.active, +.cid-ttRnktJ11Q .dropdown-item:active { + background-color: transparent; +} +.cid-ttRnktJ11Q .navbar-expand-lg .navbar-nav .nav-link { + padding: 0; +} +.cid-ttRnktJ11Q .nav-dropdown .link.dropdown-toggle { + margin-right: 1.667em; +} +.cid-ttRnktJ11Q .nav-dropdown .link.dropdown-toggle[aria-expanded="true"] { + margin-right: 0; + padding: 0.667em 1.667em; +} +.cid-ttRnktJ11Q .navbar .dropdown.open > .dropdown-menu { + display: block; +} +.cid-ttRnktJ11Q ul.navbar-nav { + flex-wrap: wrap; + padding: 0; +} +.cid-ttRnktJ11Q .navbar-buttons { + text-align: center; + min-width: 170px; +} +.cid-ttRnktJ11Q button.navbar-toggler { + outline: none; + width: 48px; + height: 48px; + border-radius: 50%; + cursor: pointer; + transition: all 0.2s; + position: relative; + align-self: center; + color: #000000; + background: #000000; +} +.cid-ttRnktJ11Q button.navbar-toggler .hamburger span { + position: absolute; + right: 10px; + margin-top: 14px; + width: 26px; + height: 2px; + border-right: 5px; + background-color: #ffffff; +} +.cid-ttRnktJ11Q button.navbar-toggler .hamburger span:nth-child(1) { + top: 0; + transition: all 0.2s; +} +.cid-ttRnktJ11Q button.navbar-toggler .hamburger span:nth-child(2) { + top: 8px; + transition: all 0.15s; +} +.cid-ttRnktJ11Q button.navbar-toggler .hamburger span:nth-child(3) { + top: 8px; + transition: all 0.15s; +} +.cid-ttRnktJ11Q button.navbar-toggler .hamburger span:nth-child(4) { + top: 16px; + transition: all 0.2s; +} +.cid-ttRnktJ11Q nav.opened .hamburger span:nth-child(1) { + top: 8px; + width: 0; + opacity: 0; + right: 50%; + transition: all 0.2s; +} +.cid-ttRnktJ11Q nav.opened .hamburger span:nth-child(2) { + transform: rotate(45deg); + transition: all 0.25s; +} +.cid-ttRnktJ11Q nav.opened .hamburger span:nth-child(3) { + transform: rotate(-45deg); + transition: all 0.25s; +} +.cid-ttRnktJ11Q nav.opened .hamburger span:nth-child(4) { + top: 8px; + width: 0; + opacity: 0; + right: 50%; + transition: all 0.2s; +} +.cid-ttRnktJ11Q a.nav-link { + display: flex; + align-items: center; + justify-content: flex-start; +} +.cid-ttRnktJ11Q .icons-menu { + flex-wrap: nowrap; + display: flex; + justify-content: center; + padding: 0; + text-align: center; + margin-bottom: 35px; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .cid-ttRnktJ11Q .navbar { + height: 70px; + } + .cid-ttRnktJ11Q .navbar.opened { + height: auto; + } + .cid-ttRnktJ11Q .nav-item .nav-link:hover::before { + width: 175%; + max-width: calc(100% + 2rem); + left: -1rem; + } +} +.cid-ttRnktJ11Q .navbar-dropdown .navbar-logo { + margin-right: 15px; +} +@media (min-width: 768px) { + .cid-ttRnktJ11Q .container-fluid { + padding-left: 30px; + padding-right: 30px; + } +} +.cid-ttRnktJ11Q .mbr-section-btn-main { + padding-top: 5px; +} +.cid-ttRnktJ11Q .mbr-section-btn-main .btn { + margin: 0 4px 4px 4px; +} +.cid-ttRnktJ11Q .navbar-caption:hover { + color: #ffffff; +} +@media (min-width: 992px) { + .cid-ttRnktJ11Q .dropdown-menu.dropdown-submenu { + left: 175px !important; + top: -45% !important; + } +} +.cid-ttRnktJ11Q .mbr-section-btn .btn, +.cid-ttRnktJ11Q .mbr-section-btn-main .btn { + background-image: linear-gradient(99deg, rgba(255, 255, 255, 0) 30%, #ffffff 100%), radial-gradient(circle at 50% 50%, #ffffff 0, rgba(255, 255, 255, 0) 70%); + color: #324c6d !important; +} +.cid-ttRnktJ11Q .mbr-section-subtitle { + color: #000000; +} +.cid-ttRnktJ11Q .mbr-text { + color: #000000; + text-align: center; +} +.cid-ttRnktJ11Q .text_widget { + color: #000000; +} +.cid-ttRnktJ11Q .mbr-section-subtitle, +.cid-ttRnktJ11Q .text_widget, +.cid-ttRnktJ11Q .mbr-section-btn { + text-align: center; +} +.cid-ttRnktJ11Q a[class*="text-"]:not(.nav-link):not(.dropdown-item):not([role]):not(.navbar-caption):hover { + background-image: none; +} +.cid-ttRnlSkg2R { + background-image: url("../../../assets/images/qcloud-4-1920x1080.png"); +} +.cid-ttRnlSkg2R .mbr-fallback-image.disabled { + display: none; +} +.cid-ttRnlSkg2R .mbr-fallback-image { + display: block; + background-size: cover; + background-position: center center; + width: 100%; + height: 100%; + position: absolute; + top: 0; +} +.cid-ttRnlSkg2R .container-fluid { + margin: 0; + padding: 0 60px; +} +@media (max-width: 992px) { + .cid-ttRnlSkg2R .container-fluid { + padding: 0 25px; + } +} +.cid-ttRnlSkg2R .container-fluid .row { + padding: 0; +} +.cid-ttRnlSkg2R .title-wrapper { + padding-top: 35%; +} +@media (max-width: 992px) { + .cid-ttRnlSkg2R .title-wrapper { + padding-top: 0; + } +} +.cid-ttRnlSkg2R .title-wrapper .mbr-section-title { + margin-bottom: 48px; +} +.cid-ttRnlSkg2R .title-wrapper .mbr-text { + margin-bottom: 48px; +} +.cid-ttRnlSkg2R .title-wrapper .mbr-section-btn .btn { + background-image: linear-gradient(99deg, rgba(255, 255, 255, 0) 30%, #ffffff 100%), radial-gradient(circle at 50% 50%, #ffffff 0, rgba(255, 255, 255, 0) 70%); + color: #000000 !important; +} +.cid-ttRnlSkg2R .mbr-section-title { + color: #ffffff; +} +.cid-ttRnlSkg2R .mbr-text { + color: #b6b6b6; +} +.cid-ttRnlSkg2R .mbr-section-title, +.cid-ttRnlSkg2R .mbr-section-btn { + text-align: left; +} +.cid-ttRnAijqXt { + padding-top: 5rem; + padding-bottom: 5rem; + background-color: #000000; +} +.cid-ttRnAijqXt .mbr-fallback-image.disabled { + display: none; +} +.cid-ttRnAijqXt .mbr-fallback-image { + display: block; + background-size: cover; + background-position: center center; + width: 100%; + height: 100%; + position: absolute; + top: 0; +} +.cid-ttRnAijqXt .container-fluid { + margin: 0; + padding: 0 51px; +} +@media (max-width: 992px) { + .cid-ttRnAijqXt .container-fluid { + padding: 0 12px; + } +} +.cid-ttRnAijqXt .container-fluid .row { + padding: 0; +} +.cid-ttRnAijqXt .row { + justify-content: center; +} +.cid-ttRnAijqXt .item { + position: relative; + margin-bottom: 25px; + padding: 0 25px; +} +.cid-ttRnAijqXt .item .item-link { + width: 100%; + height: 100%; +} +.cid-ttRnAijqXt .item .item-link .item-wrapper { + position: relative; + display: flex; + justify-content: center; + align-items: center; + height: 300px; + overflow: hidden; +} +.cid-ttRnAijqXt .item .item-link .item-wrapper:hover img { + transform: scale(1.03); +} +.cid-ttRnAijqXt .item .item-link .item-wrapper img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; + transform: scale(1); + transition: all 0.3s ease-out; +} +.cid-ttRnAijqXt .item .item-link .item-wrapper::before { + content: ''; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background-color: #000000; + opacity: .5; + transition: all 0.3s ease-out; + z-index: 1; + pointer-events: none; +} +.cid-ttRnAijqXt .item .item-link .item-wrapper .item-content { + position: relative; + z-index: 1; +} +.cid-ttRnAijqXt .item .item-link .item-wrapper .item-content .card-title { + margin-bottom: 0; + position: relative; +} +.cid-ttRnAijqXt .card-title { + color: #ffffff; +} +.cid-utzh0dnVQB { + padding-top: 5rem; + padding-bottom: 5rem; + background-color: #000000; +} +.cid-utzh0dnVQB .mbr-fallback-image.disabled { + display: none; +} +.cid-utzh0dnVQB .mbr-fallback-image { + display: block; + background-size: cover; + background-position: center center; + width: 100%; + height: 100%; + position: absolute; + top: 0; +} +@media (max-width: 992px) { + .cid-utzh0dnVQB .row { + padding: 0 13px; + } +} +.cid-utzh0dnVQB .row { + justify-content: center; +} +@media (max-width: 992px) { + .cid-utzh0dnVQB .card-wrapper { + margin-bottom: 55px; + } +} +.cid-utzh0dnVQB .card-wrapper .icon-wrapper { + margin-bottom: 18px; + justify-content: center; + align: center; +} +.cid-utzh0dnVQB .card-wrapper .icon-wrapper .mbr-iconfont { + display: inline; + font-size: 82px; + width: auto; + color: #324c6d; +} +.cid-utzh0dnVQB .card-wrapper .mbr-section-title { + margin-bottom: 18px; +} +.cid-utzh0dnVQB .card-wrapper .mbr-text { + margin-bottom: 0; +} +.cid-utzh0dnVQB .mbr-section-title { + color: #ffffff; +} +.cid-utzh0dnVQB .mbr-text { + color: #b6b6b6; + text-align: center; +} +.cid-utzh0dnVQB .mbr-section-title, +.cid-utzh0dnVQB .icon-wrapper { + text-align: center; +} +.cid-uu3bTy9Zr1 { + padding-top: 0rem; + padding-bottom: 0rem; + background-color: #000000; +} +.cid-uu3bTy9Zr1 .mbr-fallback-image.disabled { + display: none; +} +.cid-uu3bTy9Zr1 .mbr-fallback-image { + display: block; + background-size: cover; + background-position: center center; + width: 100%; + height: 100%; + position: absolute; + top: 0; +} +.cid-uu3bTy9Zr1 .container-fluid { + margin: 0; + padding: 0 16px; +} +.cid-uu3bTy9Zr1 .container-fluid .row { + padding: 0; +} +.cid-uu3bTy9Zr1 .row { + justify-content: center; +} +.cid-uu3bTy9Zr1 .card { + padding: 0; + border-top: 1px solid #282828; + border-bottom: 1px solid #282828; + border-radius: 0; +} +.cid-uu3bTy9Zr1 .title-wrapper { + padding: 14px 0 18px; + white-space: nowrap; + overflow: hidden; +} +.cid-uu3bTy9Zr1 .title-wrapper:last-child { + padding: 18px 14px; + border-top: 1px solid #282828; +} +.cid-uu3bTy9Zr1 .title-wrapper .mbr-section-title { + margin-bottom: 0; +} +.cid-uu3bTy9Zr1 .mbr-section-title { + color: #ffffff; + text-align: center; +} +.cid-uu3bTy9Zr1 .mbr-title { + color: #ffffff; + text-align: right; +} +.cid-uufI05uMCB { + padding-top: 5rem; + padding-bottom: 5rem; + background-color: #000000; +} +.cid-uufI05uMCB .mbr-fallback-image.disabled { + display: none; +} +.cid-uufI05uMCB .mbr-fallback-image { + display: block; + background-size: cover; + background-position: center center; + width: 100%; + height: 100%; + position: absolute; + top: 0; +} +@media (max-width: 992px) { + .cid-uufI05uMCB .row { + padding: 0 13px; + } +} +.cid-uufI05uMCB .row { + justify-content: center; +} +@media (max-width: 992px) { + .cid-uufI05uMCB .card-wrapper { + margin-bottom: 55px; + } +} +.cid-uufI05uMCB .card-wrapper .icon-wrapper { + margin-bottom: 18px; +} +.cid-uufI05uMCB .card-wrapper .icon-wrapper .mbr-iconfont { + display: inline; + font-size: 82px; + width: auto; + color: #616161; +} +.cid-uufI05uMCB .card-wrapper .mbr-section-title { + margin-bottom: 18px; +} +.cid-uufI05uMCB .card-wrapper .mbr-text { + margin-bottom: 0; +} +.cid-uufI05uMCB .mbr-section-title { + color: #ffffff; +} +.cid-uufI05uMCB .mbr-text { + color: #b6b6b6; + text-align: center; +} +.cid-uufI05uMCB .mbr-section-title, +.cid-uufI05uMCB .icon-wrapper { + text-align: center; +} +.cid-uufIRKtXOO { + padding-top: 5rem; + padding-bottom: 5rem; + background-color: #000000; +} +.cid-uufIRKtXOO .mbr-fallback-image.disabled { + display: none; +} +.cid-uufIRKtXOO .mbr-fallback-image { + display: block; + background-size: cover; + background-position: center center; + width: 100%; + height: 100%; + position: absolute; + top: 0; +} +@media (max-width: 992px) { + .cid-uufIRKtXOO .row { + padding: 0 13px; + } +} +.cid-uufIRKtXOO .row { + justify-content: center; +} +.cid-uufIRKtXOO .card { + display: flex; + flex-direction: column; + justify-content: center; +} +.cid-uufIRKtXOO .title-wrapper { + padding: 30px 54px 30px 0; +} +@media (max-width: 992px) { + .cid-uufIRKtXOO .title-wrapper { + padding: 0 0 40px; + } +} +.cid-uufIRKtXOO .title-wrapper .mbr-section-title { + margin-bottom: 0; +} +.cid-uufIRKtXOO .text-wrapper { + padding: 30px 0 30px 74px; + border-left: 1px solid #282828; +} +@media (max-width: 992px) { + .cid-uufIRKtXOO .text-wrapper { + padding: 40px 0 0; + border-left: none; + border-top: 1px solid #282828; + } +} +.cid-uufIRKtXOO .text-wrapper .mbr-text { + margin-bottom: 0; +} +.cid-uufIRKtXOO .mbr-section-title { + color: #ffffff; +} +.cid-uufIRKtXOO .mbr-text { + color: #b6b6b6; +} +.cid-uhGd4SVHZK { + padding-top: 0rem; + padding-bottom: 0rem; + background-color: #000000; +} +.cid-uhGd4SVHZK .mbr-fallback-image.disabled { + display: none; +} +.cid-uhGd4SVHZK .mbr-fallback-image { + display: block; + background-size: cover; + background-position: center center; + width: 100%; + height: 100%; + position: absolute; + top: 0; +} +.cid-uhGd4SVHZK .container-fluid { + padding: 0 50px; +} +@media (max-width: 992px) { + .cid-uhGd4SVHZK .container-fluid { + padding: 0 30px; + } +} +@media (max-width: 992px) { + .cid-uhGd4SVHZK .container { + padding: 0 30px; + } +} +.cid-uhGd4SVHZK .title-wrapper { + margin-bottom: 20px; +} +.cid-uhGd4SVHZK .title-wrapper .title-wrap { + display: inline-flex; + align-items: center; +} +.cid-uhGd4SVHZK .title-wrapper .title-wrap img { + height: 78px; + width: 78px; + border-radius: 20px; + object-fit: cover; + margin-right: 16px; +} +.cid-uhGd4SVHZK .title-wrapper .title-wrap .mbr-section-title { + margin-bottom: 0; +} +.cid-uhGd4SVHZK .mbr-desc { + margin-bottom: 0; + color: #a4a2a2; + text-align: left; +} +.cid-uhGd4SVHZK .link-wrap:hover .mbr-link { + color: #20a6e2; +} +.cid-uhGd4SVHZK .link-wrap .mbr-link { + margin-bottom: 0; + transition: all 0.3s ease-in-out; +} +@media (max-width: 992px) { + .cid-uhGd4SVHZK .link-wrap .mbr-link { + margin-bottom: 20px; + } +} +.cid-uhGd4SVHZK .list { + margin: 0; + padding: 0; + list-style-type: none; + color: #ffffff; +} +@media (max-width: 992px) { + .cid-uhGd4SVHZK .list { + text-align: left; + } +} +.cid-uhGd4SVHZK .list .item-wrap { + text-decoration: underline; + margin-bottom: 16px; + transition: all 0.3s ease-in-out; +} +.cid-uhGd4SVHZK .list .item-wrap:hover { + color: #20a6e2; +} +.cid-uhGd4SVHZK .copyright { + margin: 50px 0; + color: #ffffff; + text-align: right; +} +@media (max-width: 992px) { + .cid-uhGd4SVHZK .copyright { + margin: 30px 0; + } +} +.cid-uhGd4SVHZK .mbr-section-title { + color: #ffffff; +} +.cid-uhGd4SVHZK .mbr-link { + color: #ffffff; + text-align: left; +} +.cid-uhGd4SVHZK .mbr-section-title, +.cid-uhGd4SVHZK .title-wrapper { + color: #324c6d; + text-align: left; +} diff --git a/assets/parallax/jarallax.css b/assets/parallax/jarallax.css new file mode 100644 index 0000000..f12cf97 --- /dev/null +++ b/assets/parallax/jarallax.css @@ -0,0 +1,15 @@ +.jarallax { + position: relative; + z-index: 0; +} +.jarallax > .jarallax-img { + position: absolute; + object-fit: cover; + /* support for plugin https://github.com/bfred-it/object-fit-images */ + font-family: 'object-fit: cover;'; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: -1; +} \ No newline at end of file diff --git a/assets/parallax/jarallax.js b/assets/parallax/jarallax.js new file mode 100644 index 0000000..d301a41 --- /dev/null +++ b/assets/parallax/jarallax.js @@ -0,0 +1,38 @@ +/*! + * Name : Just Another Parallax [Jarallax] + * Version : 1.12.7 + * Author : nK + * GitHub : https://github.com/nk-o/jarallax + */ +/******/ +(function(d){function e(f){if(a[f])return a[f].exports;var g=a[f]={i:f,l:!1,exports:{}};d[f].call(g.exports,g,g.exports,e);g.l=!0;return g.exports}var a={};e.m=d;e.c=a;e.d=function(f,a,d){e.o(f,a)||Object.defineProperty(f,a,{enumerable:!0,get:d})};e.r=function(f){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(f,Symbol.toStringTag,{value:"Module"});Object.defineProperty(f,"__esModule",{value:!0})};e.t=function(f,a){a&1&&(f=e(f));if(a&8||a&4&&"object"===typeof f&&f&&f.__esModule)return f; +var d=Object.create(null);e.r(d);Object.defineProperty(d,"default",{enumerable:!0,value:f});if(a&2&&"string"!=typeof f)for(var r in f)e.d(d,r,function(a){return f[a]}.bind(null,r));return d};e.n=function(a){var d=a&&a.__esModule?function(){return a["default"]}:function(){return a};e.d(d,"a",d);return d};e.o=function(a,d){return Object.prototype.hasOwnProperty.call(a,d)};e.p="";return e(e.s=10)})([,,function(d,e){d.exports=function(a){"complete"===document.readyState||"interactive"===document.readyState? +a.call():document.attachEvent?document.attachEvent("onreadystatechange",function(){"interactive"===document.readyState&&a.call()}):document.addEventListener&&document.addEventListener("DOMContentLoaded",a)}},function(d,e,a){e=a(4);d.exports="undefined"!==typeof window?window:"undefined"!==typeof e?e:"undefined"!==typeof self?self:{}},function(d,e){function a(f){"@babel/helpers - typeof";a="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&& +"function"===typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};return a(f)}var f;f=function(){return this}();try{f=f||(new Function("return this"))()}catch(g){"object"===("undefined"===typeof window?"undefined":a(window))&&(f=window)}d.exports=f},,,,,,function(d,e,a){d.exports=a(11)},function(d,e,a){function f(a){"@babel/helpers - typeof";f="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"===typeof Symbol&& +a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};return f(a)}a.r(e);d=a(2);d=a.n(d);var g=a(3);a.n(g);var m=a(12),r=g.window.jarallax;g.window.jarallax=m["default"];g.window.jarallax.noConflict=function(){g.window.jarallax=r;return this};if("undefined"!==typeof g.jQuery){a=function(){for(var a=arguments.length,d=Array(a),e=0;ea.length)l=a.length;for(var c=0,b=Array(l);cb?(d=b*Math.max(c,h),hb?d/b+Math.abs(d):f+(h-c)*(1-b),d/=2);this.parallaxScrollDistance=d;e=k?(h-f)/2:(c-f)/2;this.css(this.image.$item,{height:"".concat(f, +"px"),marginTop:"".concat(e,"px"),left:"fixed"===this.image.position?"".concat(a.left,"px"):"0",width:"".concat(a.width,"px")});this.options.onCoverImage&&this.options.onCoverImage.call(this);return{image:{height:f,marginTop:e},container:a}}},{key:"isVisible",value:function(){return this.isElementInViewport||!1}},{key:"onScroll",value:function(a){var c=this.$item.getBoundingClientRect(),b=c.top,d=c.height,f={},e=c;this.options.elementInViewport&&(e=this.options.elementInViewport.getBoundingClientRect()); +this.isElementInViewport=0<=e.bottom&&0<=e.right&&e.top<=h&&e.left<=p.window.innerWidth;if(a||this.isElementInViewport){a=Math.max(0,b);var e=Math.max(0,d+b),g=Math.max(0,-b),z=Math.max(0,b+d-h),m=Math.max(0,d-(b+d-h)),r=Math.max(0,-b+h-d),q=1-(h-b)/(h+d)*2,n=1;dthis.options.speed?d-this.options.speed*n:d+this.options.speed*(1-n),f.transform="scale(".concat(d,") translate3d(0,0,0)");if("scroll"===this.options.type||"scroll-opacity"===this.options.type)d=this.parallaxScrollDistance*q,"absolute"===this.image.position&&(d-=b),f.transform="translate3d(0,".concat(d,"px,0)");this.css(this.image.$item,f);this.options.onScroll&&this.options.onScroll.call(this,{section:c,beforeTop:a,beforeTopEnd:e,afterTop:g,beforeBottom:z,beforeBottomEnd:m, +afterBottom:r,visiblePercent:n,fromViewportCenter:q})}}},{key:"onResize",value:function(){this.coverImage();this.clipContainer()}}]);return a}();a=function(a,d){if("object"===("undefined"===typeof HTMLElement?"undefined":m(HTMLElement))?a instanceof HTMLElement:a&&"object"===m(a)&&null!==a&&1===a.nodeType&&"string"===typeof a.nodeName)a=[a];for(var c=a.length,b=0,e,f=arguments.length,g=Array(21)return t.map(function(t){return l(t)});var n=t[0];if("string"!=typeof n.blotName&&"string"!=typeof n.attrName)throw new s("Invalid definition");if("abstract"===n.blotName)throw new s("Cannot register abstract class");if(h[n.blotName||n.attrName]=n,"string"==typeof n.keyName)u[n.keyName]=n;else if(null!=n.className&&(c[n.className]=n),null!=n.tagName){Array.isArray(n.tagName)?n.tagName=n.tagName.map(function(t){return t.toUpperCase()}):n.tagName=n.tagName.toUpperCase();var r=Array.isArray(n.tagName)?n.tagName:[n.tagName];r.forEach(function(t){null!=f[t]&&null!=n.className||(f[t]=n)})}return n}var a=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var s=function(t){function e(e){var n=this;return e="[Parchment] "+e,n=t.call(this,e)||this,n.message=e,n.name=n.constructor.name,n}return a(e,t),e}(Error);e.ParchmentError=s;var u={},c={},f={},h={};e.DATA_KEY="__blot";var p;!function(t){t[t.TYPE=3]="TYPE",t[t.LEVEL=12]="LEVEL",t[t.ATTRIBUTE=13]="ATTRIBUTE",t[t.BLOT=14]="BLOT",t[t.INLINE=7]="INLINE",t[t.BLOCK=11]="BLOCK",t[t.BLOCK_BLOT=10]="BLOCK_BLOT",t[t.INLINE_BLOT=6]="INLINE_BLOT",t[t.BLOCK_ATTRIBUTE=9]="BLOCK_ATTRIBUTE",t[t.INLINE_ATTRIBUTE=5]="INLINE_ATTRIBUTE",t[t.ANY=15]="ANY"}(p=e.Scope||(e.Scope={})),e.create=r,e.find=o,e.query=i,e.register=l},function(t,e){"use strict";var n=Object.prototype.hasOwnProperty,r=Object.prototype.toString,o=function(t){return"function"==typeof Array.isArray?Array.isArray(t):"[object Array]"===r.call(t)},i=function(t){if(!t||"[object Object]"!==r.call(t))return!1;var e=n.call(t,"constructor"),o=t.constructor&&t.constructor.prototype&&n.call(t.constructor.prototype,"isPrototypeOf");if(t.constructor&&!e&&!o)return!1;var i;for(i in t);return void 0===i||n.call(t,i)};t.exports=function t(){var e,n,r,l,a,s,u=arguments[0],c=1,f=arguments.length,h=!1;for("boolean"==typeof u&&(h=u,u=arguments[1]||{},c=2),(null==u||"object"!=typeof u&&"function"!=typeof u)&&(u={});c1&&void 0!==arguments[1]?arguments[1]:{};return null==t?e:("function"==typeof t.formats&&(e=(0,f.default)(e,t.formats())),null==t.parent||"scroll"==t.parent.blotName||t.parent.statics.scope!==t.statics.scope?e:a(t.parent,e))}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.BlockEmbed=e.bubbleFormats=void 0;var s=function(){function t(t,e){for(var n=0;n0&&(t1&&void 0!==arguments[1]&&arguments[1];if(n&&(0===t||t>=this.length()-1)){var r=this.clone();return 0===t?(this.parent.insertBefore(r,this),this):(this.parent.insertBefore(r,this.next),r)}var o=u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"split",this).call(this,t,n);return this.cache={},o}}]),e}(y.default.Block);x.blotName="block",x.tagName="P",x.defaultChild="break",x.allowedChildren=[m.default,y.default.Embed,O.default],e.bubbleFormats=a,e.BlockEmbed=w,e.default=x},function(t,e,n){var r=n(54),o=n(12),i=n(2),l=n(20),a=String.fromCharCode(0),s=function(t){Array.isArray(t)?this.ops=t:null!=t&&Array.isArray(t.ops)?this.ops=t.ops:this.ops=[]};s.prototype.insert=function(t,e){var n={};return 0===t.length?this:(n.insert=t,null!=e&&"object"==typeof e&&Object.keys(e).length>0&&(n.attributes=e),this.push(n))},s.prototype.delete=function(t){return t<=0?this:this.push({delete:t})},s.prototype.retain=function(t,e){if(t<=0)return this;var n={retain:t};return null!=e&&"object"==typeof e&&Object.keys(e).length>0&&(n.attributes=e),this.push(n)},s.prototype.push=function(t){var e=this.ops.length,n=this.ops[e-1];if(t=i(!0,{},t),"object"==typeof n){if("number"==typeof t.delete&&"number"==typeof n.delete)return this.ops[e-1]={delete:n.delete+t.delete},this;if("number"==typeof n.delete&&null!=t.insert&&(e-=1,"object"!=typeof(n=this.ops[e-1])))return this.ops.unshift(t),this;if(o(t.attributes,n.attributes)){if("string"==typeof t.insert&&"string"==typeof n.insert)return this.ops[e-1]={insert:n.insert+t.insert},"object"==typeof t.attributes&&(this.ops[e-1].attributes=t.attributes),this;if("number"==typeof t.retain&&"number"==typeof n.retain)return this.ops[e-1]={retain:n.retain+t.retain},"object"==typeof t.attributes&&(this.ops[e-1].attributes=t.attributes),this}}return e===this.ops.length?this.ops.push(t):this.ops.splice(e,0,t),this},s.prototype.chop=function(){var t=this.ops[this.ops.length-1];return t&&t.retain&&!t.attributes&&this.ops.pop(),this},s.prototype.filter=function(t){return this.ops.filter(t)},s.prototype.forEach=function(t){this.ops.forEach(t)},s.prototype.map=function(t){return this.ops.map(t)},s.prototype.partition=function(t){var e=[],n=[];return this.forEach(function(r){(t(r)?e:n).push(r)}),[e,n]},s.prototype.reduce=function(t,e){return this.ops.reduce(t,e)},s.prototype.changeLength=function(){return this.reduce(function(t,e){return e.insert?t+l.length(e):e.delete?t-e.delete:t},0)},s.prototype.length=function(){return this.reduce(function(t,e){return t+l.length(e)},0)},s.prototype.slice=function(t,e){t=t||0,"number"!=typeof e&&(e=1/0);for(var n=[],r=l.iterator(this.ops),o=0;o0&&(e.push(t.ops[0]),e.ops=e.ops.concat(t.ops.slice(1))),e},s.prototype.diff=function(t,e){if(this.ops===t.ops)return new s;var n=[this,t].map(function(e){return e.map(function(n){if(null!=n.insert)return"string"==typeof n.insert?n.insert:a;var r=e===t?"on":"with";throw new Error("diff() called "+r+" non-document")}).join("")}),i=new s,u=r(n[0],n[1],e),c=l.iterator(this.ops),f=l.iterator(t.ops);return u.forEach(function(t){for(var e=t[1].length;e>0;){var n=0;switch(t[0]){case r.INSERT:n=Math.min(f.peekLength(),e),i.push(f.next(n));break;case r.DELETE:n=Math.min(e,c.peekLength()),c.next(n),i.delete(n);break;case r.EQUAL:n=Math.min(c.peekLength(),f.peekLength(),e);var a=c.next(n),s=f.next(n);o(a.insert,s.insert)?i.retain(n,l.attributes.diff(a.attributes,s.attributes)):i.push(s).delete(n)}e-=n}}),i.chop()},s.prototype.eachLine=function(t,e){e=e||"\n";for(var n=l.iterator(this.ops),r=new s,o=0;n.hasNext();){if("insert"!==n.peekType())return;var i=n.peek(),a=l.length(i)-n.peekLength(),u="string"==typeof i.insert?i.insert.indexOf(e,a)-a:-1;if(u<0)r.push(n.next());else if(u>0)r.push(n.next(u));else{if(!1===t(r,n.next(1).attributes||{},o))return;o+=1,r=new s}}r.length()>0&&t(r,{},o)},s.prototype.transform=function(t,e){if(e=!!e,"number"==typeof t)return this.transformPosition(t,e);for(var n=l.iterator(this.ops),r=l.iterator(t.ops),o=new s;n.hasNext()||r.hasNext();)if("insert"!==n.peekType()||!e&&"insert"===r.peekType())if("insert"===r.peekType())o.push(r.next());else{var i=Math.min(n.peekLength(),r.peekLength()),a=n.next(i),u=r.next(i);if(a.delete)continue;u.delete?o.push(u):o.retain(i,l.attributes.transform(a.attributes,u.attributes,e))}else o.retain(l.length(n.next()));return o.chop()},s.prototype.transformPosition=function(t,e){e=!!e;for(var n=l.iterator(this.ops),r=0;n.hasNext()&&r<=t;){var o=n.peekLength(),i=n.peekType();n.next(),"delete"!==i?("insert"===i&&(r0){var n=this.parent.isolate(this.offset(),this.length());this.moveChildren(n),n.wrap(this)}}}],[{key:"compare",value:function(t,n){var r=e.order.indexOf(t),o=e.order.indexOf(n);return r>=0||o>=0?r-o:t===n?0:t0){var a,s=[g.default.events.TEXT_CHANGE,l,i,e];if((a=this.emitter).emit.apply(a,[g.default.events.EDITOR_CHANGE].concat(s)),e!==g.default.sources.SILENT){var c;(c=this.emitter).emit.apply(c,s)}}return l}function s(t,e,n,r,o){var i={};return"number"==typeof t.index&&"number"==typeof t.length?"number"!=typeof e?(o=r,r=n,n=e,e=t.length,t=t.index):(e=t.length,t=t.index):"number"!=typeof e&&(o=r,r=n,n=e,e=0),"object"===(void 0===n?"undefined":c(n))?(i=n,o=r):"string"==typeof n&&(null!=r?i[n]=r:o=n),o=o||g.default.sources.API,[t,e,i,o]}function u(t,e,n,r){if(null==t)return null;var o=void 0,i=void 0;if(e instanceof d.default){var l=[t.index,t.index+t.length].map(function(t){return e.transformPosition(t,r!==g.default.sources.USER)}),a=f(l,2);o=a[0],i=a[1]}else{var s=[t.index,t.index+t.length].map(function(t){return t=0?t+n:Math.max(e,t+n)}),u=f(s,2);o=u[0],i=u[1]}return new x.Range(o,i-o)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.overload=e.expandConfig=void 0;var c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),h=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};if(i(this,t),this.options=l(e,r),this.container=this.options.container,null==this.container)return P.error("Invalid Quill container",e);this.options.debug&&t.debug(this.options.debug);var o=this.container.innerHTML.trim();this.container.classList.add("ql-container"),this.container.innerHTML="",this.container.__quill=this,this.root=this.addContainer("ql-editor"),this.root.classList.add("ql-blank"),this.root.setAttribute("data-gramm",!1),this.scrollingContainer=this.options.scrollingContainer||this.root,this.emitter=new g.default,this.scroll=w.default.create(this.root,{emitter:this.emitter,whitelist:this.options.formats}),this.editor=new v.default(this.scroll),this.selection=new k.default(this.scroll,this.emitter),this.theme=new this.options.theme(this,this.options),this.keyboard=this.theme.addModule("keyboard"),this.clipboard=this.theme.addModule("clipboard"),this.history=this.theme.addModule("history"),this.theme.init(),this.emitter.on(g.default.events.EDITOR_CHANGE,function(t){t===g.default.events.TEXT_CHANGE&&n.root.classList.toggle("ql-blank",n.editor.isBlank())}),this.emitter.on(g.default.events.SCROLL_UPDATE,function(t,e){var r=n.selection.lastRange,o=r&&0===r.length?r.index:void 0;a.call(n,function(){return n.editor.update(null,e,o)},t)});var s=this.clipboard.convert("
"+o+"


");this.setContents(s),this.history.clear(),this.options.placeholder&&this.root.setAttribute("data-placeholder",this.options.placeholder),this.options.readOnly&&this.disable()}return h(t,null,[{key:"debug",value:function(t){!0===t&&(t="log"),A.default.level(t)}},{key:"find",value:function(t){return t.__quill||w.default.find(t)}},{key:"import",value:function(t){return null==this.imports[t]&&P.error("Cannot import "+t+". Are you sure it was registered?"),this.imports[t]}},{key:"register",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if("string"!=typeof t){var o=t.attrName||t.blotName;"string"==typeof o?this.register("formats/"+o,t,e):Object.keys(t).forEach(function(r){n.register(r,t[r],e)})}else null==this.imports[t]||r||P.warn("Overwriting "+t+" with",e),this.imports[t]=e,(t.startsWith("blots/")||t.startsWith("formats/"))&&"abstract"!==e.blotName?w.default.register(e):t.startsWith("modules")&&"function"==typeof e.register&&e.register()}}]),h(t,[{key:"addContainer",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if("string"==typeof t){var n=t;t=document.createElement("div"),t.classList.add(n)}return this.container.insertBefore(t,e),t}},{key:"blur",value:function(){this.selection.setRange(null)}},{key:"deleteText",value:function(t,e,n){var r=this,o=s(t,e,n),i=f(o,4);return t=i[0],e=i[1],n=i[3],a.call(this,function(){return r.editor.deleteText(t,e)},n,t,-1*e)}},{key:"disable",value:function(){this.enable(!1)}},{key:"enable",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.scroll.enable(t),this.container.classList.toggle("ql-disabled",!t)}},{key:"focus",value:function(){var t=this.scrollingContainer.scrollTop;this.selection.focus(),this.scrollingContainer.scrollTop=t,this.scrollIntoView()}},{key:"format",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:g.default.sources.API;return a.call(this,function(){var r=n.getSelection(!0),i=new d.default;if(null==r)return i;if(w.default.query(t,w.default.Scope.BLOCK))i=n.editor.formatLine(r.index,r.length,o({},t,e));else{if(0===r.length)return n.selection.format(t,e),i;i=n.editor.formatText(r.index,r.length,o({},t,e))}return n.setSelection(r,g.default.sources.SILENT),i},r)}},{key:"formatLine",value:function(t,e,n,r,o){var i=this,l=void 0,u=s(t,e,n,r,o),c=f(u,4);return t=c[0],e=c[1],l=c[2],o=c[3],a.call(this,function(){return i.editor.formatLine(t,e,l)},o,t,0)}},{key:"formatText",value:function(t,e,n,r,o){var i=this,l=void 0,u=s(t,e,n,r,o),c=f(u,4);return t=c[0],e=c[1],l=c[2],o=c[3],a.call(this,function(){return i.editor.formatText(t,e,l)},o,t,0)}},{key:"getBounds",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=void 0;n="number"==typeof t?this.selection.getBounds(t,e):this.selection.getBounds(t.index,t.length);var r=this.container.getBoundingClientRect();return{bottom:n.bottom-r.top,height:n.height,left:n.left-r.left,right:n.right-r.left,top:n.top-r.top,width:n.width}}},{key:"getContents",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getLength()-t,n=s(t,e),r=f(n,2);return t=r[0],e=r[1],this.editor.getContents(t,e)}},{key:"getFormat",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.getSelection(!0),e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return"number"==typeof t?this.editor.getFormat(t,e):this.editor.getFormat(t.index,t.length)}},{key:"getIndex",value:function(t){return t.offset(this.scroll)}},{key:"getLength",value:function(){return this.scroll.length()}},{key:"getLeaf",value:function(t){return this.scroll.leaf(t)}},{key:"getLine",value:function(t){return this.scroll.line(t)}},{key:"getLines",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE;return"number"!=typeof t?this.scroll.lines(t.index,t.length):this.scroll.lines(t,e)}},{key:"getModule",value:function(t){return this.theme.modules[t]}},{key:"getSelection",value:function(){return arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.focus(),this.update(),this.selection.getRange()[0]}},{key:"getText",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getLength()-t,n=s(t,e),r=f(n,2);return t=r[0],e=r[1],this.editor.getText(t,e)}},{key:"hasFocus",value:function(){return this.selection.hasFocus()}},{key:"insertEmbed",value:function(e,n,r){var o=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:t.sources.API;return a.call(this,function(){return o.editor.insertEmbed(e,n,r)},i,e)}},{key:"insertText",value:function(t,e,n,r,o){var i=this,l=void 0,u=s(t,0,n,r,o),c=f(u,4);return t=c[0],l=c[2],o=c[3],a.call(this,function(){return i.editor.insertText(t,e,l)},o,t,e.length)}},{key:"isEnabled",value:function(){return!this.container.classList.contains("ql-disabled")}},{key:"off",value:function(){return this.emitter.off.apply(this.emitter,arguments)}},{key:"on",value:function(){return this.emitter.on.apply(this.emitter,arguments)}},{key:"once",value:function(){return this.emitter.once.apply(this.emitter,arguments)}},{key:"pasteHTML",value:function(t,e,n){this.clipboard.dangerouslyPasteHTML(t,e,n)}},{key:"removeFormat",value:function(t,e,n){var r=this,o=s(t,e,n),i=f(o,4);return t=i[0],e=i[1],n=i[3],a.call(this,function(){return r.editor.removeFormat(t,e)},n,t)}},{key:"scrollIntoView",value:function(){this.selection.scrollIntoView(this.scrollingContainer)}},{key:"setContents",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g.default.sources.API;return a.call(this,function(){t=new d.default(t);var n=e.getLength(),r=e.editor.deleteText(0,n),o=e.editor.applyDelta(t),i=o.ops[o.ops.length-1];return null!=i&&"string"==typeof i.insert&&"\n"===i.insert[i.insert.length-1]&&(e.editor.deleteText(e.getLength()-1,1),o.delete(1)),r.compose(o)},n)}},{key:"setSelection",value:function(e,n,r){if(null==e)this.selection.setRange(null,n||t.sources.API);else{var o=s(e,n,r),i=f(o,4);e=i[0],n=i[1],r=i[3],this.selection.setRange(new x.Range(e,n),r),r!==g.default.sources.SILENT&&this.selection.scrollIntoView(this.scrollingContainer)}}},{key:"setText",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g.default.sources.API,n=(new d.default).insert(t);return this.setContents(n,e)}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:g.default.sources.USER,e=this.scroll.update(t);return this.selection.update(t),e}},{key:"updateContents",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g.default.sources.API;return a.call(this,function(){return t=new d.default(t),e.editor.applyDelta(t,n)},n,!0)}}]),t}();S.DEFAULTS={bounds:null,formats:null,modules:{},placeholder:"",readOnly:!1,scrollingContainer:null,strict:!0,theme:"default"},S.events=g.default.events,S.sources=g.default.sources,S.version="1.3.6",S.imports={delta:d.default,parchment:w.default,"core/module":_.default,"core/theme":T.default},e.expandConfig=l,e.overload=s,e.default=S},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};r(this,t),this.quill=e,this.options=n};o.DEFAULTS={},e.default=o},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=n(0),a=function(t){return t&&t.__esModule?t:{default:t}}(l),s=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),e}(a.default.Text);e.default=s},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){for(var n=0;n1?e-1:0),r=1;r1?n-1:0),o=1;o-1:this.whitelist.indexOf(e)>-1))},t.prototype.remove=function(t){t.removeAttribute(this.keyName)},t.prototype.value=function(t){var e=t.getAttribute(this.keyName);return this.canAdd(t,e)&&e?e:""},t}();e.default=o},function(t,e,n){function r(t){return null===t||void 0===t}function o(t){return!(!t||"object"!=typeof t||"number"!=typeof t.length)&&("function"==typeof t.copy&&"function"==typeof t.slice&&!(t.length>0&&"number"!=typeof t[0]))}function i(t,e,n){var i,c;if(r(t)||r(e))return!1;if(t.prototype!==e.prototype)return!1;if(s(t))return!!s(e)&&(t=l.call(t),e=l.call(e),u(t,e,n));if(o(t)){if(!o(e))return!1;if(t.length!==e.length)return!1;for(i=0;i=0;i--)if(f[i]!=h[i])return!1;for(i=f.length-1;i>=0;i--)if(c=f[i],!u(t[c],e[c],n))return!1;return typeof t==typeof e}var l=Array.prototype.slice,a=n(55),s=n(56),u=t.exports=function(t,e,n){return n||(n={}),t===e||(t instanceof Date&&e instanceof Date?t.getTime()===e.getTime():!t||!e||"object"!=typeof t&&"object"!=typeof e?n.strict?t===e:t==e:i(t,e,n))}},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.Code=void 0;var a=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function(){function t(t,e){for(var n=0;n=t+n)){var l=this.newlineIndex(t,!0)+1,a=i-l+1,s=this.isolate(l,a),u=s.next;s.format(r,o),u instanceof e&&u.formatAt(0,t-l+n-a,r,o)}}}},{key:"insertAt",value:function(t,e,n){if(null==n){var r=this.descendant(m.default,t),o=a(r,2),i=o[0],l=o[1];i.insertAt(l,e)}}},{key:"length",value:function(){var t=this.domNode.textContent.length;return this.domNode.textContent.endsWith("\n")?t:t+1}},{key:"newlineIndex",value:function(t){if(arguments.length>1&&void 0!==arguments[1]&&arguments[1])return this.domNode.textContent.slice(0,t).lastIndexOf("\n");var e=this.domNode.textContent.slice(t).indexOf("\n");return e>-1?t+e:-1}},{key:"optimize",value:function(t){this.domNode.textContent.endsWith("\n")||this.appendChild(p.default.create("text","\n")),u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"optimize",this).call(this,t);var n=this.next;null!=n&&n.prev===this&&n.statics.blotName===this.statics.blotName&&this.statics.formats(this.domNode)===n.statics.formats(n.domNode)&&(n.optimize(t),n.moveChildren(this),n.remove())}},{key:"replace",value:function(t){u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"replace",this).call(this,t),[].slice.call(this.domNode.querySelectorAll("*")).forEach(function(t){var e=p.default.find(t);null==e?t.parentNode.removeChild(t):e instanceof p.default.Embed?e.remove():e.unwrap()})}}],[{key:"create",value:function(t){var n=u(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,t);return n.setAttribute("spellcheck",!1),n}},{key:"formats",value:function(){return!0}}]),e}(y.default);O.blotName="code-block",O.tagName="PRE",O.TAB=" ",e.Code=_,e.default=O},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n-1}Object.defineProperty(e,"__esModule",{value:!0}),e.sanitize=e.default=void 0;var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]&&arguments[1],n=this.container.querySelector(".ql-selected");if(t!==n&&(null!=n&&n.classList.remove("ql-selected"),null!=t&&(t.classList.add("ql-selected"),this.select.selectedIndex=[].indexOf.call(t.parentNode.children,t),t.hasAttribute("data-value")?this.label.setAttribute("data-value",t.getAttribute("data-value")):this.label.removeAttribute("data-value"),t.hasAttribute("data-label")?this.label.setAttribute("data-label",t.getAttribute("data-label")):this.label.removeAttribute("data-label"),e))){if("function"==typeof Event)this.select.dispatchEvent(new Event("change"));else if("object"===("undefined"==typeof Event?"undefined":l(Event))){var r=document.createEvent("Event");r.initEvent("change",!0,!0),this.select.dispatchEvent(r)}this.close()}}},{key:"update",value:function(){var t=void 0;if(this.select.selectedIndex>-1){var e=this.container.querySelector(".ql-picker-options").children[this.select.selectedIndex];t=this.select.options[this.select.selectedIndex],this.selectItem(e)}else this.selectItem(null);var n=null!=t&&t!==this.select.querySelector("option[selected]");this.label.classList.toggle("ql-active",n)}}]),t}();e.default=p},function(t,e,n){"use strict";function r(t){var e=a.find(t);if(null==e)try{e=a.create(t)}catch(n){e=a.create(a.Scope.INLINE),[].slice.call(t.childNodes).forEach(function(t){e.domNode.appendChild(t)}),t.parentNode&&t.parentNode.replaceChild(e.domNode,t),e.attach()}return e}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(47),l=n(27),a=n(1),s=function(t){function e(e){var n=t.call(this,e)||this;return n.build(),n}return o(e,t),e.prototype.appendChild=function(t){this.insertBefore(t)},e.prototype.attach=function(){t.prototype.attach.call(this),this.children.forEach(function(t){t.attach()})},e.prototype.build=function(){var t=this;this.children=new i.default,[].slice.call(this.domNode.childNodes).reverse().forEach(function(e){try{var n=r(e);t.insertBefore(n,t.children.head||void 0)}catch(t){if(t instanceof a.ParchmentError)return;throw t}})},e.prototype.deleteAt=function(t,e){if(0===t&&e===this.length())return this.remove();this.children.forEachAt(t,e,function(t,e,n){t.deleteAt(e,n)})},e.prototype.descendant=function(t,n){var r=this.children.find(n),o=r[0],i=r[1];return null==t.blotName&&t(o)||null!=t.blotName&&o instanceof t?[o,i]:o instanceof e?o.descendant(t,i):[null,-1]},e.prototype.descendants=function(t,n,r){void 0===n&&(n=0),void 0===r&&(r=Number.MAX_VALUE);var o=[],i=r;return this.children.forEachAt(n,r,function(n,r,l){(null==t.blotName&&t(n)||null!=t.blotName&&n instanceof t)&&o.push(n),n instanceof e&&(o=o.concat(n.descendants(t,r,i))),i-=l}),o},e.prototype.detach=function(){this.children.forEach(function(t){t.detach()}),t.prototype.detach.call(this)},e.prototype.formatAt=function(t,e,n,r){this.children.forEachAt(t,e,function(t,e,o){t.formatAt(e,o,n,r)})},e.prototype.insertAt=function(t,e,n){var r=this.children.find(t),o=r[0],i=r[1];if(o)o.insertAt(i,e,n);else{var l=null==n?a.create("text",e):a.create(e,n);this.appendChild(l)}},e.prototype.insertBefore=function(t,e){if(null!=this.statics.allowedChildren&&!this.statics.allowedChildren.some(function(e){return t instanceof e}))throw new a.ParchmentError("Cannot insert "+t.statics.blotName+" into "+this.statics.blotName);t.insertInto(this,e)},e.prototype.length=function(){return this.children.reduce(function(t,e){return t+e.length()},0)},e.prototype.moveChildren=function(t,e){this.children.forEach(function(n){t.insertBefore(n,e)})},e.prototype.optimize=function(e){if(t.prototype.optimize.call(this,e),0===this.children.length)if(null!=this.statics.defaultChild){var n=a.create(this.statics.defaultChild);this.appendChild(n),n.optimize(e)}else this.remove()},e.prototype.path=function(t,n){void 0===n&&(n=!1);var r=this.children.find(t,n),o=r[0],i=r[1],l=[[this,t]];return o instanceof e?l.concat(o.path(i,n)):(null!=o&&l.push([o,i]),l)},e.prototype.removeChild=function(t){this.children.remove(t)},e.prototype.replace=function(n){n instanceof e&&n.moveChildren(this),t.prototype.replace.call(this,n)},e.prototype.split=function(t,e){if(void 0===e&&(e=!1),!e){if(0===t)return this;if(t===this.length())return this.next}var n=this.clone();return this.parent.insertBefore(n,this.next),this.children.forEachAt(t,this.length(),function(t,r,o){t=t.split(r,e),n.appendChild(t)}),n},e.prototype.unwrap=function(){this.moveChildren(this.parent,this.next),this.remove()},e.prototype.update=function(t,e){var n=this,o=[],i=[];t.forEach(function(t){t.target===n.domNode&&"childList"===t.type&&(o.push.apply(o,t.addedNodes),i.push.apply(i,t.removedNodes))}),i.forEach(function(t){if(!(null!=t.parentNode&&"IFRAME"!==t.tagName&&document.body.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY)){var e=a.find(t);null!=e&&(null!=e.domNode.parentNode&&e.domNode.parentNode!==n.domNode||e.detach())}}),o.filter(function(t){return t.parentNode==n.domNode}).sort(function(t,e){return t===e?0:t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING?1:-1}).forEach(function(t){var e=null;null!=t.nextSibling&&(e=a.find(t.nextSibling));var o=r(t);o.next==e&&null!=o.next||(null!=o.parent&&o.parent.removeChild(n),n.insertBefore(o,e||void 0))})},e}(l.default);e.default=s},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(11),i=n(28),l=n(17),a=n(1),s=function(t){function e(e){var n=t.call(this,e)||this;return n.attributes=new i.default(n.domNode),n}return r(e,t),e.formats=function(t){return"string"==typeof this.tagName||(Array.isArray(this.tagName)?t.tagName.toLowerCase():void 0)},e.prototype.format=function(t,e){var n=a.query(t);n instanceof o.default?this.attributes.attribute(n,e):e&&(null==n||t===this.statics.blotName&&this.formats()[t]===e||this.replaceWith(t,e))},e.prototype.formats=function(){var t=this.attributes.values(),e=this.statics.formats(this.domNode);return null!=e&&(t[this.statics.blotName]=e),t},e.prototype.replaceWith=function(e,n){var r=t.prototype.replaceWith.call(this,e,n);return this.attributes.copy(r),r},e.prototype.update=function(e,n){var r=this;t.prototype.update.call(this,e,n),e.some(function(t){return t.target===r.domNode&&"attributes"===t.type})&&this.attributes.build()},e.prototype.wrap=function(n,r){var o=t.prototype.wrap.call(this,n,r);return o instanceof e&&o.statics.scope===this.statics.scope&&this.attributes.move(o),o},e}(l.default);e.default=s},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(27),i=n(1),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.value=function(t){return!0},e.prototype.index=function(t,e){return this.domNode===t||this.domNode.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY?Math.min(e,1):-1},e.prototype.position=function(t,e){var n=[].indexOf.call(this.parent.domNode.childNodes,this.domNode);return t>0&&(n+=1),[this.parent.domNode,n]},e.prototype.value=function(){return t={},t[this.statics.blotName]=this.statics.value(this.domNode)||!0,t;var t},e.scope=i.Scope.INLINE_BLOT,e}(o.default);e.default=l},function(t,e,n){function r(t){this.ops=t,this.index=0,this.offset=0}var o=n(12),i=n(2),l={attributes:{compose:function(t,e,n){"object"!=typeof t&&(t={}),"object"!=typeof e&&(e={});var r=i(!0,{},e);n||(r=Object.keys(r).reduce(function(t,e){return null!=r[e]&&(t[e]=r[e]),t},{}));for(var o in t)void 0!==t[o]&&void 0===e[o]&&(r[o]=t[o]);return Object.keys(r).length>0?r:void 0},diff:function(t,e){"object"!=typeof t&&(t={}),"object"!=typeof e&&(e={});var n=Object.keys(t).concat(Object.keys(e)).reduce(function(n,r){return o(t[r],e[r])||(n[r]=void 0===e[r]?null:e[r]),n},{});return Object.keys(n).length>0?n:void 0},transform:function(t,e,n){if("object"!=typeof t)return e;if("object"==typeof e){if(!n)return e;var r=Object.keys(e).reduce(function(n,r){return void 0===t[r]&&(n[r]=e[r]),n},{});return Object.keys(r).length>0?r:void 0}}},iterator:function(t){return new r(t)},length:function(t){return"number"==typeof t.delete?t.delete:"number"==typeof t.retain?t.retain:"string"==typeof t.insert?t.insert.length:1}};r.prototype.hasNext=function(){return this.peekLength()<1/0},r.prototype.next=function(t){t||(t=1/0);var e=this.ops[this.index];if(e){var n=this.offset,r=l.length(e);if(t>=r-n?(t=r-n,this.index+=1,this.offset=0):this.offset+=t,"number"==typeof e.delete)return{delete:t};var o={};return e.attributes&&(o.attributes=e.attributes),"number"==typeof e.retain?o.retain=t:"string"==typeof e.insert?o.insert=e.insert.substr(n,t):o.insert=e.insert,o}return{retain:1/0}},r.prototype.peek=function(){return this.ops[this.index]},r.prototype.peekLength=function(){return this.ops[this.index]?l.length(this.ops[this.index])-this.offset:1/0},r.prototype.peekType=function(){return this.ops[this.index]?"number"==typeof this.ops[this.index].delete?"delete":"number"==typeof this.ops[this.index].retain?"retain":"insert":"retain"},t.exports=l},function(t,e){var n=function(){"use strict";function t(t,e){return null!=e&&t instanceof e}function e(n,r,o,i,c){function f(n,o){if(null===n)return null;if(0===o)return n;var y,v;if("object"!=typeof n)return n;if(t(n,a))y=new a;else if(t(n,s))y=new s;else if(t(n,u))y=new u(function(t,e){n.then(function(e){t(f(e,o-1))},function(t){e(f(t,o-1))})});else if(e.__isArray(n))y=[];else if(e.__isRegExp(n))y=new RegExp(n.source,l(n)),n.lastIndex&&(y.lastIndex=n.lastIndex);else if(e.__isDate(n))y=new Date(n.getTime());else{if(d&&Buffer.isBuffer(n))return y=new Buffer(n.length),n.copy(y),y;t(n,Error)?y=Object.create(n):void 0===i?(v=Object.getPrototypeOf(n),y=Object.create(v)):(y=Object.create(i),v=i)}if(r){var b=h.indexOf(n);if(-1!=b)return p[b];h.push(n),p.push(y)}t(n,a)&&n.forEach(function(t,e){var n=f(e,o-1),r=f(t,o-1);y.set(n,r)}),t(n,s)&&n.forEach(function(t){var e=f(t,o-1);y.add(e)});for(var g in n){var m;v&&(m=Object.getOwnPropertyDescriptor(v,g)),m&&null==m.set||(y[g]=f(n[g],o-1))}if(Object.getOwnPropertySymbols)for(var _=Object.getOwnPropertySymbols(n),g=0;g<_.length;g++){var O=_[g],w=Object.getOwnPropertyDescriptor(n,O);(!w||w.enumerable||c)&&(y[O]=f(n[O],o-1),w.enumerable||Object.defineProperty(y,O,{enumerable:!1}))}if(c)for(var x=Object.getOwnPropertyNames(n),g=0;g1&&void 0!==arguments[1]?arguments[1]:0;i(this,t),this.index=e,this.length=n},O=function(){function t(e,n){var r=this;i(this,t),this.emitter=n,this.scroll=e,this.composing=!1,this.mouseDown=!1,this.root=this.scroll.domNode,this.cursor=c.default.create("cursor",this),this.lastRange=this.savedRange=new _(0,0),this.handleComposition(),this.handleDragging(),this.emitter.listenDOM("selectionchange",document,function(){r.mouseDown||setTimeout(r.update.bind(r,v.default.sources.USER),1)}),this.emitter.on(v.default.events.EDITOR_CHANGE,function(t,e){t===v.default.events.TEXT_CHANGE&&e.length()>0&&r.update(v.default.sources.SILENT)}),this.emitter.on(v.default.events.SCROLL_BEFORE_UPDATE,function(){if(r.hasFocus()){var t=r.getNativeRange();null!=t&&t.start.node!==r.cursor.textNode&&r.emitter.once(v.default.events.SCROLL_UPDATE,function(){try{r.setNativeRange(t.start.node,t.start.offset,t.end.node,t.end.offset)}catch(t){}})}}),this.emitter.on(v.default.events.SCROLL_OPTIMIZE,function(t,e){if(e.range){var n=e.range,o=n.startNode,i=n.startOffset,l=n.endNode,a=n.endOffset;r.setNativeRange(o,i,l,a)}}),this.update(v.default.sources.SILENT)}return s(t,[{key:"handleComposition",value:function(){var t=this;this.root.addEventListener("compositionstart",function(){t.composing=!0}),this.root.addEventListener("compositionend",function(){if(t.composing=!1,t.cursor.parent){var e=t.cursor.restore();if(!e)return;setTimeout(function(){t.setNativeRange(e.startNode,e.startOffset,e.endNode,e.endOffset)},1)}})}},{key:"handleDragging",value:function(){var t=this;this.emitter.listenDOM("mousedown",document.body,function(){t.mouseDown=!0}),this.emitter.listenDOM("mouseup",document.body,function(){t.mouseDown=!1,t.update(v.default.sources.USER)})}},{key:"focus",value:function(){this.hasFocus()||(this.root.focus(),this.setRange(this.savedRange))}},{key:"format",value:function(t,e){if(null==this.scroll.whitelist||this.scroll.whitelist[t]){this.scroll.update();var n=this.getNativeRange();if(null!=n&&n.native.collapsed&&!c.default.query(t,c.default.Scope.BLOCK)){if(n.start.node!==this.cursor.textNode){var r=c.default.find(n.start.node,!1);if(null==r)return;if(r instanceof c.default.Leaf){var o=r.split(n.start.offset);r.parent.insertBefore(this.cursor,o)}else r.insertBefore(this.cursor,n.start.node);this.cursor.attach()}this.cursor.format(t,e),this.scroll.optimize(),this.setNativeRange(this.cursor.textNode,this.cursor.textNode.data.length),this.update()}}}},{key:"getBounds",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=this.scroll.length();t=Math.min(t,n-1),e=Math.min(t+e,n-1)-t;var r=void 0,o=this.scroll.leaf(t),i=a(o,2),l=i[0],s=i[1];if(null==l)return null;var u=l.position(s,!0),c=a(u,2);r=c[0],s=c[1];var f=document.createRange();if(e>0){f.setStart(r,s);var h=this.scroll.leaf(t+e),p=a(h,2);if(l=p[0],s=p[1],null==l)return null;var d=l.position(s,!0),y=a(d,2);return r=y[0],s=y[1],f.setEnd(r,s),f.getBoundingClientRect()}var v="left",b=void 0;return r instanceof Text?(s0&&(v="right")),{bottom:b.top+b.height,height:b.height,left:b[v],right:b[v],top:b.top,width:0}}},{key:"getNativeRange",value:function(){var t=document.getSelection();if(null==t||t.rangeCount<=0)return null;var e=t.getRangeAt(0);if(null==e)return null;var n=this.normalizeNative(e);return m.info("getNativeRange",n),n}},{key:"getRange",value:function(){var t=this.getNativeRange();return null==t?[null,null]:[this.normalizedToRange(t),t]}},{key:"hasFocus",value:function(){return document.activeElement===this.root}},{key:"normalizedToRange",value:function(t){var e=this,n=[[t.start.node,t.start.offset]];t.native.collapsed||n.push([t.end.node,t.end.offset]);var r=n.map(function(t){var n=a(t,2),r=n[0],o=n[1],i=c.default.find(r,!0),l=i.offset(e.scroll);return 0===o?l:i instanceof c.default.Container?l+i.length():l+i.index(r,o)}),i=Math.min(Math.max.apply(Math,o(r)),this.scroll.length()-1),l=Math.min.apply(Math,[i].concat(o(r)));return new _(l,i-l)}},{key:"normalizeNative",value:function(t){if(!l(this.root,t.startContainer)||!t.collapsed&&!l(this.root,t.endContainer))return null;var e={start:{node:t.startContainer,offset:t.startOffset},end:{node:t.endContainer,offset:t.endOffset},native:t};return[e.start,e.end].forEach(function(t){for(var e=t.node,n=t.offset;!(e instanceof Text)&&e.childNodes.length>0;)if(e.childNodes.length>n)e=e.childNodes[n],n=0;else{if(e.childNodes.length!==n)break;e=e.lastChild,n=e instanceof Text?e.data.length:e.childNodes.length+1}t.node=e,t.offset=n}),e}},{key:"rangeToNative",value:function(t){var e=this,n=t.collapsed?[t.index]:[t.index,t.index+t.length],r=[],o=this.scroll.length();return n.forEach(function(t,n){t=Math.min(o-1,t);var i=void 0,l=e.scroll.leaf(t),s=a(l,2),u=s[0],c=s[1],f=u.position(c,0!==n),h=a(f,2);i=h[0],c=h[1],r.push(i,c)}),r.length<2&&(r=r.concat(r)),r}},{key:"scrollIntoView",value:function(t){var e=this.lastRange;if(null!=e){var n=this.getBounds(e.index,e.length);if(null!=n){var r=this.scroll.length()-1,o=this.scroll.line(Math.min(e.index,r)),i=a(o,1),l=i[0],s=l;if(e.length>0){var u=this.scroll.line(Math.min(e.index+e.length,r));s=a(u,1)[0]}if(null!=l&&null!=s){var c=t.getBoundingClientRect();n.topc.bottom&&(t.scrollTop+=n.bottom-c.bottom)}}}}},{key:"setNativeRange",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:e,o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];if(m.info("setNativeRange",t,e,n,r),null==t||null!=this.root.parentNode&&null!=t.parentNode&&null!=n.parentNode){var i=document.getSelection();if(null!=i)if(null!=t){this.hasFocus()||this.root.focus();var l=(this.getNativeRange()||{}).native;if(null==l||o||t!==l.startContainer||e!==l.startOffset||n!==l.endContainer||r!==l.endOffset){"BR"==t.tagName&&(e=[].indexOf.call(t.parentNode.childNodes,t),t=t.parentNode),"BR"==n.tagName&&(r=[].indexOf.call(n.parentNode.childNodes,n),n=n.parentNode);var a=document.createRange();a.setStart(t,e),a.setEnd(n,r),i.removeAllRanges(),i.addRange(a)}}else i.removeAllRanges(),this.root.blur(),document.body.focus()}}},{key:"setRange",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:v.default.sources.API;if("string"==typeof e&&(n=e,e=!1),m.info("setRange",t),null!=t){var r=this.rangeToNative(t);this.setNativeRange.apply(this,o(r).concat([e]))}else this.setNativeRange(null);this.update(n)}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:v.default.sources.USER,e=this.lastRange,n=this.getRange(),r=a(n,2),o=r[0],i=r[1];if(this.lastRange=o,null!=this.lastRange&&(this.savedRange=this.lastRange),!(0,d.default)(e,this.lastRange)){var l;!this.composing&&null!=i&&i.native.collapsed&&i.start.node!==this.cursor.textNode&&this.cursor.restore();var s=[v.default.events.SELECTION_CHANGE,(0,h.default)(this.lastRange),(0,h.default)(e),t];if((l=this.emitter).emit.apply(l,[v.default.events.EDITOR_CHANGE].concat(s)),t!==v.default.sources.SILENT){var u;(u=this.emitter).emit.apply(u,s)}}}}]),t}();e.Range=_,e.default=O},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=n(0),s=r(a),u=n(3),c=r(u),f=function(t){function e(){return o(this,e),i(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return l(e,t),e}(s.default.Container);f.allowedChildren=[c.default,u.BlockEmbed,f],e.default=f},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.ColorStyle=e.ColorClass=e.ColorAttributor=void 0;var l=function(){function t(t,e){for(var n=0;n1){var u=o.formats(),c=this.quill.getFormat(t.index-1,1);i=A.default.attributes.diff(u,c)||{}}}var f=/[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(e.prefix)?2:1;this.quill.deleteText(t.index-f,f,S.default.sources.USER),Object.keys(i).length>0&&this.quill.formatLine(t.index-f,f,i,S.default.sources.USER),this.quill.focus()}}function c(t,e){var n=/^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(e.suffix)?2:1;if(!(t.index>=this.quill.getLength()-n)){var r={},o=0,i=this.quill.getLine(t.index),l=b(i,1),a=l[0];if(e.offset>=a.length()-1){var s=this.quill.getLine(t.index+1),u=b(s,1),c=u[0];if(c){var f=a.formats(),h=this.quill.getFormat(t.index,1);r=A.default.attributes.diff(f,h)||{},o=c.length()}}this.quill.deleteText(t.index,n,S.default.sources.USER),Object.keys(r).length>0&&this.quill.formatLine(t.index+o-1,n,r,S.default.sources.USER)}}function f(t){var e=this.quill.getLines(t),n={};if(e.length>1){var r=e[0].formats(),o=e[e.length-1].formats();n=A.default.attributes.diff(o,r)||{}}this.quill.deleteText(t,S.default.sources.USER),Object.keys(n).length>0&&this.quill.formatLine(t.index,1,n,S.default.sources.USER),this.quill.setSelection(t.index,S.default.sources.SILENT),this.quill.focus()}function h(t,e){var n=this;t.length>0&&this.quill.scroll.deleteAt(t.index,t.length);var r=Object.keys(e.format).reduce(function(t,n){return T.default.query(n,T.default.Scope.BLOCK)&&!Array.isArray(e.format[n])&&(t[n]=e.format[n]),t},{});this.quill.insertText(t.index,"\n",r,S.default.sources.USER),this.quill.setSelection(t.index+1,S.default.sources.SILENT),this.quill.focus(),Object.keys(e.format).forEach(function(t){null==r[t]&&(Array.isArray(e.format[t])||"link"!==t&&n.quill.format(t,e.format[t],S.default.sources.USER))})}function p(t){return{key:D.keys.TAB,shiftKey:!t,format:{"code-block":!0},handler:function(e){var n=T.default.query("code-block"),r=e.index,o=e.length,i=this.quill.scroll.descendant(n,r),l=b(i,2),a=l[0],s=l[1];if(null!=a){var u=this.quill.getIndex(a),c=a.newlineIndex(s,!0)+1,f=a.newlineIndex(u+s+o),h=a.domNode.textContent.slice(c,f).split("\n");s=0,h.forEach(function(e,i){t?(a.insertAt(c+s,n.TAB),s+=n.TAB.length,0===i?r+=n.TAB.length:o+=n.TAB.length):e.startsWith(n.TAB)&&(a.deleteAt(c+s,n.TAB.length),s-=n.TAB.length,0===i?r-=n.TAB.length:o-=n.TAB.length),s+=e.length+1}),this.quill.update(S.default.sources.USER),this.quill.setSelection(r,o,S.default.sources.SILENT)}}}}function d(t){return{key:t[0].toUpperCase(),shortKey:!0,handler:function(e,n){this.quill.format(t,!n.format[t],S.default.sources.USER)}}}function y(t){if("string"==typeof t||"number"==typeof t)return y({key:t});if("object"===(void 0===t?"undefined":v(t))&&(t=(0,_.default)(t,!1)),"string"==typeof t.key)if(null!=D.keys[t.key.toUpperCase()])t.key=D.keys[t.key.toUpperCase()];else{if(1!==t.key.length)return null;t.key=t.key.toUpperCase().charCodeAt(0)}return t.shortKey&&(t[B]=t.shortKey,delete t.shortKey),t}Object.defineProperty(e,"__esModule",{value:!0}),e.SHORTKEY=e.default=void 0;var v="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},b=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),g=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=y(t);if(null==r||null==r.key)return I.warn("Attempted to add invalid keyboard binding",r);"function"==typeof e&&(e={handler:e}),"function"==typeof n&&(n={handler:n}),r=(0,k.default)(r,e,n),this.bindings[r.key]=this.bindings[r.key]||[],this.bindings[r.key].push(r)}},{key:"listen",value:function(){var t=this;this.quill.root.addEventListener("keydown",function(n){if(!n.defaultPrevented){var r=n.which||n.keyCode,o=(t.bindings[r]||[]).filter(function(t){return e.match(n,t)});if(0!==o.length){var i=t.quill.getSelection();if(null!=i&&t.quill.hasFocus()){var l=t.quill.getLine(i.index),a=b(l,2),s=a[0],u=a[1],c=t.quill.getLeaf(i.index),f=b(c,2),h=f[0],p=f[1],d=0===i.length?[h,p]:t.quill.getLeaf(i.index+i.length),y=b(d,2),g=y[0],m=y[1],_=h instanceof T.default.Text?h.value().slice(0,p):"",O=g instanceof T.default.Text?g.value().slice(m):"",x={collapsed:0===i.length,empty:0===i.length&&s.length()<=1,format:t.quill.getFormat(i),offset:u,prefix:_,suffix:O};o.some(function(e){if(null!=e.collapsed&&e.collapsed!==x.collapsed)return!1;if(null!=e.empty&&e.empty!==x.empty)return!1;if(null!=e.offset&&e.offset!==x.offset)return!1;if(Array.isArray(e.format)){if(e.format.every(function(t){return null==x.format[t]}))return!1}else if("object"===v(e.format)&&!Object.keys(e.format).every(function(t){return!0===e.format[t]?null!=x.format[t]:!1===e.format[t]?null==x.format[t]:(0,w.default)(e.format[t],x.format[t])}))return!1;return!(null!=e.prefix&&!e.prefix.test(x.prefix))&&(!(null!=e.suffix&&!e.suffix.test(x.suffix))&&!0!==e.handler.call(t,i,x))})&&n.preventDefault()}}}})}}]),e}(R.default);D.keys={BACKSPACE:8,TAB:9,ENTER:13,ESCAPE:27,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46},D.DEFAULTS={bindings:{bold:d("bold"),italic:d("italic"),underline:d("underline"),indent:{key:D.keys.TAB,format:["blockquote","indent","list"],handler:function(t,e){if(e.collapsed&&0!==e.offset)return!0;this.quill.format("indent","+1",S.default.sources.USER)}},outdent:{key:D.keys.TAB,shiftKey:!0,format:["blockquote","indent","list"],handler:function(t,e){if(e.collapsed&&0!==e.offset)return!0;this.quill.format("indent","-1",S.default.sources.USER)}},"outdent backspace":{key:D.keys.BACKSPACE,collapsed:!0,shiftKey:null,metaKey:null,ctrlKey:null,altKey:null,format:["indent","list"],offset:0,handler:function(t,e){null!=e.format.indent?this.quill.format("indent","-1",S.default.sources.USER):null!=e.format.list&&this.quill.format("list",!1,S.default.sources.USER)}},"indent code-block":p(!0),"outdent code-block":p(!1),"remove tab":{key:D.keys.TAB,shiftKey:!0,collapsed:!0,prefix:/\t$/,handler:function(t){this.quill.deleteText(t.index-1,1,S.default.sources.USER)}},tab:{key:D.keys.TAB,handler:function(t){this.quill.history.cutoff();var e=(new N.default).retain(t.index).delete(t.length).insert("\t");this.quill.updateContents(e,S.default.sources.USER),this.quill.history.cutoff(),this.quill.setSelection(t.index+1,S.default.sources.SILENT)}},"list empty enter":{key:D.keys.ENTER,collapsed:!0,format:["list"],empty:!0,handler:function(t,e){this.quill.format("list",!1,S.default.sources.USER),e.format.indent&&this.quill.format("indent",!1,S.default.sources.USER)}},"checklist enter":{key:D.keys.ENTER,collapsed:!0,format:{list:"checked"},handler:function(t){var e=this.quill.getLine(t.index),n=b(e,2),r=n[0],o=n[1],i=(0,k.default)({},r.formats(),{list:"checked"}),l=(new N.default).retain(t.index).insert("\n",i).retain(r.length()-o-1).retain(1,{list:"unchecked"});this.quill.updateContents(l,S.default.sources.USER),this.quill.setSelection(t.index+1,S.default.sources.SILENT),this.quill.scrollIntoView()}},"header enter":{key:D.keys.ENTER,collapsed:!0,format:["header"],suffix:/^$/,handler:function(t,e){var n=this.quill.getLine(t.index),r=b(n,2),o=r[0],i=r[1],l=(new N.default).retain(t.index).insert("\n",e.format).retain(o.length()-i-1).retain(1,{header:null});this.quill.updateContents(l,S.default.sources.USER),this.quill.setSelection(t.index+1,S.default.sources.SILENT),this.quill.scrollIntoView()}},"list autofill":{key:" ",collapsed:!0,format:{list:!1},prefix:/^\s*?(\d+\.|-|\*|\[ ?\]|\[x\])$/,handler:function(t,e){var n=e.prefix.length,r=this.quill.getLine(t.index),o=b(r,2),i=o[0],l=o[1];if(l>n)return!0;var a=void 0;switch(e.prefix.trim()){case"[]":case"[ ]":a="unchecked";break;case"[x]":a="checked";break;case"-":case"*":a="bullet";break;default:a="ordered"}this.quill.insertText(t.index," ",S.default.sources.USER),this.quill.history.cutoff();var s=(new N.default).retain(t.index-l).delete(n+1).retain(i.length()-2-l).retain(1,{list:a});this.quill.updateContents(s,S.default.sources.USER),this.quill.history.cutoff(),this.quill.setSelection(t.index-n,S.default.sources.SILENT)}},"code exit":{key:D.keys.ENTER,collapsed:!0,format:["code-block"],prefix:/\n\n$/,suffix:/^\s+$/,handler:function(t){var e=this.quill.getLine(t.index),n=b(e,2),r=n[0],o=n[1],i=(new N.default).retain(t.index+r.length()-o-2).retain(1,{"code-block":null}).delete(1);this.quill.updateContents(i,S.default.sources.USER)}},"embed left":s(D.keys.LEFT,!1),"embed left shift":s(D.keys.LEFT,!0),"embed right":s(D.keys.RIGHT,!1),"embed right shift":s(D.keys.RIGHT,!0)}},e.default=D,e.SHORTKEY=B},function(t,e,n){"use strict";t.exports={align:{"":n(75),center:n(76),right:n(77),justify:n(78)},background:n(79),blockquote:n(80),bold:n(81),clean:n(82),code:n(40),"code-block":n(40),color:n(83),direction:{"":n(84),rtl:n(85)},float:{center:n(86),full:n(87),left:n(88),right:n(89)},formula:n(90),header:{1:n(91),2:n(92)},italic:n(93),image:n(94),indent:{"+1":n(95),"-1":n(96)},link:n(97),list:{ordered:n(98),bullet:n(99),check:n(100)},script:{sub:n(101),super:n(102)},strike:n(103),underline:n(104),video:n(105)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(1),o=function(){function t(t){this.domNode=t,this.domNode[r.DATA_KEY]={blot:this}}return Object.defineProperty(t.prototype,"statics",{get:function(){return this.constructor},enumerable:!0,configurable:!0}),t.create=function(t){if(null==this.tagName)throw new r.ParchmentError("Blot definition missing tagName");var e;return Array.isArray(this.tagName)?("string"==typeof t&&(t=t.toUpperCase(),parseInt(t).toString()===t&&(t=parseInt(t))),e="number"==typeof t?document.createElement(this.tagName[t-1]):this.tagName.indexOf(t)>-1?document.createElement(t):document.createElement(this.tagName[0])):e=document.createElement(this.tagName),this.className&&e.classList.add(this.className),e},t.prototype.attach=function(){null!=this.parent&&(this.scroll=this.parent.scroll)},t.prototype.clone=function(){var t=this.domNode.cloneNode(!1);return r.create(t)},t.prototype.detach=function(){null!=this.parent&&this.parent.removeChild(this),delete this.domNode[r.DATA_KEY]},t.prototype.deleteAt=function(t,e){this.isolate(t,e).remove()},t.prototype.formatAt=function(t,e,n,o){var i=this.isolate(t,e);if(null!=r.query(n,r.Scope.BLOT)&&o)i.wrap(n,o);else if(null!=r.query(n,r.Scope.ATTRIBUTE)){var l=r.create(this.statics.scope);i.wrap(l),l.format(n,o)}},t.prototype.insertAt=function(t,e,n){var o=null==n?r.create("text",e):r.create(e,n),i=this.split(t);this.parent.insertBefore(o,i)},t.prototype.insertInto=function(t,e){void 0===e&&(e=null),null!=this.parent&&this.parent.children.remove(this);var n=null;t.children.insertBefore(this,e),null!=e&&(n=e.domNode),this.domNode.parentNode==t.domNode&&this.domNode.nextSibling==n||t.domNode.insertBefore(this.domNode,n),this.parent=t,this.attach()},t.prototype.isolate=function(t,e){var n=this.split(t);return n.split(e),n},t.prototype.length=function(){return 1},t.prototype.offset=function(t){return void 0===t&&(t=this.parent),null==this.parent||this==t?0:this.parent.children.offset(this)+this.parent.offset(t)},t.prototype.optimize=function(t){null!=this.domNode[r.DATA_KEY]&&delete this.domNode[r.DATA_KEY].mutations},t.prototype.remove=function(){null!=this.domNode.parentNode&&this.domNode.parentNode.removeChild(this.domNode),this.detach()},t.prototype.replace=function(t){null!=t.parent&&(t.parent.insertBefore(this,t.next),t.remove())},t.prototype.replaceWith=function(t,e){var n="string"==typeof t?r.create(t,e):t;return n.replace(this),n},t.prototype.split=function(t,e){return 0===t?this:this.next},t.prototype.update=function(t,e){},t.prototype.wrap=function(t,e){var n="string"==typeof t?r.create(t,e):t;return null!=this.parent&&this.parent.insertBefore(n,this.next),n.appendChild(this),n},t.blotName="abstract",t}();e.default=o},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(11),o=n(29),i=n(30),l=n(1),a=function(){function t(t){this.attributes={},this.domNode=t,this.build()}return t.prototype.attribute=function(t,e){e?t.add(this.domNode,e)&&(null!=t.value(this.domNode)?this.attributes[t.attrName]=t:delete this.attributes[t.attrName]):(t.remove(this.domNode),delete this.attributes[t.attrName])},t.prototype.build=function(){var t=this;this.attributes={};var e=r.default.keys(this.domNode),n=o.default.keys(this.domNode),a=i.default.keys(this.domNode);e.concat(n).concat(a).forEach(function(e){var n=l.query(e,l.Scope.ATTRIBUTE);n instanceof r.default&&(t.attributes[n.attrName]=n)})},t.prototype.copy=function(t){var e=this;Object.keys(this.attributes).forEach(function(n){var r=e.attributes[n].value(e.domNode);t.format(n,r)})},t.prototype.move=function(t){var e=this;this.copy(t),Object.keys(this.attributes).forEach(function(t){e.attributes[t].remove(e.domNode)}),this.attributes={}},t.prototype.values=function(){var t=this;return Object.keys(this.attributes).reduce(function(e,n){return e[n]=t.attributes[n].value(t.domNode),e},{})},t}();e.default=a},function(t,e,n){"use strict";function r(t,e){return(t.getAttribute("class")||"").split(/\s+/).filter(function(t){return 0===t.indexOf(e+"-")})}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(11),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.keys=function(t){return(t.getAttribute("class")||"").split(/\s+/).map(function(t){return t.split("-").slice(0,-1).join("-")})},e.prototype.add=function(t,e){return!!this.canAdd(t,e)&&(this.remove(t),t.classList.add(this.keyName+"-"+e),!0)},e.prototype.remove=function(t){r(t,this.keyName).forEach(function(e){t.classList.remove(e)}),0===t.classList.length&&t.removeAttribute("class")},e.prototype.value=function(t){var e=r(t,this.keyName)[0]||"",n=e.slice(this.keyName.length+1);return this.canAdd(t,n)?n:""},e}(i.default);e.default=l},function(t,e,n){"use strict";function r(t){var e=t.split("-"),n=e.slice(1).map(function(t){return t[0].toUpperCase()+t.slice(1)}).join("");return e[0]+n}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(11),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.keys=function(t){return(t.getAttribute("style")||"").split(";").map(function(t){return t.split(":")[0].trim()})},e.prototype.add=function(t,e){return!!this.canAdd(t,e)&&(t.style[r(this.keyName)]=e,!0)},e.prototype.remove=function(t){t.style[r(this.keyName)]="",t.getAttribute("style")||t.removeAttribute("style")},e.prototype.value=function(t){var e=t.style[r(this.keyName)];return this.canAdd(t,e)?e:""},e}(i.default);e.default=l},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},u=function(){function t(t,e){for(var n=0;n '},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;nr.right&&(i=r.right-o.right,this.root.style.left=e+i+"px"),o.leftr.bottom){var l=o.bottom-o.top,a=t.bottom-t.top+l;this.root.style.top=n-a+"px",this.root.classList.add("ql-flip")}return i}},{key:"show",value:function(){this.root.classList.remove("ql-editing"),this.root.classList.remove("ql-hidden")}}]),t}();e.default=i},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t){var e=t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtube\.com\/watch.*v=([a-zA-Z0-9_-]+)/)||t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtu\.be\/([a-zA-Z0-9_-]+)/);return e?(e[1]||"https")+"://www.youtube.com/embed/"+e[2]+"?showinfo=0":(e=t.match(/^(?:(https?):\/\/)?(?:www\.)?vimeo\.com\/(\d+)/))?(e[1]||"https")+"://player.vimeo.com/video/"+e[2]+"/":t}function s(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];e.forEach(function(e){var r=document.createElement("option");e===n?r.setAttribute("selected","selected"):r.setAttribute("value",e),t.appendChild(r)})}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.BaseTooltip=void 0;var u=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:"link",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.root.classList.remove("ql-hidden"),this.root.classList.add("ql-editing"),null!=e?this.textbox.value=e:t!==this.root.getAttribute("data-mode")&&(this.textbox.value=""),this.position(this.quill.getBounds(this.quill.selection.savedRange)),this.textbox.select(),this.textbox.setAttribute("placeholder",this.textbox.getAttribute("data-"+t)||""),this.root.setAttribute("data-mode",t)}},{key:"restoreFocus",value:function(){var t=this.quill.scrollingContainer.scrollTop;this.quill.focus(),this.quill.scrollingContainer.scrollTop=t}},{key:"save",value:function(){var t=this.textbox.value;switch(this.root.getAttribute("data-mode")){case"link":var e=this.quill.root.scrollTop;this.linkRange?(this.quill.formatText(this.linkRange,"link",t,v.default.sources.USER),delete this.linkRange):(this.restoreFocus(),this.quill.format("link",t,v.default.sources.USER)),this.quill.root.scrollTop=e;break;case"video":t=a(t);case"formula":if(!t)break;var n=this.quill.getSelection(!0);if(null!=n){var r=n.index+n.length;this.quill.insertEmbed(r,this.root.getAttribute("data-mode"),t,v.default.sources.USER),"formula"===this.root.getAttribute("data-mode")&&this.quill.insertText(r+1," ",v.default.sources.USER),this.quill.setSelection(r+2,v.default.sources.USER)}}this.textbox.value="",this.hide()}}]),e}(A.default);e.BaseTooltip=M,e.default=L},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(46),i=r(o),l=n(34),a=n(36),s=n(62),u=n(63),c=r(u),f=n(64),h=r(f),p=n(65),d=r(p),y=n(35),v=n(24),b=n(37),g=n(38),m=n(39),_=r(m),O=n(66),w=r(O),x=n(15),k=r(x),E=n(67),N=r(E),j=n(68),A=r(j),q=n(69),T=r(q),P=n(70),S=r(P),C=n(71),L=r(C),M=n(13),R=r(M),I=n(72),B=r(I),D=n(73),U=r(D),F=n(74),H=r(F),K=n(26),z=r(K),Z=n(16),V=r(Z),W=n(41),G=r(W),Y=n(42),X=r(Y),$=n(43),Q=r($),J=n(107),tt=r(J),et=n(108),nt=r(et);i.default.register({"attributors/attribute/direction":a.DirectionAttribute,"attributors/class/align":l.AlignClass,"attributors/class/background":y.BackgroundClass,"attributors/class/color":v.ColorClass,"attributors/class/direction":a.DirectionClass,"attributors/class/font":b.FontClass,"attributors/class/size":g.SizeClass,"attributors/style/align":l.AlignStyle,"attributors/style/background":y.BackgroundStyle,"attributors/style/color":v.ColorStyle,"attributors/style/direction":a.DirectionStyle,"attributors/style/font":b.FontStyle,"attributors/style/size":g.SizeStyle},!0),i.default.register({"formats/align":l.AlignClass,"formats/direction":a.DirectionClass,"formats/indent":s.IndentClass,"formats/background":y.BackgroundStyle,"formats/color":v.ColorStyle,"formats/font":b.FontClass,"formats/size":g.SizeClass,"formats/blockquote":c.default,"formats/code-block":R.default,"formats/header":h.default,"formats/list":d.default,"formats/bold":_.default,"formats/code":M.Code,"formats/italic":w.default,"formats/link":k.default,"formats/script":N.default,"formats/strike":A.default,"formats/underline":T.default,"formats/image":S.default,"formats/video":L.default,"formats/list/item":p.ListItem,"modules/formula":B.default,"modules/syntax":U.default,"modules/toolbar":H.default,"themes/bubble":tt.default,"themes/snow":nt.default,"ui/icons":z.default,"ui/picker":V.default,"ui/icon-picker":X.default,"ui/color-picker":G.default,"ui/tooltip":Q.default},!0),e.default=i.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),i=r(o),l=n(6),a=r(l),s=n(3),u=r(s),c=n(14),f=r(c),h=n(23),p=r(h),d=n(31),y=r(d),v=n(33),b=r(v),g=n(5),m=r(g),_=n(59),O=r(_),w=n(8),x=r(w),k=n(60),E=r(k),N=n(61),j=r(N),A=n(25),q=r(A);a.default.register({"blots/block":u.default,"blots/block/embed":s.BlockEmbed,"blots/break":f.default,"blots/container":p.default,"blots/cursor":y.default,"blots/embed":b.default,"blots/inline":m.default,"blots/scroll":O.default,"blots/text":x.default,"modules/clipboard":E.default,"modules/history":j.default,"modules/keyboard":q.default}),i.default.register(u.default,f.default,y.default,m.default,O.default,x.default),e.default=a.default},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(){this.head=this.tail=null,this.length=0}return t.prototype.append=function(){for(var t=[],e=0;e1&&this.append.apply(this,t.slice(1))},t.prototype.contains=function(t){for(var e,n=this.iterator();e=n();)if(e===t)return!0;return!1},t.prototype.insertBefore=function(t,e){t&&(t.next=e,null!=e?(t.prev=e.prev,null!=e.prev&&(e.prev.next=t),e.prev=t,e===this.head&&(this.head=t)):null!=this.tail?(this.tail.next=t,t.prev=this.tail,this.tail=t):(t.prev=null,this.head=this.tail=t),this.length+=1)},t.prototype.offset=function(t){for(var e=0,n=this.head;null!=n;){if(n===t)return e;e+=n.length(),n=n.next}return-1},t.prototype.remove=function(t){this.contains(t)&&(null!=t.prev&&(t.prev.next=t.next),null!=t.next&&(t.next.prev=t.prev),t===this.head&&(this.head=t.next),t===this.tail&&(this.tail=t.prev),this.length-=1)},t.prototype.iterator=function(t){return void 0===t&&(t=this.head),function(){var e=t;return null!=t&&(t=t.next),e}},t.prototype.find=function(t,e){void 0===e&&(e=!1);for(var n,r=this.iterator();n=r();){var o=n.length();if(ta?n(r,t-a,Math.min(e,a+u-t)):n(r,0,Math.min(u,t+e-a)),a+=u}},t.prototype.map=function(t){return this.reduce(function(e,n){return e.push(t(n)),e},[])},t.prototype.reduce=function(t,e){for(var n,r=this.iterator();n=r();)e=t(e,n);return e},t}();e.default=r},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(17),i=n(1),l={attributes:!0,characterData:!0,characterDataOldValue:!0,childList:!0,subtree:!0},a=function(t){function e(e){var n=t.call(this,e)||this;return n.scroll=n,n.observer=new MutationObserver(function(t){n.update(t)}),n.observer.observe(n.domNode,l),n.attach(),n}return r(e,t),e.prototype.detach=function(){t.prototype.detach.call(this),this.observer.disconnect()},e.prototype.deleteAt=function(e,n){this.update(),0===e&&n===this.length()?this.children.forEach(function(t){t.remove()}):t.prototype.deleteAt.call(this,e,n)},e.prototype.formatAt=function(e,n,r,o){this.update(),t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.insertAt=function(e,n,r){this.update(),t.prototype.insertAt.call(this,e,n,r)},e.prototype.optimize=function(e,n){var r=this;void 0===e&&(e=[]),void 0===n&&(n={}),t.prototype.optimize.call(this,n);for(var l=[].slice.call(this.observer.takeRecords());l.length>0;)e.push(l.pop());for(var a=function(t,e){void 0===e&&(e=!0),null!=t&&t!==r&&null!=t.domNode.parentNode&&(null==t.domNode[i.DATA_KEY].mutations&&(t.domNode[i.DATA_KEY].mutations=[]),e&&a(t.parent))},s=function(t){null!=t.domNode[i.DATA_KEY]&&null!=t.domNode[i.DATA_KEY].mutations&&(t instanceof o.default&&t.children.forEach(s),t.optimize(n))},u=e,c=0;u.length>0;c+=1){if(c>=100)throw new Error("[Parchment] Maximum optimize iterations reached");for(u.forEach(function(t){var e=i.find(t.target,!0);null!=e&&(e.domNode===t.target&&("childList"===t.type?(a(i.find(t.previousSibling,!1)),[].forEach.call(t.addedNodes,function(t){var e=i.find(t,!1);a(e,!1),e instanceof o.default&&e.children.forEach(function(t){a(t,!1)})})):"attributes"===t.type&&a(e.prev)),a(e))}),this.children.forEach(s),u=[].slice.call(this.observer.takeRecords()),l=u.slice();l.length>0;)e.push(l.pop())}},e.prototype.update=function(e,n){var r=this;void 0===n&&(n={}),e=e||this.observer.takeRecords(),e.map(function(t){var e=i.find(t.target,!0);return null==e?null:null==e.domNode[i.DATA_KEY].mutations?(e.domNode[i.DATA_KEY].mutations=[t],e):(e.domNode[i.DATA_KEY].mutations.push(t),null)}).forEach(function(t){null!=t&&t!==r&&null!=t.domNode[i.DATA_KEY]&&t.update(t.domNode[i.DATA_KEY].mutations||[],n)}),null!=this.domNode[i.DATA_KEY].mutations&&t.prototype.update.call(this,this.domNode[i.DATA_KEY].mutations,n),this.optimize(e,n)},e.blotName="scroll",e.defaultChild="block",e.scope=i.Scope.BLOCK_BLOT,e.tagName="DIV",e}(o.default);e.default=a},function(t,e,n){"use strict";function r(t,e){if(Object.keys(t).length!==Object.keys(e).length)return!1;for(var n in t)if(t[n]!==e[n])return!1;return!0}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(18),l=n(1),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.formats=function(n){if(n.tagName!==e.tagName)return t.formats.call(this,n)},e.prototype.format=function(n,r){var o=this;n!==this.statics.blotName||r?t.prototype.format.call(this,n,r):(this.children.forEach(function(t){t instanceof i.default||(t=t.wrap(e.blotName,!0)),o.attributes.copy(t)}),this.unwrap())},e.prototype.formatAt=function(e,n,r,o){if(null!=this.formats()[r]||l.query(r,l.Scope.ATTRIBUTE)){this.isolate(e,n).format(r,o)}else t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.optimize=function(n){t.prototype.optimize.call(this,n);var o=this.formats();if(0===Object.keys(o).length)return this.unwrap();var i=this.next;i instanceof e&&i.prev===this&&r(o,i.formats())&&(i.moveChildren(this),i.remove())},e.blotName="inline",e.scope=l.Scope.INLINE_BLOT,e.tagName="SPAN",e}(i.default);e.default=a},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(18),i=n(1),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.formats=function(n){var r=i.query(e.blotName).tagName;if(n.tagName!==r)return t.formats.call(this,n)},e.prototype.format=function(n,r){null!=i.query(n,i.Scope.BLOCK)&&(n!==this.statics.blotName||r?t.prototype.format.call(this,n,r):this.replaceWith(e.blotName))},e.prototype.formatAt=function(e,n,r,o){null!=i.query(r,i.Scope.BLOCK)?this.format(r,o):t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.insertAt=function(e,n,r){if(null==r||null!=i.query(n,i.Scope.INLINE))t.prototype.insertAt.call(this,e,n,r);else{var o=this.split(e),l=i.create(n,r);o.parent.insertBefore(l,o)}},e.prototype.update=function(e,n){navigator.userAgent.match(/Trident/)?this.build():t.prototype.update.call(this,e,n)},e.blotName="block",e.scope=i.Scope.BLOCK_BLOT,e.tagName="P",e}(o.default);e.default=l},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(19),i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.formats=function(t){},e.prototype.format=function(e,n){t.prototype.formatAt.call(this,0,this.length(),e,n)},e.prototype.formatAt=function(e,n,r,o){0===e&&n===this.length()?this.format(r,o):t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.formats=function(){return this.statics.formats(this.domNode)},e}(o.default);e.default=i},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(19),i=n(1),l=function(t){function e(e){var n=t.call(this,e)||this;return n.text=n.statics.value(n.domNode),n}return r(e,t),e.create=function(t){return document.createTextNode(t)},e.value=function(t){var e=t.data;return e.normalize&&(e=e.normalize()),e},e.prototype.deleteAt=function(t,e){this.domNode.data=this.text=this.text.slice(0,t)+this.text.slice(t+e)},e.prototype.index=function(t,e){return this.domNode===t?e:-1},e.prototype.insertAt=function(e,n,r){null==r?(this.text=this.text.slice(0,e)+n+this.text.slice(e),this.domNode.data=this.text):t.prototype.insertAt.call(this,e,n,r)},e.prototype.length=function(){return this.text.length},e.prototype.optimize=function(n){t.prototype.optimize.call(this,n),this.text=this.statics.value(this.domNode),0===this.text.length?this.remove():this.next instanceof e&&this.next.prev===this&&(this.insertAt(this.length(),this.next.value()),this.next.remove())},e.prototype.position=function(t,e){return void 0===e&&(e=!1),[this.domNode,t]},e.prototype.split=function(t,e){if(void 0===e&&(e=!1),!e){if(0===t)return this;if(t===this.length())return this.next}var n=i.create(this.domNode.splitText(t));return this.parent.insertBefore(n,this.next),this.text=this.statics.value(this.domNode),n},e.prototype.update=function(t,e){var n=this;t.some(function(t){return"characterData"===t.type&&t.target===n.domNode})&&(this.text=this.statics.value(this.domNode))},e.prototype.value=function(){return this.text},e.blotName="text",e.scope=i.Scope.INLINE_BLOT,e}(o.default);e.default=l},function(t,e,n){"use strict";var r=document.createElement("div");if(r.classList.toggle("test-class",!1),r.classList.contains("test-class")){var o=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(t,e){return arguments.length>1&&!this.contains(t)==!e?e:o.call(this,t)}}String.prototype.startsWith||(String.prototype.startsWith=function(t,e){return e=e||0,this.substr(e,t.length)===t}),String.prototype.endsWith||(String.prototype.endsWith=function(t,e){var n=this.toString();("number"!=typeof e||!isFinite(e)||Math.floor(e)!==e||e>n.length)&&(e=n.length),e-=t.length;var r=n.indexOf(t,e);return-1!==r&&r===e}),Array.prototype.find||Object.defineProperty(Array.prototype,"find",{value:function(t){if(null===this)throw new TypeError("Array.prototype.find called on null or undefined");if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var e,n=Object(this),r=n.length>>>0,o=arguments[1],i=0;ie.length?t:e,l=t.length>e.length?e:t,a=i.indexOf(l);if(-1!=a)return r=[[y,i.substring(0,a)],[v,l],[y,i.substring(a+l.length)]],t.length>e.length&&(r[0][0]=r[2][0]=d),r;if(1==l.length)return[[d,t],[y,e]];var u=s(t,e);if(u){var c=u[0],f=u[1],h=u[2],p=u[3],b=u[4],g=n(c,h),m=n(f,p);return g.concat([[v,b]],m)}return o(t,e)}function o(t,e){for(var n=t.length,r=e.length,o=Math.ceil((n+r)/2),l=o,a=2*o,s=new Array(a),u=new Array(a),c=0;cn)v+=2;else if(x>r)p+=2;else if(h){var k=l+f-_;if(k>=0&&k=E)return i(t,e,O,x)}}}for(var N=-m+b;N<=m-g;N+=2){var E,k=l+N;E=N==-m||N!=m&&u[k-1]n)g+=2;else if(j>r)b+=2;else if(!h){var w=l+f-N;if(w>=0&&w=E)return i(t,e,O,x)}}}}return[[d,t],[y,e]]}function i(t,e,r,o){var i=t.substring(0,r),l=e.substring(0,o),a=t.substring(r),s=e.substring(o),u=n(i,l),c=n(a,s);return u.concat(c)}function l(t,e){if(!t||!e||t.charAt(0)!=e.charAt(0))return 0;for(var n=0,r=Math.min(t.length,e.length),o=r,i=0;n=t.length?[r,o,i,s,f]:null}var r=t.length>e.length?t:e,o=t.length>e.length?e:t;if(r.length<4||2*o.lengthu[4].length?s:u:s;var c,f,h,p;return t.length>e.length?(c=i[0],f=i[1],h=i[2],p=i[3]):(h=i[0],p=i[1],c=i[2],f=i[3]),[c,f,h,p,i[4]]}function u(t){t.push([v,""]);for(var e,n=0,r=0,o=0,i="",s="";n1?(0!==r&&0!==o&&(e=l(s,i),0!==e&&(n-r-o>0&&t[n-r-o-1][0]==v?t[n-r-o-1][1]+=s.substring(0,e):(t.splice(0,0,[v,s.substring(0,e)]),n++),s=s.substring(e),i=i.substring(e)),0!==(e=a(s,i))&&(t[n][1]=s.substring(s.length-e)+t[n][1],s=s.substring(0,s.length-e),i=i.substring(0,i.length-e))),0===r?t.splice(n-o,r+o,[y,s]):0===o?t.splice(n-r,r+o,[d,i]):t.splice(n-r-o,r+o,[d,i],[y,s]),n=n-r-o+(r?1:0)+(o?1:0)+1):0!==n&&t[n-1][0]==v?(t[n-1][1]+=t[n][1],t.splice(n,1)):n++,o=0,r=0,i="",s=""}""===t[t.length-1][1]&&t.pop();var c=!1;for(n=1;n0&&r.splice(o+2,0,[l[0],a]),p(r,o,3)}return t}function h(t){for(var e=!1,n=function(t){return t.charCodeAt(0)>=56320&&t.charCodeAt(0)<=57343},r=2;r=55296&&t.charCodeAt(t.length-1)<=56319}(t[r-2][1])&&t[r-1][0]===d&&n(t[r-1][1])&&t[r][0]===y&&n(t[r][1])&&(e=!0,t[r-1][1]=t[r-2][1].slice(-1)+t[r-1][1],t[r][1]=t[r-2][1].slice(-1)+t[r][1],t[r-2][1]=t[r-2][1].slice(0,-1));if(!e)return t;for(var o=[],r=0;r0&&o.push(t[r]);return o}function p(t,e,n){for(var r=e+n-1;r>=0&&r>=e-1;r--)if(r+1=r&&!a.endsWith("\n")&&(n=!0),e.scroll.insertAt(t,a);var c=e.scroll.line(t),f=u(c,2),h=f[0],p=f[1],y=(0,T.default)({},(0,O.bubbleFormats)(h));if(h instanceof w.default){var b=h.descendant(v.default.Leaf,p),g=u(b,1),m=g[0];y=(0,T.default)(y,(0,O.bubbleFormats)(m))}l=d.default.attributes.diff(y,l)||{}}else if("object"===s(o.insert)){var _=Object.keys(o.insert)[0];if(null==_)return t;e.scroll.insertAt(t,_,o.insert[_])}r+=i}return Object.keys(l).forEach(function(n){e.scroll.formatAt(t,i,n,l[n])}),t+i},0),t.reduce(function(t,n){return"number"==typeof n.delete?(e.scroll.deleteAt(t,n.delete),t):t+(n.retain||n.insert.length||1)},0),this.scroll.batchEnd(),this.update(t)}},{key:"deleteText",value:function(t,e){return this.scroll.deleteAt(t,e),this.update((new h.default).retain(t).delete(e))}},{key:"formatLine",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.scroll.update(),Object.keys(r).forEach(function(o){if(null==n.scroll.whitelist||n.scroll.whitelist[o]){var i=n.scroll.lines(t,Math.max(e,1)),l=e;i.forEach(function(e){var i=e.length();if(e instanceof g.default){var a=t-e.offset(n.scroll),s=e.newlineIndex(a+l)-a+1;e.formatAt(a,s,o,r[o])}else e.format(o,r[o]);l-=i})}}),this.scroll.optimize(),this.update((new h.default).retain(t).retain(e,(0,N.default)(r)))}},{key:"formatText",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return Object.keys(r).forEach(function(o){n.scroll.formatAt(t,e,o,r[o])}),this.update((new h.default).retain(t).retain(e,(0,N.default)(r)))}},{key:"getContents",value:function(t,e){return this.delta.slice(t,t+e)}},{key:"getDelta",value:function(){return this.scroll.lines().reduce(function(t,e){return t.concat(e.delta())},new h.default)}},{key:"getFormat",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=[],r=[];0===e?this.scroll.path(t).forEach(function(t){var e=u(t,1),o=e[0];o instanceof w.default?n.push(o):o instanceof v.default.Leaf&&r.push(o)}):(n=this.scroll.lines(t,e),r=this.scroll.descendants(v.default.Leaf,t,e));var o=[n,r].map(function(t){if(0===t.length)return{};for(var e=(0,O.bubbleFormats)(t.shift());Object.keys(e).length>0;){var n=t.shift();if(null==n)return e;e=l((0,O.bubbleFormats)(n),e)}return e});return T.default.apply(T.default,o)}},{key:"getText",value:function(t,e){return this.getContents(t,e).filter(function(t){return"string"==typeof t.insert}).map(function(t){return t.insert}).join("")}},{key:"insertEmbed",value:function(t,e,n){return this.scroll.insertAt(t,e,n),this.update((new h.default).retain(t).insert(o({},e,n)))}},{key:"insertText",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return e=e.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),this.scroll.insertAt(t,e),Object.keys(r).forEach(function(o){n.scroll.formatAt(t,e.length,o,r[o])}),this.update((new h.default).retain(t).insert(e,(0,N.default)(r)))}},{key:"isBlank",value:function(){if(0==this.scroll.children.length)return!0;if(this.scroll.children.length>1)return!1;var t=this.scroll.children.head;return t.statics.blotName===w.default.blotName&&(!(t.children.length>1)&&t.children.head instanceof k.default)}},{key:"removeFormat",value:function(t,e){var n=this.getText(t,e),r=this.scroll.line(t+e),o=u(r,2),i=o[0],l=o[1],a=0,s=new h.default;null!=i&&(a=i instanceof g.default?i.newlineIndex(l)-l+1:i.length()-l,s=i.delta().slice(l,l+a-1).insert("\n"));var c=this.getContents(t,e+a),f=c.diff((new h.default).insert(n).concat(s)),p=(new h.default).retain(t).concat(f);return this.applyDelta(p)}},{key:"update",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,r=this.delta;if(1===e.length&&"characterData"===e[0].type&&e[0].target.data.match(P)&&v.default.find(e[0].target)){var o=v.default.find(e[0].target),i=(0,O.bubbleFormats)(o),l=o.offset(this.scroll),a=e[0].oldValue.replace(_.default.CONTENTS,""),s=(new h.default).insert(a),u=(new h.default).insert(o.value());t=(new h.default).retain(l).concat(s.diff(u,n)).reduce(function(t,e){return e.insert?t.insert(e.insert,i):t.push(e)},new h.default),this.delta=r.compose(t)}else this.delta=this.getDelta(),t&&(0,A.default)(r.compose(t),this.delta)||(t=r.diff(this.delta,n));return t}}]),t}();e.default=S},function(t,e){"use strict";function n(){}function r(t,e,n){this.fn=t,this.context=e,this.once=n||!1}function o(){this._events=new n,this._eventsCount=0}var i=Object.prototype.hasOwnProperty,l="~";Object.create&&(n.prototype=Object.create(null),(new n).__proto__||(l=!1)),o.prototype.eventNames=function(){var t,e,n=[];if(0===this._eventsCount)return n;for(e in t=this._events)i.call(t,e)&&n.push(l?e.slice(1):e);return Object.getOwnPropertySymbols?n.concat(Object.getOwnPropertySymbols(t)):n},o.prototype.listeners=function(t,e){var n=l?l+t:t,r=this._events[n];if(e)return!!r;if(!r)return[];if(r.fn)return[r.fn];for(var o=0,i=r.length,a=new Array(i);o0){if(i instanceof y.BlockEmbed||f instanceof y.BlockEmbed)return void this.optimize();if(i instanceof _.default){var h=i.newlineIndex(i.length(),!0);if(h>-1&&(i=i.split(h+1))===f)return void this.optimize()}else if(f instanceof _.default){var p=f.newlineIndex(0);p>-1&&f.split(p+1)}var d=f.children.head instanceof g.default?null:f.children.head;i.moveChildren(f,d),i.remove()}this.optimize()}},{key:"enable",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.domNode.setAttribute("contenteditable",t)}},{key:"formatAt",value:function(t,n,r,o){(null==this.whitelist||this.whitelist[r])&&(c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"formatAt",this).call(this,t,n,r,o),this.optimize())}},{key:"insertAt",value:function(t,n,r){if(null==r||null==this.whitelist||this.whitelist[n]){if(t>=this.length())if(null==r||null==h.default.query(n,h.default.Scope.BLOCK)){var o=h.default.create(this.statics.defaultChild);this.appendChild(o),null==r&&n.endsWith("\n")&&(n=n.slice(0,-1)),o.insertAt(0,n,r)}else{var i=h.default.create(n,r);this.appendChild(i)}else c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertAt",this).call(this,t,n,r);this.optimize()}}},{key:"insertBefore",value:function(t,n){if(t.statics.scope===h.default.Scope.INLINE_BLOT){var r=h.default.create(this.statics.defaultChild);r.appendChild(t),t=r}c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertBefore",this).call(this,t,n)}},{key:"leaf",value:function(t){return this.path(t).pop()||[null,-1]}},{key:"line",value:function(t){return t===this.length()?this.line(t-1):this.descendant(a,t)}},{key:"lines",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE;return function t(e,n,r){var o=[],i=r;return e.children.forEachAt(n,r,function(e,n,r){a(e)?o.push(e):e instanceof h.default.Container&&(o=o.concat(t(e,n,i))),i-=r}),o}(this,t,e)}},{key:"optimize",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};!0!==this.batch&&(c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"optimize",this).call(this,t,n),t.length>0&&this.emitter.emit(d.default.events.SCROLL_OPTIMIZE,t,n))}},{key:"path",value:function(t){return c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"path",this).call(this,t).slice(1)}},{key:"update",value:function(t){if(!0!==this.batch){var n=d.default.sources.USER;"string"==typeof t&&(n=t),Array.isArray(t)||(t=this.observer.takeRecords()),t.length>0&&this.emitter.emit(d.default.events.SCROLL_BEFORE_UPDATE,n,t),c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"update",this).call(this,t.concat([])),t.length>0&&this.emitter.emit(d.default.events.SCROLL_UPDATE,n,t)}}}]),e}(h.default.Scroll);x.blotName="scroll",x.className="ql-editor",x.tagName="DIV",x.defaultChild="block",x.allowedChildren=[v.default,y.BlockEmbed,w.default],e.default=x},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function s(t,e,n){return"object"===(void 0===e?"undefined":x(e))?Object.keys(e).reduce(function(t,n){return s(t,n,e[n])},t):t.reduce(function(t,r){return r.attributes&&r.attributes[e]?t.push(r):t.insert(r.insert,(0,j.default)({},o({},e,n),r.attributes))},new q.default)}function u(t){if(t.nodeType!==Node.ELEMENT_NODE)return{};return t["__ql-computed-style"]||(t["__ql-computed-style"]=window.getComputedStyle(t))}function c(t,e){for(var n="",r=t.ops.length-1;r>=0&&n.length-1}function h(t,e,n){return t.nodeType===t.TEXT_NODE?n.reduce(function(e,n){return n(t,e)},new q.default):t.nodeType===t.ELEMENT_NODE?[].reduce.call(t.childNodes||[],function(r,o){var i=h(o,e,n);return o.nodeType===t.ELEMENT_NODE&&(i=e.reduce(function(t,e){return e(o,t)},i),i=(o[W]||[]).reduce(function(t,e){return e(o,t)},i)),r.concat(i)},new q.default):new q.default}function p(t,e,n){return s(n,t,!0)}function d(t,e){var n=P.default.Attributor.Attribute.keys(t),r=P.default.Attributor.Class.keys(t),o=P.default.Attributor.Style.keys(t),i={};return n.concat(r).concat(o).forEach(function(e){var n=P.default.query(e,P.default.Scope.ATTRIBUTE);null!=n&&(i[n.attrName]=n.value(t),i[n.attrName])||(n=Y[e],null==n||n.attrName!==e&&n.keyName!==e||(i[n.attrName]=n.value(t)||void 0),null==(n=X[e])||n.attrName!==e&&n.keyName!==e||(n=X[e],i[n.attrName]=n.value(t)||void 0))}),Object.keys(i).length>0&&(e=s(e,i)),e}function y(t,e){var n=P.default.query(t);if(null==n)return e;if(n.prototype instanceof P.default.Embed){var r={},o=n.value(t);null!=o&&(r[n.blotName]=o,e=(new q.default).insert(r,n.formats(t)))}else"function"==typeof n.formats&&(e=s(e,n.blotName,n.formats(t)));return e}function v(t,e){return c(e,"\n")||e.insert("\n"),e}function b(){return new q.default}function g(t,e){var n=P.default.query(t);if(null==n||"list-item"!==n.blotName||!c(e,"\n"))return e;for(var r=-1,o=t.parentNode;!o.classList.contains("ql-clipboard");)"list"===(P.default.query(o)||{}).blotName&&(r+=1),o=o.parentNode;return r<=0?e:e.compose((new q.default).retain(e.length()-1).retain(1,{indent:r}))}function m(t,e){return c(e,"\n")||(f(t)||e.length()>0&&t.nextSibling&&f(t.nextSibling))&&e.insert("\n"),e}function _(t,e){if(f(t)&&null!=t.nextElementSibling&&!c(e,"\n\n")){var n=t.offsetHeight+parseFloat(u(t).marginTop)+parseFloat(u(t).marginBottom);t.nextElementSibling.offsetTop>t.offsetTop+1.5*n&&e.insert("\n")}return e}function O(t,e){var n={},r=t.style||{};return r.fontStyle&&"italic"===u(t).fontStyle&&(n.italic=!0),r.fontWeight&&(u(t).fontWeight.startsWith("bold")||parseInt(u(t).fontWeight)>=700)&&(n.bold=!0),Object.keys(n).length>0&&(e=s(e,n)),parseFloat(r.textIndent||0)>0&&(e=(new q.default).insert("\t").concat(e)),e}function w(t,e){var n=t.data;if("O:P"===t.parentNode.tagName)return e.insert(n.trim());if(0===n.trim().length&&t.parentNode.classList.contains("ql-clipboard"))return e;if(!u(t.parentNode).whiteSpace.startsWith("pre")){var r=function(t,e){return e=e.replace(/[^\u00a0]/g,""),e.length<1&&t?" ":e};n=n.replace(/\r\n/g," ").replace(/\n/g," "),n=n.replace(/\s\s+/g,r.bind(r,!0)),(null==t.previousSibling&&f(t.parentNode)||null!=t.previousSibling&&f(t.previousSibling))&&(n=n.replace(/^\s+/,r.bind(r,!1))),(null==t.nextSibling&&f(t.parentNode)||null!=t.nextSibling&&f(t.nextSibling))&&(n=n.replace(/\s+$/,r.bind(r,!1)))}return e.insert(n)}Object.defineProperty(e,"__esModule",{value:!0}),e.matchText=e.matchSpacing=e.matchNewline=e.matchBlot=e.matchAttributor=e.default=void 0;var x="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},k=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),E=function(){function t(t,e){for(var n=0;n\r?\n +\<"),this.convert();var e=this.quill.getFormat(this.quill.selection.savedRange.index);if(e[F.default.blotName]){var n=this.container.innerText;return this.container.innerHTML="",(new q.default).insert(n,o({},F.default.blotName,e[F.default.blotName]))}var r=this.prepareMatching(),i=k(r,2),l=i[0],a=i[1],s=h(this.container,l,a);return c(s,"\n")&&null==s.ops[s.ops.length-1].attributes&&(s=s.compose((new q.default).retain(s.length()-1).delete(1))),V.log("convert",this.container.innerHTML,s),this.container.innerHTML="",s}},{key:"dangerouslyPasteHTML",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:C.default.sources.API;if("string"==typeof t)this.quill.setContents(this.convert(t),e),this.quill.setSelection(0,C.default.sources.SILENT);else{var r=this.convert(e);this.quill.updateContents((new q.default).retain(t).concat(r),n),this.quill.setSelection(t+r.length(),C.default.sources.SILENT)}}},{key:"onPaste",value:function(t){var e=this;if(!t.defaultPrevented&&this.quill.isEnabled()){var n=this.quill.getSelection(),r=(new q.default).retain(n.index),o=this.quill.scrollingContainer.scrollTop;this.container.focus(),this.quill.selection.update(C.default.sources.SILENT),setTimeout(function(){r=r.concat(e.convert()).delete(n.length),e.quill.updateContents(r,C.default.sources.USER),e.quill.setSelection(r.length()-n.length,C.default.sources.SILENT),e.quill.scrollingContainer.scrollTop=o,e.quill.focus()},1)}}},{key:"prepareMatching",value:function(){var t=this,e=[],n=[];return this.matchers.forEach(function(r){var o=k(r,2),i=o[0],l=o[1];switch(i){case Node.TEXT_NODE:n.push(l);break;case Node.ELEMENT_NODE:e.push(l);break;default:[].forEach.call(t.container.querySelectorAll(i),function(t){t[W]=t[W]||[],t[W].push(l)})}}),[e,n]}}]),e}(I.default);$.DEFAULTS={matchers:[],matchVisual:!0},e.default=$,e.matchAttributor=d,e.matchBlot=y,e.matchNewline=m,e.matchSpacing=_,e.matchText=w},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t){var e=t.ops[t.ops.length-1];return null!=e&&(null!=e.insert?"string"==typeof e.insert&&e.insert.endsWith("\n"):null!=e.attributes&&Object.keys(e.attributes).some(function(t){return null!=f.default.query(t,f.default.Scope.BLOCK)}))}function s(t){var e=t.reduce(function(t,e){return t+=e.delete||0},0),n=t.length()-e;return a(t)&&(n-=1),n}Object.defineProperty(e,"__esModule",{value:!0}),e.getLastChangeIndex=e.default=void 0;var u=function(){function t(t,e){for(var n=0;nr&&this.stack.undo.length>0){var o=this.stack.undo.pop();n=n.compose(o.undo),t=o.redo.compose(t)}else this.lastRecorded=r;this.stack.undo.push({redo:t,undo:n}),this.stack.undo.length>this.options.maxStack&&this.stack.undo.shift()}}},{key:"redo",value:function(){this.change("redo","undo")}},{key:"transform",value:function(t){this.stack.undo.forEach(function(e){e.undo=t.transform(e.undo,!0),e.redo=t.transform(e.redo,!0)}),this.stack.redo.forEach(function(e){e.undo=t.transform(e.undo,!0),e.redo=t.transform(e.redo,!0)})}},{key:"undo",value:function(){this.change("undo","redo")}}]),e}(y.default);v.DEFAULTS={delay:1e3,maxStack:100,userOnly:!1},e.default=v,e.getLastChangeIndex=s},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.IndentClass=void 0;var l=function(){function t(t,e){for(var n=0;n0&&this.children.tail.format(t,e)}},{key:"formats",value:function(){return o({},this.statics.blotName,this.statics.formats(this.domNode))}},{key:"insertBefore",value:function(t,n){if(t instanceof v)u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertBefore",this).call(this,t,n);else{var r=null==n?this.length():n.offset(this),o=this.split(r);o.parent.insertBefore(t,o)}}},{key:"optimize",value:function(t){u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"optimize",this).call(this,t);var n=this.next;null!=n&&n.prev===this&&n.statics.blotName===this.statics.blotName&&n.domNode.tagName===this.domNode.tagName&&n.domNode.getAttribute("data-checked")===this.domNode.getAttribute("data-checked")&&(n.moveChildren(this),n.remove())}},{key:"replace",value:function(t){if(t.statics.blotName!==this.statics.blotName){var n=f.default.create(this.statics.defaultChild);t.moveChildren(n),this.appendChild(n)}u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"replace",this).call(this,t)}}]),e}(y.default);b.blotName="list",b.scope=f.default.Scope.BLOCK_BLOT,b.tagName=["OL","UL"],b.defaultChild="list-item",b.allowedChildren=[v],e.ListItem=v,e.default=b},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=n(39),a=function(t){return t&&t.__esModule?t:{default:t}}(l),s=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),e}(a.default);s.blotName="italic",s.tagName=["EM","I"],e.default=s},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n-1?n?this.domNode.setAttribute(t,n):this.domNode.removeAttribute(t):a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"format",this).call(this,t,n)}}],[{key:"create",value:function(t){var n=a(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,t);return"string"==typeof t&&n.setAttribute("src",this.sanitize(t)),n}},{key:"formats",value:function(t){return f.reduce(function(e,n){return t.hasAttribute(n)&&(e[n]=t.getAttribute(n)),e},{})}},{key:"match",value:function(t){return/\.(jpe?g|gif|png)$/.test(t)||/^data:image\/.+;base64/.test(t)}},{key:"sanitize",value:function(t){return(0,c.sanitize)(t,["http","https","data"])?t:"//:0"}},{key:"value",value:function(t){return t.getAttribute("src")}}]),e}(u.default.Embed);h.blotName="image",h.tagName="IMG",e.default=h},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n-1?n?this.domNode.setAttribute(t,n):this.domNode.removeAttribute(t):a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"format",this).call(this,t,n)}}],[{key:"create",value:function(t){var n=a(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,t);return n.setAttribute("frameborder","0"),n.setAttribute("allowfullscreen",!0),n.setAttribute("src",this.sanitize(t)),n}},{key:"formats",value:function(t){return f.reduce(function(e,n){return t.hasAttribute(n)&&(e[n]=t.getAttribute(n)),e},{})}},{key:"sanitize",value:function(t){return c.default.sanitize(t)}},{key:"value",value:function(t){return t.getAttribute("src")}}]),e}(s.BlockEmbed);h.blotName="video",h.className="ql-video",h.tagName="IFRAME",e.default=h},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.FormulaBlot=void 0;var a=function(){function t(t,e){for(var n=0;n0||null==this.cachedText)&&(this.domNode.innerHTML=t(e),this.domNode.normalize(),this.attach()),this.cachedText=e)}}]),e}(v.default);b.className="ql-syntax";var g=new c.default.Attributor.Class("token","hljs",{scope:c.default.Scope.INLINE}),m=function(t){function e(t,n){o(this,e);var r=i(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));if("function"!=typeof r.options.highlight)throw new Error("Syntax module requires highlight.js. Please include the library on the page before Quill.");var l=null;return r.quill.on(h.default.events.SCROLL_OPTIMIZE,function(){clearTimeout(l),l=setTimeout(function(){r.highlight(),l=null},r.options.interval)}),r.highlight(),r}return l(e,t),a(e,null,[{key:"register",value:function(){h.default.register(g,!0),h.default.register(b,!0)}}]),a(e,[{key:"highlight",value:function(){var t=this;if(!this.quill.selection.composing){this.quill.update(h.default.sources.USER);var e=this.quill.getSelection();this.quill.scroll.descendants(b).forEach(function(e){e.highlight(t.options.highlight)}),this.quill.update(h.default.sources.SILENT),null!=e&&this.quill.setSelection(e,h.default.sources.SILENT)}}}]),e}(d.default);m.DEFAULTS={highlight:function(){return null==window.hljs?null:function(t){return window.hljs.highlightAuto(t).value}}(),interval:1e3},e.CodeBlock=b,e.CodeToken=g,e.default=m},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function s(t,e,n){var r=document.createElement("button");r.setAttribute("type","button"),r.classList.add("ql-"+e),null!=n&&(r.value=n),t.appendChild(r)}function u(t,e){Array.isArray(e[0])||(e=[e]),e.forEach(function(e){var n=document.createElement("span");n.classList.add("ql-formats"),e.forEach(function(t){if("string"==typeof t)s(n,t);else{var e=Object.keys(t)[0],r=t[e];Array.isArray(r)?c(n,e,r):s(n,e,r)}}),t.appendChild(n)})}function c(t,e,n){var r=document.createElement("select");r.classList.add("ql-"+e),n.forEach(function(t){var e=document.createElement("option");!1!==t?e.setAttribute("value",t):e.setAttribute("selected","selected"),r.appendChild(e)}),t.appendChild(r)}Object.defineProperty(e,"__esModule",{value:!0}),e.addControls=e.default=void 0;var f=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),h=function(){function t(t,e){for(var n=0;n '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.BubbleTooltip=void 0;var a=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},s=function(){function t(t,e){for(var n=0;n0&&o===h.default.sources.USER){r.show(),r.root.style.left="0px",r.root.style.width="",r.root.style.width=r.root.offsetWidth+"px";var i=r.quill.getLines(e.index,e.length);if(1===i.length)r.position(r.quill.getBounds(e));else{var l=i[i.length-1],a=r.quill.getIndex(l),s=Math.min(l.length()-1,e.index+e.length-a),u=r.quill.getBounds(new y.Range(a,s));r.position(u)}}else document.activeElement!==r.textbox&&r.quill.hasFocus()&&r.hide()}),r}return l(e,t),s(e,[{key:"listen",value:function(){var t=this;a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"listen",this).call(this),this.root.querySelector(".ql-close").addEventListener("click",function(){t.root.classList.remove("ql-editing")}),this.quill.on(h.default.events.SCROLL_OPTIMIZE,function(){setTimeout(function(){if(!t.root.classList.contains("ql-hidden")){var e=t.quill.getSelection();null!=e&&t.position(t.quill.getBounds(e))}},1)})}},{key:"cancel",value:function(){this.show()}},{key:"position",value:function(t){var n=a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"position",this).call(this,t),r=this.root.querySelector(".ql-tooltip-arrow");if(r.style.marginLeft="",0===n)return n;r.style.marginLeft=-1*n-r.offsetWidth/2+"px"}}]),e}(p.BaseTooltip);_.TEMPLATE=['','
','','',"
"].join(""),e.BubbleTooltip=_,e.default=m},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},u=function(){function t(t,e){for(var n=0;n','','',''].join(""),e.default=w}]).default}); +//# sourceMappingURL=quill.min.js.map \ No newline at end of file diff --git a/assets/quill/quill.snow.css b/assets/quill/quill.snow.css new file mode 100644 index 0000000..599bff7 --- /dev/null +++ b/assets/quill/quill.snow.css @@ -0,0 +1,948 @@ +/*! + * Quill Editor v1.3.6 + * https://quilljs.com/ + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +.ql-container { + box-sizing: border-box; + font-family: Helvetica, Arial, sans-serif; + font-size: 13px; + height: 100%; + margin: 0px; + position: relative; +} +.ql-container.ql-disabled .ql-tooltip { + visibility: hidden; +} +.ql-container.ql-disabled .ql-editor ul[data-checked] > li::before { + pointer-events: none; +} +.ql-clipboard { + left: -100000px; + height: 1px; + overflow-y: hidden; + position: absolute; + top: 50%; +} +.ql-clipboard p { + margin: 0; + padding: 0; +} +.ql-editor { + box-sizing: content-box; + line-height: 1.42; + min-height: 8vh; + flex-grow: 1; + font-size: 1.25rem; + height: 100%; + outline: none; + overflow-y: auto; + /* padding: 0.08vh 0.08vh; */ + tab-size: 4; + -moz-tab-size: 4; + text-align: left; + white-space: pre-wrap; + word-wrap: break-word; +} +.ql-editor > * { + cursor: text; +} +.ql-editor p, +.ql-editor ol, +.ql-editor ul, +.ql-editor pre, +.ql-editor blockquote, +.ql-editor h1, +.ql-editor h2, +.ql-editor h3, +.ql-editor h4, +.ql-editor h5, +.ql-editor h6 { + margin: 0; + padding: 0; + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol, +.ql-editor ul { + padding-left: 1.5em; +} +.ql-editor ol > li, +.ql-editor ul > li { + list-style-type: none; +} +.ql-editor ul > li::before { + content: '\2022'; +} +.ql-editor ul[data-checked=true], +.ql-editor ul[data-checked=false] { + pointer-events: none; +} +.ql-editor ul[data-checked=true] > li *, +.ql-editor ul[data-checked=false] > li * { + pointer-events: all; +} +.ql-editor ul[data-checked=true] > li::before, +.ql-editor ul[data-checked=false] > li::before { + color: #777; + cursor: pointer; + pointer-events: all; +} +.ql-editor ul[data-checked=true] > li::before { + content: '\2611'; +} +.ql-editor ul[data-checked=false] > li::before { + content: '\2610'; +} +.ql-editor li::before { + display: inline-block; + white-space: nowrap; + width: 1.2em; +} +.ql-editor li:not(.ql-direction-rtl)::before { + margin-left: -1.5em; + margin-right: 0.3em; + text-align: right; +} +.ql-editor li.ql-direction-rtl::before { + margin-left: 0.3em; + margin-right: -1.5em; +} +.ql-editor ol li:not(.ql-direction-rtl), +.ql-editor ul li:not(.ql-direction-rtl) { + padding-left: 1.5em; +} +.ql-editor ol li.ql-direction-rtl, +.ql-editor ul li.ql-direction-rtl { + padding-right: 1.5em; +} +.ql-editor ol li { + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; + counter-increment: list-0; +} +.ql-editor ol li:before { + content: counter(list-0, decimal) '. '; +} +.ql-editor ol li.ql-indent-1 { + counter-increment: list-1; +} +.ql-editor ol li.ql-indent-1:before { + content: counter(list-1, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-1 { + counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-2 { + counter-increment: list-2; +} +.ql-editor ol li.ql-indent-2:before { + content: counter(list-2, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-2 { + counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-3 { + counter-increment: list-3; +} +.ql-editor ol li.ql-indent-3:before { + content: counter(list-3, decimal) '. '; +} +.ql-editor ol li.ql-indent-3 { + counter-reset: list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-4 { + counter-increment: list-4; +} +.ql-editor ol li.ql-indent-4:before { + content: counter(list-4, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-4 { + counter-reset: list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-5 { + counter-increment: list-5; +} +.ql-editor ol li.ql-indent-5:before { + content: counter(list-5, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-5 { + counter-reset: list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-6 { + counter-increment: list-6; +} +.ql-editor ol li.ql-indent-6:before { + content: counter(list-6, decimal) '. '; +} +.ql-editor ol li.ql-indent-6 { + counter-reset: list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-7 { + counter-increment: list-7; +} +.ql-editor ol li.ql-indent-7:before { + content: counter(list-7, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-7 { + counter-reset: list-8 list-9; +} +.ql-editor ol li.ql-indent-8 { + counter-increment: list-8; +} +.ql-editor ol li.ql-indent-8:before { + content: counter(list-8, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-8 { + counter-reset: list-9; +} +.ql-editor ol li.ql-indent-9 { + counter-increment: list-9; +} +.ql-editor ol li.ql-indent-9:before { + content: counter(list-9, decimal) '. '; +} +.ql-editor .ql-indent-1:not(.ql-direction-rtl) { + padding-left: 3em; +} +.ql-editor li.ql-indent-1:not(.ql-direction-rtl) { + padding-left: 4.5em; +} +.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 3em; +} +.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 4.5em; +} +.ql-editor .ql-indent-2:not(.ql-direction-rtl) { + padding-left: 6em; +} +.ql-editor li.ql-indent-2:not(.ql-direction-rtl) { + padding-left: 7.5em; +} +.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 6em; +} +.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 7.5em; +} +.ql-editor .ql-indent-3:not(.ql-direction-rtl) { + padding-left: 9em; +} +.ql-editor li.ql-indent-3:not(.ql-direction-rtl) { + padding-left: 10.5em; +} +.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 9em; +} +.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 10.5em; +} +.ql-editor .ql-indent-4:not(.ql-direction-rtl) { + padding-left: 12em; +} +.ql-editor li.ql-indent-4:not(.ql-direction-rtl) { + padding-left: 13.5em; +} +.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 12em; +} +.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 13.5em; +} +.ql-editor .ql-indent-5:not(.ql-direction-rtl) { + padding-left: 15em; +} +.ql-editor li.ql-indent-5:not(.ql-direction-rtl) { + padding-left: 16.5em; +} +.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 15em; +} +.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 16.5em; +} +.ql-editor .ql-indent-6:not(.ql-direction-rtl) { + padding-left: 18em; +} +.ql-editor li.ql-indent-6:not(.ql-direction-rtl) { + padding-left: 19.5em; +} +.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 18em; +} +.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 19.5em; +} +.ql-editor .ql-indent-7:not(.ql-direction-rtl) { + padding-left: 21em; +} +.ql-editor li.ql-indent-7:not(.ql-direction-rtl) { + padding-left: 22.5em; +} +.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 21em; +} +.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 22.5em; +} +.ql-editor .ql-indent-8:not(.ql-direction-rtl) { + padding-left: 24em; +} +.ql-editor li.ql-indent-8:not(.ql-direction-rtl) { + padding-left: 25.5em; +} +.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 24em; +} +.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 25.5em; +} +.ql-editor .ql-indent-9:not(.ql-direction-rtl) { + padding-left: 27em; +} +.ql-editor li.ql-indent-9:not(.ql-direction-rtl) { + padding-left: 28.5em; +} +.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 27em; +} +.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 28.5em; +} +.ql-editor .ql-video { + display: block; + max-width: 100%; +} +.ql-editor .ql-video.ql-align-center { + margin: 0 auto; +} +.ql-editor .ql-video.ql-align-right { + margin: 0 0 0 auto; +} +.ql-editor .ql-bg-black { + background-color: #000; +} +.ql-editor .ql-bg-red { + background-color: #e60000; +} +.ql-editor .ql-bg-orange { + background-color: #f90; +} +.ql-editor .ql-bg-yellow { + background-color: #ff0; +} +.ql-editor .ql-bg-green { + background-color: #008a00; +} +.ql-editor .ql-bg-blue { + background-color: #06c; +} +.ql-editor .ql-bg-purple { + background-color: #93f; +} +.ql-editor .ql-color-white { + color: #fff; +} +.ql-editor .ql-color-red { + color: #e60000; +} +.ql-editor .ql-color-orange { + color: #f90; +} +.ql-editor .ql-color-yellow { + color: #ff0; +} +.ql-editor .ql-color-green { + color: #008a00; +} +.ql-editor .ql-color-blue { + color: #06c; +} +.ql-editor .ql-color-purple { + color: #93f; +} +.ql-editor .ql-font-serif { + font-family: Georgia, Times New Roman, serif; +} +.ql-editor .ql-font-monospace { + font-family: Monaco, Courier New, monospace; +} +.ql-editor .ql-size-small { + font-size: 0.75em; +} +.ql-editor .ql-size-large { + font-size: 1.5em; +} +.ql-editor .ql-size-huge { + font-size: 2.5em; +} +.ql-editor .ql-direction-rtl { + direction: rtl; + text-align: inherit; +} +.ql-editor .ql-align-center { + text-align: center; +} +.ql-editor .ql-align-justify { + text-align: justify; +} +.ql-editor .ql-align-right { + text-align: right; +} +.ql-editor.ql-blank::before { + color: rgba(0,0,0,0.6); + content: attr(data-placeholder); + font-style: italic; + left: 15px; + pointer-events: none; + position: absolute; + right: 15px; +} +.ql-snow.ql-toolbar:after, +.ql-snow .ql-toolbar:after { + clear: both; + content: ''; + display: table; +} +.ql-snow.ql-toolbar button, +.ql-snow .ql-toolbar button { + background: none; + border: none; + cursor: pointer; + display: inline-block; + float: left; + height: 24px; + padding: 3px 5px; + width: 28px; +} +.ql-snow.ql-toolbar button svg, +.ql-snow .ql-toolbar button svg { + float: left; + height: 100%; +} +.ql-snow.ql-toolbar button:active:hover, +.ql-snow .ql-toolbar button:active:hover { + outline: none; +} +.ql-snow.ql-toolbar input.ql-image[type=file], +.ql-snow .ql-toolbar input.ql-image[type=file] { + display: none; +} +.ql-snow.ql-toolbar button:hover, +.ql-snow .ql-toolbar button:hover, +.ql-snow.ql-toolbar button:focus, +.ql-snow .ql-toolbar button:focus, +.ql-snow.ql-toolbar button.ql-active, +.ql-snow .ql-toolbar button.ql-active, +.ql-snow.ql-toolbar .ql-picker-label:hover, +.ql-snow .ql-toolbar .ql-picker-label:hover, +.ql-snow.ql-toolbar .ql-picker-label.ql-active, +.ql-snow .ql-toolbar .ql-picker-label.ql-active, +.ql-snow.ql-toolbar .ql-picker-item:hover, +.ql-snow .ql-toolbar .ql-picker-item:hover, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected { + color: #06c; +} +.ql-snow.ql-toolbar button:hover .ql-fill, +.ql-snow .ql-toolbar button:hover .ql-fill, +.ql-snow.ql-toolbar button:focus .ql-fill, +.ql-snow .ql-toolbar button:focus .ql-fill, +.ql-snow.ql-toolbar button.ql-active .ql-fill, +.ql-snow .ql-toolbar button.ql-active .ql-fill, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill, +.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill, +.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill { + fill: #06c; +} +.ql-snow.ql-toolbar button:hover .ql-stroke, +.ql-snow .ql-toolbar button:hover .ql-stroke, +.ql-snow.ql-toolbar button:focus .ql-stroke, +.ql-snow .ql-toolbar button:focus .ql-stroke, +.ql-snow.ql-toolbar button.ql-active .ql-stroke, +.ql-snow .ql-toolbar button.ql-active .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke, +.ql-snow.ql-toolbar button:hover .ql-stroke-miter, +.ql-snow .ql-toolbar button:hover .ql-stroke-miter, +.ql-snow.ql-toolbar button:focus .ql-stroke-miter, +.ql-snow .ql-toolbar button:focus .ql-stroke-miter, +.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter, +.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter { + stroke: #06c; +} +@media (pointer: coarse) { + .ql-snow.ql-toolbar button:hover:not(.ql-active), + .ql-snow .ql-toolbar button:hover:not(.ql-active) { + color: #444; + } + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill { + fill: #444; + } + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter { + stroke: #444; + } +} +.ql-snow { + box-sizing: border-box; +} +.ql-snow * { + box-sizing: border-box; +} +.ql-snow .ql-hidden { + display: none; +} +.ql-snow .ql-out-bottom, +.ql-snow .ql-out-top { + visibility: hidden; +} +.ql-snow .ql-tooltip { + position: absolute; + transform: translateY(10px); +} +.ql-snow .ql-tooltip a { + cursor: pointer; + text-decoration: none; +} +.ql-snow .ql-tooltip.ql-flip { + transform: translateY(-10px); +} +.ql-snow .ql-formats { + display: inline-block; + vertical-align: middle; +} +.ql-snow .ql-formats:after { + clear: both; + content: ''; + display: table; +} +.ql-snow .ql-stroke { + fill: none; + stroke: #444; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 2; +} +.ql-snow .ql-stroke-miter { + fill: none; + stroke: #444; + stroke-miterlimit: 10; + stroke-width: 2; +} +.ql-snow .ql-fill, +.ql-snow .ql-stroke.ql-fill { + fill: #444; +} +.ql-snow .ql-empty { + fill: none; +} +.ql-snow .ql-even { + fill-rule: evenodd; +} +.ql-snow .ql-thin, +.ql-snow .ql-stroke.ql-thin { + stroke-width: 1; +} +.ql-snow .ql-transparent { + opacity: 0.4; +} +.ql-snow .ql-direction svg:last-child { + display: none; +} +.ql-snow .ql-direction.ql-active svg:last-child { + display: inline; +} +.ql-snow .ql-direction.ql-active svg:first-child { + display: none; +} +.ql-snow .ql-editor h1 { + font-size: 2em; +} +.ql-snow .ql-editor h2 { + font-size: 1.5em; +} +.ql-snow .ql-editor h3 { + font-size: 1.17em; +} +.ql-snow .ql-editor h4 { + font-size: 1em; +} +.ql-snow .ql-editor h5 { + font-size: 0.83em; +} +.ql-snow .ql-editor h6 { + font-size: 0.67em; +} +.ql-snow .ql-editor a { + text-decoration: underline; +} +.ql-snow .ql-editor blockquote { + border-left: 4px solid #ccc; + margin-bottom: 5px; + margin-top: 5px; + padding-left: 16px; +} +.ql-snow .ql-editor code, +.ql-snow .ql-editor pre { + background-color: #f0f0f0; + border-radius: 3px; +} +.ql-snow .ql-editor pre { + white-space: pre-wrap; + margin-bottom: 5px; + margin-top: 5px; + padding: 5px 10px; +} +.ql-snow .ql-editor code { + font-size: 85%; + padding: 2px 4px; +} +.ql-snow .ql-editor pre.ql-syntax { + background-color: #23241f; + color: #f8f8f2; + overflow: visible; +} +.ql-snow .ql-editor img { + max-width: 100%; +} +.ql-snow .ql-picker { + color: #444; + display: inline-block; + float: left; + font-size: 14px; + font-weight: 500; + height: 24px; + position: relative; + vertical-align: middle; +} +.ql-snow .ql-picker-label { + cursor: pointer; + display: inline-block; + height: 100%; + padding-left: 8px; + padding-right: 2px; + position: relative; + width: 100%; +} +.ql-snow .ql-picker-label::before { + display: inline-block; + line-height: 22px; +} +.ql-snow .ql-picker-options { + background-color: #fff; + display: none; + min-width: 100%; + padding: 4px 8px; + position: absolute; + white-space: nowrap; +} +.ql-snow .ql-picker-options .ql-picker-item { + cursor: pointer; + display: block; + padding-bottom: 5px; + padding-top: 5px; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label { + color: #ccc; + z-index: 2; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill { + fill: #ccc; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke { + stroke: #ccc; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-options { + display: block; + margin-top: -1px; + top: 100%; + z-index: 1; +} +.ql-snow .ql-color-picker, +.ql-snow .ql-icon-picker { + width: 28px; +} +.ql-snow .ql-color-picker .ql-picker-label, +.ql-snow .ql-icon-picker .ql-picker-label { + padding: 2px 4px; +} +.ql-snow .ql-color-picker .ql-picker-label svg, +.ql-snow .ql-icon-picker .ql-picker-label svg { + right: 4px; +} +.ql-snow .ql-icon-picker .ql-picker-options { + padding: 4px 0px; +} +.ql-snow .ql-icon-picker .ql-picker-item { + height: 24px; + width: 24px; + padding: 2px 4px; +} +.ql-snow .ql-color-picker .ql-picker-options { + padding: 3px 5px; + width: 152px; +} +.ql-snow .ql-color-picker .ql-picker-item { + border: 1px solid transparent; + float: left; + height: 16px; + margin: 2px; + padding: 0px; + width: 16px; +} +.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg { + position: absolute; + margin-top: -9px; + right: 0; + top: 50%; + width: 18px; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before { + content: attr(data-label); +} +.ql-snow .ql-picker.ql-header { + width: 98px; +} +.ql-snow .ql-picker.ql-header .ql-picker-label::before, +.ql-snow .ql-picker.ql-header .ql-picker-item::before { + content: 'Normal'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + content: 'Heading 1'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + content: 'Heading 2'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + content: 'Heading 3'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + content: 'Heading 4'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + content: 'Heading 5'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + content: 'Heading 6'; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + font-size: 2em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + font-size: 1.5em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + font-size: 1.17em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + font-size: 1em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + font-size: 0.83em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + font-size: 0.67em; +} +.ql-snow .ql-picker.ql-font { + width: 108px; +} +.ql-snow .ql-picker.ql-font .ql-picker-label::before, +.ql-snow .ql-picker.ql-font .ql-picker-item::before { + content: 'Sans Serif'; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + content: 'Serif'; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + content: 'Monospace'; +} +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + font-family: Georgia, Times New Roman, serif; +} +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + font-family: Monaco, Courier New, monospace; +} +.ql-snow .ql-picker.ql-size { + width: 98px; +} +.ql-snow .ql-picker.ql-size .ql-picker-label::before, +.ql-snow .ql-picker.ql-size .ql-picker-item::before { + content: 'Normal'; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { + content: 'Small'; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { + content: 'Large'; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + content: 'Huge'; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { + font-size: 10px; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { + font-size: 18px; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + font-size: 32px; +} +.ql-snow .ql-color-picker.ql-background .ql-picker-item { + background-color: #fff; +} +.ql-snow .ql-color-picker.ql-color .ql-picker-item { + background-color: #000; +} +.ql-toolbar.ql-snow { + border: 1px solid #ccc; + box-sizing: border-box; + font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; + padding: 8px; +} +.ql-toolbar.ql-snow .ql-formats { + margin-right: 15px; +} +.ql-toolbar.ql-snow .ql-picker-label { + border: 1px solid transparent; +} +.ql-toolbar.ql-snow .ql-picker-options { + border: 1px solid transparent; + box-shadow: rgba(0,0,0,0.2) 0 2px 8px; +} +.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label { + border-color: #ccc; +} +.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options { + border-color: #ccc; +} +.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected, +.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover { + border-color: #000; +} +.ql-toolbar.ql-snow + .ql-container.ql-snow { + border-top: 0px; +} +.ql-snow .ql-tooltip { + background-color: #fff; + border: 1px solid #ccc; + box-shadow: 0px 0px 5px #ddd; + color: #444; + padding: 5px 12px; + white-space: nowrap; +} +.ql-snow .ql-tooltip::before { + content: "Visit URL:"; + line-height: 26px; + margin-right: 8px; +} +.ql-snow .ql-tooltip input[type=text] { + display: none; + border: 1px solid #ccc; + font-size: 13px; + height: 26px; + margin: 0px; + padding: 3px 5px; + width: 170px; +} +.ql-snow .ql-tooltip a.ql-preview { + display: inline-block; + max-width: 200px; + overflow-x: hidden; + text-overflow: ellipsis; + vertical-align: top; +} +.ql-snow .ql-tooltip a.ql-action::after { + border-right: 1px solid #ccc; + content: 'Edit'; + margin-left: 16px; + padding-right: 8px; +} +.ql-snow .ql-tooltip a.ql-remove::before { + content: 'Remove'; + margin-left: 8px; +} +.ql-snow .ql-tooltip a { + line-height: 26px; +} +.ql-snow .ql-tooltip.ql-editing a.ql-preview, +.ql-snow .ql-tooltip.ql-editing a.ql-remove { + display: none; +} +.ql-snow .ql-tooltip.ql-editing input[type=text] { + display: inline-block; +} +.ql-snow .ql-tooltip.ql-editing a.ql-action::after { + border-right: 0px; + content: 'Save'; + padding-right: 0px; +} +.ql-snow .ql-tooltip[data-mode=link]::before { + content: "Enter link:"; +} +.ql-snow .ql-tooltip[data-mode=formula]::before { + content: "Enter formula:"; +} +.ql-snow .ql-tooltip[data-mode=video]::before { + content: "Enter video:"; +} +.ql-snow a { + color: #06c; +} +.ql-container.ql-snow { + border: 1px solid #ccc; +} diff --git a/assets/smoothscroll/smooth-scroll.js b/assets/smoothscroll/smooth-scroll.js new file mode 100644 index 0000000..80c36ba --- /dev/null +++ b/assets/smoothscroll/smooth-scroll.js @@ -0,0 +1,29 @@ +// +// SmoothScroll for websites v1.4.10 (Balazs Galambosi) +// http://www.smoothscroll.net/ +// +// Licensed under the terms of the MIT license. +// +// You may use it in your theme if you credit me. +// It is also free to use on any individual website. +// +// Exception: +// The only restriction is to not publish any +// extension for browsers or native application +// without getting a written permission first. +// +(function(){function C(){if(!D&&document.body){D=!0;var a=document.body,b=document.documentElement,d=window.innerHeight,c=a.scrollHeight;k=0<=document.compatMode.indexOf("CSS")?b:a;m=a;f.keyboardSupport&&window.addEventListener("keydown",M,!1);if(top!=self)v=!0;else if(ca&&c>d&&(a.offsetHeight<=d||b.offsetHeight<=d)){var e=document.createElement("div");e.style.cssText="position:absolute; z-index:-10000; top:0; left:0; right:0; height:"+k.scrollHeight+"px";document.body.appendChild(e);var h;w=function(){h|| +(h=setTimeout(function(){e.style.height="0";e.style.height=k.scrollHeight+"px";h=null},500))};setTimeout(w,10);window.addEventListener("resize",w,!1);z=new da(w);z.observe(a,{attributes:!0,childList:!0,characterData:!1});k.offsetHeight<=d&&(d=document.createElement("div"),d.style.clear="both",a.appendChild(d))}f.fixedBackground||(a.style.backgroundAttachment="scroll",b.style.backgroundAttachment="scroll")}}function N(a,b,d){ea(b,d);if(1!=f.accelerationMax){var c=Date.now()-E;cb?.99:-.99,lastY:0>d?.99:-.99,start:Date.now()});if(!F){var c=O(),e=a===c||a===document.body;null==a.$scrollBehavior&&fa(a)&&(a.$scrollBehavior=a.style.scrollBehavior,a.style.scrollBehavior="auto");var h=function(c){c=Date.now();for(var g=0,k=0,l=0;l=f.animationTime,q=m?1:p/f.animationTime;f.pulseAlgorithm&&(p=q,1<=p?q=1:0>=p?q=0:(1==f.pulseNormalize&&(f.pulseNormalize/= +P(1)),q=P(p)));p=n.x*q-n.lastX>>0;q=n.y*q-n.lastY>>0;g+=p;k+=q;n.lastX+=p;n.lastY+=q;m&&(t.splice(l,1),l--)}e?window.scrollBy(g,k):(g&&(a.scrollLeft+=g),k&&(a.scrollTop+=k));b||d||(t=[]);t.length?Q(h,a,1E3/f.frameRate+1):(F=!1,null!=a.$scrollBehavior&&(a.style.scrollBehavior=a.$scrollBehavior,a.$scrollBehavior=null))};Q(h,a,0);F=!0}}function R(a){D||C();var b=a.target;if(a.defaultPrevented||a.ctrlKey||r(m,"embed")||r(b,"embed")&&/\.pdf/i.test(b.src)||r(m,"object")||b.shadowRoot)return!0;var d=-a.wheelDeltaX|| +a.deltaX||0,c=-a.wheelDeltaY||a.deltaY||0;ga&&(a.wheelDeltaX&&x(a.wheelDeltaX,120)&&(d=-120*(a.wheelDeltaX/Math.abs(a.wheelDeltaX))),a.wheelDeltaY&&x(a.wheelDeltaY,120)&&(c=-120*(a.wheelDeltaY/Math.abs(a.wheelDeltaY))));d||c||(c=-a.wheelDelta||0);1===a.deltaMode&&(d*=40,c*=40);b=S(b);if(!b)return v&&G?(Object.defineProperty(a,"target",{value:window.frameElement}),parent.wheel(a)):!0;if(ha(c))return!0;1.2a?!0:b}}function x(a,b){return Math.floor(a/b)==a/b}function K(a){return x(l[0],a)&&x(l[1],a)&&x(l[2],a)}function P(a){var b;a*=f.pulseScale;1> +a?b=a-(1-Math.exp(-a)):(b=Math.exp(-1),--a,a=1-Math.exp(-a),b+=a*(1-b));return b*f.pulseNormalize}function y(a){for(var b in a)aa.hasOwnProperty(b)&&(f[b]=a[b])}var aa={frameRate:150,animationTime:400,stepSize:100,pulseAlgorithm:!0,pulseScale:4,pulseNormalize:1,accelerationDelta:50,accelerationMax:3,keyboardSupport:!0,arrowScroll:50,fixedBackground:!0,excluded:""},f=aa,v=!1,B={x:0,y:0},D=!1,k=document.documentElement,m,z,w,l=[],Z,ga=/^Mac/.test(navigator.platform),h={left:37,up:38,right:39,down:40, +spacebar:32,pageup:33,pagedown:34,end:35,home:36},ia={37:1,38:1,39:1,40:1},t=[],F=!1,E=Date.now(),J=function(){var a=0;return function(b){return b.uniqueID||(b.uniqueID=a++)}}(),W={},H={},V,A={};if(window.localStorage&&localStorage.SS_deltaBuffer)try{l=localStorage.SS_deltaBuffer.split(",")}catch(la){}var Q=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a,b,d){window.setTimeout(a,d||1E3/60)}}(),da=window.MutationObserver|| +window.WebKitMutationObserver||window.MozMutationObserver,O=function(){var a=document.scrollingElement;return function(){if(!a){var b=document.createElement("div");b.style.cssText="height:10000px;width:1px;";document.body.appendChild(b);var d=document.body.scrollTop;window.scrollBy(0,3);a=document.body.scrollTop!=d?document.body:document.documentElement;window.scrollBy(0,-3);document.body.removeChild(b)}return a}}(),g=window.navigator.userAgent,u=/Edge/.test(g),G=/chrome/i.test(g)&&!u,u=/safari/i.test(g)&& +!u,ja=/mobile/i.test(g),ka=/Windows NT 6.1/i.test(g)&&/rv:11/i.test(g),ca=u&&(/Version\/8/i.test(g)||/Version\/9/i.test(g)),g=(G||u||ka)&&!ja,ba=!1;try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){ba=!0}}))}catch(ma){}var u=ba?{passive:!1}:!1,L="onwheel"in document.createElement("div")?"wheel":"mousewheel";L&&g&&(window.addEventListener(L,R,u||!1),window.addEventListener("mousedown",U,!1),window.addEventListener("load",C,!1));y.destroy=function(){z&&z.disconnect(); +window.removeEventListener(L,R,!1);window.removeEventListener("mousedown",U,!1);window.removeEventListener("keydown",M,!1);window.removeEventListener("resize",w,!1);window.removeEventListener("load",C,!1)};window.SmoothScrollOptions&&y(window.SmoothScrollOptions);"function"===typeof define&&define.amd?define(function(){return y}):"object"==typeof exports?module.exports=y:window.SmoothScroll=y})(); diff --git a/assets/socicon/css/styles.css b/assets/socicon/css/styles.css new file mode 100644 index 0000000..cc8f674 --- /dev/null +++ b/assets/socicon/css/styles.css @@ -0,0 +1,934 @@ +@charset "UTF-8"; + +@font-face { + font-family: 'Socicon'; + src: url('../fonts/socicon.eot'); + src: url('../fonts/socicon.eot?#iefix') format('embedded-opentype'), + url('../fonts/socicon.woff2') format('woff2'), + url('../fonts/socicon.ttf') format('truetype'), + url('../fonts/socicon.woff') format('woff'), + url('../fonts/socicon.svg#socicon') format('svg'); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +[data-icon]:before { + font-family: "socicon" !important; + content: attr(data-icon); + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +[class^="socicon-"], [class*=" socicon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'Socicon' !important; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.socicon-500px:before { + content: "\e000"; +} +.socicon-8tracks:before { + content: "\e001"; +} +.socicon-airbnb:before { + content: "\e002"; +} +.socicon-alliance:before { + content: "\e003"; +} +.socicon-amazon:before { + content: "\e004"; +} +.socicon-amplement:before { + content: "\e005"; +} +.socicon-android:before { + content: "\e006"; +} +.socicon-angellist:before { + content: "\e007"; +} +.socicon-apple:before { + content: "\e008"; +} +.socicon-appnet:before { + content: "\e009"; +} +.socicon-baidu:before { + content: "\e00a"; +} +.socicon-bandcamp:before { + content: "\e00b"; +} +.socicon-battlenet:before { + content: "\e00c"; +} +.socicon-mixer:before { + content: "\e00d"; +} +.socicon-bebee:before { + content: "\e00e"; +} +.socicon-bebo:before { + content: "\e00f"; +} +.socicon-behance:before { + content: "\e010"; +} +.socicon-blizzard:before { + content: "\e011"; +} +.socicon-blogger:before { + content: "\e012"; +} +.socicon-buffer:before { + content: "\e013"; +} +.socicon-chrome:before { + content: "\e014"; +} +.socicon-coderwall:before { + content: "\e015"; +} +.socicon-curse:before { + content: "\e016"; +} +.socicon-dailymotion:before { + content: "\e017"; +} +.socicon-deezer:before { + content: "\e018"; +} +.socicon-delicious:before { + content: "\e019"; +} +.socicon-deviantart:before { + content: "\e01a"; +} +.socicon-diablo:before { + content: "\e01b"; +} +.socicon-digg:before { + content: "\e01c"; +} +.socicon-discord:before { + content: "\e01d"; +} +.socicon-disqus:before { + content: "\e01e"; +} +.socicon-douban:before { + content: "\e01f"; +} +.socicon-draugiem:before { + content: "\e020"; +} +.socicon-dribbble:before { + content: "\e021"; +} +.socicon-drupal:before { + content: "\e022"; +} +.socicon-ebay:before { + content: "\e023"; +} +.socicon-ello:before { + content: "\e024"; +} +.socicon-endomodo:before { + content: "\e025"; +} +.socicon-envato:before { + content: "\e026"; +} +.socicon-etsy:before { + content: "\e027"; +} +.socicon-facebook:before { + content: "\e028"; +} +.socicon-feedburner:before { + content: "\e029"; +} +.socicon-filmweb:before { + content: "\e02a"; +} +.socicon-firefox:before { + content: "\e02b"; +} +.socicon-flattr:before { + content: "\e02c"; +} +.socicon-flickr:before { + content: "\e02d"; +} +.socicon-formulr:before { + content: "\e02e"; +} +.socicon-forrst:before { + content: "\e02f"; +} +.socicon-foursquare:before { + content: "\e030"; +} +.socicon-friendfeed:before { + content: "\e031"; +} +.socicon-github:before { + content: "\e032"; +} +.socicon-goodreads:before { + content: "\e033"; +} +.socicon-google:before { + content: "\e034"; +} +.socicon-googlescholar:before { + content: "\e035"; +} +.socicon-googlegroups:before { + content: "\e036"; +} +.socicon-googlephotos:before { + content: "\e037"; +} +.socicon-googleplus:before { + content: "\e038"; +} +.socicon-grooveshark:before { + content: "\e039"; +} +.socicon-hackerrank:before { + content: "\e03a"; +} +.socicon-hearthstone:before { + content: "\e03b"; +} +.socicon-hellocoton:before { + content: "\e03c"; +} +.socicon-heroes:before { + content: "\e03d"; +} +.socicon-smashcast:before { + content: "\e03e"; +} +.socicon-horde:before { + content: "\e03f"; +} +.socicon-houzz:before { + content: "\e040"; +} +.socicon-icq:before { + content: "\e041"; +} +.socicon-identica:before { + content: "\e042"; +} +.socicon-imdb:before { + content: "\e043"; +} +.socicon-instagram:before { + content: "\e044"; +} +.socicon-issuu:before { + content: "\e045"; +} +.socicon-istock:before { + content: "\e046"; +} +.socicon-itunes:before { + content: "\e047"; +} +.socicon-keybase:before { + content: "\e048"; +} +.socicon-lanyrd:before { + content: "\e049"; +} +.socicon-lastfm:before { + content: "\e04a"; +} +.socicon-line:before { + content: "\e04b"; +} +.socicon-linkedin:before { + content: "\e04c"; +} +.socicon-livejournal:before { + content: "\e04d"; +} +.socicon-lyft:before { + content: "\e04e"; +} +.socicon-macos:before { + content: "\e04f"; +} +.socicon-mail:before { + content: "\e050"; +} +.socicon-medium:before { + content: "\e051"; +} +.socicon-meetup:before { + content: "\e052"; +} +.socicon-mixcloud:before { + content: "\e053"; +} +.socicon-modelmayhem:before { + content: "\e054"; +} +.socicon-mumble:before { + content: "\e055"; +} +.socicon-myspace:before { + content: "\e056"; +} +.socicon-newsvine:before { + content: "\e057"; +} +.socicon-nintendo:before { + content: "\e058"; +} +.socicon-npm:before { + content: "\e059"; +} +.socicon-odnoklassniki:before { + content: "\e05a"; +} +.socicon-openid:before { + content: "\e05b"; +} +.socicon-opera:before { + content: "\e05c"; +} +.socicon-outlook:before { + content: "\e05d"; +} +.socicon-overwatch:before { + content: "\e05e"; +} +.socicon-patreon:before { + content: "\e05f"; +} +.socicon-paypal:before { + content: "\e060"; +} +.socicon-periscope:before { + content: "\e061"; +} +.socicon-persona:before { + content: "\e062"; +} +.socicon-pinterest:before { + content: "\e063"; +} +.socicon-play:before { + content: "\e064"; +} +.socicon-player:before { + content: "\e065"; +} +.socicon-playstation:before { + content: "\e066"; +} +.socicon-pocket:before { + content: "\e067"; +} +.socicon-qq:before { + content: "\e068"; +} +.socicon-quora:before { + content: "\e069"; +} +.socicon-raidcall:before { + content: "\e06a"; +} +.socicon-ravelry:before { + content: "\e06b"; +} +.socicon-reddit:before { + content: "\e06c"; +} +.socicon-renren:before { + content: "\e06d"; +} +.socicon-researchgate:before { + content: "\e06e"; +} +.socicon-residentadvisor:before { + content: "\e06f"; +} +.socicon-reverbnation:before { + content: "\e070"; +} +.socicon-rss:before { + content: "\e071"; +} +.socicon-sharethis:before { + content: "\e072"; +} +.socicon-skype:before { + content: "\e073"; +} +.socicon-slideshare:before { + content: "\e074"; +} +.socicon-smugmug:before { + content: "\e075"; +} +.socicon-snapchat:before { + content: "\e076"; +} +.socicon-songkick:before { + content: "\e077"; +} +.socicon-soundcloud:before { + content: "\e078"; +} +.socicon-spotify:before { + content: "\e079"; +} +.socicon-stackexchange:before { + content: "\e07a"; +} +.socicon-stackoverflow:before { + content: "\e07b"; +} +.socicon-starcraft:before { + content: "\e07c"; +} +.socicon-stayfriends:before { + content: "\e07d"; +} +.socicon-steam:before { + content: "\e07e"; +} +.socicon-storehouse:before { + content: "\e07f"; +} +.socicon-strava:before { + content: "\e080"; +} +.socicon-streamjar:before { + content: "\e081"; +} +.socicon-stumbleupon:before { + content: "\e082"; +} +.socicon-swarm:before { + content: "\e083"; +} +.socicon-teamspeak:before { + content: "\e084"; +} +.socicon-teamviewer:before { + content: "\e085"; +} +.socicon-technorati:before { + content: "\e086"; +} +.socicon-telegram:before { + content: "\e087"; +} +.socicon-tripadvisor:before { + content: "\e088"; +} +.socicon-tripit:before { + content: "\e089"; +} +.socicon-triplej:before { + content: "\e08a"; +} +.socicon-tumblr:before { + content: "\e08b"; +} +.socicon-twitch:before { + content: "\e08c"; +} +.socicon-twitter:before { + content: "\e08d"; +} +.socicon-uber:before { + content: "\e08e"; +} +.socicon-ventrilo:before { + content: "\e08f"; +} +.socicon-viadeo:before { + content: "\e090"; +} +.socicon-viber:before { + content: "\e091"; +} +.socicon-viewbug:before { + content: "\e092"; +} +.socicon-vimeo:before { + content: "\e093"; +} +.socicon-vine:before { + content: "\e094"; +} +.socicon-vkontakte:before { + content: "\e095"; +} +.socicon-warcraft:before { + content: "\e096"; +} +.socicon-wechat:before { + content: "\e097"; +} +.socicon-weibo:before { + content: "\e098"; +} +.socicon-whatsapp:before { + content: "\e099"; +} +.socicon-wikipedia:before { + content: "\e09a"; +} +.socicon-windows:before { + content: "\e09b"; +} +.socicon-wordpress:before { + content: "\e09c"; +} +.socicon-wykop:before { + content: "\e09d"; +} +.socicon-xbox:before { + content: "\e09e"; +} +.socicon-xing:before { + content: "\e09f"; +} +.socicon-yahoo:before { + content: "\e0a0"; +} +.socicon-yammer:before { + content: "\e0a1"; +} +.socicon-yandex:before { + content: "\e0a2"; +} +.socicon-yelp:before { + content: "\e0a3"; +} +.socicon-younow:before { + content: "\e0a4"; +} +.socicon-youtube:before { + content: "\e0a5"; +} +.socicon-zapier:before { + content: "\e0a6"; +} +.socicon-zerply:before { + content: "\e0a7"; +} +.socicon-zomato:before { + content: "\e0a8"; +} +.socicon-zynga:before { + content: "\e0a9"; +} +.socicon-spreadshirt:before { + content: "\e901"; +} +.socicon-gamejolt:before { + content: "\e902"; +} +.socicon-trello:before { + content: "\e903"; +} +.socicon-tunein:before { + content: "\e904"; +} +.socicon-bloglovin:before { + content: "\e905"; +} +.socicon-gamewisp:before { + content: "\e906"; +} +.socicon-messenger:before { + content: "\e907"; +} +.socicon-pandora:before { + content: "\e908"; +} +.socicon-augment:before { + content: "\e909"; +} +.socicon-bitbucket:before { + content: "\e90a"; +} +.socicon-fyuse:before { + content: "\e90b"; +} +.socicon-yt-gaming:before { + content: "\e90c"; +} +.socicon-sketchfab:before { + content: "\e90d"; +} +.socicon-mobcrush:before { + content: "\e90e"; +} +.socicon-microsoft:before { + content: "\e90f"; +} +.socicon-realtor:before { + content: "\e910"; +} +.socicon-tidal:before { + content: "\e911"; +} +.socicon-qobuz:before { + content: "\e912"; +} +.socicon-natgeo:before { + content: "\e913"; +} +.socicon-mastodon:before { + content: "\e914"; +} +.socicon-unsplash:before { + content: "\e915"; +} +.socicon-homeadvisor:before { + content: "\e916"; +} +.socicon-angieslist:before { + content: "\e917"; +} +.socicon-codepen:before { + content: "\e918"; +} +.socicon-slack:before { + content: "\e919"; +} +.socicon-openaigym:before { + content: "\e91a"; +} +.socicon-logmein:before { + content: "\e91b"; +} +.socicon-fiverr:before { + content: "\e91c"; +} +.socicon-gotomeeting:before { + content: "\e91d"; +} +.socicon-aliexpress:before { + content: "\e91e"; +} +.socicon-guru:before { + content: "\e91f"; +} +.socicon-appstore:before { + content: "\e920"; +} +.socicon-homes:before { + content: "\e921"; +} +.socicon-zoom:before { + content: "\e922"; +} +.socicon-alibaba:before { + content: "\e923"; +} +.socicon-craigslist:before { + content: "\e924"; +} +.socicon-wix:before { + content: "\e925"; +} +.socicon-redfin:before { + content: "\e926"; +} +.socicon-googlecalendar:before { + content: "\e927"; +} +.socicon-shopify:before { + content: "\e928"; +} +.socicon-freelancer:before { + content: "\e929"; +} +.socicon-seedrs:before { + content: "\e92a"; +} +.socicon-bing:before { + content: "\e92b"; +} +.socicon-doodle:before { + content: "\e92c"; +} +.socicon-bonanza:before { + content: "\e92d"; +} +.socicon-squarespace:before { + content: "\e92e"; +} +.socicon-toptal:before { + content: "\e92f"; +} +.socicon-gust:before { + content: "\e930"; +} +.socicon-ask:before { + content: "\e931"; +} +.socicon-trulia:before { + content: "\e932"; +} +.socicon-loomly:before { + content: "\e933"; +} +.socicon-ghost:before { + content: "\e934"; +} +.socicon-upwork:before { + content: "\e935"; +} +.socicon-fundable:before { + content: "\e936"; +} +.socicon-booking:before { + content: "\e937"; +} +.socicon-googlemaps:before { + content: "\e938"; +} +.socicon-zillow:before { + content: "\e939"; +} +.socicon-niconico:before { + content: "\e93a"; +} +.socicon-toneden:before { + content: "\e93b"; +} +.socicon-crunchbase:before { + content: "\e93c"; +} +.socicon-homefy:before { + content: "\e93d"; +} +.socicon-calendly:before { + content: "\e93e"; +} +.socicon-livemaster:before { + content: "\e93f"; +} +.socicon-udemy:before { + content: "\e940"; +} +.socicon-codered:before { + content: "\e941"; +} +.socicon-origin:before { + content: "\e942"; +} +.socicon-nextdoor:before { + content: "\e943"; +} +.socicon-portfolio:before { + content: "\e944"; +} +.socicon-instructables:before { + content: "\e945"; +} +.socicon-gitlab:before { + content: "\e946"; +} +.socicon-hackernews:before { + content: "\e947"; +} +.socicon-smashwords:before { + content: "\e948"; +} +.socicon-kobo:before { + content: "\e949"; +} +.socicon-bookbub:before { + content: "\e94a"; +} +.socicon-mailru:before { + content: "\e94b"; +} +.socicon-moddb:before { + content: "\e94c"; +} +.socicon-indiedb:before { + content: "\e94d"; +} +.socicon-traxsource:before { + content: "\e94e"; +} +.socicon-gamefor:before { + content: "\e94f"; +} +.socicon-pixiv:before { + content: "\e950"; +} +.socicon-myanimelist:before { + content: "\e951"; +} +.socicon-blackberry:before { + content: "\e952"; +} +.socicon-wickr:before { + content: "\e953"; +} +.socicon-spip:before { + content: "\e954"; +} +.socicon-napster:before { + content: "\e955"; +} +.socicon-beatport:before { + content: "\e956"; +} +.socicon-hackerone:before { + content: "\e957"; +} +.socicon-internet:before { + content: "\e958"; +} +.socicon-ubuntu:before { + content: "\e959"; +} +.socicon-artstation:before { + content: "\e95a"; +} +.socicon-invision:before { + content: "\e95b"; +} +.socicon-torial:before { + content: "\e95c"; +} +.socicon-collectorz:before { + content: "\e95d"; +} +.socicon-seenthis:before { + content: "\e95e"; +} +.socicon-googleplaymusic:before { + content: "\e95f"; +} +.socicon-debian:before { + content: "\e960"; +} +.socicon-filmfreeway:before { + content: "\e961"; +} +.socicon-gnome:before { + content: "\e962"; +} +.socicon-itchio:before { + content: "\e963"; +} +.socicon-jamendo:before { + content: "\e964"; +} +.socicon-mix:before { + content: "\e965"; +} +.socicon-sharepoint:before { + content: "\e966"; +} +.socicon-tinder:before { + content: "\e967"; +} +.socicon-windguru:before { + content: "\e968"; +} +.socicon-cdbaby:before { + content: "\e969"; +} +.socicon-elementaryos:before { + content: "\e96a"; +} +.socicon-stage32:before { + content: "\e96b"; +} +.socicon-tiktok:before { + content: "\e96c"; +} +.socicon-gitter:before { + content: "\e96d"; +} +.socicon-letterboxd:before { + content: "\e96e"; +} +.socicon-threema:before { + content: "\e96f"; +} +.socicon-splice:before { + content: "\e970"; +} +.socicon-metapop:before { + content: "\e971"; +} +.socicon-naver:before { + content: "\e972"; +} +.socicon-remote:before { + content: "\e973"; +} +.socicon-flipboard:before { + content: "\e974"; +} +.socicon-googlehangouts:before { + content: "\e975"; +} +.socicon-dlive:before { + content: "\e976"; +} +.socicon-vsco:before { + content: "\e977"; +} +.socicon-stitcher:before { + content: "\e978"; +} +.socicon-avvo:before { + content: "\e979"; +} +.socicon-redbubble:before { + content: "\e97a"; +} +.socicon-society6:before { + content: "\e97b"; +} +.socicon-zazzle:before { + content: "\e97c"; +} +.socicon-eitaa:before { + content: "\e97d"; +} +.socicon-soroush:before { + content: "\e97e"; +} +.socicon-bale:before { + content: "\e97f"; +} diff --git a/assets/socicon/fonts/socicon.eot b/assets/socicon/fonts/socicon.eot new file mode 100644 index 0000000..355485f Binary files /dev/null and b/assets/socicon/fonts/socicon.eot differ diff --git a/assets/socicon/fonts/socicon.svg b/assets/socicon/fonts/socicon.svg new file mode 100644 index 0000000..883f5aa --- /dev/null +++ b/assets/socicon/fonts/socicon.svg @@ -0,0 +1,307 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/socicon/fonts/socicon.ttf b/assets/socicon/fonts/socicon.ttf new file mode 100644 index 0000000..c7d9ec5 Binary files /dev/null and b/assets/socicon/fonts/socicon.ttf differ diff --git a/assets/socicon/fonts/socicon.woff b/assets/socicon/fonts/socicon.woff new file mode 100644 index 0000000..7a2c441 Binary files /dev/null and b/assets/socicon/fonts/socicon.woff differ diff --git a/assets/socicon/fonts/socicon.woff2 b/assets/socicon/fonts/socicon.woff2 new file mode 100644 index 0000000..cfcec0a Binary files /dev/null and b/assets/socicon/fonts/socicon.woff2 differ diff --git a/assets/theme/css/style.css b/assets/theme/css/style.css new file mode 100644 index 0000000..517c282 --- /dev/null +++ b/assets/theme/css/style.css @@ -0,0 +1,954 @@ +@charset "UTF-8"; +section { + background-color: #ffffff; +} + +body { + font-style: normal; + line-height: 1.5; + font-weight: 400; + color: #232323; + position: relative; +} + +button { + background-color: transparent; + border-color: transparent; +} + +section, +.container, +.container-fluid { + position: relative; + word-wrap: break-word; +} + +a.mbr-iconfont:hover { + text-decoration: none; +} + +.article .lead p, +.article .lead ul, +.article .lead ol, +.article .lead pre, +.article .lead blockquote { + margin-bottom: 0; +} + +a { + font-style: normal; + font-weight: 400; + cursor: pointer; +} +a, a:hover { + text-decoration: none; +} + +.mbr-section-title { + font-style: normal; + line-height: 1.3; +} + +.mbr-section-subtitle { + line-height: 1.3; +} + +.mbr-text { + font-style: normal; + line-height: 1.7; +} + +h1, +h2, +h3, +h4, +h5, +h6, +.display-1, +.display-2, +.display-4, +.display-5, +.display-7, +span, +p, +a { + line-height: 1; + word-break: break-word; + word-wrap: break-word; + font-weight: 400; +} + +b, +strong { + font-weight: bold; +} + +input:-webkit-autofill, input:-webkit-autofill:hover, input:-webkit-autofill:focus, input:-webkit-autofill:active { + transition-delay: 9999s; + -webkit-transition-property: background-color, color; + transition-property: background-color, color; +} + +textarea[type=hidden] { + display: none; +} + +section { + background-position: 50% 50%; + background-repeat: no-repeat; + background-size: cover; +} +section .mbr-background-video, +section .mbr-background-video-preview { + position: absolute; + bottom: 0; + left: 0; + right: 0; + top: 0; +} + +.hidden { + visibility: hidden; +} + +.mbr-z-index20 { + z-index: 20; +} + +/*! Base colors */ +.mbr-white { + color: #ffffff; +} + +.mbr-black { + color: #111111; +} + +.mbr-bg-white { + background-color: #ffffff; +} + +.mbr-bg-black { + background-color: #000000; +} + +/*! Text-aligns */ +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-right { + text-align: right; +} + +/*! Font-weight */ +.mbr-light { + font-weight: 300; +} + +.mbr-regular { + font-weight: 400; +} + +.mbr-semibold { + font-weight: 500; +} + +.mbr-bold { + font-weight: 700; +} + +/*! Media */ +.media-content { + flex-basis: 100%; +} + +.media-container-row { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + align-content: center; + align-items: start; +} +.media-container-row .media-size-item { + width: 400px; +} + +.media-container-column { + display: flex; + flex-direction: column; + flex-wrap: wrap; + justify-content: center; + align-content: center; + align-items: stretch; +} +.media-container-column > * { + width: 100%; +} + +@media (min-width: 992px) { + .media-container-row { + flex-wrap: nowrap; + } +} +figure { + margin-bottom: 0; + overflow: hidden; +} + +figure[mbr-media-size] { + transition: width 0.1s; +} + +img, +iframe { + display: block; + width: 100%; +} + +.card { + background-color: transparent; + border: none; +} + +.card-box { + width: 100%; +} + +.card-img { + text-align: center; + flex-shrink: 0; + -webkit-flex-shrink: 0; +} + +.media { + max-width: 100%; + margin: 0 auto; +} + +.mbr-figure { + align-self: center; +} + +.media-container > div { + max-width: 100%; +} + +.mbr-figure img, +.card-img img { + width: 100%; +} + +@media (max-width: 991px) { + .media-size-item { + width: auto !important; + } + + .media { + width: auto; + } + + .mbr-figure { + width: 100% !important; + } +} +/*! Buttons */ +.mbr-section-btn { + margin-left: -0.6rem; + margin-right: -0.6rem; + font-size: 0; +} + +.btn { + font-weight: 600; + border-width: 1px; + font-style: normal; + margin: 0.6rem 0.6rem; + white-space: normal; + transition: all 0.2s ease-in-out; + display: inline-flex; + align-items: center; + justify-content: center; + word-break: break-word; +} + +.btn-sm { + font-weight: 600; + letter-spacing: 0px; + transition: all 0.3s ease-in-out; +} + +.btn-md { + font-weight: 600; + letter-spacing: 0px; + transition: all 0.3s ease-in-out; +} + +.btn-lg { + font-weight: 600; + letter-spacing: 0px; + transition: all 0.3s ease-in-out; +} + +.btn-form { + margin: 0; +} +.btn-form:hover { + cursor: pointer; +} + +nav .mbr-section-btn { + margin-left: 0rem; + margin-right: 0rem; +} + +/*! Btn icon margin */ +.btn .mbr-iconfont, +.btn.btn-sm .mbr-iconfont { + order: 1; + cursor: pointer; + margin-left: 0.5rem; + vertical-align: sub; +} + +.btn.btn-md .mbr-iconfont, +.btn.btn-md .mbr-iconfont { + margin-left: 0.8rem; +} + +.mbr-regular { + font-weight: 400; +} + +.mbr-semibold { + font-weight: 500; +} + +.mbr-bold { + font-weight: 700; +} + +[type=submit] { + -webkit-appearance: none; +} + +/*! Full-screen */ +.mbr-fullscreen .mbr-overlay { + min-height: 100vh; +} + +.mbr-fullscreen { + display: flex; + display: -moz-flex; + display: -ms-flex; + display: -o-flex; + align-items: center; + min-height: 100vh; + padding-top: 3rem; + padding-bottom: 3rem; +} + +/*! Map */ +.map { + height: 25rem; + position: relative; +} +.map iframe { + width: 100%; + height: 100%; +} + +/*! Scroll to top arrow */ +.mbr-arrow-up { + bottom: 25px; + right: 90px; + position: fixed; + text-align: right; + z-index: 5000; + color: #ffffff; + font-size: 22px; +} + +.mbr-arrow-up a { + background: rgba(0, 0, 0, 0.2); + border-radius: 50%; + color: #fff; + display: inline-block; + height: 60px; + width: 60px; + border: 2px solid #fff; + outline-style: none !important; + position: relative; + text-decoration: none; + transition: all 0.3s ease-in-out; + cursor: pointer; + text-align: center; +} +.mbr-arrow-up a:hover { + background-color: rgba(0, 0, 0, 0.4); +} +.mbr-arrow-up a i { + line-height: 60px; +} + +.mbr-arrow-up-icon { + display: block; + color: #fff; +} + +.mbr-arrow-up-icon::before { + content: "›"; + display: inline-block; + font-family: serif; + font-size: 22px; + line-height: 1; + font-style: normal; + position: relative; + top: 6px; + left: -4px; + transform: rotate(-90deg); +} + +/*! Arrow Down */ +.mbr-arrow { + position: absolute; + bottom: 45px; + left: 50%; + width: 60px; + height: 60px; + cursor: pointer; + background-color: rgba(80, 80, 80, 0.5); + border-radius: 50%; + transform: translateX(-50%); +} +@media (max-width: 767px) { + .mbr-arrow { + display: none; + } +} +.mbr-arrow > a { + display: inline-block; + text-decoration: none; + outline-style: none; + -webkit-animation: arrowdown 1.7s ease-in-out infinite; + animation: arrowdown 1.7s ease-in-out infinite; + color: #ffffff; +} +.mbr-arrow > a > i { + position: absolute; + top: -2px; + left: 15px; + font-size: 2rem; +} + +#scrollToTop a i::before { + content: ""; + position: absolute; + display: block; + border-bottom: 2.5px solid #fff; + border-left: 2.5px solid #fff; + width: 27.8%; + height: 27.8%; + left: 50%; + top: 51%; + transform: translateY(-30%) translateX(-50%) rotate(135deg); +} + +@keyframes arrowdown { + 0% { + transform: translateY(0px); + } + 50% { + transform: translateY(-5px); + } + 100% { + transform: translateY(0px); + } +} +@-webkit-keyframes arrowdown { + 0% { + transform: translateY(0px); + } + 50% { + transform: translateY(-5px); + } + 100% { + transform: translateY(0px); + } +} +@media (max-width: 500px) { + .mbr-arrow-up { + left: 0; + right: 0; + text-align: center; + } +} +/*Gradients animation*/ +@keyframes gradient-animation { + from { + background-position: 0% 100%; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + to { + background-position: 100% 0%; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } +} +@-webkit-keyframes gradient-animation { + from { + background-position: 0% 100%; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + to { + background-position: 100% 0%; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } +} +.bg-gradient { + background-size: 200% 200%; + animation: gradient-animation 5s infinite alternate; + -webkit-animation: gradient-animation 5s infinite alternate; +} + +.menu .navbar-brand { + display: -webkit-flex; +} +.menu .navbar-brand span { + display: flex; + display: -webkit-flex; +} +.menu .navbar-brand .navbar-caption-wrap { + display: -webkit-flex; +} +.menu .navbar-brand .navbar-logo img { + display: -webkit-flex; + width: auto; +} +@media (min-width: 768px) and (max-width: 991px) { + .menu .navbar-toggleable-sm .navbar-nav { + display: -ms-flexbox; + } +} +@media (max-width: 991px) { + .menu .navbar-collapse { + max-height: 93.5vh; + } + .menu .navbar-collapse.show { + overflow: auto; + } +} +@media (min-width: 992px) { + .menu .navbar-nav.nav-dropdown { + display: -webkit-flex; + } + .menu .navbar-toggleable-sm .navbar-collapse { + display: -webkit-flex !important; + } + .menu .collapsed .navbar-collapse { + max-height: 93.5vh; + } + .menu .collapsed .navbar-collapse.show { + overflow: auto; + } +} +@media (max-width: 767px) { + .menu .navbar-collapse { + max-height: 80vh; + } +} + +.nav-link .mbr-iconfont { + margin-right: 0.5rem; +} + +.navbar { + display: -webkit-flex; + -webkit-flex-wrap: wrap; + -webkit-align-items: center; + -webkit-justify-content: space-between; +} + +.navbar-collapse { + -webkit-flex-basis: 100%; + -webkit-flex-grow: 1; + -webkit-align-items: center; +} + +.nav-dropdown .link { + padding: 0.667em 1.667em !important; + margin: 0 !important; +} + +.nav { + display: -webkit-flex; + -webkit-flex-wrap: wrap; +} + +.row { + display: -webkit-flex; + -webkit-flex-wrap: wrap; +} + +.justify-content-center { + -webkit-justify-content: center; +} + +.form-inline { + display: -webkit-flex; +} + +.card-wrapper { + -webkit-flex: 1; +} + +.carousel-control { + z-index: 10; + display: -webkit-flex; +} + +.carousel-controls { + display: -webkit-flex; +} + +.media { + display: -webkit-flex; +} + +.form-group:focus { + outline: none; +} + +.jq-selectbox__select { + padding: 7px 0; + position: relative; +} + +.jq-selectbox__dropdown { + overflow: hidden; + border-radius: 10px; + position: absolute; + top: 100%; + left: 0 !important; + width: 100% !important; +} + +.jq-selectbox__trigger-arrow { + right: 0; + transform: translateY(-50%); +} + +.jq-selectbox li { + padding: 1.07em 0.5em; +} + +input[type=range] { + padding-left: 0 !important; + padding-right: 0 !important; +} + +.modal-dialog, +.modal-content { + height: 100%; +} + +.modal-dialog .carousel-inner { + height: calc(100vh - 1.75rem); +} +@media (max-width: 575px) { + .modal-dialog .carousel-inner { + height: calc(100vh - 1rem); + } +} + +.carousel-item { + text-align: center; +} + +.carousel-item img { + margin: auto; +} + +.navbar-toggler { + align-self: flex-start; + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.navbar-toggler:focus, +.navbar-toggler:hover { + text-decoration: none; + box-shadow: none; +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: no-repeat center center; + background-size: 100% 100%; +} + +.navbar-toggler-left { + position: absolute; + left: 1rem; +} + +.navbar-toggler-right { + position: absolute; + right: 1rem; +} + +.card-img { + width: auto; +} + +.menu .navbar.collapsed:not(.beta-menu) { + flex-direction: column; +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: flex; +} + +.note-air-layout .dropup .dropdown-menu, +.note-air-layout .navbar-fixed-bottom .dropdown .dropdown-menu { + bottom: initial !important; +} + +html, +body { + height: auto; + min-height: 100vh; +} + +.dropup .dropdown-toggle::after { + display: none; +} + +.form-asterisk { + font-family: initial; + position: absolute; + top: -2px; + font-weight: normal; +} + +.form-control-label { + position: relative; + cursor: pointer; + margin-bottom: 0.357em; + padding: 0; +} + +.alert { + color: #ffffff; + border-radius: 0; + border: 0; + font-size: 1.1rem; + line-height: 1.5; + margin-bottom: 1.875rem; + padding: 1.25rem; + position: relative; + text-align: center; +} +.alert.alert-form::after { + background-color: inherit; + bottom: -7px; + content: ""; + display: block; + height: 14px; + left: 50%; + margin-left: -7px; + position: absolute; + transform: rotate(45deg); + width: 14px; +} + +.form-control { + background-color: #ffffff; + background-clip: border-box; + color: #232323; + line-height: 1rem !important; + height: auto; + padding: 0.6rem 1.2rem; + transition: border-color 0.25s ease 0s; + border: 1px solid transparent !important; + border-radius: 4px; + box-shadow: rgba(0, 0, 0, 0.07) 0px 1px 1px 0px, rgba(0, 0, 0, 0.07) 0px 1px 3px 0px, rgba(0, 0, 0, 0.03) 0px 0px 0px 1px; +} +.form-active .form-control:invalid { + border-color: red; +} + +form .row { + margin-left: -0.6rem; + margin-right: -0.6rem; +} +form .row [class*=col] { + padding-left: 0.6rem; + padding-right: 0.6rem; +} + +form .mbr-section-btn { + margin: 0; + padding-left: 0.6rem; + padding-right: 0.6rem; +} + +form .btn { + display: flex; + padding: 0.6rem 1.2rem; + margin: 0; +} + +form .form-check-input { + margin-top: 0.5; +} + +textarea.form-control { + line-height: 1.5rem !important; +} + +.form-group { + margin-bottom: 1.2rem; +} + +.form-control, +form .btn { + min-height: 48px; +} + +.gdpr-block label span.textGDPR input[name=gdpr] { + top: 7px; +} + +.form-control:focus { + box-shadow: none; +} + +:focus { + outline: none; +} + +.mbr-overlay { + background-color: #000; + bottom: 0; + left: 0; + opacity: 0.5; + position: absolute; + right: 0; + top: 0; + z-index: 0; + pointer-events: none; +} + +blockquote { + font-style: italic; + padding: 3rem; + font-size: 1.09rem; + position: relative; + border-left: 3px solid; +} + +ul, +ol, +pre, +blockquote { + margin-bottom: 2.3125rem; +} + +.mt-4 { + margin-top: 2rem !important; +} + +.mb-4 { + margin-bottom: 2rem !important; +} + +@media (min-width: 992px) { + .container { + padding-left: 16px; + padding-right: 16px; + } + + .row { + margin-left: -16px; + margin-right: -16px; + } + .row > [class*=col] { + padding-left: 16px; + padding-right: 16px; + } +} +@media (min-width: 768px) { + .container-fluid { + padding-left: 32px; + padding-right: 32px; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .mbr-container { + padding-left: 32px; + padding-right: 32px; + } +} +@media (max-width: 767px) { + .mbr-container { + padding-left: 16px; + padding-right: 16px; + } +} +.card-wrapper, +.item-wrapper { + overflow: hidden; +} + +.app-video-wrapper > img { + opacity: 1; +} + +.item { + position: relative; +} + +.dropdown-menu .dropdown-menu { + left: 100%; +} + +.dropdown-item + .dropdown-menu { + display: none; +} + +.dropdown-item:hover + .dropdown-menu, +.dropdown-menu:hover { + display: block; +} + +@media (min-aspect-ratio: 16/9) { + .mbr-video-foreground { + height: 300% !important; + top: -100% !important; + } +} +@media (max-aspect-ratio: 16/9) { + .mbr-video-foreground { + width: 300% !important; + left: -100% !important; + } +} \ No newline at end of file diff --git a/assets/theme/js/script.js b/assets/theme/js/script.js new file mode 100644 index 0000000..34b3acd --- /dev/null +++ b/assets/theme/js/script.js @@ -0,0 +1,61 @@ + +(function(){function q(a,b){var c=Array.from(a.querySelectorAll(b));a.matches&&a.matches(b)&&c.splice(0,0,a);return c}function w(a){a=a.getBoundingClientRect();var b=document.documentElement;return{top:a.top+window.pageYOffset-b.clientTop,left:a.left+window.pageXOffset-b.clientLeft}}function u(a){return parseFloat(getComputedStyle(a,null).height.replace("px",""))}function x(a){return parseFloat(getComputedStyle(a,null).width.replace("px",""))}function r(a){"loading"!=document.readyState?a():document.addEventListener("DOMContentLoaded", +a)}function F(a){(function c(){0>(a.style.opacity-=.1)?a.style.display="none":requestAnimationFrame(c)})()}function G(a){a.style.display="block";(function c(){var d=parseFloat(a.style.opacity);1<(d+=.1)||(a.style.opacity=d,requestAnimationFrame(c))})()}function t(a){var b=[],c={blackberry:"BlackBerry",android:"Android",windows:"IEMobile",opera:"Opera Mini",ios:"iPhone|iPad|iPod"};a="undefined"==typeof a?"*":a.toLowerCase();"*"===a?b=Object.values(c):a in c&&b.push(c[a]);return!(!b.length||!navigator.userAgent.match(new RegExp(b.join("|"), +"i")))}function A(a){var b=a.querySelector(".carousel-item");a=a.querySelector(".carousel-indicators > li");b.classList.add("active");a&&a.classList.add("active")}function v(a){var b=a.getAttribute("id")+"-carousel",c=a.getAttribute("data-bs-version")&&a.getAttribute("data-bs-version").startsWith("5");null===a.getAttribute("id")&&(b=a.classList.value.match(/cid-.*?(?=\s|$)/)+"-carousel");a.querySelectorAll(".carousel").forEach(function(a){a.setAttribute("id",b)});a.querySelector(".carousel-controls")&& +a.querySelectorAll(".carousel-controls").forEach(function(a){a.querySelectorAll("a").forEach(function(a){a.setAttribute("href","#"+b);c?a.setAttribute("data-bs-target","#"+b):a.setAttribute("data-target","#"+b)})});a.querySelectorAll(".carousel-indicators > li").forEach(function(a){c?a.setAttribute("data-bs-target","#"+b):a.setAttribute("data-target","#"+b)});A(a)}function H(a){var b=a.querySelectorAll(".carousel-item").length,c=a.querySelector(".carousel-inner").getAttribute("data-visible");bc?a.setAttribute("class","col-md-12"):"5"==c?a.setAttribute("class","col-md-12 col-lg-15"):a.setAttribute("class","col-md-12 col-lg-"+12/c)});a.querySelectorAll(".carousel-item .row").forEach(function(a){a.setAttribute("style","-webkit-flex-grow: 1; flex-grow: 1; margin: 0;")}); +a.querySelectorAll(".carousel-item").forEach(function(a){for(var b=a,m=1;m *").forEach(function(a){a.setAttribute("id",b)});d=a.cloneNode(!0);Array.from(a.children).forEach(function(a){if("SVG"!==a.tagName)return a.remove()});a.setAttribute("data-pie","{ "+I(a.closest("section"))+' "percent": '+c+', "size": 150, "colorCircle": "#f1f1f1", "stroke": 5, "colorSlice": "url(#'+b+')", "fontSize": "1.3rem", "number": false }');Array.from(d.children).forEach(function(b){switch(!0){case b.matches("p"):b.innerText= +c+"%";a.appendChild(b);break;case b.matches("svg"):break;default:a.appendChild(b)}})}function C(a){var b=a.closest("section").getAttribute("id")+"-svg-gradient",c=+a.getAttribute("data-goal");y(a,b,c)}function J(a,b){if(a.classList.contains("circle-progress-section")&&b.includes("progress")&&"progressCount"!=b)if(b.includes("Color"))a.querySelectorAll(".pie_progress").forEach(function(b){var c=a.getAttribute("id")+"-svg-gradient",d=+b.getAttribute("data-goal");y(b,c,d)});else{var c=a.getAttribute("id")+ +"-svg-gradient",d=a.querySelector("."+b),f=+d.getAttribute("data-goal");y(d,c,f)}}function D(){if(document.querySelector(".loop-container")){var a=function(b){var c=0,d=0,f=+b.children[0].dataset.speed||.05,e=b.querySelector(".item"),h=e.dataset.direction;if(e){(function(){b.querySelectorAll(".item").forEach(function(a){a.textContent=a.dataset.linewords+"\u00a0"})})();b.style.cssText="position: relative; display: inline-flex; white-space: nowrap;";b.children[1].style.cssText="position: absolute; left: "+ +100*-h+"%;";var k=function(){d+=f;c=.8*c+.2*d;100this.status){var a=JSON.parse(this.responseText);f.style.backgroundImage='url("'+a[0].thumbnail_large+ +'")';f.style.display="block"}else k&&(f.style.backgroundImage='url("images/no-video.jpg")',f.style.display="block")};g.send();g=null;a.querySelector(".mbr-background-video")&&a.querySelector(".mbr-background-video").remove();g=document.createElement("div");g.classList.add("mbr-background-video");a.childNodes[1].before(g);b=new Vimeo.Player(g,{id:b,loop:!0,background:!0,responsive:!0,autoplay:!0,byline:!1,title:!1,muted:!0,controls:!1});g=b.element.parentNode;g.style.overflow="hidden";b.element.style.pointerEvents= +"none";b.element.style.marginLeft="-"+(b.element.scrollWidth-g.scrollWidth)/2+"px";b.element.style.minHeight="100vh";b.element.style.minWidth="177.77vh"}}else if(k)f.style.backgroundImage='url("images/video-placeholder.jpg")',f.style.display="block";else if(!k){var g=document.createElement("video"),e=document.createElement("source");g.append(e);a.childNodes[1].before(g);e.src=b;g.autoplay=!0;g.loop=!0;g.muted=!0;g.setAttribute("muted","");g.playsinline=!0;g.setAttribute("playsinline","");g.style.position= +"absolute";g.style.left="50%";g.style.top="50%";g.style.bottom="0";g.style.right="0";g.style.minWidth="100%";g.style.minHeight="100%";g.style.transform="translateX(-50%) translateY(-50%)";b="";a.querySelector(".mbr-fallback-image")&&(b=window.getComputedStyle(a.querySelector(".mbr-fallback-image")).backgroundImage,b=b.match(/\((.*?)\)/)[1].replace(/('|")/g,""),g.setAttribute("poster",b));g.parentNode.style.overflow="hidden"}}})}document.querySelector("html").classList.add(t()?"mobile":"desktop"); +window.addEventListener("scroll",function(){document.querySelectorAll(".mbr-navbar--sticky").forEach(function(a){var b=10a?0:1]=b;window.smartresize(function(){var a=window.innerHeight;0>c.indexOf(a)&&(a=c[window.innerWidth>a?1:0]);var b=document.querySelector(".mbr-section--full-height"); +b&&(b.style.height=a+"px")})}(window.innerWidth,window.innerHeight):K||(window.smartresize(function(){var a=document.querySelector(".mbr-section--full-height");a&&(a.style.height=window.innerHeight+"px")}),document.addEventListener("add.cards",function(a){document.querySelector("html").classList.contains("mbr-site-loaded")&&q(a.target,".mbr-section--full-height").length&&window.dispatchEvent(new CustomEvent("resize"))}));window.addEventListener("smartresize",function(){document.querySelectorAll(".mbr-section--16by9").forEach(a)}); +if(n)e(document).on("add.cards changeParameter.cards",function(b){var c=q(b.target,".mbr-section--16by9");c.length?c.forEach(function(b){b.setAttribute("data-16by9","true");a(b)}):q(b.target,"[data-16by9]").forEach(function(a){a.styles.height="";a.removeAttribute("data-16by9")})});if("undefined"!==typeof jarallax&&!t()){window.addEventListener("update.parallax",function(a){setTimeout(function(){if(a){var a=document.querySelector(".mbr-parallax-background");a.jarallax("coverImage");a.jarallax("clipContainer"); +a.jarallax("onScroll")}},0)});if(k){if(!n)return;e(document).on("add.cards",function(a){b(a.target);e(window).trigger("update.parallax")});e(document).on("changeParameter.cards",function(a,c,f,d){if("bg"===c)switch(c=a.target,jarallax&&jarallax(c,"destroy"),c.style.position="",e(a.target).find(".mbr-background-video-preview").remove(),e(a.target).find(".mbr-background-video").remove(),d){case "type":!0===f.parallax&&b(a.target);break;case "value":"image"===f.type&&!0===f.parallax&&b(a.target);break; +case "parallax":!0===f.parallax&&b(a.target)}e(window).trigger("update.parallax")})}else b(document.body);window.addEventListener("shown.bs.tab",function(){window.dispatchEvent(new CustomEvent("update.parallax"))})}var d,f,m=0,h=null,B=!t();window.addEventListener("scroll",function(){f&&clearTimeout(f);var a=document.documentElement.scrollTop,b=a<=m||B;m=a;if(h){var c=a>h.breakPoint;b?c!=h.fixed&&(B?(h.fixed=c,h.elm.classList.toggle("is-fixed")):f=setTimeout(function(){h.fixed=c;h.elm.classList.toggle("is-fixed")}, +40)):(h.fixed=!1,h.elm.classList.remove("is-fixed"))}});if(n)e(document).on("add.cards delete.cards",function(a){d&&clearTimeout(d);d=setTimeout(function(){h&&(h.fixed=!1,h.elm.classList.remove("is-fixed"));var a=document.querySelector(".mbr-fixed-top");a&&(h={breakPoint:w(a).top+3*u(a),fixed:!1,elm:a},a.dispatchEvent(new CustomEvent("scroll")))},650)});window.smartresize(function(){document.querySelectorAll(".mbr-embedded-video").forEach(function(a){a.style.height=(x(a)*parseInt(a.getAttribute("height")|| +315)/parseInt(a.getAttribute("width")||560)).toFixed()+"px"})});if(n)e(document).on("add.cards",function(a){document.querySelector("html").classList.contains("mbr-site-loaded")&&q(a.target,"iframe").length&&window.dispatchEvent(new CustomEvent("resize"))});if(k){if(!n)return;e(document).on("add.cards",function(a){c(a.target)})}else c(document.body);if(k)e(document).on("changeParameter.cards",function(a,b,f,d){if("bg"===b)switch(d){case "type":"video"===f.type&&c(a.target);break;case "value":"video"=== +f.type&&c(a.target)}});document.querySelector("html").classList.add("mbr-site-loaded");window.dispatchEvent(new CustomEvent("resize"));window.dispatchEvent(new CustomEvent("scroll"));k||document.addEventListener("click",function(a){try{var b=a.target;if(!b.parents().some(function(a){a.classList.contains("carousel")})){do if(b.hash){var c=/#bottom|#top/g.test(b.hash);document.querySelectorAll(c?"body":b.hash).forEach(function(c){a.preventDefault();var f=document.querySelector(".navbar-fixed-top"), +f="#bottom"==b.hash?u(c)-window.innerHeight:w(c).top-(f?60:0);c.classList.contains("panel-collapse")||c.classList.contains("tab-pane")||b.classList.contains("carousel-control")||b.parents(".carousel-controls").length||window.scrollTo({top:f,left:0,behavior:"smooth"})});break}while(b=b.parentNode)}}catch(f){}});document.querySelectorAll(".cols-same-height .mbr-figure").forEach(function(a){function b(){c.style.width="";c.style.maxWidth="";c.style.marginLeft="";if(e&&d){var h=e/d;a.style.position="absolute"; +a.style.top="0";a.style.left="0";a.style.right="0";a.style.bottom="0";var m=u(f)/x(f);m>h&&(h=100*(m-h)/h,c.style.width=h+100+"%",c.style.maxWidth=h+100+"%",c.style.marginLeft=-h/2+"%")}}var c=a.querySelector("img"),f=a.parentNode,d=c.width,e=c.height;c.addEventListener("load",function(){d=c.width;e=c.height;b()},{once:!0});window.addEventListener("resize",b);b()})});if(!k){if(n&&e.fn.socialLikes)e(document).on("add.cards",function(a){q(a.target,".mbr-social-likes").forEach(function(a){a.addEventListener("counter.social-likes", +function(a,b,f){999=a&&g-50<=e||b(d))&&d.classList.contains("hidden")&&(d.classList.remove("hidden"),d.classList.add("animate__fadeInUp"),d.classList.add("animate__delay-1s"),d.addEventListener("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){d.classList.remove("animate__animated animate__delay-1s animate__fadeInUp")},{once:!0}))})},b=function(a){if(a.parents(".carousel-item").some(function(a){return"none"!== +getComputedStyle(a,null).display}))return!1;var b=a.parents(".carousel-item").parentNode;if(!b||b.querySelectorAll(".carousel-item.active .hidden.animate__animated").length)return!1;if(1=c}))return!0;a.classList.remove("animate__animated animate__delay-1s hidden"); +return!1}return!0},c=function(a){var b=0;do b+=a.offsetTop||0,a=a.offsetParent;while(a);return b};document.querySelectorAll("input[name=animation]").forEach(function(a){a.remove()});var d=Array.from(document.querySelectorAll("p, h1, h2, h3, h4, h5, a, button, small, img, li, blockquote, .mbr-author-name, em, label, input, select, textarea, .input-group, .form-control, .iconbox, .btn-social, .mbr-figure, .mbr-map, .mbr-testimonial .card-block, .mbr-price-value, .mbr-price-figure, .dataTable, .dataTables_info")), +d=d.filter(function(a){if(!a.parents().filter(function(a){if(a.matches("a, p, .navbar, .mbr-arrow, footer, .iconbox, .mbr-slider, .mbr-gallery, .mbr-testimonial .card-block, #cookiesdirective, .mbr-wowslider, .accordion, .tab-content, .engine, #scrollToTop, .modal"))return!0}).length)return!0}),d=d.filter(function(a){if(!a.parents().filter(function(b){return b.matches("form")&&!a.matches("li")}).length)return!0});d.forEach(function(a){a.classList.add("hidden");a.classList.add("animate__animated"); +a.classList.add("animate__delay-1s")});window.addEventListener("scroll",a);window.addEventListener("resize",a);window.dispatchEvent(new CustomEvent("scroll"))}})}r(function(){if(document.querySelectorAll(".mbr-arrow-up").length){var a=document.querySelector("#scrollToTop");a.style.display="none";window.addEventListener("scroll",function(){var b=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight, +document.documentElement.clientHeight);(document.documentElement.scrollTop||document.body.scrollTop)>b/2-document.documentElement.clientHeight/2||window.scrollY>window.innerHeight?G(a):F(a)});a.addEventListener("click",function(){window.scrollTo({top:0,left:0,behavior:"smooth"});return!1})}});if(!k){var p=document.querySelector(".mbr-arrow");p&&p.addEventListener("click",function(a){a=a.target.closest("section").nextElementSibling;a.classList.contains("engine")&&(a=a.closest("section").nextElementSibling); +window.scrollTo(0,w(a).top)})}document.querySelectorAll("nav.navbar").length&&(p=u(document.querySelector("nav.navbar")),document.querySelector(".mbr-after-navbar.mbr-fullscreen")&&(document.querySelector(".mbr-after-navbar.mbr-fullscreen").style.paddingTop=p+"px"));if(!k&&(0 iframe").forEach(function(a){var b=a.getAttribute("data-src");if(b){a.removeAttribute("data-src");var f=b.match(/(http:\/\/|https:\/\/|)?(player.|www.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com))\/(shorts\/|video\/|embed\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(&\S+)?/);if(-1!==b.indexOf("youtu"))a.setAttribute("src","https://youtube.com/embed/"+f[6]+"?rel=0&enablejsapi=1");else if(-1!==b.indexOf("vimeo"))a.setAttribute("src","https://player.vimeo.com/video/"+ +f[6]+"?autoplay=0&loop=0");else if(/\.mp4|\.webm|\.ogg|\.ogv|\.m4a|\.m4v/.test(b)){f=document.createElement("video");f.onloadeddata=function(a){a.target.style.height=a.target.videoHeight>a.target.videoWidth?window.innerHeight-.2*window.innerHeight+"px":"100%"};var e=a.parents("section")[0].querySelector("img");e&&f.setAttribute("poster",e.src);f.setAttribute("controls","");f.setAttribute("playsinline","");f.setAttribute("loop","");f.setAttribute("src",b);a.style.display="none";f.style.width="100%"; +a.after(f)}}});document.querySelector("[data-modal]")&&document.querySelectorAll("[data-modal]").forEach(function(b){b.addEventListener("click",a)})}});if(!k){var p=document.querySelectorAll(".dropdown-toggle.show"),z=document.querySelectorAll(".dropdown-menu.show, .dropdown.open"),L=document.querySelectorAll(".dropdown.open");p.forEach(function(a){a.classList.remove("show");a.ariaExpanded="false"});z.forEach(function(a){return a.classList.remove("show")});L.forEach(function(a){return a.classList.remove("open")}); +!t()&&(p=document.querySelector("section.menu"))&&(z=window.innerWidth,!p.querySelector(".navbar").classList.contains("collapsed")&&991 .card > .card-header > a[role="button"]').forEach(function(a){a.classList.contains("collapsed")||a.classList.add("collapsed")})}),document.querySelectorAll('.accordionStyles > .card > .card-header > a[role="button"]').forEach(function(a){a.addEventListener("click",function(){var b=a.closest(".accordionStyles").getAttribute("id"),c=a.closest(".card").querySelector(".panel-collapse"),d=a.querySelector("span.sign")?a.querySelector("span.sign"):a.querySelector("span.mbr-iconfont"); +!c.classList.contains("collapsing")||-1==b.indexOf("toggle")&&-1==b.indexOf("accordion")||(a.classList.contains("collapsed")?(d.classList.remove("mbri-arrow-up"),d.classList.add("mbri-arrow-down")):(d.classList.remove("mbri-arrow-down"),d.classList.add("mbri-arrow-up")),-1!=b.indexOf("accordion")&&(b=a.closest(".accordionStyles"),Array.from(b.children).filter(function(a){return a.querySelector("span.sign")!==d}).forEach(function(a){a=a.querySelector("span.sign")?a.querySelector("span.sign"):a.querySelector("span.mbr-iconfont"); +a.classList.remove("mbri-arrow-up");a.classList.add("mbri-arrow-down")})))})})),0!=document.querySelectorAll(".mbr-slider.carousel").length&&document.querySelectorAll(".mbr-slider.carousel").forEach(function(a){var b=a.querySelectorAll(".carousel-control"),c=a.querySelectorAll(".carousel-indicators li"),d=function(a){a.stopPropagation();a.preventDefault()};a.addEventListener("slide.bs.carousel",function(){b.forEach(function(a){a.addEventListener("click",d)});c.forEach(function(a){a.addEventListener("click", +d)});n&&e(a).carousel({keyboard:!1})});a.addEventListener("slid.bs.carousel",function(){b.forEach(function(a){a.removeEventListener("click",d)});c.forEach(function(a){a.removeEventListener("click",d)});n&&e(a).carousel({keyboard:!0});1 + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/web/assets/mobirise-icons/mobirise-icons.ttf b/assets/web/assets/mobirise-icons/mobirise-icons.ttf new file mode 100644 index 0000000..23c1d28 Binary files /dev/null and b/assets/web/assets/mobirise-icons/mobirise-icons.ttf differ diff --git a/assets/web/assets/mobirise-icons/mobirise-icons.woff b/assets/web/assets/mobirise-icons/mobirise-icons.woff new file mode 100644 index 0000000..8782982 Binary files /dev/null and b/assets/web/assets/mobirise-icons/mobirise-icons.woff differ diff --git a/assets/web/assets/mobirise-icons2/mobirise2.css b/assets/web/assets/mobirise-icons2/mobirise2.css new file mode 100644 index 0000000..e98ea29 --- /dev/null +++ b/assets/web/assets/mobirise-icons2/mobirise2.css @@ -0,0 +1,498 @@ +@font-face { + font-family: 'Moririse2'; + font-display: swap; + src: url('mobirise2.eot?f2bix4'); + src: url('mobirise2.eot?f2bix4#iefix') format('embedded-opentype'), + url('mobirise2.ttf?f2bix4') format('truetype'), + url('mobirise2.woff?f2bix4') format('woff'), + url('mobirise2.svg?f2bix4#mobirise2') format('svg'); + font-weight: normal; + font-style: normal; +} + +[class^="mobi-"], [class*=" mobi-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'Moririse2' !important; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.mobi-mbri-add-submenu:before { + content: "\e900"; +} +.mobi-mbri-alert:before { + content: "\e901"; +} +.mobi-mbri-align-center:before { + content: "\e902"; +} +.mobi-mbri-align-justify:before { + content: "\e903"; +} +.mobi-mbri-align-left:before { + content: "\e904"; +} +.mobi-mbri-align-right:before { + content: "\e905"; +} +.mobi-mbri-android:before { + content: "\e906"; +} +.mobi-mbri-apple:before { + content: "\e907"; +} +.mobi-mbri-arrow-down:before { + content: "\e908"; +} +.mobi-mbri-arrow-next:before { + content: "\e909"; +} +.mobi-mbri-arrow-prev:before { + content: "\e90a"; +} +.mobi-mbri-arrow-up:before { + content: "\e90b"; +} +.mobi-mbri-bold:before { + content: "\e90c"; +} +.mobi-mbri-bookmark:before { + content: "\e90d"; +} +.mobi-mbri-bootstrap:before { + content: "\e90e"; +} +.mobi-mbri-briefcase:before { + content: "\e90f"; +} +.mobi-mbri-browse:before { + content: "\e910"; +} +.mobi-mbri-bulleted-list:before { + content: "\e911"; +} +.mobi-mbri-calendar:before { + content: "\e912"; +} +.mobi-mbri-camera:before { + content: "\e913"; +} +.mobi-mbri-cart-add:before { + content: "\e914"; +} +.mobi-mbri-cart-full:before { + content: "\e915"; +} +.mobi-mbri-cash:before { + content: "\e916"; +} +.mobi-mbri-change-style:before { + content: "\e917"; +} +.mobi-mbri-chat:before { + content: "\e918"; +} +.mobi-mbri-clock:before { + content: "\e919"; +} +.mobi-mbri-close:before { + content: "\e91a"; +} +.mobi-mbri-cloud:before { + content: "\e91b"; +} +.mobi-mbri-code:before { + content: "\e91c"; +} +.mobi-mbri-contact-form:before { + content: "\e91d"; +} +.mobi-mbri-credit-card:before { + content: "\e91e"; +} +.mobi-mbri-cursor-click:before { + content: "\e91f"; +} +.mobi-mbri-cust-feedback:before { + content: "\e920"; +} +.mobi-mbri-database:before { + content: "\e921"; +} +.mobi-mbri-delivery:before { + content: "\e922"; +} +.mobi-mbri-desktop:before { + content: "\e923"; +} +.mobi-mbri-devices:before { + content: "\e924"; +} +.mobi-mbri-down:before { + content: "\e925"; +} +.mobi-mbri-download-2:before { + content: "\e926"; +} +.mobi-mbri-download:before { + content: "\e927"; +} +.mobi-mbri-drag-n-drop-2:before { + content: "\e928"; +} +.mobi-mbri-drag-n-drop:before { + content: "\e929"; +} +.mobi-mbri-edit-2:before { + content: "\e92a"; +} +.mobi-mbri-edit:before { + content: "\e92b"; +} +.mobi-mbri-error:before { + content: "\e92c"; +} +.mobi-mbri-extension:before { + content: "\e92d"; +} +.mobi-mbri-features:before { + content: "\e92e"; +} +.mobi-mbri-file:before { + content: "\e92f"; +} +.mobi-mbri-flag:before { + content: "\e930"; +} +.mobi-mbri-folder:before { + content: "\e931"; +} +.mobi-mbri-gift:before { + content: "\e932"; +} +.mobi-mbri-github:before { + content: "\e933"; +} +.mobi-mbri-globe-2:before { + content: "\e934"; +} +.mobi-mbri-globe:before { + content: "\e935"; +} +.mobi-mbri-growing-chart:before { + content: "\e936"; +} +.mobi-mbri-hearth:before { + content: "\e937"; +} +.mobi-mbri-help:before { + content: "\e938"; +} +.mobi-mbri-home:before { + content: "\e939"; +} +.mobi-mbri-hot-cup:before { + content: "\e93a"; +} +.mobi-mbri-idea:before { + content: "\e93b"; +} +.mobi-mbri-image-gallery:before { + content: "\e93c"; +} +.mobi-mbri-image-slider:before { + content: "\e93d"; +} +.mobi-mbri-info:before { + content: "\e93e"; +} +.mobi-mbri-italic:before { + content: "\e93f"; +} +.mobi-mbri-key:before { + content: "\e940"; +} +.mobi-mbri-laptop:before { + content: "\e941"; +} +.mobi-mbri-layers:before { + content: "\e942"; +} +.mobi-mbri-left-right:before { + content: "\e943"; +} +.mobi-mbri-left:before { + content: "\e944"; +} +.mobi-mbri-letter:before { + content: "\e945"; +} +.mobi-mbri-like:before { + content: "\e946"; +} +.mobi-mbri-link:before { + content: "\e947"; +} +.mobi-mbri-lock:before { + content: "\e948"; +} +.mobi-mbri-login:before { + content: "\e949"; +} +.mobi-mbri-logout:before { + content: "\e94a"; +} +.mobi-mbri-magic-stick:before { + content: "\e94b"; +} +.mobi-mbri-map-pin:before { + content: "\e94c"; +} +.mobi-mbri-menu:before { + content: "\e94d"; +} +.mobi-mbri-mobile-2:before { + content: "\e94e"; +} +.mobi-mbri-mobile-horizontal:before { + content: "\e94f"; +} +.mobi-mbri-mobile:before { + content: "\e950"; +} +.mobi-mbri-mobirise:before { + content: "\e951"; +} +.mobi-mbri-more-horizontal:before { + content: "\e952"; +} +.mobi-mbri-more-vertical:before { + content: "\e953"; +} +.mobi-mbri-music:before { + content: "\e954"; +} +.mobi-mbri-new-file:before { + content: "\e955"; +} +.mobi-mbri-numbered-list:before { + content: "\e956"; +} +.mobi-mbri-opened-folder:before { + content: "\e957"; +} +.mobi-mbri-pages:before { + content: "\e958"; +} +.mobi-mbri-paper-plane:before { + content: "\e959"; +} +.mobi-mbri-paperclip:before { + content: "\e95a"; +} +.mobi-mbri-phone:before { + content: "\e95b"; +} +.mobi-mbri-photo:before { + content: "\e95c"; +} +.mobi-mbri-photos:before { + content: "\e95d"; +} +.mobi-mbri-pin:before { + content: "\e95e"; +} +.mobi-mbri-play:before { + content: "\e95f"; +} +.mobi-mbri-plus:before { + content: "\e960"; +} +.mobi-mbri-preview:before { + content: "\e961"; +} +.mobi-mbri-print:before { + content: "\e962"; +} +.mobi-mbri-protect:before { + content: "\e963"; +} +.mobi-mbri-question:before { + content: "\e964"; +} +.mobi-mbri-quote-left:before { + content: "\e965"; +} +.mobi-mbri-quote-right:before { + content: "\e966"; +} +.mobi-mbri-redo:before { + content: "\e967"; +} +.mobi-mbri-refresh:before { + content: "\e968"; +} +.mobi-mbri-responsive-2:before { + content: "\e969"; +} +.mobi-mbri-responsive:before { + content: "\e96a"; +} +.mobi-mbri-right:before { + content: "\e96b"; +} +.mobi-mbri-rocket:before { + content: "\e96c"; +} +.mobi-mbri-sad-face:before { + content: "\e96d"; +} +.mobi-mbri-sale:before { + content: "\e96e"; +} +.mobi-mbri-save:before { + content: "\e96f"; +} +.mobi-mbri-search:before { + content: "\e970"; +} +.mobi-mbri-setting-2:before { + content: "\e971"; +} +.mobi-mbri-setting-3:before { + content: "\e972"; +} +.mobi-mbri-setting:before { + content: "\e973"; +} +.mobi-mbri-share:before { + content: "\e974"; +} +.mobi-mbri-shopping-bag:before { + content: "\e975"; +} +.mobi-mbri-shopping-basket:before { + content: "\e976"; +} +.mobi-mbri-shopping-cart:before { + content: "\e977"; +} +.mobi-mbri-sites:before { + content: "\e978"; +} +.mobi-mbri-smile-face:before { + content: "\e979"; +} +.mobi-mbri-speed:before { + content: "\e97a"; +} +.mobi-mbri-star:before { + content: "\e97b"; +} +.mobi-mbri-success:before { + content: "\e97c"; +} +.mobi-mbri-sun:before { + content: "\e97d"; +} +.mobi-mbri-sun2:before { + content: "\e97e"; +} +.mobi-mbri-tablet-vertical:before { + content: "\e97f"; +} +.mobi-mbri-tablet:before { + content: "\e980"; +} +.mobi-mbri-target:before { + content: "\e981"; +} +.mobi-mbri-timer:before { + content: "\e982"; +} +.mobi-mbri-to-ftp:before { + content: "\e983"; +} +.mobi-mbri-to-local-drive:before { + content: "\e984"; +} +.mobi-mbri-touch-swipe:before { + content: "\e985"; +} +.mobi-mbri-touch:before { + content: "\e986"; +} +.mobi-mbri-trash:before { + content: "\e987"; +} +.mobi-mbri-underline:before { + content: "\e988"; +} +.mobi-mbri-undo:before { + content: "\e989"; +} +.mobi-mbri-unlink:before { + content: "\e98a"; +} +.mobi-mbri-unlock:before { + content: "\e98b"; +} +.mobi-mbri-up-down:before { + content: "\e98c"; +} +.mobi-mbri-up:before { + content: "\e98d"; +} +.mobi-mbri-update:before { + content: "\e98e"; +} +.mobi-mbri-upload-2:before { + content: "\e98f"; +} +.mobi-mbri-upload:before { + content: "\e990"; +} +.mobi-mbri-user-2:before { + content: "\e991"; +} +.mobi-mbri-user:before { + content: "\e992"; +} +.mobi-mbri-users:before { + content: "\e993"; +} +.mobi-mbri-video-play:before { + content: "\e994"; +} +.mobi-mbri-video:before { + content: "\e995"; +} +.mobi-mbri-watch:before { + content: "\e996"; +} +.mobi-mbri-website-theme-2:before { + content: "\e997"; +} +.mobi-mbri-website-theme:before { + content: "\e998"; +} +.mobi-mbri-wifi:before { + content: "\e999"; +} +.mobi-mbri-windows:before { + content: "\e99a"; +} +.mobi-mbri-zoom-in:before { + content: "\e99b"; +} +.mobi-mbri-zoom-out:before { + content: "\e99c"; +} diff --git a/assets/web/assets/mobirise-icons2/mobirise2.eot b/assets/web/assets/mobirise-icons2/mobirise2.eot new file mode 100644 index 0000000..6d1ffe0 Binary files /dev/null and b/assets/web/assets/mobirise-icons2/mobirise2.eot differ diff --git a/assets/web/assets/mobirise-icons2/mobirise2.svg b/assets/web/assets/mobirise-icons2/mobirise2.svg new file mode 100644 index 0000000..0321082 --- /dev/null +++ b/assets/web/assets/mobirise-icons2/mobirise2.svg @@ -0,0 +1,167 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/web/assets/mobirise-icons2/mobirise2.ttf b/assets/web/assets/mobirise-icons2/mobirise2.ttf new file mode 100644 index 0000000..fe7394d Binary files /dev/null and b/assets/web/assets/mobirise-icons2/mobirise2.ttf differ diff --git a/assets/web/assets/mobirise-icons2/mobirise2.woff b/assets/web/assets/mobirise-icons2/mobirise2.woff new file mode 100644 index 0000000..433d394 Binary files /dev/null and b/assets/web/assets/mobirise-icons2/mobirise2.woff differ diff --git a/assets/ytplayer/index.js b/assets/ytplayer/index.js new file mode 100644 index 0000000..391ad6b --- /dev/null +++ b/assets/ytplayer/index.js @@ -0,0 +1,31 @@ +/*! yt-player. MIT License. Feross Aboukhadijeh */ +var $jscomp={scope:{},global:this,initSymbolIterator:function(){Symbol=$jscomp.global.Symbol||{};Symbol.iterator||(Symbol.iterator="$jscomp$iterator");$jscomp.initSymbolIterator=function(){}},makeIterator:function(a){$jscomp.initSymbolIterator();if(a[Symbol.iterator])return a[Symbol.iterator]();if(!(a instanceof Array)&&"string"!=typeof a)throw Error();var b=0;return{next:function(){return b==a.length?{done:!0}:{done:!1,value:a[b++]}}}},inherits:function(a,b){function c(){}c.prototype=b.prototype; +a.prototype=new c;a.prototype.constructor=a;for(var d in b)if($jscomp.global.Object.defineProperties){var e=$jscomp.global.Object.getOwnPropertyDescriptor(b,d);void 0!==e&&$jscomp.global.Object.defineProperty(a,d,e)}else a[d]=b[d]}},EventEmitter=function(){this.events={}};EventEmitter.prototype.on=function(a,b){"object"!==typeof this.events[a]&&(this.events[a]=[]);this.events[a].push(b)}; +EventEmitter.prototype.removeListener=function(a,b){var c;"object"===typeof this.events[a]&&(c=this.indexOf(this.events[a],b),-1=b._player.getDuration()-Number(a)){b.seek(0);for(var c=$jscomp.makeIterator(b.replayInterval.entries()),d=c.next();!d.done;d=c.next())d=d.value[0],Object.hasOwnProperty.call(b.replayInterval,d)&&(clearInterval(b.replayInterval[d].interval), +b.replayInterval.splice(d,1))}},1E3*Number(a))})};YouTubePlayer.prototype.pause=function(){this._ready?this._player.pauseVideo():this._queueCommand("pause")};YouTubePlayer.prototype.stop=function(){this._ready?this._player.stopVideo():this._queueCommand("stop")};YouTubePlayer.prototype.seek=function(a){this._ready?this._player.seekTo(a,!0):this._queueCommand("seek",a)}; +YouTubePlayer.prototype._optimizeDisplayHandler=function(a){if(this._player){var b=this._player.i;a=a.split(",");if(b){var c,d;if(c=b.parentElement){var e=window.getComputedStyle(c);d=c.clientHeight+parseFloat(e.marginTop,10)+parseFloat(e.marginBottom,10)+parseFloat(e.borderTopWidth,10)+parseFloat(e.borderBottomWidth,10);c=c.clientWidth+parseFloat(e.marginLeft,10)+parseFloat(e.marginRight,10)+parseFloat(e.borderLeftWidth,10)+parseFloat(e.borderRightWidth,10);d+=80;b.style.width=c+"px";b.style.height= +Math.ceil(parseFloat(b.style.width,10)/1.7)+"px";b.style.marginTop=Math.ceil(-((parseFloat(b.style.height,10)-d)/2))+"px";b.style.marginLeft=0;if(e=parseFloat(b.style.height,10)c&&(b.style.marginLeft=-((parseFloat(b.style.width,10)-c)/2)+"px")}}}}};YouTubePlayer.prototype.stopResize=function(){window.removeEventListener("resize",this._resizeListener);this._resizeListener=null}; +YouTubePlayer.prototype.stopReplay=function(a){for(var b=$jscomp.makeIterator(this.replayInterval.entries()),c=b.next();!c.done;c=b.next())c=c.value[0],Object.hasOwnProperty.call(this.replayInterval,c)&&a===this.replayInterval[c].iframeParent&&(clearInterval(this.replayInterval[c].interval),this.replayInterval.splice(c,1))};YouTubePlayer.prototype.setVolume=function(a){this._ready?this._player.setVolume(a):this._queueCommand("setVolume",a)}; +YouTubePlayer.prototype.loadPlaylist=function(){this._ready?this._player.loadPlaylist(this.videoId):this._queueCommand("loadPlaylist",this.videoId)};YouTubePlayer.prototype.setLoop=function(a){this._ready?this._player.setLoop(a):this._queueCommand("setLoop",a)};YouTubePlayer.prototype.getVolume=function(){return this._ready&&this._player.getVolume()||0};YouTubePlayer.prototype.mute=function(){this._ready?this._player.mute():this._queueCommand("mute")}; +YouTubePlayer.prototype.unMute=function(){this._ready?this._player.unMute():this._queueCommand("unMute")};YouTubePlayer.prototype.isMuted=function(){return this._ready&&this._player.isMuted()||!1};YouTubePlayer.prototype.setSize=function(a,b){this._ready?this._player.setSize(a,b):this._queueCommand("setSize",a,b)};YouTubePlayer.prototype.setPlaybackRate=function(a){this._ready?this._player.setPlaybackRate(a):this._queueCommand("setPlaybackRate",a)}; +YouTubePlayer.prototype.setPlaybackQuality=function(a){this._ready?this._player.setPlaybackQuality(a):this._queueCommand("setPlaybackQuality",a)};YouTubePlayer.prototype.getPlaybackRate=function(){return this._ready&&this._player.getPlaybackRate()||1};YouTubePlayer.prototype.getAvailablePlaybackRates=function(){return this._ready&&this._player.getAvailablePlaybackRates()||[1]};YouTubePlayer.prototype.getDuration=function(){return this._ready&&this._player.getDuration()||0}; +YouTubePlayer.prototype.getProgress=function(){return this._ready&&this._player.getVideoLoadedFraction()||0};YouTubePlayer.prototype.getState=function(){return this._ready&&YOUTUBE_STATES[this._player.getPlayerState()]||"unstarted"};YouTubePlayer.prototype.getCurrentTime=function(){return this._ready&&this._player.getCurrentTime()||0};YouTubePlayer.prototype.destroy=function(){this._destroy()}; +YouTubePlayer.prototype._destroy=function(a){this.destroyed||(this.destroyed=!0,this._player&&(this._player.stopVideo&&this._player.stopVideo(),this._player.destroy()),this._player=this._api=this._opts=this._id=this.videoId=null,this._ready=!1,this._queue=null,this._stopInterval(),this.removeListener("playing",this._startInterval),this.removeListener("paused",this._stopInterval),this.removeListener("buffering",this._stopInterval),this.removeListener("unstarted",this._stopInterval),this.removeListener("ended", +this._stopInterval),a&&this.emit("error",a))};YouTubePlayer.prototype._queueCommand=function(a,b){for(var c=[],d=1;d + + + + + + + + + + + + Home + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + +
+ +
+
+
+
+
+ +
+

+ Mintership Details

+

+ Learn more about the Mintership concept, and why it was needed. The days of 'sponsorship' are a thing of the past on the Qortal Network. No more will there be the ability to self-sponsor. A new era of Qortal begins! Join the conversation with the other minters and admins here!

+ +
+
+
+
+
+ +
+

Become A Minter

+

+ Not already minting? You've come to the right place to get started. The 'MINTERS.' links will take you to the 'Minter Board'. The Minter Board is a place to publish your intent to become a minter, and get support from the existing minters and Minter Admins.

+ +
+
+
+
+
+ +
+

Minter Admin Tools

+

+ Are you one of the initially selected Minter Admins? We have the tools here you need to create and approve GROUP_APPROVAL transactions, and communicate securely with your fellow admins. There is a private forum, and Minter Admin Tools section available for you!

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

+ More information...

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

+ This is the beginning...

+
+
+
+
+

+ This is the very start of the Q-Mintership app. It will be dramatically changing upon the beta release, and modification to the Q-Mintership Q-App. This initial version is a version that could be launched more quickly, and does not have nearly as much functionality as what will exist once the main app goes live. 

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

Q-Mintership Alpha

+
+
+ + + + +
+
+ +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/project.mobirise b/project.mobirise new file mode 100644 index 0000000..939d577 --- /dev/null +++ b/project.mobirise @@ -0,0 +1,1434 @@ +{ + "settings": { + "currentPage": "index.html", + "theme": { + "name": "boldm5", + "title": "BoldM5", + "styling": { + "primaryColor": "#ffffff", + "secondaryColor": "#a4a2a2", + "successColor": "#324c6d", + "infoColor": "#000000", + "warningColor": "#265e98", + "dangerColor": "#b6b6b6", + "mainFont": "Space Grotesk", + "display1Font": "DM Sans", + "display1Size": 4.4, + "display2Font": "DM Sans", + "display2Size": 2.6, + "display5Font": "DM Sans", + "display5Size": "1.5", + "display7Font": "DM Sans", + "display7Size": 1.125, + "display4Font": "Space Grotesk", + "display4Size": "1.25", + "isRoundedButtons": true, + "isGhostButtonBorder": false, + "underlinedLinks": false, + "isAnimatedOnScroll": true, + "isScrollToTopButton": false + }, + "titlePreset": "Technology Company", + "nameSelectPreset": "technology-company", + "presetSourceTheme": "boldm5", + "additionalSetColors": [ + "#20a6e2", + "#324c6d", + "#317e78", + "#376277", + "#265e98" + ] + }, + "path": "@PROJECT_PATH@", + "name": "Mintership-Forum-Alpha", + "versionFirst": "5.9.7", + "siteFonts": [ + { + "css": "'Space Grotesk', sans-serif", + "name": "Space Grotesk", + "url": "https://fonts.googleapis.com/css?family=Space+Grotesk:300,400,500,600,700" + }, + { + "css": "'DM Sans', sans-serif", + "name": "DM Sans", + "url": "https://fonts.googleapis.com/css?family=DM+Sans:100,200,300,400,500,600,700,800,900,100i,200i,300i,400i,500i,600i,700i,800i,900i" + } + ], + "imageResize": true, + "uniqCompNum": 7, + "versionPublish": "5.9.19", + "screenshot": "screenshot.png", + "favicon": "@PROJECT_PATH@/assets/images/modded-circle-2-new-128x128.png", + "mbrsiteDomain": "dl77uhfpwc", + "usedWebp": false, + "robotsSwitcher": false, + "sitemapSwitcher": false, + "sitemapSwitcherAuto": false, + "siteUrl": false, + "cookiesAlert": false, + "gdpr": false, + "robotsText": "User-agent: *\r\nDisallow: /cgi-bin\r\n", + "mcSmartCart": { + "currency": "USD", + "paymentSystem": "stripe", + "ACCOUNT_KEY": "acct_1PVPEZHAkeqfKTT8_sCmif7Aai6Y72hn0ZMASd7pfyfDWmbZhw1xF1xiUYvW", + "stripe_button": "Pay Now" + } + }, + "pages": { + "index.html": { + "settings": { + "main": true, + "title": "Home", + "meta_descr": "Welcome to the Mintership Forum (alpha version)", + "header_custom": "\n\n\n\n \n", + "footer_custom": "\n\n", + "html_before": "" + }, + "components": [ + { + "alias": false, + "_styles": { + ".navbar-dropdown": { + "& when not (@transparent)": { + "background-color": "@menuBgColor !important" + }, + "& when (@transparent)": { + "background": "rgba(red(@menuBgColor), green(@menuBgColor), blue(@menuBgColor), @opacity) !important" + }, + "padding": "0", + "& when (@sticky)": { + "position": "fixed" + } + }, + ".navbar.navbar-expand-lg .dropdown": { + ".dropdown-menu": { + "& when not (@transparent)": { + "background-color": "@menuBgColor !important" + }, + "& when (@transparent)": { + "background": "rgba(red(@menuBgColor), green(@menuBgColor), blue(@menuBgColor), @opacity) !important" + }, + ".dropdown-submenu": { + "margin": "0", + "left": "100%" + }, + "background": "@menuBgColor" + } + }, + ".menu_box": { + "@media (max-width: 991px)": { + ".navbar.opened, .navbar-collapse": { + "background-color": "@menuBgColor !important", + "transition": "all 0s ease 0s" + } + } + }, + "& when not (@sticky)": { + ".navbar-dropdown": { + "position": "relative !important" + } + }, + "& when (@sticky)": { + "z-index": "1000", + "width": "100%", + "nav.navbar": { + "position": "fixed", + "padding-top": "1rem", + "padding-bottom": "1rem" + } + }, + "& when (@showSidebar)": { + ".icons-menu-main": { + "display": "none", + "@media (max-width: 991px)": { + "max-width": "100%", + "margin": "1rem 0 1rem 1rem", + "display": "flex" + } + }, + ".mbr-section-btn-main": { + "display": "none", + "@media (max-width: 991px)": { + "margin-top": "1rem", + "display": "block" + } + } + }, + "& when not (@showSidebar)": { + ".icons-menu-main": { + "display": "flex", + "flex-wrap": "wrap", + "max-width": "150px", + "@media (max-width: 991px)": { + "max-width": "100%", + "margin": "1rem 0 1rem 1rem" + } + }, + ".mbr-section-btn-main": { + "@media (max-width: 991px)": { + "margin-top": "1rem" + } + } + }, + ".btn": { + "min-height": "auto", + "box-shadow": "none", + "margin-top": "0", + "&:hover": { + "box-shadow": "none" + } + }, + "@media (min-width: 992px)": { + ".offcanvas": { + "padding": "12rem 80px 0", + "width": "30%", + "background-color": "@offSidebarColor" + }, + ".offcanvas_image img": { + "width": "auto", + "object-fit": "cover", + "display": "inline-block" + }, + ".offcanvas-header": { + "position": "relative", + "padding": "0", + ".btn-close": { + "position": "absolute", + "top": "-70px", + "right": "0", + "width": "35px", + "height": "30px" + } + }, + ".offcanvas-body": { + "text-align": "center", + "padding": "0", + ".mbr-text, .mbr-section-subtitle": { + "margin-top": "14px" + }, + ".offcanvas_contact": { + "margin": "35px 0" + } + }, + ".offcanvas_box": { + "button.btn_offcanvas": { + "outline": "none", + "width": "40px", + "height": "40px", + "cursor": "pointer", + "transition": "all 0.2s", + "position": "relative", + "align-self": "center", + ".hamburger span": { + "position": "absolute", + "right": "0", + "width": "40px", + "height": "2px", + "border-right": "5px", + "background-color": "@hamburgerColor", + "&:nth-child(1)": { + "top": "18px", + "transition": "all 0.2s" + }, + "&:nth-child(2)": { + "top": "25px", + "transition": "all 0.2s" + } + }, + "&:hover .hamburger span": { + "width": "36px", + "&:nth-child(2)": { + "width": "33px", + "transition-delay": "0.2s" + } + } + } + }, + "ul.navbar-nav": { + "padding-bottom": "1.5rem" + }, + ".dropdown-menu .dropdown-toggle[data-toggle=\"dropdown-submenu\"]::after, .link.dropdown-toggle::after": { + "display": "inline-block", + "width": "7px", + "height": "7px", + "margin-left": ".5rem", + "margin-bottom": "2px", + "content": "\"\"", + "border": "2px solid", + "border-left": "none", + "border-top": "none", + "transform": "rotate(-45deg)" + }, + ".link.dropdown-toggle::after": { + "padding": "0 !important", + "transform": "rotate(45deg)" + }, + "li.nav-item": { + "position": "relative", + "display": "inline-block", + "padding": "1px 7px !important", + "vertical-align": "middle", + "line-height": "2em !important", + "font-weight": "600 !important", + "text-decoration": "none", + "letter-spacing": "0 !important", + "z-index": "1" + }, + ".lg_brand": { + "margin": "0 1rem" + } + }, + ".nav-item": { + "margin": "4px 15px", + "@media (min-width: 1200px)": { + "margin": "4px 20px" + }, + "@media (max-width: 991px)": { + "margin": "0 !important" + } + }, + ".dropdown-menu": { + "border-radius": "0", + "box-shadow": "none", + "text-align": "left", + "@media (min-width: 992px)": { + "padding": "18px 34px 22px", + "min-width": "250px", + "top": "auto !important", + "left": "-40px !important", + "&.dropdown-submenu": { + "left": "215px !important", + "top": "-45% !important" + } + } + }, + "@media (max-width: 991px)": { + ".dropdown-menu .dropdown-toggle[data-toggle=\"dropdown-submenu\"]::after, .link.dropdown-toggle::after": { + "display": "inline-block", + "width": "7px", + "height": "7px", + "margin-left": ".5rem", + "margin-bottom": "2px", + "content": "\"\"", + "border": "2px solid", + "border-left": "none", + "border-top": "none", + "transform": "rotate(-45deg)", + "right": "15px", + "position": "absolute", + "margin-top": "-2px" + }, + ".show.dropdown-toggle[aria-expanded=\"true\"]::after": { + "transform": "rotate(45deg)", + "margin-top": "-4px" + }, + ".offcanvas_box": { + "display": "none" + } + }, + ".dropdown-item": { + "border": "none", + "font-weight": "400 !important" + }, + ".nav-dropdown .link": { + "font-weight": "400 !important", + "padding": "0 !important", + "margin": "0 !important" + }, + ".nav-dropdown .link.dropdown-toggle::after": { + "margin-left": "0.5rem", + "margin-top": "0" + }, + ".container": { + "display": "flex", + "margin": "auto" + }, + ".iconfont-wrapper": { + "color": "@iconsColor", + "font-size": "17px", + "margin-right": "10px", + "margin-bottom": "5px", + "&:last-child": { + "margin-right": "0" + }, + "width": "25px", + "height": "25px", + "border-radius": "50%", + "display": "flex", + "justify-content": "center", + "align-items": "center", + "transition": "all 0.2s ease-in-out", + "&:hover": { + "opacity": ".5" + } + }, + ".navbar-caption": { + "color": "#ffffff" + }, + ".navbar-nav": { + "@media (min-width: 992px)": { + "margin": "0" + }, + "margin": "0 1rem" + }, + ".dropdown-menu, .navbar.opened": { + "background-color": "@transparent !important" + }, + ".nav-item:focus, .nav-link:focus": { + "outline": "none" + }, + ".dropdown .dropdown-menu .dropdown-item": { + "width": "auto", + "transition": "all 0.25s ease-in-out", + "&::after": { + "right": "0.5rem" + }, + ".mbr-iconfont": { + "margin-right": "0.5rem", + "vertical-align": "sub", + "&:before": { + "display": "inline-block", + "transform": "scale(1, 1)", + "transition": "all 0.25s ease-in-out" + } + } + }, + ".collapsed": { + ".dropdown-menu .dropdown-item:before": { + "display": "none" + }, + ".dropdown .dropdown-menu .dropdown-item": { + "padding": "0.235em 1.5em 0.235em 1.5em !important", + "transition": "none", + "margin": "0 !important" + } + }, + ".navbar": { + "min-height": "70px", + "padding": "20px 0", + "transition": "all 0.3s", + "border-bottom-width": "0", + "@media (max-width: 992px)": { + "min-height": "30px", + "max-height": "none" + }, + "&:not(.navbar-short)": {}, + "&.opened": { + "transition": "all 0.3s" + }, + ".dropdown-item": { + "padding": "0", + "margin": "8px 0" + }, + ".navbar-logo img": { + "max-width": "130px", + "max-height": "130px", + "object-fit": "contain" + }, + ".navbar-collapse": { + "justify-content": "space-between", + "& when (@showLogo), (@showBrand)": { + "justify-content": "space-between" + }, + "z-index": "1" + }, + "&.collapsed": { + "justify-content": "center", + ".nav-item .nav-link::before": { + "display": "none" + }, + "&.opened": { + ".dropdown-menu": { + "top": "0" + } + }, + ".dropdown-menu": { + ".dropdown-submenu": { + "left": "0 !important" + }, + ".dropdown-item:after": { + "right": "auto" + } + }, + "ul.navbar-nav": { + "li": { + "margin": "auto" + } + }, + ".dropdown-menu .dropdown-item": { + "padding": "0.25rem 1.5rem", + "text-align": "left" + }, + ".icons-menu": { + "padding": "0" + } + }, + "@media (max-width: 991px)": { + ".nav-item": { + "padding": ".5rem 0" + }, + ".navbar-collapse": { + "padding": "34px 0", + "border-radius": "25px" + }, + ".nav-item .nav-link::before": { + "display": "none" + }, + "&.opened": { + ".dropdown-menu": { + "top": "0" + } + }, + ".dropdown-menu": { + "padding": "6px 0 6px 15px", + ".dropdown-submenu": { + "left": "0 !important" + }, + ".dropdown-item:after": { + "right": "auto", + "margin-top": "-0.4rem" + } + }, + ".navbar-logo": { + "img": { + "height": "3rem !important" + } + }, + "ul.navbar-nav": { + "overflow": "hidden", + "li": { + "margin": "0" + } + }, + ".dropdown-menu .dropdown-item": { + "padding": "0 !important", + "margin": "0", + "margin-top": "8px", + "text-align": "left" + }, + ".navbar-brand": { + "flex-shrink": "initial", + "flex-basis": "auto", + "word-break": "break-word", + "padding-right": "2rem" + }, + ".navbar-toggler": { + "flex-basis": "auto" + }, + ".icons-menu": { + "padding": "0" + } + }, + "&.navbar-short": { + "min-height": "60px", + ".navbar-logo": { + "img": { + "height": "2.5rem !important" + } + }, + ".navbar-brand": { + "min-height": "60px", + "padding": "0" + } + } + }, + ".navbar-brand": { + "min-height": "70px", + "flex-shrink": "0", + "align-items": "center", + "margin-right": "0", + "padding": "10px 0", + "transition": "all 0.3s", + "word-break": "break-word", + "z-index": "1", + ".navbar-caption": { + "line-height": "inherit !important" + }, + ".navbar-logo a": { + "outline": "none" + } + }, + ".dropdown-item.active, .dropdown-item:active": { + "background-color": "transparent" + }, + ".navbar-expand-lg .navbar-nav .nav-link": { + "padding": "0" + }, + ".nav-dropdown .link.dropdown-toggle": { + "margin-right": "1.667em", + "&[aria-expanded=\"true\"]": { + "margin-right": "0", + "padding": "0.667em 1.667em" + } + }, + ".navbar .dropdown.open > .dropdown-menu": { + "display": "block" + }, + "ul.navbar-nav": { + "flex-wrap": "wrap", + "padding": "0" + }, + ".navbar-buttons": { + "text-align": "center", + "min-width": "170px" + }, + "button.navbar-toggler": { + "outline": "none", + "width": "48px", + "height": "48px", + "border-radius": "50%", + "cursor": "pointer", + "transition": "all 0.2s", + "position": "relative", + "align-self": "center", + "color": "@menuBgColor", + "background": "@hamburger", + ".hamburger span": { + "position": "absolute", + "right": "10px", + "margin-top": "14px", + "width": "26px", + "height": "2px", + "border-right": "5px", + "background-color": "@hamburgerColor", + "&:nth-child(1)": { + "top": "0", + "transition": "all 0.2s" + }, + "&:nth-child(2)": { + "top": "8px", + "transition": "all 0.15s" + }, + "&:nth-child(3)": { + "top": "8px", + "transition": "all 0.15s" + }, + "&:nth-child(4)": { + "top": "16px", + "transition": "all 0.2s" + } + } + }, + "nav.opened .hamburger span": { + "&:nth-child(1)": { + "top": "8px", + "width": "0", + "opacity": "0", + "right": "50%", + "transition": "all 0.2s" + }, + "&:nth-child(2)": { + "transform": "rotate(45deg)", + "transition": "all 0.25s" + }, + "&:nth-child(3)": { + "transform": "rotate(-45deg)", + "transition": "all 0.25s" + }, + "&:nth-child(4)": { + "top": "8px", + "width": "0", + "opacity": "0", + "right": "50%", + "transition": "all 0.2s" + } + }, + "a.nav-link": { + "display": "flex", + "align-items": "center", + "justify-content": "flex-start" + }, + ".icons-menu": { + "flex-wrap": "nowrap", + "display": "flex", + "justify-content": "center", + "padding": "0", + "text-align": "center", + "margin-bottom": "35px" + }, + "@media screen and (~'-ms-high-contrast: active'), (~'-ms-high-contrast: none')": { + ".navbar": { + "height": "70px", + "&.opened": { + "height": "auto" + } + }, + ".nav-item .nav-link:hover::before": { + "width": "175%", + "max-width": "calc(100% ~\"+\" 2rem)", + "left": "-1rem" + } + }, + ".navbar-dropdown .navbar-logo": { + "margin-right": "15px" + }, + "@media (min-width: 768px)": { + ".container-fluid": { + "padding-left": "30px", + "padding-right": "30px" + } + }, + ".mbr-section-btn-main": { + "padding-top": "5px", + ".btn": { + "margin": "0 4px 4px 4px" + } + }, + ".navbar-caption:hover": { + "color": "@primaryColor" + }, + ".dropdown-menu.dropdown-submenu": { + "@media (min-width: 992px)": { + "left": "175px !important", + "top": "-45% !important" + } + }, + ".mbr-section-btn, .mbr-section-btn-main": { + ".btn": { + "background-image": "linear-gradient(99deg, rgba(255, 255, 255, 0) 30%, @buttonAni 100%), radial-gradient(circle at 50% 50%, @buttonAni 0, rgba(255, 255, 255, 0) 70%)", + "color": "@buttonColor !important" + } + }, + ".mbr-section-subtitle": { + "color": "#000000" + }, + ".mbr-text": { + "color": "#000000", + "text-align": "center" + }, + ".text_widget": { + "color": "#000000" + }, + ".mbr-section-subtitle, .text_widget, .mbr-section-btn": { + "text-align": "center" + }, + "a[class*=\"text-\"]:not(.nav-link):not(.dropdown-item):not([role]):not(.navbar-caption):hover": { + "background-image": "none" + } + }, + "_name": "menu1", + "_sourceTheme": "boldm5", + "_customHTML": "
\n\n \n
Size
\n \n
Show/Hide
\n \n \n \n \n \n \n \n \n \n
Styles
\n \n \n \n \n \n \n \n
Sidebar
\n \n \n \n \n \n
\n\n \n
", + "_cid": "ttRnktJ11Q", + "_anchor": "menu1-0", + "_PHPplaceholders": [], + "_JSplaceholders": [], + "_protectedParams": [], + "_global": true, + "_once": "menu", + "_params": {} + }, + { + "alias": false, + "_styles": { + "& when not (@fullScreen)": { + "padding-top": "(@paddingTop * 1rem)", + "padding-bottom": "(@paddingBottom * 1rem)" + }, + "& when (@bg-type = 'color')": { + "background-color": "@bg-value" + }, + "& when (@bg-type = 'image')": { + "background-image": "url(@bg-value)" + }, + ".mbr-fallback-image.disabled": { + "display": "none" + }, + ".mbr-fallback-image": { + "display": "block", + "background-size": "cover", + "background-position": "center center", + "width": "100%", + "height": "100%", + "position": "absolute", + "top": "0", + "& when (@bg-type = 'video')": { + "background-image": "url(@fallBackImage)" + } + }, + "& when (@fullWidth)": { + ".container-fluid": { + "margin": "0", + "padding": "0 60px", + "@media (max-width: 992px)": { + "padding": "0 25px" + }, + ".row": { + "padding": "0" + } + } + }, + "& when not (@fullWidth)": { + "@media (max-width: 992px)": { + ".row": { + "padding": "0 13px" + } + } + }, + ".title-wrapper": { + "padding-top": "35%", + "@media (max-width: 992px)": { + "padding-top": "0" + }, + ".mbr-section-title": { + "margin-bottom": "48px" + }, + ".mbr-text": { + "margin-bottom": "48px" + }, + ".mbr-section-btn": { + ".btn": { + "background-image": "linear-gradient(99deg, rgba(255, 255, 255, 0) 30%, @buttonAni 100%), radial-gradient(circle at 50% 50%, @buttonAni 0, rgba(255, 255, 255, 0) 70%)", + "color": "@buttonColor !important" + } + } + }, + ".mbr-section-title": { + "color": "#ffffff" + }, + ".mbr-text": { + "color": "#b6b6b6" + }, + ".mbr-section-title, .mbr-section-btn": { + "text-align": "left" + } + }, + "_name": "header1", + "_sourceTheme": "boldm5", + "_customHTML": "
\n \n
Size
\n \n \n \n \n
Show/Hide
\n \n \n \n \n \n
Background
\n
\n \n \n \n
\n
Fallback Image
\n \n \n \n \n
\n\n
\n
\n
\n\n
\n
\n
\n
\n

Q-Mintership Alpha

\n

This is the innitial 'alpha' of the Mintership Forum / Mintership tools that will be built into the final Q-Mintership app. This is a simplistic version built by crowetic that will offer a very simple communciations location, and the tools for the minter admins to accomplish the necessary GROUP_APPROVAL transactions. Scroll down for the currently available tools... 

\n \n
\n
\n
\n
\n
", + "_cid": "ttRnlSkg2R", + "_anchor": "header1-1", + "_protectedParams": [], + "_global": false, + "_once": false, + "_params": {} + }, + { + "alias": false, + "_styles": { + "& when not (@fullScreen)": { + "padding-top": "(@paddingTop * 1rem)", + "padding-bottom": "(@paddingBottom * 1rem)" + }, + "& when (@bg-type = 'color')": { + "background-color": "@bg-value" + }, + "& when (@bg-type = 'image')": { + "background-image": "url(@bg-value)" + }, + ".mbr-fallback-image.disabled": { + "display": "none" + }, + ".mbr-fallback-image": { + "display": "block", + "background-size": "cover", + "background-position": "center center", + "width": "100%", + "height": "100%", + "position": "absolute", + "top": "0", + "& when (@bg-type = 'video')": { + "background-image": "url(@fallBackImage)" + } + }, + "& when (@fullWidth)": { + ".container-fluid": { + "margin": "0", + "padding": "0 51px", + "@media (max-width: 992px)": { + "padding": "0 12px" + }, + ".row": { + "padding": "0" + } + } + }, + "& when not (@fullWidth)": { + "@media (max-width: 992px)": { + ".row": { + "padding": "0 13px" + } + } + }, + ".row": { + "justify-content": "center" + }, + ".item": { + "position": "relative", + "margin-bottom": "25px", + "padding": "0 25px", + ".item-link": { + "width": "100%", + "height": "100%", + ".item-wrapper": { + "position": "relative", + "display": "flex", + "justify-content": "center", + "align-items": "center", + "height": "300px", + "overflow": "hidden", + "&:hover": { + "img": { + "transform": "scale(1.03)" + } + }, + "img": { + "position": "absolute", + "top": "0", + "left": "0", + "width": "100%", + "height": "100%", + "object-fit": "cover", + "transform": "scale(1)", + "transition": "all 0.3s ease-out" + }, + "&::before": { + "content": "''", + "position": "absolute", + "width": "100%", + "height": "100%", + "top": "0", + "left": "0", + "background-color": "@active", + "opacity": ".5", + "transition": "all 0.3s ease-out", + "z-index": "1", + "pointer-events": "none" + }, + ".item-content": { + "position": "relative", + "z-index": "1", + ".card-title": { + "margin-bottom": "0", + "position": "relative" + } + } + } + } + }, + ".card-title": { + "color": "#ffffff" + } + }, + "_name": "features7", + "_sourceTheme": "boldm5", + "_customHTML": "
\n \n
Size
\n \n \n \n \n
Cards
\n \n \n
Background
\n
\n \n \n
\n
Fallback Image
\n \n \n \n \n
\n\n
\n
\n
\n\n \n
", + "_cid": "ttRnAijqXt", + "_anchor": "features7-6", + "_PHPplaceholders": [], + "_JSplaceholders": [], + "_protectedParams": [], + "_global": false, + "_once": false, + "_params": {} + }, + { + "alias": false, + "_styles": { + "& when not (@fullScreen)": { + "padding-top": "(@paddingTop * 1rem)", + "padding-bottom": "(@paddingBottom * 1rem)" + }, + "& when (@bg-type = 'color')": { + "background-color": "@bg-value" + }, + "& when (@bg-type = 'image')": { + "background-image": "url(@bg-value)" + }, + ".mbr-fallback-image.disabled": { + "display": "none" + }, + ".mbr-fallback-image": { + "display": "block", + "background-size": "cover", + "background-position": "center center", + "width": "100%", + "height": "100%", + "position": "absolute", + "top": "0", + "& when (@bg-type = 'video')": { + "background-image": "url(@fallBackImage)" + } + }, + "& when (@fullWidth)": { + ".container-fluid": { + "margin": "0", + "padding": "0 60px", + "@media (max-width: 992px)": { + "padding": "0 25px" + }, + ".row": { + "padding": "0" + } + } + }, + "& when not (@fullWidth)": { + "@media (max-width: 992px)": { + ".row": { + "padding": "0 13px" + } + } + }, + ".row": { + "justify-content": "center" + }, + ".card-wrapper": { + "@media (max-width: 992px)": { + "margin-bottom": "55px" + }, + ".icon-wrapper": { + "margin-bottom": "18px", + "justify-content": "center", + "align": "center", + ".mbr-iconfont": { + "display": "inline", + "font-size": "82px", + "width": "auto", + "color": "@icon" + } + }, + ".mbr-section-title": { + "margin-bottom": "18px" + }, + ".mbr-text": { + "margin-bottom": "0" + } + }, + ".mbr-section-title": { + "color": "#ffffff" + }, + ".mbr-text": { + "color": "#b6b6b6", + "text-align": "center" + }, + ".mbr-section-title, .icon-wrapper": { + "text-align": "center" + } + }, + "_name": "features1", + "_sourceTheme": "boldm5", + "_customHTML": "
\n \n
Size
\n \n \n \n \n
Cards
\n \n \n \n \n \n
Background
\n
\n \n \n
\n
Fallback Image
\n \n \n \n \n
\n\n
\n
\n
\n\n
\n
\n
\n
\n
\n \n
\n

\n Mintership Details

\n

\n Learn more about the Mintership concept, and why it was needed. The days of 'sponsorship' are a thing of the past on the Qortal Network. No more will there be the ability to self-sponsor. A new era of Qortal begins!

\n
\n
\n
1\">\n
\n
\n \n
\n

Become A Minter

\n

\n Not already minting? You've come to the right place to get started. Check the Mintership Forum link for more information. The updated Q-Mintership app will be a more fully featured application.

\n
\n
\n
2\">\n
\n
\n \n
\n

Minter Admin Tools

\n

\n Are you one of the initially selected Minter Admins? We have the tools here you need to create and approve GROUP_APPROVAL transactions, and communicate securely with your fellow admins.

\n
\n
\n
\n
\n
", + "_cid": "utzh0dnVQB", + "_anchor": "features1-2", + "_PHPplaceholders": [], + "_JSplaceholders": [], + "_protectedParams": [], + "_global": false, + "_once": false, + "_params": {} + }, + { + "alias": false, + "_styles": { + "& when not (@fullScreen)": { + "padding-top": "(@paddingTop * 1rem)", + "padding-bottom": "(@paddingBottom * 1rem)" + }, + "& when (@bg-type = 'color')": { + "background-color": "@bg-value" + }, + "& when (@bg-type = 'image')": { + "background-image": "url(@bg-value)" + }, + ".mbr-fallback-image.disabled": { + "display": "none" + }, + ".mbr-fallback-image": { + "display": "block", + "background-size": "cover", + "background-position": "center center", + "width": "100%", + "height": "100%", + "position": "absolute", + "top": "0", + "& when (@bg-type = 'video')": { + "background-image": "url(@fallBackImage)" + } + }, + "& when (@fullWidth)": { + ".container-fluid": { + "margin": "0", + "padding": "0 16px", + ".row": { + "padding": "0" + } + } + }, + "& when not (@fullWidth)": { + "@media (max-width: 992px)": { + ".row": { + "padding": "0 13px" + } + } + }, + ".row": { + "justify-content": "center" + }, + ".card": { + "padding": "0", + "border-top": "1px solid @border", + "border-bottom": "1px solid @border", + "border-radius": "0" + }, + ".title-wrapper": { + "padding": "14px 0 18px", + "white-space": "nowrap", + "overflow": "hidden", + "&:last-child": { + "padding": "18px 14px", + "border-top": "1px solid @border" + }, + ".mbr-section-title": { + "margin-bottom": "0" + } + }, + ".mbr-section-title": { + "color": "#ffffff", + "text-align": "center" + }, + ".mbr-title": { + "color": "#ffffff", + "text-align": "right" + } + }, + "_name": "content3", + "_sourceTheme": "boldm5", + "_customHTML": "
\n \n
Size
\n \n \n \n \n
Show/Hide
\n \n \n
Background
\n
\n \n \n
\n
Fallback Image
\n \n \n \n \n
\n\n
\n
\n
\n\n
\n
\n
\n
\n

\n More information...

\n
\n
1\">\n

Click to Open

\n
\n
\n
\n
\n
", + "_cid": "uu3bTy9Zr1", + "_anchor": "content3-4", + "_protectedParams": [], + "_global": false, + "_once": false, + "_params": {} + }, + { + "alias": false, + "_styles": { + "& when not (@fullScreen)": { + "padding-top": "(@paddingTop * 1rem)", + "padding-bottom": "(@paddingBottom * 1rem)" + }, + "& when (@bg-type = 'color')": { + "background-color": "@bg-value" + }, + "& when (@bg-type = 'image')": { + "background-image": "url(@bg-value)" + }, + ".mbr-fallback-image.disabled": { + "display": "none" + }, + ".mbr-fallback-image": { + "display": "block", + "background-size": "cover", + "background-position": "center center", + "width": "100%", + "height": "100%", + "position": "absolute", + "top": "0", + "& when (@bg-type = 'video')": { + "background-image": "url(@fallBackImage)" + } + }, + "& when (@fullWidth)": { + ".container-fluid": { + "margin": "0", + "padding": "0 60px", + "@media (max-width: 992px)": { + "padding": "0 25px" + }, + ".row": { + "padding": "0" + } + } + }, + "& when not (@fullWidth)": { + "@media (max-width: 992px)": { + ".row": { + "padding": "0 13px" + } + } + }, + ".row": { + "justify-content": "center" + }, + ".card-wrapper": { + "@media (max-width: 992px)": { + "margin-bottom": "55px" + }, + ".icon-wrapper": { + "margin-bottom": "18px", + ".mbr-iconfont": { + "display": "inline", + "font-size": "82px", + "width": "auto", + "color": "@icon" + } + }, + ".mbr-section-title": { + "margin-bottom": "18px" + }, + ".mbr-text": { + "margin-bottom": "0" + } + }, + ".mbr-section-title": { + "color": "#ffffff" + }, + ".mbr-text": { + "color": "#b6b6b6", + "text-align": "center" + }, + ".mbr-section-title, .icon-wrapper": { + "text-align": "center" + } + }, + "_name": "features1", + "_sourceTheme": "boldm5", + "_customHTML": "
\n \n
Size
\n \n \n \n \n
Cards
\n \n \n \n \n \n
Background
\n
\n \n \n
\n
Fallback Image
\n \n \n \n \n
\n\n
\n
\n
\n\n
\n
\n
\n
\n
\n \n
\n

\n Get Information

\n

\n Would you like to become a minter? You've come to the right place! Obtain details about the new Mintership-based minting process on Qortal.

\n
\n
\n
1\">\n
\n
\n \n
\n

\n Minter Admin Tools

\n

\n If you are a Minter Admin, you will need to know how to create and sign GROUP_APPROVAL transactions. You may do so here!

\n
\n
\n
2\">\n
\n
\n \n
\n

\n Start your Mission

\n

\n Every mission has a beginning. If your mission is to become a minter, or a Minter Admin, then you've landed at the correct launchpad!

\n
\n
\n
\n
\n
", + "_cid": "uufI05uMCB", + "_protectedParams": [], + "_global": false, + "_once": false, + "_params": {}, + "_anchor": "features1-5" + }, + { + "alias": false, + "_styles": { + "& when not (@fullScreen)": { + "padding-top": "(@paddingTop * 1rem)", + "padding-bottom": "(@paddingBottom * 1rem)" + }, + "& when (@bg-type = 'color')": { + "background-color": "@bg-value" + }, + "& when (@bg-type = 'image')": { + "background-image": "url(@bg-value)" + }, + ".mbr-fallback-image.disabled": { + "display": "none" + }, + ".mbr-fallback-image": { + "display": "block", + "background-size": "cover", + "background-position": "center center", + "width": "100%", + "height": "100%", + "position": "absolute", + "top": "0", + "& when (@bg-type = 'video')": { + "background-image": "url(@fallBackImage)" + } + }, + "& when (@fullWidth)": { + ".container-fluid": { + "margin": "0", + "padding": "0 60px", + "@media (max-width: 992px)": { + "padding": "0 25px" + }, + ".row": { + "padding": "0" + } + } + }, + "& when not (@fullWidth)": { + "@media (max-width: 992px)": { + ".row": { + "padding": "0 13px" + } + } + }, + ".row": { + "justify-content": "center" + }, + ".card": { + "display": "flex", + "flex-direction": "column", + "justify-content": "center" + }, + ".title-wrapper": { + "padding": "30px 54px 30px 0", + "& when (@reverseContent)": { + "padding": "30px 0 30px 54px", + "@media (max-width: 992px)": { + "padding": "0 0 40px" + } + }, + "@media (max-width: 992px)": { + "padding": "0 0 40px" + }, + ".mbr-section-title": { + "margin-bottom": "0" + } + }, + ".text-wrapper": { + "padding": "30px 0 30px 74px", + "border-left": "1px solid @border", + "& when (@reverseContent)": { + "padding": "30px 74px 30px 0", + "border-left": "none", + "border-right": "1px solid @border", + "@media (max-width: 992px)": { + "padding": "40px 0 0", + "border": "none", + "border-top": "1px solid @border" + } + }, + "@media (max-width: 992px)": { + "padding": "40px 0 0", + "border-left": "none", + "border-top": "1px solid @border" + }, + ".mbr-text": { + "margin-bottom": "0" + } + }, + ".mbr-section-title": { + "color": "#ffffff" + }, + ".mbr-text": { + "color": "#b6b6b6" + } + }, + "_name": "content7", + "_sourceTheme": "boldm5", + "_customHTML": "
\n \n
Size
\n \n \n \n \n \n
Show/Hide
\n \n \n \n
Background
\n
\n \n \n
\n
Fallback Image
\n \n \n \n \n
\n\n
\n
\n
\n\n
\n
\n
\n
\n

\n This is the beginning...

\n
\n
\n
\n
\n

\n This is the very start of the Q-Mintership app. It will be dramatically changing upon the beta release, and modification to the Q-Mintership Q-App. This initial version is a version that could be launched more quickly, and does not have nearly as much functionality as what will exist once the main app goes live. 

\n
\n
\n
\n
\n \n
", + "_cid": "uufIRKtXOO", + "_anchor": "content7-6", + "_PHPplaceholders": [], + "_JSplaceholders": [], + "_protectedParams": [], + "_global": false, + "_once": false, + "_params": {} + }, + { + "alias": false, + "_styles": { + "& when not (@fullScreen)": { + "padding-top": "(@paddingTop * 1rem)", + "padding-bottom": "(@paddingBottom * 1rem)" + }, + "& when (@bg-type = 'color')": { + "background-color": "@bg-value" + }, + "& when (@bg-type = 'image')": { + "background-image": "url(@bg-value)" + }, + ".mbr-fallback-image.disabled": { + "display": "none" + }, + ".mbr-fallback-image": { + "display": "block", + "background-size": "cover", + "background-position": "center center", + "width": "100%", + "height": "100%", + "position": "absolute", + "top": "0", + "& when (@bg-type = 'video')": { + "background-image": "url(@fallBackImage)" + } + }, + "& when (@fullWidth)": { + ".container-fluid": { + "padding": "0 50px", + "@media (max-width: 992px)": { + "padding": "0 30px" + } + } + }, + ".container": { + "@media (max-width: 992px)": { + "padding": "0 30px" + } + }, + ".title-wrapper": { + "margin-bottom": "20px", + ".title-wrap": { + "display": "inline-flex", + "align-items": "center", + "img": { + "height": "78px", + "width": "78px", + "border-radius": "20px", + "object-fit": "cover", + "margin-right": "16px" + }, + ".mbr-section-title": { + "margin-bottom": "0" + } + } + }, + ".mbr-desc": { + "margin-bottom": "0", + "color": "#a4a2a2", + "text-align": "left" + }, + ".link-wrap": { + "&:hover": { + ".mbr-link": { + "color": "@active" + } + }, + ".mbr-link": { + "margin-bottom": "0", + "transition": "all 0.3s ease-in-out", + "@media (max-width: 992px)": { + "margin-bottom": "20px" + } + } + }, + ".list": { + "margin": "0", + "padding": "0", + "list-style-type": "none", + "@media (max-width: 992px)": { + "text-align": "left" + }, + ".item-wrap": { + "text-decoration": "underline", + "margin-bottom": "16px", + "transition": "all 0.3s ease-in-out", + "&:hover": { + "color": "@active" + } + }, + "color": "#ffffff" + }, + ".copyright": { + "margin": "50px 0", + "@media (max-width: 992px)": { + "margin": "30px 0" + }, + "color": "#ffffff", + "text-align": "right" + }, + ".mbr-section-title": { + "color": "#ffffff" + }, + ".mbr-link": { + "color": "#ffffff", + "text-align": "left" + }, + ".mbr-section-title, .title-wrapper": { + "color": "#324c6d", + "text-align": "left" + } + }, + "_name": "footer1", + "_sourceTheme": "visualm5", + "_customHTML": "
\n\n \n
Size
\n \n \n \n \n \n
Show/Hide
\n \n \n \n \n \n \n \n
Background
\n
\n \n \n
\n
Fallback Image
\n \n \n \n \n
\n\n
\n
\n
\n\n
\n
\n
\n
\n
\n \"Mobirise\"\n

Q-Mintership Alpha

\n
\n
\n

\n Site Updates and Development Information

\n \n \n \n
\n
\n
    \n
  • TWITTER
  • \n
  • FACEBOOK
  • \n
  • LINKEDIN
  • \n
  • BEHANCE
  • \n
\n
\n
\n

\n 2024 Qortal Development Group

\n
\n
\n
\n
", + "_cid": "uhGd4SVHZK", + "_anchor": "footer1-1", + "_protectedParams": [], + "_global": true, + "_once": "footers", + "_params": {} + } + ] + } + } +} \ No newline at end of file