Merge branch 'master' of https://git.linux-kernel.at/nipos/ivatar into devel

This commit is contained in:
Oliver Falk
2018-08-31 09:12:42 +02:00
77 changed files with 12021 additions and 5408 deletions

View File

@@ -1 +1,77 @@
TODO
# Installation
## Prequisits
Python 3.x + virtualenv
### CentOS/RHEL 7.x (with EPEL enabled!)
```bash
yum install python34-virtualenv.noarch
```
## Checkout
~~~~bash
git clone https://git.linux-kernel.at/oliver/ivatar.git
cd ivatar
~~~~
## Virtual environment
~~~~bash
virtualenv -p python3 .virtualenv
source .virtualenv/bin/activate
pip install -r requirements.txt
~~~~
## (SQL) Migrations
```bash
./manage.py migrate
```
## Collect static files
```bash
./manage.py collectstatic -l --no-input
```
## Run local (development) server
```bash
./manage.py runserver 0:8080 # or any other free port
```
## Create superuser (optional)
```bash
./manage.py createsuperuser # Follow the instructions
```
## Running the testsuite
```
./manage.py test -v3 # Or any other verbosity level you like
```
# Production deployment Webserver (non-cloudy)
To deploy this Django application with WSGI on Apache, NGINX or any other web server, please refer to the the webserver documentation; There are also plenty of howtos on the net (I'll not LMGTFY...)
# Production deloyment (cloudy)
## Red Hat OpenShift (Online)
There is already a file called create.sh, which can be reused to create an OpenShift online instance of ivatar. However, you need to have the correct environment variables set, as well as a working oc installation.
## Amazon AWS
Pretty sure this work as well; As OpenShift (Online).
I once wrote an Django (1.x) application in 2016, that used AWS. It can be found here:
[Gewusel from ofalk @ GitHub](https://github.com/ofalk/gewusel)
There is a file called ebcreate.txt as well as a directory called .ebextensions, which you need to check out in order to get an idea of how to deploy the application on AWS.
## Database
It should work with SQLite (do *not* use in production!), MySQL/MariaDB, as well as PostgreSQL.

View File

@@ -107,7 +107,7 @@ DEFAULT_FROM_EMAIL = 'ivatar@mg.linux-kernel.at'
try:
from ivatar.settings import DATABASES
except Exception: # pragma: no cover
except ImportError: # pragma: no cover
DATABASES = [] # pragma: no cover
if 'default' not in DATABASES:

View File

@@ -7,6 +7,7 @@ from ivatar.settings import IVATAR_VERSION, SITE_NAME, MAX_PHOTO_SIZE
from ivatar.settings import BASE_URL, SECURE_BASE_URL
from ivatar.settings import MAX_NUM_UNCONFIRMED_EMAILS
def basepage(request):
'''
Our contextprocessor adds additional context variables

View File

@@ -2,26 +2,19 @@
Classes for our ivatar.ivataraccount.forms
'''
from urllib.parse import urlsplit, urlunsplit
from io import BytesIO
from django import forms
from django.utils.translation import ugettext_lazy as _
from django.urls import reverse
from django.template.loader import render_to_string
from django.core.mail import send_mail
from django.contrib import messages
from ipware import get_client_ip
from ivatar import settings
from ivatar.settings import MIN_LENGTH_EMAIL, MAX_LENGTH_EMAIL
from ivatar.settings import MIN_LENGTH_URL, MAX_LENGTH_URL
from ivatar.settings import JPEG_QUALITY
from . models import UnconfirmedEmail, ConfirmedEmail, Photo
from . models import UnconfirmedOpenId, ConfirmedOpenId
from . models import UserPreference
from . models import pil_format, file_format
from . read_libravatar_export import read_gzdata as libravatar_read_gzdata
MAX_NUM_UNCONFIRMED_EMAILS_DEFAULT = 5

View File

@@ -24,21 +24,21 @@ def get_photo(email):
try:
urlopen(image_url, timeout=URL_TIMEOUT)
except HTTPError as e: # pylint: disable=invalid-name
if e.code != 404 and e.code != 503:
except HTTPError as exc:
if exc.code != 404 and exc.code != 503:
print( # pragma: no cover
'Gravatar fetch failed with an unexpected %s HTTP error' %
e.code)
exc.code)
return False
except URLError as e: # pragma: no cover # pylint: disable=invalid-name
except URLError as exc: # pragma: no cover
print(
'Gravatar fetch failed with URL error: %s' %
e.reason) # pragma: no cover
exc.reason) # pragma: no cover
return False # pragma: no cover
except SSLError as e: # pragma: no cover # pylint: disable=invalid-name
except SSLError as exc: # pragma: no cover
print(
'Gravatar fetch failed with SSL error: %s' %
e.reason) # pragma: no cover
exc.reason) # pragma: no cover
return False # pragma: no cover
return {

View File

@@ -141,15 +141,15 @@ class Photo(BaseAccountModel):
try:
image = urlopen(image_url)
# No idea how to test this
# pragma: no cover # pylint: disable=invalid-name
except HTTPError as e:
# pragma: no cover
except HTTPError as exc:
print('%s import failed with an HTTP error: %s' %
(service_name, e.code))
(service_name, exc.code))
return False
# No idea how to test this
# pragma: no cover
except URLError as e: # pylint: disable=invalid-name
print('%s import failed: %s' % (service_name, e.reason))
except URLError as exc:
print('%s import failed: %s' % (service_name, exc.reason))
return False
data = image.read()
@@ -176,9 +176,9 @@ class Photo(BaseAccountModel):
try:
img = Image.open(BytesIO(self.data))
# Testing? Ideas anyone?
except Exception as e: # pylint: disable=invalid-name,broad-except
except Exception as exc: # pylint: disable=broad-except
# For debugging only
print('Exception caught: %s' % e)
print('Exception caught: %s' % exc)
return False
self.format = file_format(img.format)
if not self.format:
@@ -201,7 +201,7 @@ class Photo(BaseAccountModel):
addr.save()
if email:
# Explicitely asked
# Explicitly asked
email.photo = self
email.save()
@@ -227,11 +227,10 @@ class Photo(BaseAccountModel):
dimensions['w'], dimensions['h'] = dimensions['a'], dimensions['b']
min_from_w_h = min(dimensions['w'], dimensions['h'])
dimensions['w'], dimensions['h'] = min_from_w_h, min_from_w_h
elif dimensions['w'] < 0 or (
dimensions['x'] + dimensions['w']
) > dimensions['a'] or dimensions['h'] < 0 or (
dimensions['y'] + dimensions['h']
) > dimensions['b']:
elif ((dimensions['w'] < 0)
or ((dimensions['x'] + dimensions['w']) > dimensions['a'])
or (dimensions['h'] < 0)
or ((dimensions['y'] + dimensions['h']) > dimensions['b'])):
messages.error(
request,
_('Crop outside of original image bounding box'))
@@ -538,8 +537,7 @@ class DjangoOpenIDStore(OpenIDStore):
try:
# pylint: disable=no-member
expires = association.getExpiresIn()
# pylint: disable=invalid-name,broad-except,unused-variable
except Exception as e:
except AttributeError:
expires = association.expiresIn
if expires == 0:
self.removeAssociation(server_url, assoc.handle)

View File

@@ -2,14 +2,17 @@
Reading libravatar export
'''
import binascii
from io import BytesIO
import gzip
import xml.etree.ElementTree
import base64
from PIL import Image
SCHEMAROOT = 'https://www.libravatar.org/schemas/export/0.2'
def read_gzdata(gzdata=None):
'''
Read gzipped data file
@@ -44,22 +47,23 @@ def read_gzdata(gzdata=None):
if photo.tag == '{%s}photo' % SCHEMAROOT:
try:
data = base64.decodebytes(bytes(photo.text, 'utf-8'))
except Exception as e: # pylint: disable=broad-except,invalid-name
except binascii.Error as exc:
print('Cannot decode photo; Encoding: %s, Format: %s: %s' % (
photo.attrib['encoding'], photo.attrib['format'], e))
photo.attrib['encoding'], photo.attrib['format'], exc))
continue
try:
Image.open(BytesIO(data))
except Exception as exc: # pylint: disable=broad-except
print('Cannot decode photo; Encoding: %s, Format: %s: %s' % (
photo.attrib['encoding'], photo.attrib['format'], exc))
continue
else:
# If it is a working image, we can use it
photo.text.replace('\n', '')
photos.append({
'data': photo.text,
'format': photo.attrib['format'],
})
except Exception as e: # pylint: disable=broad-except,invalid-name
print('Cannot decode photo; Encoding: %s, Format: %s: %s' % (
photo.attrib['encoding'], photo.attrib['format'], e))
continue
return {
'emails': emails,

View File

@@ -1,9 +1,8 @@
{% load i18n %}
{% load bootstrap4 %}
{% if not user.is_anonymous %}
{% if photos %}
<p>{% trans 'Would you like to import some of these externally hosted photos?' %}</p>
<h3>{% trans 'Would you like to import some of these externally hosted photos?' %}</h3>
{% if email_id %}
<form action="{% url 'import_photo' email_id %}" method="post">{% csrf_token %}
<input type="hidden" name="email_id" value="{{ email_id }}">
@@ -11,26 +10,29 @@
<form action="{% url 'import_photo' %}" method="post">{% csrf_token %}
<input type="hidden" name="email_addr" value="{{ email_addr }}">
{% endif %}
<ul class="horizontal-list imported-list centered">
<div class="row">
{% for photo in photos %}
<li><input type="checkbox" name="photo_{{photo.service_name}}" id="photo_{{photo.service_name}}" checked="checked">
<br/>
<label for="photo_{{photo.service_name}}">
<img src="{{ photo.thumbnail_url }}" class="thumbnail" alt="{{ photo.service_name }} image">
</label>
<br/>
{% if photo.service_url %}
<a href="{{ photo.service_url }}">{{ photo.service_name }}</a>
{% else %} {# pragma: no cover #}
{{ photo.service_name }} {# pragma: no cover #}
{% endif %} {# pragma: no cover #}
</li>
<div class="panel panel-tortin" style="width:182px;float:left;margin-left:20px">
<div class="panel-heading">
<h3 class="panel-title">
<input type="checkbox" name="photo_{{photo.service_name}}" id="photo_{{photo.service_name}}" checked="checked">
<label for="photo_{{photo.service_name}}" style="width:100%">
{{ photo.service_name }}
{% if photo.service_url %}
<a href="{{ photo.service_url }}" style="float:right;color:#FFFFFF"><i class="fa fa-external-link"></i></a>
{% endif %}
</label>
</h3></div>
<div class="panel-body">
<center>
<img src="{{ photo.thumbnail_url }}" alt="{{ photo.service_name }} image">
</center>
</div>
</div>
{% endfor %}
</ul>
</div>
<p>
{% buttons %}
<button type="submit" class="btn btn-primary">{% trans 'Import' %}</button>
{% endbuttons %}
<button type="submit" class="btn btn-default">{% trans 'Import' %}</button>
</p>
</form>
{% endif %}

View File

@@ -5,26 +5,29 @@
{% block content %}
{% if form.errors %}
{% for error in form.non_field_errors %}
<div class="alert alert-danger">
<strong>{{ error|escape }}</strong>
</div>
{% endfor %}
{% endif %}
<h1>{% trans 'Add a new email address' %}</h1>
<p>{% blocktrans %}Otherwise, type your email address in the box below and we will send you an email with a link to click on in order to verify that you own that email address.{% endblocktrans %}</p>
<form action="{% url 'add_email' %}" name="addemail" method="post" id="form-addemail">{% csrf_token %}
{% if form.errors %}
{% for error in form.non_field_errors %}
<div class="alert alert-danger" role="alert">{{ error|escape }}</div>
{% endfor %}
{% endif %}
{% if form.email.errors %}
<div class="alert alert-danger" role="alert">{{ form.email.errors }}</div>
{% endif %}
<div style="max-width:600px">
<form action="{% url 'add_email' %}" name="addemail" method="post" id="form-addemail">
{% csrf_token %}
{{ form.email.errors }}
<p class="aligned wide">{{ form.email.label_tag }} {{ form.email }}</p>
<p><input type="submit" value="{% trans 'Add' %}" />
&nbsp;<a href="{% url 'profile' %}">{% trans 'Cancel' %}</a></p>
<div class="form-group">
<label for="id_email">{% trans 'Email' %}:</label>
<input type="text" name="email" autofocus required class="form-control" id="id_email">
</div>
<button type="submit" class="btn btn-default">{% trans 'Add' %}</button>
</form>
</div>
<div style="height:40px"></div>
{% endblock content %}

View File

@@ -7,18 +7,22 @@
<h1>{% trans 'Add a new OpenID' %}</h1>
<p>{% trans 'Once you have confirmed this OpenID URL, you will be able to log into your account using that OpenID URL.' %}</p>
<p>{% trans 'Once you have confirmed this OpenID URL, you will be able to log into your account using that OpenID URL.' %}<br/>
{% trans 'You will be redirected to the authorisation page for the provider. If the process fails, you can remove the ID from this list and try adding it again.' %}</p>
{% if form.openid.errors %}
<div class="alert alert-danger" role="alert">{{ form.openid.errors }}</div>
{% endif %}
<div style="max-width:600px">
<form action="{% url 'add_openid' %}" name="addopenid" method="post">
{% csrf_token %}
<form action="{% url 'add_openid' %}" name="addopenid" method="post">{% csrf_token %}
{{form.openid.errors}}
<p class="aligned wide">{{form.openid.label_tag}} {{form.openid}}</p>
<p class="hint">{% trans 'You will be redirected to the authorisation page for the provider. If the process fails, you can remove the ID from this list and try adding it again.' %}</p>
<p><input type="submit" value="{% trans 'Add' %}" />
&nbsp;<a href="{% url 'profile' %}">{% trans 'Cancel' %}</a></p>
<div class="form-group">
<label for="id_openid">{% trans 'OpenID' %}:</label>
<input type="url" name="openid" value="https://" maxlength="255" minlength="11" required id="id_openid" autofocus class="form-control">
</div>
<button type="submit" class="btn btn-default">{% trans 'Add' %}</button>
</form>
</div>
<div style="height:40px"></div>
{% endblock content %}

View File

@@ -4,46 +4,65 @@
{% block title %}{% blocktrans with email.email as email_address %}Choose a photo for {{ email_address }}{% endblocktrans %}{% endblock title %}
{% block content %}
<style>
.nobutton {
background: none;
color: inherit;
border: none;
padding: 0;
font: inherit;
cursor: pointer;
outline: inherit;
}
</style>
<h1>{% blocktrans with email.email as email_address %}Choose a photo for {{ email_address }}{% endblocktrans %}</h1>
{% if not user.photo_set.count %}
{% url 'upload_photo' as upload_url %}
<p>{% blocktrans %}You need to <a href="{{ upload_url }}">upload some photos</a> first!{% endblocktrans %}</p>
<h4>{% blocktrans %}You need to <a href="{{ upload_url }}">upload some photos</a> first!{% endblocktrans %}</h4>
<p><a href="{% url 'profile' %}">{% trans 'Back to your profile' %}</a></p>
<p><a href="{% url 'profile' %}" class="btn btn-default">{% trans 'Back to your profile' %}</a></p>
{% else %}
<p>{% trans 'Here are the pictures you have uploaded, click on the one you wish to associate with this email address:' %}</p>
<ul class="horizontal-list avatar-list centered">
<div class="row">
{% for photo in user.photo_set.all %}
<li>
<form action="{% url 'assign_photo_email' view.kwargs.email_id %}" method="post">{% csrf_token %}
<form action="{% url 'assign_photo_email' view.kwargs.email_id %}" method="post" style="float:left;margin-left:20px">{% csrf_token %}
<input type="hidden" name="photo_id" value="{{ photo.id }}">
<input type="image" name="photo{{ photo.id }}" src="{% url 'raw_image' photo.id %}" class="thumbnail">
{% ifequal email.photo.id photo.id %}
<br>{% trans '(current)' %}
{% endifequal %}
</form></li>
<button type="submit" name="photo{{ photo.id }}" class="nobutton">
<div class="panel panel-tortin" style="width:132px;margin:0">
<div class="panel-heading">
<h3 class="panel-title">{% ifequal email.photo.id photo.id %}<i class="fa fa-check"></i>{% endifequal %} {% trans 'Image' %} {{ forloop.counter }}</h3>
</div>
<div class="panel-body" style="height:130px">
<center>
<img style="max-height:100px;max-width:100px" src="{% url 'raw_image' photo.id %}">
</center>
</div>
</div>
</button>
</form>
{% endfor %}
<li>
<form action="{% url 'assign_photo_email' view.kwargs.email_id %}" method="post">{% csrf_token %}
<input type="submit" name="photoNone" value="{% trans 'None' %}">
{% ifequal email.photo.id photo.id %}
<br>{% trans '(current)' %}
{% endifequal %}
</form></li>
</ul>
<p>
<br/>
<a href="{% url 'upload_photo' %}">{% blocktrans %}Upload a new one{% endblocktrans %}</a>
<br/>
<a href="{% url 'import_photo' email.pk %}">{% blocktrans %}Import from other services{% endblocktrans %}</a>
</p>
<form action="{% url 'assign_photo_email' view.kwargs.email_id %}" method="post" style="float:left;margin-left:20px">{% csrf_token %}
<button type="submit" name="photoNone" class="nobutton">
<div class="panel panel-tortin" style="width:132px;margin:0">
<div class="panel-heading">
<h3 class="panel-title">{% ifequal email.photo.id photo.id %}<i class="fa fa-check"></i>{% endifequal %} {% trans 'No image' %}</h3>
</div>
<div class="panel-body" style="height:130px">
<center>
<img style="max-height:100px;max-width:100px" src="/static/img/nobody/100.png">
</center>
</div>
</div>
</button>
</form>
</div>
<div style="height:8px"></div>
<a href="{% url 'upload_photo' %}" class="btn btn-default">{% blocktrans %}Upload a new one{% endblocktrans %}</a>&nbsp;&nbsp;
<a href="{% url 'import_photo' email.pk %}" class="btn btn-default">{% blocktrans %}Import from other services{% endblocktrans %}</a>
{% endif %}
<div style="height:40px"></div>
{% endblock content %}

View File

@@ -4,41 +4,65 @@
{% block title %}{% blocktrans with openid.openid as openid_address %}Choose a photo for {{ openid_address }}{% endblocktrans %}{% endblock title %}
{% block content %}
<style>
.nobutton {
background: none;
color: inherit;
border: none;
padding: 0;
font: inherit;
cursor: pointer;
outline: inherit;
}
</style>
<h1>{% blocktrans with openid.openid as openid_address %}Choose a photo for {{ openid_address }}{% endblocktrans %}</h1>
{% if not user.photo_set.count %}
{% url 'upload_photo' as upload_url %}
<p>{% blocktrans %}You need to <a href="{{ upload_url }}">upload some photos</a> first!{% endblocktrans %}</p>
<h3>{% blocktrans %}You need to <a href="{{ upload_url }}">upload some photos</a> first!{% endblocktrans %}</h3>
<p><a href="{% url 'profile' %}">{% trans 'Back to your profile' %}</a></p>
<p><a href="{% url 'profile' %}" class="btn btn-default">{% trans 'Back to your profile' %}</a></p>
{% else %}
<p>{% trans 'Here are the pictures you have uploaded, click on the one you wish to associate with this openid address:' %}</p>
<ul class="horizontal-list avatar-list centered">
<div class="row">
{% for photo in user.photo_set.all %}
<li>
<form action="{% url 'assign_photo_openid' view.kwargs.openid_id %}" method="post">{% csrf_token %}
<form action="{% url 'assign_photo_openid' view.kwargs.openid_id %}" method="post" style="float:left;margin-left:20px">{% csrf_token %}
<input type="hidden" name="photo_id" value="{{ photo.id }}">
<input type="image" name="photo{{ photo.id }}" src="{% url 'raw_image' photo.id %}" class="thumbnail">
{% ifequal openid.photo.id photo.id %}
<br>{% trans '(current)' %}
{% endifequal %}
</form></li>
<button type="submit" name="photo{{ photo.id }}" class="nobutton">
<div class="panel panel-tortin" style="width:132px;margin:0">
<div class="panel-heading">
<h3 class="panel-title">{% ifequal openid.photo.id photo.id %}<i class="fa fa-check"></i>{% endifequal %} {% trans 'Image' %} {{ forloop.counter }}</h3>
</div>
<div class="panel-body" style="height:130px">
<center>
<img style="max-height:100px;max-width:100px" src="{% url 'raw_image' photo.id %}">
</center>
</div>
</div>
</button>
</form>
{% endfor %}
<li>
<form action="{% url 'assign_photo_openid' view.kwargs.openid_id %}" method="post">{% csrf_token %}
<input type="submit" name="photoNone" value="{% trans 'None' %}">
{% ifequal openid.photo.id photo.id %}
<br>{% trans '(current)' %}
{% endifequal %}
</form></li>
</ul>
<p><a href="{% url 'upload_photo' %}">{% blocktrans %}upload a new one{% endblocktrans %}</a></p>
<form action="{% url 'assign_photo_openid' view.kwargs.openid_id %}" method="post" style="float:left;margin-left:20px">{% csrf_token %}
<button type="submit" name="photoNone" class="nobutton">
<div class="panel panel-tortin" style="width:132px;margin:0">
<div class="panel-heading">
<h3 class="panel-title">{% ifequal openid.photo.id photo.id %}<i class="fa fa-check"></i>{% endifequal %} {% trans 'No image' %}</h3>
</div>
<div class="panel-body" style="height:130px">
<center>
<img style="max-height:100px;max-width:100px" src="/static/img/nobody/100.png">
</center>
</div>
</div>
</button>
</form>
</div>
<div style="height:8px"></div>
<a href="{% url 'upload_photo' %}" class="btn btn-default">{% blocktrans %}upload a new one{% endblocktrans %}</a>
{% endif %}
<div style="height:40px"></div>
{% endblock content %}

View File

@@ -1,40 +1,67 @@
{% extends 'base.html' %}
{% load i18n %}
{% load static %}
{% load bootstrap4 %}
{% block title %}{% trans 'Choose items to be uploaded' %}{% endblock title %}
{% block content %}
<style>
input[type=checkbox] {display:none}
input[type=checkbox].text + label {
padding-left:0;
font-weight:normal;
}
input[type=checkbox].text + label:before {
font-family: FontAwesome;
display: inline-block;
letter-spacing:5px;
font-size:20px;
color:#36b7d7;
vertical-align:middle;
}
input[type=checkbox].text + label:before {content: "\f0c8"}
input[type=checkbox].text:checked + label:before {content: "\f14a"}
input[type=checkbox].image + label:before {
font-family: FontAwesome;
display: inline-block;
}
input[type=checkbox].image + label:before {content: "\f096"}
input[type=checkbox].image + label:before {letter-spacing: 5px}
input[type=checkbox].image:checked + label:before {content: "\f046"}
input[type=checkbox].image:checked + label:before {letter-spacing: 3px}
</style>
<h1>{% trans 'Choose items to be imported' %}</h1>
<div style="max-width:600px;">
<form method="post" action="{% url 'upload_export' 'save' %}">{% csrf_token %}
{% if emails %}
<p>
{% trans 'Email addresses we found in the export - existing ones will not be re-added' %}:
</p>
<h4>{% trans 'Email addresses we found in the export - existing ones will not be re-added' %}</h4>
{% for email in emails %}
<input type="checkbox" checked name="email_{{ forloop.counter }}" value="{{ email }}"> {{ email }}</input><br/>
<input type="checkbox" checked name="email_{{ forloop.counter }}" id="email_{{ forloop.counter }}" value="{{ email }}" class="text"><label for="email_{{ forloop.counter }}">{{ email }}</label><br/>
{% endfor %}
{% endif %}
<p/>
{% if photos %}
<p>
{% trans 'Photos we found in the export' %}:
</p>
<h4>{% trans 'Photos we found in the export' %}</h4>
<div class="row">
{% for photo in photos %}
<input type="checkbox" checked name="photo_{{ forloop.counter }}" value="{{ photo.data }}">
<img style="max-width: 80px; max-height: 80px;" src="data:image/{{ photo.format }};base64,{{ photo.data }}"/>
</input>
<br/>
<div class="panel panel-tortin" style="width:132px;float:left;margin-left:20px">
<div class="panel-heading">
<h3 class="panel-title">
<input type="checkbox" checked name="photo_{{ forloop.counter }}" id="photo_{{ forloop.counter }}" value="{{ photo.data }}" class="image">
<label for="photo_{{ forloop.counter }}">{% trans 'Image' %} {{ forloop.counter }}</label>
</label>
</h3></div>
<div class="panel-body">
<center>
<img style="max-height:100px;max-width:100px" src="data:image/{{ photo.format }};base64,{{ photo.data }}">
</center>
</div>
</div>
{% endfor %}
</div>
{% endif %}
<br/>
{% buttons %}
<button type="submit" class="btn btn-primary">{% trans 'Upload' %}</button>
<button type="cancel" class="btn btn-danger">{% trans 'Cancel' %}</button>
{% endbuttons %}
<p>
<button type="submit" class="btn btn-default">{% trans 'Upload' %}</button>
</p>
</form>
</div>
<div style="height:40px"></div>
{% endblock content %}

View File

@@ -7,7 +7,13 @@
{% block header %}<link rel="prefetch" href="{% static 'css/jcrop.css' %}">{% endblock header %}
{% block content %}
<style>
.jcrop-holder > div > div:nth-child(1) {
outline-width:2px;
outline-style:solid;
outline-color:#36b7d7;
}
</style>
<h1>{% trans 'Crop photo' %}</h1>
<p>{% trans 'Draw a square around the portion of the image you want to use:' %}</p>
@@ -15,22 +21,18 @@
<form action="{% url 'crop_photo' photo.pk %}" method="post">{% csrf_token %}
{% if email %}<input type="hidden" name="email" value="{{email}}">{% endif %}
{% if openid %}<input type="hidden" name="openid" value="{{openid}}">{% endif %}
<p class="aligned wide"><img src='{% url 'raw_image' photo.pk %}' id='cropbox' /></p>
<div class="form-group">
<img src='{% url 'raw_image' photo.pk %}' id='cropbox'>
</div>
<input type='hidden' id='x' name='x' value='0'/>
<input type='hidden' id='y' name='y' value='0'/>
<input type='hidden' id='w' name='w' value='0'/>
<input type='hidden' id='h' name='h' value='0'/>
<p><input type="submit" value="{% trans 'Crop' %}" onsubmit="return checkCoords();"/>
&nbsp;<a id="cancel-link" href="{% url 'profile' %}">{% trans 'Cancel' %}</a></p>
<div class="form-group">
<button type="submit" class="btn btn-default" onsubmit="return checkCoords();">{% trans 'Crop' %}</button>
</div>
</form>
{% endblock content %}
{% block bootstrap4_after_content %}
{{ block.super }}
<script src="{% static '/js/jcrop.js' %}"></script>
<script type="text/javascript">
function updateCoords(c) {
@@ -48,8 +50,11 @@ function checkCoords() {
<script type="text/javascript">
jQuery(function($){
$('#cropbox').Jcrop({
onSelect: updateCoords
onSelect: updateCoords,
bgOpacity:1,
bgColor:'transparent'
});
});
</script>
{% endblock bootstrap4_after_content %}
<div style="height:40px"></div>
{% endblock content %}

View File

@@ -4,13 +4,22 @@
{% block title %}{% trans 'Email confirmation' %} - Libravatar{% endblock title %}
{% block content %}
<style>
input[type=checkbox] {display:none}
input[type=checkbox] + label:before {
font-family: FontAwesome;
display: inline-block;
}
input[type=checkbox] + label:before {content: "\f096"}
input[type=checkbox] + label:before {letter-spacing: 5px}
input[type=checkbox]:checked + label:before {content: "\f046"}
input[type=checkbox]:checked + label:before {letter-spacing: 3px}
</style>
<h1>{% trans 'Email confirmation' %}</h1>
<p><b>{% trans 'Your email address was successfully confirmed!' %}</b></p>
<h4>{% trans 'Your email address was successfully confirmed!' %}</h4>
{% include '_import_photo_form.html' %}
<p><a href="{% url 'profile' %}">{% trans 'Back to your profile' %}</a></p>
<div style="height:40px"></div>
{% endblock content %}

View File

@@ -1,22 +1,32 @@
{% extends 'base.html' %}
{% load i18n %}
{% load bootstrap4 %}
{% block title %}{% trans 'Import photo' %} - Libravatar{% endblock title %}
{% block content %}
<style>
input[type=checkbox] {display:none}
input[type=checkbox] + label:before {
font-family: FontAwesome;
display: inline-block;
}
input[type=checkbox] + label:before {content: "\f096"}
input[type=checkbox] + label:before {letter-spacing: 5px}
input[type=checkbox]:checked + label:before {content: "\f046"}
input[type=checkbox]:checked + label:before {letter-spacing: 3px}
</style>
<h1>{% trans 'Import photo' %}</h1>
{% include '_import_photo_form.html' %}
{% if not email_id %}
<div style="max-width:600px">
<form action="{% url 'import_photo' %}" method="get" id="check_mail_form">
<div class="form-group">
<label for="check_email_addr">{% trans 'Email Address' %}</label>
<input type="text" name="check_email_addr" value="{{ email_addr }}">
{% buttons %}
<button type="submit" class="btn btn-primary">{% trans 'Check' %}</button>
{% endbuttons %}
<input type="text" name="check_email_addr" class="form-control" value="{{ email_addr }}">
</div>
<div class="form-group">
<button type="submit" class="btn btn-default">{% trans 'Check' %}</button>
</div>
</form>
<script>
document.getElementById('check_mail_form').onsubmit =
@@ -25,9 +35,9 @@
return false;
};
</script>
</div>
{% endif %}
<p><a href="{% url 'profile' %}">{% trans 'Back to your profile' %}</a></p>
{% include '_import_photo_form.html' %}
<div style="height:40px"></div>
{% endblock content %}

View File

@@ -9,41 +9,28 @@
{% if form.errors %}
{% for error in form.non_field_errors %}
<div class="alert alert-danger">
<strong>{{ error|escape }}</strong>
</div>
<div class="alert alert-danger" role="alert">{{ error|escape }}</div>
{% endfor %}
{% endif %}
<form action="{% url 'login' %}" method="post" name="login">{% csrf_token %}
<table summary="">
{% if form.username.errors %}
<tr>
<td colspan="2">{{ form.username.errors }}</td>
</tr>
<div class="alert alert-danger" role="alert">{{ form.username.errors }}</div>
{% endif %}
<tr>
<td>{{ form.username.label_tag }}</td>
<td>{{ form.username }}</td>
</tr>
{% if form.password.errors %}
<tr>
<td colspan="2">{{ form.password.errors }}</td>
</tr>
<div class="alert alert-danger" role="alert">{{ form.password.errors }}</div>
{% endif %}
<tr>
<td>{{ form.password.label_tag }}</td>
<td>{{ form.password }}</td>
</tr>
</table>
<p><input type="submit" value="{% trans 'Login' %}">
&nbsp;<a href="/">{% trans 'Cancel' %}</a></p>
<div style="max-width:600px">
<form action="{% url 'login' %}" method="post" name="login">
{% csrf_token %}
<div class="form-group">
<label for="id_username">{% trans 'Benutzername' %}:</label>
<input type="text" name="username" autofocus required class="form-control" id="id_username">
</div>
<div class="form-group">
<label for="id_password">{% trans 'Password' %}:</label>
<input type="password" name="password" class="form-control" required id="id_password">
</div>
<button type="submit" class="btn btn-default">{% trans 'Login' %}</button> or <a href="{% url 'new_account' %}" class="btn btn-default">{% trans 'Create new user' %}</a>
</form>
or
<a href="{% url 'new_account' %}">{% trans 'Create new user' %}</a>
</div>
<div style="height:40px"></div>
{% endblock content %}

View File

@@ -7,41 +7,32 @@
<h1>{% trans 'Create a new account' %}</h1>
<form action="{% url 'new_account' %}" method="post" name="newaccount">{% csrf_token %}
<table summary="">
{% if form.username.errors %}
<tr>
<td colspan="2">{{ form.username.errors }}</td>
</tr>
<div class="alert alert-danger" role="alert">{{ form.username.errors }}</div>
{% endif %}
<tr>
<td>{{ form.username.label_tag }}</td>
<td>{{ form.username }}</td>
</tr>
{% if form.password1.errors %}
<tr>
<td colspan="2">{{ form.password1.errors }}</td>
</tr>
<div class="alert alert-danger" role="alert">{{ form.password1.errors }}</div>
{% endif %}
<tr>
<td>{{ form.password1.label_tag }}</td>
<td>{{ form.password1 }}</td>
</tr>
{% if form.password2.errors %}
<tr>
<td colspan="2">{{ form.password2.errors }}</td>
</tr>
<div class="alert alert-danger" role="alert">{{ form.password2.errors }}</div>
{% endif %}
<tr>
<td>{{ form.password2.label_tag }}</td>
<td>{{ form.password2 }}</td>
</tr>
</table>
<p><input type="submit" value="{% trans 'Create account' %}">
&nbsp;<a href="/">{% trans 'Cancel' %}</a></p>
<form action="{% url 'new_account' %}" method="post" name="newaccount">
{% csrf_token %}
<div style="max-width:600px">
<div class="form-group">
<label for="id_username">{% trans 'Username' %}:</label>
<input type="text" name="username" autofocus required class="form-control" id="id_username">
</div>
<div class="form-group">
<label for="id_password1">{% trans 'Password' %}:</label>
<input type="password" name="password1" class="form-control" required id="id_password1">
</div>
<div class="form-group">
<label for="id_password2">{% trans 'Password confirmation' %}:</label>
<input type="password" name="password2" class="form-control" required id="id_password2">
</div>
<button type="submit" class="btn btn-default">{% trans 'Create account' %}</button> or <a href="/accounts/login/" class="btn btn-default">{% trans 'Login' %}</a>
</form>
</div>
<div style="height:40px"></div>
{% endblock content %}

View File

@@ -6,46 +6,34 @@
{% block content %}
<h1>{% trans 'Change password' %}</h1>
<form action="" method="post" name="changepassword">{% csrf_token %}
<table summary="">
{% if form.old_password %}
{% if form.old_password.errors %}
<tr>
<td colspan="2">{{ form.old_password.errors }}</td>
</tr>
<div class="alert alert-danger" role="alert">{{ form.old_password.errors }}</div>
{% endif %}
<tr>
<td>{{ form.old_password.label_tag }}</td>
<td>{{ form.old_password }}</td>
</tr>
{% endif %}
{% if form.new_password1.errors %}
<tr>
<td colspan="2">{{ form.new_password1.errors }}</td>
</tr>
<div class="alert alert-danger" role="alert">{{ form.new_password1.errors }}</div>
{% endif %}
<tr>
<td>{{ form.new_password1.label_tag }}</td>
<td>{{ form.new_password1 }}</td>
</tr>
{% if form.new_password2.errors %}
<tr>
<td colspan="2">{{ form.new_password2.errors }}</td>
</tr>
<div class="alert alert-danger" role="alert">{{ form.new_password2.errors }}</div>
{% endif %}
<tr>
<td>{{ form.new_password2.label_tag }}</td>
<td>{{ form.new_password2 }}</td>
</tr>
</table>
<p><input type="submit" value="{% trans 'Change my password' %}" />
&nbsp;<a href="{% url 'profile' %}">{% trans 'Cancel' %}</a></p>
<form action="" method="post" name="changepassword">
{% csrf_token %}
<div style="max-width:600px">
{% if form.old_password %}
<div class="form-group">
<label for="id_old_password">{% trans 'Old password' %}:</label>
<input type="password" name="old_password" autofocus required class="form-control" id="id_old_password">
</div>
{% endif %}
<div class="form-group">
<label for="id_new_password1">{% trans 'New password' %}:</label>
<input type="password" name="new_password1" class="form-control" required id="id_new_password1">
</div>
<div class="form-group">
<label for="id_new_password2">{% trans 'New password confirmation' %}:</label>
<input type="password" name="new_password2" class="form-control" required id="id_new_password2">
</div>
<button type="submit" class="btn btn-default">{% trans 'Change my password' %}</button>
</form>
</div>
<div style="height:40px"></div>
{% endblock content %}

View File

@@ -1,20 +1,20 @@
{% extends 'base.html' %}
{% load i18n %}
{% load bootstrap4 %}
{% load static %}
{% block title %}{% trans 'Your Preferences' %}{% endblock title %}
{% block content %}
<h1>{% trans 'Account settings' %}</h1>
<div style="max-width:600px;">
<form method="post" name="check">{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<button type="submit" class="btn btn-primary">{% trans 'Update' %}</button>
<button type="cancel" class="btn btn-danger">{% trans 'Cancel' %}</button>
{% endbuttons %}
</form>
</div>
{% if has_password %}
<p><a href="{% url 'password_change' %}" class="btn btn-default">{% trans 'Change your password' %}</a></p>
{% else %}
<p><a href="{% url 'password_set' %}" class="btn btn-default">{% trans 'Set a password' %}</a></p>
{% endif %}
<!-- <p><a href="{% url 'export' %}" class="btn btn-default">{% trans 'Export your data' %}</a></p> -->
<p><a href="{% url 'delete' %}" class="btn btn-default">{% trans 'Permanently delete your account' %}</a></p>
<div style="height:40px"></div>
{% endblock content %}

View File

@@ -26,154 +26,112 @@
padding-right: 0.3em;
}
}
.thumbnail {
max-width:80px;
max-height:80px;
}
.nobutton {
background: none;
color: inherit;
border: none;
padding: 0;
font: inherit;
cursor: pointer;
outline: inherit;
}
</style>
{% if user.confirmedemail_set.count or user.confirmedopenid_set.count %}
<p>{% trans 'You have the following confirmed identities:' %}</p>
<ul class="horizontal-list avatar-list">
<h3>{% trans 'You have the following confirmed identities:' %}</h3>
<div class="row">
{% for email in user.confirmedemail_set.all %}
<li style="float:left;">
<form action="{% url 'remove_confirmed_email' email.id %}" method="post">{% csrf_token %}
<div style="float:left; width: 80px; height: 80px;">
<a href="{% url 'assign_photo_email' email.id %}">
{% if email.photo %}
<img class="thumbnail editable avatar-chooser" src="{% url 'raw_image' email.photo.id %}" alt="">
{% else %}
<img class="thumbnail editable avatar-chooser" src="{% static '/img/nobody/80.png' %}" alt="Nobody">
{% endif %}
</a>
</div>
<div class="d-none d-sm-block" style="min-width: 320px;">{{ email.email|truncatechars:40 }}</div>
<div style="display:flex;">
<a class="btn btn-light action-item" href="{% url 'assign_photo_email' email.id %}"
role="button" title="{% trans 'Change photo' %}">
<i class="fa fa-edit"></i>
<span class="d-none">{% trans 'Change' %}</span>
</a>
<button type="submit" class="btn btn-danger action-item" title="{% trans 'Remove' %}">
<i class="fa fa-trash"></i>
<span class="d-none">{% trans 'Delete' %}</span>
</button>
</div>
<div class="d-block d-sm-none" style="min-width: 320px;">{{ email.email|truncatechars:30 }}</div>
<form action="{% url 'remove_confirmed_email' email.id %}" method="post">
{% csrf_token %}
<div class="panel panel-tortin" style="width:172px;margin-left:20px;float:left">
<div class="panel-heading" style="padding-right:0">
<h3 class="panel-title" title="{{ email.email }}" style="display:inline-flex"><a href="{% url 'assign_photo_email' email.id %}"><i class="fa fa-edit"></i></a>&nbsp;
<button type="submit" class="nobutton" onclick="return confirm('{% trans 'Are you sure that you want to delete this email address?' %}')"><i class="fa fa-trash"></i></button>&nbsp;
{{ email.email|truncatechars:12 }}</h3>
</div>
<div class="panel-body" style="height:130px">
<center>
<img style="max-height:100px;max-width:100px" src="{% if email.photo %}{% url 'raw_image' email.photo.id %}{% else %}{% static '/img/nobody/80.png' %}{% endif %}">
</center>
</div>
</div>
</form>
</li>
{% endfor %}
{% for openid in user.confirmedopenid_set.all %}
<li style="float:left;">
<form action="{% url 'remove_confirmed_openid' openid.id %}" method="post">{% csrf_token %}
<div style="float:left; min-width: 80px; min-height: 80px;">
<a href="{% url 'assign_photo_openid' openid.id %}">
{% if openid.photo %}
<img class="thumbnail editable avatar-chooser" src="{% url 'raw_image' openid.photo.id %}" alt="">
{% else %}
<img class="thumbnail editable avatar-chooser" src="{% static '/img/nobody/80.png' %}" alt="">
{% endif %}
</a>
</div>
<div class="d-none d-sm-block" style="min-width: 320px;">{{ openid.openid|truncatechars:40 }}</div>
<div style="display:flex;">
<a class="btn btn-light action-item" href="{% url 'assign_photo_openid' openid.pk %}"
role="button" title="{% trans 'Change photo' %}">
<i class="fa fa-edit"></i>
<span class="d-none">{% trans 'Change' %}</span>
</a>
<button type="submit" class="btn btn-danger action-item" title="{% trans 'Remove' %}">
<i class="fa fa-trash"></i>
<span class="d-none">{% trans 'Delete' %}</span>
</button>
</div>
<div class="d-block d-sm-none" style="min-width: 320px;">{{ openid.openid|truncatechars:30 }}</div>
<div class="panel panel-tortin" style="width:172px;margin-left:20px;float:left">
<div class="panel-heading" style="padding-right:0">
<h3 class="panel-title" title="{{ openid.openid }}" style="display:inline-flex"><a href="{% url 'assign_photo_openid' openid.pk %}"><i class="fa fa-edit"></i></a>&nbsp;
<button type="submit" class="nobutton" onclick="return confirm('{% trans 'Are you sure that you want to delete this OpenID?' %}')"><i class="fa fa-trash"></i></button>&nbsp;
{{ openid.openid|cut:"http://"|cut:"https://"|truncatechars:12 }}</h3>
</div>
<div class="panel-body" style="height:130px">
<center>
<img style="max-height:100px;max-width:100px" src="{% if openid.photo %}{% url 'raw_image' openid.photo.id %}{% else %}{% static '/img/nobody/80.png' %}{% endif %}">
</center>
</div>
</div>
</form>
</li>
{% endfor %}
</ul>
<div class="clear-both"></div>
</div>
{% endif %}
{% if user.unconfirmedemail_set.count or user.unconfirmedopenid_set.count %}
<p>{% trans 'You have the following unconfirmed email addresses and OpenIDs:' %}</p>
<ul class="vertical-list">
<h3>{% trans 'You have the following unconfirmed email addresses and OpenIDs:' %}</h3>
{% for email in user.unconfirmedemail_set.all %}
<li>
<form action="{% url 'remove_unconfirmed_email' email.id %}" method="post">{% csrf_token %}
{{ email.email }}
<br/>
<!-- TODO: Confirmation mail URL -->
<a class="btn btn-info btn-sm action-item" href="{% url 'resend_confirmation_mail' email.pk %}"
role="button" title="{% trans 'Resend confirmation mail' %}" style="color:white;">
<i class="fa fa-envelope"></i>
<span class="d-none">{% trans 'Resend confirmation mail' %}</span>
</a>
<button type="submit" class="btn btn-danger btn-sm action-item" title="{% trans 'Remove' %}">
<i class="fa fa-trash"></i>
<span class="d-none">{% trans 'Delete' %}</span>
</button>
</form>
<form action="{% url 'remove_unconfirmed_email' email.id %}" method="post">
{% csrf_token %}
<div class="btn-group form-group" role="group">
<button type="submit" class="btn btn-default" onclick="return confirm('{% trans 'Are you sure that you want to delete this email address?' %}')"><i class="fa fa-trash"></i></button>
<a href="{% url 'resend_confirmation_mail' email.pk %}" class="btn btn-default"><i class="fa fa-envelope"></i></a>
<span class="input-group-addon">{{ email.email }}</span>
</div>
</form>
{# TODO: (expires in xx hours) #}
</li>
{% endfor %}
{% for openid in user.unconfirmedopenid_set.all %}
<li>
<form action="{% url 'remove_unconfirmed_openid' openid.id %}" method="post">{% csrf_token %}
{{ openid.openid }}
<br/>
<button type="submit" class="btn btn-danger btn-sm" title="{% trans 'Remove' %}">
<i class="fa fa-trash"></i>
</button>
<form action="{% url 'remove_unconfirmed_openid' openid.id %}" method="post">
{% csrf_token %}
<div class="btn-group form-group" role="group">
<button type="submit" class="btn btn-default" onclick="return confirm('{% trans 'Are you sure that you want to delete this OpenID?' %}')"><i class="fa fa-trash"></i></button>
<span class="input-group-addon">{{ openid.openid }}</span>
</div>
</form>
{# TODO: (expires in xx hours) #}
</li>
{% endfor %}
</ul>
{% endif %}
<p>
{% if not max_emails %}
<a href="{% url 'add_email' %}">{% trans 'Add a new email address' %}</a>
|
{% endif %}
<a href="{% url 'add_openid' %}">{% trans 'Add a new OpenID' %}</a></p>
{% if not max_emails %}<a href="{% url 'add_email' %}" class="btn btn-default">{% trans 'Add a new email address' %}</a> or{% endif %}
<a href="{% url 'add_openid' %}" class="btn btn-default">{% trans 'Add a new OpenID' %}</a></p>
</p>
{% if user.photo_set.count %}
<p>{% trans 'Here are the photos you have uploaded/imported:' %}</p>
<ul class="horizontal-list avatar-list centered">
<h3>{% trans 'Here are the photos you have uploaded/imported:' %}</h3>
<div class="row">
{% for photo in user.photo_set.all %}
<li>
<a href="{% url 'raw_image' photo.id %}">
<img class="thumbnail" src="{% url 'raw_image' photo.id %}"
title="{% blocktrans with photo.add_date as datetime %}Uploaded on {{ datetime }}{% endblocktrans %}"
alt="{% blocktrans with photo.add_date as datetime %}Uploaded on {{ datetime }}{% endblocktrans %}">
</a>
<div style="padding-top: 2px; min-width: 100px;"/>
<a class="btn btn-danger btn-sm action-item" href="{% url 'delete_photo' photo.pk %}"
role="button" title="{% trans 'Delete' %}" style="color:white;">
<i class="fa fa-trash"></i>
<span class="d-none">Delete</span>
</a>
<div class="panel panel-tortin" style="width:132px;margin-left:20px;float:left">
<div class="panel-heading">
<h3 class="panel-title"><a href="{% url 'delete_photo' photo.pk %}" onclick="return confirm('{% trans 'Are you sure that you want to delete this image?' %}')"><i class="fa fa-trash"></i></a> {% trans 'Image' %} {{ forloop.counter }}</h3>
</div>
<div class="panel-body" style="height:130px">
<center>
<img style="max-height:100px;max-width:100px" src="{% url 'raw_image' photo.id %}">
</center>
</div>
</div>
{% endfor %}
</ul>
</div>
{% endif %}
{% if not max_photos %}
<p>
<br/>
<a href="{% url 'upload_photo' %}">{% trans 'Upload a new photo' %}</a><br/>
<a href="{% url 'import_photo' %}">{% trans 'Import photo from other services' %}</a>
<a href="{% url 'upload_photo' %}" class="btn btn-default">{% trans 'Upload a new photo' %}</a> or
<a href="{% url 'import_photo' %}" class="btn btn-default">{% trans 'Import photo from other services' %}</a>
</p>
{% endif %}
<h2>{% trans 'Account settings' %}</h2>
{% if has_password %}
<p><a href="{% url 'password_change' %}">{% trans 'Change your password' %}</a></p>
{% else %}
<p><a href="{% url 'password_set' %}">{% trans 'Set a password' %}</a></p>
{% endif %}
<!-- <p><a href="{% url 'export' %}">{% trans 'Export your data' %}</a></p> -->
<p><a href="{% url 'delete' %}">{% trans 'Permanently delete your account' %}</a></p>
<div style="height:40px"></div>
{% endblock content %}

View File

@@ -1,20 +1,57 @@
{% extends 'base.html' %}
{% load i18n %}
{% load static %}
{% load bootstrap4 %}
{% block title %}{% trans 'Upload an export from libravatar' %} - ivatar{% endblock title %}
{% block content %}
<style>
input[type=checkbox] {display:none}
input[type=checkbox] + label {
padding-left:0;
}
input[type=checkbox] + label:before {
font-family: FontAwesome;
display: inline-block;
letter-spacing:5px;
font-size:20px;
color:#36b7d7;
vertical-align:middle;
}
input[type=checkbox] + label:before {content: "\f0c8"}
input[type=checkbox]:checked + label:before {content: "\f14a"}
.uploadbtn:before {
position:absolute;
left:0;
right:0;
text-align:center;
content:"Select file";
font-family: 'Montserrat', sans-serif;
}
</style>
<h1>{% trans 'Upload an export from libravatar' %}</h1>
<div style="max-width:600px;">
<form enctype="multipart/form-data" method="post">{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<button type="submit" class="btn btn-primary">{% trans 'Upload' %}</button>
<button type="cancel" class="btn btn-danger">{% trans 'Cancel' %}</button>
{% endbuttons %}
<form enctype="multipart/form-data" method="post">
{% csrf_token %}
<div class="form-group">
<label for="id_export_file">{% trans 'Export file' %}</label>
<span class="btn btn-default uploadbtn" style="display:flex;width:120px;padding:0;height:36px;position:relative;align-items:center">
<input type="file" name="export_file" required id="id_export_file" style="opacity:0;width:100%;height:100%;float:left">
</span>
</div>
<div class="form-group">
<div class="checkbox">
<input type="checkbox" name="not_porn" required id="id_not_porn">
<label for="id_not_porn">{% trans 'suitable for all ages (i.e. no offensive content)' %}</label>
</div>
</div>
<div class="form-group">
<div class="checkbox">
<input type="checkbox" name="can_distribute" required id="id_can_distribute">
<label for="id_can_distribute">{% trans 'can be freely copied' %}</label>
</div>
</div>
<button type="submit" class="btn btn-default">{% trans 'Upload' %}</button>
</form>
</div>
<div style="height:40px"></div>
{% endblock content %}

View File

@@ -1,7 +1,6 @@
{% extends 'base.html' %}
{% load i18n %}
{% load static %}
{% load bootstrap4 %}
{% block title %}{% trans 'Upload a new photo' %}{% endblock title %}
@@ -9,35 +8,60 @@
<link rel="prefetch" href="{% static '/js/jcrop.js' %}">{% endblock header %}
{% block content %}
<style>
input[type=checkbox] {display:none}
input[type=checkbox] + label {
padding-left:0;
}
input[type=checkbox] + label:before {
font-family: FontAwesome;
display: inline-block;
letter-spacing:5px;
font-size:20px;
color:#36b7d7;
vertical-align:middle;
}
input[type=checkbox] + label:before {content: "\f0c8"}
input[type=checkbox]:checked + label:before {content: "\f14a"}
.uploadbtn:before {
position:absolute;
left:0;
right:0;
text-align:center;
content:"Select file";
font-family: 'Montserrat', sans-serif;
}
</style>
<h1>{% trans 'Upload a new photo' %}</h1>
<form enctype="multipart/form-data" action="{% url 'upload_photo' %}" method="post">{% csrf_token %}
{% if email %}<input type="hidden" name="email" value="{{ email }}">{% endif %}
{% if openid %}<input type="hidden" name="openid" value="{{ openid }}">{% endif %}
{{ form.photo.errors }}
<div class="form-group">
{{ form.photo.label_tag }}
<input id="id_photo" type="file" name="photo" accept="image/*">
</div>
{% if form.photo.errors %}
<div class="alert alert-danger" role="alert">{{ form.photo.errors }}</div>
{% endif %}
<div class="form-group">
<label for="id_photo">{% trans 'Photo' %}:</label>
<span class="btn btn-default uploadbtn" style="display:flex;width:120px;padding:0;height:36px;position:relative;align-items:center">
<input type="file" name="photo" required id="id_photo" accept="image/*" style="opacity:0;width:100%;height:100%;float:left">
</span>
</div>
{% blocktrans with max_file_size|filesizeformat as max_size %}Maximum file size of {{ max_size }}.{% endblocktrans %}</p>
<div class="form-group">
<ul class="conditions">
<li>
{{ form.not_porn.errors }} {{ form.not_porn }}
<label for="id_not_porn">{{ form.not_porn.label }}</label>
</li>
<li>
{{ form.can_distribute.errors }} {{ form.can_distribute }}
<label for="id_can_distribute">{{ form.can_distribute.label }}</label>
</li>
</ul>
</div>
{% buttons %}
<button type="submit" class="btn btn-primary">{% trans 'Upload' %}</button>
<button type="cancel" class="btn btn-danger">{% trans 'Cancel' %}</button>
{% endbuttons %}
<div class="form-group">
<div class="checkbox">
<input type="checkbox" name="not_porn" required id="id_not_porn">
<label for="id_not_porn">{% trans 'suitable for all ages (i.e. no offensive content)' %}</label>
</div>
</div>
<div class="form-group">
<div class="checkbox">
<input type="checkbox" name="can_distribute" required id="id_can_distribute">
<label for="id_can_distribute">{% trans 'can be freely copied' %}</label>
</div>
</div>
<button type="submit" class="btn btn-default">{% trans 'Upload' %}</button>
</form>
<div style="height:40px"></div>
{% endblock content %}

View File

@@ -37,7 +37,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods
username = random_string()
password = random_string()
email = '%s@%s.%s' % (username, random_string(), random_string(2))
# Dunno why random tld doens't work, but I'm too lazy now to investigate
# Dunno why random tld doesn't work, but I'm too lazy now to investigate
openid = 'http://%s.%s.%s/' % (username, random_string(), 'org')
def login(self):
@@ -375,7 +375,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods
self.assertEqual(
response.status_code,
200,
'deleting photo doesnt work?')
'deleting photo does not work?')
self.assertEqual(
str(list(response.context[0]['messages'])[0]),
'Photo deleted successfully',
@@ -489,11 +489,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods
self.login()
url = reverse('upload_photo')
# rb => Read binary
with open(
os.path.join(
settings.STATIC_ROOT,
'img',
'deadbeef.png'),
with open(os.path.join(settings.STATIC_ROOT, 'img', 'deadbeef.png'),
'rb') as photo:
response = self.client.post(url, {
'photo': photo,
@@ -571,11 +567,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods
self.login()
url = reverse('upload_photo')
# rb => Read binary
with open(
os.path.join(
settings.STATIC_ROOT,
'img',
'mm.svg'),
with open(os.path.join(settings.STATIC_ROOT, 'img', 'mm.svg'),
'rb') as photo:
response = self.client.post(url, {
'photo': photo,
@@ -594,11 +586,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods
self.login()
url = reverse('upload_photo')
# rb => Read binary
with open(
os.path.join(
settings.STATIC_ROOT,
'img',
'broken.gif'),
with open(os.path.join(settings.STATIC_ROOT, 'img', 'broken.gif'),
'rb') as photo:
response = self.client.post(url, {
'photo': photo,
@@ -620,10 +608,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods
self.login()
url = reverse('upload_photo')
# rb => Read binary
with open(
os.path.join(
settings.STATIC_ROOT,
'img',
with open(os.path.join(settings.STATIC_ROOT, 'img',
'hackergotchi_test.tif'),
'rb') as photo:
response = self.client.post(url, {
@@ -860,7 +845,6 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods
'openid',
'OpenID already added and confirmed!')
def test_assign_photo_to_openid(self):
'''
Test assignment of photo to openid

View File

@@ -4,9 +4,11 @@ View classes for ivatar/ivataraccount/
from io import BytesIO
from urllib.request import urlopen
import base64
from PIL import Image
from urllib.request import urlopen
import binascii
from PIL import Image
from django.db.models import ProtectedError
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.utils.decorators import method_decorator
@@ -298,7 +300,7 @@ class ImportPhotoView(SuccessMessageMixin, TemplateView):
if 'email_id' in kwargs:
try:
addr = ConfirmedEmail.objects.get(pk=kwargs['email_id']).email
except Exception: # pylint: disable=broad-except
except ConfirmedEmail.ObjectDoesNotExist:
messages.error(
self.request,
_('Address does not exist'))
@@ -316,10 +318,12 @@ class ImportPhotoView(SuccessMessageMixin, TemplateView):
email=addr,
default=404,
)
try:
if libravatar_service_url:
# if it doesn't work, it will be catched by except
try:
urlopen(libravatar_service_url)
except OSError as exc:
print('Exception caught during photo import: {}'.format(exc))
else:
context['photos'].append({
'service_url': libravatar_service_url,
'thumbnail_url': libravatar_service_url + '?s=80',
@@ -328,9 +332,6 @@ class ImportPhotoView(SuccessMessageMixin, TemplateView):
'height': 80,
'service_name': 'Libravatar',
})
except Exception as e: # pylint: disable=broad-except,invalid-name
print('Exception caught during photo import: %s' % e)
pass
return context
@@ -423,7 +424,7 @@ class DeletePhotoView(SuccessMessageMixin, View):
photo = self.model.objects.get( # pylint: disable=no-member
pk=kwargs['pk'], user=request.user)
photo.delete()
except Exception: # pylint: disable=broad-except
except (self.model.DoesNotExist, ProtectedError):
messages.error(
request,
_('No such image or no permission to delete it'))
@@ -558,12 +559,12 @@ class RedirectOpenIDView(View):
try:
auth_request = openid_consumer.begin(user_url)
except consumer.DiscoveryFailure as e: # pylint: disable=invalid-name
messages.error(request, _('OpenID discovery failed: %s' % e))
except consumer.DiscoveryFailure as exc:
messages.error(request, _('OpenID discovery failed: %s' % exc))
return HttpResponseRedirect(reverse_lazy('profile'))
except UnicodeDecodeError as e: # pragma: no cover pylint: disable=invalid-name
except UnicodeDecodeError as exc: # pragma: no cover
msg = _('OpenID discovery failed (userid=%s) for %s: %s' %
(request.user.id, user_url.encode('utf-8'), e))
(request.user.id, user_url.encode('utf-8'), exc))
print(msg)
messages.error(request, msg)
@@ -684,14 +685,14 @@ class CropPhotoView(TemplateView):
if 'email' in request.POST:
try:
email = ConfirmedEmail.objects.get(email=request.POST['email'])
except Exception: # pylint: disable=broad-except
except ConfirmedEmail.DoesNotExist:
pass # Ignore automatic assignment
if 'openid' in request.POST:
try:
openid = ConfirmedOpenId.objects.get( # pylint: disable=no-member
openid=request.POST['openid'])
except Exception: # pylint: disable=broad-except
except ConfirmedOpenId.DoesNotExist:
pass # Ignore automatic assignment
return photo.perform_crop(request, dimensions, email, openid)
@@ -731,8 +732,8 @@ class UploadLibravatarExportView(SuccessMessageMixin, FormView):
for arg in request.POST:
if arg.startswith('email_'):
email = request.POST[arg]
if not ConfirmedEmail.objects.filter(email=email) and \
not UnconfirmedEmail.objects.filter(email=email): # pylint: disable=no-member
if (not ConfirmedEmail.objects.filter(email=email)
and not UnconfirmedEmail.objects.filter(email=email)): # pylint: disable=no-member
try:
unconfirmed = UnconfirmedEmail.objects.create( # pylint: disable=no-member
user=request.user,
@@ -743,19 +744,20 @@ class UploadLibravatarExportView(SuccessMessageMixin, FormView):
url=request.build_absolute_uri('/')[:-1])
messages.info(
request,
'%s: %s' %(
'%s: %s' % (
email,
_('address added successfully,\
confirmation mail sent')))
except Exception as e: # pylint: disable=broad-except,invalid-name
except Exception as exc: # pylint: disable=broad-except
# DEBUG
print('Exception during adding mail address (%s): %s' % (email, e))
print('Exception during adding mail address (%s): %s'
% (email, exc))
if arg.startswith('photo'):
try:
data = base64.decodebytes(bytes(request.POST[arg], 'utf-8'))
except Exception as e: # pylint: disable=broad-except,invalid-name
print('Cannot decode photo: %s' % e)
except binascii.Error as exc:
print('Cannot decode photo: %s' % exc)
continue
try:
pilobj = Image.open(BytesIO(data))
@@ -768,8 +770,8 @@ class UploadLibravatarExportView(SuccessMessageMixin, FormView):
photo.format = file_format(pilobj.format)
photo.data = out.read()
photo.save()
except Exception as e: # pylint: disable=broad-except,invalid-name
print('Exception during save: %s' % e)
except Exception as exc: # pylint: disable=broad-except
print('Exception during save: %s' % exc)
continue
return HttpResponseRedirect(reverse_lazy('profile'))
@@ -799,17 +801,18 @@ class ResendConfirmationMailView(View):
try:
email = self.model.objects.get( # pylint: disable=no-member
user=request.user, id=kwargs['email_id'])
except self.model.DoesNotExist: # pragma: no cover # pylint: disable=no-member
messages.error(request, _('ID does not exist'))
else:
try:
email.send_confirmation_mail(
url=request.build_absolute_uri('/')[:-1])
messages.success(
request, '%s: %s' %
(_('Confirmation mail sent to'), email.email))
except Exception as e: # pylint: disable=broad-except,invalid-name
except Exception as exc: # pylint: disable=broad-except
messages.error(
request, '%s %s: %s' %
(_('Unable to send confirmation email for'),
email.email, e))
except self.model.DoesNotExist: # pragma: no cover # pylint: disable=no-member
messages.error(request, _('ID does not exist'))
email.email, exc))
return HttpResponseRedirect(reverse_lazy('profile'))

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
bootstrap-4.1.1.min.css

6
ivatar/static/css/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
bootstrap-4.1.1.min.css.map

View File

@@ -1,131 +0,0 @@
body {
background-image: url("../img/pattern.jpg");
margin: 0;
}
h1, h2, h3 {
font-weight: bold;
}
h1 {
color: #8c8c11;
}
#contribute-button a {
background-color: #938411;
}
#outer {
background-color: #AB9F58;
}
#account a {
color: white;
}
#site-name {
color: #fff;
}
#site-branding {
color: #fff;
margin-right: 20%;
}
.error, .errorlist li {
border-radius: 0px;
}
#page {
background-color: #7e3700cc;
padding: 10px 18px;
margin: 12px;
}
#header, #footer {
color: #fff;
}
a {
color: #F9711F;
font-weight: bold;
}
#header {
padding: 5px;
margin-bottom: 10px;
}
#footer {
font-size: small;
padding: 5px;
min-height: 40px;
margin-top: 30px;
position: relative;
}
#account {
float: right;
font-size: 18px;
font-weight: bold;
padding: 2px;
margin-bottom: 10px;
}
#content {
background-color: #fff;
padding: 25px;
border-radius: 0px;
clear: both;
}
#content a {
color: #938411;
}
ul li {
list-style-type: none;
}
.horizontal-list li {
display: inline;
float: left;
margin: 0 15px 15px 0;
}
.centered li {
text-align: center;
vertical-align: middle;
}
.fas, .fab {
color: #dbc40d;
}
.btn {
border-radius: 0px;
}
.navbar {
padding: 0px;
}
.bg-light {
background-color: transparent !important;
}
.nav-link {
color: #eee !important;
}
.nav-link:hover {
color: #fff !important;
}
.form-control {
border-radius: 0px;
}
.dropdown-menu {
border-radius: 0px;
}

View File

@@ -1,41 +0,0 @@
/* Main palette from http://www.colourlovers.com/palette/4581580/Dr._Hans_6 */
body {
background-color: #DEE8F1;
}
#site-name {
color: #675E57;
}
#site-branding {
color: #4F6384;
}
h1 {
color: #675E57;
}
h2 {
color: #4F6384;
}
#outer {
background-color: #9AB5D2;
}
a {
color: #675E57;
}
#content {
background-color: #FFFFFF;
}
#content a {
color: #4F6384;
}
.fas, .fab {
color: #675E57;
}

4
ivatar/static/css/fontawesome.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,25 @@
@font-face {
font-family: 'Montserrat';
font-style: normal;
font-weight: 400;
src: url("../fonts/montserrat-regular-webfont.eot");
src: url("../fonts/montserrat-regular-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/montserrat-regular-webfont.woff2") format("woff2"), url("../fonts/montserrat-regular-webfont.woff") format("woff"), url("../fonts/montserrat-regular-webfont.ttf") format("truetype");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
}
@font-face {
font-family: 'Montserrat';
font-style: normal;
font-weight: 700;
src: url("../fonts/montserrat-bold-webfont.eot");
src: url("../fonts/montserrat-bold-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/montserrat-bold-webfont.woff2") format("woff2"), url("../fonts/montserrat-bold-webfont.woff") format("woff"), url("../fonts/montserrat-bold-webfont.ttf") format("truetype");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
}
@font-face {
font-family: 'Source Sans Pro';
src: url('../fonts/Source-Sans-Pro.woff') format('woff'),
url('../fonts/Source-Sans-Pro.svg#Source-Sans-Pro') format('svg'),
url('../fonts/Source-Sans-Pro.eot'),
url('../fonts/Source-Sans-Pro.eot?#iefix') format('embedded-opentype');
font-weight: normal;
font-style: normal;
}

View File

@@ -1,201 +0,0 @@
/* Main palette from http://www.colourlovers.com/palette/4569033/Graceful */
body {
background-color: #FFE7B9;
margin: 10px;
}
#site-name {
color: #332B3A;
font-size: 1.5em;
font-style: normal;
letter-spacing: 0.35em;
}
#logo {
float: left;
margin: 0 1em 0 0;
}
#logo img {
border: 0;
}
#site-branding {
color: #0B0507;
font-style: italic;
float: left;
}
h1 {
color: #AFA44B;
}
h2 {
color: #F9711F;
font-weight: normal;
}
.error, .errorlist li {
background-color: #FF0000;
border-radius: 8px;
color: #FFFFFF;
font-weight: bold;
padding: 8px;
}
#outer {
background-color: #AFA44B;
padding: 16px;
}
#header, #footer {
color: #8390BA;
}
a {
color: #F9711F;
font-weight: bold;
}
#footer {
font-size: small;
padding: 16px 8px 8px 8px;
}
#account {
text-align: right;
}
#content {
background-color: #FFFFFF;
border-radius: 8px;
padding: 8px 16px 16px 16px;
}
#content a {
color: #AFA44B;
}
.thumbnail {
border: 0;
max-height: 80px;
max-width: 80px;
}
.avatar-list {
height: 105px;
margin: 0 0 0 1.5em;
padding: 0;
}
.avatar-list .editable {
margin: 0 8px 0 0;
}
@media screen and (max-width: 414px) {
.avatar-list {
position: relative;
left: -30px;
}
}
ul li {
list-style-type: none;
}
.horizontal-list li {
display: inline;
float: left;
margin: 0 15px 15px 0;
}
.centered li {
text-align: center;
vertical-align: middle;
}
.imported-list {
height: 125px;
margin: 0 0 0 1.5em;
padding: 0;
}
.conditions {
list-style-type: none;
margin: 0;
padding-start: 0;
}
.hint {
color: #6D6D6D;
font-style: italic;
margin: 0 0 0 20px;
}
.avatar-chooser {
float: left;
}
#action-panel {
border: 5px;
border-radius: 8px;
border-style: dashed;
float: right;
margin: 20px;
padding: 5px 20px 15px 20px;
}
#id_openid, #id_openid_identifier {
background : #FFFFFF url("../img/openid_logo.png") no-repeat scroll 0 50%;
padding : 4px 18px;
}
#contribute-button {
text-align: center;
}
#contribute-button a {
background-color: #AFA44B;
border: 1px;
border-color: #000;
border-radius: 8px;
border-style: solid;
font-size: 1.5em;
color: black !important;
padding: 3px 5px 5px 5px;
}
#agpl-button {
background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGsAAAAUCAMAAAC9FTMqAAAAV1BMVEXV1tXMzczGyMa4urivsq+rraurraurrauqrKqnq6edoJyTl5OFiIR7fntwc3BjZWJbXVtISUc/QD8xMjEnJyccHBwSEhIMDAwBAQEAAAAAAAAAAAAAAAAPezW4AAABW0lEQVRIx73VyY7DIBAE0E6kisxibJYGDvX/3zkHE8eamUssJ31BspCfKJYWfq+EwXynAoVGpn/K2mmapgspMRSaBwDA4lVmVTYLAOmyAKeX5eYnZG2oJOlxKXawQhiSt7GXRpaxRL3eWlYAgPdYo0NkdWOZYczNKY8xpcaWUsokW2rvW2sEYBYL64G5N7/v3fiZyG2MIoVFRIRkkXzCqoCNZltKJ3U/KJkks2SNoiySVLWzSNQk5aRF90gWAEwsSqbdSptlnZHCLCU6pyxinQ/1nBW4xhkAzGwRXtu1W7ebbNYyMrxNZzOc+7LHtvbq8TtDZd4s5kN2pyybyojNF6o73Ot2tLre5a79YInc37Uw92oBM+fexxE5nnkNjRoqySWsJOt231lDCMvbliebaiPrjONzVa+/y/Dbpx6PD+Nn3ihgaaRGh89Qw3r2FOPMn9ZycU/5Zq/8Xv0AInWfQFkFqnUAAAAASUVORK5CYII=');
float: left;
height: 20px;
margin: 0 5px 0 0;
width: 107px;
}
.bolder {
font-weight: bolder;
}
.hidden {
display: none;
}
.clear-both {
clear: both;
}
.fas, .fab {
color: #dbc40d;
}
@media screen and (max-width: 320px) {
body {
font-size: 90%;
}
h1 {
font-size: 1.2em;
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,313 @@
@lab-blue:#36b7d7;
@lab-blue-light:#d5f0f7;
@lab-green:#3aa850;
@lab-green-light:#4bd268;
@lab-red:#f7645e;
@lab-black:#525252;
@lab-grey:#888888;
@lab-grey-light:#dddddd;
@lab-grey-lighter:#f5f5f5;
@lab-libravatar:#f9711f;
@lab-font:'Source Sans Pro',Helvetica,Arial,sans-serif;
@lab-font-bold:600;
@lab-font-thin:200;
@bg-hero:@lab-blue;
body {
font-family: @lab-font;
color: @lab-black;
}
.btn {
border-bottom-width: 3px;
box-sizing: border-box;
font-family: 'Montserrat', sans-serif;
text-transform: uppercase;
background: @bg-hero;
overflow: hidden;
position: relative;
-webkit-transition: all 0.3s;
-moz-transition: all 0.3s;
-ms-transition: all 0.3s;
transition: all 0.3s;
&.btn-default {
color: lighten(@bg-hero, 10%);
border-color: lighten(@bg-hero, 10%);
background: none;
}
&.btn-primary {
border-color: darken(@bg-hero, 15%);
}
&:hover, &:active, &:focus {
background: none;
border-color: darken(@bg-hero, 10%);
color: darken(@bg-hero, 10%);
&:after {
top: 50%;
}
}
&:after {
content: '';
position: absolute;
z-index: -1;
width: 150%;
height: 200%;
top: -190%;
left: 50%;
background: lighten(@bg-hero, 20%);
-webkit-transform: translateX(-50%) translateY(-50%) skew(0,5deg);
-moz-transform: translateX(-50%) translateY(-50%) skew(0,5deg);
-ms-transform: translateX(-50%) translateY(-50%) skew(0,5deg);
transform: translateX(-50%) translateY(-50%) skew(0,5deg);
-webkit-transition: all 0.5s ease-out;
-moz-transition: all 0.5s ease-out;
-ms-transition: all 0.5s ease-out;
transition: all 0.5s ease-out;
}
&.btn-block {
&:after {
height: 250%;
width: 200%;
-webkit-transform: translateX(-50%) translateY(-50%) skew(0,2deg);
-moz-transform: translateX(-50%) translateY(-50%) skew(0,2deg);
-ms-transform: translateX(-50%) translateY(-50%) skew(0,2deg);
transform: translateX(-50%) translateY(-50%) skew(0,2deg);
}
}
}
.hero {
background-color: @bg-hero;
color: #fff;
padding: 90px 0 40px;
h1 {
font-weight: @lab-font-bold;
font-size: 6em;
color: rgba(255,255,255,.5);
}
h2 {
font-weight: @lab-font-thin;
font-size: 30px;
margin-bottom: 30px;
}
small {
color: rgba(0,0,0,.4);
}
.btn {
display: inline-block;
&.btn-default {
color: lighten(@bg-hero, 22%);
border-color: lighten(@bg-hero, 22%);
background: none;
}
&.btn-primary {
border-color: #fff;
}
&:hover, &:active, &:focus {
border-color: #fff;
color: darken(@bg-hero, 20%);
}
&:after {
background: rgba(255,255,255,.5);
}
}
.container {
position: relative;
z-index: 10;
}
}
.social {
background-color: @bg-hero;
padding: 30px 0 140px;
ul {
list-style: none;
padding: 0;
margin: 0;
li {
float: left;
margin-right: 15px;
width: 100px;
}
}
}
.clipper, .clipper-footer {
background-color: #fff;
height: 110px;
width: 100%;
position: relative;
top: -40px;
-webkit-transform: skew(0,2deg);
-moz-transform: skew(0,2deg);
-ms-transform: skew(0,2deg);
transform: skew(0,2deg);
pointer-events: none;
z-index: 1;
}
.clipper-footer {top: 0;}
section.content {
position: relative;
top: -100px;
margin-bottom: -100px;
z-index: 10;
h1, h2, h3, h4, h5, h6 {
color: darken(@bg-hero, 10%);
}
h2 {
font-weight: @lab-font-thin;
font-size: 40px;
}
section {
margin-bottom: 20px;
margin-top: 20px;
}
& .container > hr {
-webkit-transform: skew(0,2deg);
-moz-transform: skew(0,2deg);
-ms-transform: skew(0,2deg);
transform: skew(0,2deg);
margin-top: 80px;
margin-bottom: 40px;
}
}
footer {
background-color: @lab-grey-light;
color: @lab-grey;
padding: 100px 0 40px;
margin-top: -40px;
.pull-left {margin-right: 20px;}
.logo {
float: left;
display: inline-block;
margin-right: 5px;
margin-top: -8px;
.circle{
stroke: @lab-grey;
stroke-width: 7;
fill: none;
}
.polygon{fill: @lab-grey;}
}
}
@media (max-width: 768px) {
.hero {
padding: 50px 0 30px;
h1 {
font-size: 4em;
}
}
.social {
padding: 30px 0 100px;
}
.btn {
margin-bottom: 5px;
}
section.content {
section {
margin-bottom: 50px;
}
}
}
.color {
display: inline-block;
border-radius: 50%;
height: 20px;
width: 20px;
&.blue {background-color: @lab-blue;}
&.green {background-color: @lab-green;}
&.red {background-color: @lab-red;}
&.black {background-color: @lab-black;}
}
.navbar-tortin {
border:0;
background-color:@bg-hero;
color:#FFFFFF;
border-radius:0;
}
.form-control {
border-bottom-width: 3px;
box-sizing: border-box;
font-family: 'Montserrat', sans-serif;
overflow: hidden;
position: relative;
-webkit-transition: all 0.3s;
-moz-transition: all 0.3s;
-ms-transition: all 0.3s;
transition: all 0.3s;
border-color: lighten(@bg-hero, 10%);
background: none;
}
.form-control:focus {
border-color:darken(@bg-hero,10%);
box-shadow:none;
}
.navbar-tortin .navbar-brand,.navbar-tortin .navbar-text,.navbar-tortin .navbar-nav > li > a,.navbar-tortin .navbar-link,.navbar-tortin .btn-link {
color:#FFFFFF;
}
.navbar-tortin .navbar-nav > .active > a,.navbar-tortin .navbar-nav > .active > a:focus,.navbar-tortin .navbar-nav > .active > a:hover,.navbar-tortin .navbar-nav > li > a:focus,.navbar-tortin .navbar-nav > li > a:hover,.navbar-tortin .navbar-link:hover,.navbar-tortin .btn-link:focus,.navbar-tortin .btn-link:hover,.navbar-tortin .navbar-nav > .open > a,.navbar-tortin .navbar-nav > .open > a:focus,.navbar-tortin .navbar-nav > .open > a:hover {
background-color:darken(@bg-hero, 10%);
}
.navbar-tortin .navbar-toggle {
border-color:#FFFFFF;
}
.navbar-tortin .navbar-toggle:hover {
background-color:#FFFFFF;
}
.navbar-tortin .navbar-toggle .icon-bar {
background-color:#FFFFFF;
}
.navbar-tortin .navbar-toggle:hover .icon-bar {
background-color:@bg-hero;
}
.navbar-tortin .navbar-collapse, .navbar-tortin .navbar-form {
border:0;
}
@media (max-width:767px) {
.navbar-tortin .navbar-nav .open .dropdown-menu > li > a {
color:#FFFFFF
}
.navbar-tortin .navbar-nav .open .dropdown-menu > li > a:hover {
background-color:darken(@bg-hero, 10%);
}
.navbar-tortin .navbar-nav .open .dropdown-menu > .active > a, .navbar-tortin .navbar-nav .open .dropdown-menu > .active > a:focus,
.navbar-tortin .navbar-nav .open .dropdown-menu > .active > a:hover {
background-color:darken(@bg-hero, 10%);
}
}
.panel-tortin {
border-color:@bg-hero;
border-bottom-width: 3px;
}
.panel-tortin > .panel-heading {
color:#fff;
background-color:@bg-hero;
border-color:@bg-hero;
font-family: 'Montserrat', sans-serif;
}
.panel-tortin > .panel-heading + .panel-collapse > .panel-body {
border-top-color:@bg-hero;
}
.panel-tortin > .panel-heading .badge {
color:@bg-hero;
background-color:#fff;
}
.panel-tortin > .panel-footer + .panel-collapse > .panel-body {
border-bottom-color:@bg-hero;
}
.alert.alert-danger {
background-color:#FFFFFF;
color:@lab-red;
border-color:@lab-red;
border-bottom-width: 3px;
box-sizing: border-box;
font-family: 'Montserrat', sans-serif;
overflow: hidden;
position: relative;
}
.input-group-addon {
border-bottom-width: 3px;
box-sizing: border-box;
font-family: 'Montserrat', sans-serif;
overflow: hidden;
position: relative;
border-color: lighten(@bg-hero, 10%);
background: none;
width:auto;
height:36px;
}

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 421 KiB

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
bootstrap-4.1.1.min.js

7
ivatar/static/js/bootstrap.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
popper-1.14.3.min.js

File diff suppressed because one or more lines are too long

View File

@@ -1,845 +0,0 @@
/*!
* Line Awesome 1.1.0 by @icons_8 - https://icons8.com/line-awesome
* License - https://icons8.com/good-boy-license/ (Font: SIL OFL 1.1, CSS: MIT License)
*
* Made with love by Icons8 [ https://icons8.com/ ] using FontCustom [ https://github.com/FontCustom/fontcustom ]
*
* Contacts:
* [ https://icons8.com/contact ]
*
* Follow Icon8 on
* Twitter [ https://twitter.com/icons_8 ]
* Facebook [ https://www.facebook.com/Icons8 ]
* Google+ [ https://plus.google.com/+Icons8 ]
* GitHub [ https://github.com/icons8 ]
*/
@font-face {
font-family: "FontAwesome";
src: url("../fonts/line-awesome.eot?v=1.1.");
src: url("../fonts/line-awesome.eot??v=1.1.#iefix") format("embedded-opentype"),
url("../fonts/line-awesome.woff2?v=1.1.") format("woff2"),
url("../fonts/line-awesome.woff?v=1.1.") format("woff"),
url("../fonts/line-awesome.ttf?v=1.1.") format("truetype"),
url("../fonts/line-awesome.svg?v=1.1.#fa") format("svg");
font-weight: normal;
font-style: normal;
}
@media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face {
font-family: "FontAwesome";
src: url("../fonts/line-awesome.svg?v=1.1.#fa") format("svg");
}
}
/* Thanks to http://fontawesome.io @fontawesome and @davegandy */
.fa {
display: inline-block;
font: normal normal normal 14px/1 "FontAwesome";
font-size: inherit;
text-decoration: inherit;
text-rendering: optimizeLegibility;
text-transform: none;
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
font-smoothing: antialiased;
}
/* makes the font 33% larger relative to the icon container */
.fa-lg {
font-size: 1.33333333em;
line-height: 0.75em;
vertical-align: -15%;
}
.fa-2x {
font-size: 2em;
}
.fa-3x {
font-size: 3em;
}
.fa-4x {
font-size: 4em;
}
.fa-5x {
font-size: 5em;
}
.fa-fw {
width: 1.28571429em;
text-align: center;
}
.fa-ul {
padding-left: 0;
margin-left: 2.14285714em;
list-style-type: none;
}
.fa-ul > li {
position: relative;
}
.fa-li {
position: absolute;
left: -2.14285714em;
width: 2.14285714em;
top: 0.14285714em;
text-align: center;
}
.fa-li.fa-lg {
left: -1.85714286em;
}
.fa-border {
padding: .2em .25em .15em;
border: solid 0.08em #eeeeee;
border-radius: .1em;
}
.pull-right {
float: right;
}
.pull-left {
float: left;
}
.fa.pull-left {
margin-right: .3em;
}
.fa.pull-right {
margin-left: .3em;
}
.fa-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);
}
}
.fa-rotate-90 {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
-webkit-transform: rotate(90deg);
-ms-transform: rotate(90deg);
transform: rotate(90deg);
}
.fa-rotate-180 {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
-webkit-transform: rotate(180deg);
-ms-transform: rotate(180deg);
transform: rotate(180deg);
}
.fa-rotate-270 {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
-webkit-transform: rotate(270deg);
-ms-transform: rotate(270deg);
transform: rotate(270deg);
}
.fa-flip-horizontal {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
-webkit-transform: scale(-1, 1);
-ms-transform: scale(-1, 1);
transform: scale(-1, 1);
}
.fa-flip-vertical {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);
-webkit-transform: scale(1, -1);
-ms-transform: scale(1, -1);
transform: scale(1, -1);
}
:root .fa-rotate-90,
:root .fa-rotate-180,
:root .fa-rotate-270,
:root .fa-flip-horizontal,
:root .fa-flip-vertical {
filter: none;
}
.fa-stack {
position: relative;
display: inline-block;
width: 2em;
height: 2em;
line-height: 2em;
vertical-align: middle;
}
.fa-stack-1x,
.fa-stack-2x {
position: absolute;
left: 0;
width: 100%;
text-align: center;
}
.fa-stack-1x {
line-height: inherit;
}
.fa-stack-2x {
font-size: 2em;
}
.fa-inverse {
color: #ffffff;
}
/* Thanks to http://fontawesome.io @fontawesome and @davegandy */
.fa-500px:before { content: "\f100"; }
.fa-adjust:before { content: "\f101"; }
.fa-adn:before { content: "\f102"; }
.fa-align-center:before { content: "\f103"; }
.fa-align-justify:before { content: "\f104"; }
.fa-align-left:before { content: "\f105"; }
.fa-align-right:before { content: "\f106"; }
.fa-amazon:before { content: "\f107"; }
.fa-ambulance:before { content: "\f108"; }
.fa-anchor:before { content: "\f109"; }
.fa-android:before { content: "\f10a"; }
.fa-angellist:before { content: "\f10b"; }
.fa-angle-double-down:before { content: "\f10c"; }
.fa-angle-double-left:before { content: "\f10d"; }
.fa-angle-double-right:before { content: "\f10e"; }
.fa-angle-double-up:before { content: "\f10f"; }
.fa-angle-down:before { content: "\f110"; }
.fa-angle-left:before { content: "\f111"; }
.fa-angle-right:before { content: "\f112"; }
.fa-angle-up:before { content: "\f113"; }
.fa-apple:before { content: "\f114"; }
.fa-archive:before { content: "\f115"; }
.fa-area-chart:before { content: "\f116"; }
.fa-arrow-circle-down:before { content: "\f117"; }
.fa-arrow-circle-left:before { content: "\f118"; }
.fa-arrow-circle-o-down:before { content: "\f119"; }
.fa-arrow-circle-o-left:before { content: "\f11a"; }
.fa-arrow-circle-o-right:before { content: "\f11b"; }
.fa-arrow-circle-o-up:before { content: "\f11c"; }
.fa-arrow-circle-right:before { content: "\f11d"; }
.fa-arrow-circle-up:before { content: "\f11e"; }
.fa-arrow-down:before { content: "\f11f"; }
.fa-arrow-left:before { content: "\f120"; }
.fa-arrow-right:before { content: "\f121"; }
.fa-arrow-up:before { content: "\f122"; }
.fa-arrows:before { content: "\f123"; }
.fa-arrows-alt:before { content: "\f124"; }
.fa-arrows-h:before { content: "\f125"; }
.fa-arrows-v:before { content: "\f126"; }
.fa-asterisk:before { content: "\f127"; }
.fa-at:before { content: "\f128"; }
.fa-automobile:before { content: "\f129"; }
.fa-backward:before { content: "\f12a"; }
.fa-balance-scale:before { content: "\f12b"; }
.fa-ban:before { content: "\f12c"; }
.fa-bank:before { content: "\f12d"; }
.fa-bar-chart:before { content: "\f12e"; }
.fa-bar-chart-o:before { content: "\f12f"; }
.fa-barcode:before { content: "\f130"; }
.fa-bars:before { content: "\f131"; }
.fa-battery-0:before { content: "\f132"; }
.fa-battery-1:before { content: "\f133"; }
.fa-battery-2:before { content: "\f134"; }
.fa-battery-3:before { content: "\f135"; }
.fa-battery-4:before { content: "\f136"; }
.fa-battery-empty:before { content: "\f137"; }
.fa-battery-full:before { content: "\f138"; }
.fa-battery-half:before { content: "\f139"; }
.fa-battery-quarter:before { content: "\f13a"; }
.fa-battery-three-quarters:before { content: "\f13b"; }
.fa-bed:before { content: "\f13c"; }
.fa-beer:before { content: "\f13d"; }
.fa-behance:before { content: "\f13e"; }
.fa-behance-square:before { content: "\f13f"; }
.fa-bell:before { content: "\f140"; }
.fa-bell-o:before { content: "\f141"; }
.fa-bell-slash:before { content: "\f142"; }
.fa-bell-slash-o:before { content: "\f143"; }
.fa-bicycle:before { content: "\f144"; }
.fa-binoculars:before { content: "\f145"; }
.fa-birthday-cake:before { content: "\f146"; }
.fa-bitbucket:before { content: "\f147"; }
.fa-bitbucket-square:before { content: "\f148"; }
.fa-bitcoin:before { content: "\f149"; }
.fa-black-tie:before { content: "\f14a"; }
.fa-bold:before { content: "\f14b"; }
.fa-bolt:before { content: "\f14c"; }
.fa-bomb:before { content: "\f14d"; }
.fa-book:before { content: "\f14e"; }
.fa-bookmark:before { content: "\f14f"; }
.fa-bookmark-o:before { content: "\f150"; }
.fa-briefcase:before { content: "\f151"; }
.fa-btc:before { content: "\f152"; }
.fa-bug:before { content: "\f153"; }
.fa-building:before { content: "\f154"; }
.fa-building-o:before { content: "\f155"; }
.fa-bullhorn:before { content: "\f156"; }
.fa-bullseye:before { content: "\f157"; }
.fa-bus:before { content: "\f158"; }
.fa-buysellads:before { content: "\f159"; }
.fa-cab:before { content: "\f15a"; }
.fa-calculator:before { content: "\f15b"; }
.fa-calendar:before { content: "\f15c"; }
.fa-calendar-check-o:before { content: "\f15d"; }
.fa-calendar-minus-o:before { content: "\f15e"; }
.fa-calendar-o:before { content: "\f15f"; }
.fa-calendar-plus-o:before { content: "\f160"; }
.fa-calendar-times-o:before { content: "\f161"; }
.fa-camera:before { content: "\f162"; }
.fa-camera-retro:before { content: "\f163"; }
.fa-car:before { content: "\f164"; }
.fa-caret-down:before { content: "\f165"; }
.fa-caret-left:before { content: "\f166"; }
.fa-caret-right:before { content: "\f167"; }
.fa-caret-square-o-down:before, .fa-toggle-down:before { content: "\f168"; }
.fa-caret-square-o-left:before, .fa-toggle-left:before { content: "\f169"; }
.fa-caret-square-o-right:before, .fa-toggle-right:before { content: "\f16a"; }
.fa-caret-square-o-up:before, .fa-toggle-up:before { content: "\f16b"; }
.fa-caret-up:before { content: "\f16c"; }
.fa-cart-arrow-down:before { content: "\f16d"; }
.fa-cart-plus:before { content: "\f16e"; }
.fa-cc:before { content: "\f16f"; }
.fa-cc-amex:before { content: "\f170"; }
.fa-cc-diners-club:before { content: "\f171"; }
.fa-cc-discover:before { content: "\f172"; }
.fa-cc-jcb:before { content: "\f173"; }
.fa-cc-mastercard:before { content: "\f174"; }
.fa-cc-paypal:before { content: "\f175"; }
.fa-cc-stripe:before { content: "\f176"; }
.fa-cc-visa:before { content: "\f177"; }
.fa-certificate:before { content: "\f178"; }
.fa-chain:before { content: "\f179"; }
.fa-chain-broken:before { content: "\f17a"; }
.fa-check:before { content: "\f17b"; }
.fa-check-circle:before { content: "\f17c"; }
.fa-check-circle-o:before { content: "\f17d"; }
.fa-check-square:before { content: "\f17e"; }
.fa-check-square-o:before { content: "\f17f"; }
.fa-chevron-circle-down:before { content: "\f180"; }
.fa-chevron-circle-left:before { content: "\f181"; }
.fa-chevron-circle-right:before { content: "\f182"; }
.fa-chevron-circle-up:before { content: "\f183"; }
.fa-chevron-down:before { content: "\f184"; }
.fa-chevron-left:before { content: "\f185"; }
.fa-chevron-right:before { content: "\f186"; }
.fa-chevron-up:before { content: "\f187"; }
.fa-child:before { content: "\f188"; }
.fa-chrome:before { content: "\f189"; }
.fa-circle:before { content: "\f18a"; }
.fa-circle-o:before { content: "\f18b"; }
.fa-circle-o-notch:before { content: "\f18c"; }
.fa-circle-thin:before { content: "\f18d"; }
.fa-clipboard:before { content: "\f18e"; }
.fa-clock-o:before { content: "\f18f"; }
.fa-clone:before { content: "\f190"; }
.fa-close:before { content: "\f191"; }
.fa-cloud:before { content: "\f192"; }
.fa-cloud-download:before { content: "\f193"; }
.fa-cloud-upload:before { content: "\f194"; }
.fa-cny:before { content: "\f195"; }
.fa-code:before { content: "\f196"; }
.fa-code-fork:before { content: "\f197"; }
.fa-codepen:before { content: "\f198"; }
.fa-coffee:before { content: "\f199"; }
.fa-cog:before { content: "\f19a"; }
.fa-cogs:before { content: "\f19b"; }
.fa-columns:before { content: "\f19c"; }
.fa-comment:before { content: "\f19d"; }
.fa-comment-o:before { content: "\f19e"; }
.fa-commenting:before { content: "\f19f"; }
.fa-commenting-o:before { content: "\f1a0"; }
.fa-comments:before { content: "\f1a1"; }
.fa-comments-o:before { content: "\f1a2"; }
.fa-compass:before { content: "\f1a3"; }
.fa-compress:before { content: "\f1a4"; }
.fa-connectdevelop:before { content: "\f1a5"; }
.fa-contao:before { content: "\f1a6"; }
.fa-copy:before { content: "\f1a7"; }
.fa-copyright:before { content: "\f1a8"; }
.fa-creative-commons:before { content: "\f1a9"; }
.fa-credit-card:before { content: "\f1aa"; }
.fa-crop:before { content: "\f1ab"; }
.fa-crosshairs:before { content: "\f1ac"; }
.fa-css3:before { content: "\f1ad"; }
.fa-cube:before { content: "\f1ae"; }
.fa-cubes:before { content: "\f1af"; }
.fa-cut:before { content: "\f1b0"; }
.fa-cutlery:before { content: "\f1b1"; }
.fa-dashboard:before { content: "\f1b2"; }
.fa-dashcube:before { content: "\f1b3"; }
.fa-database:before { content: "\f1b4"; }
.fa-dedent:before { content: "\f1b5"; }
.fa-delicious:before { content: "\f1b6"; }
.fa-desktop:before { content: "\f1b7"; }
.fa-deviantart:before { content: "\f1b8"; }
.fa-diamond:before { content: "\f1b9"; }
.fa-digg:before { content: "\f1ba"; }
.fa-dollar:before { content: "\f1bb"; }
.fa-dot-circle-o:before { content: "\f1bc"; }
.fa-download:before { content: "\f1bd"; }
.fa-dribbble:before { content: "\f1be"; }
.fa-dropbox:before { content: "\f1bf"; }
.fa-drupal:before { content: "\f1c0"; }
.fa-edit:before { content: "\f1c1"; }
.fa-eject:before { content: "\f1c2"; }
.fa-ellipsis-h:before { content: "\f1c3"; }
.fa-ellipsis-v:before { content: "\f1c4"; }
.fa-empire:before, .fa-ge:before { content: "\f1c5"; }
.fa-envelope:before { content: "\f1c6"; }
.fa-envelope-o:before { content: "\f1c7"; }
.fa-envelope-square:before { content: "\f1c8"; }
.fa-eraser:before { content: "\f1c9"; }
.fa-eur:before { content: "\f1ca"; }
.fa-euro:before { content: "\f1cb"; }
.fa-exchange:before { content: "\f1cc"; }
.fa-exclamation:before { content: "\f1cd"; }
.fa-exclamation-circle:before { content: "\f1ce"; }
.fa-exclamation-triangle:before { content: "\f1cf"; }
.fa-expand:before { content: "\f1d0"; }
.fa-expeditedssl:before { content: "\f1d1"; }
.fa-external-link:before { content: "\f1d2"; }
.fa-external-link-square:before { content: "\f1d3"; }
.fa-eye:before { content: "\f1d4"; }
.fa-eye-slash:before { content: "\f1d5"; }
.fa-eyedropper:before { content: "\f1d6"; }
.fa-facebook:before, .fa-facebook-f:before { content: "\f1d7"; }
.fa-facebook-official:before { content: "\f1d8"; }
.fa-facebook-square:before { content: "\f1d9"; }
.fa-fast-backward:before { content: "\f1da"; }
.fa-fast-forward:before { content: "\f1db"; }
.fa-fax:before { content: "\f1dc"; }
.fa-female:before { content: "\f1dd"; }
.fa-fighter-jet:before { content: "\f1de"; }
.fa-file:before { content: "\f1df"; }
.fa-file-archive-o:before { content: "\f1e0"; }
.fa-file-audio-o:before { content: "\f1e1"; }
.fa-file-code-o:before { content: "\f1e2"; }
.fa-file-excel-o:before { content: "\f1e3"; }
.fa-file-image-o:before { content: "\f1e4"; }
.fa-file-movie-o:before { content: "\f1e5"; }
.fa-file-o:before { content: "\f1e6"; }
.fa-file-pdf-o:before { content: "\f1e7"; }
.fa-file-photo-o:before { content: "\f1e8"; }
.fa-file-picture-o:before { content: "\f1e9"; }
.fa-file-powerpoint-o:before { content: "\f1ea"; }
.fa-file-sound-o:before { content: "\f1eb"; }
.fa-file-text:before { content: "\f1ec"; }
.fa-file-text-o:before { content: "\f1ed"; }
.fa-file-video-o:before { content: "\f1ee"; }
.fa-file-word-o:before { content: "\f1ef"; }
.fa-file-zip-o:before { content: "\f1f0"; }
.fa-files-o:before { content: "\f1f1"; }
.fa-film:before { content: "\f1f2"; }
.fa-filter:before { content: "\f1f3"; }
.fa-fire:before { content: "\f1f4"; }
.fa-fire-extinguisher:before { content: "\f1f5"; }
.fa-firefox:before { content: "\f1f6"; }
.fa-flag:before { content: "\f1f7"; }
.fa-flag-checkered:before { content: "\f1f8"; }
.fa-flag-o:before { content: "\f1f9"; }
.fa-flash:before { content: "\f1fa"; }
.fa-flask:before { content: "\f1fb"; }
.fa-flickr:before { content: "\f1fc"; }
.fa-floppy-o:before { content: "\f1fd"; }
.fa-folder:before { content: "\f1fe"; }
.fa-folder-o:before { content: "\f1ff"; }
.fa-folder-open:before { content: "\f200"; }
.fa-folder-open-o:before { content: "\f201"; }
.fa-font:before { content: "\f202"; }
.fa-fonticons:before { content: "\f203"; }
.fa-forumbee:before { content: "\f204"; }
.fa-forward:before { content: "\f205"; }
.fa-foursquare:before { content: "\f206"; }
.fa-frown-o:before { content: "\f207"; }
.fa-futbol-o:before, .fa-soccer-ball-o:before { content: "\f208"; }
.fa-gamepad:before { content: "\f209"; }
.fa-gavel:before { content: "\f20a"; }
.fa-gbp:before { content: "\f20b"; }
.fa-gear:before { content: "\f20c"; }
.fa-gears:before { content: "\f20d"; }
.fa-genderless:before { content: "\f20e"; }
.fa-get-pocket:before { content: "\f20f"; }
.fa-gg:before { content: "\f210"; }
.fa-gg-circle:before { content: "\f211"; }
.fa-gift:before { content: "\f212"; }
.fa-git:before { content: "\f213"; }
.fa-git-square:before { content: "\f214"; }
.fa-github:before { content: "\f215"; }
.fa-github-alt:before { content: "\f216"; }
.fa-github-square:before { content: "\f217"; }
.fa-glass:before { content: "\f218"; }
.fa-globe:before { content: "\f219"; }
.fa-google:before { content: "\f21a"; }
.fa-google-plus:before { content: "\f21b"; }
.fa-google-plus-square:before { content: "\f21c"; }
.fa-google-wallet:before { content: "\f21d"; }
.fa-graduation-cap:before { content: "\f21e"; }
.fa-gratipay:before, .fa-gittip:before { content: "\f21f"; }
.fa-group:before { content: "\f220"; }
.fa-h-square:before { content: "\f221"; }
.fa-hacker-news:before { content: "\f222"; }
.fa-hand-grab-o:before { content: "\f223"; }
.fa-hand-lizard-o:before { content: "\f224"; }
.fa-hand-o-down:before { content: "\f225"; }
.fa-hand-o-left:before { content: "\f226"; }
.fa-hand-o-right:before { content: "\f227"; }
.fa-hand-o-up:before { content: "\f228"; }
.fa-hand-paper-o:before { content: "\f229"; }
.fa-hand-peace-o:before { content: "\f22a"; }
.fa-hand-pointer-o:before { content: "\f22b"; }
.fa-hand-rock-o:before { content: "\f22c"; }
.fa-hand-scissors-o:before { content: "\f22d"; }
.fa-hand-spock-o:before { content: "\f22e"; }
.fa-hand-stop-o:before { content: "\f22f"; }
.fa-hdd-o:before { content: "\f230"; }
.fa-header:before { content: "\f231"; }
.fa-headphones:before { content: "\f232"; }
.fa-heart:before { content: "\f233"; }
.fa-heart-o:before { content: "\f234"; }
.fa-heartbeat:before { content: "\f235"; }
.fa-history:before { content: "\f236"; }
.fa-home:before { content: "\f237"; }
.fa-hospital-o:before { content: "\f238"; }
.fa-hotel:before { content: "\f239"; }
.fa-hourglass:before { content: "\f23a"; }
.fa-hourglass-1:before { content: "\f23b"; }
.fa-hourglass-2:before { content: "\f23c"; }
.fa-hourglass-3:before { content: "\f23d"; }
.fa-hourglass-end:before { content: "\f23e"; }
.fa-hourglass-half:before { content: "\f23f"; }
.fa-hourglass-o:before { content: "\f240"; }
.fa-hourglass-start:before { content: "\f241"; }
.fa-houzz:before { content: "\f242"; }
.fa-html5:before { content: "\f243"; }
.fa-i-cursor:before { content: "\f244"; }
.fa-ils:before { content: "\f245"; }
.fa-image:before { content: "\f246"; }
.fa-inbox:before { content: "\f247"; }
.fa-indent:before { content: "\f248"; }
.fa-industry:before { content: "\f249"; }
.fa-info:before { content: "\f24a"; }
.fa-info-circle:before { content: "\f24b"; }
.fa-inr:before { content: "\f24c"; }
.fa-instagram:before { content: "\f24d"; }
.fa-institution:before { content: "\f24e"; }
.fa-internet-explorer:before { content: "\f24f"; }
.fa-ioxhost:before { content: "\f250"; }
.fa-italic:before { content: "\f251"; }
.fa-joomla:before { content: "\f252"; }
.fa-jpy:before { content: "\f253"; }
.fa-jsfiddle:before { content: "\f254"; }
.fa-key:before { content: "\f255"; }
.fa-keyboard-o:before { content: "\f256"; }
.fa-krw:before { content: "\f257"; }
.fa-language:before { content: "\f258"; }
.fa-laptop:before { content: "\f259"; }
.fa-lastfm:before { content: "\f25a"; }
.fa-lastfm-square:before { content: "\f25b"; }
.fa-leaf:before { content: "\f25c"; }
.fa-leanpub:before { content: "\f25d"; }
.fa-legal:before { content: "\f25e"; }
.fa-lemon-o:before { content: "\f25f"; }
.fa-level-down:before { content: "\f260"; }
.fa-level-up:before { content: "\f261"; }
.fa-life-bouy:before { content: "\f262"; }
.fa-life-buoy:before { content: "\f263"; }
.fa-life-ring:before, .fa-support:before { content: "\f264"; }
.fa-life-saver:before { content: "\f265"; }
.fa-lightbulb-o:before { content: "\f266"; }
.fa-line-chart:before { content: "\f267"; }
.fa-link:before { content: "\f268"; }
.fa-linkedin:before { content: "\f269"; }
.fa-linkedin-square:before { content: "\f26a"; }
.fa-linux:before { content: "\f26b"; }
.fa-list:before { content: "\f26c"; }
.fa-list-alt:before { content: "\f26d"; }
.fa-list-ol:before { content: "\f26e"; }
.fa-list-ul:before { content: "\f26f"; }
.fa-location-arrow:before { content: "\f270"; }
.fa-lock:before { content: "\f271"; }
.fa-long-arrow-down:before { content: "\f272"; }
.fa-long-arrow-left:before { content: "\f273"; }
.fa-long-arrow-right:before { content: "\f274"; }
.fa-long-arrow-up:before { content: "\f275"; }
.fa-magic:before { content: "\f276"; }
.fa-magnet:before { content: "\f277"; }
.fa-mail-forward:before { content: "\f278"; }
.fa-mail-reply:before { content: "\f279"; }
.fa-mail-reply-all:before { content: "\f27a"; }
.fa-male:before { content: "\f27b"; }
.fa-map:before { content: "\f27c"; }
.fa-map-marker:before { content: "\f27d"; }
.fa-map-o:before { content: "\f27e"; }
.fa-map-pin:before { content: "\f27f"; }
.fa-map-signs:before { content: "\f280"; }
.fa-mars:before { content: "\f281"; }
.fa-mars-double:before { content: "\f282"; }
.fa-mars-stroke:before { content: "\f283"; }
.fa-mars-stroke-h:before { content: "\f284"; }
.fa-mars-stroke-v:before { content: "\f285"; }
.fa-maxcdn:before { content: "\f286"; }
.fa-meanpath:before { content: "\f287"; }
.fa-medium:before { content: "\f288"; }
.fa-medkit:before { content: "\f289"; }
.fa-meh-o:before { content: "\f28a"; }
.fa-mercury:before { content: "\f28b"; }
.fa-microphone:before { content: "\f28c"; }
.fa-microphone-slash:before { content: "\f28d"; }
.fa-minus:before { content: "\f28e"; }
.fa-minus-circle:before { content: "\f28f"; }
.fa-minus-square:before { content: "\f290"; }
.fa-minus-square-o:before { content: "\f291"; }
.fa-mobile:before { content: "\f292"; }
.fa-mobile-phone:before { content: "\f293"; }
.fa-money:before { content: "\f294"; }
.fa-moon-o:before { content: "\f295"; }
.fa-mortar-board:before { content: "\f296"; }
.fa-motorcycle:before { content: "\f297"; }
.fa-mouse-pointer:before { content: "\f298"; }
.fa-music:before { content: "\f299"; }
.fa-navicon:before { content: "\f29a"; }
.fa-neuter:before { content: "\f29b"; }
.fa-newspaper-o:before { content: "\f29c"; }
.fa-object-group:before { content: "\f29d"; }
.fa-object-ungroup:before { content: "\f29e"; }
.fa-odnoklassniki:before { content: "\f29f"; }
.fa-odnoklassniki-square:before { content: "\f2a0"; }
.fa-opencart:before { content: "\f2a1"; }
.fa-openid:before { content: "\f2a2"; }
.fa-opera:before { content: "\f2a3"; }
.fa-optin-monster:before { content: "\f2a4"; }
.fa-outdent:before { content: "\f2a5"; }
.fa-pagelines:before { content: "\f2a6"; }
.fa-paint-brush:before { content: "\f2a7"; }
.fa-paper-plane:before, .fa-send:before { content: "\f2a8"; }
.fa-paper-plane-o:before, .fa-send-o:before { content: "\f2a9"; }
.fa-paperclip:before { content: "\f2aa"; }
.fa-paragraph:before { content: "\f2ab"; }
.fa-paste:before { content: "\f2ac"; }
.fa-pause:before { content: "\f2ad"; }
.fa-paw:before { content: "\f2ae"; }
.fa-paypal:before { content: "\f2af"; }
.fa-pencil:before { content: "\f2b0"; }
.fa-pencil-square:before { content: "\f2b1"; }
.fa-pencil-square-o:before { content: "\f2b2"; }
.fa-phone:before { content: "\f2b3"; }
.fa-phone-square:before { content: "\f2b4"; }
.fa-photo:before { content: "\f2b5"; }
.fa-picture-o:before { content: "\f2b6"; }
.fa-pie-chart:before { content: "\f2b7"; }
.fa-pied-piper:before { content: "\f2b8"; }
.fa-pied-piper-alt:before { content: "\f2b9"; }
.fa-pinterest:before { content: "\f2ba"; }
.fa-pinterest-p:before { content: "\f2bb"; }
.fa-pinterest-square:before { content: "\f2bc"; }
.fa-plane:before { content: "\f2bd"; }
.fa-play:before { content: "\f2be"; }
.fa-play-circle:before { content: "\f2bf"; }
.fa-play-circle-o:before { content: "\f2c0"; }
.fa-plug:before { content: "\f2c1"; }
.fa-plus:before { content: "\f2c2"; }
.fa-plus-circle:before { content: "\f2c3"; }
.fa-plus-square:before { content: "\f2c4"; }
.fa-plus-square-o:before { content: "\f2c5"; }
.fa-power-off:before { content: "\f2c6"; }
.fa-print:before { content: "\f2c7"; }
.fa-puzzle-piece:before { content: "\f2c8"; }
.fa-qq:before { content: "\f2c9"; }
.fa-qrcode:before { content: "\f2ca"; }
.fa-question:before { content: "\f2cb"; }
.fa-question-circle:before { content: "\f2cc"; }
.fa-quote-left:before { content: "\f2cd"; }
.fa-quote-right:before { content: "\f2ce"; }
.fa-ra:before { content: "\f2cf"; }
.fa-random:before { content: "\f2d0"; }
.fa-rebel:before { content: "\f2d1"; }
.fa-recycle:before { content: "\f2d2"; }
.fa-reddit:before { content: "\f2d3"; }
.fa-reddit-square:before { content: "\f2d4"; }
.fa-refresh:before { content: "\f2d5"; }
.fa-registered:before { content: "\f2d6"; }
.fa-renren:before { content: "\f2d7"; }
.fa-reorder:before { content: "\f2d8"; }
.fa-repeat:before { content: "\f2d9"; }
.fa-reply:before { content: "\f2da"; }
.fa-reply-all:before { content: "\f2db"; }
.fa-retweet:before { content: "\f2dc"; }
.fa-rmb:before { content: "\f2dd"; }
.fa-road:before { content: "\f2de"; }
.fa-rocket:before { content: "\f2df"; }
.fa-rotate-left:before { content: "\f2e0"; }
.fa-rotate-right:before { content: "\f2e1"; }
.fa-rouble:before { content: "\f2e2"; }
.fa-rss:before, .fa-feed:before { content: "\f2e3"; }
.fa-rss-square:before { content: "\f2e4"; }
.fa-rub:before { content: "\f2e5"; }
.fa-ruble:before { content: "\f2e6"; }
.fa-rupee:before { content: "\f2e7"; }
.fa-safari:before { content: "\f2e8"; }
.fa-save:before { content: "\f2e9"; }
.fa-scissors:before { content: "\f2ea"; }
.fa-search:before { content: "\f2eb"; }
.fa-search-minus:before { content: "\f2ec"; }
.fa-search-plus:before { content: "\f2ed"; }
.fa-sellsy:before { content: "\f2ee"; }
.fa-server:before { content: "\f2ef"; }
.fa-share:before { content: "\f2f0"; }
.fa-share-alt:before { content: "\f2f1"; }
.fa-share-alt-square:before { content: "\f2f2"; }
.fa-share-square:before { content: "\f2f3"; }
.fa-share-square-o:before { content: "\f2f4"; }
.fa-shekel:before { content: "\f2f5"; }
.fa-sheqel:before { content: "\f2f6"; }
.fa-shield:before { content: "\f2f7"; }
.fa-ship:before { content: "\f2f8"; }
.fa-shirtsinbulk:before { content: "\f2f9"; }
.fa-shopping-cart:before { content: "\f2fa"; }
.fa-sign-in:before { content: "\f2fb"; }
.fa-sign-out:before { content: "\f2fc"; }
.fa-signal:before { content: "\f2fd"; }
.fa-simplybuilt:before { content: "\f2fe"; }
.fa-sitemap:before { content: "\f2ff"; }
.fa-skyatlas:before { content: "\f300"; }
.fa-skype:before { content: "\f301"; }
.fa-slack:before { content: "\f302"; }
.fa-sliders:before { content: "\f303"; }
.fa-slideshare:before { content: "\f304"; }
.fa-smile-o:before { content: "\f305"; }
.fa-sort:before, .fa-unsorted:before { content: "\f306"; }
.fa-sort-alpha-asc:before { content: "\f307"; }
.fa-sort-alpha-desc:before { content: "\f308"; }
.fa-sort-amount-asc:before { content: "\f309"; }
.fa-sort-amount-desc:before { content: "\f30a"; }
.fa-sort-asc:before, .fa-sort-up:before { content: "\f30b"; }
.fa-sort-desc:before, .fa-sort-down:before { content: "\f30c"; }
.fa-sort-numeric-asc:before { content: "\f30d"; }
.fa-sort-numeric-desc:before { content: "\f30e"; }
.fa-soundcloud:before { content: "\f30f"; }
.fa-space-shuttle:before { content: "\f310"; }
.fa-spinner:before { content: "\f311"; }
.fa-spoon:before { content: "\f312"; }
.fa-spotify:before { content: "\f313"; }
.fa-square:before { content: "\f314"; }
.fa-square-o:before { content: "\f315"; }
.fa-stack-exchange:before { content: "\f316"; }
.fa-stack-overflow:before { content: "\f317"; }
.fa-star:before { content: "\f318"; }
.fa-star-half:before { content: "\f319"; }
.fa-star-half-o:before, .fa-star-half-full:before, .fa-star-half-empty:before { content: "\f31a"; }
.fa-star-o:before { content: "\f31b"; }
.fa-steam:before { content: "\f31c"; }
.fa-steam-square:before { content: "\f31d"; }
.fa-step-backward:before { content: "\f31e"; }
.fa-step-forward:before { content: "\f31f"; }
.fa-stethoscope:before { content: "\f320"; }
.fa-sticky-note:before { content: "\f321"; }
.fa-sticky-note-o:before { content: "\f322"; }
.fa-stop:before { content: "\f323"; }
.fa-street-view:before { content: "\f324"; }
.fa-strikethrough:before { content: "\f325"; }
.fa-stumbleupon:before { content: "\f326"; }
.fa-stumbleupon-circle:before { content: "\f327"; }
.fa-subscript:before { content: "\f328"; }
.fa-subway:before { content: "\f329"; }
.fa-suitcase:before { content: "\f32a"; }
.fa-sun-o:before { content: "\f32b"; }
.fa-superscript:before { content: "\f32c"; }
.fa-table:before { content: "\f32d"; }
.fa-tablet:before { content: "\f32e"; }
.fa-tachometer:before { content: "\f32f"; }
.fa-tag:before { content: "\f330"; }
.fa-tags:before { content: "\f331"; }
.fa-tasks:before { content: "\f332"; }
.fa-taxi:before { content: "\f333"; }
.fa-television:before, .fa-tv:before { content: "\f334"; }
.fa-tencent-weibo:before { content: "\f335"; }
.fa-terminal:before { content: "\f336"; }
.fa-text-height:before { content: "\f337"; }
.fa-text-width:before { content: "\f338"; }
.fa-th:before { content: "\f339"; }
.fa-th-large:before { content: "\f33a"; }
.fa-th-list:before { content: "\f33b"; }
.fa-thumb-tack:before { content: "\f33c"; }
.fa-thumbs-down:before { content: "\f33d"; }
.fa-thumbs-o-down:before { content: "\f33e"; }
.fa-thumbs-o-up:before { content: "\f33f"; }
.fa-thumbs-up:before { content: "\f340"; }
.fa-ticket:before { content: "\f341"; }
.fa-times:before, .fa-remove:before { content: "\f342"; }
.fa-times-circle:before { content: "\f343"; }
.fa-times-circle-o:before { content: "\f344"; }
.fa-tint:before { content: "\f345"; }
.fa-toggle-off:before { content: "\f346"; }
.fa-toggle-on:before { content: "\f347"; }
.fa-trademark:before { content: "\f348"; }
.fa-train:before { content: "\f349"; }
.fa-transgender:before, .fa-intersex:before { content: "\f34a"; }
.fa-transgender-alt:before { content: "\f34b"; }
.fa-trash:before { content: "\f34c"; }
.fa-trash-o:before { content: "\f34d"; }
.fa-tree:before { content: "\f34e"; }
.fa-trello:before { content: "\f34f"; }
.fa-tripadvisor:before { content: "\f350"; }
.fa-trophy:before { content: "\f351"; }
.fa-truck:before { content: "\f352"; }
.fa-try:before { content: "\f353"; }
.fa-tty:before { content: "\f354"; }
.fa-tumblr:before { content: "\f355"; }
.fa-tumblr-square:before { content: "\f356"; }
.fa-turkish-lira:before { content: "\f357"; }
.fa-twitch:before { content: "\f358"; }
.fa-twitter:before { content: "\f359"; }
.fa-twitter-square:before { content: "\f35a"; }
.fa-umbrella:before { content: "\f35b"; }
.fa-underline:before { content: "\f35c"; }
.fa-undo:before { content: "\f35d"; }
.fa-university:before { content: "\f35e"; }
.fa-unlink:before { content: "\f35f"; }
.fa-unlock:before { content: "\f360"; }
.fa-unlock-alt:before { content: "\f361"; }
.fa-upload:before { content: "\f362"; }
.fa-usd:before { content: "\f363"; }
.fa-user:before { content: "\f364"; }
.fa-user-md:before { content: "\f365"; }
.fa-user-plus:before { content: "\f366"; }
.fa-user-secret:before { content: "\f367"; }
.fa-user-times:before { content: "\f368"; }
.fa-users:before { content: "\f369"; }
.fa-venus:before { content: "\f36a"; }
.fa-venus-double:before { content: "\f36b"; }
.fa-venus-mars:before { content: "\f36c"; }
.fa-viacoin:before { content: "\f36d"; }
.fa-video-camera:before { content: "\f36e"; }
.fa-vimeo:before { content: "\f36f"; }
.fa-vimeo-square:before { content: "\f370"; }
.fa-vine:before { content: "\f371"; }
.fa-vk:before { content: "\f372"; }
.fa-volume-down:before { content: "\f373"; }
.fa-volume-off:before { content: "\f374"; }
.fa-volume-up:before { content: "\f375"; }
.fa-warning:before { content: "\f376"; }
.fa-wechat:before { content: "\f377"; }
.fa-weibo:before { content: "\f378"; }
.fa-weixin:before { content: "\f379"; }
.fa-whatsapp:before { content: "\f37a"; }
.fa-wheelchair:before { content: "\f37b"; }
.fa-wifi:before { content: "\f37c"; }
.fa-wikipedia-w:before { content: "\f37d"; }
.fa-windows:before { content: "\f37e"; }
.fa-won:before { content: "\f37f"; }
.fa-wordpress:before { content: "\f380"; }
.fa-wrench:before { content: "\f381"; }
.fa-xing:before { content: "\f382"; }
.fa-xing-square:before { content: "\f383"; }
.fa-y-combinator:before { content: "\f384"; }
.fa-y-combinator-square:before { content: "\f385"; }
.fa-yahoo:before { content: "\f386"; }
.fa-yc:before { content: "\f387"; }
.fa-yc-square:before { content: "\f388"; }
.fa-yelp:before { content: "\f389"; }
.fa-yen:before { content: "\f38a"; }
.fa-youtube:before { content: "\f38b"; }
.fa-youtube-play:before { content: "\f38c"; }
.fa-youtube-square:before { content: "\f38d"; }

File diff suppressed because one or more lines are too long

View File

@@ -1,845 +0,0 @@
/*!
* Line Awesome 1.1.0 by @icons_8 - https://icons8.com/line-awesome
* License - https://icons8.com/good-boy-license/ (Font: SIL OFL 1.1, CSS: MIT License)
*
* Made with love by Icons8 [ https://icons8.com/ ] using FontCustom [ https://github.com/FontCustom/fontcustom ]
*
* Contacts:
* [ https://icons8.com/contact ]
*
* Follow Icon8 on
* Twitter [ https://twitter.com/icons_8 ]
* Facebook [ https://www.facebook.com/Icons8 ]
* Google+ [ https://plus.google.com/+Icons8 ]
* GitHub [ https://github.com/icons8 ]
*/
@font-face {
font-family: "LineAwesome";
src: url("../fonts/line-awesome.eot?v=1.1.");
src: url("../fonts/line-awesome.eot??v=1.1.#iefix") format("embedded-opentype"),
url("../fonts/line-awesome.woff2?v=1.1.") format("woff2"),
url("../fonts/line-awesome.woff?v=1.1.") format("woff"),
url("../fonts/line-awesome.ttf?v=1.1.") format("truetype"),
url("../fonts/line-awesome.svg?v=1.1.#fa") format("svg");
font-weight: normal;
font-style: normal;
}
@media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face {
font-family: "LineAwesome";
src: url("../fonts/line-awesome.svg?v=1.1.#fa") format("svg");
}
}
/* Thanks to http://fontawesome.io @fontawesome and @davegandy */
.la {
display: inline-block;
font: normal normal normal 16px/1 "LineAwesome";
font-size: inherit;
text-decoration: inherit;
text-rendering: optimizeLegibility;
text-transform: none;
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
font-smoothing: antialiased;
}
/* makes the font 33% larger relative to the icon container */
.la-lg {
font-size: 1.33333333em;
line-height: 0.75em;
vertical-align: -15%;
}
.la-2x {
font-size: 2em;
}
.la-3x {
font-size: 3em;
}
.la-4x {
font-size: 4em;
}
.la-5x {
font-size: 5em;
}
.la-fw {
width: 1.28571429em;
text-align: center;
}
.la-ul {
padding-left: 0;
margin-left: 2.14285714em;
list-style-type: none;
}
.la-ul > li {
position: relative;
}
.la-li {
position: absolute;
left: -2.14285714em;
width: 2.14285714em;
top: 0.14285714em;
text-align: center;
}
.la-li.la-lg {
left: -1.85714286em;
}
.la-border {
padding: .2em .25em .15em;
border: solid 0.08em #eeeeee;
border-radius: .1em;
}
.pull-right {
float: right;
}
.pull-left {
float: left;
}
.li.pull-left {
margin-right: .3em;
}
.li.pull-right {
margin-left: .3em;
}
.la-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);
}
}
.la-rotate-90 {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
-webkit-transform: rotate(90deg);
-ms-transform: rotate(90deg);
transform: rotate(90deg);
}
.la-rotate-180 {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
-webkit-transform: rotate(180deg);
-ms-transform: rotate(180deg);
transform: rotate(180deg);
}
.la-rotate-270 {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
-webkit-transform: rotate(270deg);
-ms-transform: rotate(270deg);
transform: rotate(270deg);
}
.la-flip-horizontal {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
-webkit-transform: scale(-1, 1);
-ms-transform: scale(-1, 1);
transform: scale(-1, 1);
}
.la-flip-vertical {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);
-webkit-transform: scale(1, -1);
-ms-transform: scale(1, -1);
transform: scale(1, -1);
}
:root .la-rotate-90,
:root .la-rotate-180,
:root .la-rotate-270,
:root .la-flip-horizontal,
:root .la-flip-vertical {
filter: none;
}
.la-stack {
position: relative;
display: inline-block;
width: 2em;
height: 2em;
line-height: 2em;
vertical-align: middle;
}
.la-stack-1x,
.la-stack-2x {
position: absolute;
left: 0;
width: 100%;
text-align: center;
}
.la-stack-1x {
line-height: inherit;
}
.la-stack-2x {
font-size: 2em;
}
.la-inverse {
color: #ffffff;
}
/* Thanks to http://fontawesome.io @fontawesome and @davegandy */
.la-500px:before { content: "\f100"; }
.la-adjust:before { content: "\f101"; }
.la-adn:before { content: "\f102"; }
.la-align-center:before { content: "\f103"; }
.la-align-justify:before { content: "\f104"; }
.la-align-left:before { content: "\f105"; }
.la-align-right:before { content: "\f106"; }
.la-amazon:before { content: "\f107"; }
.la-ambulance:before { content: "\f108"; }
.la-anchor:before { content: "\f109"; }
.la-android:before { content: "\f10a"; }
.la-angellist:before { content: "\f10b"; }
.la-angle-double-down:before { content: "\f10c"; }
.la-angle-double-left:before { content: "\f10d"; }
.la-angle-double-right:before { content: "\f10e"; }
.la-angle-double-up:before { content: "\f10f"; }
.la-angle-down:before { content: "\f110"; }
.la-angle-left:before { content: "\f111"; }
.la-angle-right:before { content: "\f112"; }
.la-angle-up:before { content: "\f113"; }
.la-apple:before { content: "\f114"; }
.la-archive:before { content: "\f115"; }
.la-area-chart:before { content: "\f116"; }
.la-arrow-circle-down:before { content: "\f117"; }
.la-arrow-circle-left:before { content: "\f118"; }
.la-arrow-circle-o-down:before { content: "\f119"; }
.la-arrow-circle-o-left:before { content: "\f11a"; }
.la-arrow-circle-o-right:before { content: "\f11b"; }
.la-arrow-circle-o-up:before { content: "\f11c"; }
.la-arrow-circle-right:before { content: "\f11d"; }
.la-arrow-circle-up:before { content: "\f11e"; }
.la-arrow-down:before { content: "\f11f"; }
.la-arrow-left:before { content: "\f120"; }
.la-arrow-right:before { content: "\f121"; }
.la-arrow-up:before { content: "\f122"; }
.la-arrows:before { content: "\f123"; }
.la-arrows-alt:before { content: "\f124"; }
.la-arrows-h:before { content: "\f125"; }
.la-arrows-v:before { content: "\f126"; }
.la-asterisk:before { content: "\f127"; }
.la-at:before { content: "\f128"; }
.la-automobile:before { content: "\f129"; }
.la-backward:before { content: "\f12a"; }
.la-balance-scale:before { content: "\f12b"; }
.la-ban:before { content: "\f12c"; }
.la-bank:before { content: "\f12d"; }
.la-bar-chart:before { content: "\f12e"; }
.la-bar-chart-o:before { content: "\f12f"; }
.la-barcode:before { content: "\f130"; }
.la-bars:before { content: "\f131"; }
.la-battery-0:before { content: "\f132"; }
.la-battery-1:before { content: "\f133"; }
.la-battery-2:before { content: "\f134"; }
.la-battery-3:before { content: "\f135"; }
.la-battery-4:before { content: "\f136"; }
.la-battery-empty:before { content: "\f137"; }
.la-battery-full:before { content: "\f138"; }
.la-battery-half:before { content: "\f139"; }
.la-battery-quarter:before { content: "\f13a"; }
.la-battery-three-quarters:before { content: "\f13b"; }
.la-bed:before { content: "\f13c"; }
.la-beer:before { content: "\f13d"; }
.la-behance:before { content: "\f13e"; }
.la-behance-square:before { content: "\f13f"; }
.la-bell:before { content: "\f140"; }
.la-bell-o:before { content: "\f141"; }
.la-bell-slash:before { content: "\f142"; }
.la-bell-slash-o:before { content: "\f143"; }
.la-bicycle:before { content: "\f144"; }
.la-binoculars:before { content: "\f145"; }
.la-birthday-cake:before { content: "\f146"; }
.la-bitbucket:before { content: "\f147"; }
.la-bitbucket-square:before { content: "\f148"; }
.la-bitcoin:before { content: "\f149"; }
.la-black-tie:before { content: "\f14a"; }
.la-bold:before { content: "\f14b"; }
.la-bolt:before { content: "\f14c"; }
.la-bomb:before { content: "\f14d"; }
.la-book:before { content: "\f14e"; }
.la-bookmark:before { content: "\f14f"; }
.la-bookmark-o:before { content: "\f150"; }
.la-briefcase:before { content: "\f151"; }
.la-btc:before { content: "\f152"; }
.la-bug:before { content: "\f153"; }
.la-building:before { content: "\f154"; }
.la-building-o:before { content: "\f155"; }
.la-bullhorn:before { content: "\f156"; }
.la-bullseye:before { content: "\f157"; }
.la-bus:before { content: "\f158"; }
.la-buysellads:before { content: "\f159"; }
.la-cab:before { content: "\f15a"; }
.la-calculator:before { content: "\f15b"; }
.la-calendar:before { content: "\f15c"; }
.la-calendar-check-o:before { content: "\f15d"; }
.la-calendar-minus-o:before { content: "\f15e"; }
.la-calendar-o:before { content: "\f15f"; }
.la-calendar-plus-o:before { content: "\f160"; }
.la-calendar-times-o:before { content: "\f161"; }
.la-camera:before { content: "\f162"; }
.la-camera-retro:before { content: "\f163"; }
.la-car:before { content: "\f164"; }
.la-caret-down:before { content: "\f165"; }
.la-caret-left:before { content: "\f166"; }
.la-caret-right:before { content: "\f167"; }
.la-caret-square-o-down:before, .la-toggle-down:before { content: "\f168"; }
.la-caret-square-o-left:before, .la-toggle-left:before { content: "\f169"; }
.la-caret-square-o-right:before, .la-toggle-right:before { content: "\f16a"; }
.la-caret-square-o-up:before, .la-toggle-up:before { content: "\f16b"; }
.la-caret-up:before { content: "\f16c"; }
.la-cart-arrow-down:before { content: "\f16d"; }
.la-cart-plus:before { content: "\f16e"; }
.la-cc:before { content: "\f16f"; }
.la-cc-amex:before { content: "\f170"; }
.la-cc-diners-club:before { content: "\f171"; }
.la-cc-discover:before { content: "\f172"; }
.la-cc-jcb:before { content: "\f173"; }
.la-cc-mastercard:before { content: "\f174"; }
.la-cc-paypal:before { content: "\f175"; }
.la-cc-stripe:before { content: "\f176"; }
.la-cc-visa:before { content: "\f177"; }
.la-certificate:before { content: "\f178"; }
.la-chain:before { content: "\f179"; }
.la-chain-broken:before { content: "\f17a"; }
.la-check:before { content: "\f17b"; }
.la-check-circle:before { content: "\f17c"; }
.la-check-circle-o:before { content: "\f17d"; }
.la-check-square:before { content: "\f17e"; }
.la-check-square-o:before { content: "\f17f"; }
.la-chevron-circle-down:before { content: "\f180"; }
.la-chevron-circle-left:before { content: "\f181"; }
.la-chevron-circle-right:before { content: "\f182"; }
.la-chevron-circle-up:before { content: "\f183"; }
.la-chevron-down:before { content: "\f184"; }
.la-chevron-left:before { content: "\f185"; }
.la-chevron-right:before { content: "\f186"; }
.la-chevron-up:before { content: "\f187"; }
.la-child:before { content: "\f188"; }
.la-chrome:before { content: "\f189"; }
.la-circle:before { content: "\f18a"; }
.la-circle-o:before { content: "\f18b"; }
.la-circle-o-notch:before { content: "\f18c"; }
.la-circle-thin:before { content: "\f18d"; }
.la-clipboard:before { content: "\f18e"; }
.la-clock-o:before { content: "\f18f"; }
.la-clone:before { content: "\f190"; }
.la-close:before { content: "\f191"; }
.la-cloud:before { content: "\f192"; }
.la-cloud-download:before { content: "\f193"; }
.la-cloud-upload:before { content: "\f194"; }
.la-cny:before { content: "\f195"; }
.la-code:before { content: "\f196"; }
.la-code-fork:before { content: "\f197"; }
.la-codepen:before { content: "\f198"; }
.la-coffee:before { content: "\f199"; }
.la-cog:before { content: "\f19a"; }
.la-cogs:before { content: "\f19b"; }
.la-columns:before { content: "\f19c"; }
.la-comment:before { content: "\f19d"; }
.la-comment-o:before { content: "\f19e"; }
.la-commenting:before { content: "\f19f"; }
.la-commenting-o:before { content: "\f1a0"; }
.la-comments:before { content: "\f1a1"; }
.la-comments-o:before { content: "\f1a2"; }
.la-compass:before { content: "\f1a3"; }
.la-compress:before { content: "\f1a4"; }
.la-connectdevelop:before { content: "\f1a5"; }
.la-contao:before { content: "\f1a6"; }
.la-copy:before { content: "\f1a7"; }
.la-copyright:before { content: "\f1a8"; }
.la-creative-commons:before { content: "\f1a9"; }
.la-credit-card:before { content: "\f1aa"; }
.la-crop:before { content: "\f1ab"; }
.la-crosshairs:before { content: "\f1ac"; }
.la-css3:before { content: "\f1ad"; }
.la-cube:before { content: "\f1ae"; }
.la-cubes:before { content: "\f1af"; }
.la-cut:before { content: "\f1b0"; }
.la-cutlery:before { content: "\f1b1"; }
.la-dashboard:before { content: "\f1b2"; }
.la-dashcube:before { content: "\f1b3"; }
.la-database:before { content: "\f1b4"; }
.la-dedent:before { content: "\f1b5"; }
.la-delicious:before { content: "\f1b6"; }
.la-desktop:before { content: "\f1b7"; }
.la-deviantart:before { content: "\f1b8"; }
.la-diamond:before { content: "\f1b9"; }
.la-digg:before { content: "\f1ba"; }
.la-dollar:before { content: "\f1bb"; }
.la-dot-circle-o:before { content: "\f1bc"; }
.la-download:before { content: "\f1bd"; }
.la-dribbble:before { content: "\f1be"; }
.la-dropbox:before { content: "\f1bf"; }
.la-drupal:before { content: "\f1c0"; }
.la-edit:before { content: "\f1c1"; }
.la-eject:before { content: "\f1c2"; }
.la-ellipsis-h:before { content: "\f1c3"; }
.la-ellipsis-v:before { content: "\f1c4"; }
.la-empire:before, .la-ge:before { content: "\f1c5"; }
.la-envelope:before { content: "\f1c6"; }
.la-envelope-o:before { content: "\f1c7"; }
.la-envelope-square:before { content: "\f1c8"; }
.la-eraser:before { content: "\f1c9"; }
.la-eur:before { content: "\f1ca"; }
.la-euro:before { content: "\f1cb"; }
.la-exchange:before { content: "\f1cc"; }
.la-exclamation:before { content: "\f1cd"; }
.la-exclamation-circle:before { content: "\f1ce"; }
.la-exclamation-triangle:before { content: "\f1cf"; }
.la-expand:before { content: "\f1d0"; }
.la-expeditedssl:before { content: "\f1d1"; }
.la-external-link:before { content: "\f1d2"; }
.la-external-link-square:before { content: "\f1d3"; }
.la-eye:before { content: "\f1d4"; }
.la-eye-slash:before { content: "\f1d5"; }
.la-eyedropper:before { content: "\f1d6"; }
.la-facebook:before, .la-facebook-f:before { content: "\f1d7"; }
.la-facebook-official:before { content: "\f1d8"; }
.la-facebook-square:before { content: "\f1d9"; }
.la-fast-backward:before { content: "\f1da"; }
.la-fast-forward:before { content: "\f1db"; }
.la-fax:before { content: "\f1dc"; }
.la-female:before { content: "\f1dd"; }
.la-fighter-jet:before { content: "\f1de"; }
.la-file:before { content: "\f1df"; }
.la-file-archive-o:before { content: "\f1e0"; }
.la-file-audio-o:before { content: "\f1e1"; }
.la-file-code-o:before { content: "\f1e2"; }
.la-file-excel-o:before { content: "\f1e3"; }
.la-file-image-o:before { content: "\f1e4"; }
.la-file-movie-o:before { content: "\f1e5"; }
.la-file-o:before { content: "\f1e6"; }
.la-file-pdf-o:before { content: "\f1e7"; }
.la-file-photo-o:before { content: "\f1e8"; }
.la-file-picture-o:before { content: "\f1e9"; }
.la-file-powerpoint-o:before { content: "\f1ea"; }
.la-file-sound-o:before { content: "\f1eb"; }
.la-file-text:before { content: "\f1ec"; }
.la-file-text-o:before { content: "\f1ed"; }
.la-file-video-o:before { content: "\f1ee"; }
.la-file-word-o:before { content: "\f1ef"; }
.la-file-zip-o:before { content: "\f1f0"; }
.la-files-o:before { content: "\f1f1"; }
.la-film:before { content: "\f1f2"; }
.la-filter:before { content: "\f1f3"; }
.la-fire:before { content: "\f1f4"; }
.la-fire-extinguisher:before { content: "\f1f5"; }
.la-firefox:before { content: "\f1f6"; }
.la-flag:before { content: "\f1f7"; }
.la-flag-checkered:before { content: "\f1f8"; }
.la-flag-o:before { content: "\f1f9"; }
.la-flash:before { content: "\f1fa"; }
.la-flask:before { content: "\f1fb"; }
.la-flickr:before { content: "\f1fc"; }
.la-floppy-o:before { content: "\f1fd"; }
.la-folder:before { content: "\f1fe"; }
.la-folder-o:before { content: "\f1ff"; }
.la-folder-open:before { content: "\f200"; }
.la-folder-open-o:before { content: "\f201"; }
.la-font:before { content: "\f202"; }
.la-fonticons:before { content: "\f203"; }
.la-forumbee:before { content: "\f204"; }
.la-forward:before { content: "\f205"; }
.la-foursquare:before { content: "\f206"; }
.la-frown-o:before { content: "\f207"; }
.la-futbol-o:before, .la-soccer-ball-o:before { content: "\f208"; }
.la-gamepad:before { content: "\f209"; }
.la-gavel:before { content: "\f20a"; }
.la-gbp:before { content: "\f20b"; }
.la-gear:before { content: "\f20c"; }
.la-gears:before { content: "\f20d"; }
.la-genderless:before { content: "\f20e"; }
.la-get-pocket:before { content: "\f20f"; }
.la-gg:before { content: "\f210"; }
.la-gg-circle:before { content: "\f211"; }
.la-gift:before { content: "\f212"; }
.la-git:before { content: "\f213"; }
.la-git-square:before { content: "\f214"; }
.la-github:before { content: "\f215"; }
.la-github-alt:before { content: "\f216"; }
.la-github-square:before { content: "\f217"; }
.la-glass:before { content: "\f218"; }
.la-globe:before { content: "\f219"; }
.la-google:before { content: "\f21a"; }
.la-google-plus:before { content: "\f21b"; }
.la-google-plus-square:before { content: "\f21c"; }
.la-google-wallet:before { content: "\f21d"; }
.la-graduation-cap:before { content: "\f21e"; }
.la-gratipay:before, .la-gittip:before { content: "\f21f"; }
.la-group:before { content: "\f220"; }
.la-h-square:before { content: "\f221"; }
.la-hacker-news:before { content: "\f222"; }
.la-hand-grab-o:before { content: "\f223"; }
.la-hand-lizard-o:before { content: "\f224"; }
.la-hand-o-down:before { content: "\f225"; }
.la-hand-o-left:before { content: "\f226"; }
.la-hand-o-right:before { content: "\f227"; }
.la-hand-o-up:before { content: "\f228"; }
.la-hand-paper-o:before { content: "\f229"; }
.la-hand-peace-o:before { content: "\f22a"; }
.la-hand-pointer-o:before { content: "\f22b"; }
.la-hand-rock-o:before { content: "\f22c"; }
.la-hand-scissors-o:before { content: "\f22d"; }
.la-hand-spock-o:before { content: "\f22e"; }
.la-hand-stop-o:before { content: "\f22f"; }
.la-hdd-o:before { content: "\f230"; }
.la-header:before { content: "\f231"; }
.la-headphones:before { content: "\f232"; }
.la-heart:before { content: "\f233"; }
.la-heart-o:before { content: "\f234"; }
.la-heartbeat:before { content: "\f235"; }
.la-history:before { content: "\f236"; }
.la-home:before { content: "\f237"; }
.la-hospital-o:before { content: "\f238"; }
.la-hotel:before { content: "\f239"; }
.la-hourglass:before { content: "\f23a"; }
.la-hourglass-1:before { content: "\f23b"; }
.la-hourglass-2:before { content: "\f23c"; }
.la-hourglass-3:before { content: "\f23d"; }
.la-hourglass-end:before { content: "\f23e"; }
.la-hourglass-half:before { content: "\f23f"; }
.la-hourglass-o:before { content: "\f240"; }
.la-hourglass-start:before { content: "\f241"; }
.la-houzz:before { content: "\f242"; }
.la-html5:before { content: "\f243"; }
.la-i-cursor:before { content: "\f244"; }
.la-ils:before { content: "\f245"; }
.la-image:before { content: "\f246"; }
.la-inbox:before { content: "\f247"; }
.la-indent:before { content: "\f248"; }
.la-industry:before { content: "\f249"; }
.la-info:before { content: "\f24a"; }
.la-info-circle:before { content: "\f24b"; }
.la-inr:before { content: "\f24c"; }
.la-instagram:before { content: "\f24d"; }
.la-institution:before { content: "\f24e"; }
.la-internet-explorer:before { content: "\f24f"; }
.la-ioxhost:before { content: "\f250"; }
.la-italic:before { content: "\f251"; }
.la-joomla:before { content: "\f252"; }
.la-jpy:before { content: "\f253"; }
.la-jsfiddle:before { content: "\f254"; }
.la-key:before { content: "\f255"; }
.la-keyboard-o:before { content: "\f256"; }
.la-krw:before { content: "\f257"; }
.la-language:before { content: "\f258"; }
.la-laptop:before { content: "\f259"; }
.la-lastfm:before { content: "\f25a"; }
.la-lastfm-square:before { content: "\f25b"; }
.la-leaf:before { content: "\f25c"; }
.la-leanpub:before { content: "\f25d"; }
.la-legal:before { content: "\f25e"; }
.la-lemon-o:before { content: "\f25f"; }
.la-level-down:before { content: "\f260"; }
.la-level-up:before { content: "\f261"; }
.la-life-bouy:before { content: "\f262"; }
.la-life-buoy:before { content: "\f263"; }
.la-life-ring:before, .la-support:before { content: "\f264"; }
.la-life-saver:before { content: "\f265"; }
.la-lightbulb-o:before { content: "\f266"; }
.la-line-chart:before { content: "\f267"; }
.la-link:before { content: "\f268"; }
.la-linkedin:before { content: "\f269"; }
.la-linkedin-square:before { content: "\f26a"; }
.la-linux:before { content: "\f26b"; }
.la-list:before { content: "\f26c"; }
.la-list-alt:before { content: "\f26d"; }
.la-list-ol:before { content: "\f26e"; }
.la-list-ul:before { content: "\f26f"; }
.la-location-arrow:before { content: "\f270"; }
.la-lock:before { content: "\f271"; }
.la-long-arrow-down:before { content: "\f272"; }
.la-long-arrow-left:before { content: "\f273"; }
.la-long-arrow-right:before { content: "\f274"; }
.la-long-arrow-up:before { content: "\f275"; }
.la-magic:before { content: "\f276"; }
.la-magnet:before { content: "\f277"; }
.la-mail-forward:before { content: "\f278"; }
.la-mail-reply:before { content: "\f279"; }
.la-mail-reply-all:before { content: "\f27a"; }
.la-male:before { content: "\f27b"; }
.la-map:before { content: "\f27c"; }
.la-map-marker:before { content: "\f27d"; }
.la-map-o:before { content: "\f27e"; }
.la-map-pin:before { content: "\f27f"; }
.la-map-signs:before { content: "\f280"; }
.la-mars:before { content: "\f281"; }
.la-mars-double:before { content: "\f282"; }
.la-mars-stroke:before { content: "\f283"; }
.la-mars-stroke-h:before { content: "\f284"; }
.la-mars-stroke-v:before { content: "\f285"; }
.la-maxcdn:before { content: "\f286"; }
.la-meanpath:before { content: "\f287"; }
.la-medium:before { content: "\f288"; }
.la-medkit:before { content: "\f289"; }
.la-meh-o:before { content: "\f28a"; }
.la-mercury:before { content: "\f28b"; }
.la-microphone:before { content: "\f28c"; }
.la-microphone-slash:before { content: "\f28d"; }
.la-minus:before { content: "\f28e"; }
.la-minus-circle:before { content: "\f28f"; }
.la-minus-square:before { content: "\f290"; }
.la-minus-square-o:before { content: "\f291"; }
.la-mobile:before { content: "\f292"; }
.la-mobile-phone:before { content: "\f293"; }
.la-money:before { content: "\f294"; }
.la-moon-o:before { content: "\f295"; }
.la-mortar-board:before { content: "\f296"; }
.la-motorcycle:before { content: "\f297"; }
.la-mouse-pointer:before { content: "\f298"; }
.la-music:before { content: "\f299"; }
.la-navicon:before { content: "\f29a"; }
.la-neuter:before { content: "\f29b"; }
.la-newspaper-o:before { content: "\f29c"; }
.la-object-group:before { content: "\f29d"; }
.la-object-ungroup:before { content: "\f29e"; }
.la-odnoklassniki:before { content: "\f29f"; }
.la-odnoklassniki-square:before { content: "\f2a0"; }
.la-opencart:before { content: "\f2a1"; }
.la-openid:before { content: "\f2a2"; }
.la-opera:before { content: "\f2a3"; }
.la-optin-monster:before { content: "\f2a4"; }
.la-outdent:before { content: "\f2a5"; }
.la-pagelines:before { content: "\f2a6"; }
.la-paint-brush:before { content: "\f2a7"; }
.la-paper-plane:before, .la-send:before { content: "\f2a8"; }
.la-paper-plane-o:before, .la-send-o:before { content: "\f2a9"; }
.la-paperclip:before { content: "\f2aa"; }
.la-paragraph:before { content: "\f2ab"; }
.la-paste:before { content: "\f2ac"; }
.la-pause:before { content: "\f2ad"; }
.la-paw:before { content: "\f2ae"; }
.la-paypal:before { content: "\f2af"; }
.la-pencil:before { content: "\f2b0"; }
.la-pencil-square:before { content: "\f2b1"; }
.la-pencil-square-o:before { content: "\f2b2"; }
.la-phone:before { content: "\f2b3"; }
.la-phone-square:before { content: "\f2b4"; }
.la-photo:before { content: "\f2b5"; }
.la-picture-o:before { content: "\f2b6"; }
.la-pie-chart:before { content: "\f2b7"; }
.la-pied-piper:before { content: "\f2b8"; }
.la-pied-piper-alt:before { content: "\f2b9"; }
.la-pinterest:before { content: "\f2ba"; }
.la-pinterest-p:before { content: "\f2bb"; }
.la-pinterest-square:before { content: "\f2bc"; }
.la-plane:before { content: "\f2bd"; }
.la-play:before { content: "\f2be"; }
.la-play-circle:before { content: "\f2bf"; }
.la-play-circle-o:before { content: "\f2c0"; }
.la-plug:before { content: "\f2c1"; }
.la-plus:before { content: "\f2c2"; }
.la-plus-circle:before { content: "\f2c3"; }
.la-plus-square:before { content: "\f2c4"; }
.la-plus-square-o:before { content: "\f2c5"; }
.la-power-off:before { content: "\f2c6"; }
.la-print:before { content: "\f2c7"; }
.la-puzzle-piece:before { content: "\f2c8"; }
.la-qq:before { content: "\f2c9"; }
.la-qrcode:before { content: "\f2ca"; }
.la-question:before { content: "\f2cb"; }
.la-question-circle:before { content: "\f2cc"; }
.la-quote-left:before { content: "\f2cd"; }
.la-quote-right:before { content: "\f2ce"; }
.la-ra:before { content: "\f2cf"; }
.la-random:before { content: "\f2d0"; }
.la-rebel:before { content: "\f2d1"; }
.la-recycle:before { content: "\f2d2"; }
.la-reddit:before { content: "\f2d3"; }
.la-reddit-square:before { content: "\f2d4"; }
.la-refresh:before { content: "\f2d5"; }
.la-registered:before { content: "\f2d6"; }
.la-renren:before { content: "\f2d7"; }
.la-reorder:before { content: "\f2d8"; }
.la-repeat:before { content: "\f2d9"; }
.la-reply:before { content: "\f2da"; }
.la-reply-all:before { content: "\f2db"; }
.la-retweet:before { content: "\f2dc"; }
.la-rmb:before { content: "\f2dd"; }
.la-road:before { content: "\f2de"; }
.la-rocket:before { content: "\f2df"; }
.la-rotate-left:before { content: "\f2e0"; }
.la-rotate-right:before { content: "\f2e1"; }
.la-rouble:before { content: "\f2e2"; }
.la-rss:before, .la-feed:before { content: "\f2e3"; }
.la-rss-square:before { content: "\f2e4"; }
.la-rub:before { content: "\f2e5"; }
.la-ruble:before { content: "\f2e6"; }
.la-rupee:before { content: "\f2e7"; }
.la-safari:before { content: "\f2e8"; }
.la-save:before { content: "\f2e9"; }
.la-scissors:before { content: "\f2ea"; }
.la-search:before { content: "\f2eb"; }
.la-search-minus:before { content: "\f2ec"; }
.la-search-plus:before { content: "\f2ed"; }
.la-sellsy:before { content: "\f2ee"; }
.la-server:before { content: "\f2ef"; }
.la-share:before { content: "\f2f0"; }
.la-share-alt:before { content: "\f2f1"; }
.la-share-alt-square:before { content: "\f2f2"; }
.la-share-square:before { content: "\f2f3"; }
.la-share-square-o:before { content: "\f2f4"; }
.la-shekel:before { content: "\f2f5"; }
.la-sheqel:before { content: "\f2f6"; }
.la-shield:before { content: "\f2f7"; }
.la-ship:before { content: "\f2f8"; }
.la-shirtsinbulk:before { content: "\f2f9"; }
.la-shopping-cart:before { content: "\f2fa"; }
.la-sign-in:before { content: "\f2fb"; }
.la-sign-out:before { content: "\f2fc"; }
.la-signal:before { content: "\f2fd"; }
.la-simplybuilt:before { content: "\f2fe"; }
.la-sitemap:before { content: "\f2ff"; }
.la-skyatlas:before { content: "\f300"; }
.la-skype:before { content: "\f301"; }
.la-slack:before { content: "\f302"; }
.la-sliders:before { content: "\f303"; }
.la-slideshare:before { content: "\f304"; }
.la-smile-o:before { content: "\f305"; }
.la-sort:before, .la-unsorted:before { content: "\f306"; }
.la-sort-alpha-asc:before { content: "\f307"; }
.la-sort-alpha-desc:before { content: "\f308"; }
.la-sort-amount-asc:before { content: "\f309"; }
.la-sort-amount-desc:before { content: "\f30a"; }
.la-sort-asc:before, .la-sort-up:before { content: "\f30b"; }
.la-sort-desc:before, .la-sort-down:before { content: "\f30c"; }
.la-sort-numeric-asc:before { content: "\f30d"; }
.la-sort-numeric-desc:before { content: "\f30e"; }
.la-soundcloud:before { content: "\f30f"; }
.la-space-shuttle:before { content: "\f310"; }
.la-spinner:before { content: "\f311"; }
.la-spoon:before { content: "\f312"; }
.la-spotify:before { content: "\f313"; }
.la-square:before { content: "\f314"; }
.la-square-o:before { content: "\f315"; }
.la-stack-exchange:before { content: "\f316"; }
.la-stack-overflow:before { content: "\f317"; }
.la-star:before { content: "\f318"; }
.la-star-half:before { content: "\f319"; }
.la-star-half-o:before, .la-star-half-full:before, .la-star-half-empty:before { content: "\f31a"; }
.la-star-o:before { content: "\f31b"; }
.la-steam:before { content: "\f31c"; }
.la-steam-square:before { content: "\f31d"; }
.la-step-backward:before { content: "\f31e"; }
.la-step-forward:before { content: "\f31f"; }
.la-stethoscope:before { content: "\f320"; }
.la-sticky-note:before { content: "\f321"; }
.la-sticky-note-o:before { content: "\f322"; }
.la-stop:before { content: "\f323"; }
.la-street-view:before { content: "\f324"; }
.la-strikethrough:before { content: "\f325"; }
.la-stumbleupon:before { content: "\f326"; }
.la-stumbleupon-circle:before { content: "\f327"; }
.la-subscript:before { content: "\f328"; }
.la-subway:before { content: "\f329"; }
.la-suitcase:before { content: "\f32a"; }
.la-sun-o:before { content: "\f32b"; }
.la-superscript:before { content: "\f32c"; }
.la-table:before { content: "\f32d"; }
.la-tablet:before { content: "\f32e"; }
.la-tachometer:before { content: "\f32f"; }
.la-tag:before { content: "\f330"; }
.la-tags:before { content: "\f331"; }
.la-tasks:before { content: "\f332"; }
.la-taxi:before { content: "\f333"; }
.la-television:before, .la-tv:before { content: "\f334"; }
.la-tencent-weibo:before { content: "\f335"; }
.la-terminal:before { content: "\f336"; }
.la-text-height:before { content: "\f337"; }
.la-text-width:before { content: "\f338"; }
.la-th:before { content: "\f339"; }
.la-th-large:before { content: "\f33a"; }
.la-th-list:before { content: "\f33b"; }
.la-thumb-tack:before { content: "\f33c"; }
.la-thumbs-down:before { content: "\f33d"; }
.la-thumbs-o-down:before { content: "\f33e"; }
.la-thumbs-o-up:before { content: "\f33f"; }
.la-thumbs-up:before { content: "\f340"; }
.la-ticket:before { content: "\f341"; }
.la-times:before, .la-remove:before { content: "\f342"; }
.la-times-circle:before { content: "\f343"; }
.la-times-circle-o:before { content: "\f344"; }
.la-tint:before { content: "\f345"; }
.la-toggle-off:before { content: "\f346"; }
.la-toggle-on:before { content: "\f347"; }
.la-trademark:before { content: "\f348"; }
.la-train:before { content: "\f349"; }
.la-transgender:before, .la-intersex:before { content: "\f34a"; }
.la-transgender-alt:before { content: "\f34b"; }
.la-trash:before { content: "\f34c"; }
.la-trash-o:before { content: "\f34d"; }
.la-tree:before { content: "\f34e"; }
.la-trello:before { content: "\f34f"; }
.la-tripadvisor:before { content: "\f350"; }
.la-trophy:before { content: "\f351"; }
.la-truck:before { content: "\f352"; }
.la-try:before { content: "\f353"; }
.la-tty:before { content: "\f354"; }
.la-tumblr:before { content: "\f355"; }
.la-tumblr-square:before { content: "\f356"; }
.la-turkish-lira:before { content: "\f357"; }
.la-twitch:before { content: "\f358"; }
.la-twitter:before { content: "\f359"; }
.la-twitter-square:before { content: "\f35a"; }
.la-umbrella:before { content: "\f35b"; }
.la-underline:before { content: "\f35c"; }
.la-undo:before { content: "\f35d"; }
.la-university:before { content: "\f35e"; }
.la-unlink:before { content: "\f35f"; }
.la-unlock:before { content: "\f360"; }
.la-unlock-alt:before { content: "\f361"; }
.la-upload:before { content: "\f362"; }
.la-usd:before { content: "\f363"; }
.la-user:before { content: "\f364"; }
.la-user-md:before { content: "\f365"; }
.la-user-plus:before { content: "\f366"; }
.la-user-secret:before { content: "\f367"; }
.la-user-times:before { content: "\f368"; }
.la-users:before { content: "\f369"; }
.la-venus:before { content: "\f36a"; }
.la-venus-double:before { content: "\f36b"; }
.la-venus-mars:before { content: "\f36c"; }
.la-viacoin:before { content: "\f36d"; }
.la-video-camera:before { content: "\f36e"; }
.la-vimeo:before { content: "\f36f"; }
.la-vimeo-square:before { content: "\f370"; }
.la-vine:before { content: "\f371"; }
.la-vk:before { content: "\f372"; }
.la-volume-down:before { content: "\f373"; }
.la-volume-off:before { content: "\f374"; }
.la-volume-up:before { content: "\f375"; }
.la-warning:before { content: "\f376"; }
.la-wechat:before { content: "\f377"; }
.la-weibo:before { content: "\f378"; }
.la-weixin:before { content: "\f379"; }
.la-whatsapp:before { content: "\f37a"; }
.la-wheelchair:before { content: "\f37b"; }
.la-wifi:before { content: "\f37c"; }
.la-wikipedia-w:before { content: "\f37d"; }
.la-windows:before { content: "\f37e"; }
.la-won:before { content: "\f37f"; }
.la-wordpress:before { content: "\f380"; }
.la-wrench:before { content: "\f381"; }
.la-xing:before { content: "\f382"; }
.la-xing-square:before { content: "\f383"; }
.la-y-combinator:before { content: "\f384"; }
.la-y-combinator-square:before { content: "\f385"; }
.la-yahoo:before { content: "\f386"; }
.la-yc:before { content: "\f387"; }
.la-yc-square:before { content: "\f388"; }
.la-yelp:before { content: "\f389"; }
.la-yen:before { content: "\f38a"; }
.la-youtube:before { content: "\f38b"; }
.la-youtube-play:before { content: "\f38c"; }
.la-youtube-square:before { content: "\f38d"; }

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 424 KiB

View File

@@ -1,6 +1,5 @@
{% extends 'base.html' %}
{% load i18n %}
{% load bootstrap4 %}
{% load static %}
{% block title %}{% trans 'Check e-mail or openid' %}{% endblock title %}
@@ -10,20 +9,26 @@
<h1>{% trans 'Check e-mail or openid' %}</h1>
<div style="max-width:600px;">
<form method="post" name="check">{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<button type="submit" class="btn btn-primary">{% trans 'Check' %}</button>
<button type="cancel" class="btn btn-danger">{% trans 'Cancel' %}</button>
{% endbuttons %}
<form method="post" name="check">
{% csrf_token %}
<div class="form-group"><label for="id_mail">{% trans 'E-Mail' %}</label>
<input type="email" name="mail" maxlength="254" minlength="6" class="form-control" placeholder="{% trans 'E-Mail' %}" {% if mailurl %} value="{{ form.mail.value }}" {% endif %} id="id_mail"></div>
<div class="form-group"><label for="id_openid">{% trans 'OpenID' %}</label>
<input type="text" name="openid" maxlength="255" minlength="11" class="form-control" placeholder="{% trans 'OpenID' %}" {% if openidurl %} value="{{ form.openid.value }}" {% endif %} id="id_openid"></div>
<div class="form-group"><label for="id_size">{% trans 'Size' %}</label>
<input type="number" name="size" min="5" max="512" class="form-control" placeholder="{% trans 'Size' %}" {% if mailurl or openidurl %} value="{{ form.size.value }}" {% else %} value="100" {% endif %} required id="id_size"></div>
<div class="form-group"><label for="id_default_url">{% trans 'Default URL' %}</label>
<input type="url" name="default_url" class="form-control" placeholder="{% trans 'Default URL' %}" {% if mailurl or openidurl %} value="{{ form.default_url.value }}" {% endif %} id="id_default_url"></div>
<div class="form-group">
<button type="submit" class="btn btn-default">{% trans 'Check' %}</button>
</div>
</form>
</div>
{% if mailurl or openidurl %}
<hr/>
<h2>This is what the avatars will look like depending on the hash and protocol you use:</h2>
<p>
This is what the avatars will look like depending on the hash and protocol you use:<br/>
<div class="d-none d-lg-block">
{% if mail_hash %}
MD5 hash (mail): {{ mail_hash }}<br/>
SHA256 hash (mail): {{ mail_hash256 }}<br/>
@@ -32,65 +37,45 @@
{% if openid_hash %}
SHA256 hash (OpenID): {{ openid_hash }}<br/>
{% endif %}
</div>
</p>
<ul class="horizontal-list avatar-list centered" style="font-size:smaller;">
<div class="row">
{% if mailurl %}
<li>
<div style="float:left;">
<div class="panel panel-tortin" style="min-width:132px;width:calc({{ size }}px + 32px);float:left;margin-left:30px">
<div class="panel-heading">
<h3 class="panel-title">MD5 <i class="fa fa-unlock" title="Secure connection (https)"></i> <i class="fa fa-at" title="mail: {{ form.mail.value }}"></i></h3>
</div>
<div class="panel-body">
<a href="{{ mailurl_secure }}">
<img src="{{ mailurl_secure }}" style="max-width: {{ size }}px; max-height: {{ size }}px;">
<center><img src="{{ mailurl_secure }}" style="max-width: {{ size }}px; max-height: {{ size }}px;"></center>
</a>
<div style="padding-left:2px; float:inline-end; font-size:{% widthratio size 3 1 %}px;">
<i class="fa fa-unlock" title="Secure connection (https)"></i>
<br/>
<i class="fa fa-at" title="mail: {{ form.mail.value }}"></i>
</div>
</div>
<div class="panel panel-tortin" style="min-width:132px;width:calc({{ size }}px + 32px);float:left;margin-left:20px">
<div class="panel-heading">
<h3 class="panel-title">SHA256 <i class="fa fa-unlock" title="Secure connection (https)"></i> <i class="fa fa-at" title="mail: {{ form.mail.value }}"></i></h3>
</div>
</div>
<br/>MD5
</li>
<li>
<div style="float:left;">
<div class="panel-body">
<a href="{{ SECURE_BASE_URL }}{{ mail_hash256 }}?s={{ size }}">
<img src="{{ SECURE_BASE_URL }}{{ mail_hash256 }}?s={{ size }}" style="max-width: {{ size }}px; max-height: {{ size }}px;">
<center><img src="{{ SECURE_BASE_URL }}{{ mail_hash256 }}?s={{ size }}" style="max-width: {{ size }}px; max-height: {{ size }}px;"></center>
</a>
<div style="padding-left:2px; float:inline-end; font-size:{% widthratio size 3 1 %}px;">
<i class="fa fa-unlock" title="Secure connection (https)"></i>
<br/>
<i class="fa fa-at" title="mail: {{ form.mail.value }}"></i>
</div>
</div>
<br/>SHA256
</li>
</div>
</div>
{% endif %}
{% if openidurl %}
<li>
<div style="float:left;">
<div class="panel panel-tortin" style="min-width:122px;width:calc({{ size }}px + 32px);float:left;margin-left:30px">
<div class="panel-heading">
<h3 class="panel-title">SHA256 <i class="fa fa-unlock" title="Secure connection (http)"></i><i class="fa fa-openid" title="openid: {{ form.openid.value }}"></i></h3>
</div>
<div class="panel-body">
<a href="{{ openidurl_secure }}">
<img src="{{ openidurl_secure }}" style="max-width: {{ size }}px; max-height: {{ size }}px;">
<center><img src="{{ openidurl_secure }}" style="max-width: {{ size }}px; max-height: {{ size }}px;"></center>
</a>
<div style="padding-left:2px; float:inline-end; font-size:{% widthratio size 3 1 %}px">
<i class="fa fa-unlock" title="Secure connection (http)"></i>
<br/>
<i class="fa fa-openid" title="openid: {{ form.openid.value }}"></i>
</div>
</div>
<br/>SHA256
</li>
</div>
</div>
{% endif %}
</ul>
</div>
{% endif %}
{# Bad hack in order to have the images for sure inside our "outer" div box #}
<!-- Bad hack -->
{% if mailurl %}
<div style="height: {{ size }}px;">&nbsp;</div>
{% endif %}
{% if openidurl %}
<div style="height: {{ size }}px;">&nbsp;</div>
{% endif %}
<!-- End of bad hack -->
<div style="height:40px"></div>
{% endblock content %}

View File

@@ -1,30 +1,30 @@
{% load i18n %}
<ul class="nav navbar-nav" style="flex-direction: row;">
<li class="nav-item dropdown" id="tab_account">
<a class="nav-link dropdown-toggle" href="/" id="account_dropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<ul class="nav navbar-nav navbar-right">
<li class="dropdown" id="tab_account">
<a class="dropdown-toggle" href="#" id="account_dropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{% if request.user.is_authenticated %}
<i class="fa fa-user" aria-hidden="true"></i> {{ request.user }}
<i class="fa fa-user" aria-hidden="true"></i> {{ request.user }}
{% else %}
<i class="fa fa-sign-in" aria-hidden="true"></i> Login
<i class="fa fa-sign-in" aria-hidden="true"></i> Login
{% endif %}
</a>
<div class="dropdown-menu dropdown-menu-right" style="position: absolute; right:0; left: auto;" aria-labelledby="navbarDropdownMenuLink">
<ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
{% if request.user.is_authenticated %}
<a class="dropdown-item" href="{% url 'profile' %}"><i class="fa fa-image" aria-hidden="true"></i> {% trans 'Profile' %}</a>
<a class="dropdown-item" href="{% url 'user_preference' %}"><i class="fa fa-cog" aria-hidden="true"></i> {% trans 'Preferences' %}</a>
<a class="dropdown-item" href="{% url 'import_photo' %}"><i class="fa fa-envelope-square" aria-hidden="true"></i> {% trans 'Import photo via mail address' %}</a>
<a class="dropdown-item" href="{% url 'upload_export' %}"><i class="fa fa-file-archive-o" aria-hidden="true"></i> {% trans 'Import libravatar XML export' %}</a>
<a class="dropdown-item" href="{% url 'logout' %}"><i class="fa fa-sign-out" aria-hidden="true"></i> {% trans 'Logout' %}</a>
<li><a href="{% url 'profile' %}"><i class="fa fa-image" aria-hidden="true"></i> {% trans 'Profile' %}</a></li>
<li><a href="{% url 'user_preference' %}"><i class="fa fa-cog" aria-hidden="true"></i> {% trans 'Preferences' %}</a></li>
<li><a href="{% url 'import_photo' %}"><i class="fa fa-envelope-square" aria-hidden="true"></i> {% trans 'Import photo via mail address' %}</a></li>
<li><a href="{% url 'upload_export' %}"><i class="fa fa-file-archive-o" aria-hidden="true"></i> {% trans 'Import libravatar XML export' %}</a></li>
<li><a href="{% url 'logout' %}"><i class="fa fa-sign-out" aria-hidden="true"></i> {% trans 'Logout' %}</a></li>
{% else %}
<a class="dropdown-item" href="{% url 'login' %}"><i class="fa fa-sign-in" aria-hidden="true"></i> {% trans 'Local' %}</a>
<a class="dropdown-item" href="{% url 'new_account' %}"><i class="fa fa-user-plus" aria-hidden="true"></i> {% trans 'Create account' %}</a>
<li><a href="{% url 'login' %}"><i class="fa fa-sign-in" aria-hidden="true"></i> {% trans 'Local' %}</a></li>
<li><a href="{% url 'new_account' %}"><i class="fa fa-user-plus" aria-hidden="true"></i> {% trans 'Create account' %}</a></li>
{% endif %}
</div>
</ul>
</li>
{% if user.is_staff %}
<li class="nav-item" style="margin-left: 5px;">
<a class="nav-link" href="{% url 'admin:index' %}" target="_new"><i class="fa fa-user-secret" aria-hidden="true"></i> {% trans 'Admin' %}</a>
<li>
<a href="{% url 'admin:index' %}" target="_new"><i class="fa fa-user-secret" aria-hidden="true"></i> {% trans 'Admin' %}</a>
</li>
{% endif %}
</ul>

View File

@@ -1,105 +1,84 @@
{% extends 'bootstrap.html' %}
{% load static %}
{% load bootstrap4 %}
{% load i18n %}<!DOCTYPE HTML>
{% block bootstrap4_extra_head %}
{% include 'header.html' %}
<title>iVatar :: {% block title %}{% trans 'Freeing the Web, one face at a time!' %}{% endblock title %}</title>
{% endblock bootstrap4_extra_head %}
{% spaceless %}{% block bootstrap4_content %}
{% spaceless %}
<div id="page">
<div id="header">
{% block topbar_base %}
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
<nav class="navbar navbar-tortin">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
{% block topbar %}
{% block site_brand %}
<div id="logo">
{% if user.is_anonymous %}
<a class="navbar-brand d-none d-lg-block" href="/">
<img src="{% static 'img/logo.png' %}" width="60" height="60" class="d-inline-block align-top"
alt="{% trans 'Home' %}">
{% if user.is_anonymous %}
<a class="navbar-brand" href="/">
{% else %}
<a class="navbar-brand" href="{% url 'profile' %}">
{% endif %}
ivatar
</a>
{% else %}
<a class="navbar-brand d-none d-lg-block" href="{% url 'profile' %}">
<img src="{% static 'img/logo.png' %}" width="60" height="60" class="d-inline-block align-top"
alt="{% trans 'Profile' %}">
</a>
{% endif %}
</div>
<span class="d-none d-lg-block">
<div id="site-branding">
<span id="site-name">
i<span class="bolder">vatar</span>
</span>
<br/>
freeing the web one face at a time
</div>
</span>
</div>
{% endblock %}
{% block nav %}
<div class="collapse navbar-collapse" id="navbarNavDropdown">
<ul class="navbar-nav mr-auto nav">
<div class="collapse navbar-collapse" id="navbar">
<ul class="nav navbar-nav">
{% if not user.is_anonymous %}
<li class="nav-item" style="margin-left: 5px;">
<a class="nav-link" href="/"><i class="fa fa-home" aria-hidden="true"></i>
<li>
<a href="/"><i class="fa fa-home" aria-hidden="true"></i>
{% trans 'Home' %}
</a>
</li>
{% endif %}
<li class="nav-item" style="margin-left: 5px;">
<li>
<a class="nav-link" href="TODO contact"><i class="fa fa-envelope" aria-hidden="true"></i>
{% trans 'Contact' %}
</a>
</li>
<li class="nav-item" style="margin-left: 5px;">
<a class="nav-link" href="TODO security"><i class="fa fa-user-secret" aria-hidden="true"></i>
<li>
<a href="TODO security"><i class="fa fa-user-secret" aria-hidden="true"></i>
{% trans 'Security' %}
</a>
</li>
<li class="nav-item dropdown" id="tab_tools">
<a class="nav-link dropdown-toggle" href="/" id="tools_dropdown"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="{% trans 'Tools' %}">
<li class="dropdown" id="tab_tools">
<a class="dropdown-toggle" href="#" id="tools_dropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="{% trans 'Tools' %}">
<i class="fa fa-wrench" aria-hidden="true"></i>
{% trans 'Tools' %}
{% trans 'Tools' %}
</a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="tools_dropdown">
<a id="tools-check" class="dropdown-item"
href="{% url 'tools_check' %}">
<ul class="dropdown-menu" aria-labelledby="tools_dropdown">
<li><a id="tools-check" href="{% url 'tools_check' %}">
<i class="fa fa-check-square" aria-hidden="true"></i> {% trans 'Check' %}
</a>
</div>
</a></li>
</ul>
</li>
</ul>
{% block account_bar %}{% include "_account_bar.html" %}{% endblock %}
</div>
<div>
{% block account_bar %}{% include "_account_bar.html" %}{% endblock %}
</div>
</div>
</nav>
{% endblock %}
{% endblock %}
</nav>
{% endblock %}
</div>
{% autoescape off %}{% bootstrap_messages %}{% endautoescape %}
{% autoescape off %}{% endautoescape %}
<div id="outer">
<div id="content">
<div class="container">
{% block content %}{% endblock content %}
</div>
</div>
{% block footer %}{% include 'footer.html' %}{% endblock footer %}
</div>
{% endspaceless %}
{% endblock %}{% endspaceless %}
{% block bootstrap4_after_content %}
<script src="{% static '/js/jquery-3.3.1.slim.min.js' %}" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="{% static '/js/ivatar.js' %}" defer></script>
<script src="{% static '/js/bootstrap.min.js' %}"></script>
<script src="{% static '/js/ivatar.js' %}"></script>
{{ settings }}
{% endblock bootstrap4_after_content %}

19
templates/base_home.html Normal file
View File

@@ -0,0 +1,19 @@
{% load static %}
{% load i18n %}<!DOCTYPE HTML>
{% include 'header.html' %}
<title>iVatar :: {% block title %}{% trans 'Freeing the Web, one face at a time!' %}{% endblock title %}</title>
{% spaceless %}
<div id="page">
{% autoescape off %}{% endautoescape %}
{% block content %}{% endblock content %}
{% block footer %}{% include 'footer.html' %}{% endblock footer %}
</div>
{% endspaceless %}
<script src="{% static '/js/bootstrap.min.js' %}"></script>
<script src="{% static '/js/ivatar.js' %}"></script>
{{ settings }}

View File

@@ -1,3 +0,0 @@
{% extends 'bootstrap4/bootstrap4.html' %}
{% block bootstrap4_title %}{% block title %}{% endblock %}{% endblock %}

View File

@@ -1,7 +1,15 @@
{% load static %}
{% load i18n %}
<div id="footer">
<a rel="license" href="http://www.gnu.org/licenses/agpl-3.0.html" id="agpl-button" title="{% trans 'GNU Affero General Public License' %}"></a> {% blocktrans %}<b>{{ site_name }}</b> is an avatar service running the <a href="https://git.linux-kernel.at/oliver/ivatar">ivatar</a>
software, version {{ ivatar_version }}{% endblocktrans %}
{% block footer %}{% endblock footer %}
<div class="clipper-footer"></div>
<footer>
<div class="container">
<div class="pull-left">
<p><b>{% blocktrans %}{{ site_name }}</b> is an service running the <a href="https://launchpad.net/libravatar">ivatar</a> software, version {{ ivatar_version }} under the <a href="http://www.gnu.org/licenses/agpl-3.0.html">AGPLv3.0</a> license.{% endblocktrans %}
{% block footer %}{% endblock footer %}</p>
</div>
<div class="pull-right">
<a href="http://vtex.github.io/tortin">Get <strong>Tortin</strong> Theme</a>
</div>
</div>
</footer>
</div>

View File

@@ -18,8 +18,11 @@
<link rel="icon" type="image/png" href="{% static '/img/nobody/128.png' %}" sizes="128x128">
<link rel="icon" type="image/png" href="{% static '/img/nobody/195.png' %}" sizes="195x195">
<link rel="mask-icon" href="{% static '/img/safari-pinned-tab.svg' %}" color="#fa711f">
<link rel="stylesheet" href="{% static '/css/ivatar.css' %}" type="text/css">
<link rel="stylesheet" href="{% static 'line-awesome/css/line-awesome-font-awesome.min.css' %}">
<link rel="stylesheet" href="{% static '/css/bootstrap.min.css' %}" type="text/css">
<link rel="stylesheet" href="{% static '/css/tortin.css' %}" type="text/css">
<link rel="stylesheet" href="{% static '/css/fonts.css' %}" type="text/css">
<link rel="stylesheet" href="{% static '/css/fontawesome.min.css' %}">
<script src="{% static '/js/jquery-3.3.1.slim.min.js' %}"></script>
{% if user.is_authenticated %}
{% if user.userpreference and user.userpreference.theme != 'default' %}
<link rel="stylesheet" href="{% static 'css/' %}{{ user.userpreference.theme }}.css" type="text/css">
@@ -27,8 +30,8 @@
{% endif %}
<link rel="manifest" href="/manifest.json">
<meta name="msapplication-TileImage" content="{% static '/img/nobody/144.png' %}">
<meta name="msapplication-TileColor" content="#fa711f">
<meta name="msapplication-TileColor" content="#36b7d7">
<meta name="apple-mobile-web-app-title" content="ivatar">
<meta name="application-name" content="ivatar">
<meta name="theme-color" content="#fa711f">
<meta name="theme-color" content="#36b7d7">
{% block header %}{% endblock header %}

View File

@@ -1,7 +1,6 @@
{% extends 'base.html' %}
{% extends 'base_home.html' %}
{% load i18n %}
{% load static %}
{% load bootstrap4 %}
{% block title %}{% trans 'federated avatar hosting service' %}{% endblock %}
@@ -9,29 +8,54 @@
{% url 'new_account' as new_account_url %}
<div id="action-panel">
{% if not user.is_authenticated and not disable_signup %}
<p>{% blocktrans %}Create a <a href="{{ new_account_url }}">free account</a>{% endblocktrans %}</p>
{% endif %}
<p>{% trans 'Download the <a href="https://git.linux-kernel.at/oliver/ivatar">source code</a>' %}</p>
<p>{% trans 'File <a href="https://git.linux-kernel.at/oliver/ivatar/issues">bugs</a>' %}</p>
<p>{% trans 'Read our <a href="https://git.linux-kernel.at/oliver/ivatar/wikis">wiki</a>' %}</p>
<p>{% trans 'Follow us on <a href="https://identi.ca/libravatar">Identica</a>' %} / <a href="https://twitter.com/libravatar">Twitter</a></p>
<p id="contribute-button"><a href="https://git.linux-kernel.at/oliver/ivatar/wikis/contribute/">{% trans 'Contribute!' %}</a></p>
<div class="hero">
<div class="container">
<header>
<h1>{% trans 'ivatar' %}</h1>
<h2>{% trans 'freeing the web one face at a time' %}</h2>
<a href="/accounts/login/" class="btn btn-lg btn-primary">{% trans 'Login' %}</a>&nbsp;
<a href="/accounts/new/" class="btn btn-lg btn-primary">{% trans 'Sign up' %}</a>&nbsp;
<a href="/tools/check/" class="btn btn-lg btn-primary">{% trans 'Check email' %}</a>&nbsp;
</header>
</div>
<p>{% blocktrans %}ivatar is a service which delivers your avatar (profile picture) to other websites. If you <a href="{{ new_account_url }}">create an account</a> with us, your photo could start popping up next to forum posts or blog comments on any site where you left your email address.{% endblocktrans %} {% trans '<a href="https://git.linux-kernel.at/oliver/ivatar/wikis">Read more...</a>' %}</p>
<h2>{% trans 'Federated Open Source Service' %}</h2>
<p>{% trans 'This service is powered by <a href="https://www.gnu.org/licenses/agpl.html">Free and Open Source software</a> and allows owners of a domain name to <a href="https://git.linux-kernel.at/oliver/ivatar/wikis/running-your-own">run their own instance</a> of ivatar and serve avatars themselves.' %}</p>
<h2>{% trans 'Simple API for Developers' %}</h2>
<p>{% trans 'Application developers can easily add support for this service using our <a href="https://git.linux-kernel.at/oliver/ivatar/wikis/api">simple API</a> or one of the <a href="https://git.linux-kernel.at/oliver/ivatar/wikis/libraries">libraries and plugins</a> available for a number of platforms and languages.' %}</p>
<p>{% trans 'Big thanks to our sponsors without whom none of this would be possible!' %}</p>
<div id="sponsors">
<a href="https://fedoraprojec.org/"><img src="{% static '/img/Fedora_logo.png' %}" title="Fedora Project" alt="{% trans 'Fedora Logo' %}"></a>
</div>
<div class="social"></div>
<div class="clipper"></div>
<section class="content">
<div class="container">
<div class="text-center">
<h2>{% trans 'The open avatar service' %}</h2>
<p class="lead">{% blocktrans %}ivatar is a service which delivers your avatar (profile picture) to other websites. If you create an account with us, your photo could start popping up next to forum posts or blog comments on any site where you left your email address.{% endblocktrans %}<br>
<a href="https://wiki.libravatar.org/description/">{% trans 'Read more...' %}</a></p>
</div>
<hr/>
<div class="row">
<section class="col-md-8">
<h1>{% trans 'Federated Open Source Service' %}</h1>
<p class="lead">{% trans 'This service is powered by <a href="https://www.gnu.org/licenses/agpl.html">Free and Open Source software</a> and allows owners of a domain name to <a href="https://wiki.libravatar.org/running_your_own/">run their own instance</a> of ivatar and serve avatars themselves.' %}</p>
<hr>
<h1>{% trans 'Simple API for Developers' %}</h1>
<p class="lead">{% trans 'Application developers can easily add support for this service using our <a href="https://wiki.libravatar.org/api/">simple API</a> or one of the <a href="https://wiki.libravatar.org/libraries/">libraries and plugins</a> available for a number of platforms and languages.' %}</p>
<hr/>
<a class="btn btn-default btn-lg btn-block" href="https://wiki.libravatar.org/contribute/">{% trans 'Contribute' %}</a>
</section>
<section class="col-md-4">
<h1>Useful links</h1>
<a class="btn btn-default" href="https://wiki.libravatar.org/talk_to_us/">{% trans 'Contact us' %}</a><br/>
<a class="btn btn-default" href="https://wiki.libravatar.org/security/">{% trans 'Security' %}</a><br/>
<a class="btn btn-default" href="https://code.launchpad.net/libravatar">{% trans 'Source code' %}</a><br/>
<a class="btn btn-default" href="https://bugs.launchpad.net/libravatar">{% trans 'Report bugs' %}</a><br/>
<a class="btn btn-default" href="https://answers.launchpad.net/libravatar">{% trans 'Questions' %}</a><br/>
<a class="btn btn-default" href="https://wiki.libravatar.org/">{% trans 'Wiki' %}</a><br/>
<a class="btn btn-default" href="http://blog.libravatar.org/">{% trans 'Blog' %}</a><br/>
<h3>{% trans 'Social media' %}</h3>
<a class="btn btn-default" href="https://identi.ca/libravatar">Identica</a><br/>
<a class="btn btn-default" href="https://twitter.com/libravatar">Twitter</a><br/>
</section>
</div>
<div class="text-center">
<h3>{% trans 'Big thanks to our sponsors without whom none of this would be possible!' %}</h3>
<a href="https://fedoraproject.org/"><img src="{% static '/img/Fedora_logo.png' %}" title="Fedora Project" alt="{% trans 'Fedora Logo' %}"></a>
</div>
</section>
{% endblock %}