diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4334a7a --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.idea/ +__pycache__/ +venv/ +*.pyc +*~ +service.log +private.pem +public.pem +main.db \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e79b229 --- /dev/null +++ b/README.md @@ -0,0 +1,64 @@ +# Cryto Ready Web Framework (CRWF) + +## Core features +* Ready to accept crypto payments for users. +* Minimal maintenance. +* Easy scalable. +* User ready with login, register, account activation by email, password forgot and password reset. +* Recaptcha v2 protected forms. +* Basic app abuse control at IP level for register, password forgot and maximum requests. + +The minimal maintenance is achieved by using as python core immutable features as possible. + +--- +##### Requirements +* Python3.7 or greater +* Crypto IPN service https://github.com/Binarch00/crypto_gateway + +Abuse control by IP could end using proxy IP if proxies are used. + +--- + +##### Python libs setup +Python 3.7 or greater required +```shell script +python3.7 -m venv venv +. ./venv/bim/activate +pip install -r requirements.txt +``` + +##### For setup the initial database +`PYTHONPATH=./ python database/models.py` + +##### For run unittests +`./run_tests.sh` + +##### Run the web app + +`PYTHONPATH=./ python webapp/run.py` + +--- +Internal Services +--- + +#### Crypto Wallets Generator (Required Service) + +For security reasons, the users wallets are generated outside the users register process. +This way the web app will never know how decode the wallets private keys. + +##### Before the webapp consume all unused address, call the address generator by +`PYTHONPATH=./ python services/btc_address_generator.py` + +Security Details: +* Run the service outside the webapp server +* Setup secure remote database access to web app database +* Remove all decryption keys at web app deploy. + +--- + +How To Deploy +--- + +#### TODO ! + +. \ No newline at end of file diff --git a/cache/__init__.py b/cache/__init__.py new file mode 100644 index 0000000..7e56b46 --- /dev/null +++ b/cache/__init__.py @@ -0,0 +1,24 @@ +import redis +import json + +from settings import CACHE + + +def get_redis(db=0): + return redis.Redis(host=CACHE["host"], port=CACHE["port"], db=db) + + +redis_con = get_redis() + + +def get_object(key): + global redis_con + data = redis_con.get(key) + return json.loads(data) if data else {} + + +def set_object(key, data, ttl=600): + global redis_con + if type(data) is not dict: + raise ValueError("Dict object required as data") + return redis_con.set(key, json.dumps(data), ex=ttl) diff --git a/cache/tests.py b/cache/tests.py new file mode 100644 index 0000000..6885253 --- /dev/null +++ b/cache/tests.py @@ -0,0 +1,13 @@ +import unittest +import cache + + +class TestCacheMethods(unittest.TestCase): + + def test_set_get_object(self): + data = { + "A": 1, + "B": 2 + } + cache.set_object("test1", data) + self.assertEqual(cache.get_object("test1"), data) diff --git a/core/__init__.py b/core/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/core/__init__.py @@ -0,0 +1 @@ + diff --git a/core/crypto_ipn_client.py b/core/crypto_ipn_client.py new file mode 100644 index 0000000..1b8627d --- /dev/null +++ b/core/crypto_ipn_client.py @@ -0,0 +1,26 @@ +""" +crypto gateway IPN client +https://github.com/Binarch00/crypto_gateway +""" + +import requests +from settings import CRYPTO_GATEWAY_SERVER, logger, SERVER_NAME + + +# TODO: move to https +def subscribe(address, coin="btc"): + try: + url = "http://{}/btc_ipn".format(CRYPTO_GATEWAY_SERVER) + data = { + "address": address, + "max_confirms": 1, + "url": "http://{}/ipn".format(SERVER_NAME) + } + res = requests.post(url=url, data=data) + if res.content.strip().count(b"success") >= 1: + return True + else: + logger.error("Address {} subscription fail: {}".format(address, res.content[:30])) + except Exception as ex: + logger.exception(ex) + return False diff --git a/core/utils/__init__.py b/core/utils/__init__.py new file mode 100644 index 0000000..513f5e7 --- /dev/null +++ b/core/utils/__init__.py @@ -0,0 +1,13 @@ +import random +import string +import hashlib + + +def random_string(length): + letters = string.ascii_letters + return ''.join(random.choice(letters) for i in range(length)) + + +def hash_maker(secret, salt=""): + result = (secret + salt).encode('utf-8') + return hashlib.sha1(result).hexdigest() diff --git a/core/utils/cached_objects.py b/core/utils/cached_objects.py new file mode 100644 index 0000000..d6d9a19 --- /dev/null +++ b/core/utils/cached_objects.py @@ -0,0 +1,64 @@ +import cache +import database +from settings import logger +from database.models import UserTransactions, CryptoAddress + + +class CachedObject: + db_table = "none" + db_id = "id" + TTL = 600 + + def __init__(self, id): + self.id = id + self._load_cache() + if not self._data: + self._load_database(refresh=True) + + def refresh_data(self): + """Update the cache with fresh database info""" + self._load_database(refresh=True) + + def _load_database(self, refresh=False): + try: + session = database.Session() + query = 'SELECT * FROM {} WHERE {} = :val LIMIT 1'.format(self.db_table, self.db_id) + result = session.execute(query, {'val': self.id}) + self._data = dict(result.first().items()) + if refresh: + if self._data: + key = "cached/{}/{}".format(self.db_table, self.id) + cache.set_object(key, self._data, ttl=self.TTL) + else: + raise ValueError("Invalid user id: {}".format(self.id)) + + except Exception as ex: + logger.exception(ex) + + def _load_cache(self): + key = "cached/{}/{}".format(self.db_table, self.id) + cdata = cache.get_object(key) + if cdata: + self._data = cdata + else: + self._data = {} + + def __getattr__(self, item): + return self._data.get(item) + + +class UserCH(CachedObject): + db_table = "users" + + def btc_balance(self): + key = "user-netbalance/{}".format(self.id) + net_balance = 0.0 + try: + net_balance = float(cache.redis_con.get(key)) + except TypeError: + net_balance = UserTransactions.get_user_netbalance(self.id) + cache.redis_con.set(key, net_balance, 10) + return net_balance + + def btc_address(self): + return CryptoAddress.get_address_by_user(self.id) diff --git a/core/utils/emails.py b/core/utils/emails.py new file mode 100644 index 0000000..5108747 --- /dev/null +++ b/core/utils/emails.py @@ -0,0 +1,39 @@ +import smtplib + +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText +import re +from settings import logger, SMTP + + +def send_email(from_, to_, subject, body_text, body_html): + if not from_: + from_ = SMTP["default_sender"] + if not re.match(r"[^@]+@[^@]+\.[^@]+", from_) or not re.match(r"[^@]+@[^@]+\.[^@]+", to_): + logger.error("Invalid email address from {} -- to {}".format(from_, to_)) + return False + + # Create message container - the correct MIME type is multipart/alternative. + msg = MIMEMultipart('alternative') + msg['Subject'] = subject + msg['From'] = from_ + msg['To'] = to_ + + # Record the MIME types of both parts - text/plain and text/html. + parts = [] + if body_text: + parts.append(MIMEText(body_text, 'plain')) + if body_html: + parts.append(MIMEText(body_html, 'html')) + + for part in parts: + msg.attach(part) + + logger.warning("EMAIL: " + msg.as_string()) + return True + + server = smtplib.SMTP_SSL(SMTP["host"], SMTP["port"]) + server.ehlo() + server.login(SMTP["user"], SMTP["password"]) + server.sendmail(from_, to_, msg.as_string()) + server.close() diff --git a/core/utils/tests.py b/core/utils/tests.py new file mode 100644 index 0000000..c87bcfe --- /dev/null +++ b/core/utils/tests.py @@ -0,0 +1,21 @@ +import unittest +from core.utils.cached_objects import UserCH +import cache +import database +from database.models import User + + + +class TestCachedObjectsMethods(unittest.TestCase): + + def setUp(self) -> None: + self.session = database.Session() + self.session.query(User).filter_by(email='test@test.com').delete() + self.session.commit() + + def test_user(self): + User.add_user("test@test.com", "any") + our_item = self.session.query(User).filter_by(email='test@test.com').first() + usr = UserCH(our_item.id) + self.assertEqual(usr.email, "test@test.com") + self.assertEqual(cache.get_object("cached/{}/{}".format(usr.db_table, usr.id)), usr._data) diff --git a/crypto/__init__.py b/crypto/__init__.py new file mode 100644 index 0000000..0286948 --- /dev/null +++ b/crypto/__init__.py @@ -0,0 +1,75 @@ +from Crypto.PublicKey import RSA +from Crypto.Random import get_random_bytes +from Crypto.Cipher import AES, PKCS1_OAEP + + +class RSATools: + + @staticmethod + def gen_keys(size=2048, passphrase="", prv_file="private.pem", pub_file="public.pem"): + key = RSA.generate(size) + private_key = key.export_key(passphrase=passphrase) + file_out = open(prv_file, "wb") + file_out.write(private_key) + file_out.flush() + file_out.close() + + public_key = key.publickey().export_key() + file_out = open(pub_file, "wb") + file_out.write(public_key) + file_out.flush() + file_out.close() + + def decrypt(self, data): + data = bytearray(data) + + enc_session_key = data[:self.prv_key.size_in_bytes()] + data = data[self.prv_key.size_in_bytes():] + nonce = data[:16] + data = data[16:] + tag = data[:16] + ciphertext = data[16:] + + # Decrypt the session key with the private RSA key + cipher_rsa = PKCS1_OAEP.new(self.prv_key) + session_key = cipher_rsa.decrypt(enc_session_key) + + # Decrypt the data with the AES session key + cipher_aes = AES.new(session_key, AES.MODE_EAX, nonce) + data = cipher_aes.decrypt_and_verify(ciphertext, tag) + return data.decode("utf-8") + + def encrypt(self, data): + data = data.encode("utf-8") + session_key = get_random_bytes(16) + data_out = [] + + # Encrypt the session key with the public RSA key + cipher_rsa = PKCS1_OAEP.new(self.pub_key) + enc_session_key = cipher_rsa.encrypt(session_key) + + # Encrypt the data with the AES session key + cipher_aes = AES.new(session_key, AES.MODE_EAX) + ciphertext, tag = cipher_aes.encrypt_and_digest(data) + for x in (enc_session_key, cipher_aes.nonce, tag, ciphertext): + data_out += x + return bytes(data_out) + + @staticmethod + def _load_key(key_file, passphrase=""): + if key_file: + with open(key_file) as fl: + return RSA.import_key(fl.read(), passphrase=passphrase) + + def __init__(self, pub_key=None, prv_key=None, passphrase=""): + self.pub_key = self._load_key(pub_key, passphrase) + self.prv_key = self._load_key(prv_key, passphrase) + self.passphrase = passphrase + + +if __name__ == "__main__": + # RSATools.gen_keys(size=4028, passphrase="1234567890") + rc = RSATools("public.pem", "private.pem", passphrase="1234567890") + enc = rc.encrypt("Hello Word") + print(enc) + print("_"+rc.decrypt(enc)+"_") diff --git a/crypto/btc/__init__.py b/crypto/btc/__init__.py new file mode 100644 index 0000000..71bca3a --- /dev/null +++ b/crypto/btc/__init__.py @@ -0,0 +1,31 @@ +import os, binascii, hashlib, base58, ecdsa +import requests +import cache + + +def ripemd160(x): + d = hashlib.new('ripemd160') + d.update(x) + return d + + +def gen_btc_keys(): + # generate private key , uncompressed WIF starts with "5" + priv_key = os.urandom(32) + fullkey = '80' + binascii.hexlify(priv_key).decode() + sha256a = hashlib.sha256(binascii.unhexlify(fullkey)).hexdigest() + sha256b = hashlib.sha256(binascii.unhexlify(sha256a)).hexdigest() + WIF = base58.b58encode(binascii.unhexlify(fullkey + sha256b[:8])) + + # get public key , uncompressed address starts with "1" + sk = ecdsa.SigningKey.from_string(priv_key, curve=ecdsa.SECP256k1) + vk = sk.get_verifying_key() + publ_key = '04' + binascii.hexlify(vk.to_string()).decode() + hash160 = ripemd160(hashlib.sha256(binascii.unhexlify(publ_key)).digest()).digest() + publ_addr_a = b"\x00" + hash160 + checksum = hashlib.sha256(hashlib.sha256(publ_addr_a).digest()).digest()[:4] + publ_addr_b = base58.b58encode(publ_addr_a + checksum) + return { + "private": WIF.decode(), + "public": publ_addr_b.decode() + } diff --git a/crypto/tests.py b/crypto/tests.py new file mode 100644 index 0000000..c6d86ae --- /dev/null +++ b/crypto/tests.py @@ -0,0 +1,24 @@ +import unittest +from crypto import RSATools +import os + + +class TestRSATools(unittest.TestCase): + + def setUp(self) -> None: + RSATools.gen_keys(passphrase="123", prv_file="test_private.pem", pub_file="test_public.pem") + + def tearDown(self) -> None: + os.remove("test_public.pem") + os.remove("test_private.pem") + + def test_RSA(self): + rc = RSATools(pub_key="test_public.pem", prv_key="test_private.pem", passphrase="123") + in_str = """This is a long test string + line #2 + line #3 + end + """ + enc = rc.encrypt(in_str) + out_str = rc.decrypt(enc) + self.assertEqual(in_str, out_str) diff --git a/database/__init__.py b/database/__init__.py new file mode 100644 index 0000000..05f54c4 --- /dev/null +++ b/database/__init__.py @@ -0,0 +1,21 @@ +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +from settings import logger, DB + +Session = None +engine = None + + +def init_db(): + global Session, engine + if DB["engine"] == "sqlite": + engine = create_engine('{engine}:{file}'.format(**DB), connect_args={'check_same_thread': False}) + else: + eng = '{engine}://{username}:{password}@{host}/{database}'.format(**DB) + engine = create_engine(eng) + + Session = sessionmaker(bind=engine) + + +init_db() diff --git a/database/models.py b/database/models.py new file mode 100644 index 0000000..60b574c --- /dev/null +++ b/database/models.py @@ -0,0 +1,302 @@ +import hashlib +import datetime +import time +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy import Column, Integer, String, Float, DateTime +Base = declarative_base() + +import database +from core.utils import random_string, hash_maker, emails +from core import crypto_ipn_client +import cache +from settings import logger, SERVER_NAME, SMTP, SERVICE_NAME, SECRET +from flask import render_template, flash, url_for + + +class TestModel(Base): + __tablename__ = 'testmodel' + id = Column(Integer, primary_key=True) + name = Column(String) + fullname = Column(String) + nickname = Column(String) + + def __repr__(self): + return "" % ( + self.name, self.fullname, self.nickname) + + +class User(Base): + __tablename__ = 'users' + id = Column(Integer, primary_key=True, autoincrement=True) + email = Column(String, unique=True) + password = Column(String) + api_key = Column(String, unique=True) + SALT = "SJh5HDd2AI" + vcode = Column(String) + + @staticmethod + def gen_forgot(id, tm=None): + if not tm: + tm = int(time.time()) + tm = str(tm) + data = "{}{}{}{}".format(id, SECRET, "salt-452341", tm) + data = data.encode() + return "{}/{}".format(hashlib.md5(data).hexdigest(), tm) + + @staticmethod + def forgot(email, session=None): + if not session: + session = database.Session() + user1 = session.query(User).filter_by(email=email).first() + flash("Check your email to start the password reset process.") + if user1 and user1.id: + fcode = User.gen_forgot(user1.id) + reset_link = "http://{}/reset-auth/{}/{}".format(SERVER_NAME, user1.id, fcode) + body = render_template("email_forgot.html", reset_link=reset_link) + emails.send_email( + None, to_=email, subject="Password Reset For [{}]".format(SERVICE_NAME), body_text=None, body_html=body) + return True + return False + + def is_verified(self): + return not self.vcode + + @staticmethod + def verify_user(vcode, session=None): + if not session: + session = database.Session() + user1 = session.query(User).filter_by(vcode=vcode).first() + if user1 and user1.id: + user1.vcode = "" + session.commit() + return True + return False + + @staticmethod + def reset_user_password(id, password, session=None): + try: + if not session: + session = database.Session() + user1 = session.query(User).filter_by(id=id).first() + user1.password = hash_maker(password, User.SALT) + session.commit() + return True + except Exception as ex: + logger.exception(ex) + return False + + @staticmethod + def add_user(email, password, session=None): + try: + if not session: + session = database.Session() + api_key = random_string(57) + vcode = random_string(157) + usr = User( + email=email, api_key=api_key, + password=hash_maker(password, User.SALT), vcode=vcode) + session.add(usr) + session.commit() + + # Prepare confirm email to send + activation_link = "http://{}/activate/{}".format(SERVER_NAME, vcode) + body = render_template("email_confirm.html", activation_link=activation_link) + emails.send_email( + None, to_=email, subject="Account Activation [{}]".format(SERVICE_NAME), body_text=None, body_html=body) + return True + except Exception as ex: + logger.exception(ex) + return False + + @staticmethod + def link_crypto_address(user_id, session=None, ipn_subscribe=True): + """Assign a crypto address to the user and subscribe address to IPN notifications""" + if not session: + session = database.Session() + CryptoAddress.assign_address(user_id, session=session) + address = CryptoAddress.get_address_by_user(user_id, session=session) + if not address: + logger.error("Not address assigned to user {}".format(user_id)) + return False + return crypto_ipn_client.subscribe(address) if ipn_subscribe else True + + @staticmethod + def login(email, password, session=None): + password = hash_maker(password, User.SALT) + key = "auth/{}/{}".format(email, password) + user1 = cache.redis_con.get(key) + if user1: + return int(user1) + if not session: + session = database.Session() + user1 = session.query(User).filter_by(email=email, password=password).first() + if user1 and user1.id and not user1.is_verified(): + return -1 + if user1 and user1.id: + cache.redis_con.set(key, user1.id, ex=600) + return user1.id + return False + + @staticmethod + def login_api(api_key, session=None): + key = "auth_api/{}".format(api_key) + user1 = cache.redis_con.get(key) + if user1: + return int(user1) + if not session: + session = database.Session() + user1 = session.query(User).filter_by(api_key=api_key).first() + if user1 and user1.id: + cache.redis_con.set(key, user1.id, ex=600) + return user1.id + return False + + def __repr__(self): + return "".format(self.id, self.email) + + +class CryptoAddress(Base): + __tablename__ = 'crypto_address' + id = Column(Integer, primary_key=True, autoincrement=True) + public_key = Column(String, unique=True) + private_key = Column(String, unique=True) + crypto_type = Column(String, default="btc") + user = Column(Integer, default=0) + assigned_date = Column(DateTime, default=None) + + @staticmethod + def get_address_user(address, crypto_type="btc", session=None): + if not session: + session = database.Session() + query = """ + SELECT user FROM crypto_address + WHERE public_key='{}' AND crypto_type='{}' + LIMIT 1 + """.format(address, crypto_type) + rs = session.execute(query) + data = rs.fetchone() + return data[0] if data and data[0] else None + + @staticmethod + def get_address_by_user(user, crypto_type="btc", session=None): + if not session: + session = database.Session() + query = """ + SELECT public_key FROM crypto_address + WHERE user='{}' AND crypto_type='{}' + ORDER BY assigned_date ASC + LIMIT 1 + """.format(user, crypto_type) + rs = session.execute(query) + data = rs.fetchone() + return data[0] if data and data[0] else None + + @staticmethod + def assign_address(user_id, crypto_type="btc", session=None): + if not session: + session = database.Session() + prev = CryptoAddress.get_address_by_user(user_id, crypto_type=crypto_type, session=session) + if not prev: + query = """ + UPDATE crypto_address + SET user={user_id}, assigned_date=datetime() + WHERE user=0 AND crypto_type='{crypto_type}' + LIMIT 1 + """.format(user_id=user_id, crypto_type=crypto_type) + session.execute(query) + session.commit() + return True + else: + logger.warning("User {} already have one assigned address.".format(user_id)) + return False + + +class UserTransactions(Base): + __tablename__ = 'transactions' + id = Column(Integer, primary_key=True, autoincrement=True) + user = Column(Integer, index=True) + amount = Column(Float) + trans_type = Column(String, index=True) + coin = Column(String, index=True, default="btc") + added_date = Column(DateTime, default=datetime.datetime.utcnow) + reference = Column(String) + + @staticmethod + def get_user_netdeposits(user, coin="btc", session=None): + """ + Get net user deposits excluding consumes. + :return: net user deposits + """ + try: + assert user > 0 + assert coin in ["btc"] + + if not session: + session = database.Session() + + query = """ + SELECT SUM(amount) AS total + FROM transactions + WHERE user={} AND coin='{}' AND trans_type='deposit' + """.format(user, coin) + rs = session.execute(query) + data = rs.fetchone() + return float(data[0]) if data and data[0] else 0.0 + except Exception as ex: + logger.exception(ex) + + + @staticmethod + def get_user_netbalance(user, coin="btc", session=None): + """ + Get net user balance, deposits - consumes + :return: net user balance + """ + try: + assert user > 0 + assert coin in ["btc"] + + if not session: + session = database.Session() + + query = """ + SELECT SUM(amount) AS total + FROM transactions + WHERE user={} AND coin='{}' + """.format(user, coin) + rs = session.execute(query) + data = rs.fetchone() + return float(data[0]) if data and data[0] else 0.0 + except Exception as ex: + logger.exception(ex) + + @staticmethod + def add_transaction(user, amount, trans_type, reference="", coin="btc", session=None): + try: + assert coin in ['btc'] + assert trans_type in ['deposit', 'consume'] + assert amount != 0 + assert user >= 0 + + if not session: + session = database.Session() + + usrt = UserTransactions( + user=user, + amount=amount, + trans_type=trans_type, + reference=reference, + coin=coin + ) + session.add(usrt) + session.commit() + except Exception as ex: + logger.exception(ex) + + +def init_models(): + Base.metadata.create_all(database.engine) + + +if __name__ == "__main__": + init_models() diff --git a/database/tests.py b/database/tests.py new file mode 100644 index 0000000..6a8ce8f --- /dev/null +++ b/database/tests.py @@ -0,0 +1,77 @@ +import unittest +from unittest import mock +import hashlib +import database +from database.models import TestModel, User, UserTransactions, CryptoAddress +from services.btc_address_generator import generate_address +import core.utils.emails + + +class TestDatabaseMethods(unittest.TestCase): + + def setUp(self) -> None: + self.session = database.Session() + + def test_TestModel(self): + ed_test = TestModel( + name='ed', fullname='Ed Jones', nickname='edsnickname') + self.session.add(ed_test) + self.session.commit() + our_item = self.session.query(TestModel).filter_by(name='ed').first() + assert our_item + self.assertEqual(our_item.nickname, 'edsnickname') + + +class TestUser(unittest.TestCase): + + def setUp(self) -> None: + self.session = database.Session() + self.session.query(User).filter_by(email='test@test.com').delete() + self.session.commit() + # generate_address(2) + + @mock.patch('core.utils.emails.send_email', return_value=True) + @mock.patch('flask.render_template', return_value=True) + def test_add_user(self, mk, mk1): + User.add_user("test@test.com", "any") + our_item = self.session.query(User).filter_by(email='test@test.com').first() + self.assertEqual(our_item.password, hashlib.sha1(("any" + User.SALT).encode('utf-8')).hexdigest()) + + assert CryptoAddress.get_address_by_user(our_item.id) + + @mock.patch('core.utils.emails.send_email', return_value=True) + @mock.patch('flask.render_template', return_value=True) + def test_login(self, mk, mk1): + User.add_user("test@test.com", "any") + assert User.login("test@test.com", "any") + assert not User.login("test@test.com", "anyXX") + + +class TestUserTransactions(unittest.TestCase): + + def setUp(self) -> None: + self.session = database.Session() + self.session.query(User).filter_by(email='test@test.com').delete() + self.session.query(UserTransactions).delete() + self.session.commit() + + def test_transactions(self): + User.add_user("test@test.com", "any") + our_item = self.session.query(User).filter_by(email='test@test.com').first() + self.assertEqual(UserTransactions.get_user_netbalance(our_item.id), 0.0) + + UserTransactions.add_transaction(our_item.id, 0.025, "deposit") + self.assertEqual(UserTransactions.get_user_netbalance(our_item.id), 0.025) + + UserTransactions.add_transaction(our_item.id, 0.025, "deposit") + self.assertEqual(UserTransactions.get_user_netbalance(our_item.id), 0.05) + + UserTransactions.add_transaction(our_item.id, -0.025, "consume") + self.assertEqual(UserTransactions.get_user_netbalance(our_item.id), 0.025) + + UserTransactions.add_transaction(our_item.id, -0.025, "consume") + self.assertEqual(UserTransactions.get_user_netbalance(our_item.id), 0.0) + + +if __name__ == '__main__': + unittest.main() diff --git a/queques/__init__.py b/queques/__init__.py new file mode 100644 index 0000000..f82615a --- /dev/null +++ b/queques/__init__.py @@ -0,0 +1,94 @@ +import pika +import json +import time +import settings +from settings import logger + + +class Queue: + + # declare all the queues names in this var + QUEUES = ['default', 'test'] + + def __init__(self, host=settings.RABBIT["host"], + port=settings.RABBIT["port"], user=settings.RABBIT["user"], + passw=settings.RABBIT["passw"], json_serial=True): + self.json_serial = json_serial + + credentials = pika.PlainCredentials(user, passw) + parameters = pika.ConnectionParameters(host, port, '/', credentials) + + self.conn = pika.BlockingConnection( + pika.ConnectionParameters(host=host)) + self.channel = self.conn.channel() + for queue in self.QUEUES: + self.channel.queue_declare( + queue=queue, arguments={'x-max-priority': 10}) + + def __del__(self): + self.conn.close() + + @staticmethod + def _valid_queue_(name): + if name not in Queue.QUEUES: + raise ValueError('Undeclared queue name used: %s' % name) + + @staticmethod + def _encode(body): + return json.dumps(body) + + @staticmethod + def _decode(body): + return json.loads(body) + + def add(self, queue='default', body=None, priority=1): + self._valid_queue_(queue) + if body: + if self.json_serial: + body = self._encode(body) + self.channel.basic_publish( + exchange='', routing_key=queue, body=body, + properties=pika.BasicProperties(priority=priority)) + + def purge(self, queue): + self._valid_queue_(queue) + self.channel.queue_purge(queue) + + def get_message_count(self, queue): + self._valid_queue_(queue) + queue = self.channel.queue_declare( + queue=queue, arguments={'x-max-priority': 10}) + return int(queue.method.message_count) + + +class QueueConsumer(Queue): + + RECONNECTION_DELAY = 3 + + def __init__(self, queue='default', *args, **kwargs): + while True: + try: + super(QueueConsumer, self).__init__(*args, **kwargs) + self.channel.basic_consume( + queue=queue, on_message_callback=self.callback, + auto_ack=True) + print(' [*] Waiting for messages. To exit press CTRL+C') + self.channel.start_consuming() + # Don't recover if connection was closed by broker + except pika.exceptions.ConnectionClosedByBroker as ex: + logger.exception(ex) + break + # Don't recover on channel errors + except pika.exceptions.AMQPChannelError as ex: + logger.exception(ex) + break + # Recover on all other connection errors + except pika.exceptions.AMQPConnectionError as ex: + logger.exception(ex) + time.sleep(self.RECONNECTION_DELAY) + continue + + @staticmethod + def callback(ch, method, properties, body): + body = Queue._decode(body) + print(" [x] Received %r" % body) diff --git a/queques/tests.py b/queques/tests.py new file mode 100644 index 0000000..fd4705a --- /dev/null +++ b/queques/tests.py @@ -0,0 +1,48 @@ +import unittest +from queques import Queue, QueueConsumer +import pika +import time + + +class TestQueueMethods(unittest.TestCase): + + def setUp(self) -> None: + self.queue = Queue() + self.queue.purge("default") + + def test_add_count(self): + self.assertEqual(self.queue.get_message_count("default"), 0) + test_data = {"t1": 11} + self.queue.add(body=test_data) + time.sleep(0.2) + self.assertEqual(self.queue.get_message_count("default"), 1) + method_frame, header_frame, body = self.queue.channel.basic_get('default', auto_ack=True) + self.assertEqual(self.queue._decode(body), test_data) + self.assertEqual(self.queue.get_message_count("default"), 0) + + +class TestQueueConsumer(unittest.TestCase): + + def setUp(self) -> None: + self.queue = Queue() + self.queue.purge("default") + + def test_consumer(self): + class QTest(QueueConsumer): + + @staticmethod + def callback(ch, method, properties, body): + assert QTest._decode(body) == {"t1": 11} + raise pika.exceptions.ConnectionClosedByBroker("0", "Test") + + self.assertEqual(self.queue.get_message_count("default"), 0) + test_data = {"t1": 11} + self.queue.add(body=test_data) + time.sleep(0.2) + self.assertEqual(self.queue.get_message_count("default"), 1) + QTest() + self.assertEqual(self.queue.get_message_count("default"), 0) + + +if __name__ == '__main__': + unittest.main() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..5430ce2 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,9 @@ +pika==1.1.0 +SQLAlchemy==1.3.8 +redis==3.3.8 +flask==1.1.1 +Flask-Login==0.4.1 +base58==1.0.3 +ecdsa==0.13.3 +pycryptodome==3.9.1 +requests==2.22.0 diff --git a/run_tests.sh b/run_tests.sh new file mode 100755 index 0000000..da1ada1 --- /dev/null +++ b/run_tests.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +echo 'flush cache' +redis-cli flushall +echo 'init models' +PYTHONPATH=./ python database/models.py +echo 'btc-address gen' +PYTHONPATH=./ python services/btc_address_generator.py +echo 'start tests' +PYTHONPATH=./ python -m unittest diff --git a/services/__init__.py b/services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/services/btc_address_generator.py b/services/btc_address_generator.py new file mode 100644 index 0000000..a634a33 --- /dev/null +++ b/services/btc_address_generator.py @@ -0,0 +1,28 @@ +from crypto import RSATools +from crypto.btc import gen_btc_keys +from database.models import CryptoAddress +import database + + +# TODO: add some auto-grow conditions + +session = database.Session() +PASSWORD = "1234567890" +PUB_KEY_FILE = "public.pem" + + +RSATools.gen_keys(size=4028, passphrase=PASSWORD, pub_file=PUB_KEY_FILE) +rc = RSATools("public.pem", passphrase=PASSWORD) + + +def generate_address(amount=10): + global rc + for i in range(0, amount, 1): + keys = gen_btc_keys() + btc_add = CryptoAddress(public_key=keys["public"], private_key=rc.encrypt(keys["private"])) + session.add(btc_add) + session.commit() + + +if __name__ == "__main__": + generate_address(10) diff --git a/settings.py b/settings.py new file mode 100644 index 0000000..79c18b2 --- /dev/null +++ b/settings.py @@ -0,0 +1,59 @@ +import logging + + +DB = { + "engine": "sqlite", + "file": "///main.db", + "username": "", + "password": "", + "host": "", + "database": "" +} + +RABBIT = { + "host": "127.0.0.1", + "port": 5672, + "user": "guest", + "passw": "guest" +} + +CACHE = { + "host": "127.0.0.1", + "port": 6379 +} + +CRYPTO_GATEWAY_SERVER = "127.0.0.1:8081" + +LOG_LEVEL = logging.DEBUG + + +def setup_logger(level=LOG_LEVEL): + logger = logging.getLogger('main') + logger.setLevel(level) + fh = logging.FileHandler("service.log") + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - {%(pathname)s:%(lineno)d} - %(message)s') + fh.setFormatter(formatter) + logger.addHandler(fh) + return logger + + +logger = setup_logger() + +SERVER_NAME = "crwf-framework.io:8080" +SERVICE_NAME = "Crypto Ready Framework" + +IPN_AUTH = "IPN-Auth1" +SECRET = "s98fu3@98rhfjn3+98y0ryhf8ufqh87ytnaihw74h+" + +GOOGLE_CAPTCHA = { + "sitekey": "6Le4_OUUAAAAAJNUIto3woplV5VDLU96YumbU4MO", + "secret": "6Le4_OUUAAAAABIZXWcIeBRaYfUpNeEFRlIpiMAE" +} + +SMTP = { + "host": 'smtp.gmail.com', + "port": 465, + "user": "", + "password": "", + "default_sender": "noreply@test.com" +} diff --git a/webapp/__init__.py b/webapp/__init__.py new file mode 100644 index 0000000..d3a77b7 --- /dev/null +++ b/webapp/__init__.py @@ -0,0 +1,20 @@ +from flask import Flask, render_template +from settings import SERVER_NAME, GOOGLE_CAPTCHA, SERVICE_NAME + +app = Flask(__name__, static_url_path='') +app.secret_key = "iUHDAIYE(*W#ed0o9u013jsioajiohIUS+A9HDiu+7sag2diuw45489" +app.config['SERVER_NAME'] = SERVER_NAME + +import webapp.auth +import webapp.ipn +import webapp.json_api + + +@app.context_processor +def inject_template_globals(): + return dict(sitekey=GOOGLE_CAPTCHA["sitekey"], service_name=SERVICE_NAME, main_url=SERVER_NAME) + + +@app.route('/', endpoint="home") +def index(): + return render_template("base.html") diff --git a/webapp/auth.py b/webapp/auth.py new file mode 100644 index 0000000..063b95b --- /dev/null +++ b/webapp/auth.py @@ -0,0 +1,204 @@ +import re +import hashlib +import time +from flask import flash, session, request, redirect, url_for, render_template, g, abort +from webapp import app +from database.models import User +from core.utils.cached_objects import UserCH +import cache +from settings import logger, GOOGLE_CAPTCHA, SECRET +import requests as req + + +def web_login(user_name, password): + userid = User.login(user_name, password) + if not userid: + is_abuse_check(request.remote_addr, prefix="login", threshold=10, wait_time=60*60) + return False + if userid != -1: + flash("Login success!") + session["id"] = userid + return userid + + +@app.before_request +def load_user(): + if is_abuse_check(request.remote_addr, prefix="requests", threshold=1000, wait_time=3600): + abort(403, "IP abuse detected!") + if is_abuse_check(request.remote_addr, prefix="login", threshold=10, wait_time=3600, increment=False): + abort(403, "IP abuse detected!") + user_id = session.get("id") + if user_id: + g.user = UserCH(user_id) + else: + g.user = None + + +@app.route("/activate/", methods=["GET"], endpoint="auth.activate") +def activate(vcode): + if User.verify_user(vcode): + flash("Account activated!") + return redirect(url_for("home")) + + +@app.route("/login", methods=["GET", "POST"], endpoint="auth.login") +def login(): + if request.method == "POST": + user_name = request.form.get("username") + password = request.form.get("password") + next_page = request.form.get("next_page", url_for("home")) + captcha_response = request.form.get("g-recaptcha-response") + if not validate_captcha(captcha_response): + return render_template("base.html", error_login="Recaptcha Fail") + user = web_login(user_name, password) + if user == -1: + return render_template("base.html", error_login="Pending Account Activation!") + if not user: + return render_template("base.html", error_login="Invalid Credentials") + + return redirect(next_page) + else: + return render_template("base.html", error_login=None) + + +@app.route("/logout", methods=["GET"], endpoint="auth.logout") +def logout(): + del session["id"] + g.user = None + flash("Logout success!") + return redirect(url_for("home")) + + +def gen_forgot(id, tm=None): + if not tm: + tm = int(time.time()) + tm = str(tm) + data = "{}{}{}{}".format(id, SECRET, "salt-452341", tm) + data = data.encode() + return "{}/{}".format(hashlib.md5(data).hexdigest(), tm) + + +def valid_forgot_code(id, tm, code): + now = int(time.time()) + tm_int = int(tm) + # valid for only one hour + if now - tm_int > 3600: + flash("Expired password forgot code!") + logger.warning("Expired password forgot code! id: %s" % id) + return False + if gen_forgot(id, tm) != code: + flash("Invalid password forgot code!") + return False + return True + + +@app.route("/forgot", methods=["GET", "POST"], endpoint="auth.forgot") +def forgot(): + if request.method == "POST": + user_name = request.form.get("username") + if not re.match(r"[^@]+@[^@]+\.[^@]+", user_name): + return render_template("forgot.html", error="Invalid email address!") + next_page = request.form.get("next_page", url_for("home")) + captcha_response = request.form.get("g-recaptcha-response") + if not validate_captcha(captcha_response): + return render_template("forgot.html", error="Recaptcha Fail") + if is_abuse_check(request.remote_addr, prefix="forgot", threshold=10): + return render_template("forgot.html", error="Abuse detected by your IP address.") + try: + User.forgot(email=user_name) + except Exception as ex: + logger.exception(ex) + return render_template("forgot.html", error="Password Forgot Fail!") + return redirect(next_page) + else: + return render_template("forgot.html", error=None) + + +@app.route("/reset-auth///", methods=["GET", "POST"], endpoint="auth.reset") +def reset(uid, hash, htime): + if valid_forgot_code(uid, htime, "{}/{}".format(hash, htime)): + if request.method == "POST": + password = request.form.get("password") + password2 = request.form.get("password2") + if password != password2: + return render_template("reset.html", error="Password Confirmation Error!") + if not validate_password(password): + return render_template("reset.html", error="Password length should be between 8 and 30 characters.") + captcha_response = request.form.get("g-recaptcha-response") + if not validate_captcha(captcha_response): + return render_template("reset.html", error="Recaptcha Fail") + if is_abuse_check(request.remote_addr, prefix="reset", threshold=5): + return render_template("reset.html", error="Abuse detected by your IP address.") + if User.reset_user_password(uid, password): + flash("Password Reset Success!") + return redirect(url_for("home")) + else: + return render_template("reset.html", error="Password Reset Fail!") + else: + return render_template("reset.html", error=None) + else: + return render_template("reset.html", error="Invalid Reset Code") + + +@app.route("/register", methods=["GET", "POST"], endpoint="auth.register") +def register(): + if request.method == "POST": + user_name = request.form.get("username") + if not re.match(r"[^@]+@[^@]+\.[^@]+", user_name): + return render_template("register.html", error="Invalid email address!") + password = request.form.get("password") + password2 = request.form.get("password2") + if password != password2: + return render_template("register.html", error="Password Confirmation Error!") + if not validate_password(password): + return render_template("register.html", error="Password length should be between 8 and 30 characters.") + next_page = request.form.get("next_page", url_for("home")) + captcha_response = request.form.get("g-recaptcha-response") + if not validate_captcha(captcha_response): + return render_template("register.html", error="Recaptcha Fail") + if is_abuse_check(request.remote_addr, prefix="register", threshold=10): + return render_template("register.html", error="Abuse detected by your IP address.") + try: + User.add_user(email=user_name, password=password) + except Exception as ex: + logger.exception(ex) + return render_template("register.html", error="Register Fail!") + user = web_login(user_name, password) + if not user: + return render_template("register.html", error="Register Fail!") + flash('Check your email to activate account.') + return redirect(next_page) + else: + return render_template("register.html", error=None) + + +def validate_captcha(response): + url = "https://www.google.com/recaptcha/api/siteverify" + data = { + "secret": GOOGLE_CAPTCHA["secret"], + "response": response + } + resp = req.post(url=url, data=data).json() + if resp.get("success") == True: + return True + return False + + +def validate_password(password): + return 8 <= len(password) <= 30 + + +def is_abuse_check(id, prefix="default", threshold=5, wait_time=12*60*60, increment=True): + key = "abuse_check/{}/{}".format(prefix, id) + result = 0 + if increment: + result = cache.redis_con.incr(key) + cache.redis_con.expire(key, wait_time) + else: + try: + result = int(cache.redis_con.get(key)) + except TypeError: + result = 0 + if result >= threshold: + return True + return False diff --git a/webapp/ipn.py b/webapp/ipn.py new file mode 100644 index 0000000..908be98 --- /dev/null +++ b/webapp/ipn.py @@ -0,0 +1,40 @@ +from flask import abort, request, jsonify +from webapp import app +import database +from database.models import UserTransactions, CryptoAddress +from settings import logger, IPN_AUTH + + +@app.route("/ipn", methods=["GET", "POST"], endpoint="ipn.crypto_in") +def crypto_in(): + if request.method == "POST": + auth = request.form.get("ipn_auth") + if auth != IPN_AUTH: + abort(401) + address = request.form.get("address") + confirmed = float(request.form.get("confirmed")) + unconfirmed = float(request.form.get("unconfirmed")) + logger.warning("IPN address {} -- confirmed {} -- unconfirmed {}".format(address, confirmed, unconfirmed)) + session = database.Session(autocommit=False) + user = CryptoAddress.get_address_user(address=address, session=session) + if user: + logger.warning("IPN for user {} -- address {}".format(user, address)) + dep = UserTransactions.get_user_netdeposits(user, session=session) + if confirmed > dep: + UserTransactions.add_transaction(user, confirmed-dep, "deposit", reference="IPN", session=session) + logger.warning("Deposit confirmed! user {} -- address {} -- amount {}".format(user, address, confirmed-dep)) + else: + logger.warning("Confirmed is lower than net deposit yet. User {} -- address {} -- conf {} -- dep {} " + .format(user, address, confirmed, dep)) + else: + logger.error("Address {} don't match any user.".format(address)) + data = { + "address": address, + "confirmed": confirmed, + "unconfirmed": unconfirmed, + "ipn_auth": auth + } + return jsonify(data) + else: + logger.error("Invalid request at IPN url!") + abort(401) diff --git a/webapp/json_api.py b/webapp/json_api.py new file mode 100644 index 0000000..3c81e82 --- /dev/null +++ b/webapp/json_api.py @@ -0,0 +1,19 @@ +from flask import g, jsonify, abort +from webapp import app +from settings import logger +from database.models import User + + +@app.route("/api/btc_address", methods=["GET"], endpoint="api.btc_address") +def btc_address(): + if g.user: + address = g.user.btc_address() + if not address: + User.link_crypto_address(g.user.id) + address = g.user.btc_address() + data = { + "btc": address + } + return jsonify(data) + else: + abort(403, "Login Required!") diff --git a/webapp/run.py b/webapp/run.py new file mode 100644 index 0000000..81afda8 --- /dev/null +++ b/webapp/run.py @@ -0,0 +1,6 @@ + +from webapp import app + + +if __name__ == "__main__": + app.run(debug=True, port=8080) diff --git a/webapp/static/assets/css/fontawesome-all.min.css b/webapp/static/assets/css/fontawesome-all.min.css new file mode 100644 index 0000000..b7d052b --- /dev/null +++ b/webapp/static/assets/css/fontawesome-all.min.css @@ -0,0 +1,5 @@ +/*! + * 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/webapp/static/assets/css/images/bg.png b/webapp/static/assets/css/images/bg.png new file mode 100644 index 0000000..b8f65cb Binary files /dev/null and b/webapp/static/assets/css/images/bg.png differ diff --git a/webapp/static/assets/css/main.css b/webapp/static/assets/css/main.css new file mode 100644 index 0000000..eb7598f --- /dev/null +++ b/webapp/static/assets/css/main.css @@ -0,0 +1,2912 @@ +@import url("fontawesome-all.min.css"); +@import url("https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,700,900,300italic"); + +/* + Dopetrope by HTML5 UP + html5up.net | @ajlkn + Free for personal and commercial use under the CCA 3.0 license (html5up.net/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: #252122; + background-image: url("/images/bg02.png"); + } + + 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, textarea, select { + font-family: 'Source Sans Pro'; + font-weight: 300; + color: #5d5d5d; + font-size: 14pt; + line-height: 1.75em; + } + + strong, b { + color: #252122; + font-weight: 400; + } + + i, em { + font-style: italic; + } + + sub { + position: relative; + top: 0.5em; + font-size: 0.8em; + } + + sup { + position: relative; + top: -0.5em; + font-size: 0.8em; + } + + blockquote { + border-left: solid 0.75em #dddddd; + padding: 1em 0 1em 1.5em; + font-style: italic; + } + + h1, h2, h3, h4, h5, h6 { + color: #252122; + font-weight: 700; + } + + h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + color: inherit; + text-decoration: none; + } + + h2 { + font-size: 1.5em; + } + + h3 { + font-size: 1.35em; + } + + a { + color: #d52349; + text-decoration: underline; + } + + a:hover { + text-decoration: none; + } + + br.clear { + clear: both; + } + + hr { + border: 0; + border-top: solid 1px #dddddd; + height: 1px; + margin: 2em 0 2em 0; + } + + p, ul, ol, dl, table { + margin-bottom: 2em; + } + +/* Container */ + + .container { + margin: 0 auto; + max-width: 100%; + width: 70em; + } + + @media screen and (max-width: 1680px) { + + .container { + width: 70em; + } + + } + + @media screen and (max-width: 1280px) { + + .container { + width: calc(100% - 60px); + } + + } + + @media screen and (max-width: 980px) { + + .container { + width: calc(100% - 80px); + } + + } + + @media screen and (max-width: 736px) { + + .container { + width: calc(100% - 40px); + } + + } + +/* 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-xlarge { + order: -1; + } + + .row > .col-1-xlarge { + width: 8.33333%; + } + + .row > .off-1-xlarge { + margin-left: 8.33333%; + } + + .row > .col-2-xlarge { + width: 16.66667%; + } + + .row > .off-2-xlarge { + margin-left: 16.66667%; + } + + .row > .col-3-xlarge { + width: 25%; + } + + .row > .off-3-xlarge { + margin-left: 25%; + } + + .row > .col-4-xlarge { + width: 33.33333%; + } + + .row > .off-4-xlarge { + margin-left: 33.33333%; + } + + .row > .col-5-xlarge { + width: 41.66667%; + } + + .row > .off-5-xlarge { + margin-left: 41.66667%; + } + + .row > .col-6-xlarge { + width: 50%; + } + + .row > .off-6-xlarge { + margin-left: 50%; + } + + .row > .col-7-xlarge { + width: 58.33333%; + } + + .row > .off-7-xlarge { + margin-left: 58.33333%; + } + + .row > .col-8-xlarge { + width: 66.66667%; + } + + .row > .off-8-xlarge { + margin-left: 66.66667%; + } + + .row > .col-9-xlarge { + width: 75%; + } + + .row > .off-9-xlarge { + margin-left: 75%; + } + + .row > .col-10-xlarge { + width: 83.33333%; + } + + .row > .off-10-xlarge { + margin-left: 83.33333%; + } + + .row > .col-11-xlarge { + width: 91.66667%; + } + + .row > .off-11-xlarge { + margin-left: 91.66667%; + } + + .row > .col-12-xlarge { + width: 100%; + } + + .row > .off-12-xlarge { + 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: 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-large { + order: -1; + } + + .row > .col-1-large { + width: 8.33333%; + } + + .row > .off-1-large { + margin-left: 8.33333%; + } + + .row > .col-2-large { + width: 16.66667%; + } + + .row > .off-2-large { + margin-left: 16.66667%; + } + + .row > .col-3-large { + width: 25%; + } + + .row > .off-3-large { + margin-left: 25%; + } + + .row > .col-4-large { + width: 33.33333%; + } + + .row > .off-4-large { + margin-left: 33.33333%; + } + + .row > .col-5-large { + width: 41.66667%; + } + + .row > .off-5-large { + margin-left: 41.66667%; + } + + .row > .col-6-large { + width: 50%; + } + + .row > .off-6-large { + margin-left: 50%; + } + + .row > .col-7-large { + width: 58.33333%; + } + + .row > .off-7-large { + margin-left: 58.33333%; + } + + .row > .col-8-large { + width: 66.66667%; + } + + .row > .off-8-large { + margin-left: 66.66667%; + } + + .row > .col-9-large { + width: 75%; + } + + .row > .off-9-large { + margin-left: 75%; + } + + .row > .col-10-large { + width: 83.33333%; + } + + .row > .off-10-large { + margin-left: 83.33333%; + } + + .row > .col-11-large { + width: 91.66667%; + } + + .row > .off-11-large { + margin-left: 91.66667%; + } + + .row > .col-12-large { + width: 100%; + } + + .row > .off-12-large { + 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: 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-medium { + order: -1; + } + + .row > .col-1-medium { + width: 8.33333%; + } + + .row > .off-1-medium { + margin-left: 8.33333%; + } + + .row > .col-2-medium { + width: 16.66667%; + } + + .row > .off-2-medium { + margin-left: 16.66667%; + } + + .row > .col-3-medium { + width: 25%; + } + + .row > .off-3-medium { + margin-left: 25%; + } + + .row > .col-4-medium { + width: 33.33333%; + } + + .row > .off-4-medium { + margin-left: 33.33333%; + } + + .row > .col-5-medium { + width: 41.66667%; + } + + .row > .off-5-medium { + margin-left: 41.66667%; + } + + .row > .col-6-medium { + width: 50%; + } + + .row > .off-6-medium { + margin-left: 50%; + } + + .row > .col-7-medium { + width: 58.33333%; + } + + .row > .off-7-medium { + margin-left: 58.33333%; + } + + .row > .col-8-medium { + width: 66.66667%; + } + + .row > .off-8-medium { + margin-left: 66.66667%; + } + + .row > .col-9-medium { + width: 75%; + } + + .row > .off-9-medium { + margin-left: 75%; + } + + .row > .col-10-medium { + width: 83.33333%; + } + + .row > .off-10-medium { + margin-left: 83.33333%; + } + + .row > .col-11-medium { + width: 91.66667%; + } + + .row > .off-11-medium { + margin-left: 91.66667%; + } + + .row > .col-12-medium { + width: 100%; + } + + .row > .off-12-medium { + 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: 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-small { + order: -1; + } + + .row > .col-1-small { + width: 8.33333%; + } + + .row > .off-1-small { + margin-left: 8.33333%; + } + + .row > .col-2-small { + width: 16.66667%; + } + + .row > .off-2-small { + margin-left: 16.66667%; + } + + .row > .col-3-small { + width: 25%; + } + + .row > .off-3-small { + margin-left: 25%; + } + + .row > .col-4-small { + width: 33.33333%; + } + + .row > .off-4-small { + margin-left: 33.33333%; + } + + .row > .col-5-small { + width: 41.66667%; + } + + .row > .off-5-small { + margin-left: 41.66667%; + } + + .row > .col-6-small { + width: 50%; + } + + .row > .off-6-small { + margin-left: 50%; + } + + .row > .col-7-small { + width: 58.33333%; + } + + .row > .off-7-small { + margin-left: 58.33333%; + } + + .row > .col-8-small { + width: 66.66667%; + } + + .row > .off-8-small { + margin-left: 66.66667%; + } + + .row > .col-9-small { + width: 75%; + } + + .row > .off-9-small { + margin-left: 75%; + } + + .row > .col-10-small { + width: 83.33333%; + } + + .row > .off-10-small { + margin-left: 83.33333%; + } + + .row > .col-11-small { + width: 91.66667%; + } + + .row > .off-11-small { + margin-left: 91.66667%; + } + + .row > .col-12-small { + width: 100%; + } + + .row > .off-12-small { + 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: -5px; + margin-left: -5px; + } + + .row.gtr-25 > * { + padding: 5px 0 0 5px; + } + + .row.gtr-25.gtr-uniform { + margin-top: -5px; + } + + .row.gtr-25.gtr-uniform > * { + padding-top: 5px; + } + + .row.gtr-50 { + margin-top: -10px; + margin-left: -10px; + } + + .row.gtr-50 > * { + padding: 10px 0 0 10px; + } + + .row.gtr-50.gtr-uniform { + margin-top: -10px; + } + + .row.gtr-50.gtr-uniform > * { + padding-top: 10px; + } + + .row { + margin-top: -20px; + margin-left: -20px; + } + + .row > * { + padding: 20px 0 0 20px; + } + + .row.gtr-uniform { + margin-top: -20px; + } + + .row.gtr-uniform > * { + padding-top: 20px; + } + + .row.gtr-150 { + margin-top: -30px; + margin-left: -30px; + } + + .row.gtr-150 > * { + padding: 30px 0 0 30px; + } + + .row.gtr-150.gtr-uniform { + margin-top: -30px; + } + + .row.gtr-150.gtr-uniform > * { + padding-top: 30px; + } + + .row.gtr-200 { + margin-top: -40px; + margin-left: -40px; + } + + .row.gtr-200 > * { + padding: 40px 0 0 40px; + } + + .row.gtr-200.gtr-uniform { + margin-top: -40px; + } + + .row.gtr-200.gtr-uniform > * { + padding-top: 40px; + } + + } + +/* Form */ + + form label { + display: block; + color: #252122; + font-weight: 400; + margin: 0 0 0.5em 0; + } + + form input[type=text], + form input[type=email], + form input[type=password], + form select, + form textarea { + -webkit-appearance: none; + display: block; + border: 0; + padding: 0.75em 1em; + font-size: 1em; + border-radius: 5px; + border: solid 1px #dddddd; + background: #fff; + width: 100%; + } + + form input[type=text]:focus, + form input[type=email]:focus, + form input[type=password]:focus, + form select:focus, + form textarea:focus { + box-shadow: inset 0px 0px 1px 1px #43bff0; + } + + form textarea { + height: 15em; + } + + form ::-webkit-input-placeholder { + color: #555 !important; + } + + form :-moz-placeholder { + color: #555 !important; + } + + form ::-moz-placeholder { + color: #555 !important; + } + + form :-ms-input-placeholder { + color: #555 !important; + } + + form ::-moz-focus-inner { + border: 0; + } + +/* Tables */ + + table { + width: 100%; + } + + table tr { + border-top: solid 1px #dddddd; + } + + table tr:first-child { + border-top: 0; + } + + table td { + padding: 0.5em 1em 0.5em 1em; + } + + table th { + text-align: left; + padding: 0.5em 1em 0.5em 1em; + font-weight: 700; + margin: 0 0 1em 0; + } + + table thead { + border-bottom: solid 2px #dddddd; + } + +/* Section/Article */ + + section, article { + margin-bottom: 2.5em; + } + + section > :last-child, section:last-child, article > :last-child, article:last-child { + margin-bottom: 0; + } + + header { + margin: 0 0 1.5em 0; + } + + header > p { + display: block; + font-style: italic; + margin: 0.5em 0 0 0; + padding-bottom: 0.5em; + } + + header.major { + position: relative; + text-align: center; + border-top: solid 1px #ccc; + top: 1em; + margin: 0 0 3em 0; + } + + header.major h2 { + background: #fff; + position: relative; + top: -0.65em; + display: inline; + margin: 0; + padding: 0 1em 0 1em; + } + + footer { + margin: 2.25em 0 0 0; + } + +/* Box */ + + .box { + background: #ffffff; + border-bottom: solid 1px #ccc; + padding: 2.75em 1.75em 2.75em 1.75em; + } + + .box .image.featured { + position: relative; + width: auto; + left: 1.75em; + top: 1.75em; + margin: -4.5em 0 4.25em -3.5em; + } + + .box.post header { + padding-top: 1em; + margin: 0 0 2em 0; + } + + .box.post h2 { + font-size: 2.5em; + letter-spacing: -0.015em; + } + + .box.post header > p { + margin-top: 1.25em; + font-size: 1.25em; + } + + .box footer ul.actions { + margin-bottom: 0; + } + +/* Button */ + + input[type="button"], + input[type="submit"], + input[type="reset"], + button, + .button { + -webkit-appearance: none; + display: inline-block; + text-decoration: none; + cursor: pointer; + border: 0; + border-radius: 5px; + background: #d52349; + color: #fff !important; + font-weight: 700; + outline: 0; + font-size: 1.1em; + padding: 0.65em 1.5em 0.65em 1.5em; + text-align: center; + -moz-transition: background-color .25s ease-in-out; + -webkit-transition: background-color .25s ease-in-out; + -ms-transition: background-color .25s ease-in-out; + transition: background-color .25s ease-in-out; + } + + input[type="button"]:hover, + input[type="submit"]:hover, + input[type="reset"]:hover, + button:hover, + .button:hover { + background: #e53359; + } + + input[type="button"]:active, + input[type="submit"]:active, + input[type="reset"]:active, + button:active, + .button:active { + background: #c51349; + } + + input[type="button"].alt, + input[type="submit"].alt, + input[type="reset"].alt, + button.alt, + .button.alt { + background: #252122; + } + + input[type="button"].alt:hover, + input[type="submit"].alt:hover, + input[type="reset"].alt:hover, + button.alt:hover, + .button.alt:hover { + background: #353132; + } + + input[type="button"].alt:active, + input[type="submit"].alt:active, + input[type="reset"].alt:active, + button.alt:active, + .button.alt:active { + background: #151112; + } + + input[type="button"].icon:before, + input[type="submit"].icon:before, + input[type="reset"].icon:before, + button.icon:before, + .button.icon:before { + opacity: 0.35; + position: relative; + top: 0.05em; + margin-right: 0.75em; + } + + input[type="button"].large, + input[type="submit"].large, + input[type="reset"].large, + button.large, + .button.large { + font-size: 1.5em; + padding: 0.75em 1.5em 0.75em 1.5em; + } + +/* Image */ + + .image { + display: inline-block; + outline: 0; + } + + .image img { + display: block; + width: 100%; + } + + .image.centered { + display: block; + margin: 0 0 2em 0; + } + + .image.centered img { + margin: 0 auto; + width: auto; + } + + .image.featured { + display: block; + width: 100%; + margin: 0 0 2em 0; + } + + .image.left { + float: left; + margin: 0 2em 2em 0; + } + +/* List */ + + ul { + list-style: disc; + padding-left: 1em; + } + + ul li { + padding-left: 0.5em; + } + + ol { + list-style: decimal; + padding-left: 1.25em; + } + + ol li { + padding-left: 0.25em; + } + +/* Actions */ + + ul.actions { + list-style: none; + padding-left: 0; + } + + ul.actions li { + display: inline-block; + margin-left: 1em; + padding-left: 0; + } + + ul.actions li:first-child { + margin-left: 0; + } + +/* Links */ + + ul.links { + list-style: none; + padding-left: 0; + } + + ul.links li { + display: inline-block; + border-left: solid 1px rgba(255, 255, 255, 0.05); + padding: 0 0 0 1em; + margin: 0 0 0 1em; + } + + ul.links li:first-child { + border-left: 0; + padding-left: 0; + margin-left: 0; + } + +/* Contact */ + + ul.contact { + list-style: none; + padding-left: 0; + } + + ul.contact li { + position: relative; + border-top: solid 1px #ddd; + padding: 1.3em 0 1.3em 7em; + } + + ul.contact li h3 { + position: absolute; + left: 0; + top: 1.3em; + font-size: 1.1em; + } + + ul.contact li p { + margin: 0; + } + + ul.contact li:first-child { + padding-top: 0; + border-top: 0; + } + + ul.contact li:first-child h3 { + top: 0; + } + +/* Dates */ + + ul.dates { + list-style: none; + padding-left: 0; + } + + ul.dates li { + position: relative; + border-top: solid 1px #ddd; + padding: 1.3em 0 1.3em 6.75em; + } + + ul.dates .date { + display: block; + position: absolute; + left: 0; + top: 1.3em; + background-color: #d52349; + height: 3.5em; + text-align: center; + color: #fff; + line-height: 1em; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + padding: 0.5em 0.75em 0 1em; + } + + ul.dates .date:after { + content: ''; + position: absolute; + bottom: 0; + right: -1.2em; + border-left: solid 1.25em #d52349; + border-top: solid 1.8em transparent; + border-bottom: solid 1.8em transparent; + } + + ul.dates .date strong { + display: block; + font-size: 1.75em; + padding-top: 0.15em; + } + + ul.dates h3 { + font-size: 1.1em; + } + + ul.dates p { + margin: 0; + } + + ul.dates li:first-child { + border-top: 0; + padding-top: 0; + } + + ul.dates li:first-child .date { + top: 0; + } + +/* Divided */ + + ul.divided { + list-style: none; + padding-left: 0; + } + + ul.divided li { + border-top: solid 1px #ddd; + padding: 1em 0 1em 0; + } + + ul.divided li:first-child { + border-top: 0; + padding-top: 0; + } + +/* Social */ + + ul.social { + list-style: none; + padding-left: 0; + overflow: hidden; + cursor: default; + margin: 0 0 3.25em 0; + } + + ul.social li { + display: inline-block; + padding-left: 0; + margin-left: 0.75em; + } + + ul.social li:first-child { + margin-left: 0; + } + + ul.social li a { + display: inline-block; + width: 3em; + height: 3em; + text-align: center; + border-radius: 5px; + background: #888; + -moz-transition: background-color .25s ease-in-out; + -webkit-transition: background-color .25s ease-in-out; + -ms-transition: background-color .25s ease-in-out; + transition: background-color .25s ease-in-out; + } + + ul.social li a:before { + color: #fff; + font-size: 2em; + line-height: 1.5em; + } + + ul.social li a.fa-facebook { + background: #3c5a98; + } + + ul.social li a.fa-facebook:hover { + background: #4c6aa8; + } + + ul.social li a.fa-twitter { + background: #2daae4; + } + + ul.social li a.fa-twitter:hover { + background: #3dbaf4; + } + + ul.social li a.fa-dribbble { + background: #c4376b; + } + + ul.social li a.fa-dribbble:hover { + background: #d4477b; + } + + ul.social li a.fa-linkedin { + background: #006599; + } + + ul.social li a.fa-linkedin:hover { + background: #1075a9; + } + + ul.social li a.fa-tumblr { + background: #2b4661; + } + + ul.social li a.fa-tumblr:hover { + background: #3b5671; + } + + ul.social li a.fa-google-plus { + background: #da2713; + } + + ul.social li a.fa-google-plus:hover { + background: #ea3723; + } + +/* Icons */ + + .icon { + text-decoration: none; + position: relative; + text-decoration: none; + } + + .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.brands:before { + font-family: 'Font Awesome 5 Brands'; + } + + .icon:before { + line-height: inherit; + } + + .icon > .label { + display: none; + } + + .icon.featured { + position: relative; + display: inline-block; + background-color: #d52349; + width: 9em; + padding: 1.75em 0 0.75em 0; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + margin: 0 0 4.5em 0; + cursor: default; + } + + .icon.featured:before { + font-size: 4.5em; + line-height: 1em; + color: #fff; + } + + .icon.featured:after { + content: ''; + position: absolute; + bottom: -1.95em; + left: 0; + border-top: solid 2em #d52349; + border-left: solid 4.5em transparent; + border-right: solid 4.5em transparent; + } + + .icon.featured.alt { + background-color: #252122; + } + + .icon.featured.alt:after { + border-top-color: #252122; + } + + .icon.featured.alt2 { + background-color: #827a7c; + } + + .icon.featured.alt2:after { + border-top-color: #827a7c; + } + +/* Page Wrapper */ + + #page-wrapper > section { + margin-bottom: 0; + } + +/* Header */ + + #header { + position: relative; + background: #ffffff; + border-bottom: solid 1px #ccc; + padding: 5em 0 4em 0; + text-align: center; + } + + #header h1 { + color: #252122; + font-weight: 900; + font-size: 2.5em; + letter-spacing: -0.035em; + line-height: 1; + } + +/* Nav */ + + #nav { + margin: 2.5em 0 0 0; + } + + #nav > ul { + margin: 0; + } + + #nav > ul > li { + display: inline-block; + font-style: italic; + margin: 0 0.35em 0 0.35em; + } + + #nav > ul > li > ul { + display: none; + } + + #nav > ul > li > a { + border-radius: 5px; + color: #5d5d5d; + text-decoration: none; + padding: 0.6em 1.2em 0.6em 1.2em; + -moz-transition: background-color .25s ease-in-out; + -webkit-transition: background-color .25s ease-in-out; + -ms-transition: background-color .25s ease-in-out; + transition: background-color .25s ease-in-out; + outline: 0; + } + + #nav > ul > li:hover > a, #nav > ul > li.active > a { + background: #f3f3f3; + } + + #nav > ul > li.current > a { + background: #d52349; + color: #fff !important; + font-weight: 700; + } + + .dropotron { + border-radius: 5px; + background-color: #252122; + background-color: rgba(34, 30, 31, 0.98); + padding: 1.25em 1.5em 1.25em 1.5em; + font-style: italic; + min-width: 13em; + box-shadow: 0px 8px 15px 0px rgba(0, 0, 0, 0.5); + text-align: left; + margin-top: -1.25em; + margin-left: -1px; + list-style: none; + } + + .dropotron a, .dropotron span { + color: #aaa; + text-decoration: none; + -moz-transition: color .25s ease-in-out; + -webkit-transition: color .25s ease-in-out; + -ms-transition: color .25s ease-in-out; + transition: color .25s ease-in-out; + } + + .dropotron li { + padding: 0.25em 0 0.25em 0; + } + + .dropotron li:hover > a, .dropotron li:hover > span { + color: #fff; + } + + .dropotron.level-0 { + margin-top: 2em; + } + + .dropotron.level-0:before { + content: ''; + display: block; + position: absolute; + left: 50%; + margin-left: -10px; + top: -9px; + border-left: solid 10px transparent; + border-right: solid 10px transparent; + border-bottom: solid 10px #252122; + border-bottom-color: rgba(34, 30, 31, 0.98); + } + +/* Banner */ + + #banner { + background: #CCE8F4 url("../../images/pic01.jpg"); + background-position: center center; + background-size: auto 100%; + background-repeat: no-repeat; + text-align: center; + position: relative; + padding: 8em 0; + margin: 4em 0 0 0; + } + + #banner header { + background-color: rgba(34, 30, 31, 0.98); + display: inline-block; + padding: 2.5em 5em; + border-radius: 5px; + } + + #banner header h2 { + color: #fff; + font-weight: 700; + font-size: 2.5em; + margin: 0 0 0.65em 0; + } + + #banner header p { + color: #d52349; + padding: 0; + font-style: normal; + margin: 0; + font-size: 1.5em; + } + +/* Intro */ + + #intro { + text-align: center; + overflow: hidden; + } + + #intro section { + margin: 3em 0; + padding: 2.5em 0; + } + + #intro h2 { + font-size: 1.75em; + } + + #intro p { + margin: 0; + } + + #intro .middle { + position: relative; + z-index: 1; + } + + #intro .middle:before { + content: ''; + width: 32px; + height: 100%; + position: absolute; + left: -24px; + top: 0; + display: block; + z-index: -1; + box-shadow: 32px 0 0 0 #fff, 0 -32px 0 0 #fff, 0 32px 0 0 #fff, 32px 32px 0 0 #fff, 32px -32px 0 0 #fff, 0 0 32px 0 rgba(0, 0, 0, 0.15); + } + + #intro .middle:after { + content: ''; + width: 32px; + height: 100%; + position: absolute; + right: -24px; + top: 0; + display: block; + z-index: -1; + box-shadow: -32px 0 0 0 #fff, 0 -32px 0 0 #fff, 0 32px 0 0 #fff, -32px 32px 0 0 #fff, -32px -32px 0 0 #fff, 0 0 32px 0 rgba(0, 0, 0, 0.15); + } + + #intro .button { + min-width: 12em; + } + + #intro footer { + margin: 0; + } + +/* Main */ + + #main { + position: relative; + background: #f7f7f7 url("/images/bg02.png"); + padding: 4em 0 4em 0; + } + + #main:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + background: url("/images/bg01.png"); + background-size: 100% 100%; + z-index: 0; + opacity: 0.1; + } + + #main .major h2 { + background: #f7f7f7 url("/images/bg02.png"); + } + +/* Footer */ + + #footer { + position: relative; + color: #858484; + padding: 4em 0; + } + + #footer:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + background: url("/images/bg01.png"); + background-size: 100% 100%; + z-index: 0; + opacity: 0.5; + } + + #footer a { + color: #c5c4c4; + } + + #footer h2, #footer h3, #footer h4, #footer h5, #footer h6, #footer strong, #footer b { + color: #fff; + } + + #footer h2 a, #footer h3 a, #footer h4 a, #footer h5 a, #footer h6 a, #footer strong a, #footer b a { + color: inherit; + } + + #footer ul.contact li, + #footer ul.dates li, + #footer ul.divided li { + border-top-color: #353434; + border-top-color: rgba(255, 255, 255, 0.05); + } + + #footer header { + margin: 0 0 3em 0; + } + + #footer header h2 { + font-size: 1.75em; + } + +/* Copyright */ + + #copyright { + text-align: center; + margin: 3em 0 2em 0; + } + + #copyright ul.links { + display: inline-block; + background: #2C2929; + background: rgba(255, 255, 255, 0.05); + border-radius: 5px; + margin: 0; + padding: 0.85em 2.25em 0.85em 2.25em; + } + +/* XLarge */ + + @media screen and (max-width: 1680px) { + + /* Basic */ + + body, input, textarea, select { + font-size: 12pt; + } + + } + +/* Large */ + + @media screen and (max-width: 1280px) { + + /* Basic */ + + body, input, textarea, select { + font-size: 11pt; + } + + /* Section/Article */ + + header.major { + margin: 0.75em 0 2.5em 0; + } + + header.major h2 { + padding: 0 1em 0 1em; + } + + /* Social */ + + ul.social li { + margin: 0 0 0.25em 0.75em; + } + + /* Header */ + + #header { + padding: 4em 0 3em 0; + } + + /* Banner */ + + #banner { + padding: 6em 0; + margin: 3em 0 0 0; + } + + /* Intro */ + + #intro { + padding: 0; + } + + #intro section { + padding: 1em 2em; + } + + #intro .middle:before { + left: -12px; + } + + #intro .middle:after { + right: -12px; + } + + /* Main */ + + #main { + padding: 30px 0; + } + + /* Footer */ + + #footer { + padding: 3em 0; + } + + #footer:before { + height: 2.5em; + } + + #footer header { + margin: 0 0 1.5em 0; + } + + #footer header h2 { + font-size: 1.25em; + } + + /* Copyright */ + + #copyright { + margin: 0; + } + + } + +/* Medium */ + + #navPanel, #titleBar { + display: none; + } + + @media screen and (max-width: 980px) { + + /* Basic */ + + html, body { + overflow-x: hidden; + } + + /* Box */ + + .box footer ul.actions li { + margin: 1em 0 0 0; + display: block; + } + + .box footer ul.actions li .button { + width: 100%; + } + + .box footer ul.actions li:first-child { + margin-top: 0; + } + + /* Header */ + + #header { + padding: 3.5em 0 3em 0; + } + + /* Nav */ + + #nav { + display: none; + } + + /* Intro */ + + #intro { + padding: 3em 0 0 0; + } + + #intro section { + position: relative; + border-top: solid 1px #dfdfdf; + margin: 0; + padding: 40px 0 0 0; + } + + #intro section.first { + border-top: 0; + padding-top: 0; + } + + #intro section p { + margin: 0; + } + + #intro .middle:before, #intro .middle:after { + display: none; + } + + #intro footer { + padding: 3em 0 0 0; + } + + #intro footer ul.actions { + margin-bottom: 0; + } + + /* Main */ + + #main { + padding: 40px 0; + } + + /* Copyright */ + + #copyright ul.links { + display: block; + } + + /* 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; + } + + #titleBar { + -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: 44px; + left: 0; + position: fixed; + top: 0; + width: 100%; + z-index: 10001; + background: none; + } + + #titleBar .toggle { + text-decoration: none; + width: 80px; + height: 60px; + } + + #titleBar .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; + } + + #titleBar .toggle:before { + content: '\f0c9'; + display: block; + position: absolute; + left: 10px; + top: 10px; + width: 50px; + height: 40px; + line-height: 40px; + font-size: 18px; + color: #fff; + text-align: center; + background: rgba(150, 150, 150, 0.75); + border-radius: 5px; + } + + #titleBar .toggle:active:before { + background-color: #969696; + } + + #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; + color: #858484; + background-image: url("/images/bg02.png"); + box-shadow: inset -3px 0px 5px 0px rgba(0, 0, 0, 0.35); + } + + #navPanel .link { + display: block; + color: #888; + text-decoration: none; + height: 44px; + line-height: 44px; + border-top: solid 1px rgba(255, 255, 255, 0.05); + padding: 0 1em 0 1em; + font-style: italic; + } + + #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; + } + + #navPanel .depth-0 { + color: #fff; + } + + body.navPanel-visible #page-wrapper { + -moz-transform: translateX(275px); + -webkit-transform: translateX(275px); + -ms-transform: translateX(275px); + transform: translateX(275px); + } + + body.navPanel-visible #titleBar { + -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); + } + + } + +/* Small */ + + @media screen and (max-width: 736px) { + + /* Basic */ + + body, input, textarea, select { + font-size: 11pt; + } + + h2, h3, h4, h5, h6 { + font-size: 1.25em; + } + + /* Button */ + + input[type="button"].large, + input[type="submit"].large, + input[type="reset"].large, + button.large, + .button.large { + font-size: 1.1em; + padding: 0.65em 1.5em 0.65em 1.5em; + } + + /* Actions */ + + ul.actions li { + margin: 1em 0 0 0; + display: block; + } + + ul.actions li .button { + width: 100%; + } + + ul.actions li:first-child { + margin-top: 0; + } + + /* Section/Article */ + + section, article { + margin-bottom: 20px; + } + + header { + margin: 0 0 1em 0; + } + + footer { + margin: 2em 0 0 0; + } + + /* Box */ + + .box { + padding: 25px 15px 20px 15px; + } + + .box .image.featured { + left: 15px; + top: 15px; + margin: -40px 0 40px -30px; + } + + .box.post header { + padding-top: 0; + margin: 0 0 1em 0; + } + + .box.post h2 { + font-size: 1.5em; + line-height: 1.5em; + } + + .box.post header > p { + margin-top: 0; + font-size: 1em; + } + + /* Divided */ + + ul.divided li { + padding: 0.5em 0 0.5em 0; + } + + /* Contact */ + + ul.contact li { + padding: 0.8em 0 0.8em 7em; + } + + ul.contact li h3 { + top: 0.8em; + } + + /* Dates */ + + ul.dates li { + padding-left: 6em; + } + + ul.dates h3 { + margin: 0 0 0.5em 0; + } + + /* Links */ + + ul.links li { + display: block; + padding: 0.25em 0 0 0; + margin: 0.25em 0 0 0; + border-left: 0; + } + + ul.links li:first-child { + padding-top: 0; + margin-top: 0; + } + + /* Social */ + + ul.social li { + margin: 0 0.5em 0.75em 0; + } + + /* Icons */ + + .icon.featured { + width: 8em; + margin: 0 0 3em 0; + } + + .icon.featured:after { + border-left: solid 4em transparent; + border-right: solid 4em transparent; + } + + /* Header */ + + #header { + text-align: center; + padding: 2em 0; + } + + #header h1 { + color: #252122; + font-weight: 900; + font-size: 1.75em; + letter-spacing: -0.035em; + } + + /* Intro */ + + #intro { + padding: 2em 0 0 0; + } + + #intro section { + padding: 40px 0 0 0; + margin: 20px 0 0 0; + } + + #intro h2 { + font-size: 1.25em; + } + + /* Banner */ + + #banner { + padding: 6em 0; + margin: 2em 0 0 0; + } + + #banner header { + padding: 1.5em 1em 1.5em 1em; + display: block; + border-radius: 0; + } + + #banner header h2 { + font-size: 1.5em; + line-height: 1.5em; + margin: 0 0 0.25em 0; + } + + #banner header p { + font-size: 1.2em; + } + + /* Main */ + + #main { + padding: 20px 0; + } + + /* Footer */ + + #footer { + padding: 40px 0 20px 0; + } + + } + +#btc-address{ +display: none; +} diff --git a/webapp/static/assets/js/breakpoints.min.js b/webapp/static/assets/js/breakpoints.min.js new file mode 100644 index 0000000..32419cc --- /dev/null +++ b/webapp/static/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/webapp/static/assets/js/jquery.dropotron.min.js b/webapp/static/assets/js/jquery.dropotron.min.js new file mode 100644 index 0000000..b992170 --- /dev/null +++ b/webapp/static/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/webapp/static/assets/js/jquery.min.js b/webapp/static/assets/js/jquery.min.js new file mode 100644 index 0000000..a1c07fd --- /dev/null +++ b/webapp/static/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 0 ul').dropotron({ + mode: 'fade', + noOpenerFade: true, + alignment: 'center' + }); + + // Nav. + + // Title Bar. + $( + '
' + + '' + + '
' + ) + .appendTo($body); + + // Panel. + $( + '' + ) + .appendTo($body) + .panel({ + delay: 500, + hideOnClick: true, + hideOnSwipe: true, + resetScroll: true, + resetForms: true, + side: 'left', + target: $body, + visibleClass: 'navPanel-visible' + }); + +})(jQuery); \ No newline at end of file diff --git a/webapp/static/assets/js/util.js b/webapp/static/assets/js/util.js new file mode 100644 index 0000000..bdb8e9f --- /dev/null +++ b/webapp/static/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/webapp/static/assets/sass/libs/_breakpoints.scss b/webapp/static/assets/sass/libs/_breakpoints.scss new file mode 100644 index 0000000..c5301d8 --- /dev/null +++ b/webapp/static/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/webapp/static/assets/sass/libs/_functions.scss b/webapp/static/assets/sass/libs/_functions.scss new file mode 100644 index 0000000..f563aab --- /dev/null +++ b/webapp/static/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/webapp/static/assets/sass/libs/_html-grid.scss b/webapp/static/assets/sass/libs/_html-grid.scss new file mode 100644 index 0000000..7438a8c --- /dev/null +++ b/webapp/static/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/webapp/static/assets/sass/libs/_mixins.scss b/webapp/static/assets/sass/libs/_mixins.scss new file mode 100644 index 0000000..a331483 --- /dev/null +++ b/webapp/static/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/webapp/static/assets/sass/libs/_vars.scss b/webapp/static/assets/sass/libs/_vars.scss new file mode 100644 index 0000000..3358992 --- /dev/null +++ b/webapp/static/assets/sass/libs/_vars.scss @@ -0,0 +1,22 @@ +// Misc. + $misc: ( + z-index-base: 10000 + ); + +// Duration. + $duration: ( + navPanel: 0.5s + ); + +// Size. + $size: ( + navPanel: 275px + ); + +// Font. + $font: ( + ); + +// Palette. + $palette: ( + ); \ No newline at end of file diff --git a/webapp/static/assets/sass/libs/_vendor.scss b/webapp/static/assets/sass/libs/_vendor.scss new file mode 100644 index 0000000..6599a3f --- /dev/null +++ b/webapp/static/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/webapp/static/assets/sass/main.scss b/webapp/static/assets/sass/main.scss new file mode 100644 index 0000000..415fcfb --- /dev/null +++ b/webapp/static/assets/sass/main.scss @@ -0,0 +1,1683 @@ +@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=Source+Sans+Pro:300,400,700,900,300italic"); + +/* + Dopetrope by HTML5 UP + html5up.net | @ajlkn + Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +*/ + +// Breakpoints. + + @include breakpoints(( + xlarge: ( 1281px, 1680px ), + large: ( 981px, 1280px ), + medium: ( 737px, 980px ), + small: ( 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: #252122; + background-image: url('images/bg02.png'); + + // Stops initial animations until page loads. + &.is-preload { + *, *:before, *:after { + @include vendor('animation', 'none !important'); + @include vendor('transition', 'none !important'); + } + } + + } + + body, input, textarea, select { + font-family: 'Source Sans Pro'; + font-weight: 300; + color: #5d5d5d; + font-size: 14pt; + line-height: 1.75em; + } + + strong, b { + color: #252122; + font-weight: 400; + } + + i, em { + font-style: italic; + } + + sub { + position: relative; + top: 0.5em; + font-size: 0.8em; + } + + sup { + position: relative; + top: -0.5em; + font-size: 0.8em; + } + + blockquote { + border-left: solid 0.75em #dddddd; + padding: 1em 0 1em 1.5em; + font-style: italic; + } + + h1, h2, h3, h4, h5, h6 { + color: #252122; + font-weight: 700; + } + + h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + color: inherit; + text-decoration: none; + } + + h2 { + font-size: 1.5em; + } + + h3 { + font-size: 1.35em; + } + + a { + color: #d52349; + text-decoration: underline; + + &:hover { + text-decoration: none; + } + } + + br.clear { + clear: both; + } + + hr { + border: 0; + border-top: solid 1px #dddddd; + height: 1px; + margin: 2em 0 2em 0; + } + + p, ul, ol, dl, table { + margin-bottom: 2em; + } + +/* Container */ + + .container { + margin: 0 auto; + max-width: 100%; + width: 70em; + + @include breakpoint('<=xlarge') { + width: 70em; + } + + @include breakpoint('<=large') { + width: calc(100% - 60px); + } + + @include breakpoint('<=medium') { + width: calc(100% - 80px); + } + + @include breakpoint('<=small') { + width: calc(100% - 40px); + } + } + +/* Row */ + + .row { + @include html-grid((50px, 50px)); + + @include breakpoint('<=xlarge') { + @include html-grid((50px, 50px), 'xlarge'); + } + + @include breakpoint('<=large') { + @include html-grid((30px, 30px), 'large'); + } + + @include breakpoint('<=medium') { + @include html-grid((40px, 40px), 'medium'); + } + + @include breakpoint('<=small') { + @include html-grid((20px, 20px), 'small'); + } + } + +/* Form */ + + form { + label { + display: block; + color: #252122; + font-weight: 400; + margin: 0 0 0.5em 0; + } + + input[type=text], + input[type=email], + input[type=password], + select, + textarea { + -webkit-appearance: none; + display: block; + border: 0; + padding: 0.75em 1em; + font-size: 1em; + border-radius: 5px; + border: solid 1px #dddddd; + background: #fff; + width: 100%; + + &:focus { + box-shadow: inset 0px 0px 1px 1px #43bff0; + } + } + + textarea { + height: 15em; + } + + ::-webkit-input-placeholder { + color: #555 !important; + } + + :-moz-placeholder { + color: #555 !important; + } + + ::-moz-placeholder { + color: #555 !important; + } + + :-ms-input-placeholder { + color: #555 !important; + } + + ::-moz-focus-inner { + border: 0; + } + } + +/* Tables */ + + table { + width: 100%; + + tr { + border-top: solid 1px #dddddd; + + &:first-child { + border-top: 0; + } + } + + td { + padding: 0.5em 1em 0.5em 1em; + + } + + th { + text-align: left; + padding: 0.5em 1em 0.5em 1em; + font-weight: 700; + margin: 0 0 1em 0; + } + + thead { + border-bottom: solid 2px #dddddd; + } + } + +/* Section/Article */ + + section, article { + margin-bottom: 2.5em; + + > :last-child, + &:last-child { + margin-bottom: 0; + } + } + + header { + margin: 0 0 1.5em 0; + + > p { + display: block; + font-style: italic; + margin: 0.5em 0 0 0; + padding-bottom: 0.5em; + } + + &.major { + position: relative; + text-align: center; + border-top: solid 1px #ccc; + top: 1em; + margin: 0 0 3em 0; + + h2 { + background: #fff; + position: relative; + top: -0.65em; + display: inline; + margin: 0; + padding: 0 1em 0 1em; + } + } + } + + footer { + margin: 2.25em 0 0 0; + } + +/* Box */ + + .box { + background: #ffffff; + border-bottom: solid 1px #ccc; + padding: 2.75em 1.75em 2.75em 1.75em; + + .image { + &.featured { + position: relative; + width: auto; + left: 1.75em; + top: 1.75em; + margin: -4.5em 0 4.25em -3.5em; + } + } + + &.post { + header { + padding-top: 1em; + margin: 0 0 2em 0; + } + + h2 { + font-size: 2.5em; + letter-spacing: -0.015em; + } + + header { + > p { + margin-top: 1.25em; + font-size: 1.25em; + } + } + } + + footer { + ul.actions { + margin-bottom: 0; + } + } + } + +/* Button */ + + input[type="button"], + input[type="submit"], + input[type="reset"], + button, + .button { + -webkit-appearance: none; + display: inline-block; + text-decoration: none; + cursor: pointer; + border: 0; + border-radius: 5px; + background: #d52349; + color: #fff !important; + font-weight: 700; + outline: 0; + font-size: 1.1em; + padding: 0.65em 1.5em 0.65em 1.5em; + text-align: center; + @include vendor('transition', 'background-color .25s ease-in-out'); + + &:hover { + background: #e53359; + } + + &:active { + background: #c51349; + } + + &.alt { + background: #252122; + + &:hover { + background: #353132; + } + + &:active { + background: #151112; + } + } + + &.icon { + &:before { + opacity: 0.35; + position: relative; + top: 0.05em; + margin-right: 0.75em; + } + } + + &.large { + font-size: 1.5em; + padding: 0.75em 1.5em 0.75em 1.5em; + } + } + +/* Image */ + + .image { + display: inline-block; + outline: 0; + + img { + display: block; + width: 100%; + } + + &.centered { + display: block; + margin: 0 0 2em 0; + + img { + margin: 0 auto; + width: auto; + } + } + + &.featured { + display: block; + width: 100%; + margin: 0 0 2em 0; + } + + &.left { + float: left; + margin: 0 2em 2em 0; + } + } + +/* List */ + + ul { + list-style: disc; + padding-left: 1em; + + li { + padding-left: 0.5em; + } + } + + ol { + list-style: decimal; + padding-left: 1.25em; + + li { + padding-left: 0.25em; + } + } + +/* Actions */ + + ul.actions { + list-style: none; + padding-left: 0; + + li { + display: inline-block; + margin-left: 1em; + padding-left: 0; + + &:first-child { + margin-left: 0; + } + } + } + +/* Links */ + + ul.links { + list-style: none; + padding-left: 0; + + li { + display: inline-block; + border-left: solid 1px rgba(255, 255, 255, 0.05); + padding: 0 0 0 1em; + margin: 0 0 0 1em; + + &:first-child { + border-left: 0; + padding-left: 0; + margin-left: 0; + } + } + } + +/* Contact */ + + ul.contact { + list-style: none; + padding-left: 0; + + li { + position: relative; + border-top: solid 1px #ddd; + padding: 1.3em 0 1.3em 7em; + + h3 { + position: absolute; + left: 0; + top: 1.3em; + font-size: 1.1em; + } + + p { + margin: 0; + } + + &:first-child { + padding-top: 0; + border-top: 0; + + h3 { + top: 0; + } + } + } + } + +/* Dates */ + + ul.dates { + list-style: none; + padding-left: 0; + + li { + position: relative; + border-top: solid 1px #ddd; + padding: 1.3em 0 1.3em 6.75em; + } + + .date { + display: block; + position: absolute; + left: 0; + top: 1.3em; + background-color: #d52349; + height: 3.5em; + text-align: center; + color: #fff; + line-height: 1em; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + padding: 0.5em 0.75em 0 1em; + + &:after { + content: ''; + position: absolute; + bottom: 0; + right: -1.2em; + border-left: solid 1.25em #d52349; + border-top: solid 1.8em transparent; + border-bottom: solid 1.8em transparent; + } + + strong { + display: block; + font-size: 1.75em; + padding-top: 0.15em; + } + } + + h3 { + font-size: 1.1em; + } + + p { + margin: 0; + } + + li { + &:first-child { + border-top: 0; + padding-top: 0; + .date { + top: 0; + } + } + } + } + +/* Divided */ + + ul.divided { + list-style: none; + padding-left: 0; + + li { + border-top: solid 1px #ddd; + padding: 1em 0 1em 0; + + &:first-child { + border-top: 0; + padding-top: 0; + } + } + } + +/* Social */ + + ul.social { + list-style: none; + padding-left: 0; + overflow: hidden; + cursor: default; + margin: 0 0 3.25em 0; + + li { + display: inline-block; + padding-left: 0; + margin-left: 0.75em; + + &:first-child { + margin-left: 0; + } + + a { + display: inline-block; + width: 3em; + height: 3em; + text-align: center; + border-radius: 5px; + background: #888; + @include vendor('transition', 'background-color .25s ease-in-out'); + + &:before { + color: #fff; + font-size: 2em; + line-height: 1.5em; + } + + &.fa-facebook { + background: #3c5a98; + + &:hover { + background: #4c6aa8; + } + } + + &.fa-twitter { + background: #2daae4; + + &:hover { + background: #3dbaf4; + } + } + + &.fa-dribbble { + background: #c4376b; + + &:hover { + background: #d4477b; + } + } + + &.fa-linkedin { + background: #006599; + + &:hover { + background: #1075a9; + } + } + + &.fa-tumblr { + background: #2b4661; + + &:hover { + background: #3b5671; + } + } + + &.fa-google-plus { + background: #da2713; + + &:hover { + background: #ea3723; + } + } + } + } + } + +/* Icons */ + + .icon { + @include icon; + position: relative; + text-decoration: none; + + &.solid { + &:before { + font-weight: 900; + } + } + + &.brands { + &:before { + font-family: 'Font Awesome 5 Brands'; + } + } + + &:before { + line-height: inherit; + } + + > .label { + display: none; + } + + &.featured { + position: relative; + display: inline-block; + background-color: #d52349; + width: 9em; + padding: 1.75em 0 0.75em 0; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + margin: 0 0 4.5em 0; + cursor: default; + + &:before { + font-size: 4.5em; + line-height: 1em; + color: #fff; + } + + &:after { + content: ''; + position: absolute; + bottom: -1.95em; + left: 0; + border-top: solid 2em #d52349; + border-left: solid 4.5em transparent; + border-right: solid 4.5em transparent; + } + + &.alt { + background-color: #252122; + + &:after { + border-top-color: #252122; + } + } + + &.alt2 { + background-color: #827a7c; + + &:after { + border-top-color: #827a7c; + } + } + } + } + +/* Page Wrapper */ + + #page-wrapper { + > section { + margin-bottom: 0; + } + } + +/* Header */ + + #header { + position: relative; + background: #ffffff; + border-bottom: solid 1px #ccc; + padding: 5em 0 4em 0; + text-align: center; + + h1 { + color: #252122; + font-weight: 900; + font-size: 2.5em; + letter-spacing: -0.035em; + line-height: 1; + } + } + +/* Nav */ + + #nav { + margin: 2.5em 0 0 0; + + > ul { + margin: 0; + + > li { + display: inline-block; + font-style: italic; + margin: 0 0.35em 0 0.35em; + + > ul { + display: none; + } + + > a { + border-radius: 5px; + color: #5d5d5d; + text-decoration: none; + padding: 0.6em 1.2em 0.6em 1.2em; + @include vendor('transition', 'background-color .25s ease-in-out'); + outline: 0; + } + + &:hover, &.active { + > a { + background: #f3f3f3; + } + } + + &.current { + > a { + background: #d52349; + color: #fff !important; + font-weight: 700; + } + } + } + } + } + + .dropotron { + border-radius: 5px; + background-color: #252122; + background-color: rgba(34, 30, 31, 0.98); + padding: 1.25em 1.5em 1.25em 1.5em; + font-style: italic; + min-width: 13em; + box-shadow: 0px 8px 15px 0px rgba(0, 0, 0, 0.5); + text-align: left; + margin-top: -1.25em; + margin-left: -1px; + list-style: none; + + a, span { + color: #aaa; + text-decoration: none; + @include vendor('transition', 'color .25s ease-in-out'); + } + + li { + padding: 0.25em 0 0.25em 0; + + &:hover > { + a, span { + color: #fff; + } + } + } + + &.level-0 { + margin-top: 2em; + + &:before { + content: ''; + display: block; + position: absolute; + left: 50%; + margin-left: -10px; + top: -9px; + border-left: solid 10px transparent; + border-right: solid 10px transparent; + border-bottom: solid 10px #252122; + border-bottom-color: rgba(34, 30, 31, 0.98); + } + } + } + +/* Banner */ + + #banner { + background: #CCE8F4 url('../../images/pic01.jpg'); + background-position: center center; + background-size: auto 100%; + background-repeat: no-repeat; + text-align: center; + position: relative; + padding: 8em 0; + margin: 4em 0 0 0; + + header { + background-color: rgba(34, 30, 31, 0.98); + display: inline-block; + padding: 2.5em 5em; + border-radius: 5px; + + h2 { + color: #fff; + font-weight: 700; + font-size: 2.5em; + margin: 0 0 0.65em 0; + } + + p { + color: #d52349; + padding: 0; + font-style: normal; + margin: 0; + font-size: 1.5em; + } + } + } + +/* Intro */ + + #intro { + text-align: center; + overflow: hidden; + + section { + margin: 3em 0; + padding: 2.5em 0; + } + + h2 { + font-size: 1.75em; + } + + p { + margin: 0; + } + + .middle { + position: relative; + z-index: 1; + + &:before { + content: ''; + width: 32px; + height: 100%; + position: absolute; + left: -24px; + top: 0; + display: block; + z-index: -1; + box-shadow: 32px 0 0 0 #fff, 0 -32px 0 0 #fff, 0 32px 0 0 #fff, 32px 32px 0 0 #fff, 32px -32px 0 0 #fff, 0 0 32px 0 rgba(0, 0, 0, 0.15); + } + + &:after { + content: ''; + width: 32px; + height: 100%; + position: absolute; + right: -24px; + top: 0; + display: block; + z-index: -1; + box-shadow: -32px 0 0 0 #fff, 0 -32px 0 0 #fff, 0 32px 0 0 #fff, -32px 32px 0 0 #fff, -32px -32px 0 0 #fff, 0 0 32px 0 rgba(0, 0, 0, 0.15); + } + } + + .button { + min-width: 12em; + } + + footer { + margin: 0; + } + } + +/* Main */ + + #main { + position: relative; + background: #f7f7f7 url('images/bg02.png'); + padding: 4em 0 4em 0; + + &:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + background: url('images/bg01.png'); + background-size: 100% 100%; + z-index: 0; + opacity: 0.1; + } + + .major { + h2 { + background: #f7f7f7 url('images/bg02.png'); + } + } + } + +/* Footer */ + + #footer { + position: relative; + color: #858484; + padding: 4em 0; + + &:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + background: url('images/bg01.png'); + background-size: 100% 100%; + z-index: 0; + opacity: 0.5; + } + + a { + color: #c5c4c4; + } + + h2, h3, h4, h5, h6, strong, b { + color: #fff; + + a { + color: inherit; + } + } + + ul { + &.contact li, + &.dates li, + &.divided li { + border-top-color: #353434; + border-top-color: rgba(255, 255, 255, 0.05); + } + } + + header { + margin: 0 0 3em 0; + + h2 { + font-size: 1.75em; + } + } + } + +/* Copyright */ + + #copyright { + text-align: center; + margin: 3em 0 2em 0; + + ul.links { + display: inline-block; + background: #2C2929; + background: rgba(255, 255, 255, 0.05); + border-radius: 5px; + margin: 0; + padding: 0.85em 2.25em 0.85em 2.25em; + } + } + +/* XLarge */ + + @include breakpoint('<=xlarge') { + + /* Basic */ + + body, input, textarea, select { + font-size: 12pt; + } + + } + +/* Large */ + + @include breakpoint('<=large') { + + /* Basic */ + + body, input, textarea, select { + font-size: 11pt; + } + + /* Section/Article */ + + header { + &.major { + margin: 0.75em 0 2.5em 0; + + h2 { + padding: 0 1em 0 1em; + } + } + } + + /* Social */ + + ul.social { + li { + margin: 0 0 0.25em 0.75em; + } + } + + /* Header */ + + #header { + padding: 4em 0 3em 0; + } + + /* Banner */ + + #banner { + padding: 6em 0; + margin: 3em 0 0 0; + } + + /* Intro */ + + #intro { + padding: 0; + + section { + padding: 1em 2em; + } + + .middle { + &:before { + left: -12px; + } + + &:after { + right: -12px; + } + } + } + + /* Main */ + + #main { + padding: 30px 0; + } + + /* Footer */ + + #footer { + padding: 3em 0; + + &:before { + height: 2.5em; + } + + header { + margin: 0 0 1.5em 0; + + h2 { + font-size: 1.25em; + } + } + } + + /* Copyright */ + + #copyright { + margin: 0; + } + + } + +/* Medium */ + + #navPanel, #titleBar { + display: none; + } + + @include breakpoint('<=medium') { + + /* Basic */ + + html, body { + overflow-x: hidden; + } + + /* Box */ + + .box { + footer { + ul.actions { + li { + margin: 1em 0 0 0; + display: block; + + .button { + width: 100%; + } + + &:first-child { + margin-top: 0; + } + } + } + } + } + + /* Header */ + + #header { + padding: 3.5em 0 3em 0; + } + + /* Nav */ + + #nav { + display: none; + } + + /* Intro */ + + #intro { + padding: 3em 0 0 0; + + section { + position: relative; + border-top: solid 1px #dfdfdf; + margin: 0; + padding: 40px 0 0 0; + + &.first { + border-top: 0; + padding-top: 0; + } + + p { + margin: 0; + } + } + + .middle { + &:before, &:after { + display: none; + } + } + + footer { + padding: 3em 0 0 0; + + ul.actions { + margin-bottom: 0; + } + } + } + + /* Main */ + + #main { + padding: 40px 0; + } + + /* Copyright */ + + #copyright { + ul.links { + display: block; + } + } + + /* Nav */ + + #page-wrapper { + @include vendor('backface-visibility', 'hidden'); + @include vendor('transition', 'transform #{_duration(navPanel)} ease'); + padding-bottom: 1px; + } + + #titleBar { + @include vendor('backface-visibility', 'hidden'); + @include vendor('transition', 'transform #{_duration(navPanel)} ease'); + display: block; + height: 44px; + left: 0; + position: fixed; + top: 0; + width: 100%; + z-index: _misc(z-index-base) + 1; + background: none; + + .toggle { + @include icon(false, solid); + width: 80px; + height: 60px; + + &:before { + content: '\f0c9'; + display: block; + position: absolute; + left: 10px; + top: 10px; + width: 50px; + height: 40px; + line-height: 40px; + font-size: 18px; + color: #fff; + text-align: center; + background: rgba(150, 150, 150, 0.75); + border-radius: 5px; + } + + &:active:before { + background-color: rgba(150, 150, 150, 1); + } + } + } + + #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; + color: #858484; + background-image: url('images/bg02.png'); + box-shadow: inset -3px 0px 5px 0px rgba(0, 0, 0, 0.35); + + .link { + display: block; + color: #888; + text-decoration: none; + height: 44px; + line-height: 44px; + border-top: solid 1px rgba(255, 255, 255, 0.05); + padding: 0 1em 0 1em; + font-style: italic; + + &: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; + } + + .depth-0 { + color: #fff; + } + } + + body { + &.navPanel-visible { + #page-wrapper { + @include vendor('transform', 'translateX(#{_size(navPanel)})'); + } + + #titleBar { + @include vendor('transform', 'translateX(#{_size(navPanel)})'); + } + + #navPanel { + @include vendor('transform', 'translateX(0)'); + } + } + } + + } + +/* Small */ + + @include breakpoint('<=small') { + + /* Basic */ + + body, input, textarea, select { + font-size: 11pt; + } + + h2, h3, h4, h5, h6 { + font-size: 1.25em; + } + + /* Button */ + + input[type="button"], + input[type="submit"], + input[type="reset"], + button, + .button { + &.large { + font-size: 1.1em; + padding: 0.65em 1.5em 0.65em 1.5em; + } + } + + /* Actions */ + + ul.actions { + li { + margin: 1em 0 0 0; + display: block; + + .button { + width: 100%; + } + + &:first-child { + margin-top: 0; + } + } + } + + /* Section/Article */ + + section, article { + margin-bottom: 20px; + } + + header { + margin: 0 0 1em 0; + } + + footer { + margin: 2em 0 0 0; + } + + /* Box */ + + .box { + padding: 25px 15px 20px 15px; + + .image.featured { + left: 15px; + top: 15px; + margin: -40px 0 40px -30px; + } + + &.post { + header { + padding-top: 0; + margin: 0 0 1em 0; + } + + h2 { + font-size: 1.5em; + line-height: 1.5em; + } + + header { + > p { + margin-top: 0; + font-size: 1em; + } + } + } + } + + /* Divided */ + + ul.divided { + li { + padding: 0.5em 0 0.5em 0; + } + } + + /* Contact */ + + ul.contact { + li { + padding: 0.8em 0 0.8em 7em; + + h3 { + top: 0.8em; + } + } + } + + /* Dates */ + + ul.dates { + li { + padding-left: 6em; + } + + h3 { + margin: 0 0 0.5em 0; + } + } + + /* Links */ + + ul.links { + li { + display: block; + padding: 0.25em 0 0 0; + margin: 0.25em 0 0 0; + border-left: 0; + + &:first-child { + padding-top: 0; + margin-top: 0; + } + } + } + + /* Social */ + + ul.social { + li { + margin: 0 0.5em 0.75em 0; + } + } + + /* Icons */ + + .icon { + &.featured { + width: 8em; + margin: 0 0 3em 0; + + &:after { + border-left: solid 4em transparent; + border-right: solid 4em transparent; + } + } + } + + /* Header */ + + #header { + text-align: center; + padding: 2em 0; + + h1 { + color: #252122; + font-weight: 900; + font-size: 1.75em; + letter-spacing: -0.035em; + } + } + + /* Intro */ + + #intro { + padding: 2em 0 0 0; + + section { + padding: 40px 0 0 0; + margin: 20px 0 0 0; + } + + h2 { + font-size: 1.25em; + } + } + + /* Banner */ + + #banner { + padding: 6em 0; + margin: 2em 0 0 0; + + header { + padding: 1.5em 1em 1.5em 1em; + display: block; + border-radius: 0; + + h2 { + font-size: 1.5em; + line-height: 1.5em; + margin: 0 0 0.25em 0; + } + + p { + font-size: 1.2em; + } + } + } + + /* Main */ + + #main { + padding: 20px 0; + } + + /* Footer */ + + #footer { + padding: 40px 0 20px 0; + } + + } \ No newline at end of file diff --git a/webapp/static/assets/webfonts/fa-brands-400.eot b/webapp/static/assets/webfonts/fa-brands-400.eot new file mode 100644 index 0000000..e79f40f Binary files /dev/null and b/webapp/static/assets/webfonts/fa-brands-400.eot differ diff --git a/webapp/static/assets/webfonts/fa-brands-400.svg b/webapp/static/assets/webfonts/fa-brands-400.svg new file mode 100644 index 0000000..ba0d850 --- /dev/null +++ b/webapp/static/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/webapp/static/assets/webfonts/fa-brands-400.ttf b/webapp/static/assets/webfonts/fa-brands-400.ttf new file mode 100644 index 0000000..217ffe9 Binary files /dev/null and b/webapp/static/assets/webfonts/fa-brands-400.ttf differ diff --git a/webapp/static/assets/webfonts/fa-brands-400.woff b/webapp/static/assets/webfonts/fa-brands-400.woff new file mode 100644 index 0000000..a2d8025 Binary files /dev/null and b/webapp/static/assets/webfonts/fa-brands-400.woff differ diff --git a/webapp/static/assets/webfonts/fa-brands-400.woff2 b/webapp/static/assets/webfonts/fa-brands-400.woff2 new file mode 100644 index 0000000..e27b0bf Binary files /dev/null and b/webapp/static/assets/webfonts/fa-brands-400.woff2 differ diff --git a/webapp/static/assets/webfonts/fa-regular-400.eot b/webapp/static/assets/webfonts/fa-regular-400.eot new file mode 100644 index 0000000..d62be2f Binary files /dev/null and b/webapp/static/assets/webfonts/fa-regular-400.eot differ diff --git a/webapp/static/assets/webfonts/fa-regular-400.svg b/webapp/static/assets/webfonts/fa-regular-400.svg new file mode 100644 index 0000000..751083e --- /dev/null +++ b/webapp/static/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/webapp/static/assets/webfonts/fa-regular-400.ttf b/webapp/static/assets/webfonts/fa-regular-400.ttf new file mode 100644 index 0000000..eb3cb5e Binary files /dev/null and b/webapp/static/assets/webfonts/fa-regular-400.ttf differ diff --git a/webapp/static/assets/webfonts/fa-regular-400.woff b/webapp/static/assets/webfonts/fa-regular-400.woff new file mode 100644 index 0000000..43b1a9a Binary files /dev/null and b/webapp/static/assets/webfonts/fa-regular-400.woff differ diff --git a/webapp/static/assets/webfonts/fa-regular-400.woff2 b/webapp/static/assets/webfonts/fa-regular-400.woff2 new file mode 100644 index 0000000..b9344a7 Binary files /dev/null and b/webapp/static/assets/webfonts/fa-regular-400.woff2 differ diff --git a/webapp/static/assets/webfonts/fa-solid-900.eot b/webapp/static/assets/webfonts/fa-solid-900.eot new file mode 100644 index 0000000..c77baa8 Binary files /dev/null and b/webapp/static/assets/webfonts/fa-solid-900.eot differ diff --git a/webapp/static/assets/webfonts/fa-solid-900.svg b/webapp/static/assets/webfonts/fa-solid-900.svg new file mode 100644 index 0000000..627128b --- /dev/null +++ b/webapp/static/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/webapp/static/assets/webfonts/fa-solid-900.ttf b/webapp/static/assets/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000..c6c3dd4 Binary files /dev/null and b/webapp/static/assets/webfonts/fa-solid-900.ttf differ diff --git a/webapp/static/assets/webfonts/fa-solid-900.woff b/webapp/static/assets/webfonts/fa-solid-900.woff new file mode 100644 index 0000000..77c1786 Binary files /dev/null and b/webapp/static/assets/webfonts/fa-solid-900.woff differ diff --git a/webapp/static/assets/webfonts/fa-solid-900.woff2 b/webapp/static/assets/webfonts/fa-solid-900.woff2 new file mode 100644 index 0000000..e30fb67 Binary files /dev/null and b/webapp/static/assets/webfonts/fa-solid-900.woff2 differ diff --git a/webapp/static/images/pic01.jpg b/webapp/static/images/pic01.jpg new file mode 100644 index 0000000..2583000 Binary files /dev/null and b/webapp/static/images/pic01.jpg differ diff --git a/webapp/static/images/pic02.jpg b/webapp/static/images/pic02.jpg new file mode 100644 index 0000000..15add4f Binary files /dev/null and b/webapp/static/images/pic02.jpg differ diff --git a/webapp/static/images/pic03.jpg b/webapp/static/images/pic03.jpg new file mode 100644 index 0000000..3f10bb9 Binary files /dev/null and b/webapp/static/images/pic03.jpg differ diff --git a/webapp/static/images/pic04.jpg b/webapp/static/images/pic04.jpg new file mode 100644 index 0000000..15dca28 Binary files /dev/null and b/webapp/static/images/pic04.jpg differ diff --git a/webapp/static/images/pic05.jpg b/webapp/static/images/pic05.jpg new file mode 100644 index 0000000..afd4622 Binary files /dev/null and b/webapp/static/images/pic05.jpg differ diff --git a/webapp/static/images/pic06.jpg b/webapp/static/images/pic06.jpg new file mode 100644 index 0000000..93794fa Binary files /dev/null and b/webapp/static/images/pic06.jpg differ diff --git a/webapp/static/images/pic07.jpg b/webapp/static/images/pic07.jpg new file mode 100644 index 0000000..e7e85e1 Binary files /dev/null and b/webapp/static/images/pic07.jpg differ diff --git a/webapp/static/images/pic08.jpg b/webapp/static/images/pic08.jpg new file mode 100644 index 0000000..1206443 Binary files /dev/null and b/webapp/static/images/pic08.jpg differ diff --git a/webapp/static/images/pic09.jpg b/webapp/static/images/pic09.jpg new file mode 100644 index 0000000..ef743f8 Binary files /dev/null and b/webapp/static/images/pic09.jpg differ diff --git a/webapp/static/images/pic10.jpg b/webapp/static/images/pic10.jpg new file mode 100644 index 0000000..b807a67 Binary files /dev/null and b/webapp/static/images/pic10.jpg differ diff --git a/webapp/templates/LICENSE.txt b/webapp/templates/LICENSE.txt new file mode 100644 index 0000000..d447b56 --- /dev/null +++ b/webapp/templates/LICENSE.txt @@ -0,0 +1,63 @@ +Creative Commons Attribution 3.0 Unported +http://creativecommons.org/licenses/by/3.0/ + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + 1. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. + 2. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. + 3. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. + 4. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. + 5. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. + 6. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. + 7. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + 8. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. + 9. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + 1. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; + 2. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; + 3. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, + 4. to Distribute and Publicly Perform Adaptations. + 5. + + For the avoidance of doubt: + 1. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; + 2. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, + 3. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + 1. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested. + 2. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. + 3. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + 1. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + 2. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + 1. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + 3. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + 4. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + 5. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + 6. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. diff --git a/webapp/templates/README.txt b/webapp/templates/README.txt new file mode 100644 index 0000000..601f88f --- /dev/null +++ b/webapp/templates/README.txt @@ -0,0 +1,31 @@ +Dopetrope by HTML5 UP +html5up.net | @ajlkn +Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) + + +A spiffy new blog/magazine style responsive site template with a flat/minimal +design aesthetic. + +Demo images* are courtesy of the incredibly talented Janine Pring aka Dreametry Doodle. +See more of her amazing work (and her awesome t-shirt line) @ dreametrydoodle.com + +(* = Not included! Only meant for use with my own on-site demo, so please do NOT download +and/or use any of Janine's work without her explicit permission!) + +Feedback, bug reports, and comments are not only welcome, but strongly encouraged :) + +AJ +aj@lkn.io | @ajlkn + + +Credits: + + Demo Images: + Dreametry Doodle (dreametrydoodle.com) + + Icons: + Font Awesome (fontawesome.io) + + Other: + jQuery (jquery.com) + Responsive Tools (github.com/ajlkn/responsive-tools) \ No newline at end of file diff --git a/webapp/templates/assets/css/fontawesome-all.min.css b/webapp/templates/assets/css/fontawesome-all.min.css new file mode 100644 index 0000000..b7d052b --- /dev/null +++ b/webapp/templates/assets/css/fontawesome-all.min.css @@ -0,0 +1,5 @@ +/*! + * 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/webapp/templates/assets/css/images/bg.png b/webapp/templates/assets/css/images/bg.png new file mode 100644 index 0000000..b8f65cb Binary files /dev/null and b/webapp/templates/assets/css/images/bg.png differ diff --git a/webapp/templates/assets/css/main.css b/webapp/templates/assets/css/main.css new file mode 100644 index 0000000..525b1d3 --- /dev/null +++ b/webapp/templates/assets/css/main.css @@ -0,0 +1,2908 @@ +@import url("fontawesome-all.min.css"); +@import url("https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,700,900,300italic"); + +/* + Dopetrope by HTML5 UP + html5up.net | @ajlkn + Free for personal and commercial use under the CCA 3.0 license (html5up.net/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: #252122; + background-image: url("images/bg02.png"); + } + + 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, textarea, select { + font-family: 'Source Sans Pro'; + font-weight: 300; + color: #5d5d5d; + font-size: 14pt; + line-height: 1.75em; + } + + strong, b { + color: #252122; + font-weight: 400; + } + + i, em { + font-style: italic; + } + + sub { + position: relative; + top: 0.5em; + font-size: 0.8em; + } + + sup { + position: relative; + top: -0.5em; + font-size: 0.8em; + } + + blockquote { + border-left: solid 0.75em #dddddd; + padding: 1em 0 1em 1.5em; + font-style: italic; + } + + h1, h2, h3, h4, h5, h6 { + color: #252122; + font-weight: 700; + } + + h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + color: inherit; + text-decoration: none; + } + + h2 { + font-size: 1.5em; + } + + h3 { + font-size: 1.35em; + } + + a { + color: #d52349; + text-decoration: underline; + } + + a:hover { + text-decoration: none; + } + + br.clear { + clear: both; + } + + hr { + border: 0; + border-top: solid 1px #dddddd; + height: 1px; + margin: 2em 0 2em 0; + } + + p, ul, ol, dl, table { + margin-bottom: 2em; + } + +/* Container */ + + .container { + margin: 0 auto; + max-width: 100%; + width: 70em; + } + + @media screen and (max-width: 1680px) { + + .container { + width: 70em; + } + + } + + @media screen and (max-width: 1280px) { + + .container { + width: calc(100% - 60px); + } + + } + + @media screen and (max-width: 980px) { + + .container { + width: calc(100% - 80px); + } + + } + + @media screen and (max-width: 736px) { + + .container { + width: calc(100% - 40px); + } + + } + +/* 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-xlarge { + order: -1; + } + + .row > .col-1-xlarge { + width: 8.33333%; + } + + .row > .off-1-xlarge { + margin-left: 8.33333%; + } + + .row > .col-2-xlarge { + width: 16.66667%; + } + + .row > .off-2-xlarge { + margin-left: 16.66667%; + } + + .row > .col-3-xlarge { + width: 25%; + } + + .row > .off-3-xlarge { + margin-left: 25%; + } + + .row > .col-4-xlarge { + width: 33.33333%; + } + + .row > .off-4-xlarge { + margin-left: 33.33333%; + } + + .row > .col-5-xlarge { + width: 41.66667%; + } + + .row > .off-5-xlarge { + margin-left: 41.66667%; + } + + .row > .col-6-xlarge { + width: 50%; + } + + .row > .off-6-xlarge { + margin-left: 50%; + } + + .row > .col-7-xlarge { + width: 58.33333%; + } + + .row > .off-7-xlarge { + margin-left: 58.33333%; + } + + .row > .col-8-xlarge { + width: 66.66667%; + } + + .row > .off-8-xlarge { + margin-left: 66.66667%; + } + + .row > .col-9-xlarge { + width: 75%; + } + + .row > .off-9-xlarge { + margin-left: 75%; + } + + .row > .col-10-xlarge { + width: 83.33333%; + } + + .row > .off-10-xlarge { + margin-left: 83.33333%; + } + + .row > .col-11-xlarge { + width: 91.66667%; + } + + .row > .off-11-xlarge { + margin-left: 91.66667%; + } + + .row > .col-12-xlarge { + width: 100%; + } + + .row > .off-12-xlarge { + 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: 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-large { + order: -1; + } + + .row > .col-1-large { + width: 8.33333%; + } + + .row > .off-1-large { + margin-left: 8.33333%; + } + + .row > .col-2-large { + width: 16.66667%; + } + + .row > .off-2-large { + margin-left: 16.66667%; + } + + .row > .col-3-large { + width: 25%; + } + + .row > .off-3-large { + margin-left: 25%; + } + + .row > .col-4-large { + width: 33.33333%; + } + + .row > .off-4-large { + margin-left: 33.33333%; + } + + .row > .col-5-large { + width: 41.66667%; + } + + .row > .off-5-large { + margin-left: 41.66667%; + } + + .row > .col-6-large { + width: 50%; + } + + .row > .off-6-large { + margin-left: 50%; + } + + .row > .col-7-large { + width: 58.33333%; + } + + .row > .off-7-large { + margin-left: 58.33333%; + } + + .row > .col-8-large { + width: 66.66667%; + } + + .row > .off-8-large { + margin-left: 66.66667%; + } + + .row > .col-9-large { + width: 75%; + } + + .row > .off-9-large { + margin-left: 75%; + } + + .row > .col-10-large { + width: 83.33333%; + } + + .row > .off-10-large { + margin-left: 83.33333%; + } + + .row > .col-11-large { + width: 91.66667%; + } + + .row > .off-11-large { + margin-left: 91.66667%; + } + + .row > .col-12-large { + width: 100%; + } + + .row > .off-12-large { + 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: 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-medium { + order: -1; + } + + .row > .col-1-medium { + width: 8.33333%; + } + + .row > .off-1-medium { + margin-left: 8.33333%; + } + + .row > .col-2-medium { + width: 16.66667%; + } + + .row > .off-2-medium { + margin-left: 16.66667%; + } + + .row > .col-3-medium { + width: 25%; + } + + .row > .off-3-medium { + margin-left: 25%; + } + + .row > .col-4-medium { + width: 33.33333%; + } + + .row > .off-4-medium { + margin-left: 33.33333%; + } + + .row > .col-5-medium { + width: 41.66667%; + } + + .row > .off-5-medium { + margin-left: 41.66667%; + } + + .row > .col-6-medium { + width: 50%; + } + + .row > .off-6-medium { + margin-left: 50%; + } + + .row > .col-7-medium { + width: 58.33333%; + } + + .row > .off-7-medium { + margin-left: 58.33333%; + } + + .row > .col-8-medium { + width: 66.66667%; + } + + .row > .off-8-medium { + margin-left: 66.66667%; + } + + .row > .col-9-medium { + width: 75%; + } + + .row > .off-9-medium { + margin-left: 75%; + } + + .row > .col-10-medium { + width: 83.33333%; + } + + .row > .off-10-medium { + margin-left: 83.33333%; + } + + .row > .col-11-medium { + width: 91.66667%; + } + + .row > .off-11-medium { + margin-left: 91.66667%; + } + + .row > .col-12-medium { + width: 100%; + } + + .row > .off-12-medium { + 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: 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-small { + order: -1; + } + + .row > .col-1-small { + width: 8.33333%; + } + + .row > .off-1-small { + margin-left: 8.33333%; + } + + .row > .col-2-small { + width: 16.66667%; + } + + .row > .off-2-small { + margin-left: 16.66667%; + } + + .row > .col-3-small { + width: 25%; + } + + .row > .off-3-small { + margin-left: 25%; + } + + .row > .col-4-small { + width: 33.33333%; + } + + .row > .off-4-small { + margin-left: 33.33333%; + } + + .row > .col-5-small { + width: 41.66667%; + } + + .row > .off-5-small { + margin-left: 41.66667%; + } + + .row > .col-6-small { + width: 50%; + } + + .row > .off-6-small { + margin-left: 50%; + } + + .row > .col-7-small { + width: 58.33333%; + } + + .row > .off-7-small { + margin-left: 58.33333%; + } + + .row > .col-8-small { + width: 66.66667%; + } + + .row > .off-8-small { + margin-left: 66.66667%; + } + + .row > .col-9-small { + width: 75%; + } + + .row > .off-9-small { + margin-left: 75%; + } + + .row > .col-10-small { + width: 83.33333%; + } + + .row > .off-10-small { + margin-left: 83.33333%; + } + + .row > .col-11-small { + width: 91.66667%; + } + + .row > .off-11-small { + margin-left: 91.66667%; + } + + .row > .col-12-small { + width: 100%; + } + + .row > .off-12-small { + 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: -5px; + margin-left: -5px; + } + + .row.gtr-25 > * { + padding: 5px 0 0 5px; + } + + .row.gtr-25.gtr-uniform { + margin-top: -5px; + } + + .row.gtr-25.gtr-uniform > * { + padding-top: 5px; + } + + .row.gtr-50 { + margin-top: -10px; + margin-left: -10px; + } + + .row.gtr-50 > * { + padding: 10px 0 0 10px; + } + + .row.gtr-50.gtr-uniform { + margin-top: -10px; + } + + .row.gtr-50.gtr-uniform > * { + padding-top: 10px; + } + + .row { + margin-top: -20px; + margin-left: -20px; + } + + .row > * { + padding: 20px 0 0 20px; + } + + .row.gtr-uniform { + margin-top: -20px; + } + + .row.gtr-uniform > * { + padding-top: 20px; + } + + .row.gtr-150 { + margin-top: -30px; + margin-left: -30px; + } + + .row.gtr-150 > * { + padding: 30px 0 0 30px; + } + + .row.gtr-150.gtr-uniform { + margin-top: -30px; + } + + .row.gtr-150.gtr-uniform > * { + padding-top: 30px; + } + + .row.gtr-200 { + margin-top: -40px; + margin-left: -40px; + } + + .row.gtr-200 > * { + padding: 40px 0 0 40px; + } + + .row.gtr-200.gtr-uniform { + margin-top: -40px; + } + + .row.gtr-200.gtr-uniform > * { + padding-top: 40px; + } + + } + +/* Form */ + + form label { + display: block; + color: #252122; + font-weight: 400; + margin: 0 0 0.5em 0; + } + + form input[type=text], + form input[type=email], + form input[type=password], + form select, + form textarea { + -webkit-appearance: none; + display: block; + border: 0; + padding: 0.75em 1em; + font-size: 1em; + border-radius: 5px; + border: solid 1px #dddddd; + background: #fff; + width: 100%; + } + + form input[type=text]:focus, + form input[type=email]:focus, + form input[type=password]:focus, + form select:focus, + form textarea:focus { + box-shadow: inset 0px 0px 1px 1px #43bff0; + } + + form textarea { + height: 15em; + } + + form ::-webkit-input-placeholder { + color: #555 !important; + } + + form :-moz-placeholder { + color: #555 !important; + } + + form ::-moz-placeholder { + color: #555 !important; + } + + form :-ms-input-placeholder { + color: #555 !important; + } + + form ::-moz-focus-inner { + border: 0; + } + +/* Tables */ + + table { + width: 100%; + } + + table tr { + border-top: solid 1px #dddddd; + } + + table tr:first-child { + border-top: 0; + } + + table td { + padding: 0.5em 1em 0.5em 1em; + } + + table th { + text-align: left; + padding: 0.5em 1em 0.5em 1em; + font-weight: 700; + margin: 0 0 1em 0; + } + + table thead { + border-bottom: solid 2px #dddddd; + } + +/* Section/Article */ + + section, article { + margin-bottom: 2.5em; + } + + section > :last-child, section:last-child, article > :last-child, article:last-child { + margin-bottom: 0; + } + + header { + margin: 0 0 1.5em 0; + } + + header > p { + display: block; + font-style: italic; + margin: 0.5em 0 0 0; + padding-bottom: 0.5em; + } + + header.major { + position: relative; + text-align: center; + border-top: solid 1px #ccc; + top: 1em; + margin: 0 0 3em 0; + } + + header.major h2 { + background: #fff; + position: relative; + top: -0.65em; + display: inline; + margin: 0; + padding: 0 1em 0 1em; + } + + footer { + margin: 2.25em 0 0 0; + } + +/* Box */ + + .box { + background: #ffffff; + border-bottom: solid 1px #ccc; + padding: 2.75em 1.75em 2.75em 1.75em; + } + + .box .image.featured { + position: relative; + width: auto; + left: 1.75em; + top: 1.75em; + margin: -4.5em 0 4.25em -3.5em; + } + + .box.post header { + padding-top: 1em; + margin: 0 0 2em 0; + } + + .box.post h2 { + font-size: 2.5em; + letter-spacing: -0.015em; + } + + .box.post header > p { + margin-top: 1.25em; + font-size: 1.25em; + } + + .box footer ul.actions { + margin-bottom: 0; + } + +/* Button */ + + input[type="button"], + input[type="submit"], + input[type="reset"], + button, + .button { + -webkit-appearance: none; + display: inline-block; + text-decoration: none; + cursor: pointer; + border: 0; + border-radius: 5px; + background: #d52349; + color: #fff !important; + font-weight: 700; + outline: 0; + font-size: 1.1em; + padding: 0.65em 1.5em 0.65em 1.5em; + text-align: center; + -moz-transition: background-color .25s ease-in-out; + -webkit-transition: background-color .25s ease-in-out; + -ms-transition: background-color .25s ease-in-out; + transition: background-color .25s ease-in-out; + } + + input[type="button"]:hover, + input[type="submit"]:hover, + input[type="reset"]:hover, + button:hover, + .button:hover { + background: #e53359; + } + + input[type="button"]:active, + input[type="submit"]:active, + input[type="reset"]:active, + button:active, + .button:active { + background: #c51349; + } + + input[type="button"].alt, + input[type="submit"].alt, + input[type="reset"].alt, + button.alt, + .button.alt { + background: #252122; + } + + input[type="button"].alt:hover, + input[type="submit"].alt:hover, + input[type="reset"].alt:hover, + button.alt:hover, + .button.alt:hover { + background: #353132; + } + + input[type="button"].alt:active, + input[type="submit"].alt:active, + input[type="reset"].alt:active, + button.alt:active, + .button.alt:active { + background: #151112; + } + + input[type="button"].icon:before, + input[type="submit"].icon:before, + input[type="reset"].icon:before, + button.icon:before, + .button.icon:before { + opacity: 0.35; + position: relative; + top: 0.05em; + margin-right: 0.75em; + } + + input[type="button"].large, + input[type="submit"].large, + input[type="reset"].large, + button.large, + .button.large { + font-size: 1.5em; + padding: 0.75em 1.5em 0.75em 1.5em; + } + +/* Image */ + + .image { + display: inline-block; + outline: 0; + } + + .image img { + display: block; + width: 100%; + } + + .image.centered { + display: block; + margin: 0 0 2em 0; + } + + .image.centered img { + margin: 0 auto; + width: auto; + } + + .image.featured { + display: block; + width: 100%; + margin: 0 0 2em 0; + } + + .image.left { + float: left; + margin: 0 2em 2em 0; + } + +/* List */ + + ul { + list-style: disc; + padding-left: 1em; + } + + ul li { + padding-left: 0.5em; + } + + ol { + list-style: decimal; + padding-left: 1.25em; + } + + ol li { + padding-left: 0.25em; + } + +/* Actions */ + + ul.actions { + list-style: none; + padding-left: 0; + } + + ul.actions li { + display: inline-block; + margin-left: 1em; + padding-left: 0; + } + + ul.actions li:first-child { + margin-left: 0; + } + +/* Links */ + + ul.links { + list-style: none; + padding-left: 0; + } + + ul.links li { + display: inline-block; + border-left: solid 1px rgba(255, 255, 255, 0.05); + padding: 0 0 0 1em; + margin: 0 0 0 1em; + } + + ul.links li:first-child { + border-left: 0; + padding-left: 0; + margin-left: 0; + } + +/* Contact */ + + ul.contact { + list-style: none; + padding-left: 0; + } + + ul.contact li { + position: relative; + border-top: solid 1px #ddd; + padding: 1.3em 0 1.3em 7em; + } + + ul.contact li h3 { + position: absolute; + left: 0; + top: 1.3em; + font-size: 1.1em; + } + + ul.contact li p { + margin: 0; + } + + ul.contact li:first-child { + padding-top: 0; + border-top: 0; + } + + ul.contact li:first-child h3 { + top: 0; + } + +/* Dates */ + + ul.dates { + list-style: none; + padding-left: 0; + } + + ul.dates li { + position: relative; + border-top: solid 1px #ddd; + padding: 1.3em 0 1.3em 6.75em; + } + + ul.dates .date { + display: block; + position: absolute; + left: 0; + top: 1.3em; + background-color: #d52349; + height: 3.5em; + text-align: center; + color: #fff; + line-height: 1em; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + padding: 0.5em 0.75em 0 1em; + } + + ul.dates .date:after { + content: ''; + position: absolute; + bottom: 0; + right: -1.2em; + border-left: solid 1.25em #d52349; + border-top: solid 1.8em transparent; + border-bottom: solid 1.8em transparent; + } + + ul.dates .date strong { + display: block; + font-size: 1.75em; + padding-top: 0.15em; + } + + ul.dates h3 { + font-size: 1.1em; + } + + ul.dates p { + margin: 0; + } + + ul.dates li:first-child { + border-top: 0; + padding-top: 0; + } + + ul.dates li:first-child .date { + top: 0; + } + +/* Divided */ + + ul.divided { + list-style: none; + padding-left: 0; + } + + ul.divided li { + border-top: solid 1px #ddd; + padding: 1em 0 1em 0; + } + + ul.divided li:first-child { + border-top: 0; + padding-top: 0; + } + +/* Social */ + + ul.social { + list-style: none; + padding-left: 0; + overflow: hidden; + cursor: default; + margin: 0 0 3.25em 0; + } + + ul.social li { + display: inline-block; + padding-left: 0; + margin-left: 0.75em; + } + + ul.social li:first-child { + margin-left: 0; + } + + ul.social li a { + display: inline-block; + width: 3em; + height: 3em; + text-align: center; + border-radius: 5px; + background: #888; + -moz-transition: background-color .25s ease-in-out; + -webkit-transition: background-color .25s ease-in-out; + -ms-transition: background-color .25s ease-in-out; + transition: background-color .25s ease-in-out; + } + + ul.social li a:before { + color: #fff; + font-size: 2em; + line-height: 1.5em; + } + + ul.social li a.fa-facebook { + background: #3c5a98; + } + + ul.social li a.fa-facebook:hover { + background: #4c6aa8; + } + + ul.social li a.fa-twitter { + background: #2daae4; + } + + ul.social li a.fa-twitter:hover { + background: #3dbaf4; + } + + ul.social li a.fa-dribbble { + background: #c4376b; + } + + ul.social li a.fa-dribbble:hover { + background: #d4477b; + } + + ul.social li a.fa-linkedin { + background: #006599; + } + + ul.social li a.fa-linkedin:hover { + background: #1075a9; + } + + ul.social li a.fa-tumblr { + background: #2b4661; + } + + ul.social li a.fa-tumblr:hover { + background: #3b5671; + } + + ul.social li a.fa-google-plus { + background: #da2713; + } + + ul.social li a.fa-google-plus:hover { + background: #ea3723; + } + +/* Icons */ + + .icon { + text-decoration: none; + position: relative; + text-decoration: none; + } + + .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.brands:before { + font-family: 'Font Awesome 5 Brands'; + } + + .icon:before { + line-height: inherit; + } + + .icon > .label { + display: none; + } + + .icon.featured { + position: relative; + display: inline-block; + background-color: #d52349; + width: 9em; + padding: 1.75em 0 0.75em 0; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + margin: 0 0 4.5em 0; + cursor: default; + } + + .icon.featured:before { + font-size: 4.5em; + line-height: 1em; + color: #fff; + } + + .icon.featured:after { + content: ''; + position: absolute; + bottom: -1.95em; + left: 0; + border-top: solid 2em #d52349; + border-left: solid 4.5em transparent; + border-right: solid 4.5em transparent; + } + + .icon.featured.alt { + background-color: #252122; + } + + .icon.featured.alt:after { + border-top-color: #252122; + } + + .icon.featured.alt2 { + background-color: #827a7c; + } + + .icon.featured.alt2:after { + border-top-color: #827a7c; + } + +/* Page Wrapper */ + + #page-wrapper > section { + margin-bottom: 0; + } + +/* Header */ + + #header { + position: relative; + background: #ffffff; + border-bottom: solid 1px #ccc; + padding: 5em 0 4em 0; + text-align: center; + } + + #header h1 { + color: #252122; + font-weight: 900; + font-size: 2.5em; + letter-spacing: -0.035em; + line-height: 1; + } + +/* Nav */ + + #nav { + margin: 2.5em 0 0 0; + } + + #nav > ul { + margin: 0; + } + + #nav > ul > li { + display: inline-block; + font-style: italic; + margin: 0 0.35em 0 0.35em; + } + + #nav > ul > li > ul { + display: none; + } + + #nav > ul > li > a { + border-radius: 5px; + color: #5d5d5d; + text-decoration: none; + padding: 0.6em 1.2em 0.6em 1.2em; + -moz-transition: background-color .25s ease-in-out; + -webkit-transition: background-color .25s ease-in-out; + -ms-transition: background-color .25s ease-in-out; + transition: background-color .25s ease-in-out; + outline: 0; + } + + #nav > ul > li:hover > a, #nav > ul > li.active > a { + background: #f3f3f3; + } + + #nav > ul > li.current > a { + background: #d52349; + color: #fff !important; + font-weight: 700; + } + + .dropotron { + border-radius: 5px; + background-color: #252122; + background-color: rgba(34, 30, 31, 0.98); + padding: 1.25em 1.5em 1.25em 1.5em; + font-style: italic; + min-width: 13em; + box-shadow: 0px 8px 15px 0px rgba(0, 0, 0, 0.5); + text-align: left; + margin-top: -1.25em; + margin-left: -1px; + list-style: none; + } + + .dropotron a, .dropotron span { + color: #aaa; + text-decoration: none; + -moz-transition: color .25s ease-in-out; + -webkit-transition: color .25s ease-in-out; + -ms-transition: color .25s ease-in-out; + transition: color .25s ease-in-out; + } + + .dropotron li { + padding: 0.25em 0 0.25em 0; + } + + .dropotron li:hover > a, .dropotron li:hover > span { + color: #fff; + } + + .dropotron.level-0 { + margin-top: 2em; + } + + .dropotron.level-0:before { + content: ''; + display: block; + position: absolute; + left: 50%; + margin-left: -10px; + top: -9px; + border-left: solid 10px transparent; + border-right: solid 10px transparent; + border-bottom: solid 10px #252122; + border-bottom-color: rgba(34, 30, 31, 0.98); + } + +/* Banner */ + + #banner { + background: #CCE8F4 url("../../images/pic01.jpg"); + background-position: center center; + background-size: auto 100%; + background-repeat: no-repeat; + text-align: center; + position: relative; + padding: 8em 0; + margin: 4em 0 0 0; + } + + #banner header { + background-color: rgba(34, 30, 31, 0.98); + display: inline-block; + padding: 2.5em 5em; + border-radius: 5px; + } + + #banner header h2 { + color: #fff; + font-weight: 700; + font-size: 2.5em; + margin: 0 0 0.65em 0; + } + + #banner header p { + color: #d52349; + padding: 0; + font-style: normal; + margin: 0; + font-size: 1.5em; + } + +/* Intro */ + + #intro { + text-align: center; + overflow: hidden; + } + + #intro section { + margin: 3em 0; + padding: 2.5em 0; + } + + #intro h2 { + font-size: 1.75em; + } + + #intro p { + margin: 0; + } + + #intro .middle { + position: relative; + z-index: 1; + } + + #intro .middle:before { + content: ''; + width: 32px; + height: 100%; + position: absolute; + left: -24px; + top: 0; + display: block; + z-index: -1; + box-shadow: 32px 0 0 0 #fff, 0 -32px 0 0 #fff, 0 32px 0 0 #fff, 32px 32px 0 0 #fff, 32px -32px 0 0 #fff, 0 0 32px 0 rgba(0, 0, 0, 0.15); + } + + #intro .middle:after { + content: ''; + width: 32px; + height: 100%; + position: absolute; + right: -24px; + top: 0; + display: block; + z-index: -1; + box-shadow: -32px 0 0 0 #fff, 0 -32px 0 0 #fff, 0 32px 0 0 #fff, -32px 32px 0 0 #fff, -32px -32px 0 0 #fff, 0 0 32px 0 rgba(0, 0, 0, 0.15); + } + + #intro .button { + min-width: 12em; + } + + #intro footer { + margin: 0; + } + +/* Main */ + + #main { + position: relative; + background: #f7f7f7 url("images/bg02.png"); + padding: 4em 0 4em 0; + } + + #main:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + background: url("images/bg01.png"); + background-size: 100% 100%; + z-index: 0; + opacity: 0.1; + } + + #main .major h2 { + background: #f7f7f7 url("images/bg02.png"); + } + +/* Footer */ + + #footer { + position: relative; + color: #858484; + padding: 4em 0; + } + + #footer:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + background: url("images/bg01.png"); + background-size: 100% 100%; + z-index: 0; + opacity: 0.5; + } + + #footer a { + color: #c5c4c4; + } + + #footer h2, #footer h3, #footer h4, #footer h5, #footer h6, #footer strong, #footer b { + color: #fff; + } + + #footer h2 a, #footer h3 a, #footer h4 a, #footer h5 a, #footer h6 a, #footer strong a, #footer b a { + color: inherit; + } + + #footer ul.contact li, + #footer ul.dates li, + #footer ul.divided li { + border-top-color: #353434; + border-top-color: rgba(255, 255, 255, 0.05); + } + + #footer header { + margin: 0 0 3em 0; + } + + #footer header h2 { + font-size: 1.75em; + } + +/* Copyright */ + + #copyright { + text-align: center; + margin: 3em 0 2em 0; + } + + #copyright ul.links { + display: inline-block; + background: #2C2929; + background: rgba(255, 255, 255, 0.05); + border-radius: 5px; + margin: 0; + padding: 0.85em 2.25em 0.85em 2.25em; + } + +/* XLarge */ + + @media screen and (max-width: 1680px) { + + /* Basic */ + + body, input, textarea, select { + font-size: 12pt; + } + + } + +/* Large */ + + @media screen and (max-width: 1280px) { + + /* Basic */ + + body, input, textarea, select { + font-size: 11pt; + } + + /* Section/Article */ + + header.major { + margin: 0.75em 0 2.5em 0; + } + + header.major h2 { + padding: 0 1em 0 1em; + } + + /* Social */ + + ul.social li { + margin: 0 0 0.25em 0.75em; + } + + /* Header */ + + #header { + padding: 4em 0 3em 0; + } + + /* Banner */ + + #banner { + padding: 6em 0; + margin: 3em 0 0 0; + } + + /* Intro */ + + #intro { + padding: 0; + } + + #intro section { + padding: 1em 2em; + } + + #intro .middle:before { + left: -12px; + } + + #intro .middle:after { + right: -12px; + } + + /* Main */ + + #main { + padding: 30px 0; + } + + /* Footer */ + + #footer { + padding: 3em 0; + } + + #footer:before { + height: 2.5em; + } + + #footer header { + margin: 0 0 1.5em 0; + } + + #footer header h2 { + font-size: 1.25em; + } + + /* Copyright */ + + #copyright { + margin: 0; + } + + } + +/* Medium */ + + #navPanel, #titleBar { + display: none; + } + + @media screen and (max-width: 980px) { + + /* Basic */ + + html, body { + overflow-x: hidden; + } + + /* Box */ + + .box footer ul.actions li { + margin: 1em 0 0 0; + display: block; + } + + .box footer ul.actions li .button { + width: 100%; + } + + .box footer ul.actions li:first-child { + margin-top: 0; + } + + /* Header */ + + #header { + padding: 3.5em 0 3em 0; + } + + /* Nav */ + + #nav { + display: none; + } + + /* Intro */ + + #intro { + padding: 3em 0 0 0; + } + + #intro section { + position: relative; + border-top: solid 1px #dfdfdf; + margin: 0; + padding: 40px 0 0 0; + } + + #intro section.first { + border-top: 0; + padding-top: 0; + } + + #intro section p { + margin: 0; + } + + #intro .middle:before, #intro .middle:after { + display: none; + } + + #intro footer { + padding: 3em 0 0 0; + } + + #intro footer ul.actions { + margin-bottom: 0; + } + + /* Main */ + + #main { + padding: 40px 0; + } + + /* Copyright */ + + #copyright ul.links { + display: block; + } + + /* 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; + } + + #titleBar { + -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: 44px; + left: 0; + position: fixed; + top: 0; + width: 100%; + z-index: 10001; + background: none; + } + + #titleBar .toggle { + text-decoration: none; + width: 80px; + height: 60px; + } + + #titleBar .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; + } + + #titleBar .toggle:before { + content: '\f0c9'; + display: block; + position: absolute; + left: 10px; + top: 10px; + width: 50px; + height: 40px; + line-height: 40px; + font-size: 18px; + color: #fff; + text-align: center; + background: rgba(150, 150, 150, 0.75); + border-radius: 5px; + } + + #titleBar .toggle:active:before { + background-color: #969696; + } + + #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; + color: #858484; + background-image: url("images/bg02.png"); + box-shadow: inset -3px 0px 5px 0px rgba(0, 0, 0, 0.35); + } + + #navPanel .link { + display: block; + color: #888; + text-decoration: none; + height: 44px; + line-height: 44px; + border-top: solid 1px rgba(255, 255, 255, 0.05); + padding: 0 1em 0 1em; + font-style: italic; + } + + #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; + } + + #navPanel .depth-0 { + color: #fff; + } + + body.navPanel-visible #page-wrapper { + -moz-transform: translateX(275px); + -webkit-transform: translateX(275px); + -ms-transform: translateX(275px); + transform: translateX(275px); + } + + body.navPanel-visible #titleBar { + -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); + } + + } + +/* Small */ + + @media screen and (max-width: 736px) { + + /* Basic */ + + body, input, textarea, select { + font-size: 11pt; + } + + h2, h3, h4, h5, h6 { + font-size: 1.25em; + } + + /* Button */ + + input[type="button"].large, + input[type="submit"].large, + input[type="reset"].large, + button.large, + .button.large { + font-size: 1.1em; + padding: 0.65em 1.5em 0.65em 1.5em; + } + + /* Actions */ + + ul.actions li { + margin: 1em 0 0 0; + display: block; + } + + ul.actions li .button { + width: 100%; + } + + ul.actions li:first-child { + margin-top: 0; + } + + /* Section/Article */ + + section, article { + margin-bottom: 20px; + } + + header { + margin: 0 0 1em 0; + } + + footer { + margin: 2em 0 0 0; + } + + /* Box */ + + .box { + padding: 25px 15px 20px 15px; + } + + .box .image.featured { + left: 15px; + top: 15px; + margin: -40px 0 40px -30px; + } + + .box.post header { + padding-top: 0; + margin: 0 0 1em 0; + } + + .box.post h2 { + font-size: 1.5em; + line-height: 1.5em; + } + + .box.post header > p { + margin-top: 0; + font-size: 1em; + } + + /* Divided */ + + ul.divided li { + padding: 0.5em 0 0.5em 0; + } + + /* Contact */ + + ul.contact li { + padding: 0.8em 0 0.8em 7em; + } + + ul.contact li h3 { + top: 0.8em; + } + + /* Dates */ + + ul.dates li { + padding-left: 6em; + } + + ul.dates h3 { + margin: 0 0 0.5em 0; + } + + /* Links */ + + ul.links li { + display: block; + padding: 0.25em 0 0 0; + margin: 0.25em 0 0 0; + border-left: 0; + } + + ul.links li:first-child { + padding-top: 0; + margin-top: 0; + } + + /* Social */ + + ul.social li { + margin: 0 0.5em 0.75em 0; + } + + /* Icons */ + + .icon.featured { + width: 8em; + margin: 0 0 3em 0; + } + + .icon.featured:after { + border-left: solid 4em transparent; + border-right: solid 4em transparent; + } + + /* Header */ + + #header { + text-align: center; + padding: 2em 0; + } + + #header h1 { + color: #252122; + font-weight: 900; + font-size: 1.75em; + letter-spacing: -0.035em; + } + + /* Intro */ + + #intro { + padding: 2em 0 0 0; + } + + #intro section { + padding: 40px 0 0 0; + margin: 20px 0 0 0; + } + + #intro h2 { + font-size: 1.25em; + } + + /* Banner */ + + #banner { + padding: 6em 0; + margin: 2em 0 0 0; + } + + #banner header { + padding: 1.5em 1em 1.5em 1em; + display: block; + border-radius: 0; + } + + #banner header h2 { + font-size: 1.5em; + line-height: 1.5em; + margin: 0 0 0.25em 0; + } + + #banner header p { + font-size: 1.2em; + } + + /* Main */ + + #main { + padding: 20px 0; + } + + /* Footer */ + + #footer { + padding: 40px 0 20px 0; + } + + } \ No newline at end of file diff --git a/webapp/templates/assets/js/breakpoints.min.js b/webapp/templates/assets/js/breakpoints.min.js new file mode 100644 index 0000000..32419cc --- /dev/null +++ b/webapp/templates/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/webapp/templates/assets/js/jquery.dropotron.min.js b/webapp/templates/assets/js/jquery.dropotron.min.js new file mode 100644 index 0000000..b992170 --- /dev/null +++ b/webapp/templates/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/webapp/templates/assets/js/jquery.min.js b/webapp/templates/assets/js/jquery.min.js new file mode 100644 index 0000000..a1c07fd --- /dev/null +++ b/webapp/templates/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 0 ul').dropotron({ + mode: 'fade', + noOpenerFade: true, + alignment: 'center' + }); + + // Nav. + + // Title Bar. + $( + '
' + + '' + + '
' + ) + .appendTo($body); + + // Panel. + $( + '' + ) + .appendTo($body) + .panel({ + delay: 500, + hideOnClick: true, + hideOnSwipe: true, + resetScroll: true, + resetForms: true, + side: 'left', + target: $body, + visibleClass: 'navPanel-visible' + }); + +})(jQuery); \ No newline at end of file diff --git a/webapp/templates/assets/js/util.js b/webapp/templates/assets/js/util.js new file mode 100644 index 0000000..bdb8e9f --- /dev/null +++ b/webapp/templates/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/webapp/templates/assets/sass/libs/_breakpoints.scss b/webapp/templates/assets/sass/libs/_breakpoints.scss new file mode 100644 index 0000000..c5301d8 --- /dev/null +++ b/webapp/templates/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/webapp/templates/assets/sass/libs/_functions.scss b/webapp/templates/assets/sass/libs/_functions.scss new file mode 100644 index 0000000..f563aab --- /dev/null +++ b/webapp/templates/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/webapp/templates/assets/sass/libs/_html-grid.scss b/webapp/templates/assets/sass/libs/_html-grid.scss new file mode 100644 index 0000000..7438a8c --- /dev/null +++ b/webapp/templates/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/webapp/templates/assets/sass/libs/_mixins.scss b/webapp/templates/assets/sass/libs/_mixins.scss new file mode 100644 index 0000000..a331483 --- /dev/null +++ b/webapp/templates/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/webapp/templates/assets/sass/libs/_vars.scss b/webapp/templates/assets/sass/libs/_vars.scss new file mode 100644 index 0000000..3358992 --- /dev/null +++ b/webapp/templates/assets/sass/libs/_vars.scss @@ -0,0 +1,22 @@ +// Misc. + $misc: ( + z-index-base: 10000 + ); + +// Duration. + $duration: ( + navPanel: 0.5s + ); + +// Size. + $size: ( + navPanel: 275px + ); + +// Font. + $font: ( + ); + +// Palette. + $palette: ( + ); \ No newline at end of file diff --git a/webapp/templates/assets/sass/libs/_vendor.scss b/webapp/templates/assets/sass/libs/_vendor.scss new file mode 100644 index 0000000..6599a3f --- /dev/null +++ b/webapp/templates/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/webapp/templates/assets/sass/main.scss b/webapp/templates/assets/sass/main.scss new file mode 100644 index 0000000..415fcfb --- /dev/null +++ b/webapp/templates/assets/sass/main.scss @@ -0,0 +1,1683 @@ +@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=Source+Sans+Pro:300,400,700,900,300italic"); + +/* + Dopetrope by HTML5 UP + html5up.net | @ajlkn + Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +*/ + +// Breakpoints. + + @include breakpoints(( + xlarge: ( 1281px, 1680px ), + large: ( 981px, 1280px ), + medium: ( 737px, 980px ), + small: ( 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: #252122; + background-image: url('images/bg02.png'); + + // Stops initial animations until page loads. + &.is-preload { + *, *:before, *:after { + @include vendor('animation', 'none !important'); + @include vendor('transition', 'none !important'); + } + } + + } + + body, input, textarea, select { + font-family: 'Source Sans Pro'; + font-weight: 300; + color: #5d5d5d; + font-size: 14pt; + line-height: 1.75em; + } + + strong, b { + color: #252122; + font-weight: 400; + } + + i, em { + font-style: italic; + } + + sub { + position: relative; + top: 0.5em; + font-size: 0.8em; + } + + sup { + position: relative; + top: -0.5em; + font-size: 0.8em; + } + + blockquote { + border-left: solid 0.75em #dddddd; + padding: 1em 0 1em 1.5em; + font-style: italic; + } + + h1, h2, h3, h4, h5, h6 { + color: #252122; + font-weight: 700; + } + + h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + color: inherit; + text-decoration: none; + } + + h2 { + font-size: 1.5em; + } + + h3 { + font-size: 1.35em; + } + + a { + color: #d52349; + text-decoration: underline; + + &:hover { + text-decoration: none; + } + } + + br.clear { + clear: both; + } + + hr { + border: 0; + border-top: solid 1px #dddddd; + height: 1px; + margin: 2em 0 2em 0; + } + + p, ul, ol, dl, table { + margin-bottom: 2em; + } + +/* Container */ + + .container { + margin: 0 auto; + max-width: 100%; + width: 70em; + + @include breakpoint('<=xlarge') { + width: 70em; + } + + @include breakpoint('<=large') { + width: calc(100% - 60px); + } + + @include breakpoint('<=medium') { + width: calc(100% - 80px); + } + + @include breakpoint('<=small') { + width: calc(100% - 40px); + } + } + +/* Row */ + + .row { + @include html-grid((50px, 50px)); + + @include breakpoint('<=xlarge') { + @include html-grid((50px, 50px), 'xlarge'); + } + + @include breakpoint('<=large') { + @include html-grid((30px, 30px), 'large'); + } + + @include breakpoint('<=medium') { + @include html-grid((40px, 40px), 'medium'); + } + + @include breakpoint('<=small') { + @include html-grid((20px, 20px), 'small'); + } + } + +/* Form */ + + form { + label { + display: block; + color: #252122; + font-weight: 400; + margin: 0 0 0.5em 0; + } + + input[type=text], + input[type=email], + input[type=password], + select, + textarea { + -webkit-appearance: none; + display: block; + border: 0; + padding: 0.75em 1em; + font-size: 1em; + border-radius: 5px; + border: solid 1px #dddddd; + background: #fff; + width: 100%; + + &:focus { + box-shadow: inset 0px 0px 1px 1px #43bff0; + } + } + + textarea { + height: 15em; + } + + ::-webkit-input-placeholder { + color: #555 !important; + } + + :-moz-placeholder { + color: #555 !important; + } + + ::-moz-placeholder { + color: #555 !important; + } + + :-ms-input-placeholder { + color: #555 !important; + } + + ::-moz-focus-inner { + border: 0; + } + } + +/* Tables */ + + table { + width: 100%; + + tr { + border-top: solid 1px #dddddd; + + &:first-child { + border-top: 0; + } + } + + td { + padding: 0.5em 1em 0.5em 1em; + + } + + th { + text-align: left; + padding: 0.5em 1em 0.5em 1em; + font-weight: 700; + margin: 0 0 1em 0; + } + + thead { + border-bottom: solid 2px #dddddd; + } + } + +/* Section/Article */ + + section, article { + margin-bottom: 2.5em; + + > :last-child, + &:last-child { + margin-bottom: 0; + } + } + + header { + margin: 0 0 1.5em 0; + + > p { + display: block; + font-style: italic; + margin: 0.5em 0 0 0; + padding-bottom: 0.5em; + } + + &.major { + position: relative; + text-align: center; + border-top: solid 1px #ccc; + top: 1em; + margin: 0 0 3em 0; + + h2 { + background: #fff; + position: relative; + top: -0.65em; + display: inline; + margin: 0; + padding: 0 1em 0 1em; + } + } + } + + footer { + margin: 2.25em 0 0 0; + } + +/* Box */ + + .box { + background: #ffffff; + border-bottom: solid 1px #ccc; + padding: 2.75em 1.75em 2.75em 1.75em; + + .image { + &.featured { + position: relative; + width: auto; + left: 1.75em; + top: 1.75em; + margin: -4.5em 0 4.25em -3.5em; + } + } + + &.post { + header { + padding-top: 1em; + margin: 0 0 2em 0; + } + + h2 { + font-size: 2.5em; + letter-spacing: -0.015em; + } + + header { + > p { + margin-top: 1.25em; + font-size: 1.25em; + } + } + } + + footer { + ul.actions { + margin-bottom: 0; + } + } + } + +/* Button */ + + input[type="button"], + input[type="submit"], + input[type="reset"], + button, + .button { + -webkit-appearance: none; + display: inline-block; + text-decoration: none; + cursor: pointer; + border: 0; + border-radius: 5px; + background: #d52349; + color: #fff !important; + font-weight: 700; + outline: 0; + font-size: 1.1em; + padding: 0.65em 1.5em 0.65em 1.5em; + text-align: center; + @include vendor('transition', 'background-color .25s ease-in-out'); + + &:hover { + background: #e53359; + } + + &:active { + background: #c51349; + } + + &.alt { + background: #252122; + + &:hover { + background: #353132; + } + + &:active { + background: #151112; + } + } + + &.icon { + &:before { + opacity: 0.35; + position: relative; + top: 0.05em; + margin-right: 0.75em; + } + } + + &.large { + font-size: 1.5em; + padding: 0.75em 1.5em 0.75em 1.5em; + } + } + +/* Image */ + + .image { + display: inline-block; + outline: 0; + + img { + display: block; + width: 100%; + } + + &.centered { + display: block; + margin: 0 0 2em 0; + + img { + margin: 0 auto; + width: auto; + } + } + + &.featured { + display: block; + width: 100%; + margin: 0 0 2em 0; + } + + &.left { + float: left; + margin: 0 2em 2em 0; + } + } + +/* List */ + + ul { + list-style: disc; + padding-left: 1em; + + li { + padding-left: 0.5em; + } + } + + ol { + list-style: decimal; + padding-left: 1.25em; + + li { + padding-left: 0.25em; + } + } + +/* Actions */ + + ul.actions { + list-style: none; + padding-left: 0; + + li { + display: inline-block; + margin-left: 1em; + padding-left: 0; + + &:first-child { + margin-left: 0; + } + } + } + +/* Links */ + + ul.links { + list-style: none; + padding-left: 0; + + li { + display: inline-block; + border-left: solid 1px rgba(255, 255, 255, 0.05); + padding: 0 0 0 1em; + margin: 0 0 0 1em; + + &:first-child { + border-left: 0; + padding-left: 0; + margin-left: 0; + } + } + } + +/* Contact */ + + ul.contact { + list-style: none; + padding-left: 0; + + li { + position: relative; + border-top: solid 1px #ddd; + padding: 1.3em 0 1.3em 7em; + + h3 { + position: absolute; + left: 0; + top: 1.3em; + font-size: 1.1em; + } + + p { + margin: 0; + } + + &:first-child { + padding-top: 0; + border-top: 0; + + h3 { + top: 0; + } + } + } + } + +/* Dates */ + + ul.dates { + list-style: none; + padding-left: 0; + + li { + position: relative; + border-top: solid 1px #ddd; + padding: 1.3em 0 1.3em 6.75em; + } + + .date { + display: block; + position: absolute; + left: 0; + top: 1.3em; + background-color: #d52349; + height: 3.5em; + text-align: center; + color: #fff; + line-height: 1em; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + padding: 0.5em 0.75em 0 1em; + + &:after { + content: ''; + position: absolute; + bottom: 0; + right: -1.2em; + border-left: solid 1.25em #d52349; + border-top: solid 1.8em transparent; + border-bottom: solid 1.8em transparent; + } + + strong { + display: block; + font-size: 1.75em; + padding-top: 0.15em; + } + } + + h3 { + font-size: 1.1em; + } + + p { + margin: 0; + } + + li { + &:first-child { + border-top: 0; + padding-top: 0; + .date { + top: 0; + } + } + } + } + +/* Divided */ + + ul.divided { + list-style: none; + padding-left: 0; + + li { + border-top: solid 1px #ddd; + padding: 1em 0 1em 0; + + &:first-child { + border-top: 0; + padding-top: 0; + } + } + } + +/* Social */ + + ul.social { + list-style: none; + padding-left: 0; + overflow: hidden; + cursor: default; + margin: 0 0 3.25em 0; + + li { + display: inline-block; + padding-left: 0; + margin-left: 0.75em; + + &:first-child { + margin-left: 0; + } + + a { + display: inline-block; + width: 3em; + height: 3em; + text-align: center; + border-radius: 5px; + background: #888; + @include vendor('transition', 'background-color .25s ease-in-out'); + + &:before { + color: #fff; + font-size: 2em; + line-height: 1.5em; + } + + &.fa-facebook { + background: #3c5a98; + + &:hover { + background: #4c6aa8; + } + } + + &.fa-twitter { + background: #2daae4; + + &:hover { + background: #3dbaf4; + } + } + + &.fa-dribbble { + background: #c4376b; + + &:hover { + background: #d4477b; + } + } + + &.fa-linkedin { + background: #006599; + + &:hover { + background: #1075a9; + } + } + + &.fa-tumblr { + background: #2b4661; + + &:hover { + background: #3b5671; + } + } + + &.fa-google-plus { + background: #da2713; + + &:hover { + background: #ea3723; + } + } + } + } + } + +/* Icons */ + + .icon { + @include icon; + position: relative; + text-decoration: none; + + &.solid { + &:before { + font-weight: 900; + } + } + + &.brands { + &:before { + font-family: 'Font Awesome 5 Brands'; + } + } + + &:before { + line-height: inherit; + } + + > .label { + display: none; + } + + &.featured { + position: relative; + display: inline-block; + background-color: #d52349; + width: 9em; + padding: 1.75em 0 0.75em 0; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + margin: 0 0 4.5em 0; + cursor: default; + + &:before { + font-size: 4.5em; + line-height: 1em; + color: #fff; + } + + &:after { + content: ''; + position: absolute; + bottom: -1.95em; + left: 0; + border-top: solid 2em #d52349; + border-left: solid 4.5em transparent; + border-right: solid 4.5em transparent; + } + + &.alt { + background-color: #252122; + + &:after { + border-top-color: #252122; + } + } + + &.alt2 { + background-color: #827a7c; + + &:after { + border-top-color: #827a7c; + } + } + } + } + +/* Page Wrapper */ + + #page-wrapper { + > section { + margin-bottom: 0; + } + } + +/* Header */ + + #header { + position: relative; + background: #ffffff; + border-bottom: solid 1px #ccc; + padding: 5em 0 4em 0; + text-align: center; + + h1 { + color: #252122; + font-weight: 900; + font-size: 2.5em; + letter-spacing: -0.035em; + line-height: 1; + } + } + +/* Nav */ + + #nav { + margin: 2.5em 0 0 0; + + > ul { + margin: 0; + + > li { + display: inline-block; + font-style: italic; + margin: 0 0.35em 0 0.35em; + + > ul { + display: none; + } + + > a { + border-radius: 5px; + color: #5d5d5d; + text-decoration: none; + padding: 0.6em 1.2em 0.6em 1.2em; + @include vendor('transition', 'background-color .25s ease-in-out'); + outline: 0; + } + + &:hover, &.active { + > a { + background: #f3f3f3; + } + } + + &.current { + > a { + background: #d52349; + color: #fff !important; + font-weight: 700; + } + } + } + } + } + + .dropotron { + border-radius: 5px; + background-color: #252122; + background-color: rgba(34, 30, 31, 0.98); + padding: 1.25em 1.5em 1.25em 1.5em; + font-style: italic; + min-width: 13em; + box-shadow: 0px 8px 15px 0px rgba(0, 0, 0, 0.5); + text-align: left; + margin-top: -1.25em; + margin-left: -1px; + list-style: none; + + a, span { + color: #aaa; + text-decoration: none; + @include vendor('transition', 'color .25s ease-in-out'); + } + + li { + padding: 0.25em 0 0.25em 0; + + &:hover > { + a, span { + color: #fff; + } + } + } + + &.level-0 { + margin-top: 2em; + + &:before { + content: ''; + display: block; + position: absolute; + left: 50%; + margin-left: -10px; + top: -9px; + border-left: solid 10px transparent; + border-right: solid 10px transparent; + border-bottom: solid 10px #252122; + border-bottom-color: rgba(34, 30, 31, 0.98); + } + } + } + +/* Banner */ + + #banner { + background: #CCE8F4 url('../../images/pic01.jpg'); + background-position: center center; + background-size: auto 100%; + background-repeat: no-repeat; + text-align: center; + position: relative; + padding: 8em 0; + margin: 4em 0 0 0; + + header { + background-color: rgba(34, 30, 31, 0.98); + display: inline-block; + padding: 2.5em 5em; + border-radius: 5px; + + h2 { + color: #fff; + font-weight: 700; + font-size: 2.5em; + margin: 0 0 0.65em 0; + } + + p { + color: #d52349; + padding: 0; + font-style: normal; + margin: 0; + font-size: 1.5em; + } + } + } + +/* Intro */ + + #intro { + text-align: center; + overflow: hidden; + + section { + margin: 3em 0; + padding: 2.5em 0; + } + + h2 { + font-size: 1.75em; + } + + p { + margin: 0; + } + + .middle { + position: relative; + z-index: 1; + + &:before { + content: ''; + width: 32px; + height: 100%; + position: absolute; + left: -24px; + top: 0; + display: block; + z-index: -1; + box-shadow: 32px 0 0 0 #fff, 0 -32px 0 0 #fff, 0 32px 0 0 #fff, 32px 32px 0 0 #fff, 32px -32px 0 0 #fff, 0 0 32px 0 rgba(0, 0, 0, 0.15); + } + + &:after { + content: ''; + width: 32px; + height: 100%; + position: absolute; + right: -24px; + top: 0; + display: block; + z-index: -1; + box-shadow: -32px 0 0 0 #fff, 0 -32px 0 0 #fff, 0 32px 0 0 #fff, -32px 32px 0 0 #fff, -32px -32px 0 0 #fff, 0 0 32px 0 rgba(0, 0, 0, 0.15); + } + } + + .button { + min-width: 12em; + } + + footer { + margin: 0; + } + } + +/* Main */ + + #main { + position: relative; + background: #f7f7f7 url('images/bg02.png'); + padding: 4em 0 4em 0; + + &:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + background: url('images/bg01.png'); + background-size: 100% 100%; + z-index: 0; + opacity: 0.1; + } + + .major { + h2 { + background: #f7f7f7 url('images/bg02.png'); + } + } + } + +/* Footer */ + + #footer { + position: relative; + color: #858484; + padding: 4em 0; + + &:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + background: url('images/bg01.png'); + background-size: 100% 100%; + z-index: 0; + opacity: 0.5; + } + + a { + color: #c5c4c4; + } + + h2, h3, h4, h5, h6, strong, b { + color: #fff; + + a { + color: inherit; + } + } + + ul { + &.contact li, + &.dates li, + &.divided li { + border-top-color: #353434; + border-top-color: rgba(255, 255, 255, 0.05); + } + } + + header { + margin: 0 0 3em 0; + + h2 { + font-size: 1.75em; + } + } + } + +/* Copyright */ + + #copyright { + text-align: center; + margin: 3em 0 2em 0; + + ul.links { + display: inline-block; + background: #2C2929; + background: rgba(255, 255, 255, 0.05); + border-radius: 5px; + margin: 0; + padding: 0.85em 2.25em 0.85em 2.25em; + } + } + +/* XLarge */ + + @include breakpoint('<=xlarge') { + + /* Basic */ + + body, input, textarea, select { + font-size: 12pt; + } + + } + +/* Large */ + + @include breakpoint('<=large') { + + /* Basic */ + + body, input, textarea, select { + font-size: 11pt; + } + + /* Section/Article */ + + header { + &.major { + margin: 0.75em 0 2.5em 0; + + h2 { + padding: 0 1em 0 1em; + } + } + } + + /* Social */ + + ul.social { + li { + margin: 0 0 0.25em 0.75em; + } + } + + /* Header */ + + #header { + padding: 4em 0 3em 0; + } + + /* Banner */ + + #banner { + padding: 6em 0; + margin: 3em 0 0 0; + } + + /* Intro */ + + #intro { + padding: 0; + + section { + padding: 1em 2em; + } + + .middle { + &:before { + left: -12px; + } + + &:after { + right: -12px; + } + } + } + + /* Main */ + + #main { + padding: 30px 0; + } + + /* Footer */ + + #footer { + padding: 3em 0; + + &:before { + height: 2.5em; + } + + header { + margin: 0 0 1.5em 0; + + h2 { + font-size: 1.25em; + } + } + } + + /* Copyright */ + + #copyright { + margin: 0; + } + + } + +/* Medium */ + + #navPanel, #titleBar { + display: none; + } + + @include breakpoint('<=medium') { + + /* Basic */ + + html, body { + overflow-x: hidden; + } + + /* Box */ + + .box { + footer { + ul.actions { + li { + margin: 1em 0 0 0; + display: block; + + .button { + width: 100%; + } + + &:first-child { + margin-top: 0; + } + } + } + } + } + + /* Header */ + + #header { + padding: 3.5em 0 3em 0; + } + + /* Nav */ + + #nav { + display: none; + } + + /* Intro */ + + #intro { + padding: 3em 0 0 0; + + section { + position: relative; + border-top: solid 1px #dfdfdf; + margin: 0; + padding: 40px 0 0 0; + + &.first { + border-top: 0; + padding-top: 0; + } + + p { + margin: 0; + } + } + + .middle { + &:before, &:after { + display: none; + } + } + + footer { + padding: 3em 0 0 0; + + ul.actions { + margin-bottom: 0; + } + } + } + + /* Main */ + + #main { + padding: 40px 0; + } + + /* Copyright */ + + #copyright { + ul.links { + display: block; + } + } + + /* Nav */ + + #page-wrapper { + @include vendor('backface-visibility', 'hidden'); + @include vendor('transition', 'transform #{_duration(navPanel)} ease'); + padding-bottom: 1px; + } + + #titleBar { + @include vendor('backface-visibility', 'hidden'); + @include vendor('transition', 'transform #{_duration(navPanel)} ease'); + display: block; + height: 44px; + left: 0; + position: fixed; + top: 0; + width: 100%; + z-index: _misc(z-index-base) + 1; + background: none; + + .toggle { + @include icon(false, solid); + width: 80px; + height: 60px; + + &:before { + content: '\f0c9'; + display: block; + position: absolute; + left: 10px; + top: 10px; + width: 50px; + height: 40px; + line-height: 40px; + font-size: 18px; + color: #fff; + text-align: center; + background: rgba(150, 150, 150, 0.75); + border-radius: 5px; + } + + &:active:before { + background-color: rgba(150, 150, 150, 1); + } + } + } + + #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; + color: #858484; + background-image: url('images/bg02.png'); + box-shadow: inset -3px 0px 5px 0px rgba(0, 0, 0, 0.35); + + .link { + display: block; + color: #888; + text-decoration: none; + height: 44px; + line-height: 44px; + border-top: solid 1px rgba(255, 255, 255, 0.05); + padding: 0 1em 0 1em; + font-style: italic; + + &: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; + } + + .depth-0 { + color: #fff; + } + } + + body { + &.navPanel-visible { + #page-wrapper { + @include vendor('transform', 'translateX(#{_size(navPanel)})'); + } + + #titleBar { + @include vendor('transform', 'translateX(#{_size(navPanel)})'); + } + + #navPanel { + @include vendor('transform', 'translateX(0)'); + } + } + } + + } + +/* Small */ + + @include breakpoint('<=small') { + + /* Basic */ + + body, input, textarea, select { + font-size: 11pt; + } + + h2, h3, h4, h5, h6 { + font-size: 1.25em; + } + + /* Button */ + + input[type="button"], + input[type="submit"], + input[type="reset"], + button, + .button { + &.large { + font-size: 1.1em; + padding: 0.65em 1.5em 0.65em 1.5em; + } + } + + /* Actions */ + + ul.actions { + li { + margin: 1em 0 0 0; + display: block; + + .button { + width: 100%; + } + + &:first-child { + margin-top: 0; + } + } + } + + /* Section/Article */ + + section, article { + margin-bottom: 20px; + } + + header { + margin: 0 0 1em 0; + } + + footer { + margin: 2em 0 0 0; + } + + /* Box */ + + .box { + padding: 25px 15px 20px 15px; + + .image.featured { + left: 15px; + top: 15px; + margin: -40px 0 40px -30px; + } + + &.post { + header { + padding-top: 0; + margin: 0 0 1em 0; + } + + h2 { + font-size: 1.5em; + line-height: 1.5em; + } + + header { + > p { + margin-top: 0; + font-size: 1em; + } + } + } + } + + /* Divided */ + + ul.divided { + li { + padding: 0.5em 0 0.5em 0; + } + } + + /* Contact */ + + ul.contact { + li { + padding: 0.8em 0 0.8em 7em; + + h3 { + top: 0.8em; + } + } + } + + /* Dates */ + + ul.dates { + li { + padding-left: 6em; + } + + h3 { + margin: 0 0 0.5em 0; + } + } + + /* Links */ + + ul.links { + li { + display: block; + padding: 0.25em 0 0 0; + margin: 0.25em 0 0 0; + border-left: 0; + + &:first-child { + padding-top: 0; + margin-top: 0; + } + } + } + + /* Social */ + + ul.social { + li { + margin: 0 0.5em 0.75em 0; + } + } + + /* Icons */ + + .icon { + &.featured { + width: 8em; + margin: 0 0 3em 0; + + &:after { + border-left: solid 4em transparent; + border-right: solid 4em transparent; + } + } + } + + /* Header */ + + #header { + text-align: center; + padding: 2em 0; + + h1 { + color: #252122; + font-weight: 900; + font-size: 1.75em; + letter-spacing: -0.035em; + } + } + + /* Intro */ + + #intro { + padding: 2em 0 0 0; + + section { + padding: 40px 0 0 0; + margin: 20px 0 0 0; + } + + h2 { + font-size: 1.25em; + } + } + + /* Banner */ + + #banner { + padding: 6em 0; + margin: 2em 0 0 0; + + header { + padding: 1.5em 1em 1.5em 1em; + display: block; + border-radius: 0; + + h2 { + font-size: 1.5em; + line-height: 1.5em; + margin: 0 0 0.25em 0; + } + + p { + font-size: 1.2em; + } + } + } + + /* Main */ + + #main { + padding: 20px 0; + } + + /* Footer */ + + #footer { + padding: 40px 0 20px 0; + } + + } \ No newline at end of file diff --git a/webapp/templates/assets/webfonts/fa-brands-400.eot b/webapp/templates/assets/webfonts/fa-brands-400.eot new file mode 100644 index 0000000..e79f40f Binary files /dev/null and b/webapp/templates/assets/webfonts/fa-brands-400.eot differ diff --git a/webapp/templates/assets/webfonts/fa-brands-400.svg b/webapp/templates/assets/webfonts/fa-brands-400.svg new file mode 100644 index 0000000..ba0d850 --- /dev/null +++ b/webapp/templates/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/webapp/templates/assets/webfonts/fa-brands-400.ttf b/webapp/templates/assets/webfonts/fa-brands-400.ttf new file mode 100644 index 0000000..217ffe9 Binary files /dev/null and b/webapp/templates/assets/webfonts/fa-brands-400.ttf differ diff --git a/webapp/templates/assets/webfonts/fa-brands-400.woff b/webapp/templates/assets/webfonts/fa-brands-400.woff new file mode 100644 index 0000000..a2d8025 Binary files /dev/null and b/webapp/templates/assets/webfonts/fa-brands-400.woff differ diff --git a/webapp/templates/assets/webfonts/fa-brands-400.woff2 b/webapp/templates/assets/webfonts/fa-brands-400.woff2 new file mode 100644 index 0000000..e27b0bf Binary files /dev/null and b/webapp/templates/assets/webfonts/fa-brands-400.woff2 differ diff --git a/webapp/templates/assets/webfonts/fa-regular-400.eot b/webapp/templates/assets/webfonts/fa-regular-400.eot new file mode 100644 index 0000000..d62be2f Binary files /dev/null and b/webapp/templates/assets/webfonts/fa-regular-400.eot differ diff --git a/webapp/templates/assets/webfonts/fa-regular-400.svg b/webapp/templates/assets/webfonts/fa-regular-400.svg new file mode 100644 index 0000000..751083e --- /dev/null +++ b/webapp/templates/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/webapp/templates/assets/webfonts/fa-regular-400.ttf b/webapp/templates/assets/webfonts/fa-regular-400.ttf new file mode 100644 index 0000000..eb3cb5e Binary files /dev/null and b/webapp/templates/assets/webfonts/fa-regular-400.ttf differ diff --git a/webapp/templates/assets/webfonts/fa-regular-400.woff b/webapp/templates/assets/webfonts/fa-regular-400.woff new file mode 100644 index 0000000..43b1a9a Binary files /dev/null and b/webapp/templates/assets/webfonts/fa-regular-400.woff differ diff --git a/webapp/templates/assets/webfonts/fa-regular-400.woff2 b/webapp/templates/assets/webfonts/fa-regular-400.woff2 new file mode 100644 index 0000000..b9344a7 Binary files /dev/null and b/webapp/templates/assets/webfonts/fa-regular-400.woff2 differ diff --git a/webapp/templates/assets/webfonts/fa-solid-900.eot b/webapp/templates/assets/webfonts/fa-solid-900.eot new file mode 100644 index 0000000..c77baa8 Binary files /dev/null and b/webapp/templates/assets/webfonts/fa-solid-900.eot differ diff --git a/webapp/templates/assets/webfonts/fa-solid-900.svg b/webapp/templates/assets/webfonts/fa-solid-900.svg new file mode 100644 index 0000000..627128b --- /dev/null +++ b/webapp/templates/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/webapp/templates/assets/webfonts/fa-solid-900.ttf b/webapp/templates/assets/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000..c6c3dd4 Binary files /dev/null and b/webapp/templates/assets/webfonts/fa-solid-900.ttf differ diff --git a/webapp/templates/assets/webfonts/fa-solid-900.woff b/webapp/templates/assets/webfonts/fa-solid-900.woff new file mode 100644 index 0000000..77c1786 Binary files /dev/null and b/webapp/templates/assets/webfonts/fa-solid-900.woff differ diff --git a/webapp/templates/assets/webfonts/fa-solid-900.woff2 b/webapp/templates/assets/webfonts/fa-solid-900.woff2 new file mode 100644 index 0000000..e30fb67 Binary files /dev/null and b/webapp/templates/assets/webfonts/fa-solid-900.woff2 differ diff --git a/webapp/templates/base.html b/webapp/templates/base.html new file mode 100644 index 0000000..f1207aa --- /dev/null +++ b/webapp/templates/base.html @@ -0,0 +1,358 @@ + + + + + {% block title %}{{service_name}}{% endblock %} + + + + + + +
+ + + + + +
+
+
+
+ + + + {% with messages = get_flashed_messages() %} + {% if messages %} +
+
+
    + {% for message in messages %} +
  • {{ message }}
  • + {% endfor %} +
+
+
+ {% endif %} + {% endwith %} + + {% block content %}{% endblock %} + +
+ +
+

Right sidebar

+

Lorem ipsum dolor sit amet feugiat

+
+

+ Vestibulum scelerisque ultricies libero id hendrerit. Vivamus malesuada quam faucibus ante dignissim auctor + hendrerit libero placerat. Nulla facilisi. Proin aliquam felis non arcu molestie at accumsan turpis commodo. + Proin elementum, nibh non egestas sodales, augue quam aliquet est, id egestas diam justo adipiscing ante. + Pellentesque tempus nulla non urna eleifend ut ultrices nisi faucibus. +

+

+ Praesent a dolor leo. Duis in felis in tortor lobortis volutpat et pretium tellus. Vestibulum ac ante nisl, + a elementum odio. Duis semper risus et lectus commodo fringilla. Maecenas sagittis convallis justo vel mattis. + placerat, nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. +

+
+
+

Something else

+
+

+ Elementum odio duis semper risus et lectus commodo fringilla. Maecenas sagittis convallis justo vel mattis. + placerat, nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. +

+

+ Nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. +

+
+
+
+

So in conclusion ...

+
+

+ Nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. Elementum odio duis semper risus et lectus commodo fringilla. + Maecenas sagittis convallis justo vel mattis. +

+
+
+ +
+
+ + + {% block login %} +
+ + + {% if g.user %} +
+

User Details

+
+
    +
  • email: {{ g.user['email'] }}
  • +
  • balance {{ g.user.btc_balance() }} BTC
  • +
+ Show Deposit Address + + BTC Deposit Address: +
    +
  • +
+
+ + + {% else %} +
+

User Login

+
+ {% if error_login %} +

+ {{ error_login }} +

+ {% endif %} + +
+ + + + +
+
+
+ + Forgot? +
+ + {% endif %} + +
+ {% endblock %} +
+
+

Feugiat consequat

+
+

Veroeros sed amet blandit consequat veroeros lorem blandit adipiscing et feugiat sed lorem consequat feugiat lorem dolore.

+ + +
+ +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/webapp/templates/base_old.html b/webapp/templates/base_old.html new file mode 100644 index 0000000..3265e5b --- /dev/null +++ b/webapp/templates/base_old.html @@ -0,0 +1,27 @@ + +{% block title %}{% endblock %} - Flaskr + + +
+
+ {% block header %}{% endblock %} +
+ {% for message in get_flashed_messages() %} +
{{ message }}
+ {% endfor %} + {% block content %}{% endblock %} +
\ No newline at end of file diff --git a/webapp/templates/email_base.html b/webapp/templates/email_base.html new file mode 100644 index 0000000..22299f6 --- /dev/null +++ b/webapp/templates/email_base.html @@ -0,0 +1,15 @@ + + + + + {% block title %}Title{% endblock %} + + + +{% block content %}{% endblock %} + + +Kind Regards,
+{{service_name}} Staff + + \ No newline at end of file diff --git a/webapp/templates/email_confirm.html b/webapp/templates/email_confirm.html new file mode 100644 index 0000000..a57a47b --- /dev/null +++ b/webapp/templates/email_confirm.html @@ -0,0 +1,7 @@ +{% extends 'email_base.html' %} + +{% block title %}{{ service_name }} Register{% endblock %} + +{% block content %} +Welcome to {{ service_name }}, to activate your account CLICK HERE +{% endblock %} diff --git a/webapp/templates/email_forgot.html b/webapp/templates/email_forgot.html new file mode 100644 index 0000000..2f252f7 --- /dev/null +++ b/webapp/templates/email_forgot.html @@ -0,0 +1,19 @@ +{% extends 'email_base.html' %} + +{% block title %}{{ service_name }} Password Reset{% endblock %} + +{% block content %} +

+A password reset process was started for your account at {{ service_name }} service. +

+ +

+ If you don't requested the credential reset, just discard this message. +

+ +

+ To set a new account credential CLICK HERE and follow the instructions. + The link is valid for 1 hour. +

+ +{% endblock %} diff --git a/webapp/templates/forgot.html b/webapp/templates/forgot.html new file mode 100644 index 0000000..b206bbb --- /dev/null +++ b/webapp/templates/forgot.html @@ -0,0 +1,30 @@ +{% extends 'base.html' %} + +{% block title %}Password Forgot{% endblock %} + +{% block content %} + +
+ +
+

Recover your credentials here

+
+ + {% if error %} +

+ {{ error }} +

+ {% endif %} + +
+ + +

+
+
+ +
+ +
+ +{% endblock %} \ No newline at end of file diff --git a/webapp/templates/forgot_confirm.html b/webapp/templates/forgot_confirm.html new file mode 100644 index 0000000..b042c8e --- /dev/null +++ b/webapp/templates/forgot_confirm.html @@ -0,0 +1,32 @@ +{% extends 'base.html' %} + +{% block title %}Request Password Reset{% endblock %} + +{% block content %} + +
+ +
+

Request password reset here

+
+ + {% if error %} +

+ {{ error }} +

+ {% endif %} + +
+ + +

+
+
+ +
+ +
+ + + +{% endblock %} \ No newline at end of file diff --git a/webapp/templates/html5up-dopetrope.zip b/webapp/templates/html5up-dopetrope.zip new file mode 100644 index 0000000..c0df788 Binary files /dev/null and b/webapp/templates/html5up-dopetrope.zip differ diff --git a/webapp/templates/html5up-dopetrope/LICENSE.txt b/webapp/templates/html5up-dopetrope/LICENSE.txt new file mode 100644 index 0000000..d447b56 --- /dev/null +++ b/webapp/templates/html5up-dopetrope/LICENSE.txt @@ -0,0 +1,63 @@ +Creative Commons Attribution 3.0 Unported +http://creativecommons.org/licenses/by/3.0/ + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + 1. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. + 2. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. + 3. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. + 4. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. + 5. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. + 6. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. + 7. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + 8. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. + 9. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + 1. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; + 2. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; + 3. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, + 4. to Distribute and Publicly Perform Adaptations. + 5. + + For the avoidance of doubt: + 1. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; + 2. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, + 3. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + 1. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested. + 2. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. + 3. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + 1. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + 2. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + 1. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + 3. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + 4. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + 5. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + 6. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. diff --git a/webapp/templates/html5up-dopetrope/README.txt b/webapp/templates/html5up-dopetrope/README.txt new file mode 100644 index 0000000..601f88f --- /dev/null +++ b/webapp/templates/html5up-dopetrope/README.txt @@ -0,0 +1,31 @@ +Dopetrope by HTML5 UP +html5up.net | @ajlkn +Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) + + +A spiffy new blog/magazine style responsive site template with a flat/minimal +design aesthetic. + +Demo images* are courtesy of the incredibly talented Janine Pring aka Dreametry Doodle. +See more of her amazing work (and her awesome t-shirt line) @ dreametrydoodle.com + +(* = Not included! Only meant for use with my own on-site demo, so please do NOT download +and/or use any of Janine's work without her explicit permission!) + +Feedback, bug reports, and comments are not only welcome, but strongly encouraged :) + +AJ +aj@lkn.io | @ajlkn + + +Credits: + + Demo Images: + Dreametry Doodle (dreametrydoodle.com) + + Icons: + Font Awesome (fontawesome.io) + + Other: + jQuery (jquery.com) + Responsive Tools (github.com/ajlkn/responsive-tools) \ No newline at end of file diff --git a/webapp/templates/html5up-dopetrope/assets/css/fontawesome-all.min.css b/webapp/templates/html5up-dopetrope/assets/css/fontawesome-all.min.css new file mode 100644 index 0000000..b7d052b --- /dev/null +++ b/webapp/templates/html5up-dopetrope/assets/css/fontawesome-all.min.css @@ -0,0 +1,5 @@ +/*! + * 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/webapp/templates/html5up-dopetrope/assets/css/images/bg.png b/webapp/templates/html5up-dopetrope/assets/css/images/bg.png new file mode 100644 index 0000000..b8f65cb Binary files /dev/null and b/webapp/templates/html5up-dopetrope/assets/css/images/bg.png differ diff --git a/webapp/templates/html5up-dopetrope/assets/css/main.css b/webapp/templates/html5up-dopetrope/assets/css/main.css new file mode 100644 index 0000000..525b1d3 --- /dev/null +++ b/webapp/templates/html5up-dopetrope/assets/css/main.css @@ -0,0 +1,2908 @@ +@import url("fontawesome-all.min.css"); +@import url("https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,700,900,300italic"); + +/* + Dopetrope by HTML5 UP + html5up.net | @ajlkn + Free for personal and commercial use under the CCA 3.0 license (html5up.net/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: #252122; + background-image: url("images/bg02.png"); + } + + 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, textarea, select { + font-family: 'Source Sans Pro'; + font-weight: 300; + color: #5d5d5d; + font-size: 14pt; + line-height: 1.75em; + } + + strong, b { + color: #252122; + font-weight: 400; + } + + i, em { + font-style: italic; + } + + sub { + position: relative; + top: 0.5em; + font-size: 0.8em; + } + + sup { + position: relative; + top: -0.5em; + font-size: 0.8em; + } + + blockquote { + border-left: solid 0.75em #dddddd; + padding: 1em 0 1em 1.5em; + font-style: italic; + } + + h1, h2, h3, h4, h5, h6 { + color: #252122; + font-weight: 700; + } + + h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + color: inherit; + text-decoration: none; + } + + h2 { + font-size: 1.5em; + } + + h3 { + font-size: 1.35em; + } + + a { + color: #d52349; + text-decoration: underline; + } + + a:hover { + text-decoration: none; + } + + br.clear { + clear: both; + } + + hr { + border: 0; + border-top: solid 1px #dddddd; + height: 1px; + margin: 2em 0 2em 0; + } + + p, ul, ol, dl, table { + margin-bottom: 2em; + } + +/* Container */ + + .container { + margin: 0 auto; + max-width: 100%; + width: 70em; + } + + @media screen and (max-width: 1680px) { + + .container { + width: 70em; + } + + } + + @media screen and (max-width: 1280px) { + + .container { + width: calc(100% - 60px); + } + + } + + @media screen and (max-width: 980px) { + + .container { + width: calc(100% - 80px); + } + + } + + @media screen and (max-width: 736px) { + + .container { + width: calc(100% - 40px); + } + + } + +/* 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-xlarge { + order: -1; + } + + .row > .col-1-xlarge { + width: 8.33333%; + } + + .row > .off-1-xlarge { + margin-left: 8.33333%; + } + + .row > .col-2-xlarge { + width: 16.66667%; + } + + .row > .off-2-xlarge { + margin-left: 16.66667%; + } + + .row > .col-3-xlarge { + width: 25%; + } + + .row > .off-3-xlarge { + margin-left: 25%; + } + + .row > .col-4-xlarge { + width: 33.33333%; + } + + .row > .off-4-xlarge { + margin-left: 33.33333%; + } + + .row > .col-5-xlarge { + width: 41.66667%; + } + + .row > .off-5-xlarge { + margin-left: 41.66667%; + } + + .row > .col-6-xlarge { + width: 50%; + } + + .row > .off-6-xlarge { + margin-left: 50%; + } + + .row > .col-7-xlarge { + width: 58.33333%; + } + + .row > .off-7-xlarge { + margin-left: 58.33333%; + } + + .row > .col-8-xlarge { + width: 66.66667%; + } + + .row > .off-8-xlarge { + margin-left: 66.66667%; + } + + .row > .col-9-xlarge { + width: 75%; + } + + .row > .off-9-xlarge { + margin-left: 75%; + } + + .row > .col-10-xlarge { + width: 83.33333%; + } + + .row > .off-10-xlarge { + margin-left: 83.33333%; + } + + .row > .col-11-xlarge { + width: 91.66667%; + } + + .row > .off-11-xlarge { + margin-left: 91.66667%; + } + + .row > .col-12-xlarge { + width: 100%; + } + + .row > .off-12-xlarge { + 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: 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-large { + order: -1; + } + + .row > .col-1-large { + width: 8.33333%; + } + + .row > .off-1-large { + margin-left: 8.33333%; + } + + .row > .col-2-large { + width: 16.66667%; + } + + .row > .off-2-large { + margin-left: 16.66667%; + } + + .row > .col-3-large { + width: 25%; + } + + .row > .off-3-large { + margin-left: 25%; + } + + .row > .col-4-large { + width: 33.33333%; + } + + .row > .off-4-large { + margin-left: 33.33333%; + } + + .row > .col-5-large { + width: 41.66667%; + } + + .row > .off-5-large { + margin-left: 41.66667%; + } + + .row > .col-6-large { + width: 50%; + } + + .row > .off-6-large { + margin-left: 50%; + } + + .row > .col-7-large { + width: 58.33333%; + } + + .row > .off-7-large { + margin-left: 58.33333%; + } + + .row > .col-8-large { + width: 66.66667%; + } + + .row > .off-8-large { + margin-left: 66.66667%; + } + + .row > .col-9-large { + width: 75%; + } + + .row > .off-9-large { + margin-left: 75%; + } + + .row > .col-10-large { + width: 83.33333%; + } + + .row > .off-10-large { + margin-left: 83.33333%; + } + + .row > .col-11-large { + width: 91.66667%; + } + + .row > .off-11-large { + margin-left: 91.66667%; + } + + .row > .col-12-large { + width: 100%; + } + + .row > .off-12-large { + 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: 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-medium { + order: -1; + } + + .row > .col-1-medium { + width: 8.33333%; + } + + .row > .off-1-medium { + margin-left: 8.33333%; + } + + .row > .col-2-medium { + width: 16.66667%; + } + + .row > .off-2-medium { + margin-left: 16.66667%; + } + + .row > .col-3-medium { + width: 25%; + } + + .row > .off-3-medium { + margin-left: 25%; + } + + .row > .col-4-medium { + width: 33.33333%; + } + + .row > .off-4-medium { + margin-left: 33.33333%; + } + + .row > .col-5-medium { + width: 41.66667%; + } + + .row > .off-5-medium { + margin-left: 41.66667%; + } + + .row > .col-6-medium { + width: 50%; + } + + .row > .off-6-medium { + margin-left: 50%; + } + + .row > .col-7-medium { + width: 58.33333%; + } + + .row > .off-7-medium { + margin-left: 58.33333%; + } + + .row > .col-8-medium { + width: 66.66667%; + } + + .row > .off-8-medium { + margin-left: 66.66667%; + } + + .row > .col-9-medium { + width: 75%; + } + + .row > .off-9-medium { + margin-left: 75%; + } + + .row > .col-10-medium { + width: 83.33333%; + } + + .row > .off-10-medium { + margin-left: 83.33333%; + } + + .row > .col-11-medium { + width: 91.66667%; + } + + .row > .off-11-medium { + margin-left: 91.66667%; + } + + .row > .col-12-medium { + width: 100%; + } + + .row > .off-12-medium { + 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: 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-small { + order: -1; + } + + .row > .col-1-small { + width: 8.33333%; + } + + .row > .off-1-small { + margin-left: 8.33333%; + } + + .row > .col-2-small { + width: 16.66667%; + } + + .row > .off-2-small { + margin-left: 16.66667%; + } + + .row > .col-3-small { + width: 25%; + } + + .row > .off-3-small { + margin-left: 25%; + } + + .row > .col-4-small { + width: 33.33333%; + } + + .row > .off-4-small { + margin-left: 33.33333%; + } + + .row > .col-5-small { + width: 41.66667%; + } + + .row > .off-5-small { + margin-left: 41.66667%; + } + + .row > .col-6-small { + width: 50%; + } + + .row > .off-6-small { + margin-left: 50%; + } + + .row > .col-7-small { + width: 58.33333%; + } + + .row > .off-7-small { + margin-left: 58.33333%; + } + + .row > .col-8-small { + width: 66.66667%; + } + + .row > .off-8-small { + margin-left: 66.66667%; + } + + .row > .col-9-small { + width: 75%; + } + + .row > .off-9-small { + margin-left: 75%; + } + + .row > .col-10-small { + width: 83.33333%; + } + + .row > .off-10-small { + margin-left: 83.33333%; + } + + .row > .col-11-small { + width: 91.66667%; + } + + .row > .off-11-small { + margin-left: 91.66667%; + } + + .row > .col-12-small { + width: 100%; + } + + .row > .off-12-small { + 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: -5px; + margin-left: -5px; + } + + .row.gtr-25 > * { + padding: 5px 0 0 5px; + } + + .row.gtr-25.gtr-uniform { + margin-top: -5px; + } + + .row.gtr-25.gtr-uniform > * { + padding-top: 5px; + } + + .row.gtr-50 { + margin-top: -10px; + margin-left: -10px; + } + + .row.gtr-50 > * { + padding: 10px 0 0 10px; + } + + .row.gtr-50.gtr-uniform { + margin-top: -10px; + } + + .row.gtr-50.gtr-uniform > * { + padding-top: 10px; + } + + .row { + margin-top: -20px; + margin-left: -20px; + } + + .row > * { + padding: 20px 0 0 20px; + } + + .row.gtr-uniform { + margin-top: -20px; + } + + .row.gtr-uniform > * { + padding-top: 20px; + } + + .row.gtr-150 { + margin-top: -30px; + margin-left: -30px; + } + + .row.gtr-150 > * { + padding: 30px 0 0 30px; + } + + .row.gtr-150.gtr-uniform { + margin-top: -30px; + } + + .row.gtr-150.gtr-uniform > * { + padding-top: 30px; + } + + .row.gtr-200 { + margin-top: -40px; + margin-left: -40px; + } + + .row.gtr-200 > * { + padding: 40px 0 0 40px; + } + + .row.gtr-200.gtr-uniform { + margin-top: -40px; + } + + .row.gtr-200.gtr-uniform > * { + padding-top: 40px; + } + + } + +/* Form */ + + form label { + display: block; + color: #252122; + font-weight: 400; + margin: 0 0 0.5em 0; + } + + form input[type=text], + form input[type=email], + form input[type=password], + form select, + form textarea { + -webkit-appearance: none; + display: block; + border: 0; + padding: 0.75em 1em; + font-size: 1em; + border-radius: 5px; + border: solid 1px #dddddd; + background: #fff; + width: 100%; + } + + form input[type=text]:focus, + form input[type=email]:focus, + form input[type=password]:focus, + form select:focus, + form textarea:focus { + box-shadow: inset 0px 0px 1px 1px #43bff0; + } + + form textarea { + height: 15em; + } + + form ::-webkit-input-placeholder { + color: #555 !important; + } + + form :-moz-placeholder { + color: #555 !important; + } + + form ::-moz-placeholder { + color: #555 !important; + } + + form :-ms-input-placeholder { + color: #555 !important; + } + + form ::-moz-focus-inner { + border: 0; + } + +/* Tables */ + + table { + width: 100%; + } + + table tr { + border-top: solid 1px #dddddd; + } + + table tr:first-child { + border-top: 0; + } + + table td { + padding: 0.5em 1em 0.5em 1em; + } + + table th { + text-align: left; + padding: 0.5em 1em 0.5em 1em; + font-weight: 700; + margin: 0 0 1em 0; + } + + table thead { + border-bottom: solid 2px #dddddd; + } + +/* Section/Article */ + + section, article { + margin-bottom: 2.5em; + } + + section > :last-child, section:last-child, article > :last-child, article:last-child { + margin-bottom: 0; + } + + header { + margin: 0 0 1.5em 0; + } + + header > p { + display: block; + font-style: italic; + margin: 0.5em 0 0 0; + padding-bottom: 0.5em; + } + + header.major { + position: relative; + text-align: center; + border-top: solid 1px #ccc; + top: 1em; + margin: 0 0 3em 0; + } + + header.major h2 { + background: #fff; + position: relative; + top: -0.65em; + display: inline; + margin: 0; + padding: 0 1em 0 1em; + } + + footer { + margin: 2.25em 0 0 0; + } + +/* Box */ + + .box { + background: #ffffff; + border-bottom: solid 1px #ccc; + padding: 2.75em 1.75em 2.75em 1.75em; + } + + .box .image.featured { + position: relative; + width: auto; + left: 1.75em; + top: 1.75em; + margin: -4.5em 0 4.25em -3.5em; + } + + .box.post header { + padding-top: 1em; + margin: 0 0 2em 0; + } + + .box.post h2 { + font-size: 2.5em; + letter-spacing: -0.015em; + } + + .box.post header > p { + margin-top: 1.25em; + font-size: 1.25em; + } + + .box footer ul.actions { + margin-bottom: 0; + } + +/* Button */ + + input[type="button"], + input[type="submit"], + input[type="reset"], + button, + .button { + -webkit-appearance: none; + display: inline-block; + text-decoration: none; + cursor: pointer; + border: 0; + border-radius: 5px; + background: #d52349; + color: #fff !important; + font-weight: 700; + outline: 0; + font-size: 1.1em; + padding: 0.65em 1.5em 0.65em 1.5em; + text-align: center; + -moz-transition: background-color .25s ease-in-out; + -webkit-transition: background-color .25s ease-in-out; + -ms-transition: background-color .25s ease-in-out; + transition: background-color .25s ease-in-out; + } + + input[type="button"]:hover, + input[type="submit"]:hover, + input[type="reset"]:hover, + button:hover, + .button:hover { + background: #e53359; + } + + input[type="button"]:active, + input[type="submit"]:active, + input[type="reset"]:active, + button:active, + .button:active { + background: #c51349; + } + + input[type="button"].alt, + input[type="submit"].alt, + input[type="reset"].alt, + button.alt, + .button.alt { + background: #252122; + } + + input[type="button"].alt:hover, + input[type="submit"].alt:hover, + input[type="reset"].alt:hover, + button.alt:hover, + .button.alt:hover { + background: #353132; + } + + input[type="button"].alt:active, + input[type="submit"].alt:active, + input[type="reset"].alt:active, + button.alt:active, + .button.alt:active { + background: #151112; + } + + input[type="button"].icon:before, + input[type="submit"].icon:before, + input[type="reset"].icon:before, + button.icon:before, + .button.icon:before { + opacity: 0.35; + position: relative; + top: 0.05em; + margin-right: 0.75em; + } + + input[type="button"].large, + input[type="submit"].large, + input[type="reset"].large, + button.large, + .button.large { + font-size: 1.5em; + padding: 0.75em 1.5em 0.75em 1.5em; + } + +/* Image */ + + .image { + display: inline-block; + outline: 0; + } + + .image img { + display: block; + width: 100%; + } + + .image.centered { + display: block; + margin: 0 0 2em 0; + } + + .image.centered img { + margin: 0 auto; + width: auto; + } + + .image.featured { + display: block; + width: 100%; + margin: 0 0 2em 0; + } + + .image.left { + float: left; + margin: 0 2em 2em 0; + } + +/* List */ + + ul { + list-style: disc; + padding-left: 1em; + } + + ul li { + padding-left: 0.5em; + } + + ol { + list-style: decimal; + padding-left: 1.25em; + } + + ol li { + padding-left: 0.25em; + } + +/* Actions */ + + ul.actions { + list-style: none; + padding-left: 0; + } + + ul.actions li { + display: inline-block; + margin-left: 1em; + padding-left: 0; + } + + ul.actions li:first-child { + margin-left: 0; + } + +/* Links */ + + ul.links { + list-style: none; + padding-left: 0; + } + + ul.links li { + display: inline-block; + border-left: solid 1px rgba(255, 255, 255, 0.05); + padding: 0 0 0 1em; + margin: 0 0 0 1em; + } + + ul.links li:first-child { + border-left: 0; + padding-left: 0; + margin-left: 0; + } + +/* Contact */ + + ul.contact { + list-style: none; + padding-left: 0; + } + + ul.contact li { + position: relative; + border-top: solid 1px #ddd; + padding: 1.3em 0 1.3em 7em; + } + + ul.contact li h3 { + position: absolute; + left: 0; + top: 1.3em; + font-size: 1.1em; + } + + ul.contact li p { + margin: 0; + } + + ul.contact li:first-child { + padding-top: 0; + border-top: 0; + } + + ul.contact li:first-child h3 { + top: 0; + } + +/* Dates */ + + ul.dates { + list-style: none; + padding-left: 0; + } + + ul.dates li { + position: relative; + border-top: solid 1px #ddd; + padding: 1.3em 0 1.3em 6.75em; + } + + ul.dates .date { + display: block; + position: absolute; + left: 0; + top: 1.3em; + background-color: #d52349; + height: 3.5em; + text-align: center; + color: #fff; + line-height: 1em; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + padding: 0.5em 0.75em 0 1em; + } + + ul.dates .date:after { + content: ''; + position: absolute; + bottom: 0; + right: -1.2em; + border-left: solid 1.25em #d52349; + border-top: solid 1.8em transparent; + border-bottom: solid 1.8em transparent; + } + + ul.dates .date strong { + display: block; + font-size: 1.75em; + padding-top: 0.15em; + } + + ul.dates h3 { + font-size: 1.1em; + } + + ul.dates p { + margin: 0; + } + + ul.dates li:first-child { + border-top: 0; + padding-top: 0; + } + + ul.dates li:first-child .date { + top: 0; + } + +/* Divided */ + + ul.divided { + list-style: none; + padding-left: 0; + } + + ul.divided li { + border-top: solid 1px #ddd; + padding: 1em 0 1em 0; + } + + ul.divided li:first-child { + border-top: 0; + padding-top: 0; + } + +/* Social */ + + ul.social { + list-style: none; + padding-left: 0; + overflow: hidden; + cursor: default; + margin: 0 0 3.25em 0; + } + + ul.social li { + display: inline-block; + padding-left: 0; + margin-left: 0.75em; + } + + ul.social li:first-child { + margin-left: 0; + } + + ul.social li a { + display: inline-block; + width: 3em; + height: 3em; + text-align: center; + border-radius: 5px; + background: #888; + -moz-transition: background-color .25s ease-in-out; + -webkit-transition: background-color .25s ease-in-out; + -ms-transition: background-color .25s ease-in-out; + transition: background-color .25s ease-in-out; + } + + ul.social li a:before { + color: #fff; + font-size: 2em; + line-height: 1.5em; + } + + ul.social li a.fa-facebook { + background: #3c5a98; + } + + ul.social li a.fa-facebook:hover { + background: #4c6aa8; + } + + ul.social li a.fa-twitter { + background: #2daae4; + } + + ul.social li a.fa-twitter:hover { + background: #3dbaf4; + } + + ul.social li a.fa-dribbble { + background: #c4376b; + } + + ul.social li a.fa-dribbble:hover { + background: #d4477b; + } + + ul.social li a.fa-linkedin { + background: #006599; + } + + ul.social li a.fa-linkedin:hover { + background: #1075a9; + } + + ul.social li a.fa-tumblr { + background: #2b4661; + } + + ul.social li a.fa-tumblr:hover { + background: #3b5671; + } + + ul.social li a.fa-google-plus { + background: #da2713; + } + + ul.social li a.fa-google-plus:hover { + background: #ea3723; + } + +/* Icons */ + + .icon { + text-decoration: none; + position: relative; + text-decoration: none; + } + + .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.brands:before { + font-family: 'Font Awesome 5 Brands'; + } + + .icon:before { + line-height: inherit; + } + + .icon > .label { + display: none; + } + + .icon.featured { + position: relative; + display: inline-block; + background-color: #d52349; + width: 9em; + padding: 1.75em 0 0.75em 0; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + margin: 0 0 4.5em 0; + cursor: default; + } + + .icon.featured:before { + font-size: 4.5em; + line-height: 1em; + color: #fff; + } + + .icon.featured:after { + content: ''; + position: absolute; + bottom: -1.95em; + left: 0; + border-top: solid 2em #d52349; + border-left: solid 4.5em transparent; + border-right: solid 4.5em transparent; + } + + .icon.featured.alt { + background-color: #252122; + } + + .icon.featured.alt:after { + border-top-color: #252122; + } + + .icon.featured.alt2 { + background-color: #827a7c; + } + + .icon.featured.alt2:after { + border-top-color: #827a7c; + } + +/* Page Wrapper */ + + #page-wrapper > section { + margin-bottom: 0; + } + +/* Header */ + + #header { + position: relative; + background: #ffffff; + border-bottom: solid 1px #ccc; + padding: 5em 0 4em 0; + text-align: center; + } + + #header h1 { + color: #252122; + font-weight: 900; + font-size: 2.5em; + letter-spacing: -0.035em; + line-height: 1; + } + +/* Nav */ + + #nav { + margin: 2.5em 0 0 0; + } + + #nav > ul { + margin: 0; + } + + #nav > ul > li { + display: inline-block; + font-style: italic; + margin: 0 0.35em 0 0.35em; + } + + #nav > ul > li > ul { + display: none; + } + + #nav > ul > li > a { + border-radius: 5px; + color: #5d5d5d; + text-decoration: none; + padding: 0.6em 1.2em 0.6em 1.2em; + -moz-transition: background-color .25s ease-in-out; + -webkit-transition: background-color .25s ease-in-out; + -ms-transition: background-color .25s ease-in-out; + transition: background-color .25s ease-in-out; + outline: 0; + } + + #nav > ul > li:hover > a, #nav > ul > li.active > a { + background: #f3f3f3; + } + + #nav > ul > li.current > a { + background: #d52349; + color: #fff !important; + font-weight: 700; + } + + .dropotron { + border-radius: 5px; + background-color: #252122; + background-color: rgba(34, 30, 31, 0.98); + padding: 1.25em 1.5em 1.25em 1.5em; + font-style: italic; + min-width: 13em; + box-shadow: 0px 8px 15px 0px rgba(0, 0, 0, 0.5); + text-align: left; + margin-top: -1.25em; + margin-left: -1px; + list-style: none; + } + + .dropotron a, .dropotron span { + color: #aaa; + text-decoration: none; + -moz-transition: color .25s ease-in-out; + -webkit-transition: color .25s ease-in-out; + -ms-transition: color .25s ease-in-out; + transition: color .25s ease-in-out; + } + + .dropotron li { + padding: 0.25em 0 0.25em 0; + } + + .dropotron li:hover > a, .dropotron li:hover > span { + color: #fff; + } + + .dropotron.level-0 { + margin-top: 2em; + } + + .dropotron.level-0:before { + content: ''; + display: block; + position: absolute; + left: 50%; + margin-left: -10px; + top: -9px; + border-left: solid 10px transparent; + border-right: solid 10px transparent; + border-bottom: solid 10px #252122; + border-bottom-color: rgba(34, 30, 31, 0.98); + } + +/* Banner */ + + #banner { + background: #CCE8F4 url("../../images/pic01.jpg"); + background-position: center center; + background-size: auto 100%; + background-repeat: no-repeat; + text-align: center; + position: relative; + padding: 8em 0; + margin: 4em 0 0 0; + } + + #banner header { + background-color: rgba(34, 30, 31, 0.98); + display: inline-block; + padding: 2.5em 5em; + border-radius: 5px; + } + + #banner header h2 { + color: #fff; + font-weight: 700; + font-size: 2.5em; + margin: 0 0 0.65em 0; + } + + #banner header p { + color: #d52349; + padding: 0; + font-style: normal; + margin: 0; + font-size: 1.5em; + } + +/* Intro */ + + #intro { + text-align: center; + overflow: hidden; + } + + #intro section { + margin: 3em 0; + padding: 2.5em 0; + } + + #intro h2 { + font-size: 1.75em; + } + + #intro p { + margin: 0; + } + + #intro .middle { + position: relative; + z-index: 1; + } + + #intro .middle:before { + content: ''; + width: 32px; + height: 100%; + position: absolute; + left: -24px; + top: 0; + display: block; + z-index: -1; + box-shadow: 32px 0 0 0 #fff, 0 -32px 0 0 #fff, 0 32px 0 0 #fff, 32px 32px 0 0 #fff, 32px -32px 0 0 #fff, 0 0 32px 0 rgba(0, 0, 0, 0.15); + } + + #intro .middle:after { + content: ''; + width: 32px; + height: 100%; + position: absolute; + right: -24px; + top: 0; + display: block; + z-index: -1; + box-shadow: -32px 0 0 0 #fff, 0 -32px 0 0 #fff, 0 32px 0 0 #fff, -32px 32px 0 0 #fff, -32px -32px 0 0 #fff, 0 0 32px 0 rgba(0, 0, 0, 0.15); + } + + #intro .button { + min-width: 12em; + } + + #intro footer { + margin: 0; + } + +/* Main */ + + #main { + position: relative; + background: #f7f7f7 url("images/bg02.png"); + padding: 4em 0 4em 0; + } + + #main:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + background: url("images/bg01.png"); + background-size: 100% 100%; + z-index: 0; + opacity: 0.1; + } + + #main .major h2 { + background: #f7f7f7 url("images/bg02.png"); + } + +/* Footer */ + + #footer { + position: relative; + color: #858484; + padding: 4em 0; + } + + #footer:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + background: url("images/bg01.png"); + background-size: 100% 100%; + z-index: 0; + opacity: 0.5; + } + + #footer a { + color: #c5c4c4; + } + + #footer h2, #footer h3, #footer h4, #footer h5, #footer h6, #footer strong, #footer b { + color: #fff; + } + + #footer h2 a, #footer h3 a, #footer h4 a, #footer h5 a, #footer h6 a, #footer strong a, #footer b a { + color: inherit; + } + + #footer ul.contact li, + #footer ul.dates li, + #footer ul.divided li { + border-top-color: #353434; + border-top-color: rgba(255, 255, 255, 0.05); + } + + #footer header { + margin: 0 0 3em 0; + } + + #footer header h2 { + font-size: 1.75em; + } + +/* Copyright */ + + #copyright { + text-align: center; + margin: 3em 0 2em 0; + } + + #copyright ul.links { + display: inline-block; + background: #2C2929; + background: rgba(255, 255, 255, 0.05); + border-radius: 5px; + margin: 0; + padding: 0.85em 2.25em 0.85em 2.25em; + } + +/* XLarge */ + + @media screen and (max-width: 1680px) { + + /* Basic */ + + body, input, textarea, select { + font-size: 12pt; + } + + } + +/* Large */ + + @media screen and (max-width: 1280px) { + + /* Basic */ + + body, input, textarea, select { + font-size: 11pt; + } + + /* Section/Article */ + + header.major { + margin: 0.75em 0 2.5em 0; + } + + header.major h2 { + padding: 0 1em 0 1em; + } + + /* Social */ + + ul.social li { + margin: 0 0 0.25em 0.75em; + } + + /* Header */ + + #header { + padding: 4em 0 3em 0; + } + + /* Banner */ + + #banner { + padding: 6em 0; + margin: 3em 0 0 0; + } + + /* Intro */ + + #intro { + padding: 0; + } + + #intro section { + padding: 1em 2em; + } + + #intro .middle:before { + left: -12px; + } + + #intro .middle:after { + right: -12px; + } + + /* Main */ + + #main { + padding: 30px 0; + } + + /* Footer */ + + #footer { + padding: 3em 0; + } + + #footer:before { + height: 2.5em; + } + + #footer header { + margin: 0 0 1.5em 0; + } + + #footer header h2 { + font-size: 1.25em; + } + + /* Copyright */ + + #copyright { + margin: 0; + } + + } + +/* Medium */ + + #navPanel, #titleBar { + display: none; + } + + @media screen and (max-width: 980px) { + + /* Basic */ + + html, body { + overflow-x: hidden; + } + + /* Box */ + + .box footer ul.actions li { + margin: 1em 0 0 0; + display: block; + } + + .box footer ul.actions li .button { + width: 100%; + } + + .box footer ul.actions li:first-child { + margin-top: 0; + } + + /* Header */ + + #header { + padding: 3.5em 0 3em 0; + } + + /* Nav */ + + #nav { + display: none; + } + + /* Intro */ + + #intro { + padding: 3em 0 0 0; + } + + #intro section { + position: relative; + border-top: solid 1px #dfdfdf; + margin: 0; + padding: 40px 0 0 0; + } + + #intro section.first { + border-top: 0; + padding-top: 0; + } + + #intro section p { + margin: 0; + } + + #intro .middle:before, #intro .middle:after { + display: none; + } + + #intro footer { + padding: 3em 0 0 0; + } + + #intro footer ul.actions { + margin-bottom: 0; + } + + /* Main */ + + #main { + padding: 40px 0; + } + + /* Copyright */ + + #copyright ul.links { + display: block; + } + + /* 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; + } + + #titleBar { + -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: 44px; + left: 0; + position: fixed; + top: 0; + width: 100%; + z-index: 10001; + background: none; + } + + #titleBar .toggle { + text-decoration: none; + width: 80px; + height: 60px; + } + + #titleBar .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; + } + + #titleBar .toggle:before { + content: '\f0c9'; + display: block; + position: absolute; + left: 10px; + top: 10px; + width: 50px; + height: 40px; + line-height: 40px; + font-size: 18px; + color: #fff; + text-align: center; + background: rgba(150, 150, 150, 0.75); + border-radius: 5px; + } + + #titleBar .toggle:active:before { + background-color: #969696; + } + + #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; + color: #858484; + background-image: url("images/bg02.png"); + box-shadow: inset -3px 0px 5px 0px rgba(0, 0, 0, 0.35); + } + + #navPanel .link { + display: block; + color: #888; + text-decoration: none; + height: 44px; + line-height: 44px; + border-top: solid 1px rgba(255, 255, 255, 0.05); + padding: 0 1em 0 1em; + font-style: italic; + } + + #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; + } + + #navPanel .depth-0 { + color: #fff; + } + + body.navPanel-visible #page-wrapper { + -moz-transform: translateX(275px); + -webkit-transform: translateX(275px); + -ms-transform: translateX(275px); + transform: translateX(275px); + } + + body.navPanel-visible #titleBar { + -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); + } + + } + +/* Small */ + + @media screen and (max-width: 736px) { + + /* Basic */ + + body, input, textarea, select { + font-size: 11pt; + } + + h2, h3, h4, h5, h6 { + font-size: 1.25em; + } + + /* Button */ + + input[type="button"].large, + input[type="submit"].large, + input[type="reset"].large, + button.large, + .button.large { + font-size: 1.1em; + padding: 0.65em 1.5em 0.65em 1.5em; + } + + /* Actions */ + + ul.actions li { + margin: 1em 0 0 0; + display: block; + } + + ul.actions li .button { + width: 100%; + } + + ul.actions li:first-child { + margin-top: 0; + } + + /* Section/Article */ + + section, article { + margin-bottom: 20px; + } + + header { + margin: 0 0 1em 0; + } + + footer { + margin: 2em 0 0 0; + } + + /* Box */ + + .box { + padding: 25px 15px 20px 15px; + } + + .box .image.featured { + left: 15px; + top: 15px; + margin: -40px 0 40px -30px; + } + + .box.post header { + padding-top: 0; + margin: 0 0 1em 0; + } + + .box.post h2 { + font-size: 1.5em; + line-height: 1.5em; + } + + .box.post header > p { + margin-top: 0; + font-size: 1em; + } + + /* Divided */ + + ul.divided li { + padding: 0.5em 0 0.5em 0; + } + + /* Contact */ + + ul.contact li { + padding: 0.8em 0 0.8em 7em; + } + + ul.contact li h3 { + top: 0.8em; + } + + /* Dates */ + + ul.dates li { + padding-left: 6em; + } + + ul.dates h3 { + margin: 0 0 0.5em 0; + } + + /* Links */ + + ul.links li { + display: block; + padding: 0.25em 0 0 0; + margin: 0.25em 0 0 0; + border-left: 0; + } + + ul.links li:first-child { + padding-top: 0; + margin-top: 0; + } + + /* Social */ + + ul.social li { + margin: 0 0.5em 0.75em 0; + } + + /* Icons */ + + .icon.featured { + width: 8em; + margin: 0 0 3em 0; + } + + .icon.featured:after { + border-left: solid 4em transparent; + border-right: solid 4em transparent; + } + + /* Header */ + + #header { + text-align: center; + padding: 2em 0; + } + + #header h1 { + color: #252122; + font-weight: 900; + font-size: 1.75em; + letter-spacing: -0.035em; + } + + /* Intro */ + + #intro { + padding: 2em 0 0 0; + } + + #intro section { + padding: 40px 0 0 0; + margin: 20px 0 0 0; + } + + #intro h2 { + font-size: 1.25em; + } + + /* Banner */ + + #banner { + padding: 6em 0; + margin: 2em 0 0 0; + } + + #banner header { + padding: 1.5em 1em 1.5em 1em; + display: block; + border-radius: 0; + } + + #banner header h2 { + font-size: 1.5em; + line-height: 1.5em; + margin: 0 0 0.25em 0; + } + + #banner header p { + font-size: 1.2em; + } + + /* Main */ + + #main { + padding: 20px 0; + } + + /* Footer */ + + #footer { + padding: 40px 0 20px 0; + } + + } \ No newline at end of file diff --git a/webapp/templates/html5up-dopetrope/assets/js/breakpoints.min.js b/webapp/templates/html5up-dopetrope/assets/js/breakpoints.min.js new file mode 100644 index 0000000..32419cc --- /dev/null +++ b/webapp/templates/html5up-dopetrope/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/webapp/templates/html5up-dopetrope/assets/js/jquery.dropotron.min.js b/webapp/templates/html5up-dopetrope/assets/js/jquery.dropotron.min.js new file mode 100644 index 0000000..b992170 --- /dev/null +++ b/webapp/templates/html5up-dopetrope/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/webapp/templates/html5up-dopetrope/assets/js/jquery.min.js b/webapp/templates/html5up-dopetrope/assets/js/jquery.min.js new file mode 100644 index 0000000..a1c07fd --- /dev/null +++ b/webapp/templates/html5up-dopetrope/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 0 ul').dropotron({ + mode: 'fade', + noOpenerFade: true, + alignment: 'center' + }); + + // Nav. + + // Title Bar. + $( + '
' + + '' + + '
' + ) + .appendTo($body); + + // Panel. + $( + '' + ) + .appendTo($body) + .panel({ + delay: 500, + hideOnClick: true, + hideOnSwipe: true, + resetScroll: true, + resetForms: true, + side: 'left', + target: $body, + visibleClass: 'navPanel-visible' + }); + +})(jQuery); \ No newline at end of file diff --git a/webapp/templates/html5up-dopetrope/assets/js/util.js b/webapp/templates/html5up-dopetrope/assets/js/util.js new file mode 100644 index 0000000..bdb8e9f --- /dev/null +++ b/webapp/templates/html5up-dopetrope/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/webapp/templates/html5up-dopetrope/assets/sass/libs/_breakpoints.scss b/webapp/templates/html5up-dopetrope/assets/sass/libs/_breakpoints.scss new file mode 100644 index 0000000..c5301d8 --- /dev/null +++ b/webapp/templates/html5up-dopetrope/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/webapp/templates/html5up-dopetrope/assets/sass/libs/_functions.scss b/webapp/templates/html5up-dopetrope/assets/sass/libs/_functions.scss new file mode 100644 index 0000000..f563aab --- /dev/null +++ b/webapp/templates/html5up-dopetrope/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/webapp/templates/html5up-dopetrope/assets/sass/libs/_html-grid.scss b/webapp/templates/html5up-dopetrope/assets/sass/libs/_html-grid.scss new file mode 100644 index 0000000..7438a8c --- /dev/null +++ b/webapp/templates/html5up-dopetrope/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/webapp/templates/html5up-dopetrope/assets/sass/libs/_mixins.scss b/webapp/templates/html5up-dopetrope/assets/sass/libs/_mixins.scss new file mode 100644 index 0000000..a331483 --- /dev/null +++ b/webapp/templates/html5up-dopetrope/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/webapp/templates/html5up-dopetrope/assets/sass/libs/_vars.scss b/webapp/templates/html5up-dopetrope/assets/sass/libs/_vars.scss new file mode 100644 index 0000000..3358992 --- /dev/null +++ b/webapp/templates/html5up-dopetrope/assets/sass/libs/_vars.scss @@ -0,0 +1,22 @@ +// Misc. + $misc: ( + z-index-base: 10000 + ); + +// Duration. + $duration: ( + navPanel: 0.5s + ); + +// Size. + $size: ( + navPanel: 275px + ); + +// Font. + $font: ( + ); + +// Palette. + $palette: ( + ); \ No newline at end of file diff --git a/webapp/templates/html5up-dopetrope/assets/sass/libs/_vendor.scss b/webapp/templates/html5up-dopetrope/assets/sass/libs/_vendor.scss new file mode 100644 index 0000000..6599a3f --- /dev/null +++ b/webapp/templates/html5up-dopetrope/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/webapp/templates/html5up-dopetrope/assets/sass/main.scss b/webapp/templates/html5up-dopetrope/assets/sass/main.scss new file mode 100644 index 0000000..415fcfb --- /dev/null +++ b/webapp/templates/html5up-dopetrope/assets/sass/main.scss @@ -0,0 +1,1683 @@ +@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=Source+Sans+Pro:300,400,700,900,300italic"); + +/* + Dopetrope by HTML5 UP + html5up.net | @ajlkn + Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +*/ + +// Breakpoints. + + @include breakpoints(( + xlarge: ( 1281px, 1680px ), + large: ( 981px, 1280px ), + medium: ( 737px, 980px ), + small: ( 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: #252122; + background-image: url('images/bg02.png'); + + // Stops initial animations until page loads. + &.is-preload { + *, *:before, *:after { + @include vendor('animation', 'none !important'); + @include vendor('transition', 'none !important'); + } + } + + } + + body, input, textarea, select { + font-family: 'Source Sans Pro'; + font-weight: 300; + color: #5d5d5d; + font-size: 14pt; + line-height: 1.75em; + } + + strong, b { + color: #252122; + font-weight: 400; + } + + i, em { + font-style: italic; + } + + sub { + position: relative; + top: 0.5em; + font-size: 0.8em; + } + + sup { + position: relative; + top: -0.5em; + font-size: 0.8em; + } + + blockquote { + border-left: solid 0.75em #dddddd; + padding: 1em 0 1em 1.5em; + font-style: italic; + } + + h1, h2, h3, h4, h5, h6 { + color: #252122; + font-weight: 700; + } + + h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + color: inherit; + text-decoration: none; + } + + h2 { + font-size: 1.5em; + } + + h3 { + font-size: 1.35em; + } + + a { + color: #d52349; + text-decoration: underline; + + &:hover { + text-decoration: none; + } + } + + br.clear { + clear: both; + } + + hr { + border: 0; + border-top: solid 1px #dddddd; + height: 1px; + margin: 2em 0 2em 0; + } + + p, ul, ol, dl, table { + margin-bottom: 2em; + } + +/* Container */ + + .container { + margin: 0 auto; + max-width: 100%; + width: 70em; + + @include breakpoint('<=xlarge') { + width: 70em; + } + + @include breakpoint('<=large') { + width: calc(100% - 60px); + } + + @include breakpoint('<=medium') { + width: calc(100% - 80px); + } + + @include breakpoint('<=small') { + width: calc(100% - 40px); + } + } + +/* Row */ + + .row { + @include html-grid((50px, 50px)); + + @include breakpoint('<=xlarge') { + @include html-grid((50px, 50px), 'xlarge'); + } + + @include breakpoint('<=large') { + @include html-grid((30px, 30px), 'large'); + } + + @include breakpoint('<=medium') { + @include html-grid((40px, 40px), 'medium'); + } + + @include breakpoint('<=small') { + @include html-grid((20px, 20px), 'small'); + } + } + +/* Form */ + + form { + label { + display: block; + color: #252122; + font-weight: 400; + margin: 0 0 0.5em 0; + } + + input[type=text], + input[type=email], + input[type=password], + select, + textarea { + -webkit-appearance: none; + display: block; + border: 0; + padding: 0.75em 1em; + font-size: 1em; + border-radius: 5px; + border: solid 1px #dddddd; + background: #fff; + width: 100%; + + &:focus { + box-shadow: inset 0px 0px 1px 1px #43bff0; + } + } + + textarea { + height: 15em; + } + + ::-webkit-input-placeholder { + color: #555 !important; + } + + :-moz-placeholder { + color: #555 !important; + } + + ::-moz-placeholder { + color: #555 !important; + } + + :-ms-input-placeholder { + color: #555 !important; + } + + ::-moz-focus-inner { + border: 0; + } + } + +/* Tables */ + + table { + width: 100%; + + tr { + border-top: solid 1px #dddddd; + + &:first-child { + border-top: 0; + } + } + + td { + padding: 0.5em 1em 0.5em 1em; + + } + + th { + text-align: left; + padding: 0.5em 1em 0.5em 1em; + font-weight: 700; + margin: 0 0 1em 0; + } + + thead { + border-bottom: solid 2px #dddddd; + } + } + +/* Section/Article */ + + section, article { + margin-bottom: 2.5em; + + > :last-child, + &:last-child { + margin-bottom: 0; + } + } + + header { + margin: 0 0 1.5em 0; + + > p { + display: block; + font-style: italic; + margin: 0.5em 0 0 0; + padding-bottom: 0.5em; + } + + &.major { + position: relative; + text-align: center; + border-top: solid 1px #ccc; + top: 1em; + margin: 0 0 3em 0; + + h2 { + background: #fff; + position: relative; + top: -0.65em; + display: inline; + margin: 0; + padding: 0 1em 0 1em; + } + } + } + + footer { + margin: 2.25em 0 0 0; + } + +/* Box */ + + .box { + background: #ffffff; + border-bottom: solid 1px #ccc; + padding: 2.75em 1.75em 2.75em 1.75em; + + .image { + &.featured { + position: relative; + width: auto; + left: 1.75em; + top: 1.75em; + margin: -4.5em 0 4.25em -3.5em; + } + } + + &.post { + header { + padding-top: 1em; + margin: 0 0 2em 0; + } + + h2 { + font-size: 2.5em; + letter-spacing: -0.015em; + } + + header { + > p { + margin-top: 1.25em; + font-size: 1.25em; + } + } + } + + footer { + ul.actions { + margin-bottom: 0; + } + } + } + +/* Button */ + + input[type="button"], + input[type="submit"], + input[type="reset"], + button, + .button { + -webkit-appearance: none; + display: inline-block; + text-decoration: none; + cursor: pointer; + border: 0; + border-radius: 5px; + background: #d52349; + color: #fff !important; + font-weight: 700; + outline: 0; + font-size: 1.1em; + padding: 0.65em 1.5em 0.65em 1.5em; + text-align: center; + @include vendor('transition', 'background-color .25s ease-in-out'); + + &:hover { + background: #e53359; + } + + &:active { + background: #c51349; + } + + &.alt { + background: #252122; + + &:hover { + background: #353132; + } + + &:active { + background: #151112; + } + } + + &.icon { + &:before { + opacity: 0.35; + position: relative; + top: 0.05em; + margin-right: 0.75em; + } + } + + &.large { + font-size: 1.5em; + padding: 0.75em 1.5em 0.75em 1.5em; + } + } + +/* Image */ + + .image { + display: inline-block; + outline: 0; + + img { + display: block; + width: 100%; + } + + &.centered { + display: block; + margin: 0 0 2em 0; + + img { + margin: 0 auto; + width: auto; + } + } + + &.featured { + display: block; + width: 100%; + margin: 0 0 2em 0; + } + + &.left { + float: left; + margin: 0 2em 2em 0; + } + } + +/* List */ + + ul { + list-style: disc; + padding-left: 1em; + + li { + padding-left: 0.5em; + } + } + + ol { + list-style: decimal; + padding-left: 1.25em; + + li { + padding-left: 0.25em; + } + } + +/* Actions */ + + ul.actions { + list-style: none; + padding-left: 0; + + li { + display: inline-block; + margin-left: 1em; + padding-left: 0; + + &:first-child { + margin-left: 0; + } + } + } + +/* Links */ + + ul.links { + list-style: none; + padding-left: 0; + + li { + display: inline-block; + border-left: solid 1px rgba(255, 255, 255, 0.05); + padding: 0 0 0 1em; + margin: 0 0 0 1em; + + &:first-child { + border-left: 0; + padding-left: 0; + margin-left: 0; + } + } + } + +/* Contact */ + + ul.contact { + list-style: none; + padding-left: 0; + + li { + position: relative; + border-top: solid 1px #ddd; + padding: 1.3em 0 1.3em 7em; + + h3 { + position: absolute; + left: 0; + top: 1.3em; + font-size: 1.1em; + } + + p { + margin: 0; + } + + &:first-child { + padding-top: 0; + border-top: 0; + + h3 { + top: 0; + } + } + } + } + +/* Dates */ + + ul.dates { + list-style: none; + padding-left: 0; + + li { + position: relative; + border-top: solid 1px #ddd; + padding: 1.3em 0 1.3em 6.75em; + } + + .date { + display: block; + position: absolute; + left: 0; + top: 1.3em; + background-color: #d52349; + height: 3.5em; + text-align: center; + color: #fff; + line-height: 1em; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + padding: 0.5em 0.75em 0 1em; + + &:after { + content: ''; + position: absolute; + bottom: 0; + right: -1.2em; + border-left: solid 1.25em #d52349; + border-top: solid 1.8em transparent; + border-bottom: solid 1.8em transparent; + } + + strong { + display: block; + font-size: 1.75em; + padding-top: 0.15em; + } + } + + h3 { + font-size: 1.1em; + } + + p { + margin: 0; + } + + li { + &:first-child { + border-top: 0; + padding-top: 0; + .date { + top: 0; + } + } + } + } + +/* Divided */ + + ul.divided { + list-style: none; + padding-left: 0; + + li { + border-top: solid 1px #ddd; + padding: 1em 0 1em 0; + + &:first-child { + border-top: 0; + padding-top: 0; + } + } + } + +/* Social */ + + ul.social { + list-style: none; + padding-left: 0; + overflow: hidden; + cursor: default; + margin: 0 0 3.25em 0; + + li { + display: inline-block; + padding-left: 0; + margin-left: 0.75em; + + &:first-child { + margin-left: 0; + } + + a { + display: inline-block; + width: 3em; + height: 3em; + text-align: center; + border-radius: 5px; + background: #888; + @include vendor('transition', 'background-color .25s ease-in-out'); + + &:before { + color: #fff; + font-size: 2em; + line-height: 1.5em; + } + + &.fa-facebook { + background: #3c5a98; + + &:hover { + background: #4c6aa8; + } + } + + &.fa-twitter { + background: #2daae4; + + &:hover { + background: #3dbaf4; + } + } + + &.fa-dribbble { + background: #c4376b; + + &:hover { + background: #d4477b; + } + } + + &.fa-linkedin { + background: #006599; + + &:hover { + background: #1075a9; + } + } + + &.fa-tumblr { + background: #2b4661; + + &:hover { + background: #3b5671; + } + } + + &.fa-google-plus { + background: #da2713; + + &:hover { + background: #ea3723; + } + } + } + } + } + +/* Icons */ + + .icon { + @include icon; + position: relative; + text-decoration: none; + + &.solid { + &:before { + font-weight: 900; + } + } + + &.brands { + &:before { + font-family: 'Font Awesome 5 Brands'; + } + } + + &:before { + line-height: inherit; + } + + > .label { + display: none; + } + + &.featured { + position: relative; + display: inline-block; + background-color: #d52349; + width: 9em; + padding: 1.75em 0 0.75em 0; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + margin: 0 0 4.5em 0; + cursor: default; + + &:before { + font-size: 4.5em; + line-height: 1em; + color: #fff; + } + + &:after { + content: ''; + position: absolute; + bottom: -1.95em; + left: 0; + border-top: solid 2em #d52349; + border-left: solid 4.5em transparent; + border-right: solid 4.5em transparent; + } + + &.alt { + background-color: #252122; + + &:after { + border-top-color: #252122; + } + } + + &.alt2 { + background-color: #827a7c; + + &:after { + border-top-color: #827a7c; + } + } + } + } + +/* Page Wrapper */ + + #page-wrapper { + > section { + margin-bottom: 0; + } + } + +/* Header */ + + #header { + position: relative; + background: #ffffff; + border-bottom: solid 1px #ccc; + padding: 5em 0 4em 0; + text-align: center; + + h1 { + color: #252122; + font-weight: 900; + font-size: 2.5em; + letter-spacing: -0.035em; + line-height: 1; + } + } + +/* Nav */ + + #nav { + margin: 2.5em 0 0 0; + + > ul { + margin: 0; + + > li { + display: inline-block; + font-style: italic; + margin: 0 0.35em 0 0.35em; + + > ul { + display: none; + } + + > a { + border-radius: 5px; + color: #5d5d5d; + text-decoration: none; + padding: 0.6em 1.2em 0.6em 1.2em; + @include vendor('transition', 'background-color .25s ease-in-out'); + outline: 0; + } + + &:hover, &.active { + > a { + background: #f3f3f3; + } + } + + &.current { + > a { + background: #d52349; + color: #fff !important; + font-weight: 700; + } + } + } + } + } + + .dropotron { + border-radius: 5px; + background-color: #252122; + background-color: rgba(34, 30, 31, 0.98); + padding: 1.25em 1.5em 1.25em 1.5em; + font-style: italic; + min-width: 13em; + box-shadow: 0px 8px 15px 0px rgba(0, 0, 0, 0.5); + text-align: left; + margin-top: -1.25em; + margin-left: -1px; + list-style: none; + + a, span { + color: #aaa; + text-decoration: none; + @include vendor('transition', 'color .25s ease-in-out'); + } + + li { + padding: 0.25em 0 0.25em 0; + + &:hover > { + a, span { + color: #fff; + } + } + } + + &.level-0 { + margin-top: 2em; + + &:before { + content: ''; + display: block; + position: absolute; + left: 50%; + margin-left: -10px; + top: -9px; + border-left: solid 10px transparent; + border-right: solid 10px transparent; + border-bottom: solid 10px #252122; + border-bottom-color: rgba(34, 30, 31, 0.98); + } + } + } + +/* Banner */ + + #banner { + background: #CCE8F4 url('../../images/pic01.jpg'); + background-position: center center; + background-size: auto 100%; + background-repeat: no-repeat; + text-align: center; + position: relative; + padding: 8em 0; + margin: 4em 0 0 0; + + header { + background-color: rgba(34, 30, 31, 0.98); + display: inline-block; + padding: 2.5em 5em; + border-radius: 5px; + + h2 { + color: #fff; + font-weight: 700; + font-size: 2.5em; + margin: 0 0 0.65em 0; + } + + p { + color: #d52349; + padding: 0; + font-style: normal; + margin: 0; + font-size: 1.5em; + } + } + } + +/* Intro */ + + #intro { + text-align: center; + overflow: hidden; + + section { + margin: 3em 0; + padding: 2.5em 0; + } + + h2 { + font-size: 1.75em; + } + + p { + margin: 0; + } + + .middle { + position: relative; + z-index: 1; + + &:before { + content: ''; + width: 32px; + height: 100%; + position: absolute; + left: -24px; + top: 0; + display: block; + z-index: -1; + box-shadow: 32px 0 0 0 #fff, 0 -32px 0 0 #fff, 0 32px 0 0 #fff, 32px 32px 0 0 #fff, 32px -32px 0 0 #fff, 0 0 32px 0 rgba(0, 0, 0, 0.15); + } + + &:after { + content: ''; + width: 32px; + height: 100%; + position: absolute; + right: -24px; + top: 0; + display: block; + z-index: -1; + box-shadow: -32px 0 0 0 #fff, 0 -32px 0 0 #fff, 0 32px 0 0 #fff, -32px 32px 0 0 #fff, -32px -32px 0 0 #fff, 0 0 32px 0 rgba(0, 0, 0, 0.15); + } + } + + .button { + min-width: 12em; + } + + footer { + margin: 0; + } + } + +/* Main */ + + #main { + position: relative; + background: #f7f7f7 url('images/bg02.png'); + padding: 4em 0 4em 0; + + &:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + background: url('images/bg01.png'); + background-size: 100% 100%; + z-index: 0; + opacity: 0.1; + } + + .major { + h2 { + background: #f7f7f7 url('images/bg02.png'); + } + } + } + +/* Footer */ + + #footer { + position: relative; + color: #858484; + padding: 4em 0; + + &:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + background: url('images/bg01.png'); + background-size: 100% 100%; + z-index: 0; + opacity: 0.5; + } + + a { + color: #c5c4c4; + } + + h2, h3, h4, h5, h6, strong, b { + color: #fff; + + a { + color: inherit; + } + } + + ul { + &.contact li, + &.dates li, + &.divided li { + border-top-color: #353434; + border-top-color: rgba(255, 255, 255, 0.05); + } + } + + header { + margin: 0 0 3em 0; + + h2 { + font-size: 1.75em; + } + } + } + +/* Copyright */ + + #copyright { + text-align: center; + margin: 3em 0 2em 0; + + ul.links { + display: inline-block; + background: #2C2929; + background: rgba(255, 255, 255, 0.05); + border-radius: 5px; + margin: 0; + padding: 0.85em 2.25em 0.85em 2.25em; + } + } + +/* XLarge */ + + @include breakpoint('<=xlarge') { + + /* Basic */ + + body, input, textarea, select { + font-size: 12pt; + } + + } + +/* Large */ + + @include breakpoint('<=large') { + + /* Basic */ + + body, input, textarea, select { + font-size: 11pt; + } + + /* Section/Article */ + + header { + &.major { + margin: 0.75em 0 2.5em 0; + + h2 { + padding: 0 1em 0 1em; + } + } + } + + /* Social */ + + ul.social { + li { + margin: 0 0 0.25em 0.75em; + } + } + + /* Header */ + + #header { + padding: 4em 0 3em 0; + } + + /* Banner */ + + #banner { + padding: 6em 0; + margin: 3em 0 0 0; + } + + /* Intro */ + + #intro { + padding: 0; + + section { + padding: 1em 2em; + } + + .middle { + &:before { + left: -12px; + } + + &:after { + right: -12px; + } + } + } + + /* Main */ + + #main { + padding: 30px 0; + } + + /* Footer */ + + #footer { + padding: 3em 0; + + &:before { + height: 2.5em; + } + + header { + margin: 0 0 1.5em 0; + + h2 { + font-size: 1.25em; + } + } + } + + /* Copyright */ + + #copyright { + margin: 0; + } + + } + +/* Medium */ + + #navPanel, #titleBar { + display: none; + } + + @include breakpoint('<=medium') { + + /* Basic */ + + html, body { + overflow-x: hidden; + } + + /* Box */ + + .box { + footer { + ul.actions { + li { + margin: 1em 0 0 0; + display: block; + + .button { + width: 100%; + } + + &:first-child { + margin-top: 0; + } + } + } + } + } + + /* Header */ + + #header { + padding: 3.5em 0 3em 0; + } + + /* Nav */ + + #nav { + display: none; + } + + /* Intro */ + + #intro { + padding: 3em 0 0 0; + + section { + position: relative; + border-top: solid 1px #dfdfdf; + margin: 0; + padding: 40px 0 0 0; + + &.first { + border-top: 0; + padding-top: 0; + } + + p { + margin: 0; + } + } + + .middle { + &:before, &:after { + display: none; + } + } + + footer { + padding: 3em 0 0 0; + + ul.actions { + margin-bottom: 0; + } + } + } + + /* Main */ + + #main { + padding: 40px 0; + } + + /* Copyright */ + + #copyright { + ul.links { + display: block; + } + } + + /* Nav */ + + #page-wrapper { + @include vendor('backface-visibility', 'hidden'); + @include vendor('transition', 'transform #{_duration(navPanel)} ease'); + padding-bottom: 1px; + } + + #titleBar { + @include vendor('backface-visibility', 'hidden'); + @include vendor('transition', 'transform #{_duration(navPanel)} ease'); + display: block; + height: 44px; + left: 0; + position: fixed; + top: 0; + width: 100%; + z-index: _misc(z-index-base) + 1; + background: none; + + .toggle { + @include icon(false, solid); + width: 80px; + height: 60px; + + &:before { + content: '\f0c9'; + display: block; + position: absolute; + left: 10px; + top: 10px; + width: 50px; + height: 40px; + line-height: 40px; + font-size: 18px; + color: #fff; + text-align: center; + background: rgba(150, 150, 150, 0.75); + border-radius: 5px; + } + + &:active:before { + background-color: rgba(150, 150, 150, 1); + } + } + } + + #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; + color: #858484; + background-image: url('images/bg02.png'); + box-shadow: inset -3px 0px 5px 0px rgba(0, 0, 0, 0.35); + + .link { + display: block; + color: #888; + text-decoration: none; + height: 44px; + line-height: 44px; + border-top: solid 1px rgba(255, 255, 255, 0.05); + padding: 0 1em 0 1em; + font-style: italic; + + &: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; + } + + .depth-0 { + color: #fff; + } + } + + body { + &.navPanel-visible { + #page-wrapper { + @include vendor('transform', 'translateX(#{_size(navPanel)})'); + } + + #titleBar { + @include vendor('transform', 'translateX(#{_size(navPanel)})'); + } + + #navPanel { + @include vendor('transform', 'translateX(0)'); + } + } + } + + } + +/* Small */ + + @include breakpoint('<=small') { + + /* Basic */ + + body, input, textarea, select { + font-size: 11pt; + } + + h2, h3, h4, h5, h6 { + font-size: 1.25em; + } + + /* Button */ + + input[type="button"], + input[type="submit"], + input[type="reset"], + button, + .button { + &.large { + font-size: 1.1em; + padding: 0.65em 1.5em 0.65em 1.5em; + } + } + + /* Actions */ + + ul.actions { + li { + margin: 1em 0 0 0; + display: block; + + .button { + width: 100%; + } + + &:first-child { + margin-top: 0; + } + } + } + + /* Section/Article */ + + section, article { + margin-bottom: 20px; + } + + header { + margin: 0 0 1em 0; + } + + footer { + margin: 2em 0 0 0; + } + + /* Box */ + + .box { + padding: 25px 15px 20px 15px; + + .image.featured { + left: 15px; + top: 15px; + margin: -40px 0 40px -30px; + } + + &.post { + header { + padding-top: 0; + margin: 0 0 1em 0; + } + + h2 { + font-size: 1.5em; + line-height: 1.5em; + } + + header { + > p { + margin-top: 0; + font-size: 1em; + } + } + } + } + + /* Divided */ + + ul.divided { + li { + padding: 0.5em 0 0.5em 0; + } + } + + /* Contact */ + + ul.contact { + li { + padding: 0.8em 0 0.8em 7em; + + h3 { + top: 0.8em; + } + } + } + + /* Dates */ + + ul.dates { + li { + padding-left: 6em; + } + + h3 { + margin: 0 0 0.5em 0; + } + } + + /* Links */ + + ul.links { + li { + display: block; + padding: 0.25em 0 0 0; + margin: 0.25em 0 0 0; + border-left: 0; + + &:first-child { + padding-top: 0; + margin-top: 0; + } + } + } + + /* Social */ + + ul.social { + li { + margin: 0 0.5em 0.75em 0; + } + } + + /* Icons */ + + .icon { + &.featured { + width: 8em; + margin: 0 0 3em 0; + + &:after { + border-left: solid 4em transparent; + border-right: solid 4em transparent; + } + } + } + + /* Header */ + + #header { + text-align: center; + padding: 2em 0; + + h1 { + color: #252122; + font-weight: 900; + font-size: 1.75em; + letter-spacing: -0.035em; + } + } + + /* Intro */ + + #intro { + padding: 2em 0 0 0; + + section { + padding: 40px 0 0 0; + margin: 20px 0 0 0; + } + + h2 { + font-size: 1.25em; + } + } + + /* Banner */ + + #banner { + padding: 6em 0; + margin: 2em 0 0 0; + + header { + padding: 1.5em 1em 1.5em 1em; + display: block; + border-radius: 0; + + h2 { + font-size: 1.5em; + line-height: 1.5em; + margin: 0 0 0.25em 0; + } + + p { + font-size: 1.2em; + } + } + } + + /* Main */ + + #main { + padding: 20px 0; + } + + /* Footer */ + + #footer { + padding: 40px 0 20px 0; + } + + } \ No newline at end of file diff --git a/webapp/templates/html5up-dopetrope/assets/webfonts/fa-brands-400.eot b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-brands-400.eot new file mode 100644 index 0000000..e79f40f Binary files /dev/null and b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-brands-400.eot differ diff --git a/webapp/templates/html5up-dopetrope/assets/webfonts/fa-brands-400.svg b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-brands-400.svg new file mode 100644 index 0000000..ba0d850 --- /dev/null +++ b/webapp/templates/html5up-dopetrope/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/webapp/templates/html5up-dopetrope/assets/webfonts/fa-brands-400.ttf b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-brands-400.ttf new file mode 100644 index 0000000..217ffe9 Binary files /dev/null and b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-brands-400.ttf differ diff --git a/webapp/templates/html5up-dopetrope/assets/webfonts/fa-brands-400.woff b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-brands-400.woff new file mode 100644 index 0000000..a2d8025 Binary files /dev/null and b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-brands-400.woff differ diff --git a/webapp/templates/html5up-dopetrope/assets/webfonts/fa-brands-400.woff2 b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-brands-400.woff2 new file mode 100644 index 0000000..e27b0bf Binary files /dev/null and b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-brands-400.woff2 differ diff --git a/webapp/templates/html5up-dopetrope/assets/webfonts/fa-regular-400.eot b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-regular-400.eot new file mode 100644 index 0000000..d62be2f Binary files /dev/null and b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-regular-400.eot differ diff --git a/webapp/templates/html5up-dopetrope/assets/webfonts/fa-regular-400.svg b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-regular-400.svg new file mode 100644 index 0000000..751083e --- /dev/null +++ b/webapp/templates/html5up-dopetrope/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/webapp/templates/html5up-dopetrope/assets/webfonts/fa-regular-400.ttf b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-regular-400.ttf new file mode 100644 index 0000000..eb3cb5e Binary files /dev/null and b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-regular-400.ttf differ diff --git a/webapp/templates/html5up-dopetrope/assets/webfonts/fa-regular-400.woff b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-regular-400.woff new file mode 100644 index 0000000..43b1a9a Binary files /dev/null and b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-regular-400.woff differ diff --git a/webapp/templates/html5up-dopetrope/assets/webfonts/fa-regular-400.woff2 b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-regular-400.woff2 new file mode 100644 index 0000000..b9344a7 Binary files /dev/null and b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-regular-400.woff2 differ diff --git a/webapp/templates/html5up-dopetrope/assets/webfonts/fa-solid-900.eot b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-solid-900.eot new file mode 100644 index 0000000..c77baa8 Binary files /dev/null and b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-solid-900.eot differ diff --git a/webapp/templates/html5up-dopetrope/assets/webfonts/fa-solid-900.svg b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-solid-900.svg new file mode 100644 index 0000000..627128b --- /dev/null +++ b/webapp/templates/html5up-dopetrope/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/webapp/templates/html5up-dopetrope/assets/webfonts/fa-solid-900.ttf b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000..c6c3dd4 Binary files /dev/null and b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-solid-900.ttf differ diff --git a/webapp/templates/html5up-dopetrope/assets/webfonts/fa-solid-900.woff b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-solid-900.woff new file mode 100644 index 0000000..77c1786 Binary files /dev/null and b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-solid-900.woff differ diff --git a/webapp/templates/html5up-dopetrope/assets/webfonts/fa-solid-900.woff2 b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-solid-900.woff2 new file mode 100644 index 0000000..e30fb67 Binary files /dev/null and b/webapp/templates/html5up-dopetrope/assets/webfonts/fa-solid-900.woff2 differ diff --git a/webapp/templates/html5up-dopetrope/images/pic01.jpg b/webapp/templates/html5up-dopetrope/images/pic01.jpg new file mode 100644 index 0000000..2583000 Binary files /dev/null and b/webapp/templates/html5up-dopetrope/images/pic01.jpg differ diff --git a/webapp/templates/html5up-dopetrope/images/pic02.jpg b/webapp/templates/html5up-dopetrope/images/pic02.jpg new file mode 100644 index 0000000..15add4f Binary files /dev/null and b/webapp/templates/html5up-dopetrope/images/pic02.jpg differ diff --git a/webapp/templates/html5up-dopetrope/images/pic03.jpg b/webapp/templates/html5up-dopetrope/images/pic03.jpg new file mode 100644 index 0000000..3f10bb9 Binary files /dev/null and b/webapp/templates/html5up-dopetrope/images/pic03.jpg differ diff --git a/webapp/templates/html5up-dopetrope/images/pic04.jpg b/webapp/templates/html5up-dopetrope/images/pic04.jpg new file mode 100644 index 0000000..15dca28 Binary files /dev/null and b/webapp/templates/html5up-dopetrope/images/pic04.jpg differ diff --git a/webapp/templates/html5up-dopetrope/images/pic05.jpg b/webapp/templates/html5up-dopetrope/images/pic05.jpg new file mode 100644 index 0000000..afd4622 Binary files /dev/null and b/webapp/templates/html5up-dopetrope/images/pic05.jpg differ diff --git a/webapp/templates/html5up-dopetrope/images/pic06.jpg b/webapp/templates/html5up-dopetrope/images/pic06.jpg new file mode 100644 index 0000000..93794fa Binary files /dev/null and b/webapp/templates/html5up-dopetrope/images/pic06.jpg differ diff --git a/webapp/templates/html5up-dopetrope/images/pic07.jpg b/webapp/templates/html5up-dopetrope/images/pic07.jpg new file mode 100644 index 0000000..e7e85e1 Binary files /dev/null and b/webapp/templates/html5up-dopetrope/images/pic07.jpg differ diff --git a/webapp/templates/html5up-dopetrope/images/pic08.jpg b/webapp/templates/html5up-dopetrope/images/pic08.jpg new file mode 100644 index 0000000..1206443 Binary files /dev/null and b/webapp/templates/html5up-dopetrope/images/pic08.jpg differ diff --git a/webapp/templates/html5up-dopetrope/images/pic09.jpg b/webapp/templates/html5up-dopetrope/images/pic09.jpg new file mode 100644 index 0000000..ef743f8 Binary files /dev/null and b/webapp/templates/html5up-dopetrope/images/pic09.jpg differ diff --git a/webapp/templates/html5up-dopetrope/images/pic10.jpg b/webapp/templates/html5up-dopetrope/images/pic10.jpg new file mode 100644 index 0000000..b807a67 Binary files /dev/null and b/webapp/templates/html5up-dopetrope/images/pic10.jpg differ diff --git a/webapp/templates/html5up-dopetrope/index.html b/webapp/templates/html5up-dopetrope/index.html new file mode 100644 index 0000000..9cfcf6f --- /dev/null +++ b/webapp/templates/html5up-dopetrope/index.html @@ -0,0 +1,392 @@ + + + + + Dopetrope by HTML5 UP + + + + + +
+ + + + + +
+
+
+
+ + +
+
+

My Portfolio

+
+
+
+
+ +
+

Ipsum feugiat et dolor

+
+

Lorem ipsum dolor sit amet sit veroeros sed amet blandit consequat veroeros lorem blandit adipiscing et feugiat phasellus tempus dolore ipsum lorem dolore.

+ +
+
+
+
+ +
+

Sed etiam lorem nulla

+
+

Lorem ipsum dolor sit amet sit veroeros sed amet blandit consequat veroeros lorem blandit adipiscing et feugiat phasellus tempus dolore ipsum lorem dolore.

+ +
+
+
+
+ +
+

Consequat et tempus

+
+

Lorem ipsum dolor sit amet sit veroeros sed amet blandit consequat veroeros lorem blandit adipiscing et feugiat phasellus tempus dolore ipsum lorem dolore.

+ +
+
+
+
+ +
+

Blandit sed adipiscing

+
+

Lorem ipsum dolor sit amet sit veroeros sed amet blandit consequat veroeros lorem blandit adipiscing et feugiat phasellus tempus dolore ipsum lorem dolore.

+ +
+
+
+
+ +
+

Etiam nisl consequat

+
+

Lorem ipsum dolor sit amet sit veroeros sed amet blandit consequat veroeros lorem blandit adipiscing et feugiat phasellus tempus dolore ipsum lorem dolore.

+ +
+
+
+
+ +
+

Dolore nisl feugiat

+
+

Lorem ipsum dolor sit amet sit veroeros sed amet blandit consequat veroeros lorem blandit adipiscing et feugiat phasellus tempus dolore ipsum lorem dolore.

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

The Blog

+
+
+
+
+ +
+

Magna tempus consequat

+

Posted 45 minutes ago

+
+

Lorem ipsum dolor sit amet sit veroeros sed et blandit consequat sed veroeros lorem et blandit adipiscing feugiat phasellus tempus hendrerit, tortor vitae mattis tempor, sapien sem feugiat sapien, id suscipit magna felis nec elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos lorem ipsum dolor sit amet.

+ +
+
+
+
+ +
+

Aptent veroeros aliquam

+

Posted 45 minutes ago

+
+

Lorem ipsum dolor sit amet sit veroeros sed et blandit consequat sed veroeros lorem et blandit adipiscing feugiat phasellus tempus hendrerit, tortor vitae mattis tempor, sapien sem feugiat sapien, id suscipit magna felis nec elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos lorem ipsum dolor sit amet.

+ +
+
+
+
+ +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/webapp/templates/html5up-dopetrope/left-sidebar.html b/webapp/templates/html5up-dopetrope/left-sidebar.html new file mode 100644 index 0000000..c3dc8b1 --- /dev/null +++ b/webapp/templates/html5up-dopetrope/left-sidebar.html @@ -0,0 +1,291 @@ + + + + + Dopetrope by HTML5 UP + + + + + +
+ + + + + +
+
+
+
+ + +
+ +
+

Sed etiam lorem nulla

+
+

Lorem ipsum dolor sit amet sit veroeros sed amet blandit consequat veroeros lorem blandit adipiscing et feugiat phasellus tempus dolore ipsum lorem dolore.

+ +
+
+
+

Feugiat consequat

+
+

Veroeros sed amet blandit consequat veroeros lorem blandit adipiscing et feugiat sed lorem consequat feugiat lorem dolore.

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

Left Sidebar

+

Lorem ipsum dolor sit amet feugiat

+
+

+ Vestibulum scelerisque ultricies libero id hendrerit. Vivamus malesuada quam faucibus ante dignissim auctor + hendrerit libero placerat. Nulla facilisi. Proin aliquam felis non arcu molestie at accumsan turpis commodo. + Proin elementum, nibh non egestas sodales, augue quam aliquet est, id egestas diam justo adipiscing ante. + Pellentesque tempus nulla non urna eleifend ut ultrices nisi faucibus. +

+

+ Praesent a dolor leo. Duis in felis in tortor lobortis volutpat et pretium tellus. Vestibulum ac ante nisl, + a elementum odio. Duis semper risus et lectus commodo fringilla. Maecenas sagittis convallis justo vel mattis. + placerat, nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. +

+
+
+

Something else

+
+

+ Elementum odio duis semper risus et lectus commodo fringilla. Maecenas sagittis convallis justo vel mattis. + placerat, nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. +

+

+ Nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. +

+
+
+
+

So in conclusion ...

+
+

+ Nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. Elementum odio duis semper risus et lectus commodo fringilla. + Maecenas sagittis convallis justo vel mattis. +

+
+
+ +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/webapp/templates/html5up-dopetrope/no-sidebar.html b/webapp/templates/html5up-dopetrope/no-sidebar.html new file mode 100644 index 0000000..059a321 --- /dev/null +++ b/webapp/templates/html5up-dopetrope/no-sidebar.html @@ -0,0 +1,263 @@ + + + + + Dopetrope by HTML5 UP + + + + + +
+ + + + + +
+
+ + +
+ +
+

No Sidebar

+

Lorem ipsum dolor sit amet feugiat

+
+

+ Vestibulum scelerisque ultricies libero id hendrerit. Vivamus malesuada quam faucibus ante dignissim auctor + hendrerit libero placerat. Nulla facilisi. Proin aliquam felis non arcu molestie at accumsan turpis commodo. + Proin elementum, nibh non egestas sodales, augue quam aliquet est, id egestas diam justo adipiscing ante. + Pellentesque tempus nulla non urna eleifend ut ultrices nisi faucibus. + Vestibulum scelerisque ultricies libero id hendrerit. Vivamus malesuada quam faucibus ante dignissim auctor + hendrerit libero placerat. Nulla facilisi. Proin aliquam felis non arcu molestie at accumsan turpis commodo. + Proin elementum, nibh non egestas sodales, augue quam aliquet est, id egestas diam justo adipiscing ante. +

+

+ Praesent a dolor leo. Duis in felis in tortor lobortis volutpat et pretium tellus. Vestibulum ac ante nisl, + a elementum odio. Duis semper risus et lectus commodo fringilla. Maecenas sagittis convallis justo vel mattis. + placerat, nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor. +

+
+
+

Something else

+
+

+ Elementum odio duis semper risus et lectus commodo fringilla. Maecenas sagittis convallis justo vel mattis. + placerat, nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. + Elementum odio duis semper risus et lectus commodo fringilla. Maecenas sagittis convallis justo vel mattis. + placerat, nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor. +

+

+ Nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. +

+
+
+
+

So in conclusion ...

+
+

+ Nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. Elementum odio duis semper risus et lectus commodo fringilla. + Maecenas sagittis convallis justo vel mattis. +

+
+
+ +
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/webapp/templates/html5up-dopetrope/right-sidebar.html b/webapp/templates/html5up-dopetrope/right-sidebar.html new file mode 100644 index 0000000..6cc0ceb --- /dev/null +++ b/webapp/templates/html5up-dopetrope/right-sidebar.html @@ -0,0 +1,291 @@ + + + + + Dopetrope by HTML5 UP + + + + + +
+ + + + + +
+
+
+
+ + +
+ +
+

Right sidebar

+

Lorem ipsum dolor sit amet feugiat

+
+

+ Vestibulum scelerisque ultricies libero id hendrerit. Vivamus malesuada quam faucibus ante dignissim auctor + hendrerit libero placerat. Nulla facilisi. Proin aliquam felis non arcu molestie at accumsan turpis commodo. + Proin elementum, nibh non egestas sodales, augue quam aliquet est, id egestas diam justo adipiscing ante. + Pellentesque tempus nulla non urna eleifend ut ultrices nisi faucibus. +

+

+ Praesent a dolor leo. Duis in felis in tortor lobortis volutpat et pretium tellus. Vestibulum ac ante nisl, + a elementum odio. Duis semper risus et lectus commodo fringilla. Maecenas sagittis convallis justo vel mattis. + placerat, nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. +

+
+
+

Something else

+
+

+ Elementum odio duis semper risus et lectus commodo fringilla. Maecenas sagittis convallis justo vel mattis. + placerat, nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. +

+

+ Nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. +

+
+
+
+

So in conclusion ...

+
+

+ Nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. Elementum odio duis semper risus et lectus commodo fringilla. + Maecenas sagittis convallis justo vel mattis. +

+
+
+ +
+
+ + +
+ +
+

Sed etiam lorem nulla

+
+

Lorem ipsum dolor sit amet sit veroeros sed amet blandit consequat veroeros lorem blandit adipiscing et feugiat phasellus tempus dolore ipsum lorem dolore.

+ +
+
+
+

Feugiat consequat

+
+

Veroeros sed amet blandit consequat veroeros lorem blandit adipiscing et feugiat sed lorem consequat feugiat lorem dolore.

+ + +
+ +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/webapp/templates/images/pic01.jpg b/webapp/templates/images/pic01.jpg new file mode 100644 index 0000000..2583000 Binary files /dev/null and b/webapp/templates/images/pic01.jpg differ diff --git a/webapp/templates/images/pic02.jpg b/webapp/templates/images/pic02.jpg new file mode 100644 index 0000000..15add4f Binary files /dev/null and b/webapp/templates/images/pic02.jpg differ diff --git a/webapp/templates/images/pic03.jpg b/webapp/templates/images/pic03.jpg new file mode 100644 index 0000000..3f10bb9 Binary files /dev/null and b/webapp/templates/images/pic03.jpg differ diff --git a/webapp/templates/images/pic04.jpg b/webapp/templates/images/pic04.jpg new file mode 100644 index 0000000..15dca28 Binary files /dev/null and b/webapp/templates/images/pic04.jpg differ diff --git a/webapp/templates/images/pic05.jpg b/webapp/templates/images/pic05.jpg new file mode 100644 index 0000000..afd4622 Binary files /dev/null and b/webapp/templates/images/pic05.jpg differ diff --git a/webapp/templates/images/pic06.jpg b/webapp/templates/images/pic06.jpg new file mode 100644 index 0000000..93794fa Binary files /dev/null and b/webapp/templates/images/pic06.jpg differ diff --git a/webapp/templates/images/pic07.jpg b/webapp/templates/images/pic07.jpg new file mode 100644 index 0000000..e7e85e1 Binary files /dev/null and b/webapp/templates/images/pic07.jpg differ diff --git a/webapp/templates/images/pic08.jpg b/webapp/templates/images/pic08.jpg new file mode 100644 index 0000000..1206443 Binary files /dev/null and b/webapp/templates/images/pic08.jpg differ diff --git a/webapp/templates/images/pic09.jpg b/webapp/templates/images/pic09.jpg new file mode 100644 index 0000000..ef743f8 Binary files /dev/null and b/webapp/templates/images/pic09.jpg differ diff --git a/webapp/templates/images/pic10.jpg b/webapp/templates/images/pic10.jpg new file mode 100644 index 0000000..b807a67 Binary files /dev/null and b/webapp/templates/images/pic10.jpg differ diff --git a/webapp/templates/left-sidebar.html b/webapp/templates/left-sidebar.html new file mode 100644 index 0000000..c3dc8b1 --- /dev/null +++ b/webapp/templates/left-sidebar.html @@ -0,0 +1,291 @@ + + + + + Dopetrope by HTML5 UP + + + + + +
+ + + + + +
+
+
+
+ + +
+ +
+

Sed etiam lorem nulla

+
+

Lorem ipsum dolor sit amet sit veroeros sed amet blandit consequat veroeros lorem blandit adipiscing et feugiat phasellus tempus dolore ipsum lorem dolore.

+ +
+
+
+

Feugiat consequat

+
+

Veroeros sed amet blandit consequat veroeros lorem blandit adipiscing et feugiat sed lorem consequat feugiat lorem dolore.

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

Left Sidebar

+

Lorem ipsum dolor sit amet feugiat

+
+

+ Vestibulum scelerisque ultricies libero id hendrerit. Vivamus malesuada quam faucibus ante dignissim auctor + hendrerit libero placerat. Nulla facilisi. Proin aliquam felis non arcu molestie at accumsan turpis commodo. + Proin elementum, nibh non egestas sodales, augue quam aliquet est, id egestas diam justo adipiscing ante. + Pellentesque tempus nulla non urna eleifend ut ultrices nisi faucibus. +

+

+ Praesent a dolor leo. Duis in felis in tortor lobortis volutpat et pretium tellus. Vestibulum ac ante nisl, + a elementum odio. Duis semper risus et lectus commodo fringilla. Maecenas sagittis convallis justo vel mattis. + placerat, nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. +

+
+
+

Something else

+
+

+ Elementum odio duis semper risus et lectus commodo fringilla. Maecenas sagittis convallis justo vel mattis. + placerat, nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. +

+

+ Nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. +

+
+
+
+

So in conclusion ...

+
+

+ Nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. Elementum odio duis semper risus et lectus commodo fringilla. + Maecenas sagittis convallis justo vel mattis. +

+
+
+ +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/webapp/templates/no-sidebar.html b/webapp/templates/no-sidebar.html new file mode 100644 index 0000000..059a321 --- /dev/null +++ b/webapp/templates/no-sidebar.html @@ -0,0 +1,263 @@ + + + + + Dopetrope by HTML5 UP + + + + + +
+ + + + + +
+
+ + +
+ +
+

No Sidebar

+

Lorem ipsum dolor sit amet feugiat

+
+

+ Vestibulum scelerisque ultricies libero id hendrerit. Vivamus malesuada quam faucibus ante dignissim auctor + hendrerit libero placerat. Nulla facilisi. Proin aliquam felis non arcu molestie at accumsan turpis commodo. + Proin elementum, nibh non egestas sodales, augue quam aliquet est, id egestas diam justo adipiscing ante. + Pellentesque tempus nulla non urna eleifend ut ultrices nisi faucibus. + Vestibulum scelerisque ultricies libero id hendrerit. Vivamus malesuada quam faucibus ante dignissim auctor + hendrerit libero placerat. Nulla facilisi. Proin aliquam felis non arcu molestie at accumsan turpis commodo. + Proin elementum, nibh non egestas sodales, augue quam aliquet est, id egestas diam justo adipiscing ante. +

+

+ Praesent a dolor leo. Duis in felis in tortor lobortis volutpat et pretium tellus. Vestibulum ac ante nisl, + a elementum odio. Duis semper risus et lectus commodo fringilla. Maecenas sagittis convallis justo vel mattis. + placerat, nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor. +

+
+
+

Something else

+
+

+ Elementum odio duis semper risus et lectus commodo fringilla. Maecenas sagittis convallis justo vel mattis. + placerat, nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. + Elementum odio duis semper risus et lectus commodo fringilla. Maecenas sagittis convallis justo vel mattis. + placerat, nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor. +

+

+ Nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. +

+
+
+
+

So in conclusion ...

+
+

+ Nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. Elementum odio duis semper risus et lectus commodo fringilla. + Maecenas sagittis convallis justo vel mattis. +

+
+
+ +
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/webapp/templates/register.html b/webapp/templates/register.html new file mode 100644 index 0000000..b4b07a0 --- /dev/null +++ b/webapp/templates/register.html @@ -0,0 +1,35 @@ +{% extends 'base.html' %} + +{% block title %}Register{% endblock %} + +{% block content %} + +
+ +
+

Create Account

+

Register your user here

+
+ + {% if error %} +

+ {{ error }} +

+ {% endif %} + +
+ + + + + + +
+
+
+ +
+ +
+ +{% endblock %} \ No newline at end of file diff --git a/webapp/templates/reset.html b/webapp/templates/reset.html new file mode 100644 index 0000000..8570da1 --- /dev/null +++ b/webapp/templates/reset.html @@ -0,0 +1,34 @@ +{% extends 'base.html' %} + +{% block title %}Set New Password{% endblock %} + +{% block content %} + +
+ +
+

Set your account new password

+
+ + {% if error %} +

+ {{ error }} +

+ {% endif %} + +
+ + + + +
+
+
+ +
+ +
+ + + +{% endblock %} \ No newline at end of file diff --git a/webapp/templates/right-sidebar.html b/webapp/templates/right-sidebar.html new file mode 100644 index 0000000..6cc0ceb --- /dev/null +++ b/webapp/templates/right-sidebar.html @@ -0,0 +1,291 @@ + + + + + Dopetrope by HTML5 UP + + + + + +
+ + + + + +
+
+
+
+ + +
+ +
+

Right sidebar

+

Lorem ipsum dolor sit amet feugiat

+
+

+ Vestibulum scelerisque ultricies libero id hendrerit. Vivamus malesuada quam faucibus ante dignissim auctor + hendrerit libero placerat. Nulla facilisi. Proin aliquam felis non arcu molestie at accumsan turpis commodo. + Proin elementum, nibh non egestas sodales, augue quam aliquet est, id egestas diam justo adipiscing ante. + Pellentesque tempus nulla non urna eleifend ut ultrices nisi faucibus. +

+

+ Praesent a dolor leo. Duis in felis in tortor lobortis volutpat et pretium tellus. Vestibulum ac ante nisl, + a elementum odio. Duis semper risus et lectus commodo fringilla. Maecenas sagittis convallis justo vel mattis. + placerat, nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. +

+
+
+

Something else

+
+

+ Elementum odio duis semper risus et lectus commodo fringilla. Maecenas sagittis convallis justo vel mattis. + placerat, nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. +

+

+ Nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. +

+
+
+
+

So in conclusion ...

+
+

+ Nunc diam iaculis massa, et aliquet nibh leo non nisl vitae porta lobortis, enim neque fringilla nunc, + eget faucibus lacus sem quis nunc suspendisse nec lectus sit amet augue rutrum vulputate ut ut mi. Aenean + elementum, mi sit amet porttitor lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor + sit amet nullam consequat feugiat dolore tempus. Elementum odio duis semper risus et lectus commodo fringilla. + Maecenas sagittis convallis justo vel mattis. +

+
+
+ +
+
+ + +
+ +
+

Sed etiam lorem nulla

+
+

Lorem ipsum dolor sit amet sit veroeros sed amet blandit consequat veroeros lorem blandit adipiscing et feugiat phasellus tempus dolore ipsum lorem dolore.

+ +
+
+
+

Feugiat consequat

+
+

Veroeros sed amet blandit consequat veroeros lorem blandit adipiscing et feugiat sed lorem consequat feugiat lorem dolore.

+ + +
+ +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file