Merge commit 'bf9e0731bcd036956918559645d2a8cd4a3a2c94'

# Conflicts:
#	README.md
#	SWSCloudCore/__init__.py
#	SWSCloudCore/static/css/gocloud.css
#	SWSCloudCore/static/css/hp.css
#	SWSCloudCore/static/css/normalize.css
#	SWSCloudCore/static/css/style.css
#	SWSCloudCore/templates/default/_header.html
#	SWSCloudCore/templates/default/containers/index.html
#	SWSCloudCore/templates/default/homepage/index.en.html
#	SWSCloudCore/templates/default/id/_account_information_edit.html
#	SWSCloudCore/templates/default/id/_account_information_view.html
#	SWSCloudCore/templates/default/id/billing.html
#	SWSCloudCore/templates/default/id/edit.html
#	SWSCloudCore/templates/default/tasks/index.html
#	SWSCloudCore/templates/errors/403.html
#	SWSCloudCore/templates/errors/404.html
#	SWSCloudCore/templates/errors/410.html
#	SWSCloudCore/templates/errors/500.html
#	SWSCloudCore/views/account/__init__.py
#	SWSCloudCore/views/api/__init__.py
#	SWSCloudCore/views/containers/__init__.py
#	SWSCloudCore/views/payments/__init__.py
#	app/static/css/app.css
#	app/static/css/gocloud.css
#	app/templates/default/_footer.html
#	app/templates/default/errors/404.html
#	app/templates/default/errors/410.html
#	app/templates/default/errors/500.html
#	app/templates/default/homepage/index.html
#	app/templates/default/id/_account_information_view.html
#	app/templates/default/settings/profile/_account_information_view.html
#	app/templates/default/tasks/index.html
#	app/templates/default/tasks/index.ru.html
#	app/templates/errors/404.html
#	app/templates/errors/410.html
#	app/templates/errors/500.html
#	kb/README.md
This commit is contained in:
Vyacheslav Anzhiganov 2016-04-02 02:20:12 +03:00
commit d6f4a0e348
3904 changed files with 2355 additions and 559 deletions

View file

@ -1,81 +1,2 @@
# using
# GoCloud
To start client-side app
`uwsgi --socket 0.0.0.0:8000 --protocol=http -w app:app`
or
`uwsgi --http 127.0.0.1:8080 -w app:app`
`python control.py`
# install
`pip install peewee`
`pip install PyMySQL`
## rules statuses
0 - Неактивно
1 - Активно
2 - Процесс активации
3 - Процесс деактивации
4 - Создание...
5 - Удаление...
# CRON
`0 * * * * cd /var/lib/procdn/control;python cdn_billing.py`
# Keys in 'Settings' table
## SMTP
`SMTP_SERVER`
`SMTP_PORT`
`SMTP_USERNAME`
`SMTP_PASSWORD`
`SMTP_TIMEOUT`
## Payments
### Robokassa
`PAY_ROBOKASA_LOGIN`
`PAY_ROBOKASA_PASSWORD1`
`PAY_ROBOKASA_PASSWORD2`
### Paypal
TODO
# API calls
## /api/pricing
Require auth: no
## /api/countries
Require auth: no
## /api/rules
Require auth: yes
## /api/rules/<rule_id>/details
Require auth: yes
## /api/rules/<rule_id>/statistics
Require auth: yes

View file

@ -1,31 +1,26 @@
# coding: utf-8
# import ConfigParser
from flask import g
from flask import Flask
from flask import session
from flask import request
from flask import render_template
from flask import Flask, g, render_template, request
from flask_babel import Babel
from flaskext.markdown import Markdown
from app.cloud.views import viewHomepage
from app.cloud.views.documents import viewDocuments
from app.cloud.views.settings import viewSettings
from app.cloud.views.kb import viewKB
from app.cloud.views.support import viewSupport
from app.cloud.views.account import viewAccount
from app.cloud.views.tasks import viewTasks
from app.cloud.views.payments import viewPayments
from app.cloud.views.containers import viewContainers
from app.cloud.views.administrator import viewAdministrator
from app.cloud.views.api import viewAPI
from app.cloud.views.server_api import viewServerAPI
from app.settings import settings
from app import models
from app.models import database
from SWSCloudCore.views import viewHomepage
from SWSCloudCore.views.account import viewAccount
from SWSCloudCore.views.administrator import viewAdministrator
from SWSCloudCore.views.api import viewAPI
from SWSCloudCore.views.containers import viewContainers
from SWSCloudCore.views.documents import viewDocuments
from SWSCloudCore.views.kb import viewKB
from SWSCloudCore.views.server_api import viewServerAPI
from SWSCloudCore.views.support import viewSupport
from SWSCloudCore.views.tasks import viewTasks
from SWSCloudCore.views.payments import viewPayments
app = Flask(__name__)
from SWSCloudCore import models
from SWSCloudCore.models import database
from SWSCloudCore.settings import settings
app = Flask(__name__, static_folder='static', static_url_path='')
# app.config['SERVER_NAME'] = settings.get('Application', 'SERVER_NAME')
app.config['DEBUG'] = settings.getboolean('Application', 'DEBUG')
app.config['SECRET_KEY'] = settings.get("Application", "SECRET_KEY")
@ -49,30 +44,29 @@ app.register_blueprint(viewAccount)
app.register_blueprint(viewPayments)
# /api
app.register_blueprint(viewServerAPI)
app.register_blueprint(viewSettings)
# /administrator
app.register_blueprint(viewAdministrator)
@app.errorhandler(404)
def page_not_found(e):
return render_template('default/errors/404.html'), 404
return render_template('errors/404.html'), 404
@app.errorhandler(403)
def page_not_found(e):
return render_template('default/errors/403.html'), 403
return render_template('errors/403.html'), 403
@app.errorhandler(410)
def page_not_found(e):
return render_template('default/errors/410.html'), 410
return render_template('errors/410.html'), 410
@app.errorhandler(500)
def page_not_found(e):
print e
return render_template('default/errors/500.en.html'), 500
return render_template('errors/500.html'), 500
@app.before_request
@ -88,7 +82,7 @@ def before_request():
print e
print request.path
# g.endpoint = request.endpoint.replace('.', '/')
return render_template('default/errors/500.en.html'), 500
return render_template('errors/500.html'), 500
# извлекаем настройки и определяем их в глобальную переменную
for setting in models.Settings.select(models.Settings.key, models.Settings.val).execute():

View file

@ -1,6 +1,8 @@
# coding: utf-8
from hashlib import md5
from flask import session
from app import models
from SWSCloudCore import models
class ControllerAdministrators:
@ -12,6 +14,7 @@ class ControllerAdministrators:
:param email:
:param password:
:param status:
:return:
"""
result = models.Admins.select().\

View file

@ -1,5 +1,6 @@
# coding: utf-8
from app import models
from SWSCloudCore import models
class ControllerBilling:

View file

@ -1,22 +1,19 @@
# coding: utf-8
import re
import datetime
import json
import uuid
import smtplib
import logging
import string
import random
import re
import smtplib
from hashlib import md5
import string
import uuid
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from hashlib import md5
from flask import render_template
from flask import g
from flask import g, render_template
from app import models
from SWSCloudCore import models
class ControllerCommon:

View file

@ -1,9 +1,8 @@
# coding: utf-8
import uuid
import datetime
from peewee import fn
from app import models
from SWSCloudCore import models
class ControllerContainers:
@ -36,6 +35,9 @@ class ControllerContainers:
models.Containers.ipv6,
models.Containers.status,
models.ContainersStatisticsState.size,
models.ContainersStatisticsState.cpu,
models.ContainersStatisticsState.memory,
models.ContainersStatisticsState.net_total,
).join(models.ContainersStatisticsState).where(
models.Containers.user == self.user_id
)
@ -50,6 +52,11 @@ class ControllerContainers:
'ipv6': item.ipv6,
'status': item.status,
'size': item.containersstatisticsstate.size,
'cpu': item.containersstatisticsstate.cpu,
'memory': item.containersstatisticsstate.memory,
'net_tx': item.containersstatisticsstate.net_tx,
'net_rx': item.containersstatisticsstate.net_rx,
'net_total': item.containersstatisticsstate.net_total,
})
return containers
@ -82,10 +89,11 @@ class ControllerContainersStatistics:
def size_get(self, days=7):
last_days = datetime.datetime.now() - datetime.timedelta(days=days)
return models.ContainersStatistics.select().where(
results = models.ContainersStatistics.select().where(
models.ContainersStatistics.container == self.container_id,
models.ContainersStatistics.created > last_days
)
return results
def traffic_total_get(self, days):
last_days = datetime.datetime.now() - datetime.timedelta(days=days)
@ -101,6 +109,11 @@ class ControllerContainersStatistics:
class ControllerContainersStatisticsState:
def get(self, container_id):
"""
Получение данных последнего отчёта
:param container_id:
:return:
"""
return models.ContainersStatisticsState.select().where(
models.ContainersStatisticsState.container == container_id
).execute()
@ -111,6 +124,11 @@ class ControllerContainersStatisticsState:
return self.create(container_id, statistics)
def exists(self, container_id):
"""
Проверка наличияя записи отчёта в таблице
:param container_id:
:return:
"""
if models.ContainersStatisticsState.select().where(
models.ContainersStatisticsState.container == container_id
).count() == 0:

View file

@ -1,4 +1,4 @@
from app import models
from SWSCloudCore import models
class ControllerManageContainers:

View file

@ -1,8 +1,6 @@
# coding: utf-8
import uuid
from peewee import fn
from app import models
from SWSCloudCore import models
class ControllerContainersServer:

View file

@ -1,4 +1,4 @@
from app import models
from SWSCloudCore import models
class ControllerDataCenters:

View file

@ -1,4 +1,4 @@
from app import models
from SWSCloudCore import models
__author__ = 'vanzhiganov'
@ -11,11 +11,24 @@ class ControllerManageDatacenters:
return models.DataCenters.select().where(models.DataCenters.id == datacenter_id).limit(1)[0]
def items_get(self):
return {
results = {
'total': models.DataCenters.select().count(),
'items': models.DataCenters.select()
'items': []
}
if results['total'] > 0:
for i in models.DataCenters.select():
# results['items'].append({i})
results['items'].append({
'id': i.id,
'code': i.code,
'name': i.name,
'country': i.country,
'city': i.city,
'status': i.status,
})
return results
def check_exists(self, datacenter_id):
if models.DataCenters.select().where(models.DataCenters.id == datacenter_id).count() == 0:
return False

View file

@ -0,0 +1,26 @@
# coding: utf-8
from SWSCloudCore import models
class ControllerIps:
def __init__(self):
pass
def getfree(self, datacenter_id):
# select IP
return models.Ips.select().where(
models.Ips.datacenter == datacenter_id and models.Ips.status == 0
)[0]
def setbusy(self, ip_id):
# mark ip as busy (taken)
up = models.Ips.update(status=1).where(models.Ips.id == ip_id)
up.execute()
return True
def setfree(self, ip_id):
# mark ip as busy (taken)
up = models.Ips.update(status=0).where(models.Ips.id == ip_id)
up.execute()
return True

View file

@ -0,0 +1,87 @@
# coding: utf-8
import socket
from SWSCloudCore import models
class ControllerManageIPs:
def item_create(self, datacenter_id, server_id, ipv4, ipv4_gateway, ipv6, ipv6_gateway, status):
"""
Запись данных об IP
:param datacenter_id:
:param server_id:
:param ipv4:
:param ipv4_gateway:
:param ipv6:
:param ipv6_gateway:
:param status:
:return:
"""
models.Ips.create(
server=server_id,
datacenter=datacenter_id,
ipv4=ipv4,
ipv4_gateway=ipv4_gateway,
ipv6=ipv6,
ipv6_gateway=ipv6_gateway,
status=status
)
def item_update(self, ip_id, server_id, ipv4, ipv4_gateway, ipv6, ipv6_gateway, status):
# def update(self, user_id, **kwargs):
x = models.Ips.update(
server=server_id,
ipv4=ipv4,
ipv4_gateway=ipv4_gateway,
ipv6=ipv6,
ipv6_gateway=ipv6_gateway,
status=status
).where(
models.Ips.id == ip_id
)
x.execute()
return True
def items_get(self):
return {
'total': models.Ips.select().count(),
'items': models.Ips.select()
}
def item_get(self, ip_id):
return models.Ips.select().where(models.Ips.id == ip_id)[0]
def check_ipv4_exists(self, ipv4):
if models.Ips.select().where(models.Ips.ipv4 == ipv4).count() == 0:
return False
return True
def check_ipv6_exists(self, ipv6):
if models.Ips.select().where(models.Ips.ipv4 == ipv6).count() > 0:
return False
return True
def is_valid_ipv4_address(self, address):
# from: http://stackoverflow.com/questions/319279/how-to-validate-ip-address-in-python
try:
socket.inet_pton(socket.AF_INET, address)
except AttributeError: # no inet_pton here, sorry
try:
socket.inet_aton(address)
except socket.error:
return False
return address.count('.') == 3
except socket.error: # not a valid address
return False
return True
def is_valid_ipv6_address(self, address):
# from: http://stackoverflow.com/questions/319279/how-to-validate-ip-address-in-python
try:
socket.inet_pton(socket.AF_INET6, address)
except socket.error: # not a valid address
return False
return True

View file

@ -0,0 +1,19 @@
# coding: utf-8
import os
class ControllerKB:
def __init__(self):
pass
def is_exists(self, document):
if os.path.exists('kb/%s.md' % document):
return True
return False
def get(self, document):
kb_markdown = u''
for ss in file('kb/%s.md' % document, 'r'):
kb_markdown += ss.decode('UTF-8')
return kb_markdown

View file

@ -1,6 +1,6 @@
# coding: utf-8
from app import models
from SWSCloudCore import models
class ControllerPayments:

View file

@ -1,6 +1,3 @@
from app import models
class ControllerServerServerAPI:
def report_set(self):
pass

View file

@ -0,0 +1,8 @@
# coding: utf-8
__author__ = 'vanzhiganov'
class ControllerServers:
def __init__(self):
pass

View file

@ -1,4 +1,4 @@
from app import models
from SWSCloudCore import models
__author__ = 'vanzhiganov'

View file

@ -1,5 +1,6 @@
import datetime
from app import models
from SWSCloudCore import models
class ControllerServerStatistics:

View file

@ -0,0 +1,8 @@
# coding: utf-8
__author__ = 'vanzhiganov'
class ControllerSettings:
def __init__(self):
pass

View file

@ -0,0 +1,15 @@
# coding: utf-8
class ControllerManageSettings:
def __init__(self):
pass
def get(self):
return None
def set(self):
return None
def delete(self):
return None

View file

@ -1,6 +1,7 @@
import json
import uuid
from app import models
from SWSCloudCore import models
class ControllerTasks:

View file

@ -1,5 +1,6 @@
import json
from app import models
from SWSCloudCore import models
class ControllerManageTasks:

View file

@ -1,8 +1,11 @@
# coding: utf-8
import json
from app import models
from app.cloud.controllers.containers.server import ControllerContainersServer
from SWSCloudCore import models
from SWSCloudCore.controllers.containers.server import ControllerContainersServer
# from peewee import fn
@ -68,18 +71,32 @@ class ControllerTasksServer:
ns = models.Ips.update(status=0).where(
models.Ips.ipv4 << models.Containers.select(models.Containers.ipv4).where(
models.Containers.id == task['plain']['container_id']
models.Containers.id == task['plain']['container_id'],
models.Containers.ipv4 != ''
)
)
ns.execute()
ns = models.Ips.update(status=0).where(
models.Ips.ipv6 << models.Containers.select(models.Containers.ipv6).where(
models.Containers.id == task['plain']['container_id']
models.Containers.id == task['plain']['container_id'],
models.Containers.ipv6 != ''
)
)
ns.execute()
# delete all container statistics
delstats = models.ContainersStatistics.delete().where(
models.ContainersStatistics.container == task['plain']['container_id']
)
delstats.execute()
# delete stats state
delstatsstate = models.ContainersStatisticsState.delete().where(
models.ContainersStatisticsState.container == task['plain']['container_id']
)
delstatsstate.execute()
delcontainer = models.Containers.delete().where(models.Containers.id == task['plain']['container_id'])
delcontainer.execute()

View file

@ -0,0 +1,21 @@
# coding: utf-8
class ControllerTeam:
def __init__(self):
pass
def create(self, owner_id, team_name, description):
return None
def delete(self, team_id):
return None
def member_invite(self, team_id, email):
return None
def member_delete(self, team_id, email):
return None
def members_get(self, team_id):
return None

View file

@ -1,10 +1,11 @@
# coding: utf-8
import string
import random
import string
import uuid
from hashlib import md5
from app import models
from SWSCloudCore import models
class ControllerUsers:

View file

@ -1,6 +1,6 @@
# coding: utf-8
from app import models
from SWSCloudCore import models
from . import ControllerUsersDetails

View file

@ -1,10 +1,12 @@
# coding: utf-8
import datetime
from peewee import PostgresqlDatabase
from peewee import Model, UUIDField, CharField, ForeignKeyField, IntegerField
from peewee import DateTimeField, TextField, FloatField, BigIntegerField
from app.settings import settings
from peewee import Model, UUIDField, CharField, ForeignKeyField, IntegerField
from peewee import PostgresqlDatabase
from SWSCloudCore.settings import settings
# connect to database
database = PostgresqlDatabase(

View file

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 106 KiB

View file

@ -1,48 +1,48 @@
@font-face {
font-family: 'Clear Sans';
src: local('Clear Sans Thin'), local('ClearSans-Thin'), url('/static/fonts/clearsans/200.woff2') format('woff2'), url('/static/fonts/clearsans/200.woff') format('woff');
src: local('Clear Sans Thin'), local('ClearSans-Thin'), url('/fonts/clearsans/200.woff2') format('woff2'), url('/fonts/clearsans/200.woff') format('woff');
font-weight: 200;
font-style: normal;
}
@font-face {
font-family: 'Clear Sans';
src: local('Clear Sans Light'), local('ClearSans-Light'), url('/static/fonts/clearsans/300.woff2') format('woff2'), url('/static/fonts/clearsans/300.woff') format('woff');
src: local('Clear Sans Light'), local('ClearSans-Light'), url('/fonts/clearsans/300.woff2') format('woff2'), url('/fonts/clearsans/300.woff') format('woff');
font-weight: 300;
font-style: normal;
}
@font-face {
font-family: 'Clear Sans';
src: local('Clear Sans'), local('ClearSans'), url('/static/fonts/clearsans/400.woff2') format('woff2'), url('/static/fonts/clearsans/400.woff') format('woff');
src: local('Clear Sans'), local('ClearSans'), url('/fonts/clearsans/400.woff2') format('woff2'), url('/fonts/clearsans/400.woff') format('woff');
font-weight: 400;
font-style: normal;
}
@font-face {
font-family: 'Clear Sans';
src: local('Clear Sans Italic'), local('ClearSans-Italic'), url('/static/fonts/clearsans/400i.woff2') format('woff2'), url('/static/fonts/clearsans/400i.woff') format('woff');
src: local('Clear Sans Italic'), local('ClearSans-Italic'), url('/fonts/clearsans/400i.woff2') format('woff2'), url('/fonts/clearsans/400i.woff') format('woff');
font-weight: 400;
font-style: italic;
}
@font-face {
font-family: 'Clear Sans';
src: local('Clear Sans Medium'), local('ClearSans-Medium'), url('/static/fonts/clearsans/500.woff2') format('woff2'), url('/static/fonts/clearsans/500.woff') format('woff');
src: local('Clear Sans Medium'), local('ClearSans-Medium'), url('/fonts/clearsans/500.woff2') format('woff2'), url('/fonts/clearsans/500.woff') format('woff');
font-weight: 500;
font-style: normal;
}
@font-face {
font-family: 'Clear Sans';
src: local('Clear Sans Medium Italic'), local('ClearSans-MediumItalic'), url('/static/fonts/clearsans/500i.woff2') format('woff2'), url('/static/fonts/clearsans/500i.woff') format('woff');
src: local('Clear Sans Medium Italic'), local('ClearSans-MediumItalic'), url('/fonts/clearsans/500i.woff2') format('woff2'), url('/fonts/clearsans/500i.woff') format('woff');
font-weight: 500;
font-style: italic;
}
@font-face {
font-family: 'Clear Sans';
src: local('Clear Sans Bold'), local('ClearSans-Bold'), url('/static/fonts/clearsans/700.woff2') format('woff2'), url('/static/fonts/clearsans/700.woff') format('woff');
src: local('Clear Sans Bold'), local('ClearSans-Bold'), url('/fonts/clearsans/700.woff2') format('woff2'), url('/fonts/clearsans/700.woff') format('woff');
font-weight: 700;
font-style: normal;
}
@font-face {
font-family: 'Clear Sans';
src: local('Clear Sans Bold Italic'), local('ClearSans-BoldItalic'), url('/static/fonts/clearsans/700i.woff2') format('woff2'), url('/static/fonts/clearsans/700i.woff') format('woff');
src: local('Clear Sans Bold Italic'), local('ClearSans-BoldItalic'), url('/fonts/clearsans/700i.woff2') format('woff2'), url('/fonts/clearsans/700i.woff') format('woff');
font-weight: 700;
font-style: italic;
}

View file

@ -0,0 +1,80 @@
@import "/css/fonts/clearsans.css";
body {
font-family: 'Clear sans';
}
header {
background: #333 none repeat scroll 0% 0%;
}
#banner {
overflov: hidden;
padding: 4em 0em 5em;
background: #202020 none repeat scroll 0% 0% / cover;
background-position:
color: rgba(255, 255, 255, 0.8);
background: transparent url(/images/promo/bg2.png) repeat-x scroll 0% 0%;
}
#banner p {
text-align: center;
}
#banner #slogan {
opacity: 0.8;
font-family: 'Clear sans';
font-size: 36px;
color: #FFF;
font-weight: 200;
}
#banner #sub {
opacity: 0.5;
font-family: 'Clear sans';
font-size: 24px;
color: #FFF;
font-weight: 200;
}
#banner {
margin-bottom: 50px;
}
footer {
border-top: 1px solid #999;
}
footer .row {
margin-top: 25px;
margin-bottom: 25px;
}
.price {
text-align: right;
}
.price span {
color: red; font-weight: bolder;
}
ul#paymentlist {
list-style: none;
background: #000;
}
ul#paymentlist li {
float: left;
margin-left: 15px;
margin-right: 15px;
}
ul#paymentlist li img {
height: 38px;
margin-top: 15px;
margin-bottom: 15px;
}
ul#features-list {
/* list-style: none; */
font-size: 1.5em;
}
ul#features-list li {
font-family: 'Clear sans';
margin-left: 15px;
}

View file

@ -0,0 +1,29 @@
#logo {
margin-top: 15px;
margin-bottom: 15px;
}
footer {
margin-top: 30px;
}
.top-bar {
background: none repeat scroll 0% 0% #371A5B;
}
.top-bar-section ul li {
/*background: none repeat scroll 0% 0% #371A5B;*/
}
.top-bar-section li:not(.has-form) a:not(.button) {
background: none repeat scroll 0% 0% #371A5B;
}
.top-bar-section li:hover(.has-form) a:hover(.button) {
/*background: none repeat scroll 0% 0% #371A5B;*/
}
.top-bar-section ul li {
background: none repeat scroll 0% 0% #371A5B;
}

427
SWSCloudCore/static/css/normalize.css vendored Normal file
View file

@ -0,0 +1,427 @@
/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
/**
* 1. Set default font family to sans-serif.
* 2. Prevent iOS text size adjust after orientation change, without disabling
* user zoom.
*/
html {
font-family: sans-serif; /* 1 */
-ms-text-size-adjust: 100%; /* 2 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/**
* Remove default margin.
*/
body {
margin: 0;
}
/* HTML5 display definitions
========================================================================== */
/**
* Correct `block` display not defined for any HTML5 element in IE 8/9.
* Correct `block` display not defined for `details` or `summary` in IE 10/11
* and Firefox.
* Correct `block` display not defined for `main` in IE 11.
*/
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
menu,
nav,
section,
summary {
display: block;
}
/**
* 1. Correct `inline-block` display not defined in IE 8/9.
* 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
*/
audio,
canvas,
progress,
video {
display: inline-block; /* 1 */
vertical-align: baseline; /* 2 */
}
/**
* Prevent modern browsers from displaying `audio` without controls.
* Remove excess height in iOS 5 devices.
*/
audio:not([controls]) {
display: none;
height: 0;
}
/**
* Address `[hidden]` styling not present in IE 8/9/10.
* Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
*/
[hidden],
template {
display: none;
}
/* Links
========================================================================== */
/**
* Remove the gray background color from active links in IE 10.
*/
a {
background-color: transparent;
}
/**
* Improve readability when focused and also mouse hovered in all browsers.
*/
a:active,
a:hover {
outline: 0;
}
/* Text-level semantics
========================================================================== */
/**
* Address styling not present in IE 8/9/10/11, Safari, and Chrome.
*/
abbr[title] {
border-bottom: 1px dotted;
}
/**
* Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
*/
b,
strong {
font-weight: bold;
}
/**
* Address styling not present in Safari and Chrome.
*/
dfn {
font-style: italic;
}
/**
* Address variable `h1` font-size and margin within `section` and `article`
* contexts in Firefox 4+, Safari, and Chrome.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/**
* Address styling not present in IE 8/9.
*/
mark {
background: #ff0;
color: #000;
}
/**
* Address inconsistent and variable font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
/* Embedded content
========================================================================== */
/**
* Remove border when inside `a` element in IE 8/9/10.
*/
img {
border: 0;
}
/**
* Correct overflow not hidden in IE 9/10/11.
*/
svg:not(:root) {
overflow: hidden;
}
/* Grouping content
========================================================================== */
/**
* Address margin not present in IE 8/9 and Safari.
*/
figure {
margin: 1em 40px;
}
/**
* Address differences between Firefox and other browsers.
*/
hr {
-moz-box-sizing: content-box;
box-sizing: content-box;
height: 0;
}
/**
* Contain overflow in all browsers.
*/
pre {
overflow: auto;
}
/**
* Address odd `em`-unit font size rendering in all browsers.
*/
code,
kbd,
pre,
samp {
font-family: monospace, monospace;
font-size: 1em;
}
/* Forms
========================================================================== */
/**
* Known limitation: by default, Chrome and Safari on OS X allow very limited
* styling of `select`, unless a `border` property is set.
*/
/**
* 1. Correct color not being inherited.
* Known issue: affects color of disabled elements.
* 2. Correct font properties not being inherited.
* 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
*/
button,
input,
optgroup,
select,
textarea {
color: inherit; /* 1 */
font: inherit; /* 2 */
margin: 0; /* 3 */
}
/**
* Address `overflow` set to `hidden` in IE 8/9/10/11.
*/
button {
overflow: visible;
}
/**
* Address inconsistent `text-transform` inheritance for `button` and `select`.
* All other form control elements do not inherit `text-transform` values.
* Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
* Correct `select` style inheritance in Firefox.
*/
button,
select {
text-transform: none;
}
/**
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
* and `video` controls.
* 2. Correct inability to style clickable `input` types in iOS.
* 3. Improve usability and consistency of cursor style between image-type
* `input` and others.
*/
button,
html input[type="button"], /* 1 */
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button; /* 2 */
cursor: pointer; /* 3 */
}
/**
* Re-set default cursor for disabled elements.
*/
button[disabled],
html input[disabled] {
cursor: default;
}
/**
* Remove inner padding and border in Firefox 4+.
*/
button::-moz-focus-inner,
input::-moz-focus-inner {
border: 0;
padding: 0;
}
/**
* Address Firefox 4+ setting `line-height` on `input` using `!important` in
* the UA stylesheet.
*/
input {
line-height: normal;
}
/**
* It's recommended that you don't attempt to style these elements.
* Firefox's implementation doesn't respect box-sizing, padding, or width.
*
* 1. Address box sizing set to `content-box` in IE 8/9/10.
* 2. Remove excess padding in IE 8/9/10.
*/
input[type="checkbox"],
input[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* Fix the cursor style for Chrome's increment/decrement buttons. For certain
* `font-size` values of the `input`, it causes the cursor style of the
* decrement button to change from `default` to `text`.
*/
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Address `appearance` set to `searchfield` in Safari and Chrome.
* 2. Address `box-sizing` set to `border-box` in Safari and Chrome
* (include `-moz` to future-proof).
*/
input[type="search"] {
-webkit-appearance: textfield; /* 1 */
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box; /* 2 */
box-sizing: content-box;
}
/**
* Remove inner padding and search cancel button in Safari and Chrome on OS X.
* Safari (but not Chrome) clips the cancel button when the search input has
* padding (and `textfield` appearance).
*/
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* Define consistent border, margin, and padding.
*/
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
/**
* 1. Correct `color` not being inherited in IE 8/9/10/11.
* 2. Remove padding so people aren't caught out if they zero out fieldsets.
*/
legend {
border: 0; /* 1 */
padding: 0; /* 2 */
}
/**
* Remove default vertical scrollbar in IE 8/9/10/11.
*/
textarea {
overflow: auto;
}
/**
* Don't inherit the `font-weight` (applied by a rule above).
* NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
*/
optgroup {
font-weight: bold;
}
/* Tables
========================================================================== */
/**
* Remove most spacing between table cells.
*/
table {
border-collapse: collapse;
border-spacing: 0;
}
td,
th {
padding: 0;
}

View file

@ -0,0 +1,29 @@
#logo {
margin-top: 15px;
margin-bottom: 15px;
}
footer {
margin-top: 30px;
}
.top-bar {
background: none repeat scroll 0% 0% #371A5B;
}
.top-bar-section ul li {
/*background: none repeat scroll 0% 0% #371A5B;*/
}
.top-bar-section li:not(.has-form) a:not(.button) {
background: none repeat scroll 0% 0% #371A5B;
}
.top-bar-section li:hover(.has-form) a:hover(.button) {
/*background: none repeat scroll 0% 0% #371A5B;*/
}
.top-bar-section ul li {
background: none repeat scroll 0% 0% #371A5B;
}

Some files were not shown because too many files have changed in this diff Show more