Include hosting and stripe
4
.gitignore
vendored
|
@ -1,2 +1,6 @@
|
||||||
venv/*
|
venv/*
|
||||||
.idea/*
|
.idea/*
|
||||||
|
.env
|
||||||
|
*pycache*
|
||||||
|
*.sqlite3
|
||||||
|
dynamicweb2/ldap_max_uid_file
|
||||||
|
|
15
dynamicweb2/backend.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from django.contrib.auth.backends import ModelBackend
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class UngleichLDAPBackend(ModelBackend):
|
||||||
|
def authenticate(self, username=None, password=None, **kwargs):
|
||||||
|
user = super().authenticate(username, password, **kwargs)
|
||||||
|
if user:
|
||||||
|
user.create_ldap_account(password)
|
||||||
|
else:
|
||||||
|
print(f"user {username} not found")
|
||||||
|
return user
|
|
@ -17,13 +17,13 @@ from pathlib import Path
|
||||||
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||||
|
|
||||||
|
PROJECT_DIR = os.path.abspath(
|
||||||
|
os.path.join(os.path.dirname(__file__), ".."),
|
||||||
|
)
|
||||||
|
|
||||||
# Quick-start development settings - unsuitable for production
|
# Quick-start development settings - unsuitable for production
|
||||||
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/
|
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/
|
||||||
|
|
||||||
# SECURITY WARNING: keep the secret key used in production secret!
|
|
||||||
SECRET_KEY = 'django-insecure-e^+t*vao!39#qr+ct&&0ur34_*v-jsqk=xqb6&!qu_nu)2mn(('
|
|
||||||
|
|
||||||
# SECURITY WARNING: don't run with debug turned on in production!
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
DEBUG = True
|
DEBUG = True
|
||||||
|
|
||||||
|
@ -39,6 +39,10 @@ INSTALLED_APPS = [
|
||||||
'django.contrib.sessions',
|
'django.contrib.sessions',
|
||||||
'django.contrib.messages',
|
'django.contrib.messages',
|
||||||
'django.contrib.staticfiles',
|
'django.contrib.staticfiles',
|
||||||
|
'django.contrib.sites',
|
||||||
|
'bootstrap3',
|
||||||
|
'guardian',
|
||||||
|
'hosting',
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
|
@ -56,8 +60,11 @@ ROOT_URLCONF = 'dynamicweb2.urls'
|
||||||
TEMPLATES = [
|
TEMPLATES = [
|
||||||
{
|
{
|
||||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||||
'DIRS': [BASE_DIR / 'templates']
|
'DIRS': [
|
||||||
,
|
os.path.join(PROJECT_DIR, 'hosting/templates/'),
|
||||||
|
os.path.join(PROJECT_DIR, 'templates/analytics'),
|
||||||
|
os.path.join(PROJECT_DIR, 'templates/gdpr'),
|
||||||
|
],
|
||||||
'APP_DIRS': True,
|
'APP_DIRS': True,
|
||||||
'OPTIONS': {
|
'OPTIONS': {
|
||||||
'context_processors': [
|
'context_processors': [
|
||||||
|
@ -65,11 +72,17 @@ TEMPLATES = [
|
||||||
'django.template.context_processors.request',
|
'django.template.context_processors.request',
|
||||||
'django.contrib.auth.context_processors.auth',
|
'django.contrib.auth.context_processors.auth',
|
||||||
'django.contrib.messages.context_processors.messages',
|
'django.contrib.messages.context_processors.messages',
|
||||||
|
"django.template.context_processors.media", # Updated import
|
||||||
|
"django.template.context_processors.static", # Updated import
|
||||||
|
"django.template.context_processors.tz", # Updated import
|
||||||
|
"django.contrib.messages.context_processors.messages",
|
||||||
|
'hosting.context_processor.google_analytics',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
WSGI_APPLICATION = 'dynamicweb2.wsgi.application'
|
WSGI_APPLICATION = 'dynamicweb2.wsgi.application'
|
||||||
|
|
||||||
|
|
||||||
|
@ -114,11 +127,17 @@ USE_I18N = True
|
||||||
|
|
||||||
USE_TZ = True
|
USE_TZ = True
|
||||||
|
|
||||||
|
|
||||||
# Static files (CSS, JavaScript, Images)
|
# Static files (CSS, JavaScript, Images)
|
||||||
# https://docs.djangoproject.com/en/4.2/howto/static-files/
|
# https://docs.djangoproject.com/en/4.2/howto/static-files/
|
||||||
|
|
||||||
STATIC_URL = 'static/'
|
STATIC_URL = '/static/'
|
||||||
|
|
||||||
|
STATIC_ROOT = os.path.join(PROJECT_DIR, 'static')
|
||||||
|
|
||||||
|
STATICFILES_FINDERS = (
|
||||||
|
'django.contrib.staticfiles.finders.FileSystemFinder',
|
||||||
|
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
|
||||||
|
)
|
||||||
|
|
||||||
# Default primary key field type
|
# Default primary key field type
|
||||||
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
|
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
|
||||||
|
@ -130,9 +149,8 @@ def env(env_name):
|
||||||
return os.environ.get(env_name)
|
return os.environ.get(env_name)
|
||||||
|
|
||||||
|
|
||||||
PROJECT_DIR = os.path.abspath(
|
# SECURITY WARNING: keep the secret key used in production secret!
|
||||||
os.path.join(os.path.dirname(__file__), ".."),
|
SECRET_KEY = env('SECRET_KEY')
|
||||||
)
|
|
||||||
|
|
||||||
dotenv.load_dotenv("{0}/.env".format(PROJECT_DIR))
|
dotenv.load_dotenv("{0}/.env".format(PROJECT_DIR))
|
||||||
|
|
||||||
|
@ -148,7 +166,7 @@ LDAP_MAX_UID_FILE_PATH = os.environ.get('LDAP_MAX_UID_FILE_PATH',
|
||||||
)
|
)
|
||||||
LDAP_DEFAULT_START_UID = int(env('LDAP_DEFAULT_START_UID'))
|
LDAP_DEFAULT_START_UID = int(env('LDAP_DEFAULT_START_UID'))
|
||||||
|
|
||||||
# Search union over OUs
|
# Search union over OUsss
|
||||||
AUTH_LDAP_START_TLS = bool(os.environ.get('LDAP_USE_TLS', False))
|
AUTH_LDAP_START_TLS = bool(os.environ.get('LDAP_USE_TLS', False))
|
||||||
|
|
||||||
ENTIRE_SEARCH_BASE = env("ENTIRE_SEARCH_BASE")
|
ENTIRE_SEARCH_BASE = env("ENTIRE_SEARCH_BASE")
|
||||||
|
@ -157,4 +175,94 @@ AUTH_LDAP_USER_ATTR_MAP = {
|
||||||
"first_name": "givenName",
|
"first_name": "givenName",
|
||||||
"last_name": "sn",
|
"last_name": "sn",
|
||||||
"email": "mail"
|
"email": "mail"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STRIPE_API_PRIVATE_KEY = env('STRIPE_API_PRIVATE_KEY')
|
||||||
|
STRIPE_API_PUBLIC_KEY = env('STRIPE_API_PUBLIC_KEY')
|
||||||
|
STRIPE_API_PRIVATE_KEY_TEST = env('STRIPE_API_PRIVATE_KEY_TEST')
|
||||||
|
|
||||||
|
GUARDIAN_GET_INIT_ANONYMOUS_USER = 'hosting.models.get_anonymous_user_instance'
|
||||||
|
|
||||||
|
AUTH_USER_MODEL = 'hosting.CustomUser'
|
||||||
|
|
||||||
|
AUTHENTICATION_BACKENDS = (
|
||||||
|
'dynamicweb2.backend.UngleichLDAPBackend',
|
||||||
|
'guardian.backends.ObjectPermissionBackend',
|
||||||
|
)
|
||||||
|
|
||||||
|
# TODO: upgrade to the latest bootstrap
|
||||||
|
BOOTSTRAP3 = {
|
||||||
|
|
||||||
|
# The URL to the jQuery JavaScript file
|
||||||
|
'jquery_url': '%shosting/js/jquery-1.11.1.min.js' % STATIC_URL,
|
||||||
|
|
||||||
|
# The Bootstrap base URL
|
||||||
|
'base_url': '%shosting/bootstrap-3.3.4/' % STATIC_URL,
|
||||||
|
|
||||||
|
# The complete URL to the Bootstrap CSS file
|
||||||
|
# (None means derive it from base_url)
|
||||||
|
'css_url': None,
|
||||||
|
|
||||||
|
# The complete URL to the Bootstrap CSS file (None means no theme)
|
||||||
|
'theme_url': None,
|
||||||
|
|
||||||
|
# The complete URL to the Bootstrap JavaScript file
|
||||||
|
# (None means derive it from base_url)
|
||||||
|
'javascript_url': None,
|
||||||
|
|
||||||
|
# Put JavaScript in the HEAD section of the HTML document
|
||||||
|
# (only relevant if you use bootstrap3.html)
|
||||||
|
'javascript_in_head': False,
|
||||||
|
|
||||||
|
# Include jQuery with Bootstrap JavaScript
|
||||||
|
# (affects django-bootstrap3 template tags)
|
||||||
|
'include_jquery': False,
|
||||||
|
|
||||||
|
# Label class to use in horizontal forms
|
||||||
|
'horizontal_label_class': 'col-md-3',
|
||||||
|
|
||||||
|
# Field class to use in horizontal forms
|
||||||
|
'horizontal_field_class': 'col-md-9',
|
||||||
|
|
||||||
|
# Set HTML required attribute on required fields
|
||||||
|
'set_required': True,
|
||||||
|
|
||||||
|
# Set HTML disabled attribute on disabled fields
|
||||||
|
'set_disabled': False,
|
||||||
|
|
||||||
|
# Set placeholder attributes to label if no placeholder is provided
|
||||||
|
'set_placeholder': True,
|
||||||
|
|
||||||
|
# Class to indicate required (better to set this in your Django form)
|
||||||
|
'required_css_class': '',
|
||||||
|
|
||||||
|
# Class to indicate error (better to set this in your Django form)
|
||||||
|
'error_css_class': 'has-error',
|
||||||
|
|
||||||
|
# Class to indicate success, meaning the field has valid input
|
||||||
|
# (better to set this in your Django form)
|
||||||
|
'success_css_class': 'has-success',
|
||||||
|
|
||||||
|
# Renderers (only set these if you have studied the source and understand
|
||||||
|
# the inner workings)
|
||||||
|
'formset_renderers': {
|
||||||
|
'default': 'bootstrap3.renderers.FormsetRenderer',
|
||||||
|
},
|
||||||
|
'form_renderers': {
|
||||||
|
'default': 'bootstrap3.renderers.FormRenderer',
|
||||||
|
},
|
||||||
|
'field_renderers': {
|
||||||
|
'default': 'bootstrap3.renderers.FieldRenderer',
|
||||||
|
'inline': 'bootstrap3.renderers.InlineFieldRenderer',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
# from django.contrib.sites.models import Site
|
||||||
|
#
|
||||||
|
# # Ensure the query matches an existing site ID or domain
|
||||||
|
# try:
|
||||||
|
# site = Site.objects.get(id=1) # Replace '1' with the correct site ID
|
||||||
|
# except Site.DoesNotExist:
|
||||||
|
# # Handle the case where the site doesn't exist
|
||||||
|
# pass
|
||||||
|
|
||||||
|
|
573
dynamicweb2/stripe_utils.py
Normal file
|
@ -0,0 +1,573 @@
|
||||||
|
import logging
|
||||||
|
import re
|
||||||
|
|
||||||
|
import stripe
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
# from datacenterlight.models import StripePlan
|
||||||
|
|
||||||
|
stripe.api_key = settings.STRIPE_API_PRIVATE_KEY
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def handleStripeError(f):
|
||||||
|
def handleProblems(*args, **kwargs):
|
||||||
|
response = {
|
||||||
|
'paid': False,
|
||||||
|
'response_object': None,
|
||||||
|
'error': None
|
||||||
|
}
|
||||||
|
|
||||||
|
common_message = "Currently it's not possible to make payments."
|
||||||
|
try:
|
||||||
|
response_object = f(*args, **kwargs)
|
||||||
|
response = {
|
||||||
|
'response_object': response_object,
|
||||||
|
'error': None
|
||||||
|
}
|
||||||
|
return response
|
||||||
|
except stripe.error.CardError as e:
|
||||||
|
# Since it's a decline, stripe.error.CardError will be caught
|
||||||
|
body = e.json_body
|
||||||
|
err = body['error']
|
||||||
|
response.update({'error': err['message']})
|
||||||
|
logger.error(str(e))
|
||||||
|
return response
|
||||||
|
except stripe.error.RateLimitError as e:
|
||||||
|
logger.error(str(e))
|
||||||
|
response.update(
|
||||||
|
{'error': "Too many requests made to the API too quickly"})
|
||||||
|
return response
|
||||||
|
except stripe.error.InvalidRequestError as e:
|
||||||
|
logger.error(str(e))
|
||||||
|
response.update({'error': str(e._message)})
|
||||||
|
return response
|
||||||
|
except stripe.error.AuthenticationError as e:
|
||||||
|
# Authentication with Stripe's API failed
|
||||||
|
# (maybe you changed API keys recently)
|
||||||
|
logger.error(str(e))
|
||||||
|
response.update({'error': str(e)})
|
||||||
|
return response
|
||||||
|
except stripe.error.APIConnectionError as e:
|
||||||
|
logger.error(str(e))
|
||||||
|
response.update({'error': str(e)})
|
||||||
|
return response
|
||||||
|
except stripe.error.StripeError as e:
|
||||||
|
# maybe send email
|
||||||
|
logger.error(str(e))
|
||||||
|
response.update({'error': str(e)})
|
||||||
|
return response
|
||||||
|
except Exception as e:
|
||||||
|
# maybe send email
|
||||||
|
logger.error(str(e))
|
||||||
|
response.update({'error': str(e)})
|
||||||
|
return response
|
||||||
|
|
||||||
|
return handleProblems
|
||||||
|
|
||||||
|
|
||||||
|
class StripeUtils(object):
|
||||||
|
CURRENCY = 'chf'
|
||||||
|
INTERVAL = 'month'
|
||||||
|
SUCCEEDED_STATUS = 'succeeded'
|
||||||
|
RESOURCE_ALREADY_EXISTS_ERROR_CODE = 'resource_already_exists'
|
||||||
|
STRIPE_NO_SUCH_PLAN = 'No such plan'
|
||||||
|
PLAN_EXISTS_ERROR_MSG = 'Plan {} exists already.\nCreating a local StripePlan now.'
|
||||||
|
PLAN_DOES_NOT_EXIST_ERROR_MSG = 'Plan {} does not exist.'
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.stripe = stripe
|
||||||
|
|
||||||
|
def update_customer_token(self, customer, token):
|
||||||
|
customer.source = token
|
||||||
|
customer.save()
|
||||||
|
|
||||||
|
@handleStripeError
|
||||||
|
def associate_customer_card(self, stripe_customer_id, id_payment_method,
|
||||||
|
set_as_default=False):
|
||||||
|
customer = stripe.Customer.retrieve(stripe_customer_id)
|
||||||
|
stripe.PaymentMethod.attach(
|
||||||
|
id_payment_method,
|
||||||
|
customer=stripe_customer_id,
|
||||||
|
)
|
||||||
|
if set_as_default:
|
||||||
|
customer.invoice_settings.default_payment_method = id_payment_method
|
||||||
|
customer.save()
|
||||||
|
return True
|
||||||
|
|
||||||
|
@handleStripeError
|
||||||
|
def dissociate_customer_card(self, stripe_customer_id, card_id):
|
||||||
|
customer = stripe.Customer.retrieve(stripe_customer_id)
|
||||||
|
if card_id.startswith("pm"):
|
||||||
|
logger.debug("PaymentMethod %s detached %s" % (card_id,
|
||||||
|
stripe_customer_id))
|
||||||
|
pm = stripe.PaymentMethod.retrieve(card_id)
|
||||||
|
stripe.PaymentMethod.detach(card_id)
|
||||||
|
pm.delete()
|
||||||
|
else:
|
||||||
|
logger.debug("card %s detached %s" % (card_id, stripe_customer_id))
|
||||||
|
card = customer.sources.retrieve(card_id)
|
||||||
|
card.delete()
|
||||||
|
|
||||||
|
@handleStripeError
|
||||||
|
def update_customer_card(self, customer_id, token):
|
||||||
|
customer = stripe.Customer.retrieve(customer_id)
|
||||||
|
current_card_token = customer.default_source
|
||||||
|
customer.sources.retrieve(current_card_token).delete()
|
||||||
|
customer.source = token
|
||||||
|
customer.save()
|
||||||
|
credit_card_raw_data = customer.sources.data.pop()
|
||||||
|
new_card_data = {
|
||||||
|
'last4': credit_card_raw_data.last4,
|
||||||
|
'brand': credit_card_raw_data.brand
|
||||||
|
}
|
||||||
|
return new_card_data
|
||||||
|
|
||||||
|
@handleStripeError
|
||||||
|
def get_card_details(self, customer_id):
|
||||||
|
customer = stripe.Customer.retrieve(customer_id)
|
||||||
|
credit_card_raw_data = customer.sources.data.pop()
|
||||||
|
card_details = {
|
||||||
|
'last4': credit_card_raw_data.last4,
|
||||||
|
'brand': credit_card_raw_data.brand,
|
||||||
|
'exp_month': credit_card_raw_data.exp_month,
|
||||||
|
'exp_year': credit_card_raw_data.exp_year,
|
||||||
|
'fingerprint': credit_card_raw_data.fingerprint,
|
||||||
|
'card_id': credit_card_raw_data.id
|
||||||
|
}
|
||||||
|
return card_details
|
||||||
|
|
||||||
|
@handleStripeError
|
||||||
|
def get_all_invoices(self, customer_id, created_gt):
|
||||||
|
return_list = []
|
||||||
|
has_more_invoices = True
|
||||||
|
starting_after = False
|
||||||
|
while has_more_invoices:
|
||||||
|
if starting_after:
|
||||||
|
invoices = stripe.Invoice.list(
|
||||||
|
limit=10, customer=customer_id, created={'gt': created_gt},
|
||||||
|
starting_after=starting_after
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
invoices = stripe.Invoice.list(
|
||||||
|
limit=10, customer=customer_id, created={'gt': created_gt}
|
||||||
|
)
|
||||||
|
has_more_invoices = invoices.has_more
|
||||||
|
for invoice in invoices.data:
|
||||||
|
sub_ids = []
|
||||||
|
for line in invoice.lines.data:
|
||||||
|
if line.type == 'subscription':
|
||||||
|
sub_ids.append(line.id)
|
||||||
|
elif line.type == 'invoiceitem':
|
||||||
|
sub_ids.append(line.subscription)
|
||||||
|
else:
|
||||||
|
sub_ids.append('')
|
||||||
|
invoice_details = {
|
||||||
|
'created': invoice.created,
|
||||||
|
'receipt_number': invoice.receipt_number,
|
||||||
|
'invoice_number': invoice.number,
|
||||||
|
'paid_at': invoice.status_transitions.paid_at if invoice.paid else 0,
|
||||||
|
'period_start': invoice.period_start,
|
||||||
|
'period_end': invoice.period_end,
|
||||||
|
'billing_reason': invoice.billing_reason,
|
||||||
|
'discount': invoice.discount.coupon.amount_off if invoice.discount else 0,
|
||||||
|
'total': invoice.total,
|
||||||
|
# to see how many line items we have in this invoice and
|
||||||
|
# then later check if we have more than 1
|
||||||
|
'lines_data_count': len(invoice.lines.data) if invoice.lines.data is not None else 0,
|
||||||
|
'invoice_id': invoice.id,
|
||||||
|
'lines_meta_data_csv': ','.join(
|
||||||
|
[line.metadata.VM_ID if hasattr(line.metadata, 'VM_ID') else '' for line in invoice.lines.data]
|
||||||
|
),
|
||||||
|
'subscription_ids_csv': ','.join(sub_ids),
|
||||||
|
'line_items': invoice.lines.data
|
||||||
|
}
|
||||||
|
starting_after = invoice.id
|
||||||
|
return_list.append(invoice_details)
|
||||||
|
return return_list
|
||||||
|
|
||||||
|
@handleStripeError
|
||||||
|
def get_cards_details_from_token(self, token):
|
||||||
|
stripe_token = stripe.Token.retrieve(token)
|
||||||
|
card_details = {
|
||||||
|
'last4': stripe_token.card.last4,
|
||||||
|
'brand': stripe_token.card.brand,
|
||||||
|
'exp_month': stripe_token.card.exp_month,
|
||||||
|
'exp_year': stripe_token.card.exp_year,
|
||||||
|
'fingerprint': stripe_token.card.fingerprint,
|
||||||
|
'card_id': stripe_token.card.id
|
||||||
|
}
|
||||||
|
return card_details
|
||||||
|
|
||||||
|
@handleStripeError
|
||||||
|
def get_cards_details_from_payment_method(self, payment_method_id):
|
||||||
|
payment_method = stripe.PaymentMethod.retrieve(payment_method_id)
|
||||||
|
# payment_method does not always seem to have a card with id
|
||||||
|
# if that is the case, fallback to payment_method_id for card_id
|
||||||
|
card_id = payment_method_id
|
||||||
|
if hasattr(payment_method.card, 'id'):
|
||||||
|
card_id = payment_method.card.id
|
||||||
|
card_details = {
|
||||||
|
'last4': payment_method.card.last4,
|
||||||
|
'brand': payment_method.card.brand,
|
||||||
|
'exp_month': payment_method.card.exp_month,
|
||||||
|
'exp_year': payment_method.card.exp_year,
|
||||||
|
'fingerprint': payment_method.card.fingerprint,
|
||||||
|
'card_id': card_id
|
||||||
|
}
|
||||||
|
return card_details
|
||||||
|
|
||||||
|
def check_customer(self, stripe_cus_api_id, user, token):
|
||||||
|
try:
|
||||||
|
customer = stripe.Customer.retrieve(stripe_cus_api_id)
|
||||||
|
except stripe.InvalidRequestError:
|
||||||
|
customer = self.create_customer(token, user.email, user.name)
|
||||||
|
user.stripecustomer.stripe_id = customer.get(
|
||||||
|
'response_object').get('id')
|
||||||
|
user.stripecustomer.save()
|
||||||
|
if type(customer) is dict:
|
||||||
|
customer = customer['response_object']
|
||||||
|
return customer
|
||||||
|
|
||||||
|
@handleStripeError
|
||||||
|
def get_customer(self, stripe_api_cus_id):
|
||||||
|
customer = stripe.Customer.retrieve(stripe_api_cus_id)
|
||||||
|
# data = customer.get('response_object')
|
||||||
|
return customer
|
||||||
|
|
||||||
|
@handleStripeError
|
||||||
|
def create_customer(self, id_payment_method, email, name=None):
|
||||||
|
if name is None or name.strip() == "":
|
||||||
|
name = email
|
||||||
|
customer = self.stripe.Customer.create(
|
||||||
|
payment_method=id_payment_method,
|
||||||
|
description=name,
|
||||||
|
email=email
|
||||||
|
)
|
||||||
|
return customer
|
||||||
|
|
||||||
|
@handleStripeError
|
||||||
|
def make_charge(self, amount=None, customer=None):
|
||||||
|
_amount = float(amount)
|
||||||
|
amount = int(_amount * 100) # stripe amount unit, in cents
|
||||||
|
charge = self.stripe.Charge.create(
|
||||||
|
amount=amount, # in cents
|
||||||
|
currency=self.CURRENCY,
|
||||||
|
customer=customer
|
||||||
|
)
|
||||||
|
return charge
|
||||||
|
|
||||||
|
# @handleStripeError
|
||||||
|
# def get_or_create_stripe_plan(self, amount, name, stripe_plan_id,
|
||||||
|
# interval=""):
|
||||||
|
# """
|
||||||
|
# This function checks if a StripePlan with the given
|
||||||
|
# stripe_plan_id already exists. If it exists then the function
|
||||||
|
# returns this object otherwise it creates a new StripePlan and
|
||||||
|
# returns the new object.
|
||||||
|
#
|
||||||
|
# :param amount: The amount in CHF
|
||||||
|
# :param name: The name of the Stripe plan to be created.
|
||||||
|
# :param stripe_plan_id: The id of the Stripe plan to be
|
||||||
|
# created. Use get_stripe_plan_id_string function to
|
||||||
|
# obtain the name of the plan to be created
|
||||||
|
# :param interval: str representing the interval of the Plan
|
||||||
|
# Specifies billing frequency. Either day, week, month or year.
|
||||||
|
# Ref: https://stripe.com/docs/api/plans/create#create_plan-interval
|
||||||
|
# The default is month
|
||||||
|
# :return: The StripePlan object if it exists else creates a
|
||||||
|
# Plan object in Stripe and a local StripePlan and
|
||||||
|
# returns it. Returns None in case of Stripe error
|
||||||
|
# """
|
||||||
|
# _amount = float(amount)
|
||||||
|
# amount = int(_amount * 100) # stripe amount unit, in cents
|
||||||
|
# stripe_plan_db_obj = None
|
||||||
|
# plan_interval = interval if interval is not "" else self.INTERVAL
|
||||||
|
# try:
|
||||||
|
# stripe_plan_db_obj = StripePlan.objects.get(
|
||||||
|
# stripe_plan_id=stripe_plan_id)
|
||||||
|
# except StripePlan.DoesNotExist:
|
||||||
|
# try:
|
||||||
|
# self.stripe.Plan.create(
|
||||||
|
# amount=amount,
|
||||||
|
# interval=plan_interval,
|
||||||
|
# name=name,
|
||||||
|
# currency=self.CURRENCY,
|
||||||
|
# id=stripe_plan_id)
|
||||||
|
# stripe_plan_db_obj = StripePlan.objects.create(
|
||||||
|
# stripe_plan_id=stripe_plan_id)
|
||||||
|
# except stripe.error.InvalidRequestError as e:
|
||||||
|
# logger.error(str(e))
|
||||||
|
# logger.error("error_code = %s" % str(e.__dict__))
|
||||||
|
# if self.RESOURCE_ALREADY_EXISTS_ERROR_CODE in e.error.code:
|
||||||
|
# logger.debug(
|
||||||
|
# self.PLAN_EXISTS_ERROR_MSG.format(stripe_plan_id))
|
||||||
|
# stripe_plan_db_obj, c = StripePlan.objects.get_or_create(
|
||||||
|
# stripe_plan_id=stripe_plan_id)
|
||||||
|
# if c:
|
||||||
|
# logger.debug("Created stripe plan %s" % stripe_plan_id)
|
||||||
|
# else:
|
||||||
|
# logger.debug("Plan %s exists already" % stripe_plan_id)
|
||||||
|
# return stripe_plan_db_obj
|
||||||
|
#
|
||||||
|
# @handleStripeError
|
||||||
|
# def delete_stripe_plan(self, stripe_plan_id):
|
||||||
|
# """
|
||||||
|
# Deletes the Plan in Stripe and also deletes the local db copy
|
||||||
|
# of the plan if it exists
|
||||||
|
#
|
||||||
|
# :param stripe_plan_id: The stripe plan id that needs to be
|
||||||
|
# deleted
|
||||||
|
# :return: True if the plan was deleted successfully from
|
||||||
|
# Stripe, False otherwise.
|
||||||
|
# """
|
||||||
|
# return_value = False
|
||||||
|
# try:
|
||||||
|
# plan = self.stripe.Plan.retrieve(stripe_plan_id)
|
||||||
|
# plan.delete()
|
||||||
|
# return_value = True
|
||||||
|
# StripePlan.objects.filter(
|
||||||
|
# stripe_plan_id=stripe_plan_id).all().delete()
|
||||||
|
# except stripe.error.InvalidRequestError as e:
|
||||||
|
# if self.STRIPE_NO_SUCH_PLAN in str(e):
|
||||||
|
# logger.debug(
|
||||||
|
# self.PLAN_DOES_NOT_EXIST_ERROR_MSG.format(stripe_plan_id))
|
||||||
|
# return return_value
|
||||||
|
|
||||||
|
@handleStripeError
|
||||||
|
def subscribe_customer_to_plan(self, customer, plans, trial_end=None,
|
||||||
|
coupon="", tax_rates=list(),
|
||||||
|
default_payment_method=""):
|
||||||
|
"""
|
||||||
|
Subscribes the given customer to the list of given plans
|
||||||
|
|
||||||
|
:param default_payment_method:
|
||||||
|
:param tax_rates:
|
||||||
|
:param coupon:
|
||||||
|
:param customer: The stripe customer identifier
|
||||||
|
:param plans: A list of stripe plans.
|
||||||
|
:param trial_end: An integer representing when the Stripe subscription
|
||||||
|
is supposed to end
|
||||||
|
Ref: https://stripe.com/docs/api/python#create_subscription-items
|
||||||
|
e.g.
|
||||||
|
plans = [
|
||||||
|
{
|
||||||
|
"plan": "dcl-v1-cpu-2-ram-5gb-ssd-10gb",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
:return: The subscription StripeObject
|
||||||
|
"""
|
||||||
|
logger.debug("Subscribing %s to plan %s : coupon = %s" % (
|
||||||
|
customer, str(plans), str(coupon)
|
||||||
|
))
|
||||||
|
subscription_result = self.stripe.Subscription.create(
|
||||||
|
customer=customer, items=plans, trial_end=trial_end,
|
||||||
|
coupon=coupon,
|
||||||
|
default_tax_rates=tax_rates,
|
||||||
|
payment_behavior='allow_incomplete',
|
||||||
|
default_payment_method=default_payment_method
|
||||||
|
)
|
||||||
|
logger.debug("Done subscribing")
|
||||||
|
return subscription_result
|
||||||
|
|
||||||
|
@handleStripeError
|
||||||
|
def set_subscription_metadata(self, subscription_id, metadata):
|
||||||
|
subscription = stripe.Subscription.retrieve(subscription_id)
|
||||||
|
subscription.metadata = metadata
|
||||||
|
subscription.save()
|
||||||
|
|
||||||
|
@handleStripeError
|
||||||
|
def unsubscribe_customer(self, subscription_id):
|
||||||
|
"""
|
||||||
|
Cancels a given subscription
|
||||||
|
|
||||||
|
:param subscription_id: The Stripe subscription id string
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
sub = stripe.Subscription.retrieve(subscription_id)
|
||||||
|
return sub.delete()
|
||||||
|
|
||||||
|
@handleStripeError
|
||||||
|
def make_payment(self, customer, amount, token):
|
||||||
|
charge = self.stripe.Charge.create(
|
||||||
|
amount=amount, # in cents
|
||||||
|
currency=self.CURRENCY,
|
||||||
|
customer=customer
|
||||||
|
)
|
||||||
|
return charge
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_stripe_plan_id(cpu, ram, ssd, version, app='dcl', hdd=None,
|
||||||
|
price=None, excl_vat=True):
|
||||||
|
"""
|
||||||
|
Returns the Stripe plan id string of the form
|
||||||
|
`dcl-v1-cpu-2-ram-5gb-ssd-10gb` based on the input parameters
|
||||||
|
|
||||||
|
:param cpu: The number of cores
|
||||||
|
:param ram: The size of the RAM in GB
|
||||||
|
:param ssd: The size of ssd storage in GB
|
||||||
|
:param hdd: The size of hdd storage in GB
|
||||||
|
:param version: The version of the Stripe plans
|
||||||
|
:param app: The application to which the stripe plan belongs
|
||||||
|
to. By default it is 'dcl'
|
||||||
|
:param price: The price for this plan
|
||||||
|
:return: A string of the form `dcl-v1-cpu-2-ram-5gb-ssd-10gb`
|
||||||
|
"""
|
||||||
|
dcl_plan_string = 'cpu-{cpu}-ram-{ram}gb-ssd-{ssd}gb'.format(cpu=cpu,
|
||||||
|
ram=ram,
|
||||||
|
ssd=ssd)
|
||||||
|
if hdd is not None:
|
||||||
|
dcl_plan_string = '{dcl_plan_string}-hdd-{hdd}gb'.format(
|
||||||
|
dcl_plan_string=dcl_plan_string, hdd=hdd)
|
||||||
|
stripe_plan_id_string = '{app}-v{version}-{plan}'.format(
|
||||||
|
app=app,
|
||||||
|
version=version,
|
||||||
|
plan=dcl_plan_string
|
||||||
|
)
|
||||||
|
if price is not None:
|
||||||
|
stripe_plan_id_string = '{}-{}chf'.format(
|
||||||
|
stripe_plan_id_string,
|
||||||
|
round(price, 2)
|
||||||
|
)
|
||||||
|
if excl_vat:
|
||||||
|
stripe_plan_id_string = '{}-{}'.format(
|
||||||
|
stripe_plan_id_string,
|
||||||
|
"excl_vat"
|
||||||
|
)
|
||||||
|
return stripe_plan_id_string
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_vm_config_from_stripe_id(stripe_id):
|
||||||
|
"""
|
||||||
|
Given a string like "dcl-v1-cpu-2-ram-5gb-ssd-10gb" return different
|
||||||
|
configuration params as a dict
|
||||||
|
|
||||||
|
:param stripe_id|str
|
||||||
|
:return: dict
|
||||||
|
"""
|
||||||
|
pattern = re.compile(r'^dcl-v(\d+)-cpu-(\d+)-ram-(\d+\.?\d*)gb-ssd-(\d+)gb-?(\d*\.?\d*)(chf)?$')
|
||||||
|
match_res = pattern.match(stripe_id)
|
||||||
|
if match_res is not None:
|
||||||
|
price = None
|
||||||
|
try:
|
||||||
|
price=match_res.group(5)
|
||||||
|
except IndexError as ie:
|
||||||
|
logger.debug("Did not find price in {}".format(stripe_id))
|
||||||
|
return {
|
||||||
|
'version': match_res.group(1),
|
||||||
|
'cores': match_res.group(2),
|
||||||
|
'ram': match_res.group(3),
|
||||||
|
'ssd': match_res.group(4),
|
||||||
|
'price': price
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_stripe_plan_name(cpu, memory, disk_size, price, excl_vat=True):
|
||||||
|
"""
|
||||||
|
Returns the Stripe plan name
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
if excl_vat:
|
||||||
|
return "{cpu} Cores, {memory} GB RAM, {disk_size} GB SSD, " \
|
||||||
|
"{price} CHF Excl. VAT".format(
|
||||||
|
cpu=cpu,
|
||||||
|
memory=memory,
|
||||||
|
disk_size=disk_size,
|
||||||
|
price=round(price, 2)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
return "{cpu} Cores, {memory} GB RAM, {disk_size} GB SSD, " \
|
||||||
|
"{price} CHF".format(
|
||||||
|
cpu=cpu,
|
||||||
|
memory=memory,
|
||||||
|
disk_size=disk_size,
|
||||||
|
price=round(price, 2)
|
||||||
|
)
|
||||||
|
|
||||||
|
@handleStripeError
|
||||||
|
def set_subscription_meta_data(self, subscription_id, meta_data):
|
||||||
|
"""
|
||||||
|
Adds VM metadata to a subscription
|
||||||
|
:param subscription_id: Stripe identifier for the subscription
|
||||||
|
:param meta_data: A dict of meta data to be added
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
subscription = stripe.Subscription.retrieve(subscription_id)
|
||||||
|
subscription.metadata = meta_data
|
||||||
|
subscription.save()
|
||||||
|
|
||||||
|
@handleStripeError
|
||||||
|
def get_or_create_tax_id_for_user(self, stripe_customer_id, vat_number,
|
||||||
|
type="eu_vat", country=""):
|
||||||
|
tax_ids_list = stripe.Customer.list_tax_ids(
|
||||||
|
stripe_customer_id,
|
||||||
|
limit=100,
|
||||||
|
)
|
||||||
|
for tax_id_obj in tax_ids_list.data:
|
||||||
|
if self.compare_vat_numbers(tax_id_obj.value, vat_number):
|
||||||
|
logger.debug("tax id obj exists already")
|
||||||
|
return tax_id_obj
|
||||||
|
else:
|
||||||
|
logger.debug(
|
||||||
|
"{val1} is not equal to {val2} or {con1} not same as "
|
||||||
|
"{con2}".format(val1=tax_id_obj.value, val2=vat_number,
|
||||||
|
con1=tax_id_obj.country.lower(),
|
||||||
|
con2=country.lower().strip()))
|
||||||
|
logger.debug(
|
||||||
|
"tax id obj does not exist for {val}. Creating a new one".format(
|
||||||
|
val=vat_number
|
||||||
|
))
|
||||||
|
tax_id_obj = stripe.Customer.create_tax_id(
|
||||||
|
stripe_customer_id,
|
||||||
|
type=type,
|
||||||
|
value=vat_number,
|
||||||
|
)
|
||||||
|
return tax_id_obj
|
||||||
|
|
||||||
|
@handleStripeError
|
||||||
|
def get_payment_intent(self, amount, customer):
|
||||||
|
""" Create a stripe PaymentIntent of the given amount and return it
|
||||||
|
:param amount: the amount of payment_intent
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
payment_intent_obj = stripe.PaymentIntent.create(
|
||||||
|
amount=amount,
|
||||||
|
currency='chf',
|
||||||
|
customer=customer,
|
||||||
|
setup_future_usage='off_session'
|
||||||
|
)
|
||||||
|
return payment_intent_obj
|
||||||
|
|
||||||
|
@handleStripeError
|
||||||
|
def get_available_payment_methods(self, customer):
|
||||||
|
""" Retrieves all payment methods of the given customer
|
||||||
|
:param customer: StripeCustomer object
|
||||||
|
:return: a list of available payment methods
|
||||||
|
"""
|
||||||
|
return_list = []
|
||||||
|
if customer is None:
|
||||||
|
return return_list
|
||||||
|
cu = stripe.Customer.retrieve(customer.stripe_id)
|
||||||
|
pms = stripe.PaymentMethod.list(
|
||||||
|
customer=customer.stripe_id,
|
||||||
|
type="card",
|
||||||
|
)
|
||||||
|
default_source = None
|
||||||
|
if cu.default_source:
|
||||||
|
default_source = cu.default_source
|
||||||
|
else:
|
||||||
|
default_source = cu.invoice_settings.default_payment_method
|
||||||
|
for pm in pms.data:
|
||||||
|
return_list.append({
|
||||||
|
'last4': pm.card.last4, 'brand': pm.card.brand, 'id': pm.id,
|
||||||
|
'exp_year': pm.card.exp_year,
|
||||||
|
'exp_month': '{:02d}'.format(pm.card.exp_month),
|
||||||
|
'preferred': pm.id == default_source
|
||||||
|
})
|
||||||
|
return return_list
|
||||||
|
|
||||||
|
def compare_vat_numbers(self, vat1, vat2):
|
||||||
|
_vat1 = vat1.replace(" ", "").replace(".", "").replace("-","")
|
||||||
|
_vat2 = vat2.replace(" ", "").replace(".", "").replace("-","")
|
||||||
|
return True if _vat1 == _vat2 else False
|
|
@ -15,8 +15,9 @@ Including another URLconf
|
||||||
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||||
"""
|
"""
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.urls import path
|
from django.urls import re_path, path, include
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
|
#re_path('hosting/', include('hosting.urls'))
|
||||||
]
|
]
|
||||||
|
|
0
hosting/__init__.py
Normal file
3
hosting/admin.py
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
6
hosting/apps.py
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class HostingConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'hosting'
|
32
hosting/context_processor.py
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
|
||||||
|
def google_analytics(request):
|
||||||
|
"""
|
||||||
|
Use the variables returned in this function to
|
||||||
|
render your Google Analytics tracking code template.
|
||||||
|
|
||||||
|
Also check whether the site is a tenant site and create a corresponding
|
||||||
|
variable to indicate this
|
||||||
|
"""
|
||||||
|
return_dict = {}
|
||||||
|
host = request.get_host()
|
||||||
|
if getattr(settings, 'GOOGLE_ANALYTICS_PROPERTY_IDS', False):
|
||||||
|
ga_prop_id = getattr(settings, 'GOOGLE_ANALYTICS_PROPERTY_IDS').get(
|
||||||
|
host)
|
||||||
|
which_urlspy = settings.MULTISITE_CMS_URLS.get(host)
|
||||||
|
if ga_prop_id is None:
|
||||||
|
# Try checking if we have a www in host, if yes we remove
|
||||||
|
# that and check in the dict again
|
||||||
|
if host.startswith('www.'):
|
||||||
|
ga_prop_id = getattr(settings, 'GOOGLE_ANALYTICS_PROPERTY_IDS',
|
||||||
|
False).get(host[4:])
|
||||||
|
which_urlspy = settings.MULTISITE_CMS_URLS.get(host[4:])
|
||||||
|
|
||||||
|
if not settings.DEBUG and ga_prop_id:
|
||||||
|
return_dict['GOOGLE_ANALYTICS_PROPERTY_ID'] = ga_prop_id
|
||||||
|
if which_urlspy:
|
||||||
|
if which_urlspy.endswith("multi"):
|
||||||
|
return_dict['IS_TENANT_SITE'] = True
|
||||||
|
|
||||||
|
return return_dict
|
256
hosting/fields.py
Normal file
|
@ -0,0 +1,256 @@
|
||||||
|
from django.utils.translation import gettext as _
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
# http://xml.coverpages.org/country3166.html
|
||||||
|
COUNTRIES = (
|
||||||
|
('AD', _('Andorra')),
|
||||||
|
('AE', _('United Arab Emirates')),
|
||||||
|
('AF', _('Afghanistan')),
|
||||||
|
('AG', _('Antigua & Barbuda')),
|
||||||
|
('AI', _('Anguilla')),
|
||||||
|
('AL', _('Albania')),
|
||||||
|
('AM', _('Armenia')),
|
||||||
|
('AN', _('Netherlands Antilles')),
|
||||||
|
('AO', _('Angola')),
|
||||||
|
('AQ', _('Antarctica')),
|
||||||
|
('AR', _('Argentina')),
|
||||||
|
('AS', _('American Samoa')),
|
||||||
|
('AT', _('Austria')),
|
||||||
|
('AU', _('Australia')),
|
||||||
|
('AW', _('Aruba')),
|
||||||
|
('AZ', _('Azerbaijan')),
|
||||||
|
('BA', _('Bosnia and Herzegovina')),
|
||||||
|
('BB', _('Barbados')),
|
||||||
|
('BD', _('Bangladesh')),
|
||||||
|
('BE', _('Belgium')),
|
||||||
|
('BF', _('Burkina Faso')),
|
||||||
|
('BG', _('Bulgaria')),
|
||||||
|
('BH', _('Bahrain')),
|
||||||
|
('BI', _('Burundi')),
|
||||||
|
('BJ', _('Benin')),
|
||||||
|
('BM', _('Bermuda')),
|
||||||
|
('BN', _('Brunei Darussalam')),
|
||||||
|
('BO', _('Bolivia')),
|
||||||
|
('BR', _('Brazil')),
|
||||||
|
('BS', _('Bahama')),
|
||||||
|
('BT', _('Bhutan')),
|
||||||
|
('BV', _('Bouvet Island')),
|
||||||
|
('BW', _('Botswana')),
|
||||||
|
('BY', _('Belarus')),
|
||||||
|
('BZ', _('Belize')),
|
||||||
|
('CA', _('Canada')),
|
||||||
|
('CC', _('Cocos (Keeling) Islands')),
|
||||||
|
('CF', _('Central African Republic')),
|
||||||
|
('CG', _('Congo')),
|
||||||
|
('CH', _('Switzerland')),
|
||||||
|
('CI', _('Ivory Coast')),
|
||||||
|
('CK', _('Cook Iislands')),
|
||||||
|
('CL', _('Chile')),
|
||||||
|
('CM', _('Cameroon')),
|
||||||
|
('CN', _('China')),
|
||||||
|
('CO', _('Colombia')),
|
||||||
|
('CR', _('Costa Rica')),
|
||||||
|
('CU', _('Cuba')),
|
||||||
|
('CV', _('Cape Verde')),
|
||||||
|
('CX', _('Christmas Island')),
|
||||||
|
('CY', _('Cyprus')),
|
||||||
|
('CZ', _('Czech Republic')),
|
||||||
|
('DE', _('Germany')),
|
||||||
|
('DJ', _('Djibouti')),
|
||||||
|
('DK', _('Denmark')),
|
||||||
|
('DM', _('Dominica')),
|
||||||
|
('DO', _('Dominican Republic')),
|
||||||
|
('DZ', _('Algeria')),
|
||||||
|
('EC', _('Ecuador')),
|
||||||
|
('EE', _('Estonia')),
|
||||||
|
('EG', _('Egypt')),
|
||||||
|
('EH', _('Western Sahara')),
|
||||||
|
('ER', _('Eritrea')),
|
||||||
|
('ES', _('Spain')),
|
||||||
|
('ET', _('Ethiopia')),
|
||||||
|
('FI', _('Finland')),
|
||||||
|
('FJ', _('Fiji')),
|
||||||
|
('FK', _('Falkland Islands (Malvinas)')),
|
||||||
|
('FM', _('Micronesia')),
|
||||||
|
('FO', _('Faroe Islands')),
|
||||||
|
('FR', _('France')),
|
||||||
|
('FX', _('France, Metropolitan')),
|
||||||
|
('GA', _('Gabon')),
|
||||||
|
('GB', _('United Kingdom (Great Britain)')),
|
||||||
|
('GD', _('Grenada')),
|
||||||
|
('GE', _('Georgia')),
|
||||||
|
('GF', _('French Guiana')),
|
||||||
|
('GH', _('Ghana')),
|
||||||
|
('GI', _('Gibraltar')),
|
||||||
|
('GL', _('Greenland')),
|
||||||
|
('GM', _('Gambia')),
|
||||||
|
('GN', _('Guinea')),
|
||||||
|
('GP', _('Guadeloupe')),
|
||||||
|
('GQ', _('Equatorial Guinea')),
|
||||||
|
('GR', _('Greece')),
|
||||||
|
('GS', _('South Georgia and the South Sandwich Islands')),
|
||||||
|
('GT', _('Guatemala')),
|
||||||
|
('GU', _('Guam')),
|
||||||
|
('GW', _('Guinea-Bissau')),
|
||||||
|
('GY', _('Guyana')),
|
||||||
|
('HK', _('Hong Kong')),
|
||||||
|
('HM', _('Heard & McDonald Islands')),
|
||||||
|
('HN', _('Honduras')),
|
||||||
|
('HR', _('Croatia')),
|
||||||
|
('HT', _('Haiti')),
|
||||||
|
('HU', _('Hungary')),
|
||||||
|
('ID', _('Indonesia')),
|
||||||
|
('IE', _('Ireland')),
|
||||||
|
('IL', _('Israel')),
|
||||||
|
('IN', _('India')),
|
||||||
|
('IO', _('British Indian Ocean Territory')),
|
||||||
|
('IQ', _('Iraq')),
|
||||||
|
('IR', _('Islamic Republic of Iran')),
|
||||||
|
('IS', _('Iceland')),
|
||||||
|
('IT', _('Italy')),
|
||||||
|
('JM', _('Jamaica')),
|
||||||
|
('JO', _('Jordan')),
|
||||||
|
('JP', _('Japan')),
|
||||||
|
('KE', _('Kenya')),
|
||||||
|
('KG', _('Kyrgyzstan')),
|
||||||
|
('KH', _('Cambodia')),
|
||||||
|
('KI', _('Kiribati')),
|
||||||
|
('KM', _('Comoros')),
|
||||||
|
('KN', _('St. Kitts and Nevis')),
|
||||||
|
('KP', _('Korea, Democratic People\'s Republic of')),
|
||||||
|
('KR', _('Korea, Republic of')),
|
||||||
|
('KW', _('Kuwait')),
|
||||||
|
('KY', _('Cayman Islands')),
|
||||||
|
('KZ', _('Kazakhstan')),
|
||||||
|
('LA', _('Lao People\'s Democratic Republic')),
|
||||||
|
('LB', _('Lebanon')),
|
||||||
|
('LC', _('Saint Lucia')),
|
||||||
|
('LI', _('Liechtenstein')),
|
||||||
|
('LK', _('Sri Lanka')),
|
||||||
|
('LR', _('Liberia')),
|
||||||
|
('LS', _('Lesotho')),
|
||||||
|
('LT', _('Lithuania')),
|
||||||
|
('LU', _('Luxembourg')),
|
||||||
|
('LV', _('Latvia')),
|
||||||
|
('LY', _('Libyan Arab Jamahiriya')),
|
||||||
|
('MA', _('Morocco')),
|
||||||
|
('MC', _('Monaco')),
|
||||||
|
('MD', _('Moldova, Republic of')),
|
||||||
|
('MG', _('Madagascar')),
|
||||||
|
('MH', _('Marshall Islands')),
|
||||||
|
('ML', _('Mali')),
|
||||||
|
('MN', _('Mongolia')),
|
||||||
|
('MM', _('Myanmar')),
|
||||||
|
('MO', _('Macau')),
|
||||||
|
('MP', _('Northern Mariana Islands')),
|
||||||
|
('MQ', _('Martinique')),
|
||||||
|
('MR', _('Mauritania')),
|
||||||
|
('MS', _('Monserrat')),
|
||||||
|
('MT', _('Malta')),
|
||||||
|
('MU', _('Mauritius')),
|
||||||
|
('MV', _('Maldives')),
|
||||||
|
('MW', _('Malawi')),
|
||||||
|
('MX', _('Mexico')),
|
||||||
|
('MY', _('Malaysia')),
|
||||||
|
('MZ', _('Mozambique')),
|
||||||
|
('NA', _('Namibia')),
|
||||||
|
('NC', _('New Caledonia')),
|
||||||
|
('NE', _('Niger')),
|
||||||
|
('NF', _('Norfolk Island')),
|
||||||
|
('NG', _('Nigeria')),
|
||||||
|
('NI', _('Nicaragua')),
|
||||||
|
('NL', _('Netherlands')),
|
||||||
|
('NO', _('Norway')),
|
||||||
|
('NP', _('Nepal')),
|
||||||
|
('NR', _('Nauru')),
|
||||||
|
('NU', _('Niue')),
|
||||||
|
('NZ', _('New Zealand')),
|
||||||
|
('OM', _('Oman')),
|
||||||
|
('PA', _('Panama')),
|
||||||
|
('PE', _('Peru')),
|
||||||
|
('PF', _('French Polynesia')),
|
||||||
|
('PG', _('Papua New Guinea')),
|
||||||
|
('PH', _('Philippines')),
|
||||||
|
('PK', _('Pakistan')),
|
||||||
|
('PL', _('Poland')),
|
||||||
|
('PM', _('St. Pierre & Miquelon')),
|
||||||
|
('PN', _('Pitcairn')),
|
||||||
|
('PR', _('Puerto Rico')),
|
||||||
|
('PT', _('Portugal')),
|
||||||
|
('PW', _('Palau')),
|
||||||
|
('PY', _('Paraguay')),
|
||||||
|
('QA', _('Qatar')),
|
||||||
|
('RE', _('Reunion')),
|
||||||
|
('RO', _('Romania')),
|
||||||
|
('RU', _('Russian Federation')),
|
||||||
|
('RW', _('Rwanda')),
|
||||||
|
('SA', _('Saudi Arabia')),
|
||||||
|
('SB', _('Solomon Islands')),
|
||||||
|
('SC', _('Seychelles')),
|
||||||
|
('SD', _('Sudan')),
|
||||||
|
('SE', _('Sweden')),
|
||||||
|
('SG', _('Singapore')),
|
||||||
|
('SH', _('St. Helena')),
|
||||||
|
('SI', _('Slovenia')),
|
||||||
|
('SJ', _('Svalbard & Jan Mayen Islands')),
|
||||||
|
('SK', _('Slovakia')),
|
||||||
|
('SL', _('Sierra Leone')),
|
||||||
|
('SM', _('San Marino')),
|
||||||
|
('SN', _('Senegal')),
|
||||||
|
('SO', _('Somalia')),
|
||||||
|
('SR', _('Suriname')),
|
||||||
|
('ST', _('Sao Tome & Principe')),
|
||||||
|
('SV', _('El Salvador')),
|
||||||
|
('SY', _('Syrian Arab Republic')),
|
||||||
|
('SZ', _('Swaziland')),
|
||||||
|
('TC', _('Turks & Caicos Islands')),
|
||||||
|
('TD', _('Chad')),
|
||||||
|
('TF', _('French Southern Territories')),
|
||||||
|
('TG', _('Togo')),
|
||||||
|
('TH', _('Thailand')),
|
||||||
|
('TJ', _('Tajikistan')),
|
||||||
|
('TK', _('Tokelau')),
|
||||||
|
('TM', _('Turkmenistan')),
|
||||||
|
('TN', _('Tunisia')),
|
||||||
|
('TO', _('Tonga')),
|
||||||
|
('TP', _('East Timor')),
|
||||||
|
('TR', _('Turkey')),
|
||||||
|
('TT', _('Trinidad & Tobago')),
|
||||||
|
('TV', _('Tuvalu')),
|
||||||
|
('TW', _('Taiwan, Province of China')),
|
||||||
|
('TZ', _('Tanzania, United Republic of')),
|
||||||
|
('UA', _('Ukraine')),
|
||||||
|
('UG', _('Uganda')),
|
||||||
|
('UM', _('United States Minor Outlying Islands')),
|
||||||
|
('US', _('United States of America')),
|
||||||
|
('UY', _('Uruguay')),
|
||||||
|
('UZ', _('Uzbekistan')),
|
||||||
|
('VA', _('Vatican City State (Holy See)')),
|
||||||
|
('VC', _('St. Vincent & the Grenadines')),
|
||||||
|
('VE', _('Venezuela')),
|
||||||
|
('VG', _('British Virgin Islands')),
|
||||||
|
('VI', _('United States Virgin Islands')),
|
||||||
|
('VN', _('Viet Nam')),
|
||||||
|
('VU', _('Vanuatu')),
|
||||||
|
('WF', _('Wallis & Futuna Islands')),
|
||||||
|
('WS', _('Samoa')),
|
||||||
|
('YE', _('Yemen')),
|
||||||
|
('YT', _('Mayotte')),
|
||||||
|
('YU', _('Yugoslavia')),
|
||||||
|
('ZA', _('South Africa')),
|
||||||
|
('ZM', _('Zambia')),
|
||||||
|
('ZR', _('Zaire')),
|
||||||
|
('ZW', _('Zimbabwe')),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class CountryField(models.CharField):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
kwargs.setdefault('choices', COUNTRIES)
|
||||||
|
kwargs.setdefault('default', 'CH')
|
||||||
|
kwargs.setdefault('max_length', 2)
|
||||||
|
|
||||||
|
super(CountryField, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
def get_internal_type(self):
|
||||||
|
return "CharField"
|
373
hosting/forms.py
Normal file
|
@ -0,0 +1,373 @@
|
||||||
|
from django import forms
|
||||||
|
|
||||||
|
from .models import CustomUser, BillingAddress, UserBillingAddress
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
import datetime
|
||||||
|
import logging
|
||||||
|
import subprocess
|
||||||
|
import tempfile
|
||||||
|
import xml
|
||||||
|
|
||||||
|
from django import forms
|
||||||
|
from django.conf import settings
|
||||||
|
from django.contrib.auth import authenticate
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
from .models import CustomUser
|
||||||
|
from .models import UserHostingKey, GenericProduct
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class ResendActivationEmailForm(forms.Form):
|
||||||
|
email = forms.CharField(widget=forms.EmailInput())
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
fields = ['email']
|
||||||
|
|
||||||
|
def clean_email(self):
|
||||||
|
email = self.cleaned_data.get('email')
|
||||||
|
try:
|
||||||
|
c = CustomUser.objects.get(email=email)
|
||||||
|
if c.validated == 1:
|
||||||
|
raise forms.ValidationError(
|
||||||
|
_("The account is already active."))
|
||||||
|
return email
|
||||||
|
except CustomUser.DoesNotExist:
|
||||||
|
raise forms.ValidationError(_("User does not exist"))
|
||||||
|
|
||||||
|
|
||||||
|
class PasswordResetRequestForm(forms.Form):
|
||||||
|
email = forms.CharField(widget=forms.EmailInput())
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
fields = ['email']
|
||||||
|
|
||||||
|
def clean_email(self):
|
||||||
|
email = self.cleaned_data.get('email')
|
||||||
|
try:
|
||||||
|
CustomUser.objects.get(email=email)
|
||||||
|
return email
|
||||||
|
except CustomUser.DoesNotExist:
|
||||||
|
raise forms.ValidationError(_("User does not exist"))
|
||||||
|
|
||||||
|
|
||||||
|
class SetPasswordForm(forms.Form):
|
||||||
|
"""
|
||||||
|
A form that lets a user change set their password without entering the old
|
||||||
|
password
|
||||||
|
"""
|
||||||
|
error_messages = {
|
||||||
|
'password_mismatch': _("The two password fields didn't match."),
|
||||||
|
}
|
||||||
|
new_password1 = forms.CharField(label=_("New password"),
|
||||||
|
widget=forms.PasswordInput)
|
||||||
|
new_password2 = forms.CharField(label=_("New password confirmation"),
|
||||||
|
widget=forms.PasswordInput)
|
||||||
|
|
||||||
|
def clean_new_password2(self):
|
||||||
|
password1 = self.cleaned_data.get('new_password1')
|
||||||
|
password2 = self.cleaned_data.get('new_password2')
|
||||||
|
if password1 and password2:
|
||||||
|
if password1 != password2:
|
||||||
|
raise forms.ValidationError(
|
||||||
|
self.error_messages['password_mismatch'],
|
||||||
|
code='password_mismatch', )
|
||||||
|
return password2
|
||||||
|
|
||||||
|
|
||||||
|
class EditCreditCardForm(forms.Form):
|
||||||
|
token = forms.CharField(widget=forms.HiddenInput())
|
||||||
|
|
||||||
|
|
||||||
|
class BillingAddressForm(forms.ModelForm):
|
||||||
|
token = forms.CharField(widget=forms.HiddenInput(), required=False)
|
||||||
|
card = forms.CharField(widget=forms.HiddenInput(), required=False)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = BillingAddress
|
||||||
|
fields = ['cardholder_name', 'street_address',
|
||||||
|
'city', 'postal_code', 'country', 'vat_number']
|
||||||
|
labels = {
|
||||||
|
'cardholder_name': _('Cardholder Name'),
|
||||||
|
'street_address': _('Street Address'),
|
||||||
|
'city': _('City'),
|
||||||
|
'postal_code': _('Postal Code'),
|
||||||
|
'Country': _('Country'),
|
||||||
|
'VAT Number': _('VAT Number')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class BillingAddressFormSignup(BillingAddressForm):
|
||||||
|
name = forms.CharField(label=_('Name'))
|
||||||
|
email = forms.EmailField(label=_('Email Address'))
|
||||||
|
field_order = ['name', 'email']
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = BillingAddress
|
||||||
|
fields = ['name', 'email', 'cardholder_name', 'street_address',
|
||||||
|
'city', 'postal_code', 'country', 'vat_number']
|
||||||
|
labels = {
|
||||||
|
'name': 'Name',
|
||||||
|
'email': _('Email'),
|
||||||
|
'cardholder_name': _('Cardholder Name'),
|
||||||
|
'street_address': _('Street Address'),
|
||||||
|
'city': _('City'),
|
||||||
|
'postal_code': _('Postal Code'),
|
||||||
|
'Country': _('Country'),
|
||||||
|
'vat_number': _('VAT Number')
|
||||||
|
}
|
||||||
|
|
||||||
|
def clean_email(self):
|
||||||
|
email = self.cleaned_data.get('email')
|
||||||
|
try:
|
||||||
|
CustomUser.objects.get(email=email)
|
||||||
|
raise forms.ValidationError(
|
||||||
|
_("The email %(email)s is already registered with us. "
|
||||||
|
"Please reset your password and access your account.") %
|
||||||
|
{'email': email}
|
||||||
|
)
|
||||||
|
except CustomUser.DoesNotExist:
|
||||||
|
return email
|
||||||
|
|
||||||
|
|
||||||
|
class UserBillingAddressForm(forms.ModelForm):
|
||||||
|
user = forms.ModelChoiceField(queryset=CustomUser.objects.all(),
|
||||||
|
widget=forms.HiddenInput())
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = UserBillingAddress
|
||||||
|
fields = ['cardholder_name', 'street_address',
|
||||||
|
'city', 'postal_code', 'country', 'user', 'vat_number']
|
||||||
|
labels = {
|
||||||
|
'cardholder_name': _('Cardholder Name'),
|
||||||
|
'street_address': _('Street Building'),
|
||||||
|
'city': _('City'),
|
||||||
|
'postal_code': _('Postal Code'),
|
||||||
|
'Country': _('Country'),
|
||||||
|
'vat_number': _('VAT Number'),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def generate_ssh_key_name():
|
||||||
|
return '{prefix}{date_time_str}'.format(
|
||||||
|
prefix=settings.DCL_SSH_KEY_NAME_PREFIX,
|
||||||
|
date_time_str=datetime.datetime.now().strftime('%m%d%y%H%M%S')
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class HostingUserLoginForm(forms.Form):
|
||||||
|
email = forms.CharField(widget=forms.EmailInput())
|
||||||
|
password = forms.CharField(widget=forms.PasswordInput())
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
fields = ['email', 'password']
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
email = self.cleaned_data.get('email')
|
||||||
|
password = self.cleaned_data.get('password')
|
||||||
|
if self.errors:
|
||||||
|
return self.cleaned_data
|
||||||
|
is_auth = authenticate(email=email, password=password)
|
||||||
|
if not is_auth:
|
||||||
|
raise forms.ValidationError(
|
||||||
|
_("Your username and/or password were incorrect."))
|
||||||
|
elif is_auth.validated == 0:
|
||||||
|
raise forms.ValidationError(
|
||||||
|
_("Your account is not activated yet."))
|
||||||
|
return self.cleaned_data
|
||||||
|
|
||||||
|
def clean_email(self):
|
||||||
|
email = self.cleaned_data.get('email')
|
||||||
|
try:
|
||||||
|
CustomUser.objects.get(email=email)
|
||||||
|
return email
|
||||||
|
except CustomUser.DoesNotExist:
|
||||||
|
raise forms.ValidationError(_("User does not exist"))
|
||||||
|
|
||||||
|
|
||||||
|
class ProductModelChoiceField(forms.ModelChoiceField):
|
||||||
|
def label_from_instance(self, obj):
|
||||||
|
return obj.product_name
|
||||||
|
|
||||||
|
|
||||||
|
class GenericPaymentForm(forms.Form):
|
||||||
|
product_name = ProductModelChoiceField(
|
||||||
|
queryset=GenericProduct.objects.all().order_by('product_name'),
|
||||||
|
empty_label=_("Choose a product"),
|
||||||
|
)
|
||||||
|
amount = forms.FloatField(
|
||||||
|
widget=forms.TextInput(
|
||||||
|
attrs={'placeholder': _('Amount in CHF'),
|
||||||
|
'readonly': 'readonly', }
|
||||||
|
),
|
||||||
|
max_value=999999,
|
||||||
|
min_value=1,
|
||||||
|
label=_('Amount in CHF')
|
||||||
|
)
|
||||||
|
recurring = forms.BooleanField(required=False,
|
||||||
|
label=_("Recurring monthly"), )
|
||||||
|
description = forms.CharField(
|
||||||
|
widget=forms.Textarea(attrs={'style': "height: 60px;"}),
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = GenericProduct
|
||||||
|
fields = ['product_name', 'amount', 'recurring', 'description']
|
||||||
|
|
||||||
|
def clean_amount(self):
|
||||||
|
amount = self.cleaned_data.get('amount')
|
||||||
|
if (float(self.cleaned_data.get('product_name').get_actual_price()) !=
|
||||||
|
amount):
|
||||||
|
raise forms.ValidationError(_("Amount field does not match"))
|
||||||
|
return amount
|
||||||
|
|
||||||
|
def clean_recurring(self):
|
||||||
|
recurring = self.cleaned_data.get('recurring')
|
||||||
|
if (self.cleaned_data.get('product_name').product_is_subscription !=
|
||||||
|
(True if recurring else False)):
|
||||||
|
raise forms.ValidationError(_("Recurring field does not match"))
|
||||||
|
return recurring
|
||||||
|
|
||||||
|
|
||||||
|
class ProductPaymentForm(GenericPaymentForm):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
product_id = kwargs.pop('product_id', None)
|
||||||
|
if product_id is not None:
|
||||||
|
self.product = GenericProduct.objects.get(id=product_id)
|
||||||
|
super(ProductPaymentForm, self).__init__(*args, **kwargs)
|
||||||
|
self.fields['product_name'] = forms.CharField(
|
||||||
|
widget=forms.TextInput(
|
||||||
|
attrs={'placeholder': _('Product name'),
|
||||||
|
'readonly': 'readonly'}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if self.product.product_is_subscription:
|
||||||
|
payment_type = "month"
|
||||||
|
if self.product.product_subscription_interval == "month":
|
||||||
|
payment_type = _('Monthly subscription')
|
||||||
|
elif self.product.product_subscription_interval == "year":
|
||||||
|
payment_type = _('Yearly subscription')
|
||||||
|
self.fields['amount'].label = "{amt} ({payment_type})".format(
|
||||||
|
amt=_('Amount in CHF'),
|
||||||
|
payment_type=payment_type
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
self.fields['amount'].label = "{amt} ({payment_type})".format(
|
||||||
|
amt=_('Amount in CHF'),
|
||||||
|
payment_type=_('One time payment')
|
||||||
|
)
|
||||||
|
self.fields['recurring'].widget = forms.HiddenInput()
|
||||||
|
self.fields['product_name'].widget.attrs['class'] = 'input-no-border'
|
||||||
|
self.fields['amount'].widget.attrs['class'] = 'input-no-border'
|
||||||
|
self.fields['description'].widget.attrs['class'] = 'input-no-border'
|
||||||
|
|
||||||
|
def clean_amount(self):
|
||||||
|
amount = self.cleaned_data.get('amount')
|
||||||
|
if (self.product is None or
|
||||||
|
float(self.product.get_actual_price()) != amount):
|
||||||
|
raise forms.ValidationError(_("Amount field does not match"))
|
||||||
|
return amount
|
||||||
|
|
||||||
|
def clean_recurring(self):
|
||||||
|
recurring = self.cleaned_data.get('recurring')
|
||||||
|
if (self.product.product_is_subscription !=
|
||||||
|
(True if recurring else False)):
|
||||||
|
raise forms.ValidationError(_("Recurring field does not match"))
|
||||||
|
return recurring
|
||||||
|
|
||||||
|
|
||||||
|
class HostingUserSignupForm(forms.ModelForm):
|
||||||
|
confirm_password = forms.CharField(label=_("Confirm Password"),
|
||||||
|
widget=forms.PasswordInput())
|
||||||
|
password = forms.CharField(label=_("Password"),
|
||||||
|
widget=forms.PasswordInput())
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = CustomUser
|
||||||
|
fields = ['name', 'email', 'password']
|
||||||
|
widgets = {
|
||||||
|
'name': forms.TextInput(
|
||||||
|
attrs={'placeholder': _('Enter your name or company name')}),
|
||||||
|
}
|
||||||
|
|
||||||
|
def clean_confirm_password(self):
|
||||||
|
password = self.cleaned_data.get('password')
|
||||||
|
confirm_password = self.cleaned_data.get('confirm_password')
|
||||||
|
if not confirm_password == password:
|
||||||
|
raise forms.ValidationError("Passwords don't match")
|
||||||
|
return confirm_password
|
||||||
|
|
||||||
|
|
||||||
|
class UserHostingKeyForm(forms.ModelForm):
|
||||||
|
private_key = forms.CharField(widget=forms.HiddenInput(), required=False)
|
||||||
|
public_key = forms.CharField(widget=forms.Textarea(
|
||||||
|
attrs={'class': 'form_public_key',
|
||||||
|
'placeholder': _('Paste here your public key')}),
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
|
user = forms.models.ModelChoiceField(queryset=CustomUser.objects.all(),
|
||||||
|
required=False,
|
||||||
|
widget=forms.HiddenInput())
|
||||||
|
name = forms.CharField(required=False, widget=forms.TextInput(
|
||||||
|
attrs={'class': 'form_key_name',
|
||||||
|
'placeholder': _('Give a name to your key')}))
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.request = kwargs.pop("request")
|
||||||
|
super(UserHostingKeyForm, self).__init__(*args, **kwargs)
|
||||||
|
self.fields['name'].label = _('Key name')
|
||||||
|
|
||||||
|
def clean_public_key(self):
|
||||||
|
"""
|
||||||
|
Validates a public ssh key using `ssh-keygen -lf key.pub`
|
||||||
|
Also checks if a given key already exists in the database and
|
||||||
|
alerts the user of it.
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
if ('generate' in self.request.POST
|
||||||
|
or not self.fields['public_key'].required):
|
||||||
|
return self.data.get('public_key')
|
||||||
|
KEY_ERROR_MESSAGE = _("Please input a proper SSH key")
|
||||||
|
openssh_pubkey_str = self.data.get('public_key').strip()
|
||||||
|
|
||||||
|
with tempfile.NamedTemporaryFile(delete=True) as tmp_public_key_file:
|
||||||
|
tmp_public_key_file.write(openssh_pubkey_str.encode('utf-8'))
|
||||||
|
tmp_public_key_file.flush()
|
||||||
|
try:
|
||||||
|
subprocess.check_output(
|
||||||
|
['ssh-keygen', '-lf', tmp_public_key_file.name])
|
||||||
|
except subprocess.CalledProcessError as cpe:
|
||||||
|
logger.debug(
|
||||||
|
"Not a correct ssh format {error}".format(error=str(cpe)))
|
||||||
|
raise forms.ValidationError(KEY_ERROR_MESSAGE)
|
||||||
|
return xml.sax.saxutils.escape(openssh_pubkey_str)
|
||||||
|
|
||||||
|
def clean_name(self):
|
||||||
|
INVALID_NAME_MESSAGE = _("Comma not accepted in the name of the key")
|
||||||
|
if "," in self.data.get('name'):
|
||||||
|
logger.debug(INVALID_NAME_MESSAGE)
|
||||||
|
raise forms.ValidationError(INVALID_NAME_MESSAGE)
|
||||||
|
return self.data.get('name')
|
||||||
|
|
||||||
|
def clean_user(self):
|
||||||
|
return self.request.user if self.request.user.is_authenticated else None
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
cleaned_data = self.cleaned_data
|
||||||
|
if 'generate' in self.request.POST:
|
||||||
|
self.cleaned_data['name'] = generate_ssh_key_name()
|
||||||
|
private_key, public_key = UserHostingKey.generate_keys()
|
||||||
|
cleaned_data.update({
|
||||||
|
'private_key': private_key,
|
||||||
|
'public_key': public_key
|
||||||
|
})
|
||||||
|
|
||||||
|
return cleaned_data
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = UserHostingKey
|
||||||
|
fields = ['user', 'name', 'public_key']
|
||||||
|
|
31
hosting/mailer.py
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# import six
|
||||||
|
from django.core.mail import send_mail
|
||||||
|
from django.core.mail import EmailMultiAlternatives
|
||||||
|
from django.template.loader import render_to_string
|
||||||
|
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
|
||||||
|
class BaseEmail(object):
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.to = kwargs.get('to')
|
||||||
|
self.template_name = kwargs.get('template_name')
|
||||||
|
self.template_path = kwargs.get('template_path')
|
||||||
|
self.subject = kwargs.get('subject')
|
||||||
|
self.context = kwargs.get('context', {})
|
||||||
|
self.template_full_path = '%s%s' % (self.template_path, self.template_name)
|
||||||
|
text_content = render_to_string('%s.txt' % self.template_full_path, self.context)
|
||||||
|
html_content = render_to_string('%s.html' % self.template_full_path, self.context)
|
||||||
|
|
||||||
|
self.email = EmailMultiAlternatives(self.subject, text_content)
|
||||||
|
self.email.attach_alternative(html_content, "text/html")
|
||||||
|
if 'from_address' in kwargs:
|
||||||
|
self.email.from_email = kwargs.get('from_address')
|
||||||
|
else:
|
||||||
|
self.email.from_email = '(ungleich) ungleich Support <info@ungleich.ch>'
|
||||||
|
self.email.to = [kwargs.get('to', 'info@ungleich.ch')]
|
||||||
|
|
||||||
|
def send(self):
|
||||||
|
self.email.send()
|
148
hosting/migrations/0001_initial.py
Normal file
0
hosting/migrations/__init__.py
Normal file
181
hosting/mixins.py
Normal file
|
@ -0,0 +1,181 @@
|
||||||
|
from django.contrib.auth import authenticate, login
|
||||||
|
from django.contrib.auth.forms import SetPasswordForm
|
||||||
|
from django.contrib.auth.tokens import default_token_generator
|
||||||
|
from django.http import HttpResponseRedirect
|
||||||
|
from django.shortcuts import render
|
||||||
|
from django.utils.encoding import force_bytes
|
||||||
|
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
from django.urls import reverse_lazy
|
||||||
|
from django.views.decorators.cache import cache_control
|
||||||
|
from django.views.generic import FormView, CreateView
|
||||||
|
from django.conf import settings
|
||||||
|
from django.contrib import messages
|
||||||
|
from guardian.shortcuts import assign_perm
|
||||||
|
|
||||||
|
from .mailer import BaseEmail
|
||||||
|
from hosting.models import CustomUser
|
||||||
|
|
||||||
|
# Create your views here.
|
||||||
|
|
||||||
|
|
||||||
|
class SignupViewMixin(CreateView):
|
||||||
|
model = CustomUser
|
||||||
|
success_url = None
|
||||||
|
|
||||||
|
def get_success_url(self):
|
||||||
|
next_url = self.request.POST.get('next') if self.request.POST.get(
|
||||||
|
'next') \
|
||||||
|
else self.success_url
|
||||||
|
|
||||||
|
return next_url
|
||||||
|
|
||||||
|
def form_valid(self, form):
|
||||||
|
name = form.cleaned_data.get('name')
|
||||||
|
email = form.cleaned_data.get('email')
|
||||||
|
password = form.cleaned_data.get('password')
|
||||||
|
|
||||||
|
CustomUser.register(name, password, email)
|
||||||
|
auth_user = authenticate(email=email, password=password)
|
||||||
|
login(self.request, auth_user)
|
||||||
|
|
||||||
|
return HttpResponseRedirect(self.get_success_url())
|
||||||
|
|
||||||
|
|
||||||
|
class LoginViewMixin(FormView):
|
||||||
|
success_url = None
|
||||||
|
|
||||||
|
def get_success_url(self):
|
||||||
|
next_url = self.request.POST.get('next', self.success_url)
|
||||||
|
if not next_url:
|
||||||
|
return self.success_url
|
||||||
|
return next_url
|
||||||
|
|
||||||
|
def form_valid(self, form):
|
||||||
|
email = form.cleaned_data.get('email')
|
||||||
|
password = form.cleaned_data.get('password')
|
||||||
|
auth_user = authenticate(email=email, password=password)
|
||||||
|
|
||||||
|
if auth_user:
|
||||||
|
login(self.request, auth_user)
|
||||||
|
return HttpResponseRedirect(self.get_success_url())
|
||||||
|
|
||||||
|
return HttpResponseRedirect(self.get_success_url())
|
||||||
|
|
||||||
|
# @cache_control(no_cache=True, must_revalidate=True, no_store=True)
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
if self.request.user.is_authenticated:
|
||||||
|
return HttpResponseRedirect(self.get_success_url())
|
||||||
|
|
||||||
|
return super(LoginViewMixin, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class ResendActivationLinkViewMixin(FormView):
|
||||||
|
success_message = _(
|
||||||
|
"An email with the activation link has been sent to you")
|
||||||
|
|
||||||
|
def generate_email_context(self, user):
|
||||||
|
context = {
|
||||||
|
'base_url': "{0}://{1}".format(self.request.scheme,
|
||||||
|
self.request.get_host()),
|
||||||
|
'activation_link': reverse_lazy(
|
||||||
|
'hosting:validate',
|
||||||
|
kwargs={'validate_slug': user.validation_slug}
|
||||||
|
),
|
||||||
|
'dcl_text': settings.DCL_TEXT,
|
||||||
|
}
|
||||||
|
return context
|
||||||
|
|
||||||
|
def form_valid(self, form):
|
||||||
|
email = form.cleaned_data.get('email')
|
||||||
|
user = CustomUser.objects.get(email=email)
|
||||||
|
messages.add_message(self.request, messages.SUCCESS,
|
||||||
|
self.success_message)
|
||||||
|
context = self.generate_email_context(user)
|
||||||
|
email_data = {
|
||||||
|
'subject': '{dcl_text} {account_activation}'.format(
|
||||||
|
dcl_text=settings.DCL_TEXT,
|
||||||
|
account_activation=_('Account Activation')
|
||||||
|
),
|
||||||
|
'to': email,
|
||||||
|
'context': context,
|
||||||
|
'template_name': self.email_template_name,
|
||||||
|
'template_path': self.email_template_path,
|
||||||
|
'from_address': settings.DCL_SUPPORT_FROM_ADDRESS
|
||||||
|
}
|
||||||
|
email = BaseEmail(**email_data)
|
||||||
|
email.send()
|
||||||
|
return HttpResponseRedirect(self.get_success_url())
|
||||||
|
|
||||||
|
|
||||||
|
class PasswordResetViewMixin(FormView):
|
||||||
|
success_message = _(
|
||||||
|
"The link to reset your password has been sent to your email")
|
||||||
|
site = ''
|
||||||
|
|
||||||
|
def test_generate_email_context(self, user):
|
||||||
|
context = {
|
||||||
|
'user': user,
|
||||||
|
'token': default_token_generator.make_token(user),
|
||||||
|
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
|
||||||
|
'site_name': 'ungleich' if self.site != 'dcl' else settings.DCL_TEXT,
|
||||||
|
'base_url': "{0}://{1}".format(self.request.scheme,
|
||||||
|
self.request.get_host())
|
||||||
|
}
|
||||||
|
return context
|
||||||
|
|
||||||
|
def form_valid(self, form):
|
||||||
|
email = form.cleaned_data.get('email')
|
||||||
|
user = CustomUser.objects.get(email=email)
|
||||||
|
messages.add_message(self.request, messages.SUCCESS,
|
||||||
|
self.success_message)
|
||||||
|
context = self.test_generate_email_context(user)
|
||||||
|
email_data = {
|
||||||
|
'subject': _('Password Reset'),
|
||||||
|
'to': email,
|
||||||
|
'context': context,
|
||||||
|
'template_name': 'password_reset_email',
|
||||||
|
'template_path': self.template_email_path
|
||||||
|
}
|
||||||
|
if self.site == 'dcl':
|
||||||
|
email_data['from_address'] = settings.DCL_SUPPORT_FROM_ADDRESS
|
||||||
|
email = BaseEmail(**email_data)
|
||||||
|
email.send()
|
||||||
|
|
||||||
|
return HttpResponseRedirect(self.get_success_url())
|
||||||
|
|
||||||
|
|
||||||
|
class PasswordResetConfirmViewMixin(FormView):
|
||||||
|
form_class = SetPasswordForm
|
||||||
|
|
||||||
|
def post(self, request, uidb64=None, token=None, *arg, **kwargs):
|
||||||
|
try:
|
||||||
|
uid = urlsafe_base64_decode(uidb64)
|
||||||
|
user = CustomUser.objects.get(pk=uid)
|
||||||
|
except (TypeError, ValueError, OverflowError, CustomUser.DoesNotExist):
|
||||||
|
user = None
|
||||||
|
|
||||||
|
form = self.form_class(request.POST)
|
||||||
|
|
||||||
|
if user is not None and default_token_generator.check_token(user,
|
||||||
|
token):
|
||||||
|
if form.is_valid():
|
||||||
|
new_password = form.cleaned_data['new_password2']
|
||||||
|
user.set_password(new_password)
|
||||||
|
user.save()
|
||||||
|
messages.success(request, _('Password has been reset.'))
|
||||||
|
return self.form_valid(form)
|
||||||
|
else:
|
||||||
|
messages.error(request,
|
||||||
|
_('Password reset has not been successful.'))
|
||||||
|
form.add_error(None,
|
||||||
|
_('Password reset has not been successful.'))
|
||||||
|
return self.form_invalid(form)
|
||||||
|
|
||||||
|
else:
|
||||||
|
messages.error(request,
|
||||||
|
_('The reset password link is no longer valid.'))
|
||||||
|
form.add_error(None,
|
||||||
|
_('The reset password link is no longer valid.'))
|
||||||
|
return self.form_invalid(form)
|
||||||
|
|
612
hosting/models.py
Normal file
|
@ -0,0 +1,612 @@
|
||||||
|
import unicodedata
|
||||||
|
import logging
|
||||||
|
import random
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.db import models
|
||||||
|
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
|
||||||
|
from django.contrib.sites.models import Site
|
||||||
|
from django.core.exceptions import ValidationError
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
from django.conf import settings
|
||||||
|
from django.contrib.auth.hashers import make_password
|
||||||
|
from django.urls import reverse
|
||||||
|
from django.db import IntegrityError, models
|
||||||
|
from guardian.shortcuts import assign_perm
|
||||||
|
|
||||||
|
from .fields import CountryField
|
||||||
|
from .mailer import BaseEmail
|
||||||
|
from dynamicweb2.ldap_manager import LdapManager
|
||||||
|
from dynamicweb2.stripe_utils import StripeUtils
|
||||||
|
from django.utils.crypto import get_random_string
|
||||||
|
from Crypto.PublicKey import RSA
|
||||||
|
|
||||||
|
from django.utils.functional import cached_property
|
||||||
|
|
||||||
|
# Create your models here.
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def get_validation_slug():
|
||||||
|
return make_password(None)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_name(value):
|
||||||
|
valid_chars = [char for char in value if (char.isalpha() or char == "-" or char == " ")]
|
||||||
|
if len(valid_chars) < len(value):
|
||||||
|
raise ValidationError(
|
||||||
|
_('%(value)s is not a valid name. A valid name can only include letters, spaces or -'),
|
||||||
|
params={'value': value},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class MyUserManager(BaseUserManager):
|
||||||
|
def create_user(self, email, name, password=None):
|
||||||
|
"""
|
||||||
|
Creates and saves a User with the given email,name and password.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not email:
|
||||||
|
raise ValueError('Users must have an email address')
|
||||||
|
|
||||||
|
user = self.model(
|
||||||
|
email=self.normalize_email(email),
|
||||||
|
name=name,
|
||||||
|
validation_slug=make_password(None)
|
||||||
|
)
|
||||||
|
user.is_admin = False
|
||||||
|
user.set_password(password)
|
||||||
|
user.save(using=self._db)
|
||||||
|
user.create_ldap_account(password)
|
||||||
|
return user
|
||||||
|
|
||||||
|
def create_superuser(self, email, name, password):
|
||||||
|
"""
|
||||||
|
Creates and saves a superuser with the given email, name and password.
|
||||||
|
"""
|
||||||
|
user = self.create_user(email,
|
||||||
|
password=password,
|
||||||
|
name=name,
|
||||||
|
)
|
||||||
|
user.is_admin = True
|
||||||
|
user.is_active = True
|
||||||
|
user.is_superuser = True
|
||||||
|
user.save(using=self._db)
|
||||||
|
return user
|
||||||
|
|
||||||
|
|
||||||
|
class CustomUser(AbstractBaseUser, PermissionsMixin):
|
||||||
|
VALIDATED_CHOICES = ((0, 'Not validated'), (1, 'Validated'))
|
||||||
|
site = models.ForeignKey(Site, default=1, on_delete=models.CASCADE)
|
||||||
|
name = models.CharField(max_length=50, validators=[validate_name])
|
||||||
|
email = models.EmailField(unique=True)
|
||||||
|
username = models.CharField(max_length=60, unique=True, null=True)
|
||||||
|
validated = models.IntegerField(choices=VALIDATED_CHOICES, default=0)
|
||||||
|
in_ldap = models.BooleanField(default=False)
|
||||||
|
# By default, we initialize the validation_slug with appropriate value
|
||||||
|
# This is required for User(page) admin
|
||||||
|
validation_slug = models.CharField(
|
||||||
|
db_index=True, unique=True, max_length=50,
|
||||||
|
default=get_validation_slug
|
||||||
|
)
|
||||||
|
is_admin = models.BooleanField(
|
||||||
|
_('staff status'),
|
||||||
|
default=False,
|
||||||
|
help_text=_(
|
||||||
|
'Designates whether the user can log into this admin site.'),
|
||||||
|
)
|
||||||
|
import_stripe_bill_remark = models.TextField(
|
||||||
|
default="",
|
||||||
|
help_text="Indicates any issues while importing stripe bills"
|
||||||
|
)
|
||||||
|
|
||||||
|
objects = MyUserManager()
|
||||||
|
|
||||||
|
USERNAME_FIELD = "email"
|
||||||
|
REQUIRED_FIELDS = ['name', 'password']
|
||||||
|
|
||||||
|
# Define the groups field with a related_name to avoid clash
|
||||||
|
groups = models.ManyToManyField(
|
||||||
|
'auth.Group',
|
||||||
|
related_name='custom_user_set', # Define a unique related_name
|
||||||
|
blank=True,
|
||||||
|
verbose_name='groups',
|
||||||
|
help_text='The groups this user belongs to.',
|
||||||
|
)
|
||||||
|
|
||||||
|
# Define the user_permissions field with a related_name to avoid clash
|
||||||
|
user_permissions = models.ManyToManyField(
|
||||||
|
'auth.Permission',
|
||||||
|
related_name='custom_user_permission_set', # Define a unique related_name
|
||||||
|
blank=True,
|
||||||
|
verbose_name='user permissions',
|
||||||
|
help_text='Specific permissions for this user.',
|
||||||
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def register(cls, name, password, email, app='digital_glarus',
|
||||||
|
base_url=None, send_email=True, account_details=None):
|
||||||
|
user = cls.objects.filter(email=email).first()
|
||||||
|
if not user:
|
||||||
|
user = cls.objects.create_user(name=name, email=email,
|
||||||
|
password=password)
|
||||||
|
if user:
|
||||||
|
if app == 'dcl':
|
||||||
|
dcl_text = settings.DCL_TEXT
|
||||||
|
user.is_active = False
|
||||||
|
if send_email is True:
|
||||||
|
email_data = {
|
||||||
|
'subject': '{dcl_text} {account_activation}'.format(
|
||||||
|
dcl_text=dcl_text,
|
||||||
|
account_activation=_('Account Activation')
|
||||||
|
),
|
||||||
|
'from_address': settings.DCL_SUPPORT_FROM_ADDRESS,
|
||||||
|
'to': user.email,
|
||||||
|
'context': {'base_url': base_url,
|
||||||
|
'activation_link': reverse(
|
||||||
|
'hosting:validate',
|
||||||
|
kwargs={
|
||||||
|
'validate_slug': user.validation_slug}),
|
||||||
|
'dcl_text': dcl_text
|
||||||
|
},
|
||||||
|
'template_name': 'user_activation',
|
||||||
|
'template_path': 'datacenterlight/emails/'
|
||||||
|
}
|
||||||
|
if account_details:
|
||||||
|
email_data['context'][
|
||||||
|
'account_details'] = account_details
|
||||||
|
email = BaseEmail(**email_data)
|
||||||
|
email.send()
|
||||||
|
return user
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_all_members(cls):
|
||||||
|
return cls.objects.filter(
|
||||||
|
stripecustomer__membershiporder__isnull=False)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def validate_url(cls, validation_slug):
|
||||||
|
user = cls.objects.filter(validation_slug=validation_slug).first()
|
||||||
|
if user:
|
||||||
|
user.validated = 1
|
||||||
|
user.save()
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_random_password(cls):
|
||||||
|
return get_random_string(24)
|
||||||
|
|
||||||
|
def is_superuser(self):
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_full_name(self):
|
||||||
|
# The user is identified by their email address
|
||||||
|
return self.email
|
||||||
|
|
||||||
|
def get_short_name(self):
|
||||||
|
# The user is identified by their email address
|
||||||
|
return self.email
|
||||||
|
|
||||||
|
def get_first_and_last_name(self, full_name):
|
||||||
|
first_name, *last_name = full_name.split(" ")
|
||||||
|
last_name = " ".join(last_name)
|
||||||
|
return first_name, last_name
|
||||||
|
|
||||||
|
def assign_username(self, user):
|
||||||
|
if not user.username:
|
||||||
|
ldap_manager = LdapManager()
|
||||||
|
|
||||||
|
# Try to come up with a username
|
||||||
|
first_name, last_name = self.get_first_and_last_name(user.name)
|
||||||
|
user.username = unicodedata.normalize('NFKD', first_name + last_name)
|
||||||
|
user.username = "".join([char for char in user.username if char.isalnum()]).lower()
|
||||||
|
exist = True
|
||||||
|
while exist:
|
||||||
|
# Check if it exists
|
||||||
|
exist, entries = ldap_manager.check_user_exists(user.username)
|
||||||
|
if exist:
|
||||||
|
# If username exists in ldap, come up with a new user name and check it again
|
||||||
|
user.username = user.username + str(random.randint(0, 2 ** 10))
|
||||||
|
else:
|
||||||
|
# If username does not exists in ldap, try to save it in database
|
||||||
|
try:
|
||||||
|
user.save()
|
||||||
|
except IntegrityError:
|
||||||
|
# If username exists in database then come up with a new username
|
||||||
|
user.username = user.username + str(random.randint(0, 2 ** 10))
|
||||||
|
exist = True
|
||||||
|
|
||||||
|
def create_ldap_account(self, password):
|
||||||
|
# create ldap account for user if it does not exists already.
|
||||||
|
if self.in_ldap:
|
||||||
|
return
|
||||||
|
self.assign_username(self)
|
||||||
|
ldap_manager = LdapManager()
|
||||||
|
try:
|
||||||
|
user_exists_in_ldap, entries = ldap_manager.check_user_exists(self.username)
|
||||||
|
except Exception:
|
||||||
|
logger.exception("Exception occur while searching for user in LDAP")
|
||||||
|
else:
|
||||||
|
if not user_exists_in_ldap:
|
||||||
|
# IF no ldap account
|
||||||
|
first_name, last_name = self.get_first_and_last_name(self.name)
|
||||||
|
if not last_name:
|
||||||
|
last_name = first_name
|
||||||
|
ldap_manager.create_user(self.username, password=password,
|
||||||
|
firstname=first_name, lastname=last_name,
|
||||||
|
email=self.email)
|
||||||
|
else:
|
||||||
|
# User exists already in LDAP, but with a dummy credential
|
||||||
|
# We are here implies that the user has successfully
|
||||||
|
# authenticated against Django db, and a corresponding user
|
||||||
|
# exists in LDAP.
|
||||||
|
# We just update the LDAP credentials once again, assuming it
|
||||||
|
# was set to a dummy value while migrating users from Django to
|
||||||
|
# LDAP
|
||||||
|
ldap_manager.change_password(self.username, password)
|
||||||
|
self.in_ldap = True
|
||||||
|
self.save()
|
||||||
|
|
||||||
|
def __str__(self): # __unicode__ on Python 2
|
||||||
|
return self.email
|
||||||
|
|
||||||
|
# def has_perm(self, perm, obj=None):
|
||||||
|
# "Does the user have a specific permission?"
|
||||||
|
# # Simplest possible answer: Yes, always
|
||||||
|
# return self.is_admin
|
||||||
|
|
||||||
|
def has_module_perms(self, app_label):
|
||||||
|
"Does the user have permissions to view the app `app_label`?"
|
||||||
|
# Simplest possible answer: Yes, always
|
||||||
|
return self.is_admin
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_staff(self):
|
||||||
|
"Is the user a member of staff?"
|
||||||
|
# Simplest possible answer: All admins are staff
|
||||||
|
return self.is_admin
|
||||||
|
|
||||||
|
@is_staff.setter
|
||||||
|
def is_staff(self, value):
|
||||||
|
self._is_staff = value
|
||||||
|
|
||||||
|
|
||||||
|
class StripeCustomer(models.Model):
|
||||||
|
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
|
||||||
|
stripe_id = models.CharField(unique=True, max_length=100)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "%s - %s" % (self.stripe_id, self.user.email)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def create_stripe_api_customer(cls, email=None, id_payment_method=None,
|
||||||
|
customer_name=None):
|
||||||
|
"""
|
||||||
|
This method creates a Stripe API customer with the given
|
||||||
|
email, token and customer_name. This is different from
|
||||||
|
get_or_create method below in that it does not create a
|
||||||
|
CustomUser and associate the customer created in stripe
|
||||||
|
with it, while get_or_create does that before creating the
|
||||||
|
stripe user.
|
||||||
|
"""
|
||||||
|
stripe_utils = StripeUtils()
|
||||||
|
stripe_data = stripe_utils.create_customer(
|
||||||
|
id_payment_method, email, customer_name)
|
||||||
|
if stripe_data.get('response_object'):
|
||||||
|
stripe_cus_id = stripe_data.get('response_object').get('id')
|
||||||
|
return stripe_cus_id
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_or_create(cls, email=None, token=None, id_payment_method=None):
|
||||||
|
"""
|
||||||
|
Check if there is a registered stripe customer with that email
|
||||||
|
or create a new one
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
stripe_utils = StripeUtils()
|
||||||
|
stripe_customer = cls.objects.get(user__email=email)
|
||||||
|
# check if user is not in stripe but in database
|
||||||
|
customer = stripe_utils.check_customer(stripe_customer.stripe_id,
|
||||||
|
stripe_customer.user, token)
|
||||||
|
if "deleted" in customer and customer["deleted"]:
|
||||||
|
raise StripeCustomer.DoesNotExist()
|
||||||
|
return stripe_customer
|
||||||
|
except StripeCustomer.DoesNotExist:
|
||||||
|
user = CustomUser.objects.get(email=email)
|
||||||
|
stripe_utils = StripeUtils()
|
||||||
|
stripe_data = stripe_utils.create_customer(token, email, user.name)
|
||||||
|
if stripe_data.get('response_object'):
|
||||||
|
stripe_cus_id = stripe_data.get('response_object').get('id')
|
||||||
|
if hasattr(user, 'stripecustomer'):
|
||||||
|
# User already had a Stripe account and we are here
|
||||||
|
# because the account was deleted in dashboard
|
||||||
|
# So, we simply update the stripe_id
|
||||||
|
user.stripecustomer.stripe_id = stripe_cus_id
|
||||||
|
user.stripecustomer.save()
|
||||||
|
stripe_customer = user.stripecustomer
|
||||||
|
else:
|
||||||
|
# The user never had an associated Stripe account
|
||||||
|
# So, create one
|
||||||
|
stripe_customer = StripeCustomer.objects.create(
|
||||||
|
user=user, stripe_id=stripe_cus_id
|
||||||
|
)
|
||||||
|
return stripe_customer
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
class BaseBillingAddress(models.Model):
|
||||||
|
cardholder_name = models.CharField(max_length=100, default="")
|
||||||
|
street_address = models.CharField(max_length=100)
|
||||||
|
city = models.CharField(max_length=50)
|
||||||
|
postal_code = models.CharField(max_length=50)
|
||||||
|
country = CountryField()
|
||||||
|
vat_number = models.CharField(max_length=100, default="", blank=True)
|
||||||
|
stripe_tax_id = models.CharField(max_length=100, default="", blank=True)
|
||||||
|
vat_number_validated_on = models.DateTimeField(blank=True, null=True)
|
||||||
|
vat_validation_status = models.CharField(max_length=25, default="",
|
||||||
|
blank=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
abstract = True
|
||||||
|
|
||||||
|
|
||||||
|
class BillingAddress(BaseBillingAddress):
|
||||||
|
def __str__(self):
|
||||||
|
if self.vat_number:
|
||||||
|
return "%s, %s, %s, %s, %s, %s %s %s %s" % (
|
||||||
|
self.cardholder_name, self.street_address, self.city,
|
||||||
|
self.postal_code, self.country, self.vat_number,
|
||||||
|
self.stripe_tax_id, self.vat_number_validated_on,
|
||||||
|
self.vat_validation_status
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
return "%s, %s, %s, %s, %s" % (
|
||||||
|
self.cardholder_name, self.street_address, self.city,
|
||||||
|
self.postal_code, self.country
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class UserBillingAddress(BaseBillingAddress):
|
||||||
|
user = models.ForeignKey(CustomUser, related_name='billing_addresses', on_delete=models.CASCADE)
|
||||||
|
current = models.BooleanField(default=True)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
if self.vat_number:
|
||||||
|
return "%s, %s, %s, %s, %s, %s %s %s %s" % (
|
||||||
|
self.cardholder_name, self.street_address, self.city,
|
||||||
|
self.postal_code, self.country, self.vat_number,
|
||||||
|
self.stripe_tax_id, self.vat_number_validated_on,
|
||||||
|
self.vat_validation_status
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
return "%s, %s, %s, %s, %s" % (
|
||||||
|
self.cardholder_name, self.street_address, self.city,
|
||||||
|
self.postal_code, self.country
|
||||||
|
)
|
||||||
|
|
||||||
|
def to_dict(self):
|
||||||
|
return {
|
||||||
|
'Cardholder Name': self.cardholder_name,
|
||||||
|
'Street Address': self.street_address,
|
||||||
|
'City': self.city,
|
||||||
|
'Postal Code': self.postal_code,
|
||||||
|
'Country': self.country,
|
||||||
|
'VAT Number': self.vat_number
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class AssignPermissionsMixin(object):
|
||||||
|
permissions = tuple()
|
||||||
|
user = None
|
||||||
|
obj = None
|
||||||
|
kwargs = dict()
|
||||||
|
|
||||||
|
def assign_permissions(self, user):
|
||||||
|
for permission in self.permissions:
|
||||||
|
assign_perm(permission, user, self)
|
||||||
|
|
||||||
|
|
||||||
|
class OrderDetail(AssignPermissionsMixin, models.Model):
|
||||||
|
# vm_template = models.ForeignKey(
|
||||||
|
# VMTemplate, blank=True, null=True, default=None,
|
||||||
|
# on_delete=models.SET_NULL
|
||||||
|
# )
|
||||||
|
cores = models.IntegerField(default=0)
|
||||||
|
memory = models.IntegerField(default=0)
|
||||||
|
hdd_size = models.IntegerField(default=0)
|
||||||
|
ssd_size = models.IntegerField(default=0)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "Not available" if self.vm_template is None else (
|
||||||
|
"%s - %s, %s cores, %s GB RAM, %s GB SSD" % (
|
||||||
|
self.vm_template.name, self.vm_template.vm_type, self.cores,
|
||||||
|
self.memory, self.ssd_size
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class GenericProduct(AssignPermissionsMixin, models.Model):
|
||||||
|
permissions = ('view_genericproduct',)
|
||||||
|
product_name = models.CharField(max_length=128, default="")
|
||||||
|
product_slug = models.SlugField(
|
||||||
|
unique=True,
|
||||||
|
help_text=(
|
||||||
|
'An mandatory unique slug for the product'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
product_description = models.CharField(max_length=500, default="")
|
||||||
|
created_at = models.DateTimeField(auto_now_add=True)
|
||||||
|
product_price = models.DecimalField(max_digits=6, decimal_places=2)
|
||||||
|
product_vat = models.DecimalField(max_digits=6, decimal_places=4, default=0)
|
||||||
|
product_is_subscription = models.BooleanField(default=True)
|
||||||
|
product_subscription_interval = models.CharField(
|
||||||
|
max_length=10, default="month",
|
||||||
|
help_text="Choose between `year` and `month`")
|
||||||
|
exclude_vat_calculations = models.BooleanField(
|
||||||
|
default=False,
|
||||||
|
help_text="When checked VAT calculations are excluded for this product"
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.product_name
|
||||||
|
|
||||||
|
def get_actual_price(self, vat_rate=None):
|
||||||
|
if self.exclude_vat_calculations:
|
||||||
|
return round(float(self.product_price), 2)
|
||||||
|
else:
|
||||||
|
VAT = vat_rate if vat_rate is not None else self.product_vat
|
||||||
|
return round(
|
||||||
|
float(self.product_price) + float(self.product_price) * float(VAT), 2
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class HostingOrder(AssignPermissionsMixin, models.Model):
|
||||||
|
ORDER_APPROVED_STATUS = 'Approved'
|
||||||
|
ORDER_DECLINED_STATUS = 'Declined'
|
||||||
|
|
||||||
|
vm_id = models.IntegerField(default=0)
|
||||||
|
customer = models.ForeignKey(StripeCustomer, on_delete=models.CASCADE)
|
||||||
|
billing_address = models.ForeignKey(BillingAddress, on_delete=models.CASCADE)
|
||||||
|
created_at = models.DateTimeField(auto_now_add=True)
|
||||||
|
approved = models.BooleanField(default=False)
|
||||||
|
last4 = models.CharField(max_length=4)
|
||||||
|
cc_brand = models.CharField(max_length=128)
|
||||||
|
stripe_charge_id = models.CharField(max_length=100, null=True)
|
||||||
|
price = models.FloatField()
|
||||||
|
subscription_id = models.CharField(max_length=100, null=True)
|
||||||
|
# vm_pricing = models.ForeignKey(VMPricing)
|
||||||
|
order_detail = models.ForeignKey(
|
||||||
|
OrderDetail, null=True, blank=True, default=None,
|
||||||
|
on_delete=models.SET_NULL
|
||||||
|
)
|
||||||
|
generic_product = models.ForeignKey(
|
||||||
|
GenericProduct, null=True, blank=True, default=None,
|
||||||
|
on_delete=models.SET_NULL
|
||||||
|
)
|
||||||
|
generic_payment_description = models.CharField(
|
||||||
|
max_length=500, null=True
|
||||||
|
)
|
||||||
|
permissions = ('u_view_hostingorder',)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
permissions = (
|
||||||
|
('u_view_hostingorder', 'View Hosting Order'),
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
hosting_order_str = ("Order Nr: #{} - VM_ID: {} - {} - {} - "
|
||||||
|
"Specs: {} - Price: {}").format(
|
||||||
|
self.id, self.vm_id, self.customer.user.email, self.created_at,
|
||||||
|
self.order_detail, self.price
|
||||||
|
)
|
||||||
|
if self.generic_product_id is not None:
|
||||||
|
hosting_order_str += " - Generic Payment"
|
||||||
|
if self.stripe_charge_id is not None:
|
||||||
|
hosting_order_str += " - One time charge"
|
||||||
|
else:
|
||||||
|
hosting_order_str += " - Recurring"
|
||||||
|
return hosting_order_str
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def status(self):
|
||||||
|
return self.ORDER_APPROVED_STATUS if self.approved else self.ORDER_DECLINED_STATUS
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def create(cls, price=None, vm_id=0, customer=None,
|
||||||
|
billing_address=None, vm_pricing=None):
|
||||||
|
instance = cls.objects.create(
|
||||||
|
price=price,
|
||||||
|
vm_id=vm_id,
|
||||||
|
customer=customer,
|
||||||
|
billing_address=billing_address,
|
||||||
|
vm_pricing=vm_pricing
|
||||||
|
)
|
||||||
|
instance.assign_permissions(customer.user)
|
||||||
|
return instance
|
||||||
|
|
||||||
|
def set_approved(self):
|
||||||
|
self.approved = True
|
||||||
|
self.save()
|
||||||
|
|
||||||
|
def set_stripe_charge(self, stripe_charge):
|
||||||
|
self.stripe_charge_id = stripe_charge.id
|
||||||
|
if stripe_charge.source is None:
|
||||||
|
self.last4 = stripe_charge.payment_method_details.card.last4
|
||||||
|
self.cc_brand = stripe_charge.payment_method_details.card.brand
|
||||||
|
else:
|
||||||
|
self.last4 = stripe_charge.source.last4
|
||||||
|
self.cc_brand = stripe_charge.source.brand
|
||||||
|
self.save()
|
||||||
|
|
||||||
|
def set_subscription_id(self, subscription_id, cc_details):
|
||||||
|
"""
|
||||||
|
When creating a Stripe subscription, we have subscription id.
|
||||||
|
We store this in the subscription_id field.
|
||||||
|
This method sets the subscription id
|
||||||
|
and the last4 and credit card brands used for this order.
|
||||||
|
|
||||||
|
:param subscription_id: Stripe's subscription id
|
||||||
|
:param cc_details: A dict containing card details
|
||||||
|
{last4, brand}
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
self.subscription_id = subscription_id
|
||||||
|
self.last4 = cc_details.get('last4')
|
||||||
|
self.cc_brand = cc_details.get('brand')
|
||||||
|
self.save()
|
||||||
|
|
||||||
|
def get_cc_data(self):
|
||||||
|
return {
|
||||||
|
'last4': self.last4,
|
||||||
|
'cc_brand': self.cc_brand,
|
||||||
|
} if self.last4 and self.cc_brand else None
|
||||||
|
|
||||||
|
|
||||||
|
class UserHostingKey(models.Model):
|
||||||
|
user = models.ForeignKey(CustomUser, blank=True, null=True, on_delete=models.CASCADE)
|
||||||
|
public_key = models.TextField()
|
||||||
|
private_key = models.FileField(upload_to='private_keys', blank=True)
|
||||||
|
created_at = models.DateTimeField(auto_now_add=True)
|
||||||
|
name = models.CharField(max_length=100)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def generate_RSA(bits=2048):
|
||||||
|
'''
|
||||||
|
Generate an RSA keypair with an exponent of 65537 in PEM format
|
||||||
|
param: bits The key length in bits
|
||||||
|
Return private key and public key
|
||||||
|
'''
|
||||||
|
new_key = RSA.generate(2048, os.urandom)
|
||||||
|
public_key = new_key.publickey().exportKey("OpenSSH")
|
||||||
|
private_key = new_key.exportKey("PEM")
|
||||||
|
return private_key, public_key
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def generate_keys(cls):
|
||||||
|
private_key, public_key = cls.generate_RSA()
|
||||||
|
# self.public_key = public_key
|
||||||
|
# self.save(update_fields=['public_key'])
|
||||||
|
return private_key, public_key
|
||||||
|
|
||||||
|
def delete(self, *args, **kwargs):
|
||||||
|
if bool(self.private_key) and os.path.isfile(self.private_key.path):
|
||||||
|
logger.debug("Removing private key {}".format(self.private_key.path))
|
||||||
|
os.remove(self.private_key.path)
|
||||||
|
else:
|
||||||
|
logger.debug("No private_key to remove")
|
||||||
|
|
||||||
|
super(UserHostingKey, self).delete(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
def get_anonymous_user_instance(CustomUser):
|
||||||
|
return CustomUser(email='anonymous@ungleich.ch')
|
||||||
|
|
14
hosting/requirements.txt
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
asgiref==3.7.2
|
||||||
|
certifi==2023.11.17
|
||||||
|
charset-normalizer==3.3.2
|
||||||
|
Django==4.2.7
|
||||||
|
idna==3.4
|
||||||
|
ldap3==2.9.1
|
||||||
|
pyasn1==0.5.1
|
||||||
|
pycryptodome==3.19.0
|
||||||
|
python-dotenv==1.0.0
|
||||||
|
requests==2.31.0
|
||||||
|
sqlparse==0.4.4
|
||||||
|
stripe==7.5.0
|
||||||
|
typing_extensions==4.8.0
|
||||||
|
urllib3==2.1.0
|
BIN
hosting/static/favicon.ico
Executable file
After Width: | Height: | Size: 1.1 KiB |
BIN
hosting/static/hosting/card-django.png
Executable file
After Width: | Height: | Size: 143 KiB |
BIN
hosting/static/hosting/card-nodejs.png
Executable file
After Width: | Height: | Size: 142 KiB |
BIN
hosting/static/hosting/card-rails.png
Executable file
After Width: | Height: | Size: 142 KiB |
6
hosting/static/hosting/css/bootstrap-3.3.7.min.css
vendored
Executable file
442
hosting/static/hosting/css/commons.css
Executable file
|
@ -0,0 +1,442 @@
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.navbar-right {
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard-container {
|
||||||
|
padding-top: 80px;
|
||||||
|
padding-bottom: 70px;
|
||||||
|
width: 90%;
|
||||||
|
margin: 0 auto;
|
||||||
|
max-width: 768px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard-container.wide {
|
||||||
|
padding-top: 90px;
|
||||||
|
max-width: 980px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-dashboard{
|
||||||
|
min-height: calc(100vh - 60px);
|
||||||
|
width: 80%;
|
||||||
|
margin: 0 auto;
|
||||||
|
max-width: 1120px;
|
||||||
|
}
|
||||||
|
.container-table{
|
||||||
|
margin-top: 35px;
|
||||||
|
overflow-y: hidden;
|
||||||
|
}
|
||||||
|
.container-table table{
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
.borderless td {
|
||||||
|
border: none !important;
|
||||||
|
}
|
||||||
|
.borderless thead {
|
||||||
|
}
|
||||||
|
|
||||||
|
.borderless tbody:before {
|
||||||
|
content: "-";
|
||||||
|
display: block;
|
||||||
|
color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inline-headers h3, .inline-headers h4 {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.space-above {
|
||||||
|
margin-top: 4%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.space-above-big {
|
||||||
|
margin-top: 20%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table>tbody>tr>td{
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.fa-separate{
|
||||||
|
margin-right: 15px;
|
||||||
|
}
|
||||||
|
@media (max-width: 540px) {
|
||||||
|
select {
|
||||||
|
width: 280px;
|
||||||
|
}
|
||||||
|
.content-dashboard {
|
||||||
|
padding-left: 15px;
|
||||||
|
padding-right: 15px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.btn:focus, .btn:active:focus {
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********Styles for Model********************/
|
||||||
|
.modal-content {
|
||||||
|
border-radius: 0px;
|
||||||
|
font-family: Lato, "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||||
|
width: 100%;
|
||||||
|
float: left;
|
||||||
|
border-radius: 0;
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-header {
|
||||||
|
min-height: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-header .close {
|
||||||
|
font-size: 75px;
|
||||||
|
font-weight: 300;
|
||||||
|
margin-top: 0;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 11px;
|
||||||
|
z-index: 10;
|
||||||
|
line-height: 60px;
|
||||||
|
}
|
||||||
|
.modal-header .close span {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-header .close:focus {
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-header {
|
||||||
|
border-bottom: 0px solid #e5e5e5;
|
||||||
|
padding: 0px 15px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.modal-body {
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
float: left;
|
||||||
|
padding: 0px 30px 15px 30px;
|
||||||
|
}
|
||||||
|
.modal-body .modal-icon i {
|
||||||
|
font-size: 80px;
|
||||||
|
font-weight: 100;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
.modal-body .modal-icon {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
.modal-title {
|
||||||
|
margin: 0;
|
||||||
|
line-height: 1.42857143;
|
||||||
|
font-size: 25px;
|
||||||
|
padding: 0;
|
||||||
|
/*font-family: 'Lato', sans-serif;*/
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
.modal-text {
|
||||||
|
padding-top: 5px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
.modal-text p:not(:last-of-type){
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-title + .modal-footer {
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
.modal-footer {
|
||||||
|
border-top: 0px solid #e5e5e5;
|
||||||
|
width: 100%;
|
||||||
|
float: left;
|
||||||
|
text-align: center;
|
||||||
|
padding: 15px 15px;
|
||||||
|
}
|
||||||
|
@media (min-width: 1300px) {
|
||||||
|
.modal-dialog {/* top: 30%; */width: 40%;}
|
||||||
|
}
|
||||||
|
@media (max-width: 1299px) {
|
||||||
|
.modal-dialog {
|
||||||
|
/* top: 20%; */
|
||||||
|
width: 43%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (max-width: 900px) {
|
||||||
|
.modal-dialog {
|
||||||
|
/* top: 20%; */
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.modal-dialog {
|
||||||
|
/* top: 30%; */
|
||||||
|
width: 95%;
|
||||||
|
margin: 0 auto !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ========= */
|
||||||
|
@media(min-width: 320px) {
|
||||||
|
.modal:before {
|
||||||
|
content: '';
|
||||||
|
display: inline-block;
|
||||||
|
height: 100%;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin-right: -4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.modal-dialog {
|
||||||
|
/* width: 520px; */
|
||||||
|
margin: 15px auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-dialog {
|
||||||
|
display: inline-block;
|
||||||
|
text-align: left;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.un-icon {
|
||||||
|
width: 15px;
|
||||||
|
height: 15px;
|
||||||
|
opacity: 0.5;
|
||||||
|
margin-top: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.css-plus {
|
||||||
|
position: relative;
|
||||||
|
width: 16px;
|
||||||
|
height: 20px;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
/* top: -1px; */
|
||||||
|
}
|
||||||
|
|
||||||
|
.css-plus + span {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.css-plus:before {
|
||||||
|
content: '';
|
||||||
|
width: 10px;
|
||||||
|
height: 2px;
|
||||||
|
background: #f6f7f9;
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
-webkit-transform: translate(-50%,-50%);
|
||||||
|
-ms-transform: translate(-50%,-50%);
|
||||||
|
transform: translate(-50%,-50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.css-plus:after {
|
||||||
|
content: '';
|
||||||
|
width: 2px;
|
||||||
|
height: 10px;
|
||||||
|
background: #f6f7f9;
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
-webkit-transform: translate(-50%,-50%);
|
||||||
|
-ms-transform: translate(-50%,-50%);
|
||||||
|
transform: translate(-50%,-50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-container {
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-container h4 {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
color: #333;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-container .card-expiry-element,
|
||||||
|
.settings-container .card-cvc-element {
|
||||||
|
padding: 0 15px;
|
||||||
|
}
|
||||||
|
.settings-container .card-cvc-element .my-input,
|
||||||
|
.settings-container .card-cvc-element label {
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-container .stripe-payment-btn {
|
||||||
|
float: none;
|
||||||
|
position: static;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-container h3 {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-container hr {
|
||||||
|
margin-top: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-container .credit-card-details {
|
||||||
|
padding-bottom: 15px;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-container .credit-card-details h5 {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment-container .credit-card-info {
|
||||||
|
padding-bottom: 15px;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.credit-card-info {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.credit-card-info .align-bottom{
|
||||||
|
align-self: flex-end;
|
||||||
|
padding-right: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.another-card-text {
|
||||||
|
padding: 20px 0;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.credit-card-form {
|
||||||
|
max-width: 360px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.caps-link {
|
||||||
|
font-weight: 600;
|
||||||
|
color: #8da4c0;
|
||||||
|
fill: #8da4c0;
|
||||||
|
padding: 8px 0;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.caps-link:hover,
|
||||||
|
.caps-link:focus,
|
||||||
|
.caps-link:active {
|
||||||
|
color: #627388;
|
||||||
|
fill: #627388;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-container .new-card-head {
|
||||||
|
margin-top: 40px;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-container .new-card-head h4 {
|
||||||
|
font-size: 15px;
|
||||||
|
margin-top: 8px;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.caps-link .svg-img {
|
||||||
|
margin-right: 5px;
|
||||||
|
height: 13px;
|
||||||
|
position: relative;
|
||||||
|
top: 1px;
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-container .caps-link {
|
||||||
|
font-size: 13px;
|
||||||
|
letter-spacing: 1.1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-container .btn-vm-contact {
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-container .choice-btn {
|
||||||
|
letter-spacing: 2px;
|
||||||
|
min-width: 127px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-wide {
|
||||||
|
min-width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-cards {
|
||||||
|
text-align: center;
|
||||||
|
color: #999;
|
||||||
|
padding: 15px;
|
||||||
|
background: rgba(0,0,0,0.02);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 230px;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-cards h4 {
|
||||||
|
font-size: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-cards a {
|
||||||
|
color: #7ca3d0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-plain {
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
fill: #595959;
|
||||||
|
color: #595959;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
.btn-plain:hover,
|
||||||
|
.btn-plain:focus,
|
||||||
|
.btn-plain:active,
|
||||||
|
.btn-plain:active:focus {
|
||||||
|
outline: none;
|
||||||
|
color: #999;
|
||||||
|
fill: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-details-box {
|
||||||
|
border: 1px solid #eee;
|
||||||
|
padding: 5px 25px 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thick-hr {
|
||||||
|
border-top: 5px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.locale_date {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.locale_date.done{
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mb-0 {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thin-hr {
|
||||||
|
margin-top: 10px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.new-card-head {
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
.new-card-button-margin button{
|
||||||
|
margin-top: 5px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
84
hosting/static/hosting/css/dashboard.css
Executable file
|
@ -0,0 +1,84 @@
|
||||||
|
.hosting-dashboard:after {
|
||||||
|
content: '';
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
background-color: rgba(91, 116, 173, 0.7);
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
.hosting-dashboard:before {
|
||||||
|
content: '';
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
background: url(../../datacenterlight/img/pattern.jpg) no-repeat center center;
|
||||||
|
background-size: cover;
|
||||||
|
z-index: -2;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hosting-dashboard .dashboard-container-head {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hosting-dashboard-item {
|
||||||
|
background: #e9ebee;
|
||||||
|
box-shadow: 1px 3px 3px rgba(0,0,0,0.4);
|
||||||
|
padding: 25px;
|
||||||
|
color: rgba(124, 139, 175, 1);
|
||||||
|
font-size: 19px;
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
.hosting-dashboard-item:hover,
|
||||||
|
.hosting-dashboard-item:focus,
|
||||||
|
.hosting-dashboard-item:active {
|
||||||
|
text-decoration: none;
|
||||||
|
color: #7c8baf;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hosting-dashboard-item h2 {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 18px;
|
||||||
|
padding-bottom: 15px;
|
||||||
|
border-bottom: 2px solid #acb5cf;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hosting-dashboard-image {
|
||||||
|
height: 120px;
|
||||||
|
fill: #8b9bb7;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.hosting-dashboard-item:hover .hosting-dashboard-image,
|
||||||
|
.hosting-dashboard-item:focus .hosting-dashboard-image,
|
||||||
|
.hosting-dashboard-item:active .hosting-dashboard-image {
|
||||||
|
fill: #6D84AC;
|
||||||
|
color: #6D84AC;
|
||||||
|
}
|
||||||
|
.hosting-dashboard-image img,
|
||||||
|
.hosting-dashboard-image svg {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
max-height: 79px;
|
||||||
|
}
|
||||||
|
.hosting-dashboard-image img {
|
||||||
|
opacity: 0.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.hosting-dashboard-content {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
.hosting-dashboard-item {
|
||||||
|
width: 31.5%;
|
||||||
|
}
|
||||||
|
}
|
556
hosting/static/hosting/css/landing-page.css
Executable file
|
@ -0,0 +1,556 @@
|
||||||
|
/*!
|
||||||
|
* Start Bootstrap - Landing Page Bootstrap Theme (http://startbootstrap.com)
|
||||||
|
* Code licensed under the Apache License v2.0.
|
||||||
|
* For details, see http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*/
|
||||||
|
|
||||||
|
body,
|
||||||
|
html {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
body,
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5,
|
||||||
|
h6 {
|
||||||
|
font-family: 'Lato', sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.allcaps {
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.topnav {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
.topnav .navbar-fixed-top .navbar-collapse {
|
||||||
|
max-height: 740px;
|
||||||
|
}
|
||||||
|
.navbar-brand {
|
||||||
|
padding: 10px 15px;
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.navbar-brand {
|
||||||
|
padding: 10px 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-default {
|
||||||
|
background: #fff;
|
||||||
|
/* box-shadow: 0 3px 3px -2px hsla(0,0%,78%,.72); */
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-default .navbar-header {
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-transparent {
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
padding: 20px 0;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-transparent.topnav {
|
||||||
|
z-index: 1005;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-transparent .navbar-nav>li>a {
|
||||||
|
color: #fff;
|
||||||
|
cursor: pointer;
|
||||||
|
/*font-family: 'Lato-Regular', sans-serif;*/
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
.navbar-transparent .navbar-nav>li>a:hover {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.navbar-transparent .navbar-nav>li>a:focus, .navbar-transparent .navbar-nav>li>a:hover {
|
||||||
|
color: #fff;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-transparent #logoWhite{
|
||||||
|
display: block;
|
||||||
|
width: 220px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-right .highlights-dropdown .dropdown-menu {
|
||||||
|
left: 0 !important;
|
||||||
|
min-width: 155px;
|
||||||
|
margin-left: 15px;
|
||||||
|
padding: 0 5px 8px !important;
|
||||||
|
}
|
||||||
|
@media(min-width: 768px) {
|
||||||
|
.navbar-default .navbar-nav>li>a,
|
||||||
|
.navbar-right .highlights-dropdown .dropdown-menu > li > a {
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
.navbar-right .highlights-dropdown .dropdown-menu {
|
||||||
|
box-shadow: 0 2px 5px 0 rgba(0,0,0,0.02);
|
||||||
|
border-width: 0 0 1px 0;
|
||||||
|
border-color: #e7e7e7;
|
||||||
|
box-shadow: -8px 14px 20px -5px rgba(77, 77, 77, 0.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.navbar-right .highlights-dropdown .dropdown-menu > li > a{
|
||||||
|
font-size: 13px;
|
||||||
|
font-family: 'Lato', sans-serif;
|
||||||
|
padding: 1px 10px 1px 18px !important;
|
||||||
|
background: transparent;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
.navbar-right .highlights-dropdown .dropdown-menu > li > a:hover,
|
||||||
|
.navbar-right .highlights-dropdown .dropdown-menu > li > a:focus,
|
||||||
|
.navbar-right .highlights-dropdown .dropdown-menu > li > a:active {
|
||||||
|
background: transparent;
|
||||||
|
text-decoration: underline !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lead {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
.intro-header {
|
||||||
|
padding-top: 50px; /* If you're making other pages, make sure there is 50px of padding to make sure the navbar doesn't overlap content! */
|
||||||
|
padding-bottom: 50px;
|
||||||
|
text-align: center;
|
||||||
|
color: #f8f8f8;
|
||||||
|
background: url(../img/intro-bg.jpg) no-repeat center center;
|
||||||
|
background-size: cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.intro-header-2 {
|
||||||
|
padding-top: 50px; /* If you're making other pages, make sure there is 50px of padding to make sure the navbar doesn't overlap content! */
|
||||||
|
padding-bottom: 50px;
|
||||||
|
text-align: center;
|
||||||
|
color: #f8f8f8;
|
||||||
|
background: url(../img/configure.jpg) no-repeat center center;
|
||||||
|
background-size: cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.intro-message {
|
||||||
|
position: relative;
|
||||||
|
padding-top: 20%;
|
||||||
|
padding-bottom: 20%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.intro-auth {
|
||||||
|
text-align: center;
|
||||||
|
color: #f8f8f8;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.intro-message > h1 {
|
||||||
|
margin: 0;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.intro-divider {
|
||||||
|
width: 400px;
|
||||||
|
border-top: 1px solid #f8f8f8;
|
||||||
|
border-bottom: 1px solid rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.intro-message > h3 {
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.intro-message {
|
||||||
|
padding-bottom: 15%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.intro-message > h1 {
|
||||||
|
font-size: 3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.intro-social-buttons > li {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.intro-social-buttons > li:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.intro-divider {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.network-name {
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-section-a {
|
||||||
|
padding: 50px 0;
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-section-b {
|
||||||
|
padding: 50px 0;
|
||||||
|
border-top: 1px solid #e7e7e7;
|
||||||
|
border-bottom: 1px solid #e7e7e7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-heading {
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-heading-spacer {
|
||||||
|
float: left;
|
||||||
|
width: 200px;
|
||||||
|
border-top: 3px solid #e7e7e7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.banner {
|
||||||
|
padding: 100px 0;
|
||||||
|
color: #f8f8f8;
|
||||||
|
background: url(../img/banner-bg.jpg) no-repeat center center;
|
||||||
|
background-size: cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.banner h2 {
|
||||||
|
margin: 0;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.banner ul {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------Auth section---------*/
|
||||||
|
.auth-container {
|
||||||
|
min-height: calc(100vh - 180px);
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-bg {
|
||||||
|
background: url(../img/pattern.jpg) no-repeat center center;
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100vh;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center center;
|
||||||
|
background-size: cover;
|
||||||
|
background-attachment: fixed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-bg::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
background: rgba(90, 116, 175, 0.7);
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-container .container {
|
||||||
|
z-index: 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-container .auth-content {
|
||||||
|
width: 100%;
|
||||||
|
margin: 0 auto 15px;
|
||||||
|
max-width: 400px;
|
||||||
|
padding: 0 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-container .auth-content.wide {
|
||||||
|
max-width: 480px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box {
|
||||||
|
position: relative;
|
||||||
|
background: #fff;
|
||||||
|
padding: 40px 20px 20px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.09), 0 5px 5px rgba(0, 0, 0, 0.23);
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box .section-heading {
|
||||||
|
color: #5a5a5a;
|
||||||
|
font-weight: 300;
|
||||||
|
text-align: center;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
font-size: 36px;
|
||||||
|
border-radius: 3px 3px 0px 0px;
|
||||||
|
margin: 0 auto 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box .form {
|
||||||
|
padding: 20px;
|
||||||
|
margin: 0 auto;
|
||||||
|
max-width: 360px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box .form .red {
|
||||||
|
color: #eb4d5c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box .form .btn {
|
||||||
|
letter-spacing: 2px;
|
||||||
|
font-size: 16px;
|
||||||
|
padding: 6px 12px;
|
||||||
|
min-width: 140px;
|
||||||
|
margin-top: 15px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box .form .form-control {
|
||||||
|
height: 48px;
|
||||||
|
font-size: 14px;
|
||||||
|
padding: 10px 17px;
|
||||||
|
line-height: 30px;
|
||||||
|
border-color: #aaa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box .form .form-control:focus,
|
||||||
|
.auth-box .form .form-control:active {
|
||||||
|
box-shadow: none;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box .form-control::-webkit-input-placeholder {
|
||||||
|
color: #aaa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box .form-control:-moz-placeholder{
|
||||||
|
/* Firefox 18- */
|
||||||
|
color: #aaa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box .form-control::-moz-placeholder{
|
||||||
|
/* Firefox 19+ */
|
||||||
|
color: #aaa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box .form-control:-ms-input-placeholder {
|
||||||
|
color: #aaa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box .auth-footer {
|
||||||
|
text-align: center;
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box .auth-footer {
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box .auth-footer a {
|
||||||
|
color: #1e94cc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box .auth-footer .links a:hover {
|
||||||
|
color: #1e94cc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sign-up-message {
|
||||||
|
padding: 25px 30px 25px 30px;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 30px;
|
||||||
|
font-weight: 300 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sign-up-message a {
|
||||||
|
font-size: 18px;
|
||||||
|
color: #1e94cc !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.banner h2 {
|
||||||
|
margin: 0;
|
||||||
|
text-shadow: 2px 2px 3px rgba(0, 0, 0, 0.6);
|
||||||
|
font-size: 3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box .form {
|
||||||
|
padding: 15px 0 15px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-container .auth-title {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box .msg-list {
|
||||||
|
padding: 20px 25px 0;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 540px) {
|
||||||
|
.auth-container .auth-title h2 {
|
||||||
|
font-size: 32px;
|
||||||
|
width: 90%;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-container.auth-signup .auth-title h2 {
|
||||||
|
font-size: 20px;
|
||||||
|
width: 90%;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box .section-heading {
|
||||||
|
font-size: 32px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
padding: 20px 0;
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.copyright {
|
||||||
|
margin: 14px 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-404 h1 {
|
||||||
|
margin: 0 0 15px;
|
||||||
|
font-size: 200px;
|
||||||
|
line-height: 1;
|
||||||
|
font-weight: 700;
|
||||||
|
color: #6db97c;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.unlink {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.unlink:hover {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 1040px) and (min-width: 768px) {
|
||||||
|
.content-dashboard {
|
||||||
|
width: 96% !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 1330px) and (min-width: 1200px) {
|
||||||
|
.content-dashboard {
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-light {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.footer-light footer {
|
||||||
|
background: transparent;
|
||||||
|
color: #eee;
|
||||||
|
}
|
||||||
|
.footer-light a,
|
||||||
|
.footer-light .text-muted {
|
||||||
|
color: #ddd;
|
||||||
|
}
|
||||||
|
.footer-light a:hover, .footer-light a:focus, .footer-light a:active {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.footer-vm p.copyright {
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-default .navbar-nav>.open>a, .navbar-default .navbar-nav>.open>a:focus, .navbar-default .navbar-nav>.open>a:hover,
|
||||||
|
.navbar-default .navbar-nav>.active>a, .navbar-default .navbar-nav>.active>a:focus, .navbar-default .navbar-nav>.active>a:hover {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.navbar-default .navbar-nav .open .dropdown-menu>.active>a, .navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus, .navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* bootstrap danger color override from #a94442 */
|
||||||
|
.text-danger,
|
||||||
|
.has-error .help-block,
|
||||||
|
.has-error .control-label,
|
||||||
|
.has-error .radio,
|
||||||
|
.has-error .checkbox,
|
||||||
|
.has-error .radio-inline,
|
||||||
|
.has-error .checkbox-inline,
|
||||||
|
.has-error.radio label,
|
||||||
|
.has-error.checkbox label,
|
||||||
|
.has-error.radio-inline label,
|
||||||
|
.has-error.checkbox-inline label,
|
||||||
|
.has-error .form-control-feedback,
|
||||||
|
.alert-danger,
|
||||||
|
.list-group-item-danger,
|
||||||
|
a.list-group-item-danger,
|
||||||
|
a.list-group-item-danger:hover,
|
||||||
|
a.list-group-item-danger:focus,
|
||||||
|
.panel-danger > .panel-heading {
|
||||||
|
color: #eb4d5c;
|
||||||
|
}
|
||||||
|
.alert-danger{
|
||||||
|
background: rgba(235, 204, 209, 0.2);
|
||||||
|
}
|
||||||
|
.has-error .form-control,
|
||||||
|
.has-error .form-control:focus,
|
||||||
|
.has-error .form-control:active,
|
||||||
|
.has-error .input-group-addon {
|
||||||
|
color: #eb4d5c;
|
||||||
|
border-color: #eb4d5c;
|
||||||
|
}
|
||||||
|
a.list-group-item-danger.active,
|
||||||
|
a.list-group-item-danger.active:hover,
|
||||||
|
a.list-group-item-danger.active:focus {
|
||||||
|
background-color: #eb4d5c;
|
||||||
|
border-color: #eb4d5c;
|
||||||
|
}
|
||||||
|
.panel-danger > .panel-heading .badge {
|
||||||
|
background-color: #eb4d5c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* bootstrap input box-shadom disable */
|
||||||
|
.has-error .form-control:focus,
|
||||||
|
.has-error .form-control:active,
|
||||||
|
.has-success .form-control:focus,
|
||||||
|
.has-success .form-control:active {
|
||||||
|
box-shadow: inset 0 0 1px rgba(0,0,0,0.25);
|
||||||
|
}
|
||||||
|
.checkmark {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.checkmark:after {
|
||||||
|
/*Add another block-level blank space*/
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
/*Make it a small rectangle so the border will create an L-shape*/
|
||||||
|
width: 25px;
|
||||||
|
height: 60px;
|
||||||
|
/*Add a white border on the bottom and left, creating that 'L' */
|
||||||
|
border: solid #777;
|
||||||
|
border-width: 0 3px 3px 0;
|
||||||
|
/*Rotate the L 45 degrees to turn it into a checkmark*/
|
||||||
|
transform: rotate(45deg);
|
||||||
|
}
|
6
hosting/static/hosting/css/nodejshosting.css
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
@charset "UTF-8";
|
||||||
|
/* CSS Document */
|
||||||
|
|
||||||
|
.intro-header {
|
||||||
|
background: url(../img/django-intro-bg.png) no-repeat center center;
|
||||||
|
}
|
128
hosting/static/hosting/css/order.css
Executable file
|
@ -0,0 +1,128 @@
|
||||||
|
.order-detail-container {
|
||||||
|
max-width: 600px;
|
||||||
|
margin: 100px auto 40px;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
padding: 15px;
|
||||||
|
color: #595959;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media(min-width: 768px) {
|
||||||
|
.order-detail-container {
|
||||||
|
padding: 30px 30px 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-detail-container .invoice-title h2, .invoice-title h3 {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-detail-container .table > tbody > tr > .thick-line {
|
||||||
|
border-top: 2px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-detail-container .dashboard-title-thin {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-left: -3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-detail-container .dashboard-title-thin .un-icon {
|
||||||
|
margin-top: -6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-detail-container .dashboard-container-head {
|
||||||
|
position: relative;
|
||||||
|
padding: 0;
|
||||||
|
margin-bottom: 38px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-detail-container .dashboard-container-options {
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
.order-detail-container .dashboard-container-options .svg-img {
|
||||||
|
height: 22px;
|
||||||
|
width: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-detail-container .order-details {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-detail-container h4 {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-detail-container p {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-detail-container hr {
|
||||||
|
margin: 15px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-detail-container .thin-hr {
|
||||||
|
margin: 10px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-detail-container .subtotal-price {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-detail-container .subtotal-price .text-primary {
|
||||||
|
font-size: 17px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-detail-container .total-price {
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.order-confirm-btn {
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
.order-detail-container .dashboard-container-options {
|
||||||
|
position: absolute;
|
||||||
|
top: 4px;
|
||||||
|
right: -4px;
|
||||||
|
}
|
||||||
|
.order-detail-container .dashboard-container-options .svg-img {
|
||||||
|
height: 16px;
|
||||||
|
width: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.order_detail_footer {
|
||||||
|
font-size: 9px;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order_detail_footer strong {
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#virtual_machine_create_form {
|
||||||
|
padding: 15px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dcl-place-order-text {
|
||||||
|
color: #808080;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.border_bottom td {
|
||||||
|
border-bottom:1pt solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.grand-total-padding td {
|
||||||
|
padding-top: 10px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
11
hosting/static/hosting/css/orders.css
Executable file
|
@ -0,0 +1,11 @@
|
||||||
|
.orders-container {padding-top:70px; padding-bottom: 11%;}
|
||||||
|
|
||||||
|
.orders-container .table > tbody > tr > td {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width:767px){
|
||||||
|
.dcl-text-right {
|
||||||
|
padding-right: 20px;
|
||||||
|
}
|
||||||
|
}
|
257
hosting/static/hosting/css/payment.css
Executable file
|
@ -0,0 +1,257 @@
|
||||||
|
.payment-container {
|
||||||
|
padding-top: 70px;
|
||||||
|
padding-bottom: 11%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.creditcard-box .panel-title {
|
||||||
|
display: inline;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 17px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.creditcard-box .checkbox.pull-right {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.creditcard-box .pl-ziro {
|
||||||
|
padding-left: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.creditcard-box .form-control.error {
|
||||||
|
border-color: red;
|
||||||
|
outline: 0;
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(255, 0, 0, 0.6);
|
||||||
|
}
|
||||||
|
|
||||||
|
.creditcard-box label.error {
|
||||||
|
font-weight: bold;
|
||||||
|
color: red;
|
||||||
|
padding: 2px 8px;
|
||||||
|
margin-top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.creditcard-box .payment-errors {
|
||||||
|
font-weight: bold;
|
||||||
|
color: red;
|
||||||
|
padding: 2px 8px;
|
||||||
|
margin-top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dcl-order-sec {
|
||||||
|
padding: 0 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dcl-billing-sec {
|
||||||
|
margin-top: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dcl-order-container {
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dcl-order-table-header {
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
padding: 15px 10px;
|
||||||
|
font-size: 16px;
|
||||||
|
color: #333;
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dcl-order-table-content {
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
padding: 15px 10px;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dcl-order-table-total {
|
||||||
|
border-bottom: 4px solid #eee;
|
||||||
|
padding-top: 15px;
|
||||||
|
padding-bottom: 20px;
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dcl-order-table-total span {
|
||||||
|
font-size: 13px;
|
||||||
|
color: #999;
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dcl-order-table-total .tbl-total {
|
||||||
|
text-align: right;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tbl-no-padding {
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-warning-content {
|
||||||
|
font-weight: 300;
|
||||||
|
border: 1px solid #a1a1a1;
|
||||||
|
border-radius: 3px;
|
||||||
|
padding: 5px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-warning-error {
|
||||||
|
border: 1px solid #EB4D5C;
|
||||||
|
color: #EB4D5C;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-warning-addtional-margin {
|
||||||
|
margin-top: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stripe-payment-btn {
|
||||||
|
outline: none;
|
||||||
|
width: auto;
|
||||||
|
float: right;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
position: absolute;
|
||||||
|
padding-left: 30px;
|
||||||
|
padding-right: 30px;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-cvc-element label {
|
||||||
|
padding-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-element {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-element label {
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.my-input {
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-cvc-element .my-input {
|
||||||
|
padding-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#card-errors {
|
||||||
|
clear: both;
|
||||||
|
padding: 0 0 10px;
|
||||||
|
color: #eb4d5c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.credit-card-goup {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.dcl-order-sec {
|
||||||
|
padding: 10px 5px 30px;
|
||||||
|
border-bottom: 4px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dcl-billing-sec {
|
||||||
|
margin-top: 30px;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dcl-billing {
|
||||||
|
margin-top: 20px;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tbl-header {
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
padding-top: 10px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
margin-right: -15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dcl-order-table-total .tbl-total {
|
||||||
|
margin-left: -15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dcl-order-table-total .tbl-tot {
|
||||||
|
margin-right: -15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tbl-content {
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
padding-top: 10px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
margin-left: -15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dcl-order-table-header {
|
||||||
|
border-bottom: 0px solid #eee;
|
||||||
|
padding: 10px 0;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dcl-order-table-content {
|
||||||
|
border-bottom: 0px solid #eee;
|
||||||
|
padding: 10px 0;
|
||||||
|
text-align: right;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dcl-order-table-total {
|
||||||
|
font-size: 18px;
|
||||||
|
color: #000;
|
||||||
|
padding: 10px 0;
|
||||||
|
border-bottom: 0px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-expiry-element {
|
||||||
|
padding-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-cvc-element {
|
||||||
|
padding-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#billing-form .form-control {
|
||||||
|
box-shadow: none !important;
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.dcl-billing {
|
||||||
|
padding-right: 65px;
|
||||||
|
border-right: 1px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dcl-creditcard {
|
||||||
|
padding-left: 65px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dcl-order-table-total .tbl-total,
|
||||||
|
.dcl-order-table-total .tbl-tot {
|
||||||
|
padding: 0 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tbl-header-center,
|
||||||
|
.tbl-content-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tbl-header-right,
|
||||||
|
.tbl-content-right {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 1200px) {
|
||||||
|
.dcl-order-container {
|
||||||
|
width: 990px;
|
||||||
|
padding-right: 15px;
|
||||||
|
padding-left: 15px;
|
||||||
|
margin-right: auto;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
}
|
233
hosting/static/hosting/css/price_calculator.css
Executable file
|
@ -0,0 +1,233 @@
|
||||||
|
/* Create VM calculator */
|
||||||
|
|
||||||
|
.price-calc-section {
|
||||||
|
padding: 20px 0 !important;
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.price-calc-section {
|
||||||
|
margin-top: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .text {
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .text .section-heading {
|
||||||
|
font-size: 48px;
|
||||||
|
line-height: 48px;
|
||||||
|
padding-bottom: 27px;
|
||||||
|
color: #3a3a3a;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
position: relative;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .text .description {
|
||||||
|
font-size: 20px;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .text .section-heading::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
background: #29427A;
|
||||||
|
height: 7px;
|
||||||
|
width: 70px;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card {
|
||||||
|
border-radius: 7px;
|
||||||
|
margin: 0 auto;
|
||||||
|
background: #fff;
|
||||||
|
box-shadow: 1px 3px 6px 2px rgba(0, 0, 0, 0.2);
|
||||||
|
padding-bottom: 30px;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 4000px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.price-calc-section .card {
|
||||||
|
/* margin-left: 0; */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .landing {
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-padding {
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card .title {
|
||||||
|
padding: 15px 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card .title h3 {
|
||||||
|
/*font-family: 'Lato', sans-serif;*/
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card .price {
|
||||||
|
background: #5A74AF;
|
||||||
|
padding: 22px;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card .price .price-text {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card .description {
|
||||||
|
padding: 12px;
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around !important;
|
||||||
|
align-items: center !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card .description span {
|
||||||
|
font-size: 16px;
|
||||||
|
margin-left: 5px;
|
||||||
|
/* margin-left: 0px; */
|
||||||
|
/* justify-self: start; */
|
||||||
|
width: 29%;
|
||||||
|
text-align: left;
|
||||||
|
line-height: 16px;
|
||||||
|
/* font-weight: normal; */
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card .description .select-number{
|
||||||
|
font-size: 18px;
|
||||||
|
text-align: center;
|
||||||
|
width: 85px;
|
||||||
|
padding: 5px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card .description i {
|
||||||
|
color: #29427a;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 20px;
|
||||||
|
/* border: 1px solid #ccc; */
|
||||||
|
/* padding: 5px 6px 3px; */
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card .description .left {
|
||||||
|
margin-right: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card .description .right {
|
||||||
|
margin-left: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card .descriptions {
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card .description p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card .btn {
|
||||||
|
margin-top: 15px;
|
||||||
|
font-size: 20px;
|
||||||
|
width: 150px;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card .select-configuration select {
|
||||||
|
outline: none;
|
||||||
|
background: #fff;
|
||||||
|
border-color: #d0d0d0;
|
||||||
|
height: 32px;
|
||||||
|
width: 150px;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 14px;
|
||||||
|
margin-left: 10px;
|
||||||
|
padding: 6px;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card .check-ip {
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card .justify-center {
|
||||||
|
justify-content: center !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card .description.input label {
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 700;
|
||||||
|
/*font-weight: 800;*/
|
||||||
|
/*font-family: 'Lato';*/
|
||||||
|
margin-bottom: 0;
|
||||||
|
width: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*Changed class****.price-calc-section .card .description.input input*/
|
||||||
|
|
||||||
|
.price-calc-section .card .description input {
|
||||||
|
width: 200px;
|
||||||
|
font-size: 14px;
|
||||||
|
text-align: left;
|
||||||
|
padding: 4px 10px;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid #d0d0d0;
|
||||||
|
background: #fff;
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .card .check-ip input[type=checkbox] {
|
||||||
|
font-size: 17px;
|
||||||
|
margin: 0 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .help-block.with-errors {
|
||||||
|
text-align: center;
|
||||||
|
margin: 0 0;
|
||||||
|
padding: 0 0;
|
||||||
|
}
|
||||||
|
.price-calc-section .help-block.with-errors ul {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .form-group {
|
||||||
|
margin: 0;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .form-group:after {
|
||||||
|
content: ' ';
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 20;
|
||||||
|
height: 1px;
|
||||||
|
width: 100%;
|
||||||
|
background: rgba(128, 128, 128, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-calc-section .btn-primary {
|
||||||
|
background: #29427A;
|
||||||
|
border-color: #29427A;
|
||||||
|
color: #fff;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media(min-width: 768px) {
|
||||||
|
.create-vm-container {
|
||||||
|
padding-top: 120px;
|
||||||
|
}
|
||||||
|
}
|
127
hosting/static/hosting/css/pricing.css
Executable file
|
@ -0,0 +1,127 @@
|
||||||
|
.pricing-container{
|
||||||
|
margin-left: 5%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pricing {
|
||||||
|
text-align: center;
|
||||||
|
border: 1px solid #f0f0f0;
|
||||||
|
color: #777;
|
||||||
|
font-size: 14px;
|
||||||
|
padding-left: 0;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
font-family: Lato, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.pricing img {
|
||||||
|
display: block;
|
||||||
|
margin: auto;
|
||||||
|
width: 32px;
|
||||||
|
}
|
||||||
|
.pricing li:first-child,
|
||||||
|
.pricing li:last-child {
|
||||||
|
padding: 20px 13px;
|
||||||
|
}
|
||||||
|
.pricing li {
|
||||||
|
list-style: none;
|
||||||
|
padding: 13px;
|
||||||
|
}
|
||||||
|
.pricing li + li {
|
||||||
|
border-top: 1px solid #f0f0f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pricing li.type {
|
||||||
|
list-style: none;
|
||||||
|
padding: 13px;
|
||||||
|
height: 150px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pricing li .form-control{
|
||||||
|
width:auto;
|
||||||
|
display:inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pricing big {
|
||||||
|
font-size: 32px;
|
||||||
|
}
|
||||||
|
.pricing h3 {
|
||||||
|
margin-bottom: 0;
|
||||||
|
font-size: 31px;
|
||||||
|
font-weight: bold;
|
||||||
|
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pricing span {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #999;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
.pricing li:nth-last-child(2) {
|
||||||
|
padding: 30px 13px;
|
||||||
|
}
|
||||||
|
.pricing button {
|
||||||
|
width: auto;
|
||||||
|
margin: auto;
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: bold;
|
||||||
|
border-radius: 50px;
|
||||||
|
color: #fff;
|
||||||
|
padding: 9px 24px;
|
||||||
|
background: #aaa;
|
||||||
|
opacity: 1;
|
||||||
|
transition: opacity .2s ease;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
.pricing button:hover {
|
||||||
|
opacity: .9;
|
||||||
|
}
|
||||||
|
.pricing button:active {
|
||||||
|
box-shadow: inset 0px 2px 2px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
/* pricing color */
|
||||||
|
|
||||||
|
.p-black big,
|
||||||
|
.p-black h3 {
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.p-black button {
|
||||||
|
background: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.p-green big,
|
||||||
|
.p-green h3 {
|
||||||
|
color: #4c7737;
|
||||||
|
}
|
||||||
|
.p-green button {
|
||||||
|
background: #4c7737;
|
||||||
|
}
|
||||||
|
.p-yel big,
|
||||||
|
.p-yel h3 {
|
||||||
|
color: #ffbb42;
|
||||||
|
}
|
||||||
|
.p-yel button {
|
||||||
|
background: #ffbb42;
|
||||||
|
}
|
||||||
|
.p-red big,
|
||||||
|
.p-red h3 {
|
||||||
|
color: #e13c4c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pricing .short-input{
|
||||||
|
min-width: 0;
|
||||||
|
width: 75px !important;
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.p-red button {
|
||||||
|
background: #e13c4c;
|
||||||
|
}
|
||||||
|
.p-blue big,
|
||||||
|
.p-blue h3 {
|
||||||
|
color: #3f4bb8;
|
||||||
|
}
|
||||||
|
.p-blue button {
|
||||||
|
background: #3f4bb8;
|
||||||
|
}
|
307
hosting/static/hosting/css/user_keys.css
Executable file
|
@ -0,0 +1,307 @@
|
||||||
|
/* ssh_keys_choice */
|
||||||
|
.h1-thin {
|
||||||
|
/*font-family: Lato, sans-serif;*/
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: 32px;
|
||||||
|
}
|
||||||
|
.dashboard-container .page-header {
|
||||||
|
border: 0;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
.dashboard-choice-container .page-header p {
|
||||||
|
font-size: 16px;
|
||||||
|
/*font-family: Lato, sans-serif;*/
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
.dashboard-choice-container h2 {
|
||||||
|
/*font-family: Lato, sans-serif;
|
||||||
|
font-weight: 400;*/
|
||||||
|
font-size: 22px;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
.choice-container {
|
||||||
|
border: 1px solid #C9C6C6;
|
||||||
|
padding: 25px;
|
||||||
|
border-radius: 1px;
|
||||||
|
}
|
||||||
|
.choice-container p{
|
||||||
|
font-size: 18px;
|
||||||
|
/*font-family: Lato, sans-serif;*/
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
.choice-container-top {
|
||||||
|
border-bottom: 1px solid #C9C6C6;
|
||||||
|
padding-bottom: 25px;
|
||||||
|
margin-bottom: 25px;
|
||||||
|
}
|
||||||
|
.choice-container .choice-btn {
|
||||||
|
margin-top: 25px;
|
||||||
|
}
|
||||||
|
.choice-btn {
|
||||||
|
min-width: 110px;
|
||||||
|
background-color: #3C5480;
|
||||||
|
color: #fff;
|
||||||
|
border: 2px solid #3C5480;
|
||||||
|
padding: 4px 10px;
|
||||||
|
transition: 0.3s all ease-out;
|
||||||
|
}
|
||||||
|
.choice-btn:focus,
|
||||||
|
.choice-btn:hover,
|
||||||
|
.choice-btn:active {
|
||||||
|
color: #3C5480;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
.choice-btn-faded {
|
||||||
|
background-color: #8396C4;
|
||||||
|
border: 2px solid #8396C4;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.h1-thin {
|
||||||
|
font-size: 27px;
|
||||||
|
}
|
||||||
|
.dashboard-choice-container h2 {
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
.choice-container p {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
.choice-btn{
|
||||||
|
margin-top: 15px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 420px) {
|
||||||
|
.ssh-keys-table {table-layout: fixed;}
|
||||||
|
}
|
||||||
|
|
||||||
|
.ssh-keys-table thead tr th,
|
||||||
|
.ssh-keys-table tbody tr td{
|
||||||
|
color: #717274;
|
||||||
|
text-align: center;
|
||||||
|
border-bottom: 1px solid #cbcbcb;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.ssh-keys-table tbody tr{
|
||||||
|
border-bottom: 1px solid #cbcbcb;
|
||||||
|
}
|
||||||
|
.ssh-keys-table thead tr th:first-of-type,
|
||||||
|
.ssh-keys-table tbody tr td:first-of-type{
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.ssh-keys-table thead tr th:last-of-type,
|
||||||
|
.ssh-keys-table tbody tr td:last-of-type{
|
||||||
|
width: 20%;
|
||||||
|
}
|
||||||
|
.ssh-header-container{
|
||||||
|
padding-top: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.ssh-header-container {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
.ssh-header-container p{
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.ssh-header-container p{
|
||||||
|
padding: 0;
|
||||||
|
color: #717274;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 300;
|
||||||
|
/*font-family: 'Lato';*/
|
||||||
|
}
|
||||||
|
|
||||||
|
.borderless tbody:before {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
.btn-custom-delete{
|
||||||
|
width: 100px;
|
||||||
|
background-color: #f1f0f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 768px) {
|
||||||
|
.ssh-header-container{
|
||||||
|
flex-direction: column-reverse;
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
.btn-custom-delete{
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
.dashboard-container {
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
.row {
|
||||||
|
/* margin-right: 0; */
|
||||||
|
/* margin-left: 0; */
|
||||||
|
}
|
||||||
|
.col-md-12, .col-sm-12{
|
||||||
|
/*padding-left: 5px;*/
|
||||||
|
/*padding-right: 5px;*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (max-width: 360px){
|
||||||
|
.content-dashboard {
|
||||||
|
/* width: 100% !important; */
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
/*padding-right: 5px;
|
||||||
|
padding-left: 5px;*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.dashboard-choice-container {
|
||||||
|
max-width: 834px !important;
|
||||||
|
}
|
||||||
|
.form_public_key{
|
||||||
|
resize: none;
|
||||||
|
}
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.form_key_name{
|
||||||
|
width:60%;
|
||||||
|
min-width: 215px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.form_public_key,
|
||||||
|
.form_key_name{
|
||||||
|
position: relative;
|
||||||
|
border:none;
|
||||||
|
border-bottom: 1px solid grey;
|
||||||
|
box-shadow: none;
|
||||||
|
border-radius: 0;
|
||||||
|
/*font-family: 'Lato-Light', sans-serif;*/
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: 20px;
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form_key_name::-webkit-input-placeholder{
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight:100;
|
||||||
|
/*font-family: 'Lato-Light', sans-serif;*/
|
||||||
|
font-weight: 300;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
.form_key_name::-moz-input-placeholder{
|
||||||
|
font-size: 20px;
|
||||||
|
/*font-family: 'Lato-Light', sans-serif;*/
|
||||||
|
font-weight: 300;
|
||||||
|
|
||||||
|
}
|
||||||
|
.form_key_name:-moz-input-placeholder{
|
||||||
|
/*font-family: 'Lato-Light', sans-serif;*/
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: 20px;
|
||||||
|
|
||||||
|
}
|
||||||
|
.form_key_name:-ms-input-placeholder {
|
||||||
|
font-size: 20px;
|
||||||
|
/*font-family: 'Lato-Light', sans-serif;*/
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form_public_key::-webkit-input-placeholder{
|
||||||
|
position: relative;
|
||||||
|
top: 110px;
|
||||||
|
font-size: 20px;
|
||||||
|
/*font-family: 'Lato-Light', sans-serif;*/
|
||||||
|
font-weight: 300;
|
||||||
|
|
||||||
|
}
|
||||||
|
.form_public_key::-moz-input-placeholder{
|
||||||
|
position: relative;
|
||||||
|
top: 110px;
|
||||||
|
font-size: 20px;
|
||||||
|
/*font-family: 'Lato-Light', sans-serif;*/
|
||||||
|
font-weight: 300;
|
||||||
|
|
||||||
|
}
|
||||||
|
.form_public_key:-moz-input-placeholder{
|
||||||
|
position: relative;
|
||||||
|
top: 110px;
|
||||||
|
font-size: 20px;
|
||||||
|
/*font-family: 'Lato-Light', sans-serif;*/
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
.form_public_key:-ms-input-placeholder {
|
||||||
|
position: relative;
|
||||||
|
top: 110px;
|
||||||
|
font-size: 20px;
|
||||||
|
/*font-family: 'Lato-Light', sans-serif;*/
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
.underform-contaner{
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
@media (min-width: 767px) {
|
||||||
|
.underform-contaner {
|
||||||
|
display: flex;
|
||||||
|
vertical-align: middle;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
flex-direction: row;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.underform-contaner .btn-container {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.underform-contaner h4{
|
||||||
|
/*font-family: 'Lato-Light', sans-serif;*/
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
.underform-contaner button{
|
||||||
|
/* font-family: Lato; */
|
||||||
|
/* font-weight: 600; */
|
||||||
|
min-width: 120px;
|
||||||
|
height: 35px;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
.underform-contaner .btn-default{
|
||||||
|
background-color: #ccc;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.control-label{
|
||||||
|
/*font-family: 'Lato-Light', sans-serif;*/
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
.form-ssh h3{
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
.key_contain {
|
||||||
|
word-break: break-all;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
.form_key_name:focus,
|
||||||
|
.form_public_key:focus,
|
||||||
|
.has-error .form_key_name,
|
||||||
|
.has-error .form_key_name:focus,
|
||||||
|
.has-error .form_public_key,
|
||||||
|
.has-error .form_public_key:focus,
|
||||||
|
.has-success .form_key_name,
|
||||||
|
.has-success .form_key_name:focus,
|
||||||
|
.has-success .form_public_key,
|
||||||
|
.has-success .form_public_key:focus {
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
.wide440 {
|
||||||
|
max-width: 440px;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
.mob-only {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.mob-only {
|
||||||
|
display: initial;
|
||||||
|
}
|
||||||
|
.pc-only {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
542
hosting/static/hosting/css/virtual-machine.css
Executable file
|
@ -0,0 +1,542 @@
|
||||||
|
.virtual-machine-container {
|
||||||
|
max-width: 900px;
|
||||||
|
}
|
||||||
|
.virtual-machine-container .tabs-left, .virtual-machine-container .tabs-right {
|
||||||
|
border-bottom: none;
|
||||||
|
padding-top: 2px;
|
||||||
|
}
|
||||||
|
.virtual-machine-container .tabs-left {
|
||||||
|
border-right: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
.virtual-machine-container .tabs-right {
|
||||||
|
border-left: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
.virtual-machine-container .tabs-left>li, .virtual-machine-container .tabs-right>li {
|
||||||
|
float: none;
|
||||||
|
margin-bottom: 2px;
|
||||||
|
}
|
||||||
|
.virtual-machine-container .tabs-left>li {
|
||||||
|
margin-right: -1px;
|
||||||
|
}
|
||||||
|
.virtual-machine-container .tabs-right>li {
|
||||||
|
margin-left: -1px;
|
||||||
|
}
|
||||||
|
.virtual-machine-container .tabs-left>li.active>a,
|
||||||
|
.virtual-machine-container .tabs-left>li.active>a:hover,
|
||||||
|
.virtual-machine-container .tabs-left>li.active>a:focus {
|
||||||
|
border-bottom-color: #ddd;
|
||||||
|
border-right-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.virtual-machine-container .tabs-right>li.active>a,
|
||||||
|
.virtual-machine-container .tabs-right>li.active>a:hover,
|
||||||
|
.virtual-machine-container .tabs-right>li.active>a:focus {
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
border-left-color: transparent;
|
||||||
|
}
|
||||||
|
.virtual-machine-container .tabs-left>li>a {
|
||||||
|
border-radius: 4px 0 0 4px;
|
||||||
|
margin-right: 0;
|
||||||
|
display:block;
|
||||||
|
}
|
||||||
|
.virtual-machine-container .tabs-right>li>a {
|
||||||
|
border-radius: 0 4px 4px 0;
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.virtual-machine-container .form-ssh textarea{
|
||||||
|
height: 150px !important
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Create VM Styles*/
|
||||||
|
.container-button{
|
||||||
|
text-align: right;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.container-button .btn{
|
||||||
|
font-size: 17px;
|
||||||
|
width: 150px;
|
||||||
|
margin-top: 5px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.container-button .price{
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 990px) {
|
||||||
|
.virtual-machine-container .tabs-left {
|
||||||
|
border-right: 0;
|
||||||
|
}
|
||||||
|
.virtual-machine-container .tabs-left>li.active>a,
|
||||||
|
.virtual-machine-container .tabs-left>li.active>a:hover,
|
||||||
|
.virtual-machine-container .tabs-left>li.active>a:focus {
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
.virtual-machine-container .tabs-left>li>a {
|
||||||
|
border-radius: 4px;
|
||||||
|
margin-right: 0;
|
||||||
|
display:block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.container-button{
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.dashboard-title{
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Vm Details */
|
||||||
|
|
||||||
|
.vm-detail-item, .vm-contact-us {
|
||||||
|
overflow: hidden;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
padding: 15px;
|
||||||
|
color: #555;
|
||||||
|
font-weight: 300;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-detail-title {
|
||||||
|
margin-top: 0;
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-detail-title .un-icon {
|
||||||
|
float: right;
|
||||||
|
height: 24px;
|
||||||
|
width: 21px;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-detail-item .vm-name {
|
||||||
|
font-size: 16px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-detail-item p {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-detail-ip {
|
||||||
|
padding-bottom: 5px;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-detail-ip .un-icon {
|
||||||
|
height: 14px;
|
||||||
|
width: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-detail-ip .to_copy {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 1px;
|
||||||
|
padding: 0;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-vmid {
|
||||||
|
padding: 50px 0 70px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-vmid-with-warning {
|
||||||
|
padding: 50px 0 33px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-vmid .alert {
|
||||||
|
margin-top: 15px;
|
||||||
|
margin-bottom: -25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-item-lg {
|
||||||
|
font-size: 22px;
|
||||||
|
margin-top: 5px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
letter-spacing: 0.6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-color-online {
|
||||||
|
color: #37B07B;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-color-pending {
|
||||||
|
color: #e47f2f;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-color-failed {
|
||||||
|
color: #eb4d5c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-detail-item .value{
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-detail-config .value {
|
||||||
|
float: right;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-detail-contain {
|
||||||
|
margin-top: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-terminate-warning {
|
||||||
|
letter-spacing: 0.6px;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #373636;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-contact-us {
|
||||||
|
margin: 25px 0 30px;
|
||||||
|
/* text-align: center; */
|
||||||
|
}
|
||||||
|
|
||||||
|
@media(min-width: 768px) {
|
||||||
|
.vm-detail-contain {
|
||||||
|
display: flex;
|
||||||
|
margin-left: -15px;
|
||||||
|
margin-right: -15px;
|
||||||
|
}
|
||||||
|
.vm-detail-item {
|
||||||
|
width: 33.333333%;
|
||||||
|
margin: 0 15px;
|
||||||
|
}
|
||||||
|
.vm-contact-us {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
.vm-contact-us .vm-detail-title {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
.vm-contact-us .un-icon {
|
||||||
|
width: 22px;
|
||||||
|
height: 22px;
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
.vm-contact-us div {
|
||||||
|
padding: 0 15px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.vm-contact-us-text {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.value-sm-block {
|
||||||
|
display: block;
|
||||||
|
padding-top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media(max-width: 767px) {
|
||||||
|
.vm-contact-us div {
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
.vm-contact-us div span {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 3px;
|
||||||
|
}
|
||||||
|
.dashboard-title-thin {
|
||||||
|
font-size: 22px;
|
||||||
|
}
|
||||||
|
.dashboard-greetings-thin {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-vm-invoice {
|
||||||
|
color: #87B6EA;
|
||||||
|
border: 2px solid #87B6EA;
|
||||||
|
padding: 4px 18px;
|
||||||
|
letter-spacing: 0.6px;
|
||||||
|
}
|
||||||
|
.btn-vm-invoice:hover, .btn-vm-invoice:focus {
|
||||||
|
color : #fff;
|
||||||
|
background: #87B6EA;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.btn-vm-term {
|
||||||
|
color: #aaa;
|
||||||
|
border: 2px solid #ccc;
|
||||||
|
background: #fff;
|
||||||
|
padding: 4px 18px;
|
||||||
|
letter-spacing: 0.6px;
|
||||||
|
}
|
||||||
|
.btn-vm-term:hover, .btn-vm-term:focus, .btn-vm-term:active {
|
||||||
|
color: #eb4d5c;
|
||||||
|
border-color: #eb4d5c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-vm-contact {
|
||||||
|
color: #fff;
|
||||||
|
background: #A3C0E2;
|
||||||
|
border: 2px solid #A3C0E2;
|
||||||
|
padding: 5px 25px;
|
||||||
|
font-size: 12px;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
}
|
||||||
|
.btn-vm-contact:hover, .btn-vm-contact:focus {
|
||||||
|
background: #fff;
|
||||||
|
color: #a3c0e2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-vm-back {
|
||||||
|
color: #fff;
|
||||||
|
background: #C4CEDA;
|
||||||
|
border: 2px solid #C4CEDA;
|
||||||
|
padding: 5px 25px;
|
||||||
|
font-size: 12px;
|
||||||
|
letter-spacing: 1.3px;
|
||||||
|
}
|
||||||
|
.btn-vm-back:hover, .btn-vm-back:focus {
|
||||||
|
color: #fff;
|
||||||
|
background: #8da4c0;
|
||||||
|
border-color: #8da4c0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-contact-us-text {
|
||||||
|
letter-spacing: 0.4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* New styles */
|
||||||
|
.dashboard-container-head {
|
||||||
|
padding: 0 8px;
|
||||||
|
}
|
||||||
|
.dashboard-title-thin {
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard-greetings-thin {
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard-title-thin .un-icon {
|
||||||
|
height: 34px;
|
||||||
|
margin-right: 5px;
|
||||||
|
margin-top: -2px;
|
||||||
|
width: 34px;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.dashboard-title-thin .un-icon.wide {
|
||||||
|
height: 38px;
|
||||||
|
width: 38px;
|
||||||
|
margin-top: -6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard-subtitle {
|
||||||
|
font-weight: 300;
|
||||||
|
margin-bottom: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-vm {
|
||||||
|
background: #1596DA;
|
||||||
|
color: #fff;
|
||||||
|
font-weight: 400;
|
||||||
|
letter-spacing: 0.8px;
|
||||||
|
border-radius: 3px;
|
||||||
|
padding-bottom: 7px;
|
||||||
|
border: 2px solid #1596DA;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-vm:hover, .btn-vm:focus {
|
||||||
|
color: #1596DA;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
.btn-vm:hover .css-plus:after,
|
||||||
|
.btn-vm:focus .css-plus:after,
|
||||||
|
.btn-vm:hover .css-plus:before,
|
||||||
|
.btn-vm:focus .css-plus:before {
|
||||||
|
background: #1596DA;
|
||||||
|
}
|
||||||
|
.btn-vm-detail {
|
||||||
|
background: #3770CC;
|
||||||
|
color: #fff;
|
||||||
|
font-weight: 400;
|
||||||
|
letter-spacing: 0.6px;
|
||||||
|
font-size: 14px;
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 2px solid #3770CC;
|
||||||
|
padding: 4px 20px;
|
||||||
|
/* padding-bottom: 7px; */
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-vm-detail:hover, .btn-vm-detail:focus {
|
||||||
|
background: #fff;
|
||||||
|
color: #3770CC;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-order-detail {
|
||||||
|
background: #87B6EA;
|
||||||
|
color: #fff;
|
||||||
|
font-weight: 400;
|
||||||
|
letter-spacing: 0.6px;
|
||||||
|
font-size: 14px;
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 2px solid #87B6EA;
|
||||||
|
padding: 4px 20px;
|
||||||
|
min-width: 155px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-order-detail:hover, .btn-order-detail:focus, .btn-order-detail:active {
|
||||||
|
background: #fff;
|
||||||
|
color: #87B6EA;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vm-status, .vm-status-active, .vm-status-failed, .vm-status-pending {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.vm-status-active {
|
||||||
|
color: #4A90E2;
|
||||||
|
}
|
||||||
|
.vm-status-failed {
|
||||||
|
color: #eb4d5c;
|
||||||
|
}
|
||||||
|
.vm-status-pending {
|
||||||
|
color: #e47f2f;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width:768px) {
|
||||||
|
.dashboard-subtitle {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (max-width:767px) {
|
||||||
|
.dashboard-title-thin {
|
||||||
|
font-size: 22px;
|
||||||
|
}
|
||||||
|
.dashboard-greetings-thin {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
.dashboard-title-thin .un-icon {
|
||||||
|
height: 22px;
|
||||||
|
width: 22px;
|
||||||
|
margin-top: -3px;
|
||||||
|
}
|
||||||
|
.dashboard-title-thin .un-icon.wide {
|
||||||
|
height: 25px;
|
||||||
|
width: 25px;
|
||||||
|
margin-top: -5px;
|
||||||
|
}
|
||||||
|
.dashboard-subtitle p {
|
||||||
|
width: 200px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-switch {
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-switch > tbody > tr > td {
|
||||||
|
padding: 12px 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.table-switch > tbody > tr > td:nth-child(1) {
|
||||||
|
padding-right: 45px;
|
||||||
|
}
|
||||||
|
.table-switch > tbody > tr:last-child > td {
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-switch .un-icon {
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width:767px) {
|
||||||
|
.dashboard-subtitle {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
.table-switch .un-icon {
|
||||||
|
float: right;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
.table-switch thead {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.table-switch tbody tr {
|
||||||
|
display: block;
|
||||||
|
position: relative;
|
||||||
|
border-top: 1px solid #ddd;
|
||||||
|
/* margin-top: 15px; */
|
||||||
|
padding-top: 10px;
|
||||||
|
padding-bottom: 13px;
|
||||||
|
}
|
||||||
|
.table-switch tbody tr:last-child {
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
.table-switch tbody tr td {
|
||||||
|
display: block;
|
||||||
|
padding-top: 28px;
|
||||||
|
padding-bottom: 6px;
|
||||||
|
position: relative;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
.table-switch td:before {
|
||||||
|
content: attr(data-header);
|
||||||
|
font-weight: 600;
|
||||||
|
position: absolute;
|
||||||
|
top: 5px;
|
||||||
|
left: 8px;
|
||||||
|
}
|
||||||
|
.table-switch .last-td {
|
||||||
|
padding-top: 12px;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
.table-switch tbody tr .xs-td-inline {
|
||||||
|
text-align: right;
|
||||||
|
padding-top: 6px;
|
||||||
|
}
|
||||||
|
.table-switch tbody tr .xs-td-bighalf {
|
||||||
|
width: 52%;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.table-switch tbody tr .xs-td-smallhalf {
|
||||||
|
width: 47%;
|
||||||
|
text-align: right;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.table-switch tbody tr .xs-td-smallhalf:before {
|
||||||
|
left: auto;
|
||||||
|
right: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.processing > .btn {
|
||||||
|
position: relative;
|
||||||
|
border-color: #eee;
|
||||||
|
}
|
||||||
|
.processing > .btn:hover,
|
||||||
|
.processing > .btn:focus,
|
||||||
|
.processing > .btn:active {
|
||||||
|
border-color: #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.processing > .btn:after {
|
||||||
|
content: ' ';
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
background-image: url('/static/hosting/img/ajax-loader.gif');
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center;
|
||||||
|
background-color: #eee;
|
||||||
|
width: 100%;
|
||||||
|
top: 0;
|
||||||
|
height: 100%;
|
||||||
|
left: 0;
|
||||||
|
}
|
BIN
hosting/static/hosting/django-intro-bg.png
Executable file
After Width: | Height: | Size: 2.8 MiB |
4
hosting/static/hosting/font-awesome/css/font-awesome.min.css
vendored
Executable file
BIN
hosting/static/hosting/font-awesome/fonts/FontAwesome.otf
Executable file
BIN
hosting/static/hosting/font-awesome/fonts/fontawesome-webfont.eot
Executable file
2671
hosting/static/hosting/font-awesome/fonts/fontawesome-webfont.svg
Executable file
After Width: | Height: | Size: 434 KiB |
BIN
hosting/static/hosting/font-awesome/fonts/fontawesome-webfont.ttf
Executable file
BIN
hosting/static/hosting/font-awesome/fonts/fontawesome-webfont.woff
Executable file
BIN
hosting/static/hosting/font-awesome/fonts/fontawesome-webfont.woff2
Executable file
16
hosting/static/hosting/font-awesome/less/bordered-pulled.less
vendored
Executable file
|
@ -0,0 +1,16 @@
|
||||||
|
// Bordered & Pulled
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
.@{fa-css-prefix}-border {
|
||||||
|
padding: .2em .25em .15em;
|
||||||
|
border: solid .08em @fa-border-color;
|
||||||
|
border-radius: .1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pull-right { float: right; }
|
||||||
|
.pull-left { float: left; }
|
||||||
|
|
||||||
|
.@{fa-css-prefix} {
|
||||||
|
&.pull-left { margin-right: .3em; }
|
||||||
|
&.pull-right { margin-left: .3em; }
|
||||||
|
}
|
11
hosting/static/hosting/font-awesome/less/core.less
vendored
Executable file
|
@ -0,0 +1,11 @@
|
||||||
|
// Base Class Definition
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
.@{fa-css-prefix} {
|
||||||
|
display: inline-block;
|
||||||
|
font: normal normal normal 14px/1 FontAwesome; // shortening font declaration
|
||||||
|
font-size: inherit; // can't have font-size inherit on line above, so need to override
|
||||||
|
text-rendering: auto; // optimizelegibility throws things off #1094
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
6
hosting/static/hosting/font-awesome/less/fixed-width.less
vendored
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
// Fixed Width Icons
|
||||||
|
// -------------------------
|
||||||
|
.@{fa-css-prefix}-fw {
|
||||||
|
width: (18em / 14);
|
||||||
|
text-align: center;
|
||||||
|
}
|
17
hosting/static/hosting/font-awesome/less/font-awesome.less
vendored
Executable file
|
@ -0,0 +1,17 @@
|
||||||
|
/*!
|
||||||
|
* Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
|
||||||
|
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
|
||||||
|
*/
|
||||||
|
|
||||||
|
@import "variables.less";
|
||||||
|
@import "mixins.less";
|
||||||
|
@import "path.less";
|
||||||
|
@import "core.less";
|
||||||
|
@import "larger.less";
|
||||||
|
@import "fixed-width.less";
|
||||||
|
@import "list.less";
|
||||||
|
@import "bordered-pulled.less";
|
||||||
|
@import "spinning.less";
|
||||||
|
@import "rotated-flipped.less";
|
||||||
|
@import "stacked.less";
|
||||||
|
@import "icons.less";
|
552
hosting/static/hosting/font-awesome/less/icons.less
vendored
Executable file
|
@ -0,0 +1,552 @@
|
||||||
|
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
|
||||||
|
readers do not read off random characters that represent icons */
|
||||||
|
|
||||||
|
.@{fa-css-prefix}-glass:before { content: @fa-var-glass; }
|
||||||
|
.@{fa-css-prefix}-music:before { content: @fa-var-music; }
|
||||||
|
.@{fa-css-prefix}-search:before { content: @fa-var-search; }
|
||||||
|
.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; }
|
||||||
|
.@{fa-css-prefix}-heart:before { content: @fa-var-heart; }
|
||||||
|
.@{fa-css-prefix}-star:before { content: @fa-var-star; }
|
||||||
|
.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; }
|
||||||
|
.@{fa-css-prefix}-user:before { content: @fa-var-user; }
|
||||||
|
.@{fa-css-prefix}-film:before { content: @fa-var-film; }
|
||||||
|
.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; }
|
||||||
|
.@{fa-css-prefix}-th:before { content: @fa-var-th; }
|
||||||
|
.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; }
|
||||||
|
.@{fa-css-prefix}-check:before { content: @fa-var-check; }
|
||||||
|
.@{fa-css-prefix}-remove:before,
|
||||||
|
.@{fa-css-prefix}-close:before,
|
||||||
|
.@{fa-css-prefix}-times:before { content: @fa-var-times; }
|
||||||
|
.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; }
|
||||||
|
.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; }
|
||||||
|
.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; }
|
||||||
|
.@{fa-css-prefix}-signal:before { content: @fa-var-signal; }
|
||||||
|
.@{fa-css-prefix}-gear:before,
|
||||||
|
.@{fa-css-prefix}-cog:before { content: @fa-var-cog; }
|
||||||
|
.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; }
|
||||||
|
.@{fa-css-prefix}-home:before { content: @fa-var-home; }
|
||||||
|
.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; }
|
||||||
|
.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; }
|
||||||
|
.@{fa-css-prefix}-road:before { content: @fa-var-road; }
|
||||||
|
.@{fa-css-prefix}-download:before { content: @fa-var-download; }
|
||||||
|
.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; }
|
||||||
|
.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; }
|
||||||
|
.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; }
|
||||||
|
.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; }
|
||||||
|
.@{fa-css-prefix}-rotate-right:before,
|
||||||
|
.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; }
|
||||||
|
.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; }
|
||||||
|
.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; }
|
||||||
|
.@{fa-css-prefix}-lock:before { content: @fa-var-lock; }
|
||||||
|
.@{fa-css-prefix}-flag:before { content: @fa-var-flag; }
|
||||||
|
.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; }
|
||||||
|
.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; }
|
||||||
|
.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; }
|
||||||
|
.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; }
|
||||||
|
.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; }
|
||||||
|
.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; }
|
||||||
|
.@{fa-css-prefix}-tag:before { content: @fa-var-tag; }
|
||||||
|
.@{fa-css-prefix}-tags:before { content: @fa-var-tags; }
|
||||||
|
.@{fa-css-prefix}-book:before { content: @fa-var-book; }
|
||||||
|
.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; }
|
||||||
|
.@{fa-css-prefix}-print:before { content: @fa-var-print; }
|
||||||
|
.@{fa-css-prefix}-camera:before { content: @fa-var-camera; }
|
||||||
|
.@{fa-css-prefix}-font:before { content: @fa-var-font; }
|
||||||
|
.@{fa-css-prefix}-bold:before { content: @fa-var-bold; }
|
||||||
|
.@{fa-css-prefix}-italic:before { content: @fa-var-italic; }
|
||||||
|
.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; }
|
||||||
|
.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; }
|
||||||
|
.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; }
|
||||||
|
.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; }
|
||||||
|
.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; }
|
||||||
|
.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; }
|
||||||
|
.@{fa-css-prefix}-list:before { content: @fa-var-list; }
|
||||||
|
.@{fa-css-prefix}-dedent:before,
|
||||||
|
.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; }
|
||||||
|
.@{fa-css-prefix}-indent:before { content: @fa-var-indent; }
|
||||||
|
.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; }
|
||||||
|
.@{fa-css-prefix}-photo:before,
|
||||||
|
.@{fa-css-prefix}-image:before,
|
||||||
|
.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; }
|
||||||
|
.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; }
|
||||||
|
.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; }
|
||||||
|
.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; }
|
||||||
|
.@{fa-css-prefix}-tint:before { content: @fa-var-tint; }
|
||||||
|
.@{fa-css-prefix}-edit:before,
|
||||||
|
.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; }
|
||||||
|
.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; }
|
||||||
|
.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; }
|
||||||
|
.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; }
|
||||||
|
.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; }
|
||||||
|
.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; }
|
||||||
|
.@{fa-css-prefix}-backward:before { content: @fa-var-backward; }
|
||||||
|
.@{fa-css-prefix}-play:before { content: @fa-var-play; }
|
||||||
|
.@{fa-css-prefix}-pause:before { content: @fa-var-pause; }
|
||||||
|
.@{fa-css-prefix}-stop:before { content: @fa-var-stop; }
|
||||||
|
.@{fa-css-prefix}-forward:before { content: @fa-var-forward; }
|
||||||
|
.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; }
|
||||||
|
.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; }
|
||||||
|
.@{fa-css-prefix}-eject:before { content: @fa-var-eject; }
|
||||||
|
.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; }
|
||||||
|
.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; }
|
||||||
|
.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; }
|
||||||
|
.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; }
|
||||||
|
.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; }
|
||||||
|
.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; }
|
||||||
|
.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; }
|
||||||
|
.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; }
|
||||||
|
.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; }
|
||||||
|
.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; }
|
||||||
|
.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; }
|
||||||
|
.@{fa-css-prefix}-ban:before { content: @fa-var-ban; }
|
||||||
|
.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; }
|
||||||
|
.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; }
|
||||||
|
.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; }
|
||||||
|
.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; }
|
||||||
|
.@{fa-css-prefix}-mail-forward:before,
|
||||||
|
.@{fa-css-prefix}-share:before { content: @fa-var-share; }
|
||||||
|
.@{fa-css-prefix}-expand:before { content: @fa-var-expand; }
|
||||||
|
.@{fa-css-prefix}-compress:before { content: @fa-var-compress; }
|
||||||
|
.@{fa-css-prefix}-plus:before { content: @fa-var-plus; }
|
||||||
|
.@{fa-css-prefix}-minus:before { content: @fa-var-minus; }
|
||||||
|
.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; }
|
||||||
|
.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; }
|
||||||
|
.@{fa-css-prefix}-gift:before { content: @fa-var-gift; }
|
||||||
|
.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; }
|
||||||
|
.@{fa-css-prefix}-fire:before { content: @fa-var-fire; }
|
||||||
|
.@{fa-css-prefix}-eye:before { content: @fa-var-eye; }
|
||||||
|
.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; }
|
||||||
|
.@{fa-css-prefix}-warning:before,
|
||||||
|
.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; }
|
||||||
|
.@{fa-css-prefix}-plane:before { content: @fa-var-plane; }
|
||||||
|
.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; }
|
||||||
|
.@{fa-css-prefix}-random:before { content: @fa-var-random; }
|
||||||
|
.@{fa-css-prefix}-comment:before { content: @fa-var-comment; }
|
||||||
|
.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; }
|
||||||
|
.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; }
|
||||||
|
.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; }
|
||||||
|
.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; }
|
||||||
|
.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; }
|
||||||
|
.@{fa-css-prefix}-folder:before { content: @fa-var-folder; }
|
||||||
|
.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; }
|
||||||
|
.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; }
|
||||||
|
.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; }
|
||||||
|
.@{fa-css-prefix}-bar-chart-o:before,
|
||||||
|
.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; }
|
||||||
|
.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; }
|
||||||
|
.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; }
|
||||||
|
.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; }
|
||||||
|
.@{fa-css-prefix}-key:before { content: @fa-var-key; }
|
||||||
|
.@{fa-css-prefix}-gears:before,
|
||||||
|
.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; }
|
||||||
|
.@{fa-css-prefix}-comments:before { content: @fa-var-comments; }
|
||||||
|
.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; }
|
||||||
|
.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; }
|
||||||
|
.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; }
|
||||||
|
.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; }
|
||||||
|
.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; }
|
||||||
|
.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; }
|
||||||
|
.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; }
|
||||||
|
.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; }
|
||||||
|
.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; }
|
||||||
|
.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; }
|
||||||
|
.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; }
|
||||||
|
.@{fa-css-prefix}-upload:before { content: @fa-var-upload; }
|
||||||
|
.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; }
|
||||||
|
.@{fa-css-prefix}-phone:before { content: @fa-var-phone; }
|
||||||
|
.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; }
|
||||||
|
.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; }
|
||||||
|
.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; }
|
||||||
|
.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; }
|
||||||
|
.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; }
|
||||||
|
.@{fa-css-prefix}-github:before { content: @fa-var-github; }
|
||||||
|
.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; }
|
||||||
|
.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; }
|
||||||
|
.@{fa-css-prefix}-rss:before { content: @fa-var-rss; }
|
||||||
|
.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; }
|
||||||
|
.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; }
|
||||||
|
.@{fa-css-prefix}-bell:before { content: @fa-var-bell; }
|
||||||
|
.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; }
|
||||||
|
.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; }
|
||||||
|
.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; }
|
||||||
|
.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; }
|
||||||
|
.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; }
|
||||||
|
.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; }
|
||||||
|
.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; }
|
||||||
|
.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; }
|
||||||
|
.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; }
|
||||||
|
.@{fa-css-prefix}-globe:before { content: @fa-var-globe; }
|
||||||
|
.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; }
|
||||||
|
.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; }
|
||||||
|
.@{fa-css-prefix}-filter:before { content: @fa-var-filter; }
|
||||||
|
.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; }
|
||||||
|
.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; }
|
||||||
|
.@{fa-css-prefix}-group:before,
|
||||||
|
.@{fa-css-prefix}-users:before { content: @fa-var-users; }
|
||||||
|
.@{fa-css-prefix}-chain:before,
|
||||||
|
.@{fa-css-prefix}-link:before { content: @fa-var-link; }
|
||||||
|
.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; }
|
||||||
|
.@{fa-css-prefix}-flask:before { content: @fa-var-flask; }
|
||||||
|
.@{fa-css-prefix}-cut:before,
|
||||||
|
.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; }
|
||||||
|
.@{fa-css-prefix}-copy:before,
|
||||||
|
.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; }
|
||||||
|
.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; }
|
||||||
|
.@{fa-css-prefix}-save:before,
|
||||||
|
.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; }
|
||||||
|
.@{fa-css-prefix}-square:before { content: @fa-var-square; }
|
||||||
|
.@{fa-css-prefix}-navicon:before,
|
||||||
|
.@{fa-css-prefix}-reorder:before,
|
||||||
|
.@{fa-css-prefix}-bars:before { content: @fa-var-bars; }
|
||||||
|
.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; }
|
||||||
|
.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; }
|
||||||
|
.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; }
|
||||||
|
.@{fa-css-prefix}-underline:before { content: @fa-var-underline; }
|
||||||
|
.@{fa-css-prefix}-table:before { content: @fa-var-table; }
|
||||||
|
.@{fa-css-prefix}-magic:before { content: @fa-var-magic; }
|
||||||
|
.@{fa-css-prefix}-truck:before { content: @fa-var-truck; }
|
||||||
|
.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; }
|
||||||
|
.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; }
|
||||||
|
.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; }
|
||||||
|
.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; }
|
||||||
|
.@{fa-css-prefix}-money:before { content: @fa-var-money; }
|
||||||
|
.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; }
|
||||||
|
.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; }
|
||||||
|
.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; }
|
||||||
|
.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; }
|
||||||
|
.@{fa-css-prefix}-columns:before { content: @fa-var-columns; }
|
||||||
|
.@{fa-css-prefix}-unsorted:before,
|
||||||
|
.@{fa-css-prefix}-sort:before { content: @fa-var-sort; }
|
||||||
|
.@{fa-css-prefix}-sort-down:before,
|
||||||
|
.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; }
|
||||||
|
.@{fa-css-prefix}-sort-up:before,
|
||||||
|
.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; }
|
||||||
|
.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; }
|
||||||
|
.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; }
|
||||||
|
.@{fa-css-prefix}-rotate-left:before,
|
||||||
|
.@{fa-css-prefix}-undo:before { content: @fa-var-undo; }
|
||||||
|
.@{fa-css-prefix}-legal:before,
|
||||||
|
.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; }
|
||||||
|
.@{fa-css-prefix}-dashboard:before,
|
||||||
|
.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; }
|
||||||
|
.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; }
|
||||||
|
.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; }
|
||||||
|
.@{fa-css-prefix}-flash:before,
|
||||||
|
.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; }
|
||||||
|
.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; }
|
||||||
|
.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; }
|
||||||
|
.@{fa-css-prefix}-paste:before,
|
||||||
|
.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; }
|
||||||
|
.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; }
|
||||||
|
.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; }
|
||||||
|
.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; }
|
||||||
|
.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; }
|
||||||
|
.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; }
|
||||||
|
.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; }
|
||||||
|
.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; }
|
||||||
|
.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; }
|
||||||
|
.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; }
|
||||||
|
.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; }
|
||||||
|
.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; }
|
||||||
|
.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; }
|
||||||
|
.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; }
|
||||||
|
.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; }
|
||||||
|
.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; }
|
||||||
|
.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; }
|
||||||
|
.@{fa-css-prefix}-beer:before { content: @fa-var-beer; }
|
||||||
|
.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; }
|
||||||
|
.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; }
|
||||||
|
.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; }
|
||||||
|
.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; }
|
||||||
|
.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; }
|
||||||
|
.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; }
|
||||||
|
.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; }
|
||||||
|
.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; }
|
||||||
|
.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; }
|
||||||
|
.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; }
|
||||||
|
.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; }
|
||||||
|
.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; }
|
||||||
|
.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; }
|
||||||
|
.@{fa-css-prefix}-mobile-phone:before,
|
||||||
|
.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; }
|
||||||
|
.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; }
|
||||||
|
.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; }
|
||||||
|
.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; }
|
||||||
|
.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; }
|
||||||
|
.@{fa-css-prefix}-circle:before { content: @fa-var-circle; }
|
||||||
|
.@{fa-css-prefix}-mail-reply:before,
|
||||||
|
.@{fa-css-prefix}-reply:before { content: @fa-var-reply; }
|
||||||
|
.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; }
|
||||||
|
.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; }
|
||||||
|
.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; }
|
||||||
|
.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; }
|
||||||
|
.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; }
|
||||||
|
.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; }
|
||||||
|
.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; }
|
||||||
|
.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; }
|
||||||
|
.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; }
|
||||||
|
.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; }
|
||||||
|
.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; }
|
||||||
|
.@{fa-css-prefix}-code:before { content: @fa-var-code; }
|
||||||
|
.@{fa-css-prefix}-mail-reply-all:before,
|
||||||
|
.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; }
|
||||||
|
.@{fa-css-prefix}-star-half-empty:before,
|
||||||
|
.@{fa-css-prefix}-star-half-full:before,
|
||||||
|
.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; }
|
||||||
|
.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; }
|
||||||
|
.@{fa-css-prefix}-crop:before { content: @fa-var-crop; }
|
||||||
|
.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; }
|
||||||
|
.@{fa-css-prefix}-unlink:before,
|
||||||
|
.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; }
|
||||||
|
.@{fa-css-prefix}-question:before { content: @fa-var-question; }
|
||||||
|
.@{fa-css-prefix}-info:before { content: @fa-var-info; }
|
||||||
|
.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; }
|
||||||
|
.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; }
|
||||||
|
.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; }
|
||||||
|
.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; }
|
||||||
|
.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; }
|
||||||
|
.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; }
|
||||||
|
.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; }
|
||||||
|
.@{fa-css-prefix}-shield:before { content: @fa-var-shield; }
|
||||||
|
.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; }
|
||||||
|
.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; }
|
||||||
|
.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; }
|
||||||
|
.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; }
|
||||||
|
.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; }
|
||||||
|
.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; }
|
||||||
|
.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; }
|
||||||
|
.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; }
|
||||||
|
.@{fa-css-prefix}-html5:before { content: @fa-var-html5; }
|
||||||
|
.@{fa-css-prefix}-css3:before { content: @fa-var-css3; }
|
||||||
|
.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; }
|
||||||
|
.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; }
|
||||||
|
.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; }
|
||||||
|
.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; }
|
||||||
|
.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; }
|
||||||
|
.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; }
|
||||||
|
.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; }
|
||||||
|
.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; }
|
||||||
|
.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; }
|
||||||
|
.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; }
|
||||||
|
.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; }
|
||||||
|
.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; }
|
||||||
|
.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; }
|
||||||
|
.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; }
|
||||||
|
.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; }
|
||||||
|
.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; }
|
||||||
|
.@{fa-css-prefix}-compass:before { content: @fa-var-compass; }
|
||||||
|
.@{fa-css-prefix}-toggle-down:before,
|
||||||
|
.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; }
|
||||||
|
.@{fa-css-prefix}-toggle-up:before,
|
||||||
|
.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; }
|
||||||
|
.@{fa-css-prefix}-toggle-right:before,
|
||||||
|
.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; }
|
||||||
|
.@{fa-css-prefix}-euro:before,
|
||||||
|
.@{fa-css-prefix}-eur:before { content: @fa-var-eur; }
|
||||||
|
.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; }
|
||||||
|
.@{fa-css-prefix}-dollar:before,
|
||||||
|
.@{fa-css-prefix}-usd:before { content: @fa-var-usd; }
|
||||||
|
.@{fa-css-prefix}-rupee:before,
|
||||||
|
.@{fa-css-prefix}-inr:before { content: @fa-var-inr; }
|
||||||
|
.@{fa-css-prefix}-cny:before,
|
||||||
|
.@{fa-css-prefix}-rmb:before,
|
||||||
|
.@{fa-css-prefix}-yen:before,
|
||||||
|
.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; }
|
||||||
|
.@{fa-css-prefix}-ruble:before,
|
||||||
|
.@{fa-css-prefix}-rouble:before,
|
||||||
|
.@{fa-css-prefix}-rub:before { content: @fa-var-rub; }
|
||||||
|
.@{fa-css-prefix}-won:before,
|
||||||
|
.@{fa-css-prefix}-krw:before { content: @fa-var-krw; }
|
||||||
|
.@{fa-css-prefix}-bitcoin:before,
|
||||||
|
.@{fa-css-prefix}-btc:before { content: @fa-var-btc; }
|
||||||
|
.@{fa-css-prefix}-file:before { content: @fa-var-file; }
|
||||||
|
.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; }
|
||||||
|
.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; }
|
||||||
|
.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; }
|
||||||
|
.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; }
|
||||||
|
.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; }
|
||||||
|
.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; }
|
||||||
|
.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; }
|
||||||
|
.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; }
|
||||||
|
.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; }
|
||||||
|
.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; }
|
||||||
|
.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; }
|
||||||
|
.@{fa-css-prefix}-xing:before { content: @fa-var-xing; }
|
||||||
|
.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; }
|
||||||
|
.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; }
|
||||||
|
.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; }
|
||||||
|
.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; }
|
||||||
|
.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; }
|
||||||
|
.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; }
|
||||||
|
.@{fa-css-prefix}-adn:before { content: @fa-var-adn; }
|
||||||
|
.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; }
|
||||||
|
.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; }
|
||||||
|
.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; }
|
||||||
|
.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; }
|
||||||
|
.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; }
|
||||||
|
.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; }
|
||||||
|
.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; }
|
||||||
|
.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; }
|
||||||
|
.@{fa-css-prefix}-apple:before { content: @fa-var-apple; }
|
||||||
|
.@{fa-css-prefix}-windows:before { content: @fa-var-windows; }
|
||||||
|
.@{fa-css-prefix}-android:before { content: @fa-var-android; }
|
||||||
|
.@{fa-css-prefix}-linux:before { content: @fa-var-linux; }
|
||||||
|
.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; }
|
||||||
|
.@{fa-css-prefix}-skype:before { content: @fa-var-skype; }
|
||||||
|
.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; }
|
||||||
|
.@{fa-css-prefix}-trello:before { content: @fa-var-trello; }
|
||||||
|
.@{fa-css-prefix}-female:before { content: @fa-var-female; }
|
||||||
|
.@{fa-css-prefix}-male:before { content: @fa-var-male; }
|
||||||
|
.@{fa-css-prefix}-gittip:before { content: @fa-var-gittip; }
|
||||||
|
.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; }
|
||||||
|
.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; }
|
||||||
|
.@{fa-css-prefix}-archive:before { content: @fa-var-archive; }
|
||||||
|
.@{fa-css-prefix}-bug:before { content: @fa-var-bug; }
|
||||||
|
.@{fa-css-prefix}-vk:before { content: @fa-var-vk; }
|
||||||
|
.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; }
|
||||||
|
.@{fa-css-prefix}-renren:before { content: @fa-var-renren; }
|
||||||
|
.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; }
|
||||||
|
.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; }
|
||||||
|
.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; }
|
||||||
|
.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; }
|
||||||
|
.@{fa-css-prefix}-toggle-left:before,
|
||||||
|
.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; }
|
||||||
|
.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; }
|
||||||
|
.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; }
|
||||||
|
.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; }
|
||||||
|
.@{fa-css-prefix}-turkish-lira:before,
|
||||||
|
.@{fa-css-prefix}-try:before { content: @fa-var-try; }
|
||||||
|
.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; }
|
||||||
|
.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; }
|
||||||
|
.@{fa-css-prefix}-slack:before { content: @fa-var-slack; }
|
||||||
|
.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; }
|
||||||
|
.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; }
|
||||||
|
.@{fa-css-prefix}-openid:before { content: @fa-var-openid; }
|
||||||
|
.@{fa-css-prefix}-institution:before,
|
||||||
|
.@{fa-css-prefix}-bank:before,
|
||||||
|
.@{fa-css-prefix}-university:before { content: @fa-var-university; }
|
||||||
|
.@{fa-css-prefix}-mortar-board:before,
|
||||||
|
.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; }
|
||||||
|
.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; }
|
||||||
|
.@{fa-css-prefix}-google:before { content: @fa-var-google; }
|
||||||
|
.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; }
|
||||||
|
.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; }
|
||||||
|
.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; }
|
||||||
|
.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; }
|
||||||
|
.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; }
|
||||||
|
.@{fa-css-prefix}-digg:before { content: @fa-var-digg; }
|
||||||
|
.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; }
|
||||||
|
.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; }
|
||||||
|
.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; }
|
||||||
|
.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; }
|
||||||
|
.@{fa-css-prefix}-language:before { content: @fa-var-language; }
|
||||||
|
.@{fa-css-prefix}-fax:before { content: @fa-var-fax; }
|
||||||
|
.@{fa-css-prefix}-building:before { content: @fa-var-building; }
|
||||||
|
.@{fa-css-prefix}-child:before { content: @fa-var-child; }
|
||||||
|
.@{fa-css-prefix}-paw:before { content: @fa-var-paw; }
|
||||||
|
.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; }
|
||||||
|
.@{fa-css-prefix}-cube:before { content: @fa-var-cube; }
|
||||||
|
.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; }
|
||||||
|
.@{fa-css-prefix}-behance:before { content: @fa-var-behance; }
|
||||||
|
.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; }
|
||||||
|
.@{fa-css-prefix}-steam:before { content: @fa-var-steam; }
|
||||||
|
.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; }
|
||||||
|
.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; }
|
||||||
|
.@{fa-css-prefix}-automobile:before,
|
||||||
|
.@{fa-css-prefix}-car:before { content: @fa-var-car; }
|
||||||
|
.@{fa-css-prefix}-cab:before,
|
||||||
|
.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; }
|
||||||
|
.@{fa-css-prefix}-tree:before { content: @fa-var-tree; }
|
||||||
|
.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; }
|
||||||
|
.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; }
|
||||||
|
.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; }
|
||||||
|
.@{fa-css-prefix}-database:before { content: @fa-var-database; }
|
||||||
|
.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; }
|
||||||
|
.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; }
|
||||||
|
.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; }
|
||||||
|
.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; }
|
||||||
|
.@{fa-css-prefix}-file-photo-o:before,
|
||||||
|
.@{fa-css-prefix}-file-picture-o:before,
|
||||||
|
.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; }
|
||||||
|
.@{fa-css-prefix}-file-zip-o:before,
|
||||||
|
.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; }
|
||||||
|
.@{fa-css-prefix}-file-sound-o:before,
|
||||||
|
.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; }
|
||||||
|
.@{fa-css-prefix}-file-movie-o:before,
|
||||||
|
.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; }
|
||||||
|
.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; }
|
||||||
|
.@{fa-css-prefix}-vine:before { content: @fa-var-vine; }
|
||||||
|
.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; }
|
||||||
|
.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; }
|
||||||
|
.@{fa-css-prefix}-life-bouy:before,
|
||||||
|
.@{fa-css-prefix}-life-buoy:before,
|
||||||
|
.@{fa-css-prefix}-life-saver:before,
|
||||||
|
.@{fa-css-prefix}-support:before,
|
||||||
|
.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; }
|
||||||
|
.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; }
|
||||||
|
.@{fa-css-prefix}-ra:before,
|
||||||
|
.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; }
|
||||||
|
.@{fa-css-prefix}-ge:before,
|
||||||
|
.@{fa-css-prefix}-empire:before { content: @fa-var-empire; }
|
||||||
|
.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; }
|
||||||
|
.@{fa-css-prefix}-git:before { content: @fa-var-git; }
|
||||||
|
.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; }
|
||||||
|
.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; }
|
||||||
|
.@{fa-css-prefix}-qq:before { content: @fa-var-qq; }
|
||||||
|
.@{fa-css-prefix}-wechat:before,
|
||||||
|
.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; }
|
||||||
|
.@{fa-css-prefix}-send:before,
|
||||||
|
.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; }
|
||||||
|
.@{fa-css-prefix}-send-o:before,
|
||||||
|
.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; }
|
||||||
|
.@{fa-css-prefix}-history:before { content: @fa-var-history; }
|
||||||
|
.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; }
|
||||||
|
.@{fa-css-prefix}-header:before { content: @fa-var-header; }
|
||||||
|
.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; }
|
||||||
|
.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; }
|
||||||
|
.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; }
|
||||||
|
.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; }
|
||||||
|
.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; }
|
||||||
|
.@{fa-css-prefix}-soccer-ball-o:before,
|
||||||
|
.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; }
|
||||||
|
.@{fa-css-prefix}-tty:before { content: @fa-var-tty; }
|
||||||
|
.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; }
|
||||||
|
.@{fa-css-prefix}-plug:before { content: @fa-var-plug; }
|
||||||
|
.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; }
|
||||||
|
.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; }
|
||||||
|
.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; }
|
||||||
|
.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; }
|
||||||
|
.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; }
|
||||||
|
.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; }
|
||||||
|
.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; }
|
||||||
|
.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; }
|
||||||
|
.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; }
|
||||||
|
.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; }
|
||||||
|
.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; }
|
||||||
|
.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; }
|
||||||
|
.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; }
|
||||||
|
.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; }
|
||||||
|
.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; }
|
||||||
|
.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; }
|
||||||
|
.@{fa-css-prefix}-trash:before { content: @fa-var-trash; }
|
||||||
|
.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; }
|
||||||
|
.@{fa-css-prefix}-at:before { content: @fa-var-at; }
|
||||||
|
.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; }
|
||||||
|
.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; }
|
||||||
|
.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; }
|
||||||
|
.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; }
|
||||||
|
.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; }
|
||||||
|
.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; }
|
||||||
|
.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; }
|
||||||
|
.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; }
|
||||||
|
.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; }
|
||||||
|
.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; }
|
||||||
|
.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; }
|
||||||
|
.@{fa-css-prefix}-bus:before { content: @fa-var-bus; }
|
||||||
|
.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; }
|
||||||
|
.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; }
|
||||||
|
.@{fa-css-prefix}-cc:before { content: @fa-var-cc; }
|
||||||
|
.@{fa-css-prefix}-shekel:before,
|
||||||
|
.@{fa-css-prefix}-sheqel:before,
|
||||||
|
.@{fa-css-prefix}-ils:before { content: @fa-var-ils; }
|
||||||
|
.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; }
|
13
hosting/static/hosting/font-awesome/less/larger.less
vendored
Executable file
|
@ -0,0 +1,13 @@
|
||||||
|
// Icon Sizes
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
/* makes the font 33% larger relative to the icon container */
|
||||||
|
.@{fa-css-prefix}-lg {
|
||||||
|
font-size: (4em / 3);
|
||||||
|
line-height: (3em / 4);
|
||||||
|
vertical-align: -15%;
|
||||||
|
}
|
||||||
|
.@{fa-css-prefix}-2x { font-size: 2em; }
|
||||||
|
.@{fa-css-prefix}-3x { font-size: 3em; }
|
||||||
|
.@{fa-css-prefix}-4x { font-size: 4em; }
|
||||||
|
.@{fa-css-prefix}-5x { font-size: 5em; }
|
19
hosting/static/hosting/font-awesome/less/list.less
vendored
Executable file
|
@ -0,0 +1,19 @@
|
||||||
|
// List Icons
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
.@{fa-css-prefix}-ul {
|
||||||
|
padding-left: 0;
|
||||||
|
margin-left: @fa-li-width;
|
||||||
|
list-style-type: none;
|
||||||
|
> li { position: relative; }
|
||||||
|
}
|
||||||
|
.@{fa-css-prefix}-li {
|
||||||
|
position: absolute;
|
||||||
|
left: -@fa-li-width;
|
||||||
|
width: @fa-li-width;
|
||||||
|
top: (2em / 14);
|
||||||
|
text-align: center;
|
||||||
|
&.@{fa-css-prefix}-lg {
|
||||||
|
left: (-@fa-li-width + (4em / 14));
|
||||||
|
}
|
||||||
|
}
|
25
hosting/static/hosting/font-awesome/less/mixins.less
vendored
Executable file
|
@ -0,0 +1,25 @@
|
||||||
|
// Mixins
|
||||||
|
// --------------------------
|
||||||
|
|
||||||
|
.fa-icon() {
|
||||||
|
display: inline-block;
|
||||||
|
font: normal normal normal 14px/1 FontAwesome; // shortening font declaration
|
||||||
|
font-size: inherit; // can't have font-size inherit on line above, so need to override
|
||||||
|
text-rendering: auto; // optimizelegibility throws things off #1094
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fa-icon-rotate(@degrees, @rotation) {
|
||||||
|
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation);
|
||||||
|
-webkit-transform: rotate(@degrees);
|
||||||
|
-ms-transform: rotate(@degrees);
|
||||||
|
transform: rotate(@degrees);
|
||||||
|
}
|
||||||
|
|
||||||
|
.fa-icon-flip(@horiz, @vert, @rotation) {
|
||||||
|
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1);
|
||||||
|
-webkit-transform: scale(@horiz, @vert);
|
||||||
|
-ms-transform: scale(@horiz, @vert);
|
||||||
|
transform: scale(@horiz, @vert);
|
||||||
|
}
|
14
hosting/static/hosting/font-awesome/less/path.less
vendored
Executable file
|
@ -0,0 +1,14 @@
|
||||||
|
/* FONT PATH
|
||||||
|
* -------------------------- */
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'FontAwesome';
|
||||||
|
src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
|
||||||
|
src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),
|
||||||
|
url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
|
||||||
|
url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),
|
||||||
|
url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');
|
||||||
|
// src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
20
hosting/static/hosting/font-awesome/less/rotated-flipped.less
vendored
Executable file
|
@ -0,0 +1,20 @@
|
||||||
|
// Rotated & Flipped Icons
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); }
|
||||||
|
.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
|
||||||
|
.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
|
||||||
|
|
||||||
|
.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
|
||||||
|
.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); }
|
||||||
|
|
||||||
|
// Hook for IE8-9
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
:root .@{fa-css-prefix}-rotate-90,
|
||||||
|
:root .@{fa-css-prefix}-rotate-180,
|
||||||
|
:root .@{fa-css-prefix}-rotate-270,
|
||||||
|
:root .@{fa-css-prefix}-flip-horizontal,
|
||||||
|
:root .@{fa-css-prefix}-flip-vertical {
|
||||||
|
filter: none;
|
||||||
|
}
|
29
hosting/static/hosting/font-awesome/less/spinning.less
vendored
Executable file
|
@ -0,0 +1,29 @@
|
||||||
|
// Spinning Icons
|
||||||
|
// --------------------------
|
||||||
|
|
||||||
|
.@{fa-css-prefix}-spin {
|
||||||
|
-webkit-animation: fa-spin 2s infinite linear;
|
||||||
|
animation: fa-spin 2s infinite linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
@-webkit-keyframes fa-spin {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotate(359deg);
|
||||||
|
transform: rotate(359deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fa-spin {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotate(359deg);
|
||||||
|
transform: rotate(359deg);
|
||||||
|
}
|
||||||
|
}
|
20
hosting/static/hosting/font-awesome/less/stacked.less
vendored
Executable file
|
@ -0,0 +1,20 @@
|
||||||
|
// Stacked Icons
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
.@{fa-css-prefix}-stack {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
width: 2em;
|
||||||
|
height: 2em;
|
||||||
|
line-height: 2em;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.@{fa-css-prefix}-stack-1x { line-height: inherit; }
|
||||||
|
.@{fa-css-prefix}-stack-2x { font-size: 2em; }
|
||||||
|
.@{fa-css-prefix}-inverse { color: @fa-inverse; }
|
561
hosting/static/hosting/font-awesome/less/variables.less
vendored
Executable file
|
@ -0,0 +1,561 @@
|
||||||
|
// Variables
|
||||||
|
// --------------------------
|
||||||
|
|
||||||
|
@fa-font-path: "../fonts";
|
||||||
|
//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts"; // for referencing Bootstrap CDN font files directly
|
||||||
|
@fa-css-prefix: fa;
|
||||||
|
@fa-version: "4.2.0";
|
||||||
|
@fa-border-color: #eee;
|
||||||
|
@fa-inverse: #fff;
|
||||||
|
@fa-li-width: (30em / 14);
|
||||||
|
|
||||||
|
@fa-var-adjust: "\f042";
|
||||||
|
@fa-var-adn: "\f170";
|
||||||
|
@fa-var-align-center: "\f037";
|
||||||
|
@fa-var-align-justify: "\f039";
|
||||||
|
@fa-var-align-left: "\f036";
|
||||||
|
@fa-var-align-right: "\f038";
|
||||||
|
@fa-var-ambulance: "\f0f9";
|
||||||
|
@fa-var-anchor: "\f13d";
|
||||||
|
@fa-var-android: "\f17b";
|
||||||
|
@fa-var-angellist: "\f209";
|
||||||
|
@fa-var-angle-double-down: "\f103";
|
||||||
|
@fa-var-angle-double-left: "\f100";
|
||||||
|
@fa-var-angle-double-right: "\f101";
|
||||||
|
@fa-var-angle-double-up: "\f102";
|
||||||
|
@fa-var-angle-down: "\f107";
|
||||||
|
@fa-var-angle-left: "\f104";
|
||||||
|
@fa-var-angle-right: "\f105";
|
||||||
|
@fa-var-angle-up: "\f106";
|
||||||
|
@fa-var-apple: "\f179";
|
||||||
|
@fa-var-archive: "\f187";
|
||||||
|
@fa-var-area-chart: "\f1fe";
|
||||||
|
@fa-var-arrow-circle-down: "\f0ab";
|
||||||
|
@fa-var-arrow-circle-left: "\f0a8";
|
||||||
|
@fa-var-arrow-circle-o-down: "\f01a";
|
||||||
|
@fa-var-arrow-circle-o-left: "\f190";
|
||||||
|
@fa-var-arrow-circle-o-right: "\f18e";
|
||||||
|
@fa-var-arrow-circle-o-up: "\f01b";
|
||||||
|
@fa-var-arrow-circle-right: "\f0a9";
|
||||||
|
@fa-var-arrow-circle-up: "\f0aa";
|
||||||
|
@fa-var-arrow-down: "\f063";
|
||||||
|
@fa-var-arrow-left: "\f060";
|
||||||
|
@fa-var-arrow-right: "\f061";
|
||||||
|
@fa-var-arrow-up: "\f062";
|
||||||
|
@fa-var-arrows: "\f047";
|
||||||
|
@fa-var-arrows-alt: "\f0b2";
|
||||||
|
@fa-var-arrows-h: "\f07e";
|
||||||
|
@fa-var-arrows-v: "\f07d";
|
||||||
|
@fa-var-asterisk: "\f069";
|
||||||
|
@fa-var-at: "\f1fa";
|
||||||
|
@fa-var-automobile: "\f1b9";
|
||||||
|
@fa-var-backward: "\f04a";
|
||||||
|
@fa-var-ban: "\f05e";
|
||||||
|
@fa-var-bank: "\f19c";
|
||||||
|
@fa-var-bar-chart: "\f080";
|
||||||
|
@fa-var-bar-chart-o: "\f080";
|
||||||
|
@fa-var-barcode: "\f02a";
|
||||||
|
@fa-var-bars: "\f0c9";
|
||||||
|
@fa-var-beer: "\f0fc";
|
||||||
|
@fa-var-behance: "\f1b4";
|
||||||
|
@fa-var-behance-square: "\f1b5";
|
||||||
|
@fa-var-bell: "\f0f3";
|
||||||
|
@fa-var-bell-o: "\f0a2";
|
||||||
|
@fa-var-bell-slash: "\f1f6";
|
||||||
|
@fa-var-bell-slash-o: "\f1f7";
|
||||||
|
@fa-var-bicycle: "\f206";
|
||||||
|
@fa-var-binoculars: "\f1e5";
|
||||||
|
@fa-var-birthday-cake: "\f1fd";
|
||||||
|
@fa-var-bitbucket: "\f171";
|
||||||
|
@fa-var-bitbucket-square: "\f172";
|
||||||
|
@fa-var-bitcoin: "\f15a";
|
||||||
|
@fa-var-bold: "\f032";
|
||||||
|
@fa-var-bolt: "\f0e7";
|
||||||
|
@fa-var-bomb: "\f1e2";
|
||||||
|
@fa-var-book: "\f02d";
|
||||||
|
@fa-var-bookmark: "\f02e";
|
||||||
|
@fa-var-bookmark-o: "\f097";
|
||||||
|
@fa-var-briefcase: "\f0b1";
|
||||||
|
@fa-var-btc: "\f15a";
|
||||||
|
@fa-var-bug: "\f188";
|
||||||
|
@fa-var-building: "\f1ad";
|
||||||
|
@fa-var-building-o: "\f0f7";
|
||||||
|
@fa-var-bullhorn: "\f0a1";
|
||||||
|
@fa-var-bullseye: "\f140";
|
||||||
|
@fa-var-bus: "\f207";
|
||||||
|
@fa-var-cab: "\f1ba";
|
||||||
|
@fa-var-calculator: "\f1ec";
|
||||||
|
@fa-var-calendar: "\f073";
|
||||||
|
@fa-var-calendar-o: "\f133";
|
||||||
|
@fa-var-camera: "\f030";
|
||||||
|
@fa-var-camera-retro: "\f083";
|
||||||
|
@fa-var-car: "\f1b9";
|
||||||
|
@fa-var-caret-down: "\f0d7";
|
||||||
|
@fa-var-caret-left: "\f0d9";
|
||||||
|
@fa-var-caret-right: "\f0da";
|
||||||
|
@fa-var-caret-square-o-down: "\f150";
|
||||||
|
@fa-var-caret-square-o-left: "\f191";
|
||||||
|
@fa-var-caret-square-o-right: "\f152";
|
||||||
|
@fa-var-caret-square-o-up: "\f151";
|
||||||
|
@fa-var-caret-up: "\f0d8";
|
||||||
|
@fa-var-cc: "\f20a";
|
||||||
|
@fa-var-cc-amex: "\f1f3";
|
||||||
|
@fa-var-cc-discover: "\f1f2";
|
||||||
|
@fa-var-cc-mastercard: "\f1f1";
|
||||||
|
@fa-var-cc-paypal: "\f1f4";
|
||||||
|
@fa-var-cc-stripe: "\f1f5";
|
||||||
|
@fa-var-cc-visa: "\f1f0";
|
||||||
|
@fa-var-certificate: "\f0a3";
|
||||||
|
@fa-var-chain: "\f0c1";
|
||||||
|
@fa-var-chain-broken: "\f127";
|
||||||
|
@fa-var-check: "\f00c";
|
||||||
|
@fa-var-check-circle: "\f058";
|
||||||
|
@fa-var-check-circle-o: "\f05d";
|
||||||
|
@fa-var-check-square: "\f14a";
|
||||||
|
@fa-var-check-square-o: "\f046";
|
||||||
|
@fa-var-chevron-circle-down: "\f13a";
|
||||||
|
@fa-var-chevron-circle-left: "\f137";
|
||||||
|
@fa-var-chevron-circle-right: "\f138";
|
||||||
|
@fa-var-chevron-circle-up: "\f139";
|
||||||
|
@fa-var-chevron-down: "\f078";
|
||||||
|
@fa-var-chevron-left: "\f053";
|
||||||
|
@fa-var-chevron-right: "\f054";
|
||||||
|
@fa-var-chevron-up: "\f077";
|
||||||
|
@fa-var-child: "\f1ae";
|
||||||
|
@fa-var-circle: "\f111";
|
||||||
|
@fa-var-circle-o: "\f10c";
|
||||||
|
@fa-var-circle-o-notch: "\f1ce";
|
||||||
|
@fa-var-circle-thin: "\f1db";
|
||||||
|
@fa-var-clipboard: "\f0ea";
|
||||||
|
@fa-var-clock-o: "\f017";
|
||||||
|
@fa-var-close: "\f00d";
|
||||||
|
@fa-var-cloud: "\f0c2";
|
||||||
|
@fa-var-cloud-download: "\f0ed";
|
||||||
|
@fa-var-cloud-upload: "\f0ee";
|
||||||
|
@fa-var-cny: "\f157";
|
||||||
|
@fa-var-code: "\f121";
|
||||||
|
@fa-var-code-fork: "\f126";
|
||||||
|
@fa-var-codepen: "\f1cb";
|
||||||
|
@fa-var-coffee: "\f0f4";
|
||||||
|
@fa-var-cog: "\f013";
|
||||||
|
@fa-var-cogs: "\f085";
|
||||||
|
@fa-var-columns: "\f0db";
|
||||||
|
@fa-var-comment: "\f075";
|
||||||
|
@fa-var-comment-o: "\f0e5";
|
||||||
|
@fa-var-comments: "\f086";
|
||||||
|
@fa-var-comments-o: "\f0e6";
|
||||||
|
@fa-var-compass: "\f14e";
|
||||||
|
@fa-var-compress: "\f066";
|
||||||
|
@fa-var-copy: "\f0c5";
|
||||||
|
@fa-var-copyright: "\f1f9";
|
||||||
|
@fa-var-credit-card: "\f09d";
|
||||||
|
@fa-var-crop: "\f125";
|
||||||
|
@fa-var-crosshairs: "\f05b";
|
||||||
|
@fa-var-css3: "\f13c";
|
||||||
|
@fa-var-cube: "\f1b2";
|
||||||
|
@fa-var-cubes: "\f1b3";
|
||||||
|
@fa-var-cut: "\f0c4";
|
||||||
|
@fa-var-cutlery: "\f0f5";
|
||||||
|
@fa-var-dashboard: "\f0e4";
|
||||||
|
@fa-var-database: "\f1c0";
|
||||||
|
@fa-var-dedent: "\f03b";
|
||||||
|
@fa-var-delicious: "\f1a5";
|
||||||
|
@fa-var-desktop: "\f108";
|
||||||
|
@fa-var-deviantart: "\f1bd";
|
||||||
|
@fa-var-digg: "\f1a6";
|
||||||
|
@fa-var-dollar: "\f155";
|
||||||
|
@fa-var-dot-circle-o: "\f192";
|
||||||
|
@fa-var-download: "\f019";
|
||||||
|
@fa-var-dribbble: "\f17d";
|
||||||
|
@fa-var-dropbox: "\f16b";
|
||||||
|
@fa-var-drupal: "\f1a9";
|
||||||
|
@fa-var-edit: "\f044";
|
||||||
|
@fa-var-eject: "\f052";
|
||||||
|
@fa-var-ellipsis-h: "\f141";
|
||||||
|
@fa-var-ellipsis-v: "\f142";
|
||||||
|
@fa-var-empire: "\f1d1";
|
||||||
|
@fa-var-envelope: "\f0e0";
|
||||||
|
@fa-var-envelope-o: "\f003";
|
||||||
|
@fa-var-envelope-square: "\f199";
|
||||||
|
@fa-var-eraser: "\f12d";
|
||||||
|
@fa-var-eur: "\f153";
|
||||||
|
@fa-var-euro: "\f153";
|
||||||
|
@fa-var-exchange: "\f0ec";
|
||||||
|
@fa-var-exclamation: "\f12a";
|
||||||
|
@fa-var-exclamation-circle: "\f06a";
|
||||||
|
@fa-var-exclamation-triangle: "\f071";
|
||||||
|
@fa-var-expand: "\f065";
|
||||||
|
@fa-var-external-link: "\f08e";
|
||||||
|
@fa-var-external-link-square: "\f14c";
|
||||||
|
@fa-var-eye: "\f06e";
|
||||||
|
@fa-var-eye-slash: "\f070";
|
||||||
|
@fa-var-eyedropper: "\f1fb";
|
||||||
|
@fa-var-facebook: "\f09a";
|
||||||
|
@fa-var-facebook-square: "\f082";
|
||||||
|
@fa-var-fast-backward: "\f049";
|
||||||
|
@fa-var-fast-forward: "\f050";
|
||||||
|
@fa-var-fax: "\f1ac";
|
||||||
|
@fa-var-female: "\f182";
|
||||||
|
@fa-var-fighter-jet: "\f0fb";
|
||||||
|
@fa-var-file: "\f15b";
|
||||||
|
@fa-var-file-archive-o: "\f1c6";
|
||||||
|
@fa-var-file-audio-o: "\f1c7";
|
||||||
|
@fa-var-file-code-o: "\f1c9";
|
||||||
|
@fa-var-file-excel-o: "\f1c3";
|
||||||
|
@fa-var-file-image-o: "\f1c5";
|
||||||
|
@fa-var-file-movie-o: "\f1c8";
|
||||||
|
@fa-var-file-o: "\f016";
|
||||||
|
@fa-var-file-pdf-o: "\f1c1";
|
||||||
|
@fa-var-file-photo-o: "\f1c5";
|
||||||
|
@fa-var-file-picture-o: "\f1c5";
|
||||||
|
@fa-var-file-powerpoint-o: "\f1c4";
|
||||||
|
@fa-var-file-sound-o: "\f1c7";
|
||||||
|
@fa-var-file-text: "\f15c";
|
||||||
|
@fa-var-file-text-o: "\f0f6";
|
||||||
|
@fa-var-file-video-o: "\f1c8";
|
||||||
|
@fa-var-file-word-o: "\f1c2";
|
||||||
|
@fa-var-file-zip-o: "\f1c6";
|
||||||
|
@fa-var-files-o: "\f0c5";
|
||||||
|
@fa-var-film: "\f008";
|
||||||
|
@fa-var-filter: "\f0b0";
|
||||||
|
@fa-var-fire: "\f06d";
|
||||||
|
@fa-var-fire-extinguisher: "\f134";
|
||||||
|
@fa-var-flag: "\f024";
|
||||||
|
@fa-var-flag-checkered: "\f11e";
|
||||||
|
@fa-var-flag-o: "\f11d";
|
||||||
|
@fa-var-flash: "\f0e7";
|
||||||
|
@fa-var-flask: "\f0c3";
|
||||||
|
@fa-var-flickr: "\f16e";
|
||||||
|
@fa-var-floppy-o: "\f0c7";
|
||||||
|
@fa-var-folder: "\f07b";
|
||||||
|
@fa-var-folder-o: "\f114";
|
||||||
|
@fa-var-folder-open: "\f07c";
|
||||||
|
@fa-var-folder-open-o: "\f115";
|
||||||
|
@fa-var-font: "\f031";
|
||||||
|
@fa-var-forward: "\f04e";
|
||||||
|
@fa-var-foursquare: "\f180";
|
||||||
|
@fa-var-frown-o: "\f119";
|
||||||
|
@fa-var-futbol-o: "\f1e3";
|
||||||
|
@fa-var-gamepad: "\f11b";
|
||||||
|
@fa-var-gavel: "\f0e3";
|
||||||
|
@fa-var-gbp: "\f154";
|
||||||
|
@fa-var-ge: "\f1d1";
|
||||||
|
@fa-var-gear: "\f013";
|
||||||
|
@fa-var-gears: "\f085";
|
||||||
|
@fa-var-gift: "\f06b";
|
||||||
|
@fa-var-git: "\f1d3";
|
||||||
|
@fa-var-git-square: "\f1d2";
|
||||||
|
@fa-var-github: "\f09b";
|
||||||
|
@fa-var-github-alt: "\f113";
|
||||||
|
@fa-var-github-square: "\f092";
|
||||||
|
@fa-var-gittip: "\f184";
|
||||||
|
@fa-var-glass: "\f000";
|
||||||
|
@fa-var-globe: "\f0ac";
|
||||||
|
@fa-var-google: "\f1a0";
|
||||||
|
@fa-var-google-plus: "\f0d5";
|
||||||
|
@fa-var-google-plus-square: "\f0d4";
|
||||||
|
@fa-var-google-wallet: "\f1ee";
|
||||||
|
@fa-var-graduation-cap: "\f19d";
|
||||||
|
@fa-var-group: "\f0c0";
|
||||||
|
@fa-var-h-square: "\f0fd";
|
||||||
|
@fa-var-hacker-news: "\f1d4";
|
||||||
|
@fa-var-hand-o-down: "\f0a7";
|
||||||
|
@fa-var-hand-o-left: "\f0a5";
|
||||||
|
@fa-var-hand-o-right: "\f0a4";
|
||||||
|
@fa-var-hand-o-up: "\f0a6";
|
||||||
|
@fa-var-hdd-o: "\f0a0";
|
||||||
|
@fa-var-header: "\f1dc";
|
||||||
|
@fa-var-headphones: "\f025";
|
||||||
|
@fa-var-heart: "\f004";
|
||||||
|
@fa-var-heart-o: "\f08a";
|
||||||
|
@fa-var-history: "\f1da";
|
||||||
|
@fa-var-home: "\f015";
|
||||||
|
@fa-var-hospital-o: "\f0f8";
|
||||||
|
@fa-var-html5: "\f13b";
|
||||||
|
@fa-var-ils: "\f20b";
|
||||||
|
@fa-var-image: "\f03e";
|
||||||
|
@fa-var-inbox: "\f01c";
|
||||||
|
@fa-var-indent: "\f03c";
|
||||||
|
@fa-var-info: "\f129";
|
||||||
|
@fa-var-info-circle: "\f05a";
|
||||||
|
@fa-var-inr: "\f156";
|
||||||
|
@fa-var-instagram: "\f16d";
|
||||||
|
@fa-var-institution: "\f19c";
|
||||||
|
@fa-var-ioxhost: "\f208";
|
||||||
|
@fa-var-italic: "\f033";
|
||||||
|
@fa-var-joomla: "\f1aa";
|
||||||
|
@fa-var-jpy: "\f157";
|
||||||
|
@fa-var-jsfiddle: "\f1cc";
|
||||||
|
@fa-var-key: "\f084";
|
||||||
|
@fa-var-keyboard-o: "\f11c";
|
||||||
|
@fa-var-krw: "\f159";
|
||||||
|
@fa-var-language: "\f1ab";
|
||||||
|
@fa-var-laptop: "\f109";
|
||||||
|
@fa-var-lastfm: "\f202";
|
||||||
|
@fa-var-lastfm-square: "\f203";
|
||||||
|
@fa-var-leaf: "\f06c";
|
||||||
|
@fa-var-legal: "\f0e3";
|
||||||
|
@fa-var-lemon-o: "\f094";
|
||||||
|
@fa-var-level-down: "\f149";
|
||||||
|
@fa-var-level-up: "\f148";
|
||||||
|
@fa-var-life-bouy: "\f1cd";
|
||||||
|
@fa-var-life-buoy: "\f1cd";
|
||||||
|
@fa-var-life-ring: "\f1cd";
|
||||||
|
@fa-var-life-saver: "\f1cd";
|
||||||
|
@fa-var-lightbulb-o: "\f0eb";
|
||||||
|
@fa-var-line-chart: "\f201";
|
||||||
|
@fa-var-link: "\f0c1";
|
||||||
|
@fa-var-linkedin: "\f0e1";
|
||||||
|
@fa-var-linkedin-square: "\f08c";
|
||||||
|
@fa-var-linux: "\f17c";
|
||||||
|
@fa-var-list: "\f03a";
|
||||||
|
@fa-var-list-alt: "\f022";
|
||||||
|
@fa-var-list-ol: "\f0cb";
|
||||||
|
@fa-var-list-ul: "\f0ca";
|
||||||
|
@fa-var-location-arrow: "\f124";
|
||||||
|
@fa-var-lock: "\f023";
|
||||||
|
@fa-var-long-arrow-down: "\f175";
|
||||||
|
@fa-var-long-arrow-left: "\f177";
|
||||||
|
@fa-var-long-arrow-right: "\f178";
|
||||||
|
@fa-var-long-arrow-up: "\f176";
|
||||||
|
@fa-var-magic: "\f0d0";
|
||||||
|
@fa-var-magnet: "\f076";
|
||||||
|
@fa-var-mail-forward: "\f064";
|
||||||
|
@fa-var-mail-reply: "\f112";
|
||||||
|
@fa-var-mail-reply-all: "\f122";
|
||||||
|
@fa-var-male: "\f183";
|
||||||
|
@fa-var-map-marker: "\f041";
|
||||||
|
@fa-var-maxcdn: "\f136";
|
||||||
|
@fa-var-meanpath: "\f20c";
|
||||||
|
@fa-var-medkit: "\f0fa";
|
||||||
|
@fa-var-meh-o: "\f11a";
|
||||||
|
@fa-var-microphone: "\f130";
|
||||||
|
@fa-var-microphone-slash: "\f131";
|
||||||
|
@fa-var-minus: "\f068";
|
||||||
|
@fa-var-minus-circle: "\f056";
|
||||||
|
@fa-var-minus-square: "\f146";
|
||||||
|
@fa-var-minus-square-o: "\f147";
|
||||||
|
@fa-var-mobile: "\f10b";
|
||||||
|
@fa-var-mobile-phone: "\f10b";
|
||||||
|
@fa-var-money: "\f0d6";
|
||||||
|
@fa-var-moon-o: "\f186";
|
||||||
|
@fa-var-mortar-board: "\f19d";
|
||||||
|
@fa-var-music: "\f001";
|
||||||
|
@fa-var-navicon: "\f0c9";
|
||||||
|
@fa-var-newspaper-o: "\f1ea";
|
||||||
|
@fa-var-openid: "\f19b";
|
||||||
|
@fa-var-outdent: "\f03b";
|
||||||
|
@fa-var-pagelines: "\f18c";
|
||||||
|
@fa-var-paint-brush: "\f1fc";
|
||||||
|
@fa-var-paper-plane: "\f1d8";
|
||||||
|
@fa-var-paper-plane-o: "\f1d9";
|
||||||
|
@fa-var-paperclip: "\f0c6";
|
||||||
|
@fa-var-paragraph: "\f1dd";
|
||||||
|
@fa-var-paste: "\f0ea";
|
||||||
|
@fa-var-pause: "\f04c";
|
||||||
|
@fa-var-paw: "\f1b0";
|
||||||
|
@fa-var-paypal: "\f1ed";
|
||||||
|
@fa-var-pencil: "\f040";
|
||||||
|
@fa-var-pencil-square: "\f14b";
|
||||||
|
@fa-var-pencil-square-o: "\f044";
|
||||||
|
@fa-var-phone: "\f095";
|
||||||
|
@fa-var-phone-square: "\f098";
|
||||||
|
@fa-var-photo: "\f03e";
|
||||||
|
@fa-var-picture-o: "\f03e";
|
||||||
|
@fa-var-pie-chart: "\f200";
|
||||||
|
@fa-var-pied-piper: "\f1a7";
|
||||||
|
@fa-var-pied-piper-alt: "\f1a8";
|
||||||
|
@fa-var-pinterest: "\f0d2";
|
||||||
|
@fa-var-pinterest-square: "\f0d3";
|
||||||
|
@fa-var-plane: "\f072";
|
||||||
|
@fa-var-play: "\f04b";
|
||||||
|
@fa-var-play-circle: "\f144";
|
||||||
|
@fa-var-play-circle-o: "\f01d";
|
||||||
|
@fa-var-plug: "\f1e6";
|
||||||
|
@fa-var-plus: "\f067";
|
||||||
|
@fa-var-plus-circle: "\f055";
|
||||||
|
@fa-var-plus-square: "\f0fe";
|
||||||
|
@fa-var-plus-square-o: "\f196";
|
||||||
|
@fa-var-power-off: "\f011";
|
||||||
|
@fa-var-print: "\f02f";
|
||||||
|
@fa-var-puzzle-piece: "\f12e";
|
||||||
|
@fa-var-qq: "\f1d6";
|
||||||
|
@fa-var-qrcode: "\f029";
|
||||||
|
@fa-var-question: "\f128";
|
||||||
|
@fa-var-question-circle: "\f059";
|
||||||
|
@fa-var-quote-left: "\f10d";
|
||||||
|
@fa-var-quote-right: "\f10e";
|
||||||
|
@fa-var-ra: "\f1d0";
|
||||||
|
@fa-var-random: "\f074";
|
||||||
|
@fa-var-rebel: "\f1d0";
|
||||||
|
@fa-var-recycle: "\f1b8";
|
||||||
|
@fa-var-reddit: "\f1a1";
|
||||||
|
@fa-var-reddit-square: "\f1a2";
|
||||||
|
@fa-var-refresh: "\f021";
|
||||||
|
@fa-var-remove: "\f00d";
|
||||||
|
@fa-var-renren: "\f18b";
|
||||||
|
@fa-var-reorder: "\f0c9";
|
||||||
|
@fa-var-repeat: "\f01e";
|
||||||
|
@fa-var-reply: "\f112";
|
||||||
|
@fa-var-reply-all: "\f122";
|
||||||
|
@fa-var-retweet: "\f079";
|
||||||
|
@fa-var-rmb: "\f157";
|
||||||
|
@fa-var-road: "\f018";
|
||||||
|
@fa-var-rocket: "\f135";
|
||||||
|
@fa-var-rotate-left: "\f0e2";
|
||||||
|
@fa-var-rotate-right: "\f01e";
|
||||||
|
@fa-var-rouble: "\f158";
|
||||||
|
@fa-var-rss: "\f09e";
|
||||||
|
@fa-var-rss-square: "\f143";
|
||||||
|
@fa-var-rub: "\f158";
|
||||||
|
@fa-var-ruble: "\f158";
|
||||||
|
@fa-var-rupee: "\f156";
|
||||||
|
@fa-var-save: "\f0c7";
|
||||||
|
@fa-var-scissors: "\f0c4";
|
||||||
|
@fa-var-search: "\f002";
|
||||||
|
@fa-var-search-minus: "\f010";
|
||||||
|
@fa-var-search-plus: "\f00e";
|
||||||
|
@fa-var-send: "\f1d8";
|
||||||
|
@fa-var-send-o: "\f1d9";
|
||||||
|
@fa-var-share: "\f064";
|
||||||
|
@fa-var-share-alt: "\f1e0";
|
||||||
|
@fa-var-share-alt-square: "\f1e1";
|
||||||
|
@fa-var-share-square: "\f14d";
|
||||||
|
@fa-var-share-square-o: "\f045";
|
||||||
|
@fa-var-shekel: "\f20b";
|
||||||
|
@fa-var-sheqel: "\f20b";
|
||||||
|
@fa-var-shield: "\f132";
|
||||||
|
@fa-var-shopping-cart: "\f07a";
|
||||||
|
@fa-var-sign-in: "\f090";
|
||||||
|
@fa-var-sign-out: "\f08b";
|
||||||
|
@fa-var-signal: "\f012";
|
||||||
|
@fa-var-sitemap: "\f0e8";
|
||||||
|
@fa-var-skype: "\f17e";
|
||||||
|
@fa-var-slack: "\f198";
|
||||||
|
@fa-var-sliders: "\f1de";
|
||||||
|
@fa-var-slideshare: "\f1e7";
|
||||||
|
@fa-var-smile-o: "\f118";
|
||||||
|
@fa-var-soccer-ball-o: "\f1e3";
|
||||||
|
@fa-var-sort: "\f0dc";
|
||||||
|
@fa-var-sort-alpha-asc: "\f15d";
|
||||||
|
@fa-var-sort-alpha-desc: "\f15e";
|
||||||
|
@fa-var-sort-amount-asc: "\f160";
|
||||||
|
@fa-var-sort-amount-desc: "\f161";
|
||||||
|
@fa-var-sort-asc: "\f0de";
|
||||||
|
@fa-var-sort-desc: "\f0dd";
|
||||||
|
@fa-var-sort-down: "\f0dd";
|
||||||
|
@fa-var-sort-numeric-asc: "\f162";
|
||||||
|
@fa-var-sort-numeric-desc: "\f163";
|
||||||
|
@fa-var-sort-up: "\f0de";
|
||||||
|
@fa-var-soundcloud: "\f1be";
|
||||||
|
@fa-var-space-shuttle: "\f197";
|
||||||
|
@fa-var-spinner: "\f110";
|
||||||
|
@fa-var-spoon: "\f1b1";
|
||||||
|
@fa-var-spotify: "\f1bc";
|
||||||
|
@fa-var-square: "\f0c8";
|
||||||
|
@fa-var-square-o: "\f096";
|
||||||
|
@fa-var-stack-exchange: "\f18d";
|
||||||
|
@fa-var-stack-overflow: "\f16c";
|
||||||
|
@fa-var-star: "\f005";
|
||||||
|
@fa-var-star-half: "\f089";
|
||||||
|
@fa-var-star-half-empty: "\f123";
|
||||||
|
@fa-var-star-half-full: "\f123";
|
||||||
|
@fa-var-star-half-o: "\f123";
|
||||||
|
@fa-var-star-o: "\f006";
|
||||||
|
@fa-var-steam: "\f1b6";
|
||||||
|
@fa-var-steam-square: "\f1b7";
|
||||||
|
@fa-var-step-backward: "\f048";
|
||||||
|
@fa-var-step-forward: "\f051";
|
||||||
|
@fa-var-stethoscope: "\f0f1";
|
||||||
|
@fa-var-stop: "\f04d";
|
||||||
|
@fa-var-strikethrough: "\f0cc";
|
||||||
|
@fa-var-stumbleupon: "\f1a4";
|
||||||
|
@fa-var-stumbleupon-circle: "\f1a3";
|
||||||
|
@fa-var-subscript: "\f12c";
|
||||||
|
@fa-var-suitcase: "\f0f2";
|
||||||
|
@fa-var-sun-o: "\f185";
|
||||||
|
@fa-var-superscript: "\f12b";
|
||||||
|
@fa-var-support: "\f1cd";
|
||||||
|
@fa-var-table: "\f0ce";
|
||||||
|
@fa-var-tablet: "\f10a";
|
||||||
|
@fa-var-tachometer: "\f0e4";
|
||||||
|
@fa-var-tag: "\f02b";
|
||||||
|
@fa-var-tags: "\f02c";
|
||||||
|
@fa-var-tasks: "\f0ae";
|
||||||
|
@fa-var-taxi: "\f1ba";
|
||||||
|
@fa-var-tencent-weibo: "\f1d5";
|
||||||
|
@fa-var-terminal: "\f120";
|
||||||
|
@fa-var-text-height: "\f034";
|
||||||
|
@fa-var-text-width: "\f035";
|
||||||
|
@fa-var-th: "\f00a";
|
||||||
|
@fa-var-th-large: "\f009";
|
||||||
|
@fa-var-th-list: "\f00b";
|
||||||
|
@fa-var-thumb-tack: "\f08d";
|
||||||
|
@fa-var-thumbs-down: "\f165";
|
||||||
|
@fa-var-thumbs-o-down: "\f088";
|
||||||
|
@fa-var-thumbs-o-up: "\f087";
|
||||||
|
@fa-var-thumbs-up: "\f164";
|
||||||
|
@fa-var-ticket: "\f145";
|
||||||
|
@fa-var-times: "\f00d";
|
||||||
|
@fa-var-times-circle: "\f057";
|
||||||
|
@fa-var-times-circle-o: "\f05c";
|
||||||
|
@fa-var-tint: "\f043";
|
||||||
|
@fa-var-toggle-down: "\f150";
|
||||||
|
@fa-var-toggle-left: "\f191";
|
||||||
|
@fa-var-toggle-off: "\f204";
|
||||||
|
@fa-var-toggle-on: "\f205";
|
||||||
|
@fa-var-toggle-right: "\f152";
|
||||||
|
@fa-var-toggle-up: "\f151";
|
||||||
|
@fa-var-trash: "\f1f8";
|
||||||
|
@fa-var-trash-o: "\f014";
|
||||||
|
@fa-var-tree: "\f1bb";
|
||||||
|
@fa-var-trello: "\f181";
|
||||||
|
@fa-var-trophy: "\f091";
|
||||||
|
@fa-var-truck: "\f0d1";
|
||||||
|
@fa-var-try: "\f195";
|
||||||
|
@fa-var-tty: "\f1e4";
|
||||||
|
@fa-var-tumblr: "\f173";
|
||||||
|
@fa-var-tumblr-square: "\f174";
|
||||||
|
@fa-var-turkish-lira: "\f195";
|
||||||
|
@fa-var-twitch: "\f1e8";
|
||||||
|
@fa-var-twitter: "\f099";
|
||||||
|
@fa-var-twitter-square: "\f081";
|
||||||
|
@fa-var-umbrella: "\f0e9";
|
||||||
|
@fa-var-underline: "\f0cd";
|
||||||
|
@fa-var-undo: "\f0e2";
|
||||||
|
@fa-var-university: "\f19c";
|
||||||
|
@fa-var-unlink: "\f127";
|
||||||
|
@fa-var-unlock: "\f09c";
|
||||||
|
@fa-var-unlock-alt: "\f13e";
|
||||||
|
@fa-var-unsorted: "\f0dc";
|
||||||
|
@fa-var-upload: "\f093";
|
||||||
|
@fa-var-usd: "\f155";
|
||||||
|
@fa-var-user: "\f007";
|
||||||
|
@fa-var-user-md: "\f0f0";
|
||||||
|
@fa-var-users: "\f0c0";
|
||||||
|
@fa-var-video-camera: "\f03d";
|
||||||
|
@fa-var-vimeo-square: "\f194";
|
||||||
|
@fa-var-vine: "\f1ca";
|
||||||
|
@fa-var-vk: "\f189";
|
||||||
|
@fa-var-volume-down: "\f027";
|
||||||
|
@fa-var-volume-off: "\f026";
|
||||||
|
@fa-var-volume-up: "\f028";
|
||||||
|
@fa-var-warning: "\f071";
|
||||||
|
@fa-var-wechat: "\f1d7";
|
||||||
|
@fa-var-weibo: "\f18a";
|
||||||
|
@fa-var-weixin: "\f1d7";
|
||||||
|
@fa-var-wheelchair: "\f193";
|
||||||
|
@fa-var-wifi: "\f1eb";
|
||||||
|
@fa-var-windows: "\f17a";
|
||||||
|
@fa-var-won: "\f159";
|
||||||
|
@fa-var-wordpress: "\f19a";
|
||||||
|
@fa-var-wrench: "\f0ad";
|
||||||
|
@fa-var-xing: "\f168";
|
||||||
|
@fa-var-xing-square: "\f169";
|
||||||
|
@fa-var-yahoo: "\f19e";
|
||||||
|
@fa-var-yelp: "\f1e9";
|
||||||
|
@fa-var-yen: "\f157";
|
||||||
|
@fa-var-youtube: "\f167";
|
||||||
|
@fa-var-youtube-play: "\f16a";
|
||||||
|
@fa-var-youtube-square: "\f166";
|
||||||
|
|
16
hosting/static/hosting/font-awesome/scss/_bordered-pulled.scss
vendored
Executable file
|
@ -0,0 +1,16 @@
|
||||||
|
// Bordered & Pulled
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
.#{$fa-css-prefix}-border {
|
||||||
|
padding: .2em .25em .15em;
|
||||||
|
border: solid .08em $fa-border-color;
|
||||||
|
border-radius: .1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pull-right { float: right; }
|
||||||
|
.pull-left { float: left; }
|
||||||
|
|
||||||
|
.#{$fa-css-prefix} {
|
||||||
|
&.pull-left { margin-right: .3em; }
|
||||||
|
&.pull-right { margin-left: .3em; }
|
||||||
|
}
|
11
hosting/static/hosting/font-awesome/scss/_core.scss
vendored
Executable file
|
@ -0,0 +1,11 @@
|
||||||
|
// Base Class Definition
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
.#{$fa-css-prefix} {
|
||||||
|
display: inline-block;
|
||||||
|
font: normal normal normal 14px/1 FontAwesome; // shortening font declaration
|
||||||
|
font-size: inherit; // can't have font-size inherit on line above, so need to override
|
||||||
|
text-rendering: auto; // optimizelegibility throws things off #1094
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
6
hosting/static/hosting/font-awesome/scss/_fixed-width.scss
vendored
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
// Fixed Width Icons
|
||||||
|
// -------------------------
|
||||||
|
.#{$fa-css-prefix}-fw {
|
||||||
|
width: (18em / 14);
|
||||||
|
text-align: center;
|
||||||
|
}
|
552
hosting/static/hosting/font-awesome/scss/_icons.scss
vendored
Executable file
|
@ -0,0 +1,552 @@
|
||||||
|
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
|
||||||
|
readers do not read off random characters that represent icons */
|
||||||
|
|
||||||
|
.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; }
|
||||||
|
.#{$fa-css-prefix}-music:before { content: $fa-var-music; }
|
||||||
|
.#{$fa-css-prefix}-search:before { content: $fa-var-search; }
|
||||||
|
.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; }
|
||||||
|
.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; }
|
||||||
|
.#{$fa-css-prefix}-star:before { content: $fa-var-star; }
|
||||||
|
.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; }
|
||||||
|
.#{$fa-css-prefix}-user:before { content: $fa-var-user; }
|
||||||
|
.#{$fa-css-prefix}-film:before { content: $fa-var-film; }
|
||||||
|
.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; }
|
||||||
|
.#{$fa-css-prefix}-th:before { content: $fa-var-th; }
|
||||||
|
.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; }
|
||||||
|
.#{$fa-css-prefix}-check:before { content: $fa-var-check; }
|
||||||
|
.#{$fa-css-prefix}-remove:before,
|
||||||
|
.#{$fa-css-prefix}-close:before,
|
||||||
|
.#{$fa-css-prefix}-times:before { content: $fa-var-times; }
|
||||||
|
.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; }
|
||||||
|
.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; }
|
||||||
|
.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; }
|
||||||
|
.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; }
|
||||||
|
.#{$fa-css-prefix}-gear:before,
|
||||||
|
.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; }
|
||||||
|
.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; }
|
||||||
|
.#{$fa-css-prefix}-home:before { content: $fa-var-home; }
|
||||||
|
.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; }
|
||||||
|
.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; }
|
||||||
|
.#{$fa-css-prefix}-road:before { content: $fa-var-road; }
|
||||||
|
.#{$fa-css-prefix}-download:before { content: $fa-var-download; }
|
||||||
|
.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; }
|
||||||
|
.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; }
|
||||||
|
.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; }
|
||||||
|
.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; }
|
||||||
|
.#{$fa-css-prefix}-rotate-right:before,
|
||||||
|
.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; }
|
||||||
|
.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; }
|
||||||
|
.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; }
|
||||||
|
.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; }
|
||||||
|
.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; }
|
||||||
|
.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; }
|
||||||
|
.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; }
|
||||||
|
.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; }
|
||||||
|
.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; }
|
||||||
|
.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; }
|
||||||
|
.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; }
|
||||||
|
.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; }
|
||||||
|
.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; }
|
||||||
|
.#{$fa-css-prefix}-book:before { content: $fa-var-book; }
|
||||||
|
.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; }
|
||||||
|
.#{$fa-css-prefix}-print:before { content: $fa-var-print; }
|
||||||
|
.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; }
|
||||||
|
.#{$fa-css-prefix}-font:before { content: $fa-var-font; }
|
||||||
|
.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; }
|
||||||
|
.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; }
|
||||||
|
.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; }
|
||||||
|
.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; }
|
||||||
|
.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; }
|
||||||
|
.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; }
|
||||||
|
.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; }
|
||||||
|
.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; }
|
||||||
|
.#{$fa-css-prefix}-list:before { content: $fa-var-list; }
|
||||||
|
.#{$fa-css-prefix}-dedent:before,
|
||||||
|
.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; }
|
||||||
|
.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; }
|
||||||
|
.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; }
|
||||||
|
.#{$fa-css-prefix}-photo:before,
|
||||||
|
.#{$fa-css-prefix}-image:before,
|
||||||
|
.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; }
|
||||||
|
.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; }
|
||||||
|
.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; }
|
||||||
|
.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; }
|
||||||
|
.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; }
|
||||||
|
.#{$fa-css-prefix}-edit:before,
|
||||||
|
.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; }
|
||||||
|
.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; }
|
||||||
|
.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; }
|
||||||
|
.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; }
|
||||||
|
.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; }
|
||||||
|
.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; }
|
||||||
|
.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; }
|
||||||
|
.#{$fa-css-prefix}-play:before { content: $fa-var-play; }
|
||||||
|
.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; }
|
||||||
|
.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; }
|
||||||
|
.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; }
|
||||||
|
.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; }
|
||||||
|
.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; }
|
||||||
|
.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; }
|
||||||
|
.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; }
|
||||||
|
.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; }
|
||||||
|
.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; }
|
||||||
|
.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; }
|
||||||
|
.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; }
|
||||||
|
.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; }
|
||||||
|
.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; }
|
||||||
|
.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; }
|
||||||
|
.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; }
|
||||||
|
.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; }
|
||||||
|
.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; }
|
||||||
|
.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; }
|
||||||
|
.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; }
|
||||||
|
.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; }
|
||||||
|
.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; }
|
||||||
|
.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; }
|
||||||
|
.#{$fa-css-prefix}-mail-forward:before,
|
||||||
|
.#{$fa-css-prefix}-share:before { content: $fa-var-share; }
|
||||||
|
.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; }
|
||||||
|
.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; }
|
||||||
|
.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; }
|
||||||
|
.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; }
|
||||||
|
.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; }
|
||||||
|
.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; }
|
||||||
|
.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; }
|
||||||
|
.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; }
|
||||||
|
.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; }
|
||||||
|
.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; }
|
||||||
|
.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; }
|
||||||
|
.#{$fa-css-prefix}-warning:before,
|
||||||
|
.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; }
|
||||||
|
.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; }
|
||||||
|
.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; }
|
||||||
|
.#{$fa-css-prefix}-random:before { content: $fa-var-random; }
|
||||||
|
.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; }
|
||||||
|
.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; }
|
||||||
|
.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; }
|
||||||
|
.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; }
|
||||||
|
.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; }
|
||||||
|
.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; }
|
||||||
|
.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; }
|
||||||
|
.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; }
|
||||||
|
.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; }
|
||||||
|
.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; }
|
||||||
|
.#{$fa-css-prefix}-bar-chart-o:before,
|
||||||
|
.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; }
|
||||||
|
.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; }
|
||||||
|
.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; }
|
||||||
|
.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; }
|
||||||
|
.#{$fa-css-prefix}-key:before { content: $fa-var-key; }
|
||||||
|
.#{$fa-css-prefix}-gears:before,
|
||||||
|
.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; }
|
||||||
|
.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; }
|
||||||
|
.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; }
|
||||||
|
.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; }
|
||||||
|
.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; }
|
||||||
|
.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; }
|
||||||
|
.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; }
|
||||||
|
.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; }
|
||||||
|
.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; }
|
||||||
|
.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; }
|
||||||
|
.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; }
|
||||||
|
.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; }
|
||||||
|
.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; }
|
||||||
|
.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; }
|
||||||
|
.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; }
|
||||||
|
.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; }
|
||||||
|
.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; }
|
||||||
|
.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; }
|
||||||
|
.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; }
|
||||||
|
.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; }
|
||||||
|
.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; }
|
||||||
|
.#{$fa-css-prefix}-github:before { content: $fa-var-github; }
|
||||||
|
.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }
|
||||||
|
.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }
|
||||||
|
.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }
|
||||||
|
.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }
|
||||||
|
.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }
|
||||||
|
.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; }
|
||||||
|
.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; }
|
||||||
|
.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; }
|
||||||
|
.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; }
|
||||||
|
.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; }
|
||||||
|
.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; }
|
||||||
|
.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; }
|
||||||
|
.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; }
|
||||||
|
.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; }
|
||||||
|
.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; }
|
||||||
|
.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; }
|
||||||
|
.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; }
|
||||||
|
.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; }
|
||||||
|
.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; }
|
||||||
|
.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; }
|
||||||
|
.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; }
|
||||||
|
.#{$fa-css-prefix}-group:before,
|
||||||
|
.#{$fa-css-prefix}-users:before { content: $fa-var-users; }
|
||||||
|
.#{$fa-css-prefix}-chain:before,
|
||||||
|
.#{$fa-css-prefix}-link:before { content: $fa-var-link; }
|
||||||
|
.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; }
|
||||||
|
.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; }
|
||||||
|
.#{$fa-css-prefix}-cut:before,
|
||||||
|
.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; }
|
||||||
|
.#{$fa-css-prefix}-copy:before,
|
||||||
|
.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; }
|
||||||
|
.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; }
|
||||||
|
.#{$fa-css-prefix}-save:before,
|
||||||
|
.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; }
|
||||||
|
.#{$fa-css-prefix}-square:before { content: $fa-var-square; }
|
||||||
|
.#{$fa-css-prefix}-navicon:before,
|
||||||
|
.#{$fa-css-prefix}-reorder:before,
|
||||||
|
.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; }
|
||||||
|
.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; }
|
||||||
|
.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; }
|
||||||
|
.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; }
|
||||||
|
.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; }
|
||||||
|
.#{$fa-css-prefix}-table:before { content: $fa-var-table; }
|
||||||
|
.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; }
|
||||||
|
.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; }
|
||||||
|
.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; }
|
||||||
|
.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; }
|
||||||
|
.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; }
|
||||||
|
.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; }
|
||||||
|
.#{$fa-css-prefix}-money:before { content: $fa-var-money; }
|
||||||
|
.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; }
|
||||||
|
.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; }
|
||||||
|
.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; }
|
||||||
|
.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; }
|
||||||
|
.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; }
|
||||||
|
.#{$fa-css-prefix}-unsorted:before,
|
||||||
|
.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; }
|
||||||
|
.#{$fa-css-prefix}-sort-down:before,
|
||||||
|
.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; }
|
||||||
|
.#{$fa-css-prefix}-sort-up:before,
|
||||||
|
.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; }
|
||||||
|
.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; }
|
||||||
|
.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; }
|
||||||
|
.#{$fa-css-prefix}-rotate-left:before,
|
||||||
|
.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; }
|
||||||
|
.#{$fa-css-prefix}-legal:before,
|
||||||
|
.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; }
|
||||||
|
.#{$fa-css-prefix}-dashboard:before,
|
||||||
|
.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; }
|
||||||
|
.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; }
|
||||||
|
.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; }
|
||||||
|
.#{$fa-css-prefix}-flash:before,
|
||||||
|
.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; }
|
||||||
|
.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; }
|
||||||
|
.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; }
|
||||||
|
.#{$fa-css-prefix}-paste:before,
|
||||||
|
.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; }
|
||||||
|
.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; }
|
||||||
|
.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; }
|
||||||
|
.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; }
|
||||||
|
.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; }
|
||||||
|
.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; }
|
||||||
|
.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; }
|
||||||
|
.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; }
|
||||||
|
.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; }
|
||||||
|
.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; }
|
||||||
|
.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; }
|
||||||
|
.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; }
|
||||||
|
.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; }
|
||||||
|
.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; }
|
||||||
|
.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; }
|
||||||
|
.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; }
|
||||||
|
.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; }
|
||||||
|
.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; }
|
||||||
|
.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; }
|
||||||
|
.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; }
|
||||||
|
.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; }
|
||||||
|
.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; }
|
||||||
|
.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; }
|
||||||
|
.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; }
|
||||||
|
.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; }
|
||||||
|
.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; }
|
||||||
|
.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; }
|
||||||
|
.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; }
|
||||||
|
.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; }
|
||||||
|
.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; }
|
||||||
|
.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; }
|
||||||
|
.#{$fa-css-prefix}-mobile-phone:before,
|
||||||
|
.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; }
|
||||||
|
.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; }
|
||||||
|
.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; }
|
||||||
|
.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; }
|
||||||
|
.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; }
|
||||||
|
.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; }
|
||||||
|
.#{$fa-css-prefix}-mail-reply:before,
|
||||||
|
.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; }
|
||||||
|
.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; }
|
||||||
|
.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; }
|
||||||
|
.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; }
|
||||||
|
.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; }
|
||||||
|
.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; }
|
||||||
|
.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; }
|
||||||
|
.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; }
|
||||||
|
.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; }
|
||||||
|
.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; }
|
||||||
|
.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; }
|
||||||
|
.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; }
|
||||||
|
.#{$fa-css-prefix}-code:before { content: $fa-var-code; }
|
||||||
|
.#{$fa-css-prefix}-mail-reply-all:before,
|
||||||
|
.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; }
|
||||||
|
.#{$fa-css-prefix}-star-half-empty:before,
|
||||||
|
.#{$fa-css-prefix}-star-half-full:before,
|
||||||
|
.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; }
|
||||||
|
.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; }
|
||||||
|
.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; }
|
||||||
|
.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; }
|
||||||
|
.#{$fa-css-prefix}-unlink:before,
|
||||||
|
.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; }
|
||||||
|
.#{$fa-css-prefix}-question:before { content: $fa-var-question; }
|
||||||
|
.#{$fa-css-prefix}-info:before { content: $fa-var-info; }
|
||||||
|
.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; }
|
||||||
|
.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; }
|
||||||
|
.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; }
|
||||||
|
.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; }
|
||||||
|
.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; }
|
||||||
|
.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; }
|
||||||
|
.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; }
|
||||||
|
.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; }
|
||||||
|
.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; }
|
||||||
|
.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; }
|
||||||
|
.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; }
|
||||||
|
.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; }
|
||||||
|
.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; }
|
||||||
|
.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; }
|
||||||
|
.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; }
|
||||||
|
.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; }
|
||||||
|
.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; }
|
||||||
|
.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; }
|
||||||
|
.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; }
|
||||||
|
.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; }
|
||||||
|
.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; }
|
||||||
|
.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; }
|
||||||
|
.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; }
|
||||||
|
.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; }
|
||||||
|
.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; }
|
||||||
|
.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; }
|
||||||
|
.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; }
|
||||||
|
.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; }
|
||||||
|
.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; }
|
||||||
|
.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; }
|
||||||
|
.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; }
|
||||||
|
.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; }
|
||||||
|
.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; }
|
||||||
|
.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; }
|
||||||
|
.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; }
|
||||||
|
.#{$fa-css-prefix}-toggle-down:before,
|
||||||
|
.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; }
|
||||||
|
.#{$fa-css-prefix}-toggle-up:before,
|
||||||
|
.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; }
|
||||||
|
.#{$fa-css-prefix}-toggle-right:before,
|
||||||
|
.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; }
|
||||||
|
.#{$fa-css-prefix}-euro:before,
|
||||||
|
.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; }
|
||||||
|
.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; }
|
||||||
|
.#{$fa-css-prefix}-dollar:before,
|
||||||
|
.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; }
|
||||||
|
.#{$fa-css-prefix}-rupee:before,
|
||||||
|
.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; }
|
||||||
|
.#{$fa-css-prefix}-cny:before,
|
||||||
|
.#{$fa-css-prefix}-rmb:before,
|
||||||
|
.#{$fa-css-prefix}-yen:before,
|
||||||
|
.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; }
|
||||||
|
.#{$fa-css-prefix}-ruble:before,
|
||||||
|
.#{$fa-css-prefix}-rouble:before,
|
||||||
|
.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; }
|
||||||
|
.#{$fa-css-prefix}-won:before,
|
||||||
|
.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; }
|
||||||
|
.#{$fa-css-prefix}-bitcoin:before,
|
||||||
|
.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; }
|
||||||
|
.#{$fa-css-prefix}-file:before { content: $fa-var-file; }
|
||||||
|
.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; }
|
||||||
|
.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; }
|
||||||
|
.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; }
|
||||||
|
.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; }
|
||||||
|
.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; }
|
||||||
|
.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; }
|
||||||
|
.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; }
|
||||||
|
.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; }
|
||||||
|
.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; }
|
||||||
|
.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; }
|
||||||
|
.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; }
|
||||||
|
.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; }
|
||||||
|
.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; }
|
||||||
|
.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; }
|
||||||
|
.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; }
|
||||||
|
.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; }
|
||||||
|
.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; }
|
||||||
|
.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; }
|
||||||
|
.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; }
|
||||||
|
.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; }
|
||||||
|
.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; }
|
||||||
|
.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; }
|
||||||
|
.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; }
|
||||||
|
.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; }
|
||||||
|
.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; }
|
||||||
|
.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; }
|
||||||
|
.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; }
|
||||||
|
.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; }
|
||||||
|
.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; }
|
||||||
|
.#{$fa-css-prefix}-android:before { content: $fa-var-android; }
|
||||||
|
.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; }
|
||||||
|
.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; }
|
||||||
|
.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; }
|
||||||
|
.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; }
|
||||||
|
.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; }
|
||||||
|
.#{$fa-css-prefix}-female:before { content: $fa-var-female; }
|
||||||
|
.#{$fa-css-prefix}-male:before { content: $fa-var-male; }
|
||||||
|
.#{$fa-css-prefix}-gittip:before { content: $fa-var-gittip; }
|
||||||
|
.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; }
|
||||||
|
.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; }
|
||||||
|
.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; }
|
||||||
|
.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; }
|
||||||
|
.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; }
|
||||||
|
.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; }
|
||||||
|
.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; }
|
||||||
|
.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; }
|
||||||
|
.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; }
|
||||||
|
.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; }
|
||||||
|
.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; }
|
||||||
|
.#{$fa-css-prefix}-toggle-left:before,
|
||||||
|
.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; }
|
||||||
|
.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; }
|
||||||
|
.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; }
|
||||||
|
.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; }
|
||||||
|
.#{$fa-css-prefix}-turkish-lira:before,
|
||||||
|
.#{$fa-css-prefix}-try:before { content: $fa-var-try; }
|
||||||
|
.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; }
|
||||||
|
.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; }
|
||||||
|
.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; }
|
||||||
|
.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; }
|
||||||
|
.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; }
|
||||||
|
.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; }
|
||||||
|
.#{$fa-css-prefix}-institution:before,
|
||||||
|
.#{$fa-css-prefix}-bank:before,
|
||||||
|
.#{$fa-css-prefix}-university:before { content: $fa-var-university; }
|
||||||
|
.#{$fa-css-prefix}-mortar-board:before,
|
||||||
|
.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; }
|
||||||
|
.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; }
|
||||||
|
.#{$fa-css-prefix}-google:before { content: $fa-var-google; }
|
||||||
|
.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; }
|
||||||
|
.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; }
|
||||||
|
.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; }
|
||||||
|
.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }
|
||||||
|
.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }
|
||||||
|
.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }
|
||||||
|
.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }
|
||||||
|
.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }
|
||||||
|
.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }
|
||||||
|
.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }
|
||||||
|
.#{$fa-css-prefix}-language:before { content: $fa-var-language; }
|
||||||
|
.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; }
|
||||||
|
.#{$fa-css-prefix}-building:before { content: $fa-var-building; }
|
||||||
|
.#{$fa-css-prefix}-child:before { content: $fa-var-child; }
|
||||||
|
.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; }
|
||||||
|
.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; }
|
||||||
|
.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; }
|
||||||
|
.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; }
|
||||||
|
.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; }
|
||||||
|
.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; }
|
||||||
|
.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; }
|
||||||
|
.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; }
|
||||||
|
.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; }
|
||||||
|
.#{$fa-css-prefix}-automobile:before,
|
||||||
|
.#{$fa-css-prefix}-car:before { content: $fa-var-car; }
|
||||||
|
.#{$fa-css-prefix}-cab:before,
|
||||||
|
.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; }
|
||||||
|
.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; }
|
||||||
|
.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; }
|
||||||
|
.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; }
|
||||||
|
.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; }
|
||||||
|
.#{$fa-css-prefix}-database:before { content: $fa-var-database; }
|
||||||
|
.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; }
|
||||||
|
.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; }
|
||||||
|
.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; }
|
||||||
|
.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; }
|
||||||
|
.#{$fa-css-prefix}-file-photo-o:before,
|
||||||
|
.#{$fa-css-prefix}-file-picture-o:before,
|
||||||
|
.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; }
|
||||||
|
.#{$fa-css-prefix}-file-zip-o:before,
|
||||||
|
.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; }
|
||||||
|
.#{$fa-css-prefix}-file-sound-o:before,
|
||||||
|
.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; }
|
||||||
|
.#{$fa-css-prefix}-file-movie-o:before,
|
||||||
|
.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; }
|
||||||
|
.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; }
|
||||||
|
.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; }
|
||||||
|
.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; }
|
||||||
|
.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; }
|
||||||
|
.#{$fa-css-prefix}-life-bouy:before,
|
||||||
|
.#{$fa-css-prefix}-life-buoy:before,
|
||||||
|
.#{$fa-css-prefix}-life-saver:before,
|
||||||
|
.#{$fa-css-prefix}-support:before,
|
||||||
|
.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }
|
||||||
|
.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }
|
||||||
|
.#{$fa-css-prefix}-ra:before,
|
||||||
|
.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }
|
||||||
|
.#{$fa-css-prefix}-ge:before,
|
||||||
|
.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }
|
||||||
|
.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }
|
||||||
|
.#{$fa-css-prefix}-git:before { content: $fa-var-git; }
|
||||||
|
.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }
|
||||||
|
.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }
|
||||||
|
.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }
|
||||||
|
.#{$fa-css-prefix}-wechat:before,
|
||||||
|
.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; }
|
||||||
|
.#{$fa-css-prefix}-send:before,
|
||||||
|
.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; }
|
||||||
|
.#{$fa-css-prefix}-send-o:before,
|
||||||
|
.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }
|
||||||
|
.#{$fa-css-prefix}-history:before { content: $fa-var-history; }
|
||||||
|
.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }
|
||||||
|
.#{$fa-css-prefix}-header:before { content: $fa-var-header; }
|
||||||
|
.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }
|
||||||
|
.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; }
|
||||||
|
.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; }
|
||||||
|
.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; }
|
||||||
|
.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; }
|
||||||
|
.#{$fa-css-prefix}-soccer-ball-o:before,
|
||||||
|
.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; }
|
||||||
|
.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; }
|
||||||
|
.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; }
|
||||||
|
.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; }
|
||||||
|
.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; }
|
||||||
|
.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; }
|
||||||
|
.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; }
|
||||||
|
.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; }
|
||||||
|
.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; }
|
||||||
|
.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; }
|
||||||
|
.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; }
|
||||||
|
.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; }
|
||||||
|
.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; }
|
||||||
|
.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; }
|
||||||
|
.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; }
|
||||||
|
.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; }
|
||||||
|
.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; }
|
||||||
|
.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; }
|
||||||
|
.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; }
|
||||||
|
.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; }
|
||||||
|
.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; }
|
||||||
|
.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; }
|
||||||
|
.#{$fa-css-prefix}-at:before { content: $fa-var-at; }
|
||||||
|
.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; }
|
||||||
|
.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; }
|
||||||
|
.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; }
|
||||||
|
.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; }
|
||||||
|
.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; }
|
||||||
|
.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; }
|
||||||
|
.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; }
|
||||||
|
.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; }
|
||||||
|
.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; }
|
||||||
|
.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; }
|
||||||
|
.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; }
|
||||||
|
.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; }
|
||||||
|
.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; }
|
||||||
|
.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; }
|
||||||
|
.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; }
|
||||||
|
.#{$fa-css-prefix}-shekel:before,
|
||||||
|
.#{$fa-css-prefix}-sheqel:before,
|
||||||
|
.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; }
|
||||||
|
.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; }
|
13
hosting/static/hosting/font-awesome/scss/_larger.scss
vendored
Executable file
|
@ -0,0 +1,13 @@
|
||||||
|
// Icon Sizes
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
/* makes the font 33% larger relative to the icon container */
|
||||||
|
.#{$fa-css-prefix}-lg {
|
||||||
|
font-size: (4em / 3);
|
||||||
|
line-height: (3em / 4);
|
||||||
|
vertical-align: -15%;
|
||||||
|
}
|
||||||
|
.#{$fa-css-prefix}-2x { font-size: 2em; }
|
||||||
|
.#{$fa-css-prefix}-3x { font-size: 3em; }
|
||||||
|
.#{$fa-css-prefix}-4x { font-size: 4em; }
|
||||||
|
.#{$fa-css-prefix}-5x { font-size: 5em; }
|
19
hosting/static/hosting/font-awesome/scss/_list.scss
vendored
Executable file
|
@ -0,0 +1,19 @@
|
||||||
|
// List Icons
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
.#{$fa-css-prefix}-ul {
|
||||||
|
padding-left: 0;
|
||||||
|
margin-left: $fa-li-width;
|
||||||
|
list-style-type: none;
|
||||||
|
> li { position: relative; }
|
||||||
|
}
|
||||||
|
.#{$fa-css-prefix}-li {
|
||||||
|
position: absolute;
|
||||||
|
left: -$fa-li-width;
|
||||||
|
width: $fa-li-width;
|
||||||
|
top: (2em / 14);
|
||||||
|
text-align: center;
|
||||||
|
&.#{$fa-css-prefix}-lg {
|
||||||
|
left: -$fa-li-width + (4em / 14);
|
||||||
|
}
|
||||||
|
}
|
25
hosting/static/hosting/font-awesome/scss/_mixins.scss
vendored
Executable file
|
@ -0,0 +1,25 @@
|
||||||
|
// Mixins
|
||||||
|
// --------------------------
|
||||||
|
|
||||||
|
@mixin fa-icon() {
|
||||||
|
display: inline-block;
|
||||||
|
font: normal normal normal 14px/1 FontAwesome; // shortening font declaration
|
||||||
|
font-size: inherit; // can't have font-size inherit on line above, so need to override
|
||||||
|
text-rendering: auto; // optimizelegibility throws things off #1094
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin fa-icon-rotate($degrees, $rotation) {
|
||||||
|
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
|
||||||
|
-webkit-transform: rotate($degrees);
|
||||||
|
-ms-transform: rotate($degrees);
|
||||||
|
transform: rotate($degrees);
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin fa-icon-flip($horiz, $vert, $rotation) {
|
||||||
|
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
|
||||||
|
-webkit-transform: scale($horiz, $vert);
|
||||||
|
-ms-transform: scale($horiz, $vert);
|
||||||
|
transform: scale($horiz, $vert);
|
||||||
|
}
|
14
hosting/static/hosting/font-awesome/scss/_path.scss
vendored
Executable file
|
@ -0,0 +1,14 @@
|
||||||
|
/* FONT PATH
|
||||||
|
* -------------------------- */
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'FontAwesome';
|
||||||
|
src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
|
||||||
|
src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
|
||||||
|
url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
|
||||||
|
url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
|
||||||
|
url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
|
||||||
|
//src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
20
hosting/static/hosting/font-awesome/scss/_rotated-flipped.scss
vendored
Executable file
|
@ -0,0 +1,20 @@
|
||||||
|
// Rotated & Flipped Icons
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
|
||||||
|
.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
|
||||||
|
.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
|
||||||
|
|
||||||
|
.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
|
||||||
|
.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
|
||||||
|
|
||||||
|
// Hook for IE8-9
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
:root .#{$fa-css-prefix}-rotate-90,
|
||||||
|
:root .#{$fa-css-prefix}-rotate-180,
|
||||||
|
:root .#{$fa-css-prefix}-rotate-270,
|
||||||
|
:root .#{$fa-css-prefix}-flip-horizontal,
|
||||||
|
:root .#{$fa-css-prefix}-flip-vertical {
|
||||||
|
filter: none;
|
||||||
|
}
|
29
hosting/static/hosting/font-awesome/scss/_spinning.scss
vendored
Executable file
|
@ -0,0 +1,29 @@
|
||||||
|
// Spinning Icons
|
||||||
|
// --------------------------
|
||||||
|
|
||||||
|
.#{$fa-css-prefix}-spin {
|
||||||
|
-webkit-animation: fa-spin 2s infinite linear;
|
||||||
|
animation: fa-spin 2s infinite linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
@-webkit-keyframes fa-spin {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotate(359deg);
|
||||||
|
transform: rotate(359deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fa-spin {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotate(359deg);
|
||||||
|
transform: rotate(359deg);
|
||||||
|
}
|
||||||
|
}
|
20
hosting/static/hosting/font-awesome/scss/_stacked.scss
vendored
Executable file
|
@ -0,0 +1,20 @@
|
||||||
|
// Stacked Icons
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
.#{$fa-css-prefix}-stack {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
width: 2em;
|
||||||
|
height: 2em;
|
||||||
|
line-height: 2em;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.#{$fa-css-prefix}-stack-1x { line-height: inherit; }
|
||||||
|
.#{$fa-css-prefix}-stack-2x { font-size: 2em; }
|
||||||
|
.#{$fa-css-prefix}-inverse { color: $fa-inverse; }
|
561
hosting/static/hosting/font-awesome/scss/_variables.scss
vendored
Executable file
|
@ -0,0 +1,561 @@
|
||||||
|
// Variables
|
||||||
|
// --------------------------
|
||||||
|
|
||||||
|
$fa-font-path: "../fonts" !default;
|
||||||
|
//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts" !default; // for referencing Bootstrap CDN font files directly
|
||||||
|
$fa-css-prefix: fa !default;
|
||||||
|
$fa-version: "4.2.0" !default;
|
||||||
|
$fa-border-color: #eee !default;
|
||||||
|
$fa-inverse: #fff !default;
|
||||||
|
$fa-li-width: (30em / 14) !default;
|
||||||
|
|
||||||
|
$fa-var-adjust: "\f042";
|
||||||
|
$fa-var-adn: "\f170";
|
||||||
|
$fa-var-align-center: "\f037";
|
||||||
|
$fa-var-align-justify: "\f039";
|
||||||
|
$fa-var-align-left: "\f036";
|
||||||
|
$fa-var-align-right: "\f038";
|
||||||
|
$fa-var-ambulance: "\f0f9";
|
||||||
|
$fa-var-anchor: "\f13d";
|
||||||
|
$fa-var-android: "\f17b";
|
||||||
|
$fa-var-angellist: "\f209";
|
||||||
|
$fa-var-angle-double-down: "\f103";
|
||||||
|
$fa-var-angle-double-left: "\f100";
|
||||||
|
$fa-var-angle-double-right: "\f101";
|
||||||
|
$fa-var-angle-double-up: "\f102";
|
||||||
|
$fa-var-angle-down: "\f107";
|
||||||
|
$fa-var-angle-left: "\f104";
|
||||||
|
$fa-var-angle-right: "\f105";
|
||||||
|
$fa-var-angle-up: "\f106";
|
||||||
|
$fa-var-apple: "\f179";
|
||||||
|
$fa-var-archive: "\f187";
|
||||||
|
$fa-var-area-chart: "\f1fe";
|
||||||
|
$fa-var-arrow-circle-down: "\f0ab";
|
||||||
|
$fa-var-arrow-circle-left: "\f0a8";
|
||||||
|
$fa-var-arrow-circle-o-down: "\f01a";
|
||||||
|
$fa-var-arrow-circle-o-left: "\f190";
|
||||||
|
$fa-var-arrow-circle-o-right: "\f18e";
|
||||||
|
$fa-var-arrow-circle-o-up: "\f01b";
|
||||||
|
$fa-var-arrow-circle-right: "\f0a9";
|
||||||
|
$fa-var-arrow-circle-up: "\f0aa";
|
||||||
|
$fa-var-arrow-down: "\f063";
|
||||||
|
$fa-var-arrow-left: "\f060";
|
||||||
|
$fa-var-arrow-right: "\f061";
|
||||||
|
$fa-var-arrow-up: "\f062";
|
||||||
|
$fa-var-arrows: "\f047";
|
||||||
|
$fa-var-arrows-alt: "\f0b2";
|
||||||
|
$fa-var-arrows-h: "\f07e";
|
||||||
|
$fa-var-arrows-v: "\f07d";
|
||||||
|
$fa-var-asterisk: "\f069";
|
||||||
|
$fa-var-at: "\f1fa";
|
||||||
|
$fa-var-automobile: "\f1b9";
|
||||||
|
$fa-var-backward: "\f04a";
|
||||||
|
$fa-var-ban: "\f05e";
|
||||||
|
$fa-var-bank: "\f19c";
|
||||||
|
$fa-var-bar-chart: "\f080";
|
||||||
|
$fa-var-bar-chart-o: "\f080";
|
||||||
|
$fa-var-barcode: "\f02a";
|
||||||
|
$fa-var-bars: "\f0c9";
|
||||||
|
$fa-var-beer: "\f0fc";
|
||||||
|
$fa-var-behance: "\f1b4";
|
||||||
|
$fa-var-behance-square: "\f1b5";
|
||||||
|
$fa-var-bell: "\f0f3";
|
||||||
|
$fa-var-bell-o: "\f0a2";
|
||||||
|
$fa-var-bell-slash: "\f1f6";
|
||||||
|
$fa-var-bell-slash-o: "\f1f7";
|
||||||
|
$fa-var-bicycle: "\f206";
|
||||||
|
$fa-var-binoculars: "\f1e5";
|
||||||
|
$fa-var-birthday-cake: "\f1fd";
|
||||||
|
$fa-var-bitbucket: "\f171";
|
||||||
|
$fa-var-bitbucket-square: "\f172";
|
||||||
|
$fa-var-bitcoin: "\f15a";
|
||||||
|
$fa-var-bold: "\f032";
|
||||||
|
$fa-var-bolt: "\f0e7";
|
||||||
|
$fa-var-bomb: "\f1e2";
|
||||||
|
$fa-var-book: "\f02d";
|
||||||
|
$fa-var-bookmark: "\f02e";
|
||||||
|
$fa-var-bookmark-o: "\f097";
|
||||||
|
$fa-var-briefcase: "\f0b1";
|
||||||
|
$fa-var-btc: "\f15a";
|
||||||
|
$fa-var-bug: "\f188";
|
||||||
|
$fa-var-building: "\f1ad";
|
||||||
|
$fa-var-building-o: "\f0f7";
|
||||||
|
$fa-var-bullhorn: "\f0a1";
|
||||||
|
$fa-var-bullseye: "\f140";
|
||||||
|
$fa-var-bus: "\f207";
|
||||||
|
$fa-var-cab: "\f1ba";
|
||||||
|
$fa-var-calculator: "\f1ec";
|
||||||
|
$fa-var-calendar: "\f073";
|
||||||
|
$fa-var-calendar-o: "\f133";
|
||||||
|
$fa-var-camera: "\f030";
|
||||||
|
$fa-var-camera-retro: "\f083";
|
||||||
|
$fa-var-car: "\f1b9";
|
||||||
|
$fa-var-caret-down: "\f0d7";
|
||||||
|
$fa-var-caret-left: "\f0d9";
|
||||||
|
$fa-var-caret-right: "\f0da";
|
||||||
|
$fa-var-caret-square-o-down: "\f150";
|
||||||
|
$fa-var-caret-square-o-left: "\f191";
|
||||||
|
$fa-var-caret-square-o-right: "\f152";
|
||||||
|
$fa-var-caret-square-o-up: "\f151";
|
||||||
|
$fa-var-caret-up: "\f0d8";
|
||||||
|
$fa-var-cc: "\f20a";
|
||||||
|
$fa-var-cc-amex: "\f1f3";
|
||||||
|
$fa-var-cc-discover: "\f1f2";
|
||||||
|
$fa-var-cc-mastercard: "\f1f1";
|
||||||
|
$fa-var-cc-paypal: "\f1f4";
|
||||||
|
$fa-var-cc-stripe: "\f1f5";
|
||||||
|
$fa-var-cc-visa: "\f1f0";
|
||||||
|
$fa-var-certificate: "\f0a3";
|
||||||
|
$fa-var-chain: "\f0c1";
|
||||||
|
$fa-var-chain-broken: "\f127";
|
||||||
|
$fa-var-check: "\f00c";
|
||||||
|
$fa-var-check-circle: "\f058";
|
||||||
|
$fa-var-check-circle-o: "\f05d";
|
||||||
|
$fa-var-check-square: "\f14a";
|
||||||
|
$fa-var-check-square-o: "\f046";
|
||||||
|
$fa-var-chevron-circle-down: "\f13a";
|
||||||
|
$fa-var-chevron-circle-left: "\f137";
|
||||||
|
$fa-var-chevron-circle-right: "\f138";
|
||||||
|
$fa-var-chevron-circle-up: "\f139";
|
||||||
|
$fa-var-chevron-down: "\f078";
|
||||||
|
$fa-var-chevron-left: "\f053";
|
||||||
|
$fa-var-chevron-right: "\f054";
|
||||||
|
$fa-var-chevron-up: "\f077";
|
||||||
|
$fa-var-child: "\f1ae";
|
||||||
|
$fa-var-circle: "\f111";
|
||||||
|
$fa-var-circle-o: "\f10c";
|
||||||
|
$fa-var-circle-o-notch: "\f1ce";
|
||||||
|
$fa-var-circle-thin: "\f1db";
|
||||||
|
$fa-var-clipboard: "\f0ea";
|
||||||
|
$fa-var-clock-o: "\f017";
|
||||||
|
$fa-var-close: "\f00d";
|
||||||
|
$fa-var-cloud: "\f0c2";
|
||||||
|
$fa-var-cloud-download: "\f0ed";
|
||||||
|
$fa-var-cloud-upload: "\f0ee";
|
||||||
|
$fa-var-cny: "\f157";
|
||||||
|
$fa-var-code: "\f121";
|
||||||
|
$fa-var-code-fork: "\f126";
|
||||||
|
$fa-var-codepen: "\f1cb";
|
||||||
|
$fa-var-coffee: "\f0f4";
|
||||||
|
$fa-var-cog: "\f013";
|
||||||
|
$fa-var-cogs: "\f085";
|
||||||
|
$fa-var-columns: "\f0db";
|
||||||
|
$fa-var-comment: "\f075";
|
||||||
|
$fa-var-comment-o: "\f0e5";
|
||||||
|
$fa-var-comments: "\f086";
|
||||||
|
$fa-var-comments-o: "\f0e6";
|
||||||
|
$fa-var-compass: "\f14e";
|
||||||
|
$fa-var-compress: "\f066";
|
||||||
|
$fa-var-copy: "\f0c5";
|
||||||
|
$fa-var-copyright: "\f1f9";
|
||||||
|
$fa-var-credit-card: "\f09d";
|
||||||
|
$fa-var-crop: "\f125";
|
||||||
|
$fa-var-crosshairs: "\f05b";
|
||||||
|
$fa-var-css3: "\f13c";
|
||||||
|
$fa-var-cube: "\f1b2";
|
||||||
|
$fa-var-cubes: "\f1b3";
|
||||||
|
$fa-var-cut: "\f0c4";
|
||||||
|
$fa-var-cutlery: "\f0f5";
|
||||||
|
$fa-var-dashboard: "\f0e4";
|
||||||
|
$fa-var-database: "\f1c0";
|
||||||
|
$fa-var-dedent: "\f03b";
|
||||||
|
$fa-var-delicious: "\f1a5";
|
||||||
|
$fa-var-desktop: "\f108";
|
||||||
|
$fa-var-deviantart: "\f1bd";
|
||||||
|
$fa-var-digg: "\f1a6";
|
||||||
|
$fa-var-dollar: "\f155";
|
||||||
|
$fa-var-dot-circle-o: "\f192";
|
||||||
|
$fa-var-download: "\f019";
|
||||||
|
$fa-var-dribbble: "\f17d";
|
||||||
|
$fa-var-dropbox: "\f16b";
|
||||||
|
$fa-var-drupal: "\f1a9";
|
||||||
|
$fa-var-edit: "\f044";
|
||||||
|
$fa-var-eject: "\f052";
|
||||||
|
$fa-var-ellipsis-h: "\f141";
|
||||||
|
$fa-var-ellipsis-v: "\f142";
|
||||||
|
$fa-var-empire: "\f1d1";
|
||||||
|
$fa-var-envelope: "\f0e0";
|
||||||
|
$fa-var-envelope-o: "\f003";
|
||||||
|
$fa-var-envelope-square: "\f199";
|
||||||
|
$fa-var-eraser: "\f12d";
|
||||||
|
$fa-var-eur: "\f153";
|
||||||
|
$fa-var-euro: "\f153";
|
||||||
|
$fa-var-exchange: "\f0ec";
|
||||||
|
$fa-var-exclamation: "\f12a";
|
||||||
|
$fa-var-exclamation-circle: "\f06a";
|
||||||
|
$fa-var-exclamation-triangle: "\f071";
|
||||||
|
$fa-var-expand: "\f065";
|
||||||
|
$fa-var-external-link: "\f08e";
|
||||||
|
$fa-var-external-link-square: "\f14c";
|
||||||
|
$fa-var-eye: "\f06e";
|
||||||
|
$fa-var-eye-slash: "\f070";
|
||||||
|
$fa-var-eyedropper: "\f1fb";
|
||||||
|
$fa-var-facebook: "\f09a";
|
||||||
|
$fa-var-facebook-square: "\f082";
|
||||||
|
$fa-var-fast-backward: "\f049";
|
||||||
|
$fa-var-fast-forward: "\f050";
|
||||||
|
$fa-var-fax: "\f1ac";
|
||||||
|
$fa-var-female: "\f182";
|
||||||
|
$fa-var-fighter-jet: "\f0fb";
|
||||||
|
$fa-var-file: "\f15b";
|
||||||
|
$fa-var-file-archive-o: "\f1c6";
|
||||||
|
$fa-var-file-audio-o: "\f1c7";
|
||||||
|
$fa-var-file-code-o: "\f1c9";
|
||||||
|
$fa-var-file-excel-o: "\f1c3";
|
||||||
|
$fa-var-file-image-o: "\f1c5";
|
||||||
|
$fa-var-file-movie-o: "\f1c8";
|
||||||
|
$fa-var-file-o: "\f016";
|
||||||
|
$fa-var-file-pdf-o: "\f1c1";
|
||||||
|
$fa-var-file-photo-o: "\f1c5";
|
||||||
|
$fa-var-file-picture-o: "\f1c5";
|
||||||
|
$fa-var-file-powerpoint-o: "\f1c4";
|
||||||
|
$fa-var-file-sound-o: "\f1c7";
|
||||||
|
$fa-var-file-text: "\f15c";
|
||||||
|
$fa-var-file-text-o: "\f0f6";
|
||||||
|
$fa-var-file-video-o: "\f1c8";
|
||||||
|
$fa-var-file-word-o: "\f1c2";
|
||||||
|
$fa-var-file-zip-o: "\f1c6";
|
||||||
|
$fa-var-files-o: "\f0c5";
|
||||||
|
$fa-var-film: "\f008";
|
||||||
|
$fa-var-filter: "\f0b0";
|
||||||
|
$fa-var-fire: "\f06d";
|
||||||
|
$fa-var-fire-extinguisher: "\f134";
|
||||||
|
$fa-var-flag: "\f024";
|
||||||
|
$fa-var-flag-checkered: "\f11e";
|
||||||
|
$fa-var-flag-o: "\f11d";
|
||||||
|
$fa-var-flash: "\f0e7";
|
||||||
|
$fa-var-flask: "\f0c3";
|
||||||
|
$fa-var-flickr: "\f16e";
|
||||||
|
$fa-var-floppy-o: "\f0c7";
|
||||||
|
$fa-var-folder: "\f07b";
|
||||||
|
$fa-var-folder-o: "\f114";
|
||||||
|
$fa-var-folder-open: "\f07c";
|
||||||
|
$fa-var-folder-open-o: "\f115";
|
||||||
|
$fa-var-font: "\f031";
|
||||||
|
$fa-var-forward: "\f04e";
|
||||||
|
$fa-var-foursquare: "\f180";
|
||||||
|
$fa-var-frown-o: "\f119";
|
||||||
|
$fa-var-futbol-o: "\f1e3";
|
||||||
|
$fa-var-gamepad: "\f11b";
|
||||||
|
$fa-var-gavel: "\f0e3";
|
||||||
|
$fa-var-gbp: "\f154";
|
||||||
|
$fa-var-ge: "\f1d1";
|
||||||
|
$fa-var-gear: "\f013";
|
||||||
|
$fa-var-gears: "\f085";
|
||||||
|
$fa-var-gift: "\f06b";
|
||||||
|
$fa-var-git: "\f1d3";
|
||||||
|
$fa-var-git-square: "\f1d2";
|
||||||
|
$fa-var-github: "\f09b";
|
||||||
|
$fa-var-github-alt: "\f113";
|
||||||
|
$fa-var-github-square: "\f092";
|
||||||
|
$fa-var-gittip: "\f184";
|
||||||
|
$fa-var-glass: "\f000";
|
||||||
|
$fa-var-globe: "\f0ac";
|
||||||
|
$fa-var-google: "\f1a0";
|
||||||
|
$fa-var-google-plus: "\f0d5";
|
||||||
|
$fa-var-google-plus-square: "\f0d4";
|
||||||
|
$fa-var-google-wallet: "\f1ee";
|
||||||
|
$fa-var-graduation-cap: "\f19d";
|
||||||
|
$fa-var-group: "\f0c0";
|
||||||
|
$fa-var-h-square: "\f0fd";
|
||||||
|
$fa-var-hacker-news: "\f1d4";
|
||||||
|
$fa-var-hand-o-down: "\f0a7";
|
||||||
|
$fa-var-hand-o-left: "\f0a5";
|
||||||
|
$fa-var-hand-o-right: "\f0a4";
|
||||||
|
$fa-var-hand-o-up: "\f0a6";
|
||||||
|
$fa-var-hdd-o: "\f0a0";
|
||||||
|
$fa-var-header: "\f1dc";
|
||||||
|
$fa-var-headphones: "\f025";
|
||||||
|
$fa-var-heart: "\f004";
|
||||||
|
$fa-var-heart-o: "\f08a";
|
||||||
|
$fa-var-history: "\f1da";
|
||||||
|
$fa-var-home: "\f015";
|
||||||
|
$fa-var-hospital-o: "\f0f8";
|
||||||
|
$fa-var-html5: "\f13b";
|
||||||
|
$fa-var-ils: "\f20b";
|
||||||
|
$fa-var-image: "\f03e";
|
||||||
|
$fa-var-inbox: "\f01c";
|
||||||
|
$fa-var-indent: "\f03c";
|
||||||
|
$fa-var-info: "\f129";
|
||||||
|
$fa-var-info-circle: "\f05a";
|
||||||
|
$fa-var-inr: "\f156";
|
||||||
|
$fa-var-instagram: "\f16d";
|
||||||
|
$fa-var-institution: "\f19c";
|
||||||
|
$fa-var-ioxhost: "\f208";
|
||||||
|
$fa-var-italic: "\f033";
|
||||||
|
$fa-var-joomla: "\f1aa";
|
||||||
|
$fa-var-jpy: "\f157";
|
||||||
|
$fa-var-jsfiddle: "\f1cc";
|
||||||
|
$fa-var-key: "\f084";
|
||||||
|
$fa-var-keyboard-o: "\f11c";
|
||||||
|
$fa-var-krw: "\f159";
|
||||||
|
$fa-var-language: "\f1ab";
|
||||||
|
$fa-var-laptop: "\f109";
|
||||||
|
$fa-var-lastfm: "\f202";
|
||||||
|
$fa-var-lastfm-square: "\f203";
|
||||||
|
$fa-var-leaf: "\f06c";
|
||||||
|
$fa-var-legal: "\f0e3";
|
||||||
|
$fa-var-lemon-o: "\f094";
|
||||||
|
$fa-var-level-down: "\f149";
|
||||||
|
$fa-var-level-up: "\f148";
|
||||||
|
$fa-var-life-bouy: "\f1cd";
|
||||||
|
$fa-var-life-buoy: "\f1cd";
|
||||||
|
$fa-var-life-ring: "\f1cd";
|
||||||
|
$fa-var-life-saver: "\f1cd";
|
||||||
|
$fa-var-lightbulb-o: "\f0eb";
|
||||||
|
$fa-var-line-chart: "\f201";
|
||||||
|
$fa-var-link: "\f0c1";
|
||||||
|
$fa-var-linkedin: "\f0e1";
|
||||||
|
$fa-var-linkedin-square: "\f08c";
|
||||||
|
$fa-var-linux: "\f17c";
|
||||||
|
$fa-var-list: "\f03a";
|
||||||
|
$fa-var-list-alt: "\f022";
|
||||||
|
$fa-var-list-ol: "\f0cb";
|
||||||
|
$fa-var-list-ul: "\f0ca";
|
||||||
|
$fa-var-location-arrow: "\f124";
|
||||||
|
$fa-var-lock: "\f023";
|
||||||
|
$fa-var-long-arrow-down: "\f175";
|
||||||
|
$fa-var-long-arrow-left: "\f177";
|
||||||
|
$fa-var-long-arrow-right: "\f178";
|
||||||
|
$fa-var-long-arrow-up: "\f176";
|
||||||
|
$fa-var-magic: "\f0d0";
|
||||||
|
$fa-var-magnet: "\f076";
|
||||||
|
$fa-var-mail-forward: "\f064";
|
||||||
|
$fa-var-mail-reply: "\f112";
|
||||||
|
$fa-var-mail-reply-all: "\f122";
|
||||||
|
$fa-var-male: "\f183";
|
||||||
|
$fa-var-map-marker: "\f041";
|
||||||
|
$fa-var-maxcdn: "\f136";
|
||||||
|
$fa-var-meanpath: "\f20c";
|
||||||
|
$fa-var-medkit: "\f0fa";
|
||||||
|
$fa-var-meh-o: "\f11a";
|
||||||
|
$fa-var-microphone: "\f130";
|
||||||
|
$fa-var-microphone-slash: "\f131";
|
||||||
|
$fa-var-minus: "\f068";
|
||||||
|
$fa-var-minus-circle: "\f056";
|
||||||
|
$fa-var-minus-square: "\f146";
|
||||||
|
$fa-var-minus-square-o: "\f147";
|
||||||
|
$fa-var-mobile: "\f10b";
|
||||||
|
$fa-var-mobile-phone: "\f10b";
|
||||||
|
$fa-var-money: "\f0d6";
|
||||||
|
$fa-var-moon-o: "\f186";
|
||||||
|
$fa-var-mortar-board: "\f19d";
|
||||||
|
$fa-var-music: "\f001";
|
||||||
|
$fa-var-navicon: "\f0c9";
|
||||||
|
$fa-var-newspaper-o: "\f1ea";
|
||||||
|
$fa-var-openid: "\f19b";
|
||||||
|
$fa-var-outdent: "\f03b";
|
||||||
|
$fa-var-pagelines: "\f18c";
|
||||||
|
$fa-var-paint-brush: "\f1fc";
|
||||||
|
$fa-var-paper-plane: "\f1d8";
|
||||||
|
$fa-var-paper-plane-o: "\f1d9";
|
||||||
|
$fa-var-paperclip: "\f0c6";
|
||||||
|
$fa-var-paragraph: "\f1dd";
|
||||||
|
$fa-var-paste: "\f0ea";
|
||||||
|
$fa-var-pause: "\f04c";
|
||||||
|
$fa-var-paw: "\f1b0";
|
||||||
|
$fa-var-paypal: "\f1ed";
|
||||||
|
$fa-var-pencil: "\f040";
|
||||||
|
$fa-var-pencil-square: "\f14b";
|
||||||
|
$fa-var-pencil-square-o: "\f044";
|
||||||
|
$fa-var-phone: "\f095";
|
||||||
|
$fa-var-phone-square: "\f098";
|
||||||
|
$fa-var-photo: "\f03e";
|
||||||
|
$fa-var-picture-o: "\f03e";
|
||||||
|
$fa-var-pie-chart: "\f200";
|
||||||
|
$fa-var-pied-piper: "\f1a7";
|
||||||
|
$fa-var-pied-piper-alt: "\f1a8";
|
||||||
|
$fa-var-pinterest: "\f0d2";
|
||||||
|
$fa-var-pinterest-square: "\f0d3";
|
||||||
|
$fa-var-plane: "\f072";
|
||||||
|
$fa-var-play: "\f04b";
|
||||||
|
$fa-var-play-circle: "\f144";
|
||||||
|
$fa-var-play-circle-o: "\f01d";
|
||||||
|
$fa-var-plug: "\f1e6";
|
||||||
|
$fa-var-plus: "\f067";
|
||||||
|
$fa-var-plus-circle: "\f055";
|
||||||
|
$fa-var-plus-square: "\f0fe";
|
||||||
|
$fa-var-plus-square-o: "\f196";
|
||||||
|
$fa-var-power-off: "\f011";
|
||||||
|
$fa-var-print: "\f02f";
|
||||||
|
$fa-var-puzzle-piece: "\f12e";
|
||||||
|
$fa-var-qq: "\f1d6";
|
||||||
|
$fa-var-qrcode: "\f029";
|
||||||
|
$fa-var-question: "\f128";
|
||||||
|
$fa-var-question-circle: "\f059";
|
||||||
|
$fa-var-quote-left: "\f10d";
|
||||||
|
$fa-var-quote-right: "\f10e";
|
||||||
|
$fa-var-ra: "\f1d0";
|
||||||
|
$fa-var-random: "\f074";
|
||||||
|
$fa-var-rebel: "\f1d0";
|
||||||
|
$fa-var-recycle: "\f1b8";
|
||||||
|
$fa-var-reddit: "\f1a1";
|
||||||
|
$fa-var-reddit-square: "\f1a2";
|
||||||
|
$fa-var-refresh: "\f021";
|
||||||
|
$fa-var-remove: "\f00d";
|
||||||
|
$fa-var-renren: "\f18b";
|
||||||
|
$fa-var-reorder: "\f0c9";
|
||||||
|
$fa-var-repeat: "\f01e";
|
||||||
|
$fa-var-reply: "\f112";
|
||||||
|
$fa-var-reply-all: "\f122";
|
||||||
|
$fa-var-retweet: "\f079";
|
||||||
|
$fa-var-rmb: "\f157";
|
||||||
|
$fa-var-road: "\f018";
|
||||||
|
$fa-var-rocket: "\f135";
|
||||||
|
$fa-var-rotate-left: "\f0e2";
|
||||||
|
$fa-var-rotate-right: "\f01e";
|
||||||
|
$fa-var-rouble: "\f158";
|
||||||
|
$fa-var-rss: "\f09e";
|
||||||
|
$fa-var-rss-square: "\f143";
|
||||||
|
$fa-var-rub: "\f158";
|
||||||
|
$fa-var-ruble: "\f158";
|
||||||
|
$fa-var-rupee: "\f156";
|
||||||
|
$fa-var-save: "\f0c7";
|
||||||
|
$fa-var-scissors: "\f0c4";
|
||||||
|
$fa-var-search: "\f002";
|
||||||
|
$fa-var-search-minus: "\f010";
|
||||||
|
$fa-var-search-plus: "\f00e";
|
||||||
|
$fa-var-send: "\f1d8";
|
||||||
|
$fa-var-send-o: "\f1d9";
|
||||||
|
$fa-var-share: "\f064";
|
||||||
|
$fa-var-share-alt: "\f1e0";
|
||||||
|
$fa-var-share-alt-square: "\f1e1";
|
||||||
|
$fa-var-share-square: "\f14d";
|
||||||
|
$fa-var-share-square-o: "\f045";
|
||||||
|
$fa-var-shekel: "\f20b";
|
||||||
|
$fa-var-sheqel: "\f20b";
|
||||||
|
$fa-var-shield: "\f132";
|
||||||
|
$fa-var-shopping-cart: "\f07a";
|
||||||
|
$fa-var-sign-in: "\f090";
|
||||||
|
$fa-var-sign-out: "\f08b";
|
||||||
|
$fa-var-signal: "\f012";
|
||||||
|
$fa-var-sitemap: "\f0e8";
|
||||||
|
$fa-var-skype: "\f17e";
|
||||||
|
$fa-var-slack: "\f198";
|
||||||
|
$fa-var-sliders: "\f1de";
|
||||||
|
$fa-var-slideshare: "\f1e7";
|
||||||
|
$fa-var-smile-o: "\f118";
|
||||||
|
$fa-var-soccer-ball-o: "\f1e3";
|
||||||
|
$fa-var-sort: "\f0dc";
|
||||||
|
$fa-var-sort-alpha-asc: "\f15d";
|
||||||
|
$fa-var-sort-alpha-desc: "\f15e";
|
||||||
|
$fa-var-sort-amount-asc: "\f160";
|
||||||
|
$fa-var-sort-amount-desc: "\f161";
|
||||||
|
$fa-var-sort-asc: "\f0de";
|
||||||
|
$fa-var-sort-desc: "\f0dd";
|
||||||
|
$fa-var-sort-down: "\f0dd";
|
||||||
|
$fa-var-sort-numeric-asc: "\f162";
|
||||||
|
$fa-var-sort-numeric-desc: "\f163";
|
||||||
|
$fa-var-sort-up: "\f0de";
|
||||||
|
$fa-var-soundcloud: "\f1be";
|
||||||
|
$fa-var-space-shuttle: "\f197";
|
||||||
|
$fa-var-spinner: "\f110";
|
||||||
|
$fa-var-spoon: "\f1b1";
|
||||||
|
$fa-var-spotify: "\f1bc";
|
||||||
|
$fa-var-square: "\f0c8";
|
||||||
|
$fa-var-square-o: "\f096";
|
||||||
|
$fa-var-stack-exchange: "\f18d";
|
||||||
|
$fa-var-stack-overflow: "\f16c";
|
||||||
|
$fa-var-star: "\f005";
|
||||||
|
$fa-var-star-half: "\f089";
|
||||||
|
$fa-var-star-half-empty: "\f123";
|
||||||
|
$fa-var-star-half-full: "\f123";
|
||||||
|
$fa-var-star-half-o: "\f123";
|
||||||
|
$fa-var-star-o: "\f006";
|
||||||
|
$fa-var-steam: "\f1b6";
|
||||||
|
$fa-var-steam-square: "\f1b7";
|
||||||
|
$fa-var-step-backward: "\f048";
|
||||||
|
$fa-var-step-forward: "\f051";
|
||||||
|
$fa-var-stethoscope: "\f0f1";
|
||||||
|
$fa-var-stop: "\f04d";
|
||||||
|
$fa-var-strikethrough: "\f0cc";
|
||||||
|
$fa-var-stumbleupon: "\f1a4";
|
||||||
|
$fa-var-stumbleupon-circle: "\f1a3";
|
||||||
|
$fa-var-subscript: "\f12c";
|
||||||
|
$fa-var-suitcase: "\f0f2";
|
||||||
|
$fa-var-sun-o: "\f185";
|
||||||
|
$fa-var-superscript: "\f12b";
|
||||||
|
$fa-var-support: "\f1cd";
|
||||||
|
$fa-var-table: "\f0ce";
|
||||||
|
$fa-var-tablet: "\f10a";
|
||||||
|
$fa-var-tachometer: "\f0e4";
|
||||||
|
$fa-var-tag: "\f02b";
|
||||||
|
$fa-var-tags: "\f02c";
|
||||||
|
$fa-var-tasks: "\f0ae";
|
||||||
|
$fa-var-taxi: "\f1ba";
|
||||||
|
$fa-var-tencent-weibo: "\f1d5";
|
||||||
|
$fa-var-terminal: "\f120";
|
||||||
|
$fa-var-text-height: "\f034";
|
||||||
|
$fa-var-text-width: "\f035";
|
||||||
|
$fa-var-th: "\f00a";
|
||||||
|
$fa-var-th-large: "\f009";
|
||||||
|
$fa-var-th-list: "\f00b";
|
||||||
|
$fa-var-thumb-tack: "\f08d";
|
||||||
|
$fa-var-thumbs-down: "\f165";
|
||||||
|
$fa-var-thumbs-o-down: "\f088";
|
||||||
|
$fa-var-thumbs-o-up: "\f087";
|
||||||
|
$fa-var-thumbs-up: "\f164";
|
||||||
|
$fa-var-ticket: "\f145";
|
||||||
|
$fa-var-times: "\f00d";
|
||||||
|
$fa-var-times-circle: "\f057";
|
||||||
|
$fa-var-times-circle-o: "\f05c";
|
||||||
|
$fa-var-tint: "\f043";
|
||||||
|
$fa-var-toggle-down: "\f150";
|
||||||
|
$fa-var-toggle-left: "\f191";
|
||||||
|
$fa-var-toggle-off: "\f204";
|
||||||
|
$fa-var-toggle-on: "\f205";
|
||||||
|
$fa-var-toggle-right: "\f152";
|
||||||
|
$fa-var-toggle-up: "\f151";
|
||||||
|
$fa-var-trash: "\f1f8";
|
||||||
|
$fa-var-trash-o: "\f014";
|
||||||
|
$fa-var-tree: "\f1bb";
|
||||||
|
$fa-var-trello: "\f181";
|
||||||
|
$fa-var-trophy: "\f091";
|
||||||
|
$fa-var-truck: "\f0d1";
|
||||||
|
$fa-var-try: "\f195";
|
||||||
|
$fa-var-tty: "\f1e4";
|
||||||
|
$fa-var-tumblr: "\f173";
|
||||||
|
$fa-var-tumblr-square: "\f174";
|
||||||
|
$fa-var-turkish-lira: "\f195";
|
||||||
|
$fa-var-twitch: "\f1e8";
|
||||||
|
$fa-var-twitter: "\f099";
|
||||||
|
$fa-var-twitter-square: "\f081";
|
||||||
|
$fa-var-umbrella: "\f0e9";
|
||||||
|
$fa-var-underline: "\f0cd";
|
||||||
|
$fa-var-undo: "\f0e2";
|
||||||
|
$fa-var-university: "\f19c";
|
||||||
|
$fa-var-unlink: "\f127";
|
||||||
|
$fa-var-unlock: "\f09c";
|
||||||
|
$fa-var-unlock-alt: "\f13e";
|
||||||
|
$fa-var-unsorted: "\f0dc";
|
||||||
|
$fa-var-upload: "\f093";
|
||||||
|
$fa-var-usd: "\f155";
|
||||||
|
$fa-var-user: "\f007";
|
||||||
|
$fa-var-user-md: "\f0f0";
|
||||||
|
$fa-var-users: "\f0c0";
|
||||||
|
$fa-var-video-camera: "\f03d";
|
||||||
|
$fa-var-vimeo-square: "\f194";
|
||||||
|
$fa-var-vine: "\f1ca";
|
||||||
|
$fa-var-vk: "\f189";
|
||||||
|
$fa-var-volume-down: "\f027";
|
||||||
|
$fa-var-volume-off: "\f026";
|
||||||
|
$fa-var-volume-up: "\f028";
|
||||||
|
$fa-var-warning: "\f071";
|
||||||
|
$fa-var-wechat: "\f1d7";
|
||||||
|
$fa-var-weibo: "\f18a";
|
||||||
|
$fa-var-weixin: "\f1d7";
|
||||||
|
$fa-var-wheelchair: "\f193";
|
||||||
|
$fa-var-wifi: "\f1eb";
|
||||||
|
$fa-var-windows: "\f17a";
|
||||||
|
$fa-var-won: "\f159";
|
||||||
|
$fa-var-wordpress: "\f19a";
|
||||||
|
$fa-var-wrench: "\f0ad";
|
||||||
|
$fa-var-xing: "\f168";
|
||||||
|
$fa-var-xing-square: "\f169";
|
||||||
|
$fa-var-yahoo: "\f19e";
|
||||||
|
$fa-var-yelp: "\f1e9";
|
||||||
|
$fa-var-yen: "\f157";
|
||||||
|
$fa-var-youtube: "\f167";
|
||||||
|
$fa-var-youtube-play: "\f16a";
|
||||||
|
$fa-var-youtube-square: "\f166";
|
||||||
|
|
17
hosting/static/hosting/font-awesome/scss/font-awesome.scss
vendored
Executable file
|
@ -0,0 +1,17 @@
|
||||||
|
/*!
|
||||||
|
* Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
|
||||||
|
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
|
||||||
|
*/
|
||||||
|
|
||||||
|
@import "variables";
|
||||||
|
@import "mixins";
|
||||||
|
@import "path";
|
||||||
|
@import "core";
|
||||||
|
@import "larger";
|
||||||
|
@import "fixed-width";
|
||||||
|
@import "list";
|
||||||
|
@import "bordered-pulled";
|
||||||
|
@import "spinning";
|
||||||
|
@import "rotated-flipped";
|
||||||
|
@import "stacked";
|
||||||
|
@import "icons";
|
15
hosting/static/hosting/img/24-hours-support.svg
Executable file
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="90px" height="90px" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
|
||||||
|
<title>Slice 23</title>
|
||||||
|
<desc>Created with Sketch.</desc>
|
||||||
|
<defs></defs>
|
||||||
|
<g id="dashboard" stroke="none" stroke-width="1" fill-rule="evenodd">
|
||||||
|
<g id="24-hours-support" transform="translate(5.000000, 7.000000)" fill-rule="nonzero">
|
||||||
|
<path d="M46.5951681,0.152636732 C38.3819652,0.152636732 30.8805993,3.25307034 25.1957228,8.34311252 C26.4566594,10.3481531 27.1729858,12.6809138 27.2403255,15.0888704 C27.2695061,16.187911 27.3343206,17.2732031 27.4271933,18.3568116 C31.7391809,12.4317567 38.7228726,8.57010354 46.5951681,8.57010354 C59.662163,8.57010354 70.2928624,19.200803 70.2928624,32.2677979 C70.2928624,45.1970269 59.883823,55.7340118 47.0062211,55.9551106 C48.1821412,56.9377096 49.3962205,57.8742931 50.6470561,58.7536378 C52.3616941,59.9632278 53.7488926,61.5384164 54.7222323,63.3400349 C68.5080789,59.7314668 78.7100487,47.1692394 78.7100487,32.2677979 C78.7103293,14.5594118 64.3038348,0.152636732 46.5951681,0.152636732 Z" id="Shape"></path>
|
||||||
|
<path d="M45.8067321,65.6399674 C42.1378389,62.7112501 39.8488491,60.760923 36.5730516,57.7264262 C35.6092516,56.8336136 34.4313674,56.2774996 33.2217774,56.2774996 C32.2961367,56.2774996 31.3819998,56.5723915 30.6294782,57.189953 C29.8528266,57.8437096 29.076175,58.4974662 28.2992428,59.1509422 C21.9864233,51.6487346 17.298736,42.9066342 14.543138,33.4970286 C15.5173195,33.2119571 16.4917816,32.9266049 17.4659631,32.6415334 C19.6129783,31.9841292 20.6230743,29.692053 20.3079804,27.3943652 C19.6225181,22.3932675 19.2501854,19.9087119 18.8259451,15.3242789 C18.6084939,12.9744028 17.0445285,10.9331671 14.8029571,10.8111138 C14.4533517,10.7771633 14.1040268,10.7603284 13.7575078,10.7603284 C5.42140979,10.7603284 -1.83669126,20.422458 0.848200072,32.242826 C4.18909265,46.881362 11.4216607,60.3692302 21.7658857,71.2524537 C26.0032385,75.7013655 31.1942903,77.7159458 35.8825387,77.7159458 C40.8283616,77.7159458 45.2149841,75.4757773 47.3395528,71.4884233 C48.478436,69.5538089 47.6512796,67.1124629 45.8067321,65.6399674 Z" id="Shape"></path>
|
||||||
|
<path d="M36.9372473,32.862071 C34.7172807,34.9218251 33.2647065,36.5413458 32.4975947,37.8123833 C31.956071,38.7088435 31.5610112,39.6566502 31.3227969,40.6294288 C31.2108446,41.087339 31.3138183,41.5626453 31.6053432,41.9338556 C31.8965876,42.3045047 32.3337347,42.517186 32.8051128,42.517186 L43.3993366,42.517186 C44.6973099,42.517186 45.7534214,41.4610745 45.7534214,40.1631011 C45.7534214,38.8651278 44.6973099,37.8090163 43.3993366,37.8090163 L38.615129,37.8090163 C38.6541299,37.7630008 38.6942532,37.7169853 38.7352182,37.6706892 C39.0477868,37.3188391 39.8132151,36.5837137 41.0098983,35.4863566 C42.2649426,34.3345665 43.1123009,33.4720568 43.6002334,32.8494448 C44.3356394,31.9134225 44.8827748,30.9995662 45.2259269,30.1336894 C45.5758129,29.2512583 45.7534214,28.3104661 45.7534214,27.3371264 C45.7534214,25.5907826 45.1209891,24.1084667 43.8738011,22.9305825 C42.63475,21.7622381 40.9290906,21.1702096 38.8033997,21.1702096 C36.8718716,21.1702096 35.2313073,21.6758188 33.9277223,22.673008 C33.1412503,23.2751375 32.5357539,24.1093084 32.1277873,25.1530743 C31.8522556,25.8581775 31.9235235,26.6648514 32.3185832,27.3104711 C32.713643,27.9563714 33.399386,28.3870651 34.1527493,28.4622611 C34.2366433,28.4706786 34.3202569,28.4748873 34.402748,28.4748873 C35.4630683,28.4748873 36.4086304,27.8006482 36.7559912,26.7972862 C36.8648571,26.4827535 37.0087958,26.2327547 37.1844402,26.0537433 C37.5542476,25.6769213 38.0522811,25.4934206 38.7074406,25.4934206 C39.3732622,25.4934206 39.8707345,25.6668204 40.2276351,26.0234404 C40.5836939,26.3794992 40.7568131,26.8988569 40.7568131,27.6115358 C40.7568131,28.2734293 40.5202823,28.9636616 40.0539547,29.6637142 C39.8039559,30.0301546 39.0567654,30.8873333 36.9372473,32.862071 Z" id="Shape"></path>
|
||||||
|
<path d="M58.1464578,21.1702096 L56.3768257,21.1702096 C55.8726195,21.1702096 55.4018025,21.4188055 55.1172921,21.8351895 L46.9332697,33.8154894 C46.6944942,34.1650949 46.5682322,34.5739032 46.5682322,34.9973018 L46.5682322,36.9386502 C46.5682322,37.7795551 47.2525723,38.4638952 48.0934772,38.4638952 L54.8120186,38.4638952 L54.8120186,40.0876245 C54.8120186,41.4274047 55.9020806,42.5174666 57.2418607,42.5174666 C58.5816409,42.5174666 59.6717028,41.4274047 59.6717028,40.0876245 L59.6717028,38.4638952 L59.9144064,38.4638952 C61.1593498,38.4638952 62.1722516,37.4509933 62.1722516,36.20605 C62.1722516,34.9611067 61.1593498,33.9482048 59.9144064,33.9482048 L59.6717028,33.9482048 L59.6717028,22.6954546 C59.6717028,21.8545497 58.9873628,21.1702096 58.1464578,21.1702096 Z M54.8122992,33.9482048 L51.7966014,33.9482048 L54.8122992,29.465062 L54.8122992,33.9482048 Z" id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.9 KiB |
BIN
hosting/static/hosting/img/CH_flag.png
Executable file
After Width: | Height: | Size: 841 B |
BIN
hosting/static/hosting/img/DE_flag.png
Executable file
After Width: | Height: | Size: 741 B |
BIN
hosting/static/hosting/img/ajax-loader.gif
Executable file
After Width: | Height: | Size: 404 B |
BIN
hosting/static/hosting/img/auth-bg-sm.jpg
Executable file
After Width: | Height: | Size: 114 KiB |
BIN
hosting/static/hosting/img/auth-bg.jpg
Executable file
After Width: | Height: | Size: 685 KiB |
BIN
hosting/static/hosting/img/banner-bg copy.jpg
Executable file
After Width: | Height: | Size: 394 KiB |
BIN
hosting/static/hosting/img/banner-bg.jpg
Executable file
After Width: | Height: | Size: 394 KiB |
13
hosting/static/hosting/img/billing.svg
Executable file
|
@ -0,0 +1,13 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="90px" height="90px" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
|
||||||
|
<title>Slice 23</title>
|
||||||
|
<desc>Created with Sketch.</desc>
|
||||||
|
<defs></defs>
|
||||||
|
<g id="dashboard" stroke="none" stroke-width="1" fill-rule="evenodd">
|
||||||
|
<g id="billing.9cb6c82b" transform="translate(10.000000, 8.000000)" fill-rule="nonzero">
|
||||||
|
<path d="M0.432900478,0.106254164 L0.432900478,73.8096859 L13.2526963,67.4020978 L26.0724922,73.8096859 L35.6815644,67.4020978 L48.5013603,73.8096859 L58.1150522,67.4020978 L70.9348481,73.8096859 L70.9348481,0.106254164 L0.432900478,0.106254164 Z M64.5226403,63.4383556 L57.6530776,60.0012643 L48.0393856,66.4088524 L35.2195898,60.0058841 L25.6105176,66.4134722 L13.2526963,60.2368714 L6.84510828,63.4429753 L6.84510828,6.51384222 L64.5226403,6.51384222 L64.5226403,63.4383556 Z" id="Shape"></path>
|
||||||
|
<path d="M18.1542471,16.7096222 L53.9157029,16.7096222 L53.9157029,22.9370402 L18.1542471,22.9370402 L18.1542471,16.7096222 Z M18.1542471,29.1690778 L53.9157029,29.1690778 L53.9157029,35.4011155 L18.1542471,35.4011155 L18.1542471,29.1690778 Z M18.1542471,41.6285335 L53.9157029,41.6285335 L53.9157029,47.8605712 L18.1542471,47.8605712 L18.1542471,41.6285335 Z" id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
BIN
hosting/static/hosting/img/card-django.png
Executable file
After Width: | Height: | Size: 128 KiB |
BIN
hosting/static/hosting/img/card-nodejs.png
Executable file
After Width: | Height: | Size: 142 KiB |
BIN
hosting/static/hosting/img/card-rails.png
Executable file
After Width: | Height: | Size: 142 KiB |
BIN
hosting/static/hosting/img/checkmark.png
Executable file
After Width: | Height: | Size: 8.9 KiB |
BIN
hosting/static/hosting/img/configure.jpg
Executable file
After Width: | Height: | Size: 548 KiB |
45
hosting/static/hosting/img/connected.svg
Executable file
|
@ -0,0 +1,45 @@
|
||||||
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 0 278.898 278.898" style="enable-background:new 0 0 278.898 278.898;" xml:space="preserve">
|
||||||
|
<g>
|
||||||
|
<path d="M269.898,175.773h-20.373V64.751c0-4.971-4.029-9-9-9h-62.702V35.377c0-4.971-4.029-9-9-9h-58.748c-4.971,0-9,4.029-9,9
|
||||||
|
v20.374H38.373c-4.971,0-9,4.029-9,9v111.022H9c-4.971,0-9,4.029-9,9v58.748c0,4.971,4.029,9,9,9h58.747c4.971,0,9-4.029,9-9
|
||||||
|
v-58.748c0-4.971-4.029-9-9-9H47.373V73.751h53.702v20.374c0,4.971,4.029,9,9,9h20.374v72.648h-20.374c-4.971,0-9,4.029-9,9v58.748
|
||||||
|
c0,4.971,4.029,9,9,9h58.748c4.971,0,9-4.029,9-9v-58.748c0-4.971-4.029-9-9-9h-20.374v-72.648h20.374c4.971,0,9-4.029,9-9V73.751
|
||||||
|
h53.702v102.022h-20.374c-4.971,0-9,4.029-9,9v58.748c0,4.971,4.029,9,9,9h58.747c4.971,0,9-4.029,9-9v-58.748
|
||||||
|
C278.898,179.803,274.869,175.773,269.898,175.773z M58.747,234.521H18v-40.748h40.747V234.521z M159.823,234.521h-40.748v-40.748
|
||||||
|
h40.748V234.521z M159.823,85.125h-40.748V44.377h40.748V85.125z M260.898,234.521h-40.747v-40.748h40.747V234.521z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
7
hosting/static/hosting/img/copy.svg
Executable file
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve">
|
||||||
|
<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>
|
||||||
|
<g><path d="M691,160.8V10H269.5C206.3,72.6,143.1,135.2,80,197.8v641.4h227.9V990H920V160.8H691z M269.5,64.4v134.4H133.1C178.5,154,224,109.2,269.5,64.4z M307.9,801.2H117.5V236.8h190.5V47.9h344.5v112.9h-154c-63.5,62.9-127,125.9-190.5,188.8V801.2z M499.5,215.2v134.5H363.1v-1c45.1-44.5,90.2-89,135.3-133.5L499.5,215.2z M881.5,952h-535V386.6H538V198.8h343.5V952z"/></g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 846 B |
14
hosting/static/hosting/img/dashboard_settings.svg
Executable file
|
@ -0,0 +1,14 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="90px" height="90px" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
|
||||||
|
<title>Slice 23</title>
|
||||||
|
<desc>Created with Sketch.</desc>
|
||||||
|
<defs></defs>
|
||||||
|
<g id="dashboard" stroke="none" stroke-width="1" fill-rule="evenodd">
|
||||||
|
<g id="62780" transform="translate(1.000000, 16.000000)" fill-rule="nonzero">
|
||||||
|
<path d="M77.3788837,0.0166335071 L10.5054936,0.0166335071 C4.71263581,0.0166335071 0,4.72907813 0,10.5221271 L0,48.3010279 C0,54.0936945 4.71263581,58.8065215 10.5054936,58.8065215 L77.3786925,58.8065215 C83.1713591,58.8065215 87.883995,54.0936945 87.883995,48.3010279 L87.883995,10.5221271 C87.8841861,4.72907813 83.1715503,0.0166335071 77.3788837,0.0166335071 Z M82.0714446,48.3008367 C82.0714446,50.8883986 79.9662544,52.9933976 77.3788837,52.9933976 L10.5054936,52.9933976 C7.91793174,52.9933976 5.81274156,50.8883986 5.81274156,48.3008367 L5.81274156,22.983683 L82.0712534,22.983683 L82.0714446,48.3008367 L82.0714446,48.3008367 Z M82.0714446,14.6908282 L5.81293275,14.6963727 L5.81293275,10.521936 C5.81293275,7.93437406 7.91812293,5.82918387 10.5056848,5.82918387 L77.3788837,5.82918387 C79.9662544,5.82918387 82.0714446,7.93437406 82.0714446,10.521936 L82.0714446,14.6908282 Z" id="Shape"></path>
|
||||||
|
<path d="M13.0269039,47.6024206 L28.9396256,47.6024206 C29.5093711,47.6024206 29.9716678,47.1405062 29.9716678,46.5707608 L29.9716678,43.4312341 C29.9716678,42.8612975 29.5093711,42.3993831 28.9396256,42.3993831 L13.0269039,42.3993831 C12.4569673,42.3993831 11.9948617,42.8612975 11.9948617,43.4312341 L11.9948617,46.5707608 C11.9946705,47.1405062 12.4567761,47.6024206 13.0269039,47.6024206 Z" id="Shape"></path>
|
||||||
|
<path d="M64.6150569,47.6024206 L69.34815,47.6024206 C72.079869,47.6024206 74.2942285,45.388061 74.2942285,42.6565333 L74.2942285,37.9234402 C74.2942285,35.1919124 72.079869,32.9775529 69.34815,32.9775529 L64.6150569,32.9775529 C61.8835291,32.9775529 59.6691696,35.1919124 59.6691696,37.9234402 L59.6691696,42.6565333 C59.6691696,45.388061 61.8835291,47.6024206 64.6150569,47.6024206 Z" id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
7
hosting/static/hosting/img/delete.svg
Executable file
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve">
|
||||||
|
<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>
|
||||||
|
<g><path d="M185,150h630c19.3,0,35-15.7,35-35s-15.7-35-35-35H605c0-38.7-31.3-70-70-70h-70c-38.7,0-70,31.3-70,70H185c-19.3,0-35,15.7-35,35S165.7,150,185,150z"/><path d="M885,220h-69.9c-0.1,0-0.3,0-0.4,0H395.1c0,0-0.1,0-0.1,0H185.3c-0.1,0-0.2,0-0.3,0h-70c-19.3,0-35,15.7-35,35c0,19.3,15.7,35,35,35h39.9l100.5,670.2C258,977.3,272.7,990,290,990h139.9c0,0,0,0,0,0c0,0,0,0,0,0h140c0,0,0,0,0,0c0,0,0,0,0,0H710c17.3,0,32-12.7,34.6-29.8L845.1,290H885c19.3,0,35-15.7,35-35C920,235.7,904.3,220,885,220z M463.3,920l-31.5-630h136.4l-31.5,630H463.3z M225.6,290h136.1l31.5,630h-73.1L225.6,290z M679.9,920h-73.1l31.5-630h136.1L679.9,920z"/></g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
BIN
hosting/static/hosting/img/deluxeroom.jpg
Executable file
After Width: | Height: | Size: 276 KiB |
BIN
hosting/static/hosting/img/django-intro-bg.png
Executable file
After Width: | Height: | Size: 2.8 MiB |
BIN
hosting/static/hosting/img/dog.png
Executable file
After Width: | Height: | Size: 166 KiB |
BIN
hosting/static/hosting/img/economy.jpg
Executable file
After Width: | Height: | Size: 192 KiB |
BIN
hosting/static/hosting/img/favicon.ico
Executable file
After Width: | Height: | Size: 1.1 KiB |
BIN
hosting/static/hosting/img/g222.png
Executable file
After Width: | Height: | Size: 774 B |
BIN
hosting/static/hosting/img/header-bg.jpg
Executable file
After Width: | Height: | Size: 778 KiB |
BIN
hosting/static/hosting/img/home.png
Executable file
After Width: | Height: | Size: 327 KiB |
BIN
hosting/static/hosting/img/how.png
Executable file
After Width: | Height: | Size: 1.2 MiB |
BIN
hosting/static/hosting/img/how1.png
Executable file
After Width: | Height: | Size: 185 KiB |
BIN
hosting/static/hosting/img/how2.png
Executable file
After Width: | Height: | Size: 618 KiB |
BIN
hosting/static/hosting/img/how4.png
Executable file
After Width: | Height: | Size: 246 KiB |
18
hosting/static/hosting/img/icon-pdf.svg
Executable file
|
@ -0,0 +1,18 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="492px" height="649px" viewBox="0 0 492 649" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
|
||||||
|
<title>icon-pdf</title>
|
||||||
|
<desc>Created with Sketch.</desc>
|
||||||
|
<defs></defs>
|
||||||
|
<g id="Page-1" stroke="none" stroke-width="1" fill-rule="evenodd">
|
||||||
|
<g id="icon-pdf" fill-rule="nonzero">
|
||||||
|
<g id="Group" transform="translate(93.000000, 269.000000)">
|
||||||
|
<path d="M98,47.8 C98,54.8 97,61.7 95.1,66.6 C93.1,72.5 90.1,76.5 86.2,80.5 C82.2,84.5 76.3,87.4 70.4,89.4 C64.5,91.4 55.6,92.3 46.6,92.3 L34.7,92.3 L34.7,134 L0,134 L0,0.3 L45.5,0.3 C54.4,0.3 62.4,1.3 69.3,3.2 C76.2,5.2 81.2,8.2 85.1,12.1 C89.1,16.1 92.1,21 94,27 C96.9,32 98,38.9 98,47.8 Z M61.3,46.8 C61.3,42.8 61.3,39.9 60.3,37.9 C60.3,35.9 59.3,33.9 57.4,32 C56.4,31 54.5,30 52.4,29.1 C50.4,29.1 47.4,28.1 44.5,28.1 L34.6,28.1 L34.6,63.7 L45.5,63.7 C48.4,63.7 50.4,63.7 52.5,62.7 C54.5,61.7 56.5,61.7 57.5,59.8 C58.5,57.8 59.5,56.9 60.4,54.8 C61.3,53.8 61.3,50.8 61.3,46.8 Z" id="Shape"></path>
|
||||||
|
<path d="M214.8,66.6 C214.8,78.5 213.8,89.3 210.8,97.3 C208.8,106.2 204.9,113.1 199.9,118.1 C195,123.1 189,127 182.1,130 C175.2,132 167.3,134 157.3,134 L108.8,134 L108.8,0.3 L156.3,0.3 C166.2,0.3 175.1,1.3 182,4.3 C188.9,7.2 194.9,10.2 199.8,16.2 C204.8,21.2 207.7,28.1 209.7,37 C213.8,44.8 214.8,54.7 214.8,66.6 Z M178.1,65.6 C178.1,58.7 178.1,52.7 177.1,47.8 C176.1,42.8 175.1,39.9 174.2,36.9 C172.2,34 170.2,32.9 168.3,31.9 C165.4,30.9 162.4,30.9 158.4,30.9 L145.6,30.9 L145.6,103.2 L158.4,103.2 C162.4,103.2 165.4,103.2 168.3,102.2 C171.2,101.2 173.3,99.3 174.2,97.2 C176.2,94.3 177.1,91.3 178.2,86.3 C178.1,80.5 178.1,74.5 178.1,65.6 Z" id="Shape"></path>
|
||||||
|
<polygon id="Shape" points="264.3 32 264.3 55.8 304.9 55.8 304.9 85.5 264.3 85.5 264.3 135 229.7 135 229.7 0.3 312.9 0.3 313.9 31 264.4 31 264.4 32"></polygon>
|
||||||
|
</g>
|
||||||
|
<path d="M491.3,649 L0.7,649 L0.7,0 L346.1,0 L491.3,145.2 L491.3,649 L491.3,649 Z M44.7,605 L448.4,605 L448.4,162.8 L327.4,42.9 L44.7,42.9 L44.7,605 Z" id="Shape"></path>
|
||||||
|
<polygon id="Shape" points="469.3 176 315.3 176 315.3 20.9 359.3 20.9 359.3 132 469.3 132"></polygon>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
17
hosting/static/hosting/img/icon-print.svg
Executable file
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="612px" height="612px" viewBox="0 0 612 612" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
|
||||||
|
<title>54471</title>
|
||||||
|
<desc>Created with Sketch.</desc>
|
||||||
|
<defs></defs>
|
||||||
|
<g id="Page-1" stroke="none" stroke-width="1" fill-rule="evenodd">
|
||||||
|
<g id="54471" fill-rule="nonzero">
|
||||||
|
<path d="M0,225.633 L0,386.367 C0,417.272 30.6,417.272 30.6,417.272 L83.454,417.272 L83.454,389.454 L27.818,389.454 L27.818,222.545 L584.181,222.545 L584.181,389.454 L528.545,389.454 L528.545,417.272 L581.4,417.272 C581.4,417.272 612,417.272 612,386.367 L612,225.633 C612,225.633 612,194.727 581.4,194.727 L30.6,194.727 C0,194.728 0,225.633 0,225.633 Z" id="Shape"></path>
|
||||||
|
<polygon id="Shape" points="500.728 166.909 500.728 0 111.273 0 111.273 166.909 139.091 166.909 139.091 27.818 472.909 27.818 472.909 166.909"></polygon>
|
||||||
|
<path d="M528.546,292.091 C528.546,278.182 514.358,278.182 514.358,278.182 L97.642,278.182 C97.642,278.182 83.455,278.182 83.455,292.091 C83.455,306 97.642,306 97.642,306 L514.359,306 C514.358,306 528.546,306 528.546,292.091 Z" id="Shape"></path>
|
||||||
|
<rect id="Rectangle-path" x="166.909" y="500.728" width="278.182" height="27.818"></rect>
|
||||||
|
<path d="M500.728,612 L500.728,389.454 L111.273,389.454 L111.273,612 L500.728,612 Z M139.091,417.272 L472.909,417.272 L472.909,584.181 L139.091,584.181 L139.091,417.272 Z" id="Shape"></path>
|
||||||
|
<rect id="Rectangle-path" x="166.909" y="445.091" width="278.182" height="27.818"></rect>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
BIN
hosting/static/hosting/img/intro-bg.jpg
Executable file
After Width: | Height: | Size: 549 KiB |