Include hosting and stripe
4
.gitignore
vendored
|
@ -1,2 +1,6 @@
|
|||
venv/*
|
||||
.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'.
|
||||
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
|
||||
# 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!
|
||||
DEBUG = True
|
||||
|
||||
|
@ -39,6 +39,10 @@ INSTALLED_APPS = [
|
|||
'django.contrib.sessions',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
'django.contrib.sites',
|
||||
'bootstrap3',
|
||||
'guardian',
|
||||
'hosting',
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
|
@ -56,8 +60,11 @@ ROOT_URLCONF = 'dynamicweb2.urls'
|
|||
TEMPLATES = [
|
||||
{
|
||||
'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,
|
||||
'OPTIONS': {
|
||||
'context_processors': [
|
||||
|
@ -65,11 +72,17 @@ TEMPLATES = [
|
|||
'django.template.context_processors.request',
|
||||
'django.contrib.auth.context_processors.auth',
|
||||
'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'
|
||||
|
||||
|
||||
|
@ -114,11 +127,17 @@ USE_I18N = True
|
|||
|
||||
USE_TZ = True
|
||||
|
||||
|
||||
# Static files (CSS, JavaScript, Images)
|
||||
# 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
|
||||
# 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)
|
||||
|
||||
|
||||
PROJECT_DIR = os.path.abspath(
|
||||
os.path.join(os.path.dirname(__file__), ".."),
|
||||
)
|
||||
# SECURITY WARNING: keep the secret key used in production secret!
|
||||
SECRET_KEY = env('SECRET_KEY')
|
||||
|
||||
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'))
|
||||
|
||||
# Search union over OUs
|
||||
# Search union over OUsss
|
||||
AUTH_LDAP_START_TLS = bool(os.environ.get('LDAP_USE_TLS', False))
|
||||
|
||||
ENTIRE_SEARCH_BASE = env("ENTIRE_SEARCH_BASE")
|
||||
|
@ -157,4 +175,94 @@ AUTH_LDAP_USER_ATTR_MAP = {
|
|||
"first_name": "givenName",
|
||||
"last_name": "sn",
|
||||
"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'))
|
||||
"""
|
||||
from django.contrib import admin
|
||||
from django.urls import path
|
||||
from django.urls import re_path, path, include
|
||||
|
||||
urlpatterns = [
|
||||
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 |