diff --git a/buyer/migrations/0002_auto_20191027_1419.py b/buyer/migrations/0002_auto_20191027_1419.py new file mode 100644 index 0000000..8f6bb3c --- /dev/null +++ b/buyer/migrations/0002_auto_20191027_1419.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.6 on 2019-10-27 14:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('buyer', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='card', + name='delivered', + field=models.DateTimeField(blank=True, default=None, null=True, verbose_name='Card delivered to Oma'), + ), + ] diff --git a/buyer/models.py b/buyer/models.py index fdfe2db..0234a5d 100644 --- a/buyer/models.py +++ b/buyer/models.py @@ -5,7 +5,7 @@ from django.db import models class Card(models.Model): number = models.IntegerField("Card number", primary_key=True) purchased = models.DateTimeField("Card purchased", auto_now_add=True) - delivered = models.DateTimeField("Card delivered to Oma", default=None, null=True) + delivered = models.DateTimeField("Card delivered to Oma", default=None, null=True, blank=True) def __str__(self): return str(self.number) \ No newline at end of file diff --git a/buyer/views.py b/buyer/views.py index 91ea44a..79f6d6a 100644 --- a/buyer/views.py +++ b/buyer/views.py @@ -1,3 +1,73 @@ from django.shortcuts import render +from selenium import webdriver +from selenium.webdriver.common.keys import Keys +from selenium.webdriver.support.ui import Select +from bs4 import BeautifulSoup +import random +from dbsettings.views import getValue +from buyer.models import Card +import time -# Create your views here. +def getCard(allow_buy=False): + unused = Card.objects.filter(delivered=None) # pylint: disable=E1101 + try: + card = random.SystemRandom().choice(unused) + except: + if allow_buy: + card = buyCard() + else: + card = None + return card + + +def buyCard(): + browser = webdriver.Firefox() + + browser.get("https://www.wkv.com/?action=my_account") + + if "Login" in browser.title: + user = browser.find_element_by_name("email") + user.send_keys(getValue("buyer.wkv.email")) + pwd = browser.find_element_by_name("password") + pwd.send_keys(getValue("buyer.wkv.password") + Keys.RETURN) + time.sleep(2) + if "Login" in browser.title: + raise ValueError("Could not log in. Please check if the provided credentials are correct.") + + browser.get("https://www.wkv.com/?action=buy_card&pr=1&pf=1") + + product = Select(browser.find_element_by_name("product")) + product.select_by_visible_text("paysafecard classic 10€") + browser.find_element_by_class_name("btn").click() + + time.sleep(2) + + browser.find_element_by_class_name("btn").click() + + method = Select(browser.find_elements_by_name("payment_method")) + method.select_by_visible_text("Credit card") + browser.find_element_by_class_name("btn").click() + + time.sleep(2) + + browser.find_element_by_name("accept_terms").click() + browser.find_element_by_class_name("btn").click() + + time.sleep(5) + + try: + browser.find_element_by_id("existingCcSelect") + except: + ccnum = browser.find_element_by_name("pan") + ccnum.send_keys(getValue("buyer.creditcard.number")) + expmonth = Select(browser.find_element_by_name("newExpMonth")) + expmonth.select_by_value(str(int(getValue("buyer.creditcard.expmonth")))) + expyear = Select(browser.find_element_by_name("newExpYear")) + expyear.select_by_visible_text(getValue("buyer.creditcard.expyear")) + finally: + cvv = browser.find_element_by_name("cvv") + cvv.send_keys(getValue("buyer.creditcard.cvv") + Keys.RETURN) + + time.sleep(15) + + return Card() \ No newline at end of file diff --git a/dbsettings/views.py b/dbsettings/views.py index 91ea44a..5c3bf28 100644 --- a/dbsettings/views.py +++ b/dbsettings/views.py @@ -1,3 +1,14 @@ from django.shortcuts import render +from dbsettings.models import Setting -# Create your views here. +def getValue(key): + try: + return Setting.objects.get(key=key).value + except: + raise KeyError("No such setting: %s" % key) + +def setValue(key, value): + obj = Setting.objects.get_or_create(key=key)[0] # pylint: disable=E1101 + obj.value = value + obj.save() + return True \ No newline at end of file diff --git a/frontend/admin.py b/frontend/admin.py index 8c38f3f..89f118e 100644 --- a/frontend/admin.py +++ b/frontend/admin.py @@ -1,3 +1,4 @@ from django.contrib import admin +from frontend.models import CardURL -# Register your models here. +admin.site.register(CardURL) diff --git a/frontend/forms.py b/frontend/forms.py new file mode 100644 index 0000000..aa853f0 --- /dev/null +++ b/frontend/forms.py @@ -0,0 +1,10 @@ +from django import forms +from django.core.exceptions import ValidationError +from smsauth.views import useToken + +def validateToken(value): + if not useToken(value): + raise ValidationError("Der eingegebene Code ist ungültig.") + +class SMSAuthForm(forms.Form): + token = forms.IntegerField(max_value=999999, validators=[validateToken]) \ No newline at end of file diff --git a/frontend/migrations/0001_initial.py b/frontend/migrations/0001_initial.py new file mode 100644 index 0000000..c44ebe9 --- /dev/null +++ b/frontend/migrations/0001_initial.py @@ -0,0 +1,25 @@ +# Generated by Django 2.2.6 on 2019-10-27 13:57 + +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('buyer', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='CardURL', + fields=[ + ('uuid', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True)), + ('card', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='buyer.Card')), + ], + ), + ] diff --git a/frontend/migrations/0002_auto_20191027_1509.py b/frontend/migrations/0002_auto_20191027_1509.py new file mode 100644 index 0000000..a96fc29 --- /dev/null +++ b/frontend/migrations/0002_auto_20191027_1509.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.6 on 2019-10-27 15:09 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('frontend', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='cardurl', + name='card', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='buyer.Card'), + ), + ] diff --git a/frontend/models.py b/frontend/models.py index 71a8362..1312c39 100644 --- a/frontend/models.py +++ b/frontend/models.py @@ -1,3 +1,10 @@ from django.db import models +from buyer.models import Card +import uuid +from django.db.models.signals import post_save +from django.dispatch import receiver -# Create your models here. +class CardURL(models.Model): + uuid = models.UUIDField(default=uuid.uuid4, primary_key=True) + card = models.ForeignKey(Card, models.CASCADE) + created = models.DateTimeField(auto_now_add=True) diff --git a/frontend/static/frontend/assets/css/fontawesome-all.min.css b/frontend/static/frontend/assets/css/fontawesome-all.min.css new file mode 100644 index 0000000..f77b75e --- /dev/null +++ b/frontend/static/frontend/assets/css/fontawesome-all.min.css @@ -0,0 +1,279 @@ +/*! + * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/frontend/static/frontend/assets/css/images/dark-bl.svg b/frontend/static/frontend/assets/css/images/dark-bl.svg new file mode 100644 index 0000000..1b0fa5a --- /dev/null +++ b/frontend/static/frontend/assets/css/images/dark-bl.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/static/frontend/assets/css/images/dark-br.svg b/frontend/static/frontend/assets/css/images/dark-br.svg new file mode 100644 index 0000000..fb444d2 --- /dev/null +++ b/frontend/static/frontend/assets/css/images/dark-br.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/static/frontend/assets/css/images/dark-tl.svg b/frontend/static/frontend/assets/css/images/dark-tl.svg new file mode 100644 index 0000000..4521f11 --- /dev/null +++ b/frontend/static/frontend/assets/css/images/dark-tl.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/static/frontend/assets/css/images/dark-tr.svg b/frontend/static/frontend/assets/css/images/dark-tr.svg new file mode 100644 index 0000000..be03be1 --- /dev/null +++ b/frontend/static/frontend/assets/css/images/dark-tr.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/static/frontend/assets/css/images/light-bl.svg b/frontend/static/frontend/assets/css/images/light-bl.svg new file mode 100644 index 0000000..c0a953b --- /dev/null +++ b/frontend/static/frontend/assets/css/images/light-bl.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/static/frontend/assets/css/images/light-br.svg b/frontend/static/frontend/assets/css/images/light-br.svg new file mode 100644 index 0000000..ca10b30 --- /dev/null +++ b/frontend/static/frontend/assets/css/images/light-br.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/static/frontend/assets/css/images/light-tl.svg b/frontend/static/frontend/assets/css/images/light-tl.svg new file mode 100644 index 0000000..8bcc931 --- /dev/null +++ b/frontend/static/frontend/assets/css/images/light-tl.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/static/frontend/assets/css/images/light-tr.svg b/frontend/static/frontend/assets/css/images/light-tr.svg new file mode 100644 index 0000000..ad0f90a --- /dev/null +++ b/frontend/static/frontend/assets/css/images/light-tr.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/static/frontend/assets/css/images/overlay.png b/frontend/static/frontend/assets/css/images/overlay.png new file mode 100644 index 0000000..9a304f4 Binary files /dev/null and b/frontend/static/frontend/assets/css/images/overlay.png differ diff --git a/frontend/static/frontend/assets/css/login.css b/frontend/static/frontend/assets/css/login.css new file mode 100644 index 0000000..9b9a943 --- /dev/null +++ b/frontend/static/frontend/assets/css/login.css @@ -0,0 +1,105 @@ +body { + background-color: #F3EBF6; + font-family: 'Ubuntu', sans-serif; +} + +.main { + background-color: #FFFFFF; + width: 400px; + height: 400px; + margin: 7em auto; + border-radius: 1.5em; + box-shadow: 0px 11px 35px 2px rgba(0, 0, 0, 0.14); +} + +.sign { + padding-top: 40px; + color: #8C55AA; + font-family: 'Ubuntu', sans-serif; + font-weight: bold; + font-size: 23px; +} + +.un { +width: 76%; +color: rgb(38, 50, 56); +font-weight: 700; +font-size: 14px; +letter-spacing: 1px; +background: rgba(136, 126, 126, 0.04); +padding: 10px 20px; +border: none; +border-radius: 20px; +outline: none; +box-sizing: border-box; +border: 2px solid rgba(0, 0, 0, 0.02); +margin-bottom: 50px; +margin-left: 46px; +text-align: center; +margin-bottom: 27px; +font-family: 'Ubuntu', sans-serif; +} + +form.form1 { + padding-top: 40px; +} + +.pass { + width: 76%; +color: rgb(38, 50, 56); +font-weight: 700; +font-size: 14px; +letter-spacing: 1px; +background: rgba(136, 126, 126, 0.04); +padding: 10px 20px; +border: none; +border-radius: 20px; +outline: none; +box-sizing: border-box; +border: 2px solid rgba(0, 0, 0, 0.02); +margin-bottom: 50px; +margin-left: 46px; +text-align: center; +margin-bottom: 27px; +font-family: 'Ubuntu', sans-serif; +} + + +.un:focus, .pass:focus { + border: 2px solid rgba(0, 0, 0, 0.18) !important; + +} + +.submit { + cursor: pointer; + border-radius: 5em; + color: #fff; + background: linear-gradient(to right, #9C27B0, #E040FB); + border: 0; + padding-left: 40px; + padding-right: 40px; + padding-bottom: 10px; + padding-top: 10px; + font-family: 'Ubuntu', sans-serif; + margin-left: 35%; + font-size: 13px; + box-shadow: 0 0 20px 1px rgba(0, 0, 0, 0.04); +} + +.forgot { + text-shadow: 0px 0px 3px rgba(117, 117, 117, 0.12); + color: #E1BEE7; + padding-top: 15px; +} + +a { + text-shadow: 0px 0px 3px rgba(117, 117, 117, 0.12); + color: #E1BEE7; + text-decoration: none +} + +@media (max-width: 600px) { + .main { + border-radius: 0px; + } +} diff --git a/frontend/static/frontend/assets/css/main.css b/frontend/static/frontend/assets/css/main.css new file mode 100644 index 0000000..f08a757 --- /dev/null +++ b/frontend/static/frontend/assets/css/main.css @@ -0,0 +1,3341 @@ +@import url("fontawesome-all.min.css"); +@import url("https://fonts.googleapis.com/css?family=Lato:300,400,900"); + +/* + Twenty by Pixelarity + pixelarity.com | hello@pixelarity.com + License: pixelarity.com/license +*/ + +html, body, div, span, applet, object, +iframe, h1, h2, h3, h4, h5, h6, p, blockquote, +pre, a, abbr, acronym, address, big, cite, +code, del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, b, +u, i, center, dl, dt, dd, ol, ul, li, fieldset, +form, label, legend, table, caption, tbody, +tfoot, thead, tr, th, td, article, aside, +canvas, details, embed, figure, figcaption, +footer, header, hgroup, menu, nav, output, ruby, +section, summary, time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline;} + +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block;} + +body { + line-height: 1; +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + + blockquote:before, blockquote:after, q:before, q:after { + content: ''; + content: none; + } + +table { + border-collapse: collapse; + border-spacing: 0; +} + +body { + -webkit-text-size-adjust: none; +} + +mark { + background-color: transparent; + color: inherit; +} + +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +input, select, textarea { + -moz-appearance: none; + -webkit-appearance: none; + -ms-appearance: none; + appearance: none; +} + +/* Basic */ + + html { + box-sizing: border-box; + } + + *, *:before, *:after { + box-sizing: inherit; + } + + body { + background: #f3f6fa; + } + + body.is-preload *, body.is-preload *:before, body.is-preload *:after { + -moz-animation: none !important; + -webkit-animation: none !important; + -ms-animation: none !important; + animation: none !important; + -moz-transition: none !important; + -webkit-transition: none !important; + -ms-transition: none !important; + transition: none !important; + } + + body, input, select, textarea { + color: #7c8081; + font-family: 'Lato', sans-serif; + font-size: 15pt; + font-weight: 300; + letter-spacing: 0.025em; + line-height: 1.75em; + } + + a { + -moz-transition: color 0.2s ease-in-out, border-color 0.2s ease-in-out, background-color 0.2s ease-in-out; + -webkit-transition: color 0.2s ease-in-out, border-color 0.2s ease-in-out, background-color 0.2s ease-in-out; + -ms-transition: color 0.2s ease-in-out, border-color 0.2s ease-in-out, background-color 0.2s ease-in-out; + transition: color 0.2s ease-in-out, border-color 0.2s ease-in-out, background-color 0.2s ease-in-out; + color: #db6d57; + text-decoration: none; + border-bottom: dotted 1px; + } + + a:hover { + border-bottom-color: transparent; + } + + strong, b { + font-weight: 400; + } + + p, ul, ol, dl, table, blockquote { + margin: 0 0 2em 0; + } + + h1, h2, h3, h4, h5, h6 { + color: inherit; + font-weight: 300; + line-height: 1.75em; + margin-bottom: 1em; + text-transform: uppercase; + } + + h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + color: inherit; + text-decoration: none; + border: 0; + } + + h2 { + font-size: 1.5em; + letter-spacing: 0.1em; + } + + h3 { + font-size: 1.15em; + letter-spacing: 0.025em; + } + + sub { + font-size: 0.8em; + position: relative; + top: 0.5em; + } + + sup { + font-size: 0.8em; + position: relative; + top: -0.5em; + } + + hr { + border-top: solid 1px rgba(124, 128, 129, 0.2); + border: 0; + margin-bottom: 1.5em; + } + + blockquote { + border-left: solid 0.5em rgba(124, 128, 129, 0.2); + font-style: italic; + padding: 1em 0 1em 2em; + } + +/* Container */ + + .container { + margin: 0 auto; + max-width: 100%; + width: 1400px; + } + + .container.medium { + width: 1050px; + } + + @media screen and (max-width: 1680px) { + + .container { + width: 1200px; + } + + .container.medium { + width: 900px; + } + + } + + @media screen and (max-width: 1280px) { + + .container { + width: 960px; + } + + .container.medium { + width: 735px; + } + + } + + @media screen and (max-width: 980px) { + + .container { + width: 95%; + } + + .container.medium { + width: 71.25%; + } + + } + + @media screen and (max-width: 840px) { + + .container { + width: 95%; + } + + .container.medium { + width: 95%; + } + + } + + @media screen and (max-width: 736px) { + + .container { + width: 100%; + } + + .container.medium { + width: 100%; + } + + } + +/* Row */ + + .row { + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + align-items: stretch; + } + + .row > * { + box-sizing: border-box; + } + + .row.gtr-uniform > * > :last-child { + margin-bottom: 0; + } + + .row.aln-left { + justify-content: flex-start; + } + + .row.aln-center { + justify-content: center; + } + + .row.aln-right { + justify-content: flex-end; + } + + .row.aln-top { + align-items: flex-start; + } + + .row.aln-middle { + align-items: center; + } + + .row.aln-bottom { + align-items: flex-end; + } + + .row > .imp { + order: -1; + } + + .row > .col-1 { + width: 8.33333%; + } + + .row > .off-1 { + margin-left: 8.33333%; + } + + .row > .col-2 { + width: 16.66667%; + } + + .row > .off-2 { + margin-left: 16.66667%; + } + + .row > .col-3 { + width: 25%; + } + + .row > .off-3 { + margin-left: 25%; + } + + .row > .col-4 { + width: 33.33333%; + } + + .row > .off-4 { + margin-left: 33.33333%; + } + + .row > .col-5 { + width: 41.66667%; + } + + .row > .off-5 { + margin-left: 41.66667%; + } + + .row > .col-6 { + width: 50%; + } + + .row > .off-6 { + margin-left: 50%; + } + + .row > .col-7 { + width: 58.33333%; + } + + .row > .off-7 { + margin-left: 58.33333%; + } + + .row > .col-8 { + width: 66.66667%; + } + + .row > .off-8 { + margin-left: 66.66667%; + } + + .row > .col-9 { + width: 75%; + } + + .row > .off-9 { + margin-left: 75%; + } + + .row > .col-10 { + width: 83.33333%; + } + + .row > .off-10 { + margin-left: 83.33333%; + } + + .row > .col-11 { + width: 91.66667%; + } + + .row > .off-11 { + margin-left: 91.66667%; + } + + .row > .col-12 { + width: 100%; + } + + .row > .off-12 { + margin-left: 100%; + } + + .row.gtr-0 { + margin-top: 0px; + margin-left: 0px; + } + + .row.gtr-0 > * { + padding: 0px 0 0 0px; + } + + .row.gtr-0.gtr-uniform { + margin-top: 0px; + } + + .row.gtr-0.gtr-uniform > * { + padding-top: 0px; + } + + .row.gtr-25 { + margin-top: -12.5px; + margin-left: -12.5px; + } + + .row.gtr-25 > * { + padding: 12.5px 0 0 12.5px; + } + + .row.gtr-25.gtr-uniform { + margin-top: -12.5px; + } + + .row.gtr-25.gtr-uniform > * { + padding-top: 12.5px; + } + + .row.gtr-50 { + margin-top: -25px; + margin-left: -25px; + } + + .row.gtr-50 > * { + padding: 25px 0 0 25px; + } + + .row.gtr-50.gtr-uniform { + margin-top: -25px; + } + + .row.gtr-50.gtr-uniform > * { + padding-top: 25px; + } + + .row { + margin-top: -50px; + margin-left: -50px; + } + + .row > * { + padding: 50px 0 0 50px; + } + + .row.gtr-uniform { + margin-top: -50px; + } + + .row.gtr-uniform > * { + padding-top: 50px; + } + + .row.gtr-150 { + margin-top: -75px; + margin-left: -75px; + } + + .row.gtr-150 > * { + padding: 75px 0 0 75px; + } + + .row.gtr-150.gtr-uniform { + margin-top: -75px; + } + + .row.gtr-150.gtr-uniform > * { + padding-top: 75px; + } + + .row.gtr-200 { + margin-top: -100px; + margin-left: -100px; + } + + .row.gtr-200 > * { + padding: 100px 0 0 100px; + } + + .row.gtr-200.gtr-uniform { + margin-top: -100px; + } + + .row.gtr-200.gtr-uniform > * { + padding-top: 100px; + } + + @media screen and (max-width: 1680px) { + + .row { + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + align-items: stretch; + } + + .row > * { + box-sizing: border-box; + } + + .row.gtr-uniform > * > :last-child { + margin-bottom: 0; + } + + .row.aln-left { + justify-content: flex-start; + } + + .row.aln-center { + justify-content: center; + } + + .row.aln-right { + justify-content: flex-end; + } + + .row.aln-top { + align-items: flex-start; + } + + .row.aln-middle { + align-items: center; + } + + .row.aln-bottom { + align-items: flex-end; + } + + .row > .imp-wide { + order: -1; + } + + .row > .col-1-wide { + width: 8.33333%; + } + + .row > .off-1-wide { + margin-left: 8.33333%; + } + + .row > .col-2-wide { + width: 16.66667%; + } + + .row > .off-2-wide { + margin-left: 16.66667%; + } + + .row > .col-3-wide { + width: 25%; + } + + .row > .off-3-wide { + margin-left: 25%; + } + + .row > .col-4-wide { + width: 33.33333%; + } + + .row > .off-4-wide { + margin-left: 33.33333%; + } + + .row > .col-5-wide { + width: 41.66667%; + } + + .row > .off-5-wide { + margin-left: 41.66667%; + } + + .row > .col-6-wide { + width: 50%; + } + + .row > .off-6-wide { + margin-left: 50%; + } + + .row > .col-7-wide { + width: 58.33333%; + } + + .row > .off-7-wide { + margin-left: 58.33333%; + } + + .row > .col-8-wide { + width: 66.66667%; + } + + .row > .off-8-wide { + margin-left: 66.66667%; + } + + .row > .col-9-wide { + width: 75%; + } + + .row > .off-9-wide { + margin-left: 75%; + } + + .row > .col-10-wide { + width: 83.33333%; + } + + .row > .off-10-wide { + margin-left: 83.33333%; + } + + .row > .col-11-wide { + width: 91.66667%; + } + + .row > .off-11-wide { + margin-left: 91.66667%; + } + + .row > .col-12-wide { + width: 100%; + } + + .row > .off-12-wide { + margin-left: 100%; + } + + .row.gtr-0 { + margin-top: 0px; + margin-left: 0px; + } + + .row.gtr-0 > * { + padding: 0px 0 0 0px; + } + + .row.gtr-0.gtr-uniform { + margin-top: 0px; + } + + .row.gtr-0.gtr-uniform > * { + padding-top: 0px; + } + + .row.gtr-25 { + margin-top: -10px; + margin-left: -10px; + } + + .row.gtr-25 > * { + padding: 10px 0 0 10px; + } + + .row.gtr-25.gtr-uniform { + margin-top: -10px; + } + + .row.gtr-25.gtr-uniform > * { + padding-top: 10px; + } + + .row.gtr-50 { + margin-top: -20px; + margin-left: -20px; + } + + .row.gtr-50 > * { + padding: 20px 0 0 20px; + } + + .row.gtr-50.gtr-uniform { + margin-top: -20px; + } + + .row.gtr-50.gtr-uniform > * { + padding-top: 20px; + } + + .row { + margin-top: -40px; + margin-left: -40px; + } + + .row > * { + padding: 40px 0 0 40px; + } + + .row.gtr-uniform { + margin-top: -40px; + } + + .row.gtr-uniform > * { + padding-top: 40px; + } + + .row.gtr-150 { + margin-top: -60px; + margin-left: -60px; + } + + .row.gtr-150 > * { + padding: 60px 0 0 60px; + } + + .row.gtr-150.gtr-uniform { + margin-top: -60px; + } + + .row.gtr-150.gtr-uniform > * { + padding-top: 60px; + } + + .row.gtr-200 { + margin-top: -80px; + margin-left: -80px; + } + + .row.gtr-200 > * { + padding: 80px 0 0 80px; + } + + .row.gtr-200.gtr-uniform { + margin-top: -80px; + } + + .row.gtr-200.gtr-uniform > * { + padding-top: 80px; + } + + } + + @media screen and (max-width: 1280px) { + + .row { + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + align-items: stretch; + } + + .row > * { + box-sizing: border-box; + } + + .row.gtr-uniform > * > :last-child { + margin-bottom: 0; + } + + .row.aln-left { + justify-content: flex-start; + } + + .row.aln-center { + justify-content: center; + } + + .row.aln-right { + justify-content: flex-end; + } + + .row.aln-top { + align-items: flex-start; + } + + .row.aln-middle { + align-items: center; + } + + .row.aln-bottom { + align-items: flex-end; + } + + .row > .imp-normal { + order: -1; + } + + .row > .col-1-normal { + width: 8.33333%; + } + + .row > .off-1-normal { + margin-left: 8.33333%; + } + + .row > .col-2-normal { + width: 16.66667%; + } + + .row > .off-2-normal { + margin-left: 16.66667%; + } + + .row > .col-3-normal { + width: 25%; + } + + .row > .off-3-normal { + margin-left: 25%; + } + + .row > .col-4-normal { + width: 33.33333%; + } + + .row > .off-4-normal { + margin-left: 33.33333%; + } + + .row > .col-5-normal { + width: 41.66667%; + } + + .row > .off-5-normal { + margin-left: 41.66667%; + } + + .row > .col-6-normal { + width: 50%; + } + + .row > .off-6-normal { + margin-left: 50%; + } + + .row > .col-7-normal { + width: 58.33333%; + } + + .row > .off-7-normal { + margin-left: 58.33333%; + } + + .row > .col-8-normal { + width: 66.66667%; + } + + .row > .off-8-normal { + margin-left: 66.66667%; + } + + .row > .col-9-normal { + width: 75%; + } + + .row > .off-9-normal { + margin-left: 75%; + } + + .row > .col-10-normal { + width: 83.33333%; + } + + .row > .off-10-normal { + margin-left: 83.33333%; + } + + .row > .col-11-normal { + width: 91.66667%; + } + + .row > .off-11-normal { + margin-left: 91.66667%; + } + + .row > .col-12-normal { + width: 100%; + } + + .row > .off-12-normal { + margin-left: 100%; + } + + .row.gtr-0 { + margin-top: 0px; + margin-left: 0px; + } + + .row.gtr-0 > * { + padding: 0px 0 0 0px; + } + + .row.gtr-0.gtr-uniform { + margin-top: 0px; + } + + .row.gtr-0.gtr-uniform > * { + padding-top: 0px; + } + + .row.gtr-25 { + margin-top: -10px; + margin-left: -10px; + } + + .row.gtr-25 > * { + padding: 10px 0 0 10px; + } + + .row.gtr-25.gtr-uniform { + margin-top: -10px; + } + + .row.gtr-25.gtr-uniform > * { + padding-top: 10px; + } + + .row.gtr-50 { + margin-top: -20px; + margin-left: -20px; + } + + .row.gtr-50 > * { + padding: 20px 0 0 20px; + } + + .row.gtr-50.gtr-uniform { + margin-top: -20px; + } + + .row.gtr-50.gtr-uniform > * { + padding-top: 20px; + } + + .row { + margin-top: -40px; + margin-left: -40px; + } + + .row > * { + padding: 40px 0 0 40px; + } + + .row.gtr-uniform { + margin-top: -40px; + } + + .row.gtr-uniform > * { + padding-top: 40px; + } + + .row.gtr-150 { + margin-top: -60px; + margin-left: -60px; + } + + .row.gtr-150 > * { + padding: 60px 0 0 60px; + } + + .row.gtr-150.gtr-uniform { + margin-top: -60px; + } + + .row.gtr-150.gtr-uniform > * { + padding-top: 60px; + } + + .row.gtr-200 { + margin-top: -80px; + margin-left: -80px; + } + + .row.gtr-200 > * { + padding: 80px 0 0 80px; + } + + .row.gtr-200.gtr-uniform { + margin-top: -80px; + } + + .row.gtr-200.gtr-uniform > * { + padding-top: 80px; + } + + } + + @media screen and (max-width: 980px) { + + .row { + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + align-items: stretch; + } + + .row > * { + box-sizing: border-box; + } + + .row.gtr-uniform > * > :last-child { + margin-bottom: 0; + } + + .row.aln-left { + justify-content: flex-start; + } + + .row.aln-center { + justify-content: center; + } + + .row.aln-right { + justify-content: flex-end; + } + + .row.aln-top { + align-items: flex-start; + } + + .row.aln-middle { + align-items: center; + } + + .row.aln-bottom { + align-items: flex-end; + } + + .row > .imp-narrow { + order: -1; + } + + .row > .col-1-narrow { + width: 8.33333%; + } + + .row > .off-1-narrow { + margin-left: 8.33333%; + } + + .row > .col-2-narrow { + width: 16.66667%; + } + + .row > .off-2-narrow { + margin-left: 16.66667%; + } + + .row > .col-3-narrow { + width: 25%; + } + + .row > .off-3-narrow { + margin-left: 25%; + } + + .row > .col-4-narrow { + width: 33.33333%; + } + + .row > .off-4-narrow { + margin-left: 33.33333%; + } + + .row > .col-5-narrow { + width: 41.66667%; + } + + .row > .off-5-narrow { + margin-left: 41.66667%; + } + + .row > .col-6-narrow { + width: 50%; + } + + .row > .off-6-narrow { + margin-left: 50%; + } + + .row > .col-7-narrow { + width: 58.33333%; + } + + .row > .off-7-narrow { + margin-left: 58.33333%; + } + + .row > .col-8-narrow { + width: 66.66667%; + } + + .row > .off-8-narrow { + margin-left: 66.66667%; + } + + .row > .col-9-narrow { + width: 75%; + } + + .row > .off-9-narrow { + margin-left: 75%; + } + + .row > .col-10-narrow { + width: 83.33333%; + } + + .row > .off-10-narrow { + margin-left: 83.33333%; + } + + .row > .col-11-narrow { + width: 91.66667%; + } + + .row > .off-11-narrow { + margin-left: 91.66667%; + } + + .row > .col-12-narrow { + width: 100%; + } + + .row > .off-12-narrow { + margin-left: 100%; + } + + .row.gtr-0 { + margin-top: 0px; + margin-left: 0px; + } + + .row.gtr-0 > * { + padding: 0px 0 0 0px; + } + + .row.gtr-0.gtr-uniform { + margin-top: 0px; + } + + .row.gtr-0.gtr-uniform > * { + padding-top: 0px; + } + + .row.gtr-25 { + margin-top: -7.5px; + margin-left: -7.5px; + } + + .row.gtr-25 > * { + padding: 7.5px 0 0 7.5px; + } + + .row.gtr-25.gtr-uniform { + margin-top: -7.5px; + } + + .row.gtr-25.gtr-uniform > * { + padding-top: 7.5px; + } + + .row.gtr-50 { + margin-top: -15px; + margin-left: -15px; + } + + .row.gtr-50 > * { + padding: 15px 0 0 15px; + } + + .row.gtr-50.gtr-uniform { + margin-top: -15px; + } + + .row.gtr-50.gtr-uniform > * { + padding-top: 15px; + } + + .row { + margin-top: -30px; + margin-left: -30px; + } + + .row > * { + padding: 30px 0 0 30px; + } + + .row.gtr-uniform { + margin-top: -30px; + } + + .row.gtr-uniform > * { + padding-top: 30px; + } + + .row.gtr-150 { + margin-top: -45px; + margin-left: -45px; + } + + .row.gtr-150 > * { + padding: 45px 0 0 45px; + } + + .row.gtr-150.gtr-uniform { + margin-top: -45px; + } + + .row.gtr-150.gtr-uniform > * { + padding-top: 45px; + } + + .row.gtr-200 { + margin-top: -60px; + margin-left: -60px; + } + + .row.gtr-200 > * { + padding: 60px 0 0 60px; + } + + .row.gtr-200.gtr-uniform { + margin-top: -60px; + } + + .row.gtr-200.gtr-uniform > * { + padding-top: 60px; + } + + } + + @media screen and (max-width: 840px) { + + .row { + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + align-items: stretch; + } + + .row > * { + box-sizing: border-box; + } + + .row.gtr-uniform > * > :last-child { + margin-bottom: 0; + } + + .row.aln-left { + justify-content: flex-start; + } + + .row.aln-center { + justify-content: center; + } + + .row.aln-right { + justify-content: flex-end; + } + + .row.aln-top { + align-items: flex-start; + } + + .row.aln-middle { + align-items: center; + } + + .row.aln-bottom { + align-items: flex-end; + } + + .row > .imp-narrower { + order: -1; + } + + .row > .col-1-narrower { + width: 8.33333%; + } + + .row > .off-1-narrower { + margin-left: 8.33333%; + } + + .row > .col-2-narrower { + width: 16.66667%; + } + + .row > .off-2-narrower { + margin-left: 16.66667%; + } + + .row > .col-3-narrower { + width: 25%; + } + + .row > .off-3-narrower { + margin-left: 25%; + } + + .row > .col-4-narrower { + width: 33.33333%; + } + + .row > .off-4-narrower { + margin-left: 33.33333%; + } + + .row > .col-5-narrower { + width: 41.66667%; + } + + .row > .off-5-narrower { + margin-left: 41.66667%; + } + + .row > .col-6-narrower { + width: 50%; + } + + .row > .off-6-narrower { + margin-left: 50%; + } + + .row > .col-7-narrower { + width: 58.33333%; + } + + .row > .off-7-narrower { + margin-left: 58.33333%; + } + + .row > .col-8-narrower { + width: 66.66667%; + } + + .row > .off-8-narrower { + margin-left: 66.66667%; + } + + .row > .col-9-narrower { + width: 75%; + } + + .row > .off-9-narrower { + margin-left: 75%; + } + + .row > .col-10-narrower { + width: 83.33333%; + } + + .row > .off-10-narrower { + margin-left: 83.33333%; + } + + .row > .col-11-narrower { + width: 91.66667%; + } + + .row > .off-11-narrower { + margin-left: 91.66667%; + } + + .row > .col-12-narrower { + width: 100%; + } + + .row > .off-12-narrower { + margin-left: 100%; + } + + .row.gtr-0 { + margin-top: 0px; + margin-left: 0px; + } + + .row.gtr-0 > * { + padding: 0px 0 0 0px; + } + + .row.gtr-0.gtr-uniform { + margin-top: 0px; + } + + .row.gtr-0.gtr-uniform > * { + padding-top: 0px; + } + + .row.gtr-25 { + margin-top: -7.5px; + margin-left: -7.5px; + } + + .row.gtr-25 > * { + padding: 7.5px 0 0 7.5px; + } + + .row.gtr-25.gtr-uniform { + margin-top: -7.5px; + } + + .row.gtr-25.gtr-uniform > * { + padding-top: 7.5px; + } + + .row.gtr-50 { + margin-top: -15px; + margin-left: -15px; + } + + .row.gtr-50 > * { + padding: 15px 0 0 15px; + } + + .row.gtr-50.gtr-uniform { + margin-top: -15px; + } + + .row.gtr-50.gtr-uniform > * { + padding-top: 15px; + } + + .row { + margin-top: -30px; + margin-left: -30px; + } + + .row > * { + padding: 30px 0 0 30px; + } + + .row.gtr-uniform { + margin-top: -30px; + } + + .row.gtr-uniform > * { + padding-top: 30px; + } + + .row.gtr-150 { + margin-top: -45px; + margin-left: -45px; + } + + .row.gtr-150 > * { + padding: 45px 0 0 45px; + } + + .row.gtr-150.gtr-uniform { + margin-top: -45px; + } + + .row.gtr-150.gtr-uniform > * { + padding-top: 45px; + } + + .row.gtr-200 { + margin-top: -60px; + margin-left: -60px; + } + + .row.gtr-200 > * { + padding: 60px 0 0 60px; + } + + .row.gtr-200.gtr-uniform { + margin-top: -60px; + } + + .row.gtr-200.gtr-uniform > * { + padding-top: 60px; + } + + } + + @media screen and (max-width: 736px) { + + .row { + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + align-items: stretch; + } + + .row > * { + box-sizing: border-box; + } + + .row.gtr-uniform > * > :last-child { + margin-bottom: 0; + } + + .row.aln-left { + justify-content: flex-start; + } + + .row.aln-center { + justify-content: center; + } + + .row.aln-right { + justify-content: flex-end; + } + + .row.aln-top { + align-items: flex-start; + } + + .row.aln-middle { + align-items: center; + } + + .row.aln-bottom { + align-items: flex-end; + } + + .row > .imp-mobile { + order: -1; + } + + .row > .col-1-mobile { + width: 8.33333%; + } + + .row > .off-1-mobile { + margin-left: 8.33333%; + } + + .row > .col-2-mobile { + width: 16.66667%; + } + + .row > .off-2-mobile { + margin-left: 16.66667%; + } + + .row > .col-3-mobile { + width: 25%; + } + + .row > .off-3-mobile { + margin-left: 25%; + } + + .row > .col-4-mobile { + width: 33.33333%; + } + + .row > .off-4-mobile { + margin-left: 33.33333%; + } + + .row > .col-5-mobile { + width: 41.66667%; + } + + .row > .off-5-mobile { + margin-left: 41.66667%; + } + + .row > .col-6-mobile { + width: 50%; + } + + .row > .off-6-mobile { + margin-left: 50%; + } + + .row > .col-7-mobile { + width: 58.33333%; + } + + .row > .off-7-mobile { + margin-left: 58.33333%; + } + + .row > .col-8-mobile { + width: 66.66667%; + } + + .row > .off-8-mobile { + margin-left: 66.66667%; + } + + .row > .col-9-mobile { + width: 75%; + } + + .row > .off-9-mobile { + margin-left: 75%; + } + + .row > .col-10-mobile { + width: 83.33333%; + } + + .row > .off-10-mobile { + margin-left: 83.33333%; + } + + .row > .col-11-mobile { + width: 91.66667%; + } + + .row > .off-11-mobile { + margin-left: 91.66667%; + } + + .row > .col-12-mobile { + width: 100%; + } + + .row > .off-12-mobile { + margin-left: 100%; + } + + .row.gtr-0 { + margin-top: 0px; + margin-left: 0px; + } + + .row.gtr-0 > * { + padding: 0px 0 0 0px; + } + + .row.gtr-0.gtr-uniform { + margin-top: 0px; + } + + .row.gtr-0.gtr-uniform > * { + padding-top: 0px; + } + + .row.gtr-25 { + margin-top: -7.5px; + margin-left: -7.5px; + } + + .row.gtr-25 > * { + padding: 7.5px 0 0 7.5px; + } + + .row.gtr-25.gtr-uniform { + margin-top: -7.5px; + } + + .row.gtr-25.gtr-uniform > * { + padding-top: 7.5px; + } + + .row.gtr-50 { + margin-top: -15px; + margin-left: -15px; + } + + .row.gtr-50 > * { + padding: 15px 0 0 15px; + } + + .row.gtr-50.gtr-uniform { + margin-top: -15px; + } + + .row.gtr-50.gtr-uniform > * { + padding-top: 15px; + } + + .row { + margin-top: -30px; + margin-left: -30px; + } + + .row > * { + padding: 30px 0 0 30px; + } + + .row.gtr-uniform { + margin-top: -30px; + } + + .row.gtr-uniform > * { + padding-top: 30px; + } + + .row.gtr-150 { + margin-top: -45px; + margin-left: -45px; + } + + .row.gtr-150 > * { + padding: 45px 0 0 45px; + } + + .row.gtr-150.gtr-uniform { + margin-top: -45px; + } + + .row.gtr-150.gtr-uniform > * { + padding-top: 45px; + } + + .row.gtr-200 { + margin-top: -60px; + margin-left: -60px; + } + + .row.gtr-200 > * { + padding: 60px 0 0 60px; + } + + .row.gtr-200.gtr-uniform { + margin-top: -60px; + } + + .row.gtr-200.gtr-uniform > * { + padding-top: 60px; + } + + } + +/* Section/Article */ + + section.special, article.special { + text-align: center; + } + + header.major { + padding-bottom: 2em; + } + + header.special { + margin-bottom: 5em; + padding-top: 7em; + position: relative; + text-align: center; + } + + header.special:before, header.special:after { + border-bottom: solid 1.5px; + border-top: solid 1.5px; + content: ''; + height: 7px; + opacity: 0.1; + position: absolute; + top: 1.75em; + width: 43%; + } + + header.special:before { + left: 0; + } + + header.special:after { + right: 0; + } + + header.special h2 { + margin-bottom: 0; + } + + header.special h2 + p { + margin-bottom: 0; + padding-top: 1.5em; + } + + header.special .icon { + cursor: default; + height: 7em; + left: 0; + position: absolute; + text-align: center; + top: 1em; + width: 100%; + } + + header.special .icon:before { + font-size: 3.5em; + opacity: 0.35; + } + + footer > :last-child { + margin-bottom: 0; + } + + footer.major { + padding-top: 3em; + } + +/* Form */ + + input[type="text"], + input[type="password"], + input[type="email"], + textarea { + -moz-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out; + -webkit-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out; + -ms-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out; + transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out; + -moz-appearance: none; + -webkit-appearance: none; + -ms-appearance: none; + appearance: none; + background: none; + border: solid 1px rgba(124, 128, 129, 0.2); + border-radius: 0; + color: inherit; + display: block; + padding: 0.75em; + text-decoration: none; + width: 100%; + outline: 0; + } + + input[type="text"]:focus, + input[type="password"]:focus, + input[type="email"]:focus, + textarea:focus { + border-color: #ee856f; + } + + input[type="text"], + input[type="password"], + input[type="email"] { + line-height: 1em; + } + + ::-webkit-input-placeholder { + color: inherit; + opacity: 0.5; + position: relative; + top: 3px; + } + + :-moz-placeholder { + color: inherit; + opacity: 0.5; + } + + ::-moz-placeholder { + color: inherit; + opacity: 0.5; + } + + :-ms-input-placeholder { + color: inherit; + opacity: 0.5; + } + +/* Image */ + + .image { + border: 0; + position: relative; + } + + .image:before { + background: url("images/overlay.png"); + content: ''; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; + } + + .image.fit { + display: block; + } + + .image.fit img { + display: block; + width: 100%; + } + + .image.featured { + display: block; + margin: 0 0 2em 0; + } + + .image.featured img { + display: block; + width: 100%; + } + +/* Icon */ + + .icon { + text-decoration: none; + position: relative; + } + + .icon:before { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + text-transform: none !important; + font-family: 'Font Awesome 5 Free'; + font-weight: 400; + } + + .icon.solid:before { + font-weight: 900; + } + + .icon:before { + line-height: inherit; + } + + .icon.brands:before { + font-family: 'Font Awesome 5 Brands'; + } + + .icon.circle { + -moz-transition: all 0.2s ease-in-out; + -webkit-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + border: 0; + border-radius: 100%; + display: inline-block; + font-size: 1.25em; + height: 2.25em; + left: 0; + line-height: 2.25em; + text-align: center; + text-decoration: none; + top: 0; + width: 2.25em; + } + + .icon.circle:hover { + top: -0.2em; + } + + .icon.circle.fa-twitter { + background: #70aecd; + color: #fff; + } + + .icon.circle.fa-twitter:hover { + background: #7fb7d2; + } + + .icon.circle.fa-facebook-f { + background: #7490c3; + color: #fff; + } + + .icon.circle.fa-facebook-f:hover { + background: #829bc9; + } + + .icon.circle.fa-google-plus-g { + background: #db6b67; + color: #fff; + } + + .icon.circle.fa-google-plus-g:hover { + background: #df7b77; + } + + .icon.circle.fa-github { + background: #dcad8b; + color: #fff; + } + + .icon.circle.fa-github:hover { + background: #e1b89b; + } + + .icon.circle.fa-dribbble { + background: #da83ae; + color: #fff; + } + + .icon.circle.fa-dribbble:hover { + background: #df93b8; + } + + .icon.featured { + cursor: default; + display: block; + margin: 0 0 1.5em 0; + opacity: 0.35; + text-align: center; + } + + .icon.featured:before { + font-size: 5em; + line-height: 1em; + } + + .icon > .label { + display: none; + } + +/* List */ + + ol { + list-style: decimal; + padding-left: 1.25em; + } + + ol li { + padding-left: 0.25em; + } + + ul { + list-style: disc; + padding-left: 1em; + } + + ul li { + padding-left: 0.5em; + } + +/* Icons */ + + ul.icons { + list-style: none; + padding-left: 0; + cursor: default; + } + + ul.icons li { + display: inline-block; + line-height: 1em; + padding-left: 0.5em; + } + + ul.icons li:first-child { + padding-left: 0; + } + +/* Featured Icons */ + + ul.featured-icons { + cursor: default; + margin: -0.75em 0 0 0; + opacity: 0.35; + overflow: hidden; + position: relative; + list-style: none; + padding-left: 0; + } + + ul.featured-icons li { + display: block; + float: left; + text-align: center; + width: 50%; + padding-left: 0; + margin-bottom: 1em; + } + + ul.featured-icons li .icon { + display: inline-block; + font-size: 5.5em; + height: 1em; + line-height: 1.5em; + width: 1em; + } + +/* Buttons */ + + ul.buttons { + cursor: default; + list-style: none; + padding-left: 0; + } + + ul.buttons:last-child { + margin-bottom: 0; + } + + ul.buttons li { + display: inline-block; + padding: 0 0 0 1.5em; + } + + ul.buttons li:first-child { + padding: 0; + } + + ul.buttons.stacked li { + display: block; + padding: 1.5em 0 0 0; + } + + ul.buttons.stacked li:first-child { + padding: 0; + } + +/* Table */ + + table { + width: 100%; + } + + table.default { + width: 100%; + } + + table.default tbody tr { + border-bottom: solid 1px rgba(124, 128, 129, 0.2); + } + + table.default td { + padding: 0.5em 1em 0.5em 1em; + } + + table.default th { + font-weight: 400; + padding: 0.5em 1em 0.5em 1em; + text-align: left; + } + + table.default thead { + background: #7c8081; + color: #fff; + } + +/* Button */ + + input[type="button"], + input[type="submit"], + input[type="reset"], + button, + .button { + -moz-appearance: none; + -webkit-appearance: none; + -ms-appearance: none; + appearance: none; + -moz-transition: color 0.2s ease-in-out, border-color 0.2s ease-in-out, background-color 0.2s ease-in-out; + -webkit-transition: color 0.2s ease-in-out, border-color 0.2s ease-in-out, background-color 0.2s ease-in-out; + -ms-transition: color 0.2s ease-in-out, border-color 0.2s ease-in-out, background-color 0.2s ease-in-out; + transition: color 0.2s ease-in-out, border-color 0.2s ease-in-out, background-color 0.2s ease-in-out; + background: none; + border: solid 1px; + border-radius: 0; + color: inherit; + cursor: pointer; + display: inline-block; + font-size: 0.8em; + font-weight: 900; + letter-spacing: 2px; + min-width: 18em; + padding: 0 0.75em; + line-height: 3.75em; + text-align: center; + text-decoration: none; + text-transform: uppercase; + } + + input[type="button"]:hover, + input[type="submit"]:hover, + input[type="reset"]:hover, + button:hover, + .button:hover { + background: rgba(188, 202, 206, 0.15); + border-color: inherit; + } + + input[type="button"].primary, + input[type="submit"].primary, + input[type="reset"].primary, + button.primary, + .button.primary { + background: #ee856f; + border-color: #ee856f; + color: #fff !important; + } + + input[type="button"].primary:hover, + input[type="submit"].primary:hover, + input[type="reset"].primary:hover, + button.primary:hover, + .button.primary:hover { + background: #fe957f !important; + border-color: #fe957f !important; + } + + input[type="button"].fit, + input[type="submit"].fit, + input[type="reset"].fit, + button.fit, + .button.fit { + width: 100%; + } + + input[type="button"].small, + input[type="submit"].small, + input[type="reset"].small, + button.small, + .button.small { + font-size: 0.7em; + min-width: 14em; + padding: 0.5em 0; + } + +/* Wrapper */ + + .wrapper { + margin-bottom: 5em; + padding: 5em; + } + + .wrapper.style1 { + padding: 0; + } + + .wrapper.style2 { + background-color: #ee856f; + background-image: url("images/light-bl.svg"), url("images/light-br.svg"); + background-position: bottom left, bottom right; + background-repeat: no-repeat, no-repeat; + background-size: 25em, 25em; + color: #fff; + } + + .wrapper.style2 input[type="button"]:hover, + .wrapper.style2 input[type="submit"]:hover, + .wrapper.style2 input[type="reset"]:hover, + .wrapper.style2 button:hover, + .wrapper.style2 .button:hover { + background: rgba(255, 255, 255, 0.15) !important; + } + + .wrapper.style2 input[type="button"].primary, + .wrapper.style2 input[type="submit"].primary, + .wrapper.style2 input[type="reset"].primary, + .wrapper.style2 button.primary, + .wrapper.style2 .button.primary { + background: #fff; + border-color: #fff; + color: #ee856f !important; + } + + .wrapper.style2 input[type="button"].primary:hover, + .wrapper.style2 input[type="submit"].primary:hover, + .wrapper.style2 input[type="reset"].primary:hover, + .wrapper.style2 button.primary:hover, + .wrapper.style2 .button.primary:hover { + border-color: inherit !important; + color: #fff !important; + } + + .wrapper.style3 { + background: #fff; + color: inherit; + } + + .wrapper.style4 { + background: #fff; + color: inherit; + padding: 4em; + } + +/* Header */ + + @-moz-keyframes reveal-header { + 0% { + top: -5em; + } + + 100% { + top: 0; + } + } + + @-webkit-keyframes reveal-header { + 0% { + top: -5em; + } + + 100% { + top: 0; + } + } + + @-ms-keyframes reveal-header { + 0% { + top: -5em; + } + + 100% { + top: 0; + } + } + + @keyframes reveal-header { + 0% { + top: -5em; + } + + 100% { + top: 0; + } + } + + #header { + background: #fff; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.075); + color: inherit; + cursor: default; + font-size: 0.8em; + left: 0; + padding: 1em 1.5em; + position: fixed; + top: 0; + width: 100%; + z-index: 10000; + } + + #header h1 { + font-weight: 900; + margin: 0; + } + + #header h1 span { + font-weight: 300; + } + + #header nav { + letter-spacing: 0.075em; + position: absolute; + right: 1.5em; + text-transform: uppercase; + top: 0.75em; + } + + #header nav ul { + list-style: none; + padding-left: 0; + } + + #header nav ul li { + display: inline-block; + margin-left: 1.5em; + padding-left: 0; + } + + #header nav ul li > ul { + display: none; + } + + #header nav ul li a { + border: solid 1px transparent; + color: inherit; + display: inline-block; + line-height: 1em; + padding: 0.6em 0.75em; + text-decoration: none; + } + + #header nav ul li input[type="button"], + #header nav ul li input[type="submit"], + #header nav ul li input[type="reset"], + #header nav ul li button, + #header nav ul li .button { + font-size: 1em; + min-width: 0; + width: auto; + } + + #header nav ul li.submenu > a { + text-decoration: none; + } + + #header nav ul li.submenu > a:before { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + text-transform: none !important; + font-family: 'Font Awesome 5 Free'; + font-weight: 900; + } + + #header nav ul li.submenu > a:before { + content: '\f107'; + margin-right: 0.65em; + } + + #header nav ul li.active > a, #header nav ul li:hover > a { + -moz-transition: all 0.2s ease-in-out; + -webkit-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + background: rgba(188, 202, 206, 0.15); + } + + #header nav ul li.current > a { + font-weight: 900; + } + + #header.reveal { + -moz-animation: reveal-header 0.5s; + -webkit-animation: reveal-header 0.5s; + -ms-animation: reveal-header 0.5s; + animation: reveal-header 0.5s; + } + + #header.alt { + -moz-animation: none; + -webkit-animation: none; + -ms-animation: none; + animation: none; + background: transparent; + box-shadow: none; + color: #fff; + padding: 2em 2.5em; + position: absolute; + } + + #header.alt nav { + right: 2.5em; + top: 1.75em; + } + + #header.alt nav ul li.active > a, #header.alt nav ul li:hover > a { + border: solid 1px; + } + +/* Dropotron */ + + .dropotron { + list-style: none; + padding-left: 0; + background: #fff; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.075); + line-height: 2.25em; + min-width: 13em; + padding: 1em 0; + text-transform: uppercase; + margin-top: calc(-1em + 1px); + } + + .dropotron.level-0 { + font-size: 0.7em; + font-weight: 400; + margin-top: 1.5em; + } + + .dropotron.level-0:before { + border-bottom: solid 0.5em #fff; + border-left: solid 0.5em transparent; + border-right: solid 0.5em transparent; + content: ''; + left: 0.75em; + position: absolute; + top: -0.45em; + } + + .dropotron > li { + border-top: solid 1px rgba(124, 128, 129, 0.2); + padding-left: 0; + } + + .dropotron > li > a { + -moz-transition: none; + -webkit-transition: none; + -ms-transition: none; + transition: none; + color: inherit; + text-decoration: none; + padding: 0 1em; + border: 0; + } + + .dropotron > li:hover > a { + background: #ee856f; + color: #fff; + } + + .dropotron > li:first-child { + border-top: 0; + } + +/* Banner */ + + @-moz-keyframes reveal-banner { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + @-webkit-keyframes reveal-banner { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + @-ms-keyframes reveal-banner { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + @keyframes reveal-banner { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + #banner { + background-attachment: scroll, scroll, scroll, fixed; + background-color: #645862; + background-image: url("images/light-bl.svg"), url("images/light-br.svg"), url("images/overlay.png"), url("../../images/banner.jpg"); + background-position: bottom left, bottom right, top left, top center; + background-repeat: no-repeat, no-repeat, repeat, no-repeat; + background-size: 25em, 25em, auto, cover; + color: #fff; + cursor: default; + padding: 6em 0; + text-align: center; + } + + #banner .inner { + -moz-animation: reveal-banner 1s 0.25s ease-in-out; + -webkit-animation: reveal-banner 1s 0.25s ease-in-out; + -ms-animation: reveal-banner 1s 0.25s ease-in-out; + animation: reveal-banner 1s 0.25s ease-in-out; + -moz-animation-fill-mode: forwards; + -webkit-animation-fill-mode: forwards; + -ms-animation-fill-mode: forwards; + animation-fill-mode: forwards; + background: rgba(52, 27, 43, 0.5); + color: #fff; + display: inline-block; + opacity: 0; + padding: 3em; + text-align: center; + } + + #banner .inner header { + display: inline-block; + border-bottom: solid 2px; + border-top: solid 2px; + margin: 0 0 2em 0; + padding: 3px 0 3px 0; + } + + #banner .inner header h2 { + border-bottom: solid 2px; + border-top: solid 2px; + font-size: 2.5em; + font-weight: 900; + letter-spacing: 0.2em; + margin: 0; + padding-left: 0.05em; + position: relative; + text-transform: uppercase; + } + + #banner .inner p { + letter-spacing: 0.1em; + margin: 0; + text-transform: uppercase; + } + + #banner .inner p a { + color: inherit; + font-weight: 400; + text-decoration: none; + } + + #banner .inner footer { + margin: 2em 0 0 0; + } + +/* Main */ + + #main { + background-image: url("images/dark-tl.svg"), url("images/dark-tr.svg"), url("images/dark-bl.svg"), url("images/dark-br.svg"); + background-position: top left, top right, bottom left, bottom right; + background-repeat: no-repeat; + background-size: 25em; + padding: 7em 0; + } + + #main > :last-child { + margin-bottom: 0; + } + + #main .sidebar section { + border-top: solid 1px rgba(124, 128, 129, 0.2); + margin: 3em 0 0 0; + padding: 3em 0 0 0; + } + + #main .sidebar section:first-child { + border-top: 0; + padding-top: 0; + margin-top: 0; + } + + body.index #main { + padding-top: 5em; + } + +/* CTA */ + + #cta { + background-attachment: scroll, scroll, scroll, fixed; + background-color: #645862; + background-image: url("images/light-tl.svg"), url("images/light-tr.svg"), url("images/overlay.png"), url("../../images/banner.jpg"); + background-position: top left, top right, top left, bottom center; + background-repeat: no-repeat, no-repeat, repeat, no-repeat; + background-size: 25em, 25em, auto, cover; + color: #fff; + padding: 5em; + text-align: center; + } + + #cta header { + margin-bottom: 2em; + } + +/* Footer */ + + #footer { + background: #E8EEF4; + color: #7c8081; + padding: 5em 5em 10em 5em; + text-align: center; + } + + #footer .copyright { + font-size: 0.8em; + line-height: 1em; + } + + #footer .copyright a { + color: inherit; + } + + #footer .copyright li { + display: inline-block; + margin-left: 1em; + padding-left: 1em; + border-left: dotted 1px; + } + + #footer .copyright li:first-child { + margin: 0; + padding: 0; + border: 0; + } + +/* Wide */ + + @media screen and (max-width: 1680px) { + + /* Basic */ + + body, input, select, textarea { + font-size: 14pt; + } + + /* Section/Article */ + + header.special { + padding-top: 5.5em; + margin-bottom: 4em; + } + + } + +/* Normal */ + + @media screen and (max-width: 1280px) { + + /* Basic */ + + body, input, select, textarea { + font-size: 13pt; + letter-spacing: 0.025em; + line-height: 1.65em; + } + + h1, h2, h3, h4, h5, h6 { + line-height: 1.5em; + } + + /* Section/Article */ + + header.major { + padding-bottom: 1.5em; + } + + footer.major { + padding-top: 2em; + } + + /* Wrapper */ + + .wrapper { + margin-bottom: 4em; + padding: 4em 3em; + } + + .wrapper.style4 { + padding: 3em; + } + + /* Header */ + + #header nav ul li { + margin-left: 1em; + } + + /* Banner */ + + #banner { + background-attachment: scroll; + } + + /* CTA */ + + #cta { + padding: 4em; + background-attachment: scroll; + } + + /* Footer */ + + #footer { + padding: 4em; + } + + } + +/* Narrow */ + + @media screen and (max-width: 980px) { + + /* Basic */ + + body, input, select, textarea { + font-size: 13pt; + letter-spacing: 0.025em; + line-height: 1.5em; + } + + /* Section/Article */ + + header br { + display: none; + } + + header.major { + padding-bottom: 1em; + } + + header.special { + padding-left: 2.5em; + padding-right: 2.5em; + } + + footer.major { + padding-top: 1.5em; + } + + /* Wrapper */ + + .wrapper { + margin-bottom: 3em; + padding: 3em 2.5em; + } + + .wrapper.special br { + display: none; + } + + .wrapper.style1 { + padding: 0 2.5em; + } + + .wrapper.style2 { + background-size: 15em; + } + + .wrapper.style4 { + padding: 2.5em; + } + + /* Banner */ + + #banner { + background-size: 15em, 15em, auto, cover; + } + + /* Main */ + + #main { + background-size: 15em; + } + + /* CTA */ + + #cta { + background-size: 15em, 15em, auto, cover; + padding: 3em; + } + + } + +/* Narrower */ + + #navPanel, #navButton { + display: none; + } + + @media screen and (max-width: 840px) { + + /* Basic */ + + html, body { + overflow-x: hidden; + } + + header.major { + padding-bottom: 0.25em; + } + + header.special { + margin-bottom: 4em; + padding-top: 5em; + } + + header.special:before, header.special:after { + width: 40%; + } + + header.special h2 + p { + padding-top: 1.25em; + } + + /* Section/Article */ + + section { + margin: 1em 0 1em 0; + } + + section:first-child { + margin-top: 0; + } + + /* Button */ + + input[type="button"].small, + input[type="submit"].small, + input[type="reset"].small, + button.small, + .button.small { + font-size: 0.8em; + min-width: 18em; + padding: 0.75em 0; + } + + /* Featured Icons */ + + ul.featured-icons { + margin: 0; + } + + ul.featured-icons li { + display: inline-block; + float: none; + width: auto; + } + + ul.featured-icons li .icon { + font-size: 4em; + width: 1.25em; + } + + /* Buttons */ + + ul.buttons li { + display: block; + padding: 1em 0 0 0; + } + + /* Header */ + + #header { + display: none; + } + + /* Banner */ + + #banner { + margin: 0; + } + + /* Wrapper */ + + .wrapper.special-alt { + text-align: center; + } + + .wrapper.style4 { + padding-bottom: 3em; + } + + /* Main */ + + #main { + padding: 5em 0; + } + + #main .sidebar { + border-top: solid 1px rgba(124, 128, 129, 0.1); + padding-top: 3em; + } + + #main .sidebar section { + border-top: 0; + padding-top: 0; + } + + body.index #main { + padding-top: 4.5em; + } + + /* CTA */ + + #cta { + margin: 0; + } + + /* Footer */ + + #footer { + padding: 4em 1.5em; + } + + /* Nav */ + + #page-wrapper { + -moz-backface-visibility: hidden; + -webkit-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + -moz-transition: -moz-transform 0.5s ease; + -webkit-transition: -webkit-transform 0.5s ease; + -ms-transition: -ms-transform 0.5s ease; + transition: transform 0.5s ease; + padding-bottom: 1px; + } + + #navButton { + -moz-backface-visibility: hidden; + -webkit-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + -moz-transition: -moz-transform 0.5s ease; + -webkit-transition: -webkit-transform 0.5s ease; + -ms-transition: -ms-transform 0.5s ease; + transition: transform 0.5s ease; + display: block; + height: 60px; + left: 0; + position: fixed; + top: 0; + width: 100%; + z-index: 10001; + } + + #navButton .toggle { + text-decoration: none; + height: 60px; + left: 0; + position: absolute; + text-align: center; + top: 0; + width: 100%; + border: 0; + outline: 0; + } + + #navButton .toggle:before { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + text-transform: none !important; + font-family: 'Font Awesome 5 Free'; + font-weight: 900; + } + + #navButton .toggle:before { + color: #fff; + content: '\f0c9'; + font-size: 1em; + height: 40px; + left: 10px; + line-height: 40px; + opacity: 0.5; + position: absolute; + top: 11px; + width: 60px; + z-index: 1; + } + + #navButton .toggle:after { + background: rgba(163, 169, 170, 0.75); + border-radius: 2px; + content: ''; + height: 40px; + left: 10px; + position: absolute; + top: 10px; + width: 60px; + } + + #navPanel { + -moz-backface-visibility: hidden; + -webkit-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + -moz-transform: translateX(-275px); + -webkit-transform: translateX(-275px); + -ms-transform: translateX(-275px); + transform: translateX(-275px); + -moz-transition: -moz-transform 0.5s ease; + -webkit-transition: -webkit-transform 0.5s ease; + -ms-transition: -ms-transform 0.5s ease; + transition: transform 0.5s ease; + display: block; + height: 100%; + left: 0; + overflow-y: auto; + position: fixed; + top: 0; + width: 275px; + z-index: 10002; + background: #1c2021; + color: #fff; + font-size: 0.8em; + letter-spacing: 0.075em; + text-transform: uppercase; + padding: 0.25em 0.75em 1em 0.75em; + } + + #navPanel .link { + border: 0; + border-top: solid 1px rgba(255, 255, 255, 0.05); + color: inherit; + display: block; + height: 3em; + line-height: 3em; + opacity: 0.75; + text-decoration: none; + } + + #navPanel .link.depth-0 { + font-weight: 900; + } + + #navPanel .link:first-child { + border-top: 0; + } + + #navPanel .indent-1 { + display: inline-block; + width: 1em; + } + + #navPanel .indent-2 { + display: inline-block; + width: 2em; + } + + #navPanel .indent-3 { + display: inline-block; + width: 3em; + } + + #navPanel .indent-4 { + display: inline-block; + width: 4em; + } + + #navPanel .indent-5 { + display: inline-block; + width: 5em; + } + + body.navPanel-visible #page-wrapper { + -moz-transform: translateX(275px); + -webkit-transform: translateX(275px); + -ms-transform: translateX(275px); + transform: translateX(275px); + } + + body.navPanel-visible #navButton { + -moz-transform: translateX(275px); + -webkit-transform: translateX(275px); + -ms-transform: translateX(275px); + transform: translateX(275px); + } + + body.navPanel-visible #navPanel { + -moz-transform: translateX(0); + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + } + +/* Mobile */ + + @media screen and (max-width: 736px) { + + /* Basic */ + + body { + min-width: 320px; + } + + h2 { + font-size: 1.25em; + letter-spacing: 0.1em; + } + + h3 { + font-size: 1em; + letter-spacing: 0.025em; + } + + p { + text-align: justify; + } + + /* Section/Article */ + + header { + text-align: center; + } + + header.major { + padding-bottom: 0; + } + + header.special { + margin-bottom: 3em; + padding-left: 1.5em; + padding-right: 1.5em; + } + + header.special:before, header.special:after { + width: 38%; + } + + header.special .icon { + font-size: 0.75em; + top: 1.5em; + } + + header p { + text-align: center; + } + + footer.major { + padding-top: 0; + } + + /* Icon */ + + .icon.circle { + font-size: 1em; + } + + /* Button */ + + input[type="button"], + input[type="submit"], + input[type="reset"], + button, + .button { + max-width: 20em; + width: 100%; + } + + input[type="button"].fit, + input[type="submit"].fit, + input[type="reset"].fit, + button.fit, + .button.fit { + width: auto; + } + + /* Icons */ + + ul.icons li { + padding-left: 0.25em; + } + + /* Featured Icons */ + + ul.featured-icons li .icon { + width: 1.1em; + } + + /* Buttons */ + + ul.buttons { + text-align: center; + } + + /* Wrapper */ + + .wrapper { + margin-bottom: 2.5em; + padding: 2.25em 1.5em; + } + + .wrapper.special br { + display: none; + } + + .wrapper.style1 { + padding: 0 1.5em; + } + + .wrapper.style2 { + background-size: 10em; + padding: 2.25em 1.5em; + } + + .wrapper.style4 { + background-size: 10em; + padding: 1.5em 1.5em 3em 1.5em; + } + + /* Banner */ + + #banner { + background-size: 10em, 10em, auto, cover; + padding: 6em 0; + } + + #banner .inner { + background: none; + display: block; + padding: 0 1.5em; + } + + #banner .inner header h2 { + font-size: 1.5em; + } + + #banner .inner p { + text-align: center; + } + + #banner .inner br { + display: none; + } + + /* Main */ + + #main { + background-size: 10em; + padding: 3.5em 0 2.5em 0; + } + + body.index #main { + padding: 2.5em 0 0 0; + } + + body.contact #main { + padding-bottom: 0; + } + + /* CTA */ + + #cta { + background-size: 10em, 10em, auto, cover; + padding: 3em 1.5em; + } + + /* Footer */ + + #footer { + padding: 3em 1.5em; + } + + #footer .copyright li { + display: block; + margin: 1em 0 0 0; + padding: 0; + border: 0; + } + + /* Nav */ + + #navButton .toggle:before { + top: 8px; + left: 8px; + width: 50px; + height: 34px; + line-height: 34px; + } + + #navButton .toggle:after { + top: 8px; + left: 8px; + width: 50px; + height: 34px; + } + + } \ No newline at end of file diff --git a/frontend/static/frontend/assets/css/noscript.css b/frontend/static/frontend/assets/css/noscript.css new file mode 100644 index 0000000..43e307d --- /dev/null +++ b/frontend/static/frontend/assets/css/noscript.css @@ -0,0 +1,11 @@ +/* + Twenty by Pixelarity + pixelarity.com | hello@pixelarity.com + License: pixelarity.com/license +*/ + +/* Banner */ + + #banner .inner { + opacity: 1; + } \ No newline at end of file diff --git a/frontend/static/frontend/assets/js/breakpoints.min.js b/frontend/static/frontend/assets/js/breakpoints.min.js new file mode 100644 index 0000000..32419cc --- /dev/null +++ b/frontend/static/frontend/assets/js/breakpoints.min.js @@ -0,0 +1,2 @@ +/* breakpoints.js v1.0 | @ajlkn | MIT licensed */ +var breakpoints=function(){"use strict";function e(e){t.init(e)}var t={list:null,media:{},events:[],init:function(e){t.list=e,window.addEventListener("resize",t.poll),window.addEventListener("orientationchange",t.poll),window.addEventListener("load",t.poll),window.addEventListener("fullscreenchange",t.poll)},active:function(e){var n,a,s,i,r,d,c;if(!(e in t.media)){if(">="==e.substr(0,2)?(a="gte",n=e.substr(2)):"<="==e.substr(0,2)?(a="lte",n=e.substr(2)):">"==e.substr(0,1)?(a="gt",n=e.substr(1)):"<"==e.substr(0,1)?(a="lt",n=e.substr(1)):"!"==e.substr(0,1)?(a="not",n=e.substr(1)):(a="eq",n=e),n&&n in t.list)if(i=t.list[n],Array.isArray(i)){if(r=parseInt(i[0]),d=parseInt(i[1]),isNaN(r)){if(isNaN(d))return;c=i[1].substr(String(d).length)}else c=i[0].substr(String(r).length);if(isNaN(r))switch(a){case"gte":s="screen";break;case"lte":s="screen and (max-width: "+d+c+")";break;case"gt":s="screen and (min-width: "+(d+1)+c+")";break;case"lt":s="screen and (max-width: -1px)";break;case"not":s="screen and (min-width: "+(d+1)+c+")";break;default:s="screen and (max-width: "+d+c+")"}else if(isNaN(d))switch(a){case"gte":s="screen and (min-width: "+r+c+")";break;case"lte":s="screen";break;case"gt":s="screen and (max-width: -1px)";break;case"lt":s="screen and (max-width: "+(r-1)+c+")";break;case"not":s="screen and (max-width: "+(r-1)+c+")";break;default:s="screen and (min-width: "+r+c+")"}else switch(a){case"gte":s="screen and (min-width: "+r+c+")";break;case"lte":s="screen and (max-width: "+d+c+")";break;case"gt":s="screen and (min-width: "+(d+1)+c+")";break;case"lt":s="screen and (max-width: "+(r-1)+c+")";break;case"not":s="screen and (max-width: "+(r-1)+c+"), screen and (min-width: "+(d+1)+c+")";break;default:s="screen and (min-width: "+r+c+") and (max-width: "+d+c+")"}}else s="("==i.charAt(0)?"screen and "+i:i;t.media[e]=!!s&&s}return t.media[e]!==!1&&window.matchMedia(t.media[e]).matches},on:function(e,n){t.events.push({query:e,handler:n,state:!1}),t.active(e)&&n()},poll:function(){var e,n;for(e=0;e0:!!("ontouchstart"in window),e.mobile="wp"==e.os||"android"==e.os||"ios"==e.os||"bb"==e.os}};return e.init(),e}();!function(e,n){"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?module.exports=n():e.browser=n()}(this,function(){return browser}); diff --git a/frontend/static/frontend/assets/js/jquery.dropotron.min.js b/frontend/static/frontend/assets/js/jquery.dropotron.min.js new file mode 100644 index 0000000..b992170 --- /dev/null +++ b/frontend/static/frontend/assets/js/jquery.dropotron.min.js @@ -0,0 +1,2 @@ +/* jquery.dropotron.js v1.4.3 | (c) @ajlkn | github.com/ajlkn/jquery.dropotron | MIT licensed */ +!function(e){e.fn.disableSelection_dropotron=function(){return e(this).css("user-select","none").css("-khtml-user-select","none").css("-moz-user-select","none").css("-o-user-select","none").css("-webkit-user-select","none")},e.fn.dropotron=function(t){if(0==this.length)return e(this);if(this.length>1)for(var o=0;o0&&t.add(n).on("mouseleave",function(e){window.clearTimeout(c),c=window.setTimeout(function(){t.trigger("doCollapse")},o.hideDelay)}),t.disableSelection_dropotron().hide().addClass(o.menuClass).css("position","absolute").on("mouseenter",function(e){window.clearTimeout(c)}).on("doExpand",function(){if(t.is(":visible"))return!1;window.clearTimeout(c),s.each(function(){var t=e(this);e.contains(t.get(0),n.get(0))||t.trigger("doCollapse")});var i,a,d,f,u=n.offset(),p=n.position(),h=(n.parent().position(),n.outerWidth()),g=t.outerWidth(),v=t.css("z-index")==o.baseZIndex;if(v){switch(i=o.detach?u:p,f=i.top+n.outerHeight()+o.globalOffsetY,a=o.alignment,t.removeClass("left").removeClass("right").removeClass("center"),o.alignment){case"right":d=i.left-g+h,0>d&&(d=i.left,a="left");break;case"center":d=i.left-Math.floor((g-h)/2),0>d?(d=i.left,a="left"):d+g>l.width()&&(d=i.left-g+h,a="right");break;case"left":default:d=i.left,d+g>l.width()&&(d=i.left-g+h,a="right")}t.addClass(a)}else switch("relative"==n.css("position")||"absolute"==n.css("position")?(f=o.offsetY,d=-1*p.left):(f=p.top+o.offsetY,d=0),o.alignment){case"right":d+=-1*n.parent().outerWidth()+o.offsetX;break;case"center":case"left":default:d+=n.parent().outerWidth()+o.offsetX}navigator.userAgent.match(/MSIE ([0-9]+)\./)&&RegExp.$1<8&&(d+=o.IEOffsetX,f+=o.IEOffsetY),t.css("left",d+"px").css("top",f+"px").css("opacity","0.01").show();var C=!1;switch(d="relative"==n.css("position")||"absolute"==n.css("position")?-1*p.left:0,t.offset().left<0?(d+=n.parent().outerWidth()-o.offsetX,C=!0):t.offset().left+g>l.width()&&(d+=-1*n.parent().outerWidth()-o.offsetX,C=!0),C&&t.css("left",d+"px"),t.hide().css("opacity","1"),o.mode){case"zoom":r=!0,n.addClass(o.openerActiveClass),t.animate({width:"toggle",height:"toggle"},o.speed,o.easing,function(){r=!1});break;case"slide":r=!0,n.addClass(o.openerActiveClass),t.animate({height:"toggle"},o.speed,o.easing,function(){r=!1});break;case"fade":if(r=!0,v&&!o.noOpenerFade){var C;C="slow"==o.speed?80:"fast"==o.speed?40:Math.floor(o.speed/2),n.fadeTo(C,.01,function(){n.addClass(o.openerActiveClass),n.fadeTo(o.speed,1),t.fadeIn(o.speed,function(){r=!1})})}else n.addClass(o.openerActiveClass),n.fadeTo(o.speed,1),t.fadeIn(o.speed,function(){r=!1});break;case"instant":default:n.addClass(o.openerActiveClass),t.show()}return!1}).on("doCollapse",function(){return t.is(":visible")?(t.hide(),n.removeClass(o.openerActiveClass),t.find("."+o.openerActiveClass).removeClass(o.openerActiveClass),t.find("ul").hide(),!1):!1}).on("doToggle",function(e){return t.is(":visible")?t.trigger("doCollapse"):t.trigger("doExpand"),!1}),n.disableSelection_dropotron().addClass("opener").css("cursor","pointer").on("click touchend",function(e){r||(e.preventDefault(),e.stopPropagation(),t.trigger("doToggle"))}),"hover"==o.expandMode&&n.hover(function(e){r||(d=window.setTimeout(function(){t.trigger("doExpand")},o.hoverDelay))},function(e){window.clearTimeout(d)})}),s.find("a").css("display","block").on("click touchend",function(t){r||e(this).attr("href").length<1&&t.preventDefault()}),n.find("li").css("white-space","nowrap").each(function(){var t=e(this),o=t.children("a"),s=t.children("ul"),i=o.attr("href");o.on("click touchend",function(e){0==i.length||"#"==i?e.preventDefault():e.stopPropagation()}),o.length>0&&0==s.length&&t.on("click touchend",function(e){r||(n.trigger("doCollapseAll"),e.stopPropagation())})}),n.children("li").each(function(){var t,n=e(this),s=n.children("ul");if(s.length>0){o.detach&&(o.cloneOnDetach&&(t=s.clone(),t.attr("class","").hide().appendTo(s.parent())),s.detach().appendTo(i));for(var a=o.baseZIndex,l=1,r=s;r.length>0;l++)r.css("z-index",a++),o.submenuClassPrefix&&r.addClass(o.submenuClassPrefix+(a-1-o.baseZIndex)),r=r.find("> li > ul")}}),l.on("scroll",function(){n.trigger("doCollapseAll")}).on("keypress",function(e){r||27!=e.keyCode||(e.preventDefault(),n.trigger("doCollapseAll"))}),a.on("click touchend",function(){r||n.trigger("doCollapseAll")})}}(jQuery); diff --git a/frontend/static/frontend/assets/js/jquery.min.js b/frontend/static/frontend/assets/js/jquery.min.js new file mode 100644 index 0000000..a1c07fd --- /dev/null +++ b/frontend/static/frontend/assets/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 01){for(var r=0;r=i&&o>=t};break;case"bottom":h=function(t,e,n,i,o){return n>=i&&o>=n};break;case"middle":h=function(t,e,n,i,o){return e>=i&&o>=e};break;case"top-only":h=function(t,e,n,i,o){return i>=t&&n>=i};break;case"bottom-only":h=function(t,e,n,i,o){return n>=o&&o>=t};break;default:case"default":h=function(t,e,n,i,o){return n>=i&&o>=t}}return c=function(t){var i,o,l,s,r,a,u=this.state,h=!1,c=this.$element.offset();i=n.height(),o=t+i/2,l=t+i,s=this.$element.outerHeight(),r=c.top+e(this.options.top,s,i),a=c.top+s-e(this.options.bottom,s,i),h=this.test(t,o,l,r,a),h!=u&&(this.state=h,h?this.options.enter&&this.options.enter.apply(this.element):this.options.leave&&this.options.leave.apply(this.element)),this.options.scroll&&this.options.scroll.apply(this.element,[(o-r)/(a-r)])},p={id:a,options:u,test:h,handler:c,state:null,element:this,$element:s,timeoutId:null},o[a]=p,s.data("_scrollexId",p.id),p.options.initialize&&p.options.initialize.apply(this),s},jQuery.fn.unscrollex=function(){var e=t(this);if(0==this.length)return e;if(this.length>1){for(var n=0;n1){for(o=0;o ul').dropotron({ + mode: 'fade', + noOpenerFade: true, + expandMode: (browser.mobile ? 'click' : 'hover') + }); + + // Nav Panel. + + // Button. + $( + '' + ) + .appendTo($body); + + // Panel. + $( + '' + ) + .appendTo($body) + .panel({ + delay: 500, + hideOnClick: true, + hideOnSwipe: true, + resetScroll: true, + resetForms: true, + side: 'left', + target: $body, + visibleClass: 'navPanel-visible' + }); + + // Fix: Remove navPanel transitions on WP<10 (poor/buggy performance). + if (browser.os == 'wp' && browser.osVersion < 10) + $('#navButton, #navPanel, #page-wrapper') + .css('transition', 'none'); + + // Header. + if (!browser.mobile + && $header.hasClass('alt') + && $banner.length > 0) { + + $window.on('load', function() { + + $banner.scrollex({ + bottom: $header.outerHeight(), + terminate: function() { $header.removeClass('alt'); }, + enter: function() { $header.addClass('alt reveal'); }, + leave: function() { $header.removeClass('alt'); } + }); + + }); + + } + +})(jQuery); \ No newline at end of file diff --git a/frontend/static/frontend/assets/js/util.js b/frontend/static/frontend/assets/js/util.js new file mode 100644 index 0000000..bdb8e9f --- /dev/null +++ b/frontend/static/frontend/assets/js/util.js @@ -0,0 +1,587 @@ +(function($) { + + /** + * Generate an indented list of links from a nav. Meant for use with panel(). + * @return {jQuery} jQuery object. + */ + $.fn.navList = function() { + + var $this = $(this); + $a = $this.find('a'), + b = []; + + $a.each(function() { + + var $this = $(this), + indent = Math.max(0, $this.parents('li').length - 1), + href = $this.attr('href'), + target = $this.attr('target'); + + b.push( + '' + + '' + + $this.text() + + '' + ); + + }); + + return b.join(''); + + }; + + /** + * Panel-ify an element. + * @param {object} userConfig User config. + * @return {jQuery} jQuery object. + */ + $.fn.panel = function(userConfig) { + + // No elements? + if (this.length == 0) + return $this; + + // Multiple elements? + if (this.length > 1) { + + for (var i=0; i < this.length; i++) + $(this[i]).panel(userConfig); + + return $this; + + } + + // Vars. + var $this = $(this), + $body = $('body'), + $window = $(window), + id = $this.attr('id'), + config; + + // Config. + config = $.extend({ + + // Delay. + delay: 0, + + // Hide panel on link click. + hideOnClick: false, + + // Hide panel on escape keypress. + hideOnEscape: false, + + // Hide panel on swipe. + hideOnSwipe: false, + + // Reset scroll position on hide. + resetScroll: false, + + // Reset forms on hide. + resetForms: false, + + // Side of viewport the panel will appear. + side: null, + + // Target element for "class". + target: $this, + + // Class to toggle. + visibleClass: 'visible' + + }, userConfig); + + // Expand "target" if it's not a jQuery object already. + if (typeof config.target != 'jQuery') + config.target = $(config.target); + + // Panel. + + // Methods. + $this._hide = function(event) { + + // Already hidden? Bail. + if (!config.target.hasClass(config.visibleClass)) + return; + + // If an event was provided, cancel it. + if (event) { + + event.preventDefault(); + event.stopPropagation(); + + } + + // Hide. + config.target.removeClass(config.visibleClass); + + // Post-hide stuff. + window.setTimeout(function() { + + // Reset scroll position. + if (config.resetScroll) + $this.scrollTop(0); + + // Reset forms. + if (config.resetForms) + $this.find('form').each(function() { + this.reset(); + }); + + }, config.delay); + + }; + + // Vendor fixes. + $this + .css('-ms-overflow-style', '-ms-autohiding-scrollbar') + .css('-webkit-overflow-scrolling', 'touch'); + + // Hide on click. + if (config.hideOnClick) { + + $this.find('a') + .css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)'); + + $this + .on('click', 'a', function(event) { + + var $a = $(this), + href = $a.attr('href'), + target = $a.attr('target'); + + if (!href || href == '#' || href == '' || href == '#' + id) + return; + + // Cancel original event. + event.preventDefault(); + event.stopPropagation(); + + // Hide panel. + $this._hide(); + + // Redirect to href. + window.setTimeout(function() { + + if (target == '_blank') + window.open(href); + else + window.location.href = href; + + }, config.delay + 10); + + }); + + } + + // Event: Touch stuff. + $this.on('touchstart', function(event) { + + $this.touchPosX = event.originalEvent.touches[0].pageX; + $this.touchPosY = event.originalEvent.touches[0].pageY; + + }) + + $this.on('touchmove', function(event) { + + if ($this.touchPosX === null + || $this.touchPosY === null) + return; + + var diffX = $this.touchPosX - event.originalEvent.touches[0].pageX, + diffY = $this.touchPosY - event.originalEvent.touches[0].pageY, + th = $this.outerHeight(), + ts = ($this.get(0).scrollHeight - $this.scrollTop()); + + // Hide on swipe? + if (config.hideOnSwipe) { + + var result = false, + boundary = 20, + delta = 50; + + switch (config.side) { + + case 'left': + result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX > delta); + break; + + case 'right': + result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX < (-1 * delta)); + break; + + case 'top': + result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY > delta); + break; + + case 'bottom': + result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY < (-1 * delta)); + break; + + default: + break; + + } + + if (result) { + + $this.touchPosX = null; + $this.touchPosY = null; + $this._hide(); + + return false; + + } + + } + + // Prevent vertical scrolling past the top or bottom. + if (($this.scrollTop() < 0 && diffY < 0) + || (ts > (th - 2) && ts < (th + 2) && diffY > 0)) { + + event.preventDefault(); + event.stopPropagation(); + + } + + }); + + // Event: Prevent certain events inside the panel from bubbling. + $this.on('click touchend touchstart touchmove', function(event) { + event.stopPropagation(); + }); + + // Event: Hide panel if a child anchor tag pointing to its ID is clicked. + $this.on('click', 'a[href="#' + id + '"]', function(event) { + + event.preventDefault(); + event.stopPropagation(); + + config.target.removeClass(config.visibleClass); + + }); + + // Body. + + // Event: Hide panel on body click/tap. + $body.on('click touchend', function(event) { + $this._hide(event); + }); + + // Event: Toggle. + $body.on('click', 'a[href="#' + id + '"]', function(event) { + + event.preventDefault(); + event.stopPropagation(); + + config.target.toggleClass(config.visibleClass); + + }); + + // Window. + + // Event: Hide on ESC. + if (config.hideOnEscape) + $window.on('keydown', function(event) { + + if (event.keyCode == 27) + $this._hide(event); + + }); + + return $this; + + }; + + /** + * Apply "placeholder" attribute polyfill to one or more forms. + * @return {jQuery} jQuery object. + */ + $.fn.placeholder = function() { + + // Browser natively supports placeholders? Bail. + if (typeof (document.createElement('input')).placeholder != 'undefined') + return $(this); + + // No elements? + if (this.length == 0) + return $this; + + // Multiple elements? + if (this.length > 1) { + + for (var i=0; i < this.length; i++) + $(this[i]).placeholder(); + + return $this; + + } + + // Vars. + var $this = $(this); + + // Text, TextArea. + $this.find('input[type=text],textarea') + .each(function() { + + var i = $(this); + + if (i.val() == '' + || i.val() == i.attr('placeholder')) + i + .addClass('polyfill-placeholder') + .val(i.attr('placeholder')); + + }) + .on('blur', function() { + + var i = $(this); + + if (i.attr('name').match(/-polyfill-field$/)) + return; + + if (i.val() == '') + i + .addClass('polyfill-placeholder') + .val(i.attr('placeholder')); + + }) + .on('focus', function() { + + var i = $(this); + + if (i.attr('name').match(/-polyfill-field$/)) + return; + + if (i.val() == i.attr('placeholder')) + i + .removeClass('polyfill-placeholder') + .val(''); + + }); + + // Password. + $this.find('input[type=password]') + .each(function() { + + var i = $(this); + var x = $( + $('
') + .append(i.clone()) + .remove() + .html() + .replace(/type="password"/i, 'type="text"') + .replace(/type=password/i, 'type=text') + ); + + if (i.attr('id') != '') + x.attr('id', i.attr('id') + '-polyfill-field'); + + if (i.attr('name') != '') + x.attr('name', i.attr('name') + '-polyfill-field'); + + x.addClass('polyfill-placeholder') + .val(x.attr('placeholder')).insertAfter(i); + + if (i.val() == '') + i.hide(); + else + x.hide(); + + i + .on('blur', function(event) { + + event.preventDefault(); + + var x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]'); + + if (i.val() == '') { + + i.hide(); + x.show(); + + } + + }); + + x + .on('focus', function(event) { + + event.preventDefault(); + + var i = x.parent().find('input[name=' + x.attr('name').replace('-polyfill-field', '') + ']'); + + x.hide(); + + i + .show() + .focus(); + + }) + .on('keypress', function(event) { + + event.preventDefault(); + x.val(''); + + }); + + }); + + // Events. + $this + .on('submit', function() { + + $this.find('input[type=text],input[type=password],textarea') + .each(function(event) { + + var i = $(this); + + if (i.attr('name').match(/-polyfill-field$/)) + i.attr('name', ''); + + if (i.val() == i.attr('placeholder')) { + + i.removeClass('polyfill-placeholder'); + i.val(''); + + } + + }); + + }) + .on('reset', function(event) { + + event.preventDefault(); + + $this.find('select') + .val($('option:first').val()); + + $this.find('input,textarea') + .each(function() { + + var i = $(this), + x; + + i.removeClass('polyfill-placeholder'); + + switch (this.type) { + + case 'submit': + case 'reset': + break; + + case 'password': + i.val(i.attr('defaultValue')); + + x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]'); + + if (i.val() == '') { + i.hide(); + x.show(); + } + else { + i.show(); + x.hide(); + } + + break; + + case 'checkbox': + case 'radio': + i.attr('checked', i.attr('defaultValue')); + break; + + case 'text': + case 'textarea': + i.val(i.attr('defaultValue')); + + if (i.val() == '') { + i.addClass('polyfill-placeholder'); + i.val(i.attr('placeholder')); + } + + break; + + default: + i.val(i.attr('defaultValue')); + break; + + } + }); + + }); + + return $this; + + }; + + /** + * Moves elements to/from the first positions of their respective parents. + * @param {jQuery} $elements Elements (or selector) to move. + * @param {bool} condition If true, moves elements to the top. Otherwise, moves elements back to their original locations. + */ + $.prioritize = function($elements, condition) { + + var key = '__prioritize'; + + // Expand $elements if it's not already a jQuery object. + if (typeof $elements != 'jQuery') + $elements = $($elements); + + // Step through elements. + $elements.each(function() { + + var $e = $(this), $p, + $parent = $e.parent(); + + // No parent? Bail. + if ($parent.length == 0) + return; + + // Not moved? Move it. + if (!$e.data(key)) { + + // Condition is false? Bail. + if (!condition) + return; + + // Get placeholder (which will serve as our point of reference for when this element needs to move back). + $p = $e.prev(); + + // Couldn't find anything? Means this element's already at the top, so bail. + if ($p.length == 0) + return; + + // Move element to top of parent. + $e.prependTo($parent); + + // Mark element as moved. + $e.data(key, $p); + + } + + // Moved already? + else { + + // Condition is true? Bail. + if (condition) + return; + + $p = $e.data(key); + + // Move element back to its original location (using our placeholder). + $e.insertAfter($p); + + // Unmark element as moved. + $e.removeData(key); + + } + + }); + + }; + +})(jQuery); \ No newline at end of file diff --git a/frontend/static/frontend/assets/sass/libs/_breakpoints.scss b/frontend/static/frontend/assets/sass/libs/_breakpoints.scss new file mode 100644 index 0000000..c5301d8 --- /dev/null +++ b/frontend/static/frontend/assets/sass/libs/_breakpoints.scss @@ -0,0 +1,223 @@ +// breakpoints.scss v1.0 | @ajlkn | MIT licensed */ + +// Vars. + + /// Breakpoints. + /// @var {list} + $breakpoints: () !global; + +// Mixins. + + /// Sets breakpoints. + /// @param {map} $x Breakpoints. + @mixin breakpoints($x: ()) { + $breakpoints: $x !global; + } + + /// Wraps @content in a @media block targeting a specific orientation. + /// @param {string} $orientation Orientation. + @mixin orientation($orientation) { + @media screen and (orientation: #{$orientation}) { + @content; + } + } + + /// Wraps @content in a @media block using a given query. + /// @param {string} $query Query. + @mixin breakpoint($query: null) { + + $breakpoint: null; + $op: null; + $media: null; + + // Determine operator, breakpoint. + + // Greater than or equal. + @if (str-slice($query, 0, 2) == '>=') { + + $op: 'gte'; + $breakpoint: str-slice($query, 3); + + } + + // Less than or equal. + @elseif (str-slice($query, 0, 2) == '<=') { + + $op: 'lte'; + $breakpoint: str-slice($query, 3); + + } + + // Greater than. + @elseif (str-slice($query, 0, 1) == '>') { + + $op: 'gt'; + $breakpoint: str-slice($query, 2); + + } + + // Less than. + @elseif (str-slice($query, 0, 1) == '<') { + + $op: 'lt'; + $breakpoint: str-slice($query, 2); + + } + + // Not. + @elseif (str-slice($query, 0, 1) == '!') { + + $op: 'not'; + $breakpoint: str-slice($query, 2); + + } + + // Equal. + @else { + + $op: 'eq'; + $breakpoint: $query; + + } + + // Build media. + @if ($breakpoint and map-has-key($breakpoints, $breakpoint)) { + + $a: map-get($breakpoints, $breakpoint); + + // Range. + @if (type-of($a) == 'list') { + + $x: nth($a, 1); + $y: nth($a, 2); + + // Max only. + @if ($x == null) { + + // Greater than or equal (>= 0 / anything) + @if ($op == 'gte') { + $media: 'screen'; + } + + // Less than or equal (<= y) + @elseif ($op == 'lte') { + $media: 'screen and (max-width: ' + $y + ')'; + } + + // Greater than (> y) + @elseif ($op == 'gt') { + $media: 'screen and (min-width: ' + ($y + 1) + ')'; + } + + // Less than (< 0 / invalid) + @elseif ($op == 'lt') { + $media: 'screen and (max-width: -1px)'; + } + + // Not (> y) + @elseif ($op == 'not') { + $media: 'screen and (min-width: ' + ($y + 1) + ')'; + } + + // Equal (<= y) + @else { + $media: 'screen and (max-width: ' + $y + ')'; + } + + } + + // Min only. + @else if ($y == null) { + + // Greater than or equal (>= x) + @if ($op == 'gte') { + $media: 'screen and (min-width: ' + $x + ')'; + } + + // Less than or equal (<= inf / anything) + @elseif ($op == 'lte') { + $media: 'screen'; + } + + // Greater than (> inf / invalid) + @elseif ($op == 'gt') { + $media: 'screen and (max-width: -1px)'; + } + + // Less than (< x) + @elseif ($op == 'lt') { + $media: 'screen and (max-width: ' + ($x - 1) + ')'; + } + + // Not (< x) + @elseif ($op == 'not') { + $media: 'screen and (max-width: ' + ($x - 1) + ')'; + } + + // Equal (>= x) + @else { + $media: 'screen and (min-width: ' + $x + ')'; + } + + } + + // Min and max. + @else { + + // Greater than or equal (>= x) + @if ($op == 'gte') { + $media: 'screen and (min-width: ' + $x + ')'; + } + + // Less than or equal (<= y) + @elseif ($op == 'lte') { + $media: 'screen and (max-width: ' + $y + ')'; + } + + // Greater than (> y) + @elseif ($op == 'gt') { + $media: 'screen and (min-width: ' + ($y + 1) + ')'; + } + + // Less than (< x) + @elseif ($op == 'lt') { + $media: 'screen and (max-width: ' + ($x - 1) + ')'; + } + + // Not (< x and > y) + @elseif ($op == 'not') { + $media: 'screen and (max-width: ' + ($x - 1) + '), screen and (min-width: ' + ($y + 1) + ')'; + } + + // Equal (>= x and <= y) + @else { + $media: 'screen and (min-width: ' + $x + ') and (max-width: ' + $y + ')'; + } + + } + + } + + // String. + @else { + + // Missing a media type? Prefix with "screen". + @if (str-slice($a, 0, 1) == '(') { + $media: 'screen and ' + $a; + } + + // Otherwise, use as-is. + @else { + $media: $a; + } + + } + + } + + // Output. + @media #{$media} { + @content; + } + + } \ No newline at end of file diff --git a/frontend/static/frontend/assets/sass/libs/_functions.scss b/frontend/static/frontend/assets/sass/libs/_functions.scss new file mode 100644 index 0000000..f563aab --- /dev/null +++ b/frontend/static/frontend/assets/sass/libs/_functions.scss @@ -0,0 +1,90 @@ +/// Removes a specific item from a list. +/// @author Hugo Giraudel +/// @param {list} $list List. +/// @param {integer} $index Index. +/// @return {list} Updated list. +@function remove-nth($list, $index) { + + $result: null; + + @if type-of($index) != number { + @warn "$index: #{quote($index)} is not a number for `remove-nth`."; + } + @else if $index == 0 { + @warn "List index 0 must be a non-zero integer for `remove-nth`."; + } + @else if abs($index) > length($list) { + @warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`."; + } + @else { + + $result: (); + $index: if($index < 0, length($list) + $index + 1, $index); + + @for $i from 1 through length($list) { + + @if $i != $index { + $result: append($result, nth($list, $i)); + } + + } + + } + + @return $result; + +} + +/// Gets a value from a map. +/// @author Hugo Giraudel +/// @param {map} $map Map. +/// @param {string} $keys Key(s). +/// @return {string} Value. +@function val($map, $keys...) { + + @if nth($keys, 1) == null { + $keys: remove-nth($keys, 1); + } + + @each $key in $keys { + $map: map-get($map, $key); + } + + @return $map; + +} + +/// Gets a duration value. +/// @param {string} $keys Key(s). +/// @return {string} Value. +@function _duration($keys...) { + @return val($duration, $keys...); +} + +/// Gets a font value. +/// @param {string} $keys Key(s). +/// @return {string} Value. +@function _font($keys...) { + @return val($font, $keys...); +} + +/// Gets a misc value. +/// @param {string} $keys Key(s). +/// @return {string} Value. +@function _misc($keys...) { + @return val($misc, $keys...); +} + +/// Gets a palette value. +/// @param {string} $keys Key(s). +/// @return {string} Value. +@function _palette($keys...) { + @return val($palette, $keys...); +} + +/// Gets a size value. +/// @param {string} $keys Key(s). +/// @return {string} Value. +@function _size($keys...) { + @return val($size, $keys...); +} \ No newline at end of file diff --git a/frontend/static/frontend/assets/sass/libs/_html-grid.scss b/frontend/static/frontend/assets/sass/libs/_html-grid.scss new file mode 100644 index 0000000..7438a8c --- /dev/null +++ b/frontend/static/frontend/assets/sass/libs/_html-grid.scss @@ -0,0 +1,149 @@ +// html-grid.scss v1.0 | @ajlkn | MIT licensed */ + +// Mixins. + + /// Initializes the current element as an HTML grid. + /// @param {mixed} $gutters Gutters (either a single number to set both column/row gutters, or a list to set them individually). + /// @param {mixed} $suffix Column class suffix (optional; either a single suffix or a list). + @mixin html-grid($gutters: 1.5em, $suffix: '') { + + // Initialize. + $cols: 12; + $multipliers: 0, 0.25, 0.5, 1, 1.50, 2.00; + $unit: 100% / $cols; + + // Suffixes. + $suffixes: null; + + @if (type-of($suffix) == 'list') { + $suffixes: $suffix; + } + @else { + $suffixes: ($suffix); + } + + // Gutters. + $guttersCols: null; + $guttersRows: null; + + @if (type-of($gutters) == 'list') { + + $guttersCols: nth($gutters, 1); + $guttersRows: nth($gutters, 2); + + } + @else { + + $guttersCols: $gutters; + $guttersRows: 0; + + } + + // Row. + display: flex; + flex-wrap: wrap; + box-sizing: border-box; + align-items: stretch; + + // Columns. + > * { + box-sizing: border-box; + } + + // Gutters. + &.gtr-uniform { + > * { + > :last-child { + margin-bottom: 0; + } + } + } + + // Alignment. + &.aln-left { + justify-content: flex-start; + } + + &.aln-center { + justify-content: center; + } + + &.aln-right { + justify-content: flex-end; + } + + &.aln-top { + align-items: flex-start; + } + + &.aln-middle { + align-items: center; + } + + &.aln-bottom { + align-items: flex-end; + } + + // Step through suffixes. + @each $suffix in $suffixes { + + // Suffix. + @if ($suffix != '') { + $suffix: '-' + $suffix; + } + @else { + $suffix: ''; + } + + // Row. + + // Important. + > .imp#{$suffix} { + order: -1; + } + + // Columns, offsets. + @for $i from 1 through $cols { + > .col-#{$i}#{$suffix} { + width: $unit * $i; + } + + > .off-#{$i}#{$suffix} { + margin-left: $unit * $i; + } + } + + // Step through multipliers. + @each $multiplier in $multipliers { + + // Gutters. + $class: null; + + @if ($multiplier != 1) { + $class: '.gtr-' + ($multiplier * 100); + } + + &#{$class} { + margin-top: ($guttersRows * $multiplier * -1); + margin-left: ($guttersCols * $multiplier * -1); + + > * { + padding: ($guttersRows * $multiplier) 0 0 ($guttersCols * $multiplier); + } + + // Uniform. + &.gtr-uniform { + margin-top: $guttersCols * $multiplier * -1; + + > * { + padding-top: $guttersCols * $multiplier; + } + } + + } + + } + + } + + } \ No newline at end of file diff --git a/frontend/static/frontend/assets/sass/libs/_mixins.scss b/frontend/static/frontend/assets/sass/libs/_mixins.scss new file mode 100644 index 0000000..a331483 --- /dev/null +++ b/frontend/static/frontend/assets/sass/libs/_mixins.scss @@ -0,0 +1,78 @@ +/// Makes an element's :before pseudoelement a FontAwesome icon. +/// @param {string} $content Optional content value to use. +/// @param {string} $category Optional category to use. +/// @param {string} $where Optional pseudoelement to target (before or after). +@mixin icon($content: false, $category: regular, $where: before) { + + text-decoration: none; + + &:#{$where} { + + @if $content { + content: $content; + } + + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + text-transform: none !important; + + @if ($category == brands) { + font-family: 'Font Awesome 5 Brands'; + } + @elseif ($category == solid) { + font-family: 'Font Awesome 5 Free'; + font-weight: 900; + } + @else { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; + } + + } + +} + +/// Applies padding to an element, taking the current element-margin value into account. +/// @param {mixed} $tb Top/bottom padding. +/// @param {mixed} $lr Left/right padding. +/// @param {list} $pad Optional extra padding (in the following order top, right, bottom, left) +/// @param {bool} $important If true, adds !important. +@mixin padding($tb, $lr, $pad: (0,0,0,0), $important: null) { + + @if $important { + $important: '!important'; + } + + $x: 0.1em; + + @if unit(_size(element-margin)) == 'rem' { + $x: 0.1rem; + } + + padding: ($tb + nth($pad,1)) ($lr + nth($pad,2)) max($x, $tb - _size(element-margin) + nth($pad,3)) ($lr + nth($pad,4)) #{$important}; + +} + +/// Encodes a SVG data URL so IE doesn't choke (via codepen.io/jakob-e/pen/YXXBrp). +/// @param {string} $svg SVG data URL. +/// @return {string} Encoded SVG data URL. +@function svg-url($svg) { + + $svg: str-replace($svg, '"', '\''); + $svg: str-replace($svg, '%', '%25'); + $svg: str-replace($svg, '<', '%3C'); + $svg: str-replace($svg, '>', '%3E'); + $svg: str-replace($svg, '&', '%26'); + $svg: str-replace($svg, '#', '%23'); + $svg: str-replace($svg, '{', '%7B'); + $svg: str-replace($svg, '}', '%7D'); + $svg: str-replace($svg, ';', '%3B'); + + @return url("data:image/svg+xml;charset=utf8,#{$svg}"); + +} \ No newline at end of file diff --git a/frontend/static/frontend/assets/sass/libs/_vars.scss b/frontend/static/frontend/assets/sass/libs/_vars.scss new file mode 100644 index 0000000..af19c7b --- /dev/null +++ b/frontend/static/frontend/assets/sass/libs/_vars.scss @@ -0,0 +1,95 @@ +// Misc. + $misc: ( + z-index-base: 10000 + ); + +// Duration. + $duration: ( + navPanel: 0.5s + ); + +// Size. + $size: ( + navPanel: 275px + ); + +// Font. + $font: ( + ); + +// Palette. + $palette: ( + bg: #f3f6fa, + fg: #7c8081, + border: transparentize(#7c8081, 0.8), + + header: ( + bg: #fff, + fg: inherit, + alt-bg: transparent, + alt-fg: #fff + ), + + banner: ( + bg: #898786, + fg: #fff, + inner-bg: #341b2b, + inner-fg: #fff + ), + + footer: ( + bg: #E8EEF4, + fg: #7c8081 + ), + + one: ( + bg: #ee856f, + fg: #fff + ), + + two: ( + bg: #fff, + fg: inherit + ), + + three: ( + bg: #645862, + fg: #fff + ), + + navPanel: ( + bg: #1c2021, + fg: #fff + ), + + navButton: ( + bg: rgba(163,169,170,0.75), + fg: #fff + ), + + twitter: ( + bg: #70aecd, + fg: #fff + ), + + facebook: ( + bg: #7490c3, + fg: #fff + ), + + google-plus: ( + bg: #db6b67, + fg: #fff + ), + + github: ( + bg: #dcad8b, + fg: #fff + ), + + dribbble: ( + bg: #da83ae, + fg: #fff + ) + + ); \ No newline at end of file diff --git a/frontend/static/frontend/assets/sass/libs/_vendor.scss b/frontend/static/frontend/assets/sass/libs/_vendor.scss new file mode 100644 index 0000000..6599a3f --- /dev/null +++ b/frontend/static/frontend/assets/sass/libs/_vendor.scss @@ -0,0 +1,376 @@ +// vendor.scss v1.0 | @ajlkn | MIT licensed */ + +// Vars. + + /// Vendor prefixes. + /// @var {list} + $vendor-prefixes: ( + '-moz-', + '-webkit-', + '-ms-', + '' + ); + + /// Properties that should be vendorized. + /// Data via caniuse.com, github.com/postcss/autoprefixer, and developer.mozilla.org + /// @var {list} + $vendor-properties: ( + + // Animation. + 'animation', + 'animation-delay', + 'animation-direction', + 'animation-duration', + 'animation-fill-mode', + 'animation-iteration-count', + 'animation-name', + 'animation-play-state', + 'animation-timing-function', + + // Appearance. + 'appearance', + + // Backdrop filter. + 'backdrop-filter', + + // Background image options. + 'background-clip', + 'background-origin', + 'background-size', + + // Box sizing. + 'box-sizing', + + // Clip path. + 'clip-path', + + // Filter effects. + 'filter', + + // Flexbox. + 'align-content', + 'align-items', + 'align-self', + 'flex', + 'flex-basis', + 'flex-direction', + 'flex-flow', + 'flex-grow', + 'flex-shrink', + 'flex-wrap', + 'justify-content', + 'order', + + // Font feature. + 'font-feature-settings', + 'font-language-override', + 'font-variant-ligatures', + + // Font kerning. + 'font-kerning', + + // Fragmented borders and backgrounds. + 'box-decoration-break', + + // Grid layout. + 'grid-column', + 'grid-column-align', + 'grid-column-end', + 'grid-column-start', + 'grid-row', + 'grid-row-align', + 'grid-row-end', + 'grid-row-start', + 'grid-template-columns', + 'grid-template-rows', + + // Hyphens. + 'hyphens', + 'word-break', + + // Masks. + 'mask', + 'mask-border', + 'mask-border-outset', + 'mask-border-repeat', + 'mask-border-slice', + 'mask-border-source', + 'mask-border-width', + 'mask-clip', + 'mask-composite', + 'mask-image', + 'mask-origin', + 'mask-position', + 'mask-repeat', + 'mask-size', + + // Multicolumn. + 'break-after', + 'break-before', + 'break-inside', + 'column-count', + 'column-fill', + 'column-gap', + 'column-rule', + 'column-rule-color', + 'column-rule-style', + 'column-rule-width', + 'column-span', + 'column-width', + 'columns', + + // Object fit. + 'object-fit', + 'object-position', + + // Regions. + 'flow-from', + 'flow-into', + 'region-fragment', + + // Scroll snap points. + 'scroll-snap-coordinate', + 'scroll-snap-destination', + 'scroll-snap-points-x', + 'scroll-snap-points-y', + 'scroll-snap-type', + + // Shapes. + 'shape-image-threshold', + 'shape-margin', + 'shape-outside', + + // Tab size. + 'tab-size', + + // Text align last. + 'text-align-last', + + // Text decoration. + 'text-decoration-color', + 'text-decoration-line', + 'text-decoration-skip', + 'text-decoration-style', + + // Text emphasis. + 'text-emphasis', + 'text-emphasis-color', + 'text-emphasis-position', + 'text-emphasis-style', + + // Text size adjust. + 'text-size-adjust', + + // Text spacing. + 'text-spacing', + + // Transform. + 'transform', + 'transform-origin', + + // Transform 3D. + 'backface-visibility', + 'perspective', + 'perspective-origin', + 'transform-style', + + // Transition. + 'transition', + 'transition-delay', + 'transition-duration', + 'transition-property', + 'transition-timing-function', + + // Unicode bidi. + 'unicode-bidi', + + // User select. + 'user-select', + + // Writing mode. + 'writing-mode', + + ); + + /// Values that should be vendorized. + /// Data via caniuse.com, github.com/postcss/autoprefixer, and developer.mozilla.org + /// @var {list} + $vendor-values: ( + + // Cross fade. + 'cross-fade', + + // Element function. + 'element', + + // Filter function. + 'filter', + + // Flexbox. + 'flex', + 'inline-flex', + + // Grab cursors. + 'grab', + 'grabbing', + + // Gradients. + 'linear-gradient', + 'repeating-linear-gradient', + 'radial-gradient', + 'repeating-radial-gradient', + + // Grid layout. + 'grid', + 'inline-grid', + + // Image set. + 'image-set', + + // Intrinsic width. + 'max-content', + 'min-content', + 'fit-content', + 'fill', + 'fill-available', + 'stretch', + + // Sticky position. + 'sticky', + + // Transform. + 'transform', + + // Zoom cursors. + 'zoom-in', + 'zoom-out', + + ); + +// Functions. + + /// Removes a specific item from a list. + /// @author Hugo Giraudel + /// @param {list} $list List. + /// @param {integer} $index Index. + /// @return {list} Updated list. + @function remove-nth($list, $index) { + + $result: null; + + @if type-of($index) != number { + @warn "$index: #{quote($index)} is not a number for `remove-nth`."; + } + @else if $index == 0 { + @warn "List index 0 must be a non-zero integer for `remove-nth`."; + } + @else if abs($index) > length($list) { + @warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`."; + } + @else { + + $result: (); + $index: if($index < 0, length($list) + $index + 1, $index); + + @for $i from 1 through length($list) { + + @if $i != $index { + $result: append($result, nth($list, $i)); + } + + } + + } + + @return $result; + + } + + /// Replaces a substring within another string. + /// @author Hugo Giraudel + /// @param {string} $string String. + /// @param {string} $search Substring. + /// @param {string} $replace Replacement. + /// @return {string} Updated string. + @function str-replace($string, $search, $replace: '') { + + $index: str-index($string, $search); + + @if $index { + @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace); + } + + @return $string; + + } + + /// Replaces a substring within each string in a list. + /// @param {list} $strings List of strings. + /// @param {string} $search Substring. + /// @param {string} $replace Replacement. + /// @return {list} Updated list of strings. + @function str-replace-all($strings, $search, $replace: '') { + + @each $string in $strings { + $strings: set-nth($strings, index($strings, $string), str-replace($string, $search, $replace)); + } + + @return $strings; + + } + +// Mixins. + + /// Wraps @content in vendorized keyframe blocks. + /// @param {string} $name Name. + @mixin keyframes($name) { + + @-moz-keyframes #{$name} { @content; } + @-webkit-keyframes #{$name} { @content; } + @-ms-keyframes #{$name} { @content; } + @keyframes #{$name} { @content; } + + } + + /// Vendorizes a declaration's property and/or value(s). + /// @param {string} $property Property. + /// @param {mixed} $value String/list of value(s). + @mixin vendor($property, $value) { + + // Determine if property should expand. + $expandProperty: index($vendor-properties, $property); + + // Determine if value should expand (and if so, add '-prefix-' placeholder). + $expandValue: false; + + @each $x in $value { + @each $y in $vendor-values { + @if $y == str-slice($x, 1, str-length($y)) { + + $value: set-nth($value, index($value, $x), '-prefix-' + $x); + $expandValue: true; + + } + } + } + + // Expand property? + @if $expandProperty { + @each $vendor in $vendor-prefixes { + #{$vendor}#{$property}: #{str-replace-all($value, '-prefix-', $vendor)}; + } + } + + // Expand just the value? + @elseif $expandValue { + @each $vendor in $vendor-prefixes { + #{$property}: #{str-replace-all($value, '-prefix-', $vendor)}; + } + } + + // Neither? Treat them as a normal declaration. + @else { + #{$property}: #{$value}; + } + + } \ No newline at end of file diff --git a/frontend/static/frontend/assets/sass/main.scss b/frontend/static/frontend/assets/sass/main.scss new file mode 100644 index 0000000..d78d0f1 --- /dev/null +++ b/frontend/static/frontend/assets/sass/main.scss @@ -0,0 +1,1771 @@ +@import 'libs/vars'; +@import 'libs/functions'; +@import 'libs/mixins'; +@import 'libs/vendor'; +@import 'libs/breakpoints'; +@import 'libs/html-grid'; +@import url("fontawesome-all.min.css"); +@import url("https://fonts.googleapis.com/css?family=Lato:300,400,900"); + +/* + Twenty by Pixelarity + pixelarity.com | hello@pixelarity.com + License: pixelarity.com/license +*/ + +$pattern-background-size: 25em; + +// Breakpoints. + + @include breakpoints(( + wide: ( 1281px, 1680px ), + normal: ( 981px, 1280px ), + narrow: ( 841px, 980px ), + narrower: ( 737px, 840px ), + mobile: ( null, 736px ) + )); + +// Reset. +// Based on meyerweb.com/eric/tools/css/reset (v2.0 | 20110126 | License: public domain) + + html, body, div, span, applet, object, + iframe, h1, h2, h3, h4, h5, h6, p, blockquote, + pre, a, abbr, acronym, address, big, cite, + code, del, dfn, em, img, ins, kbd, q, s, samp, + small, strike, strong, sub, sup, tt, var, b, + u, i, center, dl, dt, dd, ol, ul, li, fieldset, + form, label, legend, table, caption, tbody, + tfoot, thead, tr, th, td, article, aside, + canvas, details, embed, figure, figcaption, + footer, header, hgroup, menu, nav, output, ruby, + section, summary, time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; + } + + article, aside, details, figcaption, figure, + footer, header, hgroup, menu, nav, section { + display: block; + } + + body { + line-height: 1; + } + + ol, ul { + list-style:none; + } + + blockquote, q { + quotes: none; + + &:before, + &:after { + content: ''; + content: none; + } + } + + table { + border-collapse: collapse; + border-spacing: 0; + } + + body { + -webkit-text-size-adjust: none; + } + + mark { + background-color: transparent; + color: inherit; + } + + input::-moz-focus-inner { + border: 0; + padding: 0; + } + + input, select, textarea { + -moz-appearance: none; + -webkit-appearance: none; + -ms-appearance: none; + appearance: none; + } + +/* Basic */ + + // Set box model to border-box. + // Based on css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice + html { + box-sizing: border-box; + } + + *, *:before, *:after { + box-sizing: inherit; + } + + body { + background: _palette(bg); + + // Stops initial animations until page loads. + &.is-preload { + *, *:before, *:after { + @include vendor('animation', 'none !important'); + @include vendor('transition', 'none !important'); + } + } + + } + + body, input, select, textarea { + color: _palette(fg); + font-family: 'Lato', sans-serif; + font-size: 15pt; + font-weight: 300; + letter-spacing: 0.025em; + line-height: 1.75em; + } + + a { + @include vendor('transition', ('color 0.2s ease-in-out', 'border-color 0.2s ease-in-out', 'background-color 0.2s ease-in-out')); + color: darken(_palette(one, bg), 20); + text-decoration: none; + border-bottom: dotted 1px; + + &:hover { + border-bottom-color: transparent; + } + } + + strong, b { + font-weight: 400; + } + + p, ul, ol, dl, table, blockquote { + margin: 0 0 2em 0; + } + + h1, h2, h3, h4, h5, h6 { + color: inherit; + font-weight: 300; + line-height: 1.75em; + margin-bottom: 1em; + text-transform: uppercase; + + a { + color: inherit; + text-decoration: none; + border: 0; + } + } + + h2 { + font-size: 1.5em; + letter-spacing: 0.1em; + } + + h3 { + font-size: 1.15em; + letter-spacing: 0.025em; + } + + sub { + font-size: 0.8em; + position: relative; + top: 0.5em; + } + + sup { + font-size: 0.8em; + position: relative; + top: -0.5em; + } + + hr { + border-top: solid 1px _palette(border); + border: 0; + margin-bottom: 1.5em; + } + + blockquote { + border-left: solid 0.5em _palette(border); + font-style: italic; + padding: 1em 0 1em 2em; + } + +/* Container */ + + .container { + margin: 0 auto; + max-width: 100%; + width: 1400px; + + &.medium { + width: (1400px * 0.75); + } + + @include breakpoint('<=wide') { + width: 1200px; + + &.medium { + width: (1200px * 0.75); + } + } + + @include breakpoint('<=normal') { + width: 960px; + + &.medium { + width: (980px * 0.75); + } + } + + @include breakpoint('<=narrow') { + width: 95%; + + &.medium { + width: (95% * 0.75); + } + } + + @include breakpoint('<=narrower') { + width: 95%; + + &.medium { + width: 95%; + } + } + + @include breakpoint('<=mobile') { + width: 100%; + + &.medium { + width: 100%; + } + } + } + +/* Row */ + + .row { + @include html-grid((50px, 50px)); + + @include breakpoint('<=wide') { + @include html-grid((40px, 40px), 'wide'); + } + + @include breakpoint('<=normal') { + @include html-grid((40px, 40px), 'normal'); + } + + @include breakpoint('<=narrow') { + @include html-grid((30px, 30px), 'narrow'); + } + + @include breakpoint('<=narrower') { + @include html-grid((30px, 30px), 'narrower'); + } + + @include breakpoint('<=mobile') { + @include html-grid((30px, 30px), 'mobile'); + } + } + +/* Section/Article */ + + section, article { + &.special { + text-align: center; + } + } + + header { + &.major { + padding-bottom: 2em; + } + + &.special { + margin-bottom: 5em; + padding-top: 7em; + position: relative; + text-align: center; + + &:before, + &:after { + border-bottom: solid 1.5px; + border-top: solid 1.5px; + content: ''; + height: 7px; + opacity: 0.1; + position: absolute; + top: 1.75em; + width: 43%; + } + + &:before { + left: 0; + } + + &:after { + right: 0; + } + + h2 { + margin-bottom: 0; + } + + h2 + p { + margin-bottom: 0; + padding-top: 1.5em; + } + + .icon { + cursor: default; + height: 7em; + left: 0; + position: absolute; + text-align: center; + top: 1em; + width: 100%; + + &:before { + font-size: 3.5em; + opacity: 0.35; + } + } + } + } + + footer { + > :last-child { + margin-bottom: 0; + } + + &.major { + padding-top: 3em; + } + } + +/* Form */ + + input[type="text"], + input[type="password"], + input[type="email"], + textarea { + @include vendor('transition', ('background-color 0.2s ease-in-out', 'border-color 0.2s ease-in-out')); + @include vendor('appearance', 'none'); + background: none; + border: solid 1px _palette(border); + border-radius: 0; + color: inherit; + display: block; + padding: 0.75em; + text-decoration: none; + width: 100%; + outline: 0; + + &:focus { + border-color: _palette(one, bg); + } + } + + input[type="text"], + input[type="password"], + input[type="email"] { + line-height: 1em; + } + + ::-webkit-input-placeholder { + color: inherit; + opacity: 0.5; + position: relative; + top: 3px; + } + + :-moz-placeholder { + color: inherit; + opacity: 0.5; + } + + ::-moz-placeholder { + color: inherit; + opacity: 0.5; + } + + :-ms-input-placeholder { + color: inherit; + opacity: 0.5; + } + +/* Image */ + + .image { + border: 0; + position: relative; + + &:before { + background: url('images/overlay.png'); + content: ''; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; + } + + &.fit { + display: block; + + img { + display: block; + width: 100%; + } + } + + &.featured { + display: block; + margin: 0 0 2em 0; + + img { + display: block; + width: 100%; + } + } + } + +/* Icon */ + + .icon { + @include icon; + position: relative; + + &.solid { + &:before { + font-weight: 900; + } + } + + &:before { + line-height: inherit; + } + + &.brands { + &:before { + font-family: 'Font Awesome 5 Brands'; + } + } + + &.circle { + @include vendor('transition', 'all 0.2s ease-in-out'); + border: 0; + border-radius: 100%; + display: inline-block; + font-size: 1.25em; + height: 2.25em; + left: 0; + line-height: 2.25em; + text-align: center; + text-decoration: none; + top: 0; + width: 2.25em; + + &:hover { + top: -0.2em; + } + + &.fa-twitter { + background: _palette(twitter, bg); + color: _palette(twitter, fg); + + &:hover { + background: lighten(_palette(twitter, bg), 4); + } + } + + &.fa-facebook-f { + background: _palette(facebook, bg); + color: _palette(facebook, fg); + + &:hover { + background: lighten(_palette(facebook, bg), 4); + } + } + + &.fa-google-plus-g { + background: _palette(google-plus, bg); + color: _palette(google-plus, fg); + + &:hover { + background: lighten(_palette(google-plus, bg), 4); + } + } + + &.fa-github { + background: _palette(github, bg); + color: _palette(github, fg); + + &:hover { + background: lighten(_palette(github, bg), 4); + } + } + + &.fa-dribbble { + background: _palette(dribbble, bg); + color: _palette(dribbble, fg); + + &:hover { + background: lighten(_palette(dribbble, bg), 4); + } + } + } + + &.featured { + cursor: default; + display: block; + margin: 0 0 1.5em 0; + opacity: 0.35; + text-align: center; + + &:before { + font-size: 5em; + line-height: 1em; + } + } + + > .label { + display: none; + } + } + +/* List */ + + ol { + list-style: decimal; + padding-left: 1.25em; + + li { + padding-left: 0.25em; + } + } + + ul { + list-style: disc; + padding-left: 1em; + + li { + padding-left: 0.5em; + } + } + +/* Icons */ + + ul.icons { + list-style: none; + padding-left: 0; + cursor: default; + + li { + display: inline-block; + line-height: 1em; + padding-left: 0.5em; + + &:first-child { + padding-left: 0; + } + } + } + +/* Featured Icons */ + + ul.featured-icons { + cursor: default; + margin: -0.75em 0 0 0; + opacity: 0.35; + overflow: hidden; + position: relative; + list-style: none; + padding-left: 0; + + li { + display: block; + float: left; + text-align: center; + width: 50%; + padding-left: 0; + margin-bottom: 1em; + + .icon { + display: inline-block; + font-size: 5.5em; + height: 1em; + line-height: 1.5em; + width: 1em; + } + } + } + +/* Buttons */ + + ul.buttons { + cursor: default; + list-style: none; + padding-left: 0; + + &:last-child { + margin-bottom: 0; + } + + li { + display: inline-block; + padding: 0 0 0 1.5em; + + &:first-child { + padding: 0; + } + } + + &.stacked { + li { + display: block; + padding: 1.5em 0 0 0; + + &:first-child { + padding: 0; + } + } + } + } + +/* Table */ + + table { + width: 100%; + + &.default { + width: 100%; + + tbody { + tr { + border-bottom: solid 1px _palette(border); + } + } + + td { + padding: 0.5em 1em 0.5em 1em; + } + + th { + font-weight: 400; + padding: 0.5em 1em 0.5em 1em; + text-align: left; + } + + thead { + background: _palette(fg); + color: #fff; + } + + tfoot { + } + + tbody { + } + } + } + +/* Button */ + + input[type="button"], + input[type="submit"], + input[type="reset"], + button, + .button { + @include vendor('appearance', 'none'); + @include vendor('transition', ('color 0.2s ease-in-out', 'border-color 0.2s ease-in-out', 'background-color 0.2s ease-in-out')); + background: none; + border: solid 1px; + border-radius: 0; + color: inherit; + cursor: pointer; + display: inline-block; + font-size: 0.8em; + font-weight: 900; + letter-spacing: 2px; + min-width: 18em; + padding: 0 0.75em; + line-height: 3.75em; + text-align: center; + text-decoration: none; + text-transform: uppercase; + + &:hover { + background: rgba(188,202,206,0.15); + border-color: inherit; + } + + &.primary { + background: _palette(one, bg); + border-color: _palette(one, bg); + color: _palette(one, fg) !important; + + &:hover { + background: lighten(_palette(one, bg), 5) !important; + border-color: lighten(_palette(one, bg), 5) !important; + } + } + + &.fit { + width: 100%; + } + + &.small { + font-size: 0.7em; + min-width: 14em; + padding: 0.5em 0; + } + } + +/* Wrapper */ + + .wrapper { + margin-bottom: 5em; + padding: 5em; + + &.style1 { + padding: 0; + } + + &.style2 { + background-color: _palette(one, bg); + background-image: url('images/light-bl.svg'), url('images/light-br.svg'); + background-position: bottom left, bottom right; + background-repeat: no-repeat, no-repeat; + background-size: $pattern-background-size, $pattern-background-size; + color: _palette(one, fg); + + input[type="button"], + input[type="submit"], + input[type="reset"], + button, + .button { + &:hover { + background: rgba(255,255,255,0.15) !important; + } + + &.primary { + background: _palette(one, fg); + border-color: _palette(one, fg); + color: _palette(one, bg) !important; + + &:hover { + border-color: inherit !important; + color: _palette(one, fg) !important; + } + } + } + } + + &.style3 { + background: _palette(two, bg); + color: _palette(two, fg); + } + + &.style4 { + background: _palette(two, bg); + color: _palette(two, fg); + padding: 4em; + } + } + +/* Header */ + + @include keyframes('reveal-header') { + 0% { top: -5em; } + 100% { top: 0; } + } + + #header { + background: _palette(header, bg); + box-shadow: 0 1px 2px 0 rgba(0,0,0,0.075); + color: _palette(header, fg); + cursor: default; + font-size: 0.8em; + left: 0; + padding: 1em 1.5em; + position: fixed; + top: 0; + width: 100%; + z-index: 10000; + + h1 { + font-weight: 900; + margin: 0; + + span { + font-weight: 300; + } + } + + nav { + letter-spacing: 0.075em; + position: absolute; + right: 1.5em; + text-transform: uppercase; + top: 0.75em; + + ul { + list-style: none; + padding-left: 0; + + li { + display: inline-block; + margin-left: 1.5em; + padding-left: 0; + + > ul { + display: none; + } + + a { + border: solid 1px transparent; + color: inherit; + display: inline-block; + line-height: 1em; + padding: 0.6em 0.75em; + text-decoration: none; + } + + input[type="button"], + input[type="submit"], + input[type="reset"], + button, + .button { + font-size: 1em; + min-width: 0; + width: auto; + } + + &.submenu { + > a { + @include icon(false, solid); + + &:before { + content: '\f107'; + margin-right: 0.65em; + } + } + } + + &.active, + &:hover { + > a { + @include vendor('transition', 'all 0.2s ease-in-out'); + background: rgba(188,202,206,0.15); + } + } + + &.current { + > a { + font-weight: 900; + } + } + } + } + } + + &.reveal { + @include vendor('animation', 'reveal-header 0.5s'); + } + + &.alt { + @include vendor('animation', 'none'); + background: _palette(header, alt-bg); + box-shadow: none; + color: _palette(header, alt-fg); + padding: 2em 2.5em; + position: absolute; + + nav { + right: 2.5em; + top: 1.75em; + + ul { + li { + &.active, + &:hover { + > a { + border: solid 1px; + } + } + } + } + } + } + } + +/* Dropotron */ + + .dropotron { + list-style: none; + padding-left: 0; + background: #fff; + box-shadow: 0 1px 2px 0 rgba(0,0,0,0.075); + line-height: 2.25em; + min-width: 13em; + padding: 1em 0; + text-transform: uppercase; + margin-top: calc(-1em + 1px); + + &.level-0 { + font-size: 0.7em; + font-weight: 400; + margin-top: 1.5em; + + &:before { + border-bottom: solid 0.5em #fff; + border-left: solid 0.5em transparent; + border-right: solid 0.5em transparent; + content: ''; + left: 0.75em; + position: absolute; + top: -0.45em; + } + } + + > li { + border-top: solid 1px _palette(border); + padding-left: 0; + + > a { + @include vendor('transition', 'none'); + color: inherit; + text-decoration: none; + padding: 0 1em; + border: 0; + } + + &:hover { + > a { + background: _palette(one, bg); + color: _palette(one, fg); + } + } + + &:first-child { + border-top: 0; + } + } + } + +/* Banner */ + + @include keyframes('reveal-banner') { + 0% { opacity: 0; } + 100% { opacity: 1; } + } + + #banner { + background-attachment: scroll, scroll, scroll, fixed; + background-color: _palette(three, bg); + background-image: url('images/light-bl.svg'), url('images/light-br.svg'), url('images/overlay.png'), url('../../images/banner.jpg'); + background-position: bottom left, bottom right, top left, top center; + background-repeat: no-repeat, no-repeat, repeat, no-repeat; + background-size: $pattern-background-size, $pattern-background-size, auto, cover; + color: _palette(banner, fg); + cursor: default; + padding: 6em 0; + text-align: center; + + .inner { + @include vendor('animation', 'reveal-banner 1s 0.25s ease-in-out'); + @include vendor('animation-fill-mode', 'forwards'); + background: transparentize(_palette(banner, inner-bg), 0.5); + color: _palette(banner, inner-fg); + display: inline-block; + opacity: 0; + padding: 3em; + text-align: center; + + header { + display: inline-block; + border-bottom: solid 2px; + border-top: solid 2px; + margin: 0 0 2em 0; + padding: 3px 0 3px 0; + + h2 { + border-bottom: solid 2px; + border-top: solid 2px; + font-size: 2.5em; + font-weight: 900; + letter-spacing: 0.2em; + margin: 0; + padding-left: 0.05em; + position: relative; + text-transform: uppercase; + } + } + + p { + letter-spacing: 0.1em; + margin: 0; + text-transform: uppercase; + + a { + color: inherit; + font-weight: 400; + text-decoration: none; + } + } + + footer { + margin: 2em 0 0 0; + } + } + } + +/* Main */ + + #main { + background-image: url('images/dark-tl.svg'), url('images/dark-tr.svg'), url('images/dark-bl.svg'), url('images/dark-br.svg'); + background-position: top left, top right, bottom left, bottom right; + background-repeat: no-repeat; + background-size: $pattern-background-size; + padding: 7em 0; + + > :last-child { + margin-bottom: 0; + } + + .sidebar { + section { + border-top: solid 1px _palette(border); + margin: 3em 0 0 0; + padding: 3em 0 0 0; + + &:first-child { + border-top: 0; + padding-top: 0; + margin-top: 0; + } + } + } + } + + body.index #main { + padding-top: 5em; + } + +/* CTA */ + + #cta { + background-attachment: scroll, scroll, scroll, fixed; + background-color: _palette(three, bg); + background-image: url('images/light-tl.svg'), url('images/light-tr.svg'), url('images/overlay.png'), url('../../images/banner.jpg'); + background-position: top left, top right, top left, bottom center; + background-repeat: no-repeat, no-repeat, repeat, no-repeat; + background-size: $pattern-background-size, $pattern-background-size, auto, cover; + color: _palette(three, fg); + padding: 5em; + text-align: center; + + header { + margin-bottom: 2em; + } + } + +/* Footer */ + + #footer { + background: _palette(footer, bg); + color: _palette(footer, fg); + padding: 5em 5em 10em 5em; + text-align: center; + + .copyright { + font-size: 0.8em; + line-height: 1em; + + a { + color: inherit; + } + + li { + display: inline-block; + margin-left: 1em; + padding-left: 1em; + border-left: dotted 1px; + + &:first-child { + margin: 0; + padding: 0; + border: 0; + } + } + } + } + +/* Wide */ + + @include breakpoint('<=wide') { + + /* Basic */ + + body, input, select, textarea { + font-size: 14pt; + } + + /* Section/Article */ + + header { + &.special { + padding-top: 5.5em; + margin-bottom: 4em; + } + } + + } + +/* Normal */ + + @include breakpoint('<=normal') { + + /* Basic */ + + body, input, select, textarea { + font-size: 13pt; + letter-spacing: 0.025em; + line-height: 1.65em; + } + + h1, h2, h3, h4, h5, h6 { + line-height: 1.5em; + } + + /* Section/Article */ + + header { + &.major { + padding-bottom: 1.5em; + } + } + + footer { + &.major { + padding-top: 2em; + } + } + + /* Wrapper */ + + .wrapper { + margin-bottom: 4em; + padding: 4em 3em; + + &.style4 { + padding: 3em; + } + } + + /* Header */ + + #header { + nav { + ul { + li { + margin-left: 1em; + } + } + } + } + + /* Banner */ + + #banner { + background-attachment: scroll; + } + + /* CTA */ + + #cta { + padding: 4em; + background-attachment: scroll; + } + + /* Footer */ + + #footer { + padding: 4em; + } + + } + +/* Narrow */ + + @include breakpoint('<=narrow') { + + $pattern-background-size: 15em; + + /* Basic */ + + body, input, select, textarea { + font-size: 13pt; + letter-spacing: 0.025em; + line-height: 1.5em; + } + + /* Section/Article */ + + header { + br { + display: none; + } + + &.major { + padding-bottom: 1em; + } + + &.special { + padding-left: 2.5em; + padding-right: 2.5em; + } + } + + footer { + &.major { + padding-top: 1.5em; + } + } + + /* Wrapper */ + + .wrapper { + margin-bottom: 3em; + padding: 3em 2.5em; + + &.special { + br { + display: none; + } + } + + &.style1 { + padding: 0 2.5em; + } + + &.style2 { + background-size: $pattern-background-size; + } + + &.style4 { + padding: 2.5em; + } + } + + /* Banner */ + + #banner { + background-size: $pattern-background-size, $pattern-background-size, auto, cover; + } + + /* Main */ + + #main { + background-size: $pattern-background-size; + } + + /* CTA */ + + #cta { + background-size: $pattern-background-size, $pattern-background-size, auto, cover; + padding: 3em; + } + + } + +/* Narrower */ + + #navPanel, #navButton { + display: none; + } + + @include breakpoint('<=narrower') { + + /* Basic */ + + html, body { + overflow-x: hidden; + } + + header { + &.major { + padding-bottom: 0.25em; + } + + &.special { + margin-bottom: 4em; + padding-top: 5em; + + &:before, + &:after { + width: 40%; + } + + h2 + p { + padding-top: 1.25em; + } + } + } + + /* Section/Article */ + + section { + margin: 1em 0 1em 0; + + &:first-child { + margin-top: 0; + } + } + + /* Button */ + + input[type="button"], + input[type="submit"], + input[type="reset"], + button, + .button { + &.small { + font-size: 0.8em; + min-width: 18em; + padding: 0.75em 0; + } + } + + /* Featured Icons */ + + ul.featured-icons { + margin: 0; + + li { + display: inline-block; + float: none; + width: auto; + + .icon { + font-size: 4em; + width: 1.25em; + } + } + } + + /* Buttons */ + + ul.buttons { + li { + display: block; + padding: 1em 0 0 0; + } + } + + /* Header */ + + #header { + display: none; + } + + /* Banner */ + + #banner { + margin: 0; + } + + /* Wrapper */ + + .wrapper { + &.special-alt { + text-align: center; + } + + &.style4 { + padding-bottom: 3em; + } + } + + /* Main */ + + #main { + padding: 5em 0; + + .sidebar { + border-top: solid 1px transparentize(_palette(fg), 0.9); + padding-top: 3em; + + section { + border-top: 0; + padding-top: 0; + } + } + } + + body.index #main { + padding-top: 4.5em; + } + + /* CTA */ + + #cta { + margin: 0; + } + + /* Footer */ + + #footer { + padding: 4em 1.5em; + } + + /* Nav */ + + #page-wrapper { + @include vendor('backface-visibility', 'hidden'); + @include vendor('transition', 'transform #{_duration(navPanel)} ease'); + padding-bottom: 1px; + } + + #navButton { + @include vendor('backface-visibility', 'hidden'); + @include vendor('transition', 'transform #{_duration(navPanel)} ease'); + display: block; + height: 60px; + left: 0; + position: fixed; + top: 0; + width: 100%; + z-index: _misc(z-index-base) + 1; + + .toggle { + @include icon(false, solid); + height: 60px; + left: 0; + position: absolute; + text-align: center; + top: 0; + width: 100%; + border: 0; + outline: 0; + + &:before { + color: _palette(navButton, fg); + content: '\f0c9'; + font-size: 1em; + height: 40px; + left: 10px; + line-height: 40px; + opacity: 0.5; + position: absolute; + top: 11px; + width: 60px; + z-index: 1; + } + + &:after { + background: _palette(navButton, bg); + border-radius: 2px; + content: ''; + height: 40px; + left: 10px; + position: absolute; + top: 10px; + width: 60px; + } + } + } + + #navPanel { + @include vendor('backface-visibility', 'hidden'); + @include vendor('transform', 'translateX(#{_size(navPanel) * -1})'); + @include vendor('transition', ('transform #{_duration(navPanel)} ease')); + display: block; + height: 100%; + left: 0; + overflow-y: auto; + position: fixed; + top: 0; + width: _size(navPanel); + z-index: _misc(z-index-base) + 2; + background: _palette(navPanel, bg); + color: _palette(navPanel, fg); + font-size: 0.8em; + letter-spacing: 0.075em; + text-transform: uppercase; + padding: 0.25em 0.75em 1em 0.75em; + + .link { + border: 0; + border-top: solid 1px transparentize(_palette(navPanel, fg), 0.95); + color: inherit; + display: block; + height: 3em; + line-height: 3em; + opacity: 0.75; + text-decoration: none; + + &.depth-0 { + font-weight: 900; + } + + &:first-child { + border-top: 0; + } + } + + .indent-1 { display: inline-block; width: 1em; } + .indent-2 { display: inline-block; width: 2em; } + .indent-3 { display: inline-block; width: 3em; } + .indent-4 { display: inline-block; width: 4em; } + .indent-5 { display: inline-block; width: 5em; } + } + + body { + &.navPanel-visible { + #page-wrapper { + @include vendor('transform', 'translateX(#{_size(navPanel)})'); + } + + #navButton { + @include vendor('transform', 'translateX(#{_size(navPanel)})'); + } + + #navPanel { + @include vendor('transform', 'translateX(0)'); + } + } + } + + } + +/* Mobile */ + + @include breakpoint('<=mobile') { + + $pattern-background-size: 10em; + + /* Basic */ + + body { + min-width: 320px; + } + + h2 { + font-size: 1.25em; + letter-spacing: 0.1em; + } + + h3 { + font-size: 1em; + letter-spacing: 0.025em; + } + + p { + text-align: justify; + } + + /* Section/Article */ + + header { + text-align: center; + + &.major { + padding-bottom: 0; + } + + &.special { + margin-bottom: 3em; + padding-left: 1.5em; + padding-right: 1.5em; + + &:before, + &:after { + width: 38%; + } + + .icon { + font-size: 0.75em; + top: 1.5em; + } + } + + p { + text-align: center; + } + } + + footer { + &.major { + padding-top: 0; + } + } + + /* Icon */ + + .icon { + &.circle { + font-size: 1em; + } + } + + /* Button */ + + input[type="button"], + input[type="submit"], + input[type="reset"], + button, + .button { + max-width: 20em; + width: 100%; + + &.fit { + width: auto; + } + } + + /* Icons */ + + ul.icons { + li { + padding-left: 0.25em; + } + } + + /* Featured Icons */ + + ul.featured-icons { + li { + .icon { + width: 1.1em; + } + } + } + + /* Buttons */ + + ul.buttons { + text-align: center; + } + + /* Wrapper */ + + .wrapper { + margin-bottom: 2.5em; + padding: 2.25em 1.5em; + + &.special { + br { + display: none; + } + } + + &.style1 { + padding: 0 1.5em; + } + + &.style2 { + background-size: $pattern-background-size; + padding: 2.25em 1.5em; + } + + &.style4 { + background-size: $pattern-background-size; + padding: 1.5em 1.5em 3em 1.5em; + } + } + + /* Banner */ + + #banner { + background-size: $pattern-background-size, $pattern-background-size, auto, cover; + padding: 6em 0; + + .inner { + background: none; + display: block; + padding: 0 1.5em; + + header { + h2 { + font-size: 1.5em; + } + } + + p { + text-align: center; + } + + br { + display: none; + } + } + } + + /* Main */ + + #main { + background-size: $pattern-background-size; + padding: 3.5em 0 2.5em 0; + } + + body.index #main { + padding: 2.5em 0 0 0; + } + + body.contact #main { + padding-bottom: 0; + } + + /* CTA */ + + #cta { + background-size: $pattern-background-size, $pattern-background-size, auto, cover; + padding: 3em 1.5em; + } + + /* Footer */ + + #footer { + padding: 3em 1.5em; + + .copyright { + li { + display: block; + margin: 1em 0 0 0; + padding: 0; + border: 0; + } + } + } + + /* Nav */ + + #navButton { + .toggle { + &:before { + top: 8px; + left: 8px; + width: 50px; + height: 34px; + line-height: 34px; + } + + &:after { + top: 8px; + left: 8px; + width: 50px; + height: 34px; + } + } + } + + } \ No newline at end of file diff --git a/frontend/static/frontend/assets/sass/noscript.scss b/frontend/static/frontend/assets/sass/noscript.scss new file mode 100644 index 0000000..468f005 --- /dev/null +++ b/frontend/static/frontend/assets/sass/noscript.scss @@ -0,0 +1,20 @@ +@import 'libs/vars'; +@import 'libs/functions'; +@import 'libs/mixins'; +@import 'libs/vendor'; +@import 'libs/breakpoints'; +@import 'libs/html-grid'; + +/* + Twenty by Pixelarity + pixelarity.com | hello@pixelarity.com + License: pixelarity.com/license +*/ + +/* Banner */ + + #banner { + .inner { + opacity: 1; + } + } \ No newline at end of file diff --git a/frontend/static/frontend/assets/webfonts/fa-brands-400.eot b/frontend/static/frontend/assets/webfonts/fa-brands-400.eot new file mode 100644 index 0000000..e79f40f Binary files /dev/null and b/frontend/static/frontend/assets/webfonts/fa-brands-400.eot differ diff --git a/frontend/static/frontend/assets/webfonts/fa-brands-400.svg b/frontend/static/frontend/assets/webfonts/fa-brands-400.svg new file mode 100644 index 0000000..ba0d850 --- /dev/null +++ b/frontend/static/frontend/assets/webfonts/fa-brands-400.svg @@ -0,0 +1,3442 @@ + + + + + +Created by FontForge 20190112 at Tue Jun 4 15:16:44 2019 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/static/frontend/assets/webfonts/fa-brands-400.ttf b/frontend/static/frontend/assets/webfonts/fa-brands-400.ttf new file mode 100644 index 0000000..217ffe9 Binary files /dev/null and b/frontend/static/frontend/assets/webfonts/fa-brands-400.ttf differ diff --git a/frontend/static/frontend/assets/webfonts/fa-brands-400.woff b/frontend/static/frontend/assets/webfonts/fa-brands-400.woff new file mode 100644 index 0000000..a2d8025 Binary files /dev/null and b/frontend/static/frontend/assets/webfonts/fa-brands-400.woff differ diff --git a/frontend/static/frontend/assets/webfonts/fa-brands-400.woff2 b/frontend/static/frontend/assets/webfonts/fa-brands-400.woff2 new file mode 100644 index 0000000..e27b0bf Binary files /dev/null and b/frontend/static/frontend/assets/webfonts/fa-brands-400.woff2 differ diff --git a/frontend/static/frontend/assets/webfonts/fa-regular-400.eot b/frontend/static/frontend/assets/webfonts/fa-regular-400.eot new file mode 100644 index 0000000..d62be2f Binary files /dev/null and b/frontend/static/frontend/assets/webfonts/fa-regular-400.eot differ diff --git a/frontend/static/frontend/assets/webfonts/fa-regular-400.svg b/frontend/static/frontend/assets/webfonts/fa-regular-400.svg new file mode 100644 index 0000000..751083e --- /dev/null +++ b/frontend/static/frontend/assets/webfonts/fa-regular-400.svg @@ -0,0 +1,803 @@ + + + + + +Created by FontForge 20190112 at Tue Jun 4 15:16:44 2019 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/static/frontend/assets/webfonts/fa-regular-400.ttf b/frontend/static/frontend/assets/webfonts/fa-regular-400.ttf new file mode 100644 index 0000000..eb3cb5e Binary files /dev/null and b/frontend/static/frontend/assets/webfonts/fa-regular-400.ttf differ diff --git a/frontend/static/frontend/assets/webfonts/fa-regular-400.woff b/frontend/static/frontend/assets/webfonts/fa-regular-400.woff new file mode 100644 index 0000000..43b1a9a Binary files /dev/null and b/frontend/static/frontend/assets/webfonts/fa-regular-400.woff differ diff --git a/frontend/static/frontend/assets/webfonts/fa-regular-400.woff2 b/frontend/static/frontend/assets/webfonts/fa-regular-400.woff2 new file mode 100644 index 0000000..b9344a7 Binary files /dev/null and b/frontend/static/frontend/assets/webfonts/fa-regular-400.woff2 differ diff --git a/frontend/static/frontend/assets/webfonts/fa-solid-900.eot b/frontend/static/frontend/assets/webfonts/fa-solid-900.eot new file mode 100644 index 0000000..c77baa8 Binary files /dev/null and b/frontend/static/frontend/assets/webfonts/fa-solid-900.eot differ diff --git a/frontend/static/frontend/assets/webfonts/fa-solid-900.svg b/frontend/static/frontend/assets/webfonts/fa-solid-900.svg new file mode 100644 index 0000000..627128b --- /dev/null +++ b/frontend/static/frontend/assets/webfonts/fa-solid-900.svg @@ -0,0 +1,4649 @@ + + + + + +Created by FontForge 20190112 at Tue Jun 4 15:16:44 2019 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/static/frontend/assets/webfonts/fa-solid-900.ttf b/frontend/static/frontend/assets/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000..c6c3dd4 Binary files /dev/null and b/frontend/static/frontend/assets/webfonts/fa-solid-900.ttf differ diff --git a/frontend/static/frontend/assets/webfonts/fa-solid-900.woff b/frontend/static/frontend/assets/webfonts/fa-solid-900.woff new file mode 100644 index 0000000..77c1786 Binary files /dev/null and b/frontend/static/frontend/assets/webfonts/fa-solid-900.woff differ diff --git a/frontend/static/frontend/assets/webfonts/fa-solid-900.woff2 b/frontend/static/frontend/assets/webfonts/fa-solid-900.woff2 new file mode 100644 index 0000000..e30fb67 Binary files /dev/null and b/frontend/static/frontend/assets/webfonts/fa-solid-900.woff2 differ diff --git a/frontend/static/frontend/contact.html b/frontend/static/frontend/contact.html new file mode 100644 index 0000000..54326a8 --- /dev/null +++ b/frontend/static/frontend/contact.html @@ -0,0 +1,120 @@ + + + + + Untitled + + + + + + +
+ + + + + +
+ +
+ +

Vel Ut Porta

+

Mus leo cras augue at nibh ultricies sit massa ut diam vitae.

+
+ + +
+ + +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
    +
  • +
+
+
+
+
+ +
+ +
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/static/frontend/images/banner.jpg b/frontend/static/frontend/images/banner.jpg new file mode 100644 index 0000000..b87dd9e Binary files /dev/null and b/frontend/static/frontend/images/banner.jpg differ diff --git a/frontend/static/frontend/images/pic01.jpg b/frontend/static/frontend/images/pic01.jpg new file mode 100644 index 0000000..c021654 Binary files /dev/null and b/frontend/static/frontend/images/pic01.jpg differ diff --git a/frontend/static/frontend/images/pic02.jpg b/frontend/static/frontend/images/pic02.jpg new file mode 100644 index 0000000..80e5193 Binary files /dev/null and b/frontend/static/frontend/images/pic02.jpg differ diff --git a/frontend/static/frontend/images/pic03.jpg b/frontend/static/frontend/images/pic03.jpg new file mode 100644 index 0000000..cd85541 Binary files /dev/null and b/frontend/static/frontend/images/pic03.jpg differ diff --git a/frontend/static/frontend/images/pic04.jpg b/frontend/static/frontend/images/pic04.jpg new file mode 100644 index 0000000..7dcd96a Binary files /dev/null and b/frontend/static/frontend/images/pic04.jpg differ diff --git a/frontend/static/frontend/left-sidebar.html b/frontend/static/frontend/left-sidebar.html new file mode 100644 index 0000000..8430a57 --- /dev/null +++ b/frontend/static/frontend/left-sidebar.html @@ -0,0 +1,195 @@ + + + + + Untitled + + + + + + +
+ + + + + +
+ +
+ +

Nullam nec Quam Aliquet

+

Morbi ornare ut mus cras col. vulputate quam eu ata montes.

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

Dolore Amet Consequat

+
+

Aliquam massa urna, imperdiet sit amet mi non, bibendum euismod est. Curabitur mi justo, tincidunt vel eros ullamcorper, porta cursus justo. Cras vel neque eros. Vestibulum diam quam, mollis at consectetur non, malesuada quis augue. Morbi tincidunt pretium interdum. Morbi mattis elementum orci, nec dictum massa. Morbi eu faucibus massa. Aliquam massa urna, imperdiet sit amet mi non, bibendum euismod est. Curabitur mi justo, tincidunt vel eros ullamcorper, porta cursus justo. Cras vel neque eros. Vestibulum diam.

+

Vestibulum diam quam, mollis at consectetur non, malesuada quis augue. Morbi tincidunt pretium interdum. Morbi mattis elementum orci, nec dictum porta cursus justo. Quisque ultricies lorem in ligula condimentum, et egestas turpis sagittis. Cras ac nunc urna. Nullam eget lobortis purus. Phasellus vitae tortor non est placerat tristique. Sed id sem et massa ornare pellentesque. Maecenas pharetra porta accumsan.

+

In vestibulum massa quis arcu lobortis tempus. Nam pretium arcu in odio vulputate luctus. Suspendisse euismod lorem eget lacinia fringilla. Sed sed felis justo. Nunc sodales elit in laoreet aliquam. Nam gravida, nisl sit amet iaculis porttitor, risus nisi rutrum metus, non hendrerit ipsum arcu tristique est.

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

Enim at Consequat

+
+

Sed tristique purus vitae volutpat ultrices. Aliquam eu elit eget arcu commodo suscipit dolor nec nibh. Proin a ullamcorper elit, et sagittis turpis. Integer ut fermentum.

+ +
+ +
+
+ +
+
+

Orci Facilisis

+
+

Sed tristique purus vitae volutpat ultrices. Aliquam eu elit eget arcu commodo suscipit dolor nec nibh. Proin a ullamcorper elit, et sagittis turpis. Integer ut fermentum.

+ +
+ +
+
+ +
+
+

Interdum Curabitur

+
+

Sed tristique purus vitae volutpat ultrices. Aliquam eu elit eget arcu commodo suscipit dolor nec nibh. Proin a ullamcorper elit, et sagittis turpis. Integer ut fermentum.

+ +
+ +
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/static/frontend/no-sidebar.html b/frontend/static/frontend/no-sidebar.html new file mode 100644 index 0000000..a69e8ea --- /dev/null +++ b/frontend/static/frontend/no-sidebar.html @@ -0,0 +1,159 @@ + + + + + Untitled + + + + + + +
+ + + + + +
+ +
+ +

Col egestas viverra At Cubilia

+

Augue quam ut vel rutrum lorem col accumsan blandit aenean.

+
+ + +
+ + +
+
+ +
+

Dolore Amet Consequat

+
+

Aliquam massa urna, imperdiet sit amet mi non, bibendum euismod est. Curabitur mi justo, tincidunt vel eros ullamcorper, porta cursus justo. Cras vel neque eros. Vestibulum diam quam, mollis at consectetur non, malesuada quis augue. Morbi tincidunt pretium interdum. Morbi mattis elementum orci, nec dictum massa. Morbi eu faucibus massa. Aliquam massa urna, imperdiet sit amet mi non, bibendum euismod est. Curabitur mi justo, tincidunt vel eros ullamcorper, porta cursus justo. Cras vel neque eros. Vestibulum diam.

+

Vestibulum diam quam, mollis at consectetur non, malesuada quis augue. Morbi tincidunt pretium interdum. Morbi mattis elementum orci, nec dictum porta cursus justo. Quisque ultricies lorem in ligula condimentum, et egestas turpis sagittis. Cras ac nunc urna. Nullam eget lobortis purus. Phasellus vitae tortor non est placerat tristique. Sed id sem et massa ornare pellentesque. Maecenas pharetra porta accumsan.

+

In vestibulum massa quis arcu lobortis tempus. Nam pretium arcu in odio vulputate luctus. Suspendisse euismod lorem eget lacinia fringilla. Sed sed felis justo. Nunc sodales elit in laoreet aliquam. Nam gravida, nisl sit amet iaculis porttitor, risus nisi rutrum metus, non hendrerit ipsum arcu tristique est.

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

Diam ut Consequat

+
+

Sed tristique purus vitae volutpat ultrices. Aliquam eu elit eget arcu commodo suscipit dolor nec nibh. Proin a ullamcorper elit, et sagittis turpis. Integer ut fermentum.

+ +
+ +
+
+ +
+
+

Eget Facilisis

+
+

Sed tristique purus vitae volutpat ultrices. Aliquam eu elit eget arcu commodo suscipit dolor nec nibh. Proin a ullamcorper elit, et sagittis turpis. Integer ut fermentum.

+ +
+ +
+
+ +
+
+

Accumsan Convallis

+
+

Sed tristique purus vitae volutpat ultrices. Aliquam eu elit eget arcu commodo suscipit dolor nec nibh. Proin a ullamcorper elit, et sagittis turpis. Integer ut fermentum.

+ +
+ +
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/static/frontend/right-sidebar.html b/frontend/static/frontend/right-sidebar.html new file mode 100644 index 0000000..f7ecd6d --- /dev/null +++ b/frontend/static/frontend/right-sidebar.html @@ -0,0 +1,195 @@ + + + + + Untitled + + + + + + +
+ + + + + +
+ +
+ +

Aenean cep Vitae Aliquam

+

Nulla aenean et mus morbi sem. dignissim diam ut dis vitae.

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

Dolore Amet Consequat

+
+

Aliquam massa urna, imperdiet sit amet mi non, bibendum euismod est. Curabitur mi justo, tincidunt vel eros ullamcorper, porta cursus justo. Cras vel neque eros. Vestibulum diam quam, mollis at consectetur non, malesuada quis augue. Morbi tincidunt pretium interdum. Morbi mattis elementum orci, nec dictum massa. Morbi eu faucibus massa. Aliquam massa urna, imperdiet sit amet mi non, bibendum euismod est. Curabitur mi justo, tincidunt vel eros ullamcorper, porta cursus justo. Cras vel neque eros. Vestibulum diam.

+

Vestibulum diam quam, mollis at consectetur non, malesuada quis augue. Morbi tincidunt pretium interdum. Morbi mattis elementum orci, nec dictum porta cursus justo. Quisque ultricies lorem in ligula condimentum, et egestas turpis sagittis. Cras ac nunc urna. Nullam eget lobortis purus. Phasellus vitae tortor non est placerat tristique. Sed id sem et massa ornare pellentesque. Maecenas pharetra porta accumsan.

+

In vestibulum massa quis arcu lobortis tempus. Nam pretium arcu in odio vulputate luctus. Suspendisse euismod lorem eget lacinia fringilla. Sed sed felis justo. Nunc sodales elit in laoreet aliquam. Nam gravida, nisl sit amet iaculis porttitor, risus nisi rutrum metus, non hendrerit ipsum arcu tristique est.

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

Nisl ut Penatibus

+
+

Sed tristique purus vitae volutpat ultrices. Aliquam eu elit eget arcu commodo suscipit dolor nec nibh. Proin a ullamcorper elit, et sagittis turpis. Integer ut fermentum.

+ +
+ +
+
+ +
+
+

Erat Penatibus

+
+

Sed tristique purus vitae volutpat ultrices. Aliquam eu elit eget arcu commodo suscipit dolor nec nibh. Proin a ullamcorper elit, et sagittis turpis. Integer ut fermentum.

+ +
+ +
+
+ +
+
+

Eleifend Curabitur

+
+

Sed tristique purus vitae volutpat ultrices. Aliquam eu elit eget arcu commodo suscipit dolor nec nibh. Proin a ullamcorper elit, et sagittis turpis. Integer ut fermentum.

+ +
+ +
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/templates/frontend/card.html b/frontend/templates/frontend/card.html new file mode 100644 index 0000000..656495a --- /dev/null +++ b/frontend/templates/frontend/card.html @@ -0,0 +1 @@ +Die Kartennummer lautet: {{ object.card.number }} \ No newline at end of file diff --git a/frontend/templates/frontend/form.html b/frontend/templates/frontend/form.html new file mode 100644 index 0000000..e6d0eac --- /dev/null +++ b/frontend/templates/frontend/form.html @@ -0,0 +1,19 @@ +Bitte gib hier den sechsstelligen Code ein, den du per SMS erhalten hast: +
+ {% csrf_token %} + {{ form }} + +
+ + \ No newline at end of file diff --git a/frontend/templates/frontend/index.html b/frontend/templates/frontend/index.html new file mode 100644 index 0000000..bbdb467 --- /dev/null +++ b/frontend/templates/frontend/index.html @@ -0,0 +1,86 @@ +{% load settings %} + + + + + {% project_name %} + + + + + + + +
+ + + + + + + + +
+ +
+ +

Hier siehst du, was du aktuell schuldig bist.

+ {% unpaid %} +
+ +
+ + +
+ + + +
+ +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/templates/frontend/modal.html b/frontend/templates/frontend/modal.html new file mode 100644 index 0000000..feb3894 --- /dev/null +++ b/frontend/templates/frontend/modal.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/templates/frontend/unpaid.html b/frontend/templates/frontend/unpaid.html new file mode 100644 index 0000000..b0969dd --- /dev/null +++ b/frontend/templates/frontend/unpaid.html @@ -0,0 +1,19 @@ + + + + + + +{% for item in items %} + + + + + +{% endfor %} + + + + + +
DatumBeschreibungBetrag
{{ item.date }}{{ item.description }}{{ item.amount }} €
Gesamtsumme{{ total }} €
\ No newline at end of file diff --git a/frontend/templates/registration/login.html b/frontend/templates/registration/login.html new file mode 100644 index 0000000..088bbda --- /dev/null +++ b/frontend/templates/registration/login.html @@ -0,0 +1,29 @@ + + + + + + + + + + Login + + + +
+

Login

+
+ {% csrf_token %} + + + + + +
+ + + + + + \ No newline at end of file diff --git a/frontend/templatetags/__init__.py b/frontend/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/frontend/templatetags/settings.py b/frontend/templatetags/settings.py new file mode 100644 index 0000000..0a64959 --- /dev/null +++ b/frontend/templatetags/settings.py @@ -0,0 +1,19 @@ +from django import template +from django.conf import settings +from dbsettings.views import getValue +from ledger.models import Payment + +register = template.Library() + +@register.simple_tag +def project_name(): + return settings.PROJECT_NAME + +@register.inclusion_tag("frontend/unpaid.html") +def unpaid(): + items = Payment.objects.filter(repayment=None) # pylint: disable=E1101 + total = 0 + for item in items: + total += item.amount + return {"items": items, "total": total} + \ No newline at end of file diff --git a/frontend/urls.py b/frontend/urls.py new file mode 100644 index 0000000..8b6ec14 --- /dev/null +++ b/frontend/urls.py @@ -0,0 +1,24 @@ +"""susioma URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/2.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import include, path +from frontend.views import IndexView, SMSAuthView, CardView + +urlpatterns = [ + path('', IndexView.as_view(), name="index"), + path('smsauth/', SMSAuthView.as_view(), name="smsauth"), + path('card//', CardView.as_view(), name="card") +] \ No newline at end of file diff --git a/frontend/views.py b/frontend/views.py index 91ea44a..7897a82 100644 --- a/frontend/views.py +++ b/frontend/views.py @@ -1,3 +1,42 @@ -from django.shortcuts import render +from django.shortcuts import redirect +from django.views.generic import TemplateView, FormView, DetailView +from django.contrib.auth.mixins import LoginRequiredMixin +from frontend.forms import SMSAuthForm +from frontend.models import CardURL +from django.utils import timezone +from datetime import timedelta +from django.http import Http404 +from smsauth.views import requestToken +from buyer.views import getCard +from ledger.models import Payment -# Create your views here. +def makeCardURL(card): + return CardURL.objects.create(card=card) # pylint: disable=E1101 + +class IndexView(LoginRequiredMixin, TemplateView): + template_name = "frontend/index.html" + +class SMSAuthView(LoginRequiredMixin, FormView): + template_name = "frontend/form.html" + form_class = SMSAuthForm + + def get_context_data(self, **kwargs): + requestToken() + return super(SMSAuthView, self).get_context_data(**kwargs) + + def form_valid(self, form): + Payment.objects.create(description="Paysafecard", amount=11) # pylint: disable=E1101 + return redirect("/card/%s/" % makeCardURL(getCard()).uuid) + +class CardView(LoginRequiredMixin, DetailView): + template_name = "frontend/card.html" + model = CardURL + pk_url_kwarg = "uuid" + + def get_object(self, queryset=None): + obj = super(CardView, self).get_object(queryset=queryset) + if timezone.now() - timedelta(seconds=300) > obj.created: + raise Http404() + obj.card.delivered = timezone.now() + obj.card.save() + return obj diff --git a/ledger/migrations/0002_auto_20191026_1926.py b/ledger/migrations/0002_auto_20191026_1926.py new file mode 100644 index 0000000..4d2fbb7 --- /dev/null +++ b/ledger/migrations/0002_auto_20191026_1926.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.6 on 2019-10-26 19:26 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ledger', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='payment', + name='repayment', + field=models.DateTimeField(blank=True, default=None, null=True, verbose_name='Date of repayment'), + ), + ] diff --git a/ledger/models.py b/ledger/models.py index bfdde50..fa2ff0a 100644 --- a/ledger/models.py +++ b/ledger/models.py @@ -6,7 +6,7 @@ class Payment(models.Model): description = models.CharField("Payment description", max_length=128) amount = models.DecimalField("Payment amount", max_digits=15, decimal_places=2) date = models.DateTimeField("Date of payment", auto_now_add=True) - repayment = models.DateTimeField("Date of repayment", default=None, null=True) + repayment = models.DateTimeField("Date of repayment", default=None, null=True, blank=True) def __str__(self): return self.description \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..aa6f655 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +selenium +bs4 +twilio diff --git a/smsauth/__init__.py b/smsauth/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/smsauth/admin.py b/smsauth/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/smsauth/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/smsauth/apps.py b/smsauth/apps.py new file mode 100644 index 0000000..b91293b --- /dev/null +++ b/smsauth/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class SmsauthConfig(AppConfig): + name = 'smsauth' diff --git a/smsauth/migrations/0001_initial.py b/smsauth/migrations/0001_initial.py new file mode 100644 index 0000000..f5c8eb3 --- /dev/null +++ b/smsauth/migrations/0001_initial.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.6 on 2019-10-26 21:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Token', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('token', models.CharField(max_length=6)), + ('sent', models.DateTimeField(auto_now_add=True)), + ('used', models.BooleanField(default=False)), + ], + ), + ] diff --git a/smsauth/migrations/__init__.py b/smsauth/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/smsauth/models.py b/smsauth/models.py new file mode 100644 index 0000000..a51c83d --- /dev/null +++ b/smsauth/models.py @@ -0,0 +1,6 @@ +from django.db import models + +class Token(models.Model): + token = models.CharField(max_length=6) + sent = models.DateTimeField(auto_now_add=True) + used = models.BooleanField(default=False) \ No newline at end of file diff --git a/smsauth/tests.py b/smsauth/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/smsauth/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/smsauth/views.py b/smsauth/views.py new file mode 100644 index 0000000..02be5e3 --- /dev/null +++ b/smsauth/views.py @@ -0,0 +1,30 @@ +from django.shortcuts import render +from django.utils import timezone +from datetime import timedelta +from smsauth.models import Token +from twilio.rest import Client +from dbsettings.views import getValue +import random + +def generateToken(): + return str(random.SystemRandom().choice(range(999999))).zfill(6) + +def storeToken(token): + return Token.objects.create(token=token) # pylint: disable=E1101 + +def useToken(token): + retval = False + for t in Token.objects.filter(token=str(token).zfill(6)): # pylint: disable=E1101 + t.used = True + if timezone.now() - timedelta(seconds=300) < t.sent: + retval = True + return retval + +def requestToken(): + token = generateToken() + storeToken(token) + return sendSMS("Bitte verwende diesen Code, um deine Bestellung zu bestätigen: %s" % token) + +def sendSMS(text): + client = Client(getValue("smsauth.twilio.sid"), getValue("smsauth.twilio.token")) + return client.messages.create(body=text, from_=getValue("smsauth.twilio.number"), to=getValue("smsauth.recipient")) \ No newline at end of file diff --git a/susioma/settings.py b/susioma/settings.py index 4460a4f..d4e6e3c 100644 --- a/susioma/settings.py +++ b/susioma/settings.py @@ -29,6 +29,7 @@ INSTALLED_APPS = [ 'ledger', 'frontend', 'dbsettings', + 'smsauth', ] MIDDLEWARE = [ @@ -95,7 +96,7 @@ AUTH_PASSWORD_VALIDATORS = [ # Internationalization # https://docs.djangoproject.com/en/2.2/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = 'de-at' TIME_ZONE = 'UTC' diff --git a/susioma/urls.py b/susioma/urls.py index ab8bfe9..44275af 100644 --- a/susioma/urls.py +++ b/susioma/urls.py @@ -14,8 +14,10 @@ Including another URLconf 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path +from django.urls import include, path urlpatterns = [ path('admin/', admin.site.urls), + path('accounts/', include('django.contrib.auth.urls')), + path('', include('frontend.urls')), ]