Compare commits

...

34 Commits

Author SHA1 Message Date
Gregorio Chiko Putra
987294e630 Updated db name, document title. Removed /vendor 2018-06-07 09:29:23 +07:00
7e86321332 Updated now can select table name with '_' character 2017-10-30 11:10:13 +07:00
b527084d95 Updated readme 2017-10-30 09:03:35 +07:00
531d0d5b5d Updated README 2017-10-28 12:05:22 +07:00
77947e2234 Updated screenshots 2017-10-28 12:03:27 +07:00
9a00447068 Updated screenshots 2017-10-28 11:54:28 +07:00
e6aa4991fc Updated posts list 2017-10-28 11:42:49 +07:00
94b2f1e4ab Updated README.md 2017-10-28 11:18:16 +07:00
77358a9dac Fixed profile edit page issue 2017-10-28 11:11:07 +07:00
ffaec84ba9 Fixed issue 2017-10-28 10:49:24 +07:00
5eb78b4440 Added profile edit page 2017-10-28 10:47:16 +07:00
f687983b45 Customization 2017-10-27 14:35:10 +07:00
766fe4425d Fixed edit entry post issue 2017-10-27 14:34:55 +07:00
6a4fd98a03 Fixed login/logout issue 2017-10-27 09:59:56 +07:00
c0ea05faee Updated: no <a> tag with href, converted to onclick event 2017-10-26 15:55:52 +07:00
9acec91229 Fixed entry post issue 2017-10-26 15:27:04 +07:00
a106344dc8 Added custom notification 2017-10-26 14:59:49 +07:00
bc21934274 Fixed date format in edit post 2017-10-26 10:33:50 +07:00
b4fe18f5b5 Fixed entry post issue 2017-10-26 10:12:23 +07:00
b3c27d513d Fixed login/logout issue 2017-10-26 09:44:43 +07:00
d2327c92dd Fixed entry post issue 2017-10-25 16:25:03 +07:00
0c56440363 Fixed login/logout issue 2017-10-25 15:35:56 +07:00
5e73adada1 Updated readme 2017-10-25 12:12:50 +07:00
10274602d9 Updated readme 2017-10-25 12:09:10 +07:00
d1d5ee1b0c Mithril as main method 2017-10-25 12:08:41 +07:00
6040809710 Created API for API requests 2017-10-09 11:05:58 +07:00
96e262d8ff Fixed undefined scripts 2017-10-06 16:46:16 +07:00
0790f8e82c Dumped database 2017-10-06 11:27:03 +07:00
9191514652 Merge branch 'mithril' (2017/10/06) 2017-10-06 10:45:28 +07:00
2602ba2911 Updated Home and Post 2017-10-02 09:19:05 +07:00
64fc8a6896 Updated Home and Post 2017-10-02 09:18:21 +07:00
dbd326637a Merge branch 'mithril' 2017-09-30 13:45:17 +07:00
d6619e3e89 Placed font locally 2017-09-28 09:08:47 +07:00
1751c611ce Removed unnecessary head link 2017-09-28 08:50:28 +07:00
169 changed files with 26420 additions and 843 deletions

3
.gitignore vendored
View File

@ -1,2 +1,3 @@
App/Config.php App/Config.php
node_modules /node_modules
/vendor

View File

@ -5,7 +5,7 @@ class Config
{ {
const const
DB_HOST = 'mariadb', DB_HOST = 'mariadb',
DB_DB = 'lepisi', DB_DB = 'pengumuman',
DB_UNAME = 'root', DB_UNAME = 'root',
DB_PWD = 'root', DB_PWD = 'root',

View File

@ -1,47 +1,148 @@
<?php <?php
namespace App\Controllers; namespace App\Controllers;
use App\Models\Post;
use Core\Session;
class Api class Api
{ {
private $model;
public function __construct() public function index()
{ {
$this->model = new Post(); $index = [];
$index['data'] = [
"get_url" => "/api/{tablename}{/id}",
"put_url" => "/api/{table}",
"post_url" => "/api/{table}",
"delete_url" => "/api/{table}"
];
$index['count'] = count($index['data']);
header("Content-Type: application/json");
echo json_encode($index, JSON_UNESCAPED_SLASHES);
} }
public function posts($args = ['id' => '1']) public function get($table, $id = "", $args = [])
{ {
$get = []; $get = [];
$table = str_replace('-', '_', $table);
if ($args['id'] == 3) { $model = 'App\Models\ApiModel';
$get['data'] = $this->model->showJoin(); if ($table == 'pengumuman') {
$model = 'App\Models\Pengumuman';
}
if ($args == []) {
$get['data'] = $id == "" ? $model::showAll($table) : $model::fetch(
$table,
[
[$table.'.id', '=', $id]
]);
} else { } else {
$get['data'] = $this->model->showJoin([ if ($args['status'] != 3) {
['pengumuman.status', '=', $args['id']] $get['data'] = $model::showAll($table, [
]); ["$table.status", '=', $args['status']]
]);
} else {
$get['data'] = $model::showAll($table);
}
} }
if ($get['data'] == false) { $get['count'] = count($get['data']);
$get['data']['content'] = 'Tidak ada pengumuman';
$get['data']['valid_at'] = ''; if ($table == 'kategori' && $get['count'] != 0) {
$get['data']['expired_at'] = ''; if (isset($get['data'][0])) {
$get['data']['status'] = 0; for ($i=0; $i < count($get['data']); $i++) {
$get['data']['background'] = '#333'; $get['data'][$i]['posts'] = count(\App\Models\Pengumuman::showAll('pengumuman', [
$get['data']['foreground'] = '#888'; ['pengumuman.status', '=', 1],
['pengumuman.category', '=', $get['data'][$i]['id']]
]));
}
} else {
$get['data']['posts'] = count(\App\Models\Pengumuman::showAll('pengumuman', [
['pengumuman.status', '=', 1],
['pengumuman.category', '=', $get['data']['id']]
]));
}
} }
if (array_key_exists(0, $get['data']) == false) { if ($table == 'users') {
$temp_data = $get['data']; unset($get['data']['salt']);
}
if (is_array($get['data'])) {
$get['status'] = true;
} else {
$get['status'] = false;
$get['message'] = $get['data'];
unset($get['data']); unset($get['data']);
$get['data'][] = $temp_data;
$temp_data = [];
} }
header('Content-Type: application/json'); header('Content-Type: application/json');
echo json_encode($get); echo json_encode($get);
} }
public function put($table)
{
$put = [];
$args = file_get_contents("php://input");
$args = json_decode($args, true);
if (isset($args['posts'])) unset($args['posts']);
$update = \App\Models\ApiModel::update($table, $args);
if (!is_array($update)) {
$put['status'] = false;
$put['message'] = $update;
} else {
$put['status'] = true;
$put['data'] = $update;
$put['count'] = count($put['data']);
$put['message'] = 'Proses berhasil';
}
header('Content-Type: application/json');
echo json_encode($put);
}
public function post($table)
{
$post = [];
$args = file_get_contents("php://input");
$args = json_decode($args, true);
$entry = \App\Models\ApiModel::entry($table, $args);
$entry = \App\Models\ApiModel::showAll($table, [
['id', '=', $entry[0]]
]);
if (!is_array($entry)) {
$post['status'] = false;
$post['message'] = $entry;
} else {
$post['status'] = true;
$post['data'] = $entry;
$post['count'] = count($post['data']);
$post['message'] = 'Proses berhasil';
}
header('Content-Type: application/json');
echo json_encode($post);
}
public function delete($table)
{
$delete = [];
$args = file_get_contents("php://input");
$args = json_decode($args, true);
$remove = \App\Models\ApiModel::remove($table, $args['id']);
if (!is_array($delete['data'])) {
$delete['status'] = false;
$delete['messsage'] = $remove;
} else {
$delete['status'] = true;
$delete['data'] = $remove;
$delete['count'] = count($delete['data']);
}
header('Content-Type: application/json');
echo json_encode($delete);
}
} }

View File

@ -3,20 +3,17 @@ namespace App\Controllers;
use Core\View; use Core\View;
use App\Models\Access; use App\Models\Access;
use App\Models\ClientSession;
use Core\Token; use Core\Token;
use Core\Session; use Core\Session;
use Core\Redirect; use Core\Redirect;
use Core\Hash; use Core\Hash;
use Core\XSS; use Core\XSS;
use Defuse\Crypto\Crypto;
use Defuse\Crypto\Key;
class Home class Home
{ {
public $model;
public function __construct()
{
$this->model = new Access();
}
/* Routes */ /* Routes */
public function index() public function index()
@ -27,14 +24,11 @@ class Home
public function login($args = []) public function login($args = [])
{ {
if (Session::exists('userid')) {
Session::flash('info', 'Anda telah masuk');
Redirect::to('/');
die();
}
// Login // Login
if ($args) { if ($args) {
$logged_in = ['status' => false];
// Avoid XSS // Avoid XSS
$args['exclude'] = [ $args['exclude'] = [
'password' 'password'
@ -44,31 +38,50 @@ class Home
$username = $args['username']; $username = $args['username'];
$password = $args['password']; $password = $args['password'];
$user = $this->model->showAll([ $user = Access::showAll([
['username', '=', $username] ['username', '=', $username]
]); ]);
if ($user == false) { if ($user == false) {
$info = "Username/password salah"; $info = "Username/password salah";
$logged_in['status'] = false;
$logged_in['message'] = $info;
} else { } else {
if ($user['flag'] != 0) {
$info = "User telah login";
$logged_in['status'] = false;
$logged_in['message'] = $info;
}
$hash = Hash::compare($password, $user['salt'], $user['password']); $hash = Hash::compare($password, $user['salt'], $user['password']);
if ($hash == true) { if ($hash == true) {
if ($user['max_user'] <= 0) { if ($user['flag'] != 0) {
$info = "Telah mencapai maksimal user yang diizinkan - Silahkan logout pada perangkat lain terlebih dahulu"; $info = "User telah login";
} else { } else {
$max_user = $user['max_user'] - 1; if (Access::update(['flag' => 1], $user['id'])) {
if ($this->model->update(['max_user' => $max_user], $user['id']) == true) { $ip_address = isset($_SERVER['HTTP_X_FORWADED_FOR']) ? $_SERVER['HTTP_X_FORWADED_FOR'] : $_SERVER['REMOTE_ADDR'];
Session::put('userid', $user['id']);
Session::put('username', $user['username']); ClientSession::entry([
Session::put('full_name', $user['full_name']); 'ip_address' => $ip_address,
Session::put('privilege', $user['privilege']); 'uid' => $user['id']
]);
$session = ClientSession::fetch(['uid' => $user['id']]);
setcookie('signal', $user['privilege']);
$info = "Berhasil masuk"; $info = "Berhasil masuk";
$logged_in['status'] = true;
$logged_in['redirect_to'] = '/?s='.$session['id']."&u=".$session['uid'];
$logged_in['message'] = 'Berhasil login';
} }
} }
} else {
$info = "Username/password salah";
$logged_in['message'] = $info;
} }
} }
if (isset($_SERVER['HTTP_CLIENT']) && $_SERVER['HTTP_CLIENT'] == 'api') {
echo json_encode($logged_in); die();
}
Session::flash('info', $info); Session::flash('info', $info);
Redirect::to('/'); Redirect::to('/');
die(); die();
@ -79,16 +92,30 @@ class Home
} }
} }
public function logout() { public function logout($id = '') {
if ($this->delete() != true) { $logged_out = ['status' => false];
$info = "Terjadi kesalahan. Silahkan coba lagi dalam beberapa saat"; try {
} else { if ($id) {
Session::delete('userid'); $this->delete($id);
Session::delete('username'); } else {
Session::delete('full_name'); $this->delete();
Session::delete('privilege'); }
session_destroy();
header('X-Token: ');
setcookie('signal', '', time()-3600);
$info = "Berhasil keluar"; $info = "Berhasil keluar";
$logged_out['status'] = true;
$logged_out['redirect_to'] = '';
$logged_out['message'] = 'Berhasil logout';
} catch (\Exception $e) {
$logged_out['status'] = false;
$logged_out['message'] = $e->getMessage();
}
if (isset($_SERVER['HTTP_CLIENT']) && $_SERVER['HTTP_CLIENT'] == 'api') {
echo json_encode($logged_out);die();
} }
Session::flash('info', $info); Session::flash('info', $info);
Redirect::to('/'); Redirect::to('/');
@ -108,9 +135,16 @@ class Home
/* Methods */ /* Methods */
public function post($args = []) public function post($args = [])
{ {
$registered = [];
foreach ($args as $value) { foreach ($args as $value) {
if ($value == '') { if ($value == '') {
Session::flash('info', 'Semua data harus diisi'); $info = 'Semua data harus diisi';
$registered['status'] = false;
$registered['message'] = $info;
if (isset($_SERVER['HTTP_CLIENT']) && $_SERVER['HTTP_CLIENT'] == 'api') {
echo json_encode($registered);die();
}
Session::flash('info', $info);
Redirect::to('./register'); Redirect::to('./register');
die(); die();
} }
@ -133,7 +167,7 @@ class Home
]; ];
$args = XSS::avoid($args); $args = XSS::avoid($args);
$data = $this->model->showAll(); $data = Access::showAll();
foreach ($data as $users) { foreach ($data as $users) {
if (is_array($users)) { if (is_array($users)) {
$known_uname = $users['username']; $known_uname = $users['username'];
@ -141,38 +175,53 @@ class Home
$known_uname = $data['username']; $known_uname = $data['username'];
} }
if ($args['username'] == $known_uname) { if ($args['username'] == $known_uname) {
Session::flash('info', 'Username telah digunakan. Silahkan gunakan username lain'); $info = 'Username telah digunakan. Silahkan gunakan username lain';
$registered['status'] = false;
$registered['message'] = $info;
if (isset($_SERVER['HTTP_CLIENT']) && $_SERVER['HTTP_CLIENT'] == 'api') {
echo json_encode($registered);die();
}
Session::flash('info', $info);
Redirect::to('./register'); Redirect::to('./register');
die(); die();
} }
} }
$this->model->entry($args); Access::entry($args);
if (isset($_SERVER['HTTP_CLIENT']) && $_SERVER['HTTP_CLIENT'] == 'api') {
echo json_encode([
'status' => true,
'route_to' => '',
'message' => 'Proses berhasil'
]);die();
}
Session::flash('info', 'Registrasi berhasil'); Session::flash('info', 'Registrasi berhasil');
Redirect::to('/'); Redirect::to('/');
die(); die();
} }
public function delete() public function delete($id = '')
{ {
if (Session::exists('userid') == false) { if ($id) {
throw new \Exception("Bad request but thrown as 404", 404); $uid = $id;
// } elseif (isset($_SERVER['HTTP_X_TOKEN'])) {
// $token = Token::fetch($_SERVER['HTTP_X_TOKEN']);
// if ($token == '') {
// throw new \Exception("Token invalid");
// }
// $uid = $token['uid'];
} elseif (isset($_SERVER['HTTP_X_QUERY'])) {
$query_string = $_SERVER['HTTP_X_QUERY'];
$exploded = explode('&', $query_string);
$uid = $exploded[1];
$uid = explode('=', $uid);
$uid = $uid[1];
} }
$userid = Session::get('userid');
$user = $this->model->showAll([ $ip = isset($_SERVER['HTTP_X_FORWADED_FOR']) ? $_SERVER['HTTP_X_FORWADED_FOR'] : $_SERVER['REMOTE_ADDR'];
['id', '=', $userid]
]);
$max_user = $user['max_user'] + 1;
if ($this->model->update( ClientSession::remove($ip, $uid);
[ Access::update(['flag' => 0], $uid);
'max_user' => $max_user
],
$userid
) != true) {
throw new \Exception("Bad request", 400);
}
return true; return true;
} }
@ -186,9 +235,54 @@ class Home
} else { } else {
$user = false; $user = false;
} }
View::render('Data/mithril.html', [ View::render('Data/mithril.html', [
'user' => $user 'user' => $user
]); ]);
} }
public function editProfile($args) {
$user = Access::showAll([
['id', '=', $args['id']]
]);
if (is_array($user)) {
if (isset($args['old_password'])) {
if (Hash::compare($args['old_password'], $user['salt'], $args['password'])) {
unset($args['old_password']);
$args['password'] = $args['new_password'];
unset($args['new_password']);
$args['password'] = Hash::make($args['password'], $user['salt']);
$data = Access::update($args, $args['id']);
} else {
$response = [
'status' => false,
'message' => 'Password lama tidak sama'
];
}
} else {
$data = Access::update($args, $args['id']);
}
if ($data) {
$response = [
'status' => true,
'message' => 'Proses berhasil'
];
} else {
$response = [
'status' => false,
'message' => 'Proses gagal'
];
}
} else {
$response = [
'status' => false,
'message' => 'User tidak ditemukan'
];
}
if (isset($_SERVER['HTTP_CLIENT']) && $_SERVER['HTTP_CLIENT'] == 'api') {
$response['route_to'] = '/user' . '/' . $args['id'];
echo json_encode($response);die();
}
}
} }

View File

@ -124,8 +124,7 @@ class Posts
View::render($url, [ View::render($url, [
'posts' => $datas, 'posts' => $datas,
'user' => $user, 'user' => $user
'token' => Token::generate()
]); ]);
} }
@ -263,15 +262,44 @@ class Posts
} }
/* Methods */ /* Methods */
public function post($args = []) public function post($args)
{ {
$post = [];
if ($args == [] || count($args) < 4) {
$post['status'] = false;
$post['message'] = 'Semua data harus diisi ya broo';
$post['data'] = $args;
if (isset($_SERVER['HTTP_CLIENT']) && $_SERVER['HTTP_CLIENT'] == 'api') {
echo json_encode($post);
die();
}
Session::flash('info', 'Semua data harus diisi');
if (isset($table)) {
Redirect::to("/posts/category");
} else {
Redirect::to('/posts/entry');
}
die();
}
if (isset($args['_addon'])) { if (isset($args['_addon'])) {
$table = $args['_addon']; $table = $args['_addon'];
unset($args['_addon']); unset($args['_addon']);
} }
if (isset($args['categoryName'])) { unset($args['categoryName']); }
if (isset($args['creatorName'])) { unset($args['creatorName']); }
if (isset($args['background'])) { unset($args['background']); }
if (isset($args['foreground'])) { unset($args['foreground']); }
foreach ($args as $value) { foreach ($args as $value) {
if ($value == '') { if ($value == '') {
$post['status'] = false;
$post['message'] = 'Semua data harus diisi';
if (isset($_SERVER['HTTP_CLIENT']) && $_SERVER['HTTP_CLIENT'] == 'api') {
echo json_encode($post);
die();
}
Session::flash('info', 'Semua data harus diisi'); Session::flash('info', 'Semua data harus diisi');
if (isset($table)) { if (isset($table)) {
Redirect::to("/posts/category"); Redirect::to("/posts/category");
@ -282,6 +310,12 @@ class Posts
} }
} }
$query_string = $_SERVER['HTTP_X_QUERY'];
$exploded = explode('&', $query_string);
$args['creator'] = substr_replace($exploded[1], '', 0, 2);
$args['created_at'] = date('Y-m-d H:i:s');
$args['edited_at'] = $args['created_at'];
// Avoid XSS attack // Avoid XSS attack
$args = XSS::avoid($args); $args = XSS::avoid($args);
@ -297,16 +331,29 @@ class Posts
$length = strlen($args['content']); $length = strlen($args['content']);
$args['delay'] = $length * 84; $args['delay'] = $length * 84;
if ($this->model->entry($args)) { try {
Session::flash('info', 'Data berhasil diunggah'); $this->model->entry($args);
Redirect::to('/'); } catch (Exception $e) {
$post['message'] = $e->getMessage();
} }
$post['status'] = true;
$post['route_to'] = '';
$post['message'] = 'Proses berhasil';
if (isset($_SERVER['HTTP_CLIENT']) && $_SERVER['HTTP_CLIENT'] == 'api') {
echo json_encode($post);
die();
}
Session::flash('info', 'Data berhasil diunggah');
Redirect::to('/');
} }
die(); die();
} }
public function put($args) public function put($args)
{ {
// echo json_encode($args); die();
$update = [];
if (isset($args['_addon'])) { if (isset($args['_addon'])) {
$table = $args['_addon']; $table = $args['_addon'];
unset($args['_addon']); unset($args['_addon']);
@ -318,6 +365,11 @@ class Posts
die(); die();
} }
if (isset($args['categoryName'])) { unset($args['categoryName']); }
if (isset($args['creatorName'])) { unset($args['creatorName']); }
if (isset($args['background'])) { unset($args['background']); }
if (isset($args['foreground'])) { unset($args['foreground']); }
// Avoid XSS attack // Avoid XSS attack
$args = XSS::avoid($args); $args = XSS::avoid($args);
@ -360,7 +412,18 @@ class Posts
$length = strlen($args['content']); $length = strlen($args['content']);
$args['delay'] = $length * 84; $args['delay'] = $length * 84;
$d = new \DateTime();
$d = $d->format('Y-m-d H:i:s');
$args['edited_at'] = $d;
if ($this->model->update($args, $id)) { if ($this->model->update($args, $id)) {
$update['status'] = true;
$update['route_to'] = '';
$update['message'] = 'Proses berhasil';
if (isset($_SERVER['HTTP_CLIENT']) && $_SERVER['HTTP_CLIENT'] == 'api') {
echo json_encode($update);
die();
}
Session::flash('info', 'Data berhasil diperbarui'); Session::flash('info', 'Data berhasil diperbarui');
Redirect::to('/'); Redirect::to('/');
} else { } else {

View File

@ -1,56 +1,26 @@
<?php <?php
namespace App\Models; namespace App\Models;
class Access extends \Core\Model use App\Config;
class Access
{ {
public function __construct() private static $conn;
private static function connectDB()
{ {
$this->createTable(
[
'id int(3) NOT NULL AUTO_INCREMENT',
'username varchar(25) NOT NULL',
'password char(13) NOT NULL',
'salt char(23) NOT NULL',
'full_name varchar(50) NOT NULL',
'registered_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP',
'privilege tinyint(1) NOT NULL DEFAULT 0',
'max_user int(1) NOT NULL DEFAULT 5',
'PRIMARY KEY (id)'
]
);
}
protected function createTable($fields, $table = 'users') {
try { try {
if ($fields == []) { if (!self::$conn) {
return false; $dsn = 'mysql:host='.Config::DB_HOST.';dbname='.Config::DB_DB;
self::$conn = new \PDO($dsn, Config::DB_UNAME, Config::DB_PWD);
self::$conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
} }
$sql = "CREATE TABLE IF NOT EXISTS {$table} (".implode(',', $fields).") ENGINE=InnoDB DEFAULT CHARSET=utf8;"; return self::$conn;
$db = static::connectDB();
$query = $db->prepare($sql);
$query->execute();
return true;
} catch (PDOException $e) { } catch (PDOException $e) {
throw new \Exception($e->getMessage(), 444); throw new \Exception($e->getMessage, 444);
} }
} }
public static function showAll($conditions = [], $table = 'users')
protected function dropTable($table = 'users') {
try {
$sql = "DROP TABLE IF EXISTS {$table}";
$db = static::connectDB();
$query = $db->prepare($sql);
$query->execute();
return true;
} catch (PDOException $e) {
throw new \Exception($e->getMessage(), 444);
}
}
public function showAll($conditions = [], $table = 'users')
{ {
try { try {
$db = static::connectDB(); $db = static::connectDB();
@ -100,7 +70,7 @@ class Access extends \Core\Model
} }
} }
public function entry($args, $table = 'users') public static function entry($args, $table = 'users')
{ {
if (count($args)) { if (count($args)) {
$keys = '`'.implode('`, `', array_keys($args)).'`'; $keys = '`'.implode('`, `', array_keys($args)).'`';
@ -168,7 +138,7 @@ class Access extends \Core\Model
return false; return false;
} }
public function update($args, $id, $table = 'users') public static function update($args, $id, $table = 'users')
{ {
if (count($args)) { if (count($args)) {
$keys = array_keys($args); $keys = array_keys($args);
@ -187,7 +157,7 @@ class Access extends \Core\Model
try { try {
$db = static::connectDB(); $db = static::connectDB();
$result = $this->showAll([ $result = self::showAll([
['id', '=', $id] ['id', '=', $id]
]); ]);
@ -210,16 +180,15 @@ class Access extends \Core\Model
return false; return false;
} }
public function delete($id, $status, $table = 'users') public static function delete($id)
{ {
try { try {
$db = static::connectDB(); $db = static::connectDB();
$sql = "UPDATE {$table} SET status = ? WHERE id = ?"; $sql = "UPDATE `users` SET `flag` = 0 WHERE id = ?";
$query = $db->prepare($sql); $query = $db->prepare($sql);
$query->bindValue(1, $status); $query->bindValue(1, $id);
$query->bindValue(2, $id);
$query->execute(); $query->execute();
return true; return true;

203
App/Models/ApiModel.php Normal file
View File

@ -0,0 +1,203 @@
<?php
namespace App\Models;
use App\Config;
class ApiModel
{
protected static $conn = null;
protected static function connectDB()
{
try {
if (!self::$conn) {
$dsn = 'mysql:host='.Config::DB_HOST.';dbname='.Config::DB_DB;
self::$conn = new \PDO($dsn, Config::DB_UNAME, Config::DB_PWD);
self::$conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
}
return self::$conn;
} catch (PDOException $e) {
throw new \Exception($e->getMessage, 444);
}
}
public static function fetch($table, $conditions = [])
{
$sql = "SELECT * FROM {$table}";
if ($conditions) {
$sql .= " WHERE";
foreach ($conditions as $condition) {
$keys[] = $condition[0];
$operators[] = $condition[1];
$values[] = $condition[2];
}
$x = 0;
foreach ($keys as $key) {
$sql .= " $key $operators[$x] ?";
$x++;
if ($x < count($keys)) {
$sql .= " AND";
}
}
}
try {
$con = static::connectDB();
$query = $con->prepare($sql);
if (count($conditions)) {
$x = 1;
foreach ($values as $value) {
$query->bindValue($x, $value);
$x++;
}
}
$query->execute();
return $query->fetch(\PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo "Error: $e->getMessage()";
}
}
public static function showAll($table, $conditions = [])
{
$sql = "SELECT * FROM {$table}";
if ($conditions) {
$sql .= " WHERE";
foreach ($conditions as $condition) {
$keys[] = $condition[0];
$operators[] = $condition[1];
$values[] = $condition[2];
}
$x = 0;
foreach ($keys as $key) {
$sql .= " $key $operators[$x] ?";
$x++;
if ($x < count($keys)) {
$sql .= " AND";
}
}
}
try {
$con = static::connectDB();
$query = $con->prepare($sql);
if (count($conditions)) {
$x = 1;
foreach ($values as $value) {
$query->bindValue($x, $value);
$x++;
}
}
$query->execute();
return $query->fetchAll(\PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo "Error: $e->getMessage()";
}
}
public static function update($table, $args)
{
$sql = "UPDATE {$table} SET";
$id = $args['id'];
unset($args['id']);
$keys = array_keys($args);
$fields = [];
foreach ($keys as $key) {
$fields[] = $key . " = ?";
}
if (count($fields) > 1) {
$fields = implode(', ', $fields);
} else {
$fields = implode('', $fields);
}
try {
$con = static::connectDB();
$sql .= " {$fields} WHERE id = ?";
$query = $con->prepare($sql);
$x = 1;
foreach ($args as $value) {
$query->bindValue($x, $value);
$x++;
}
$query->bindValue($x, $id);
$query->execute();
return self::showAll($table, [
['id', '=', $id]
]);
} catch (PDOException $e) {
echo "Error: $e->getMessage()";
}
}
public static function entry($table, $args)
{
$sql = "INSERT INTO {$table}";
$fields = array_keys($args);
$fields = implode(", ", $fields);
$values = "";
for ($i=1; $i <= count($args); $i++) {
$values .= "?";
if ($i < count($args)) $values .= ", ";
}
$sql .= " ({$fields}) VALUES ({$values})";
try {
$con = static::connectDB();
$query = $con->prepare($sql);
$x = 1;
foreach ($args as $value) {
$query->bindValue($x, $value);
$x++;
}
$query->execute();
$last_entry = "SELECT LAST_INSERT_ID()";
$last_entry = $con->prepare($last_entry);
$last_entry->execute();
return $last_entry->fetch();
} catch (PDOException $e) {
echo "Error: $e->getMessage()";
}
}
public static function remove($table, $id)
{
$sql = "UPDATE {$table} SET `status` = 0 WHERE `id` = ?";
try {
$con = static::connectDB();
$query = $con->prepare($sql);
$query->bindValue(1, $id);
$query->execute();
return self::showAll($table, [
['id', '=', $id]
]);
} catch (PDOException $e) {
echo "Error: $e->getMessage()";
}
}
}

View File

@ -0,0 +1,95 @@
<?php
namespace App\Models;
use App\Config;
class ClientSession
{
protected static $conn = null;
protected static function connectDB()
{
try {
if (!self::$conn) {
$dsn = 'mysql:host='.Config::DB_HOST.';dbname='.Config::DB_DB;
self::$conn = new \PDO($dsn, Config::DB_UNAME, Config::DB_PWD);
self::$conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
}
return self::$conn;
} catch (PDOException $e) {
throw new \Exception($e->getMessage, 444);
}
}
public static function fetch($args)
{
$sql = "SELECT * FROM `client_session` WHERE ";
$x = 0;
foreach ($args as $key => $value) {
$sql .= "$key=?";
if ($x < count($args)-1) {
$sql .= " AND ";
}
$x++;
}
try {
$db = static::connectDB();
$query = $db->prepare($sql);
$x = 1;
foreach ($args as $value) {
$query->bindValue($x, $value);
$x++;
}
$query->execute();
$result = $query->fetch(\PDO::FETCH_ASSOC);
} catch (PDOException $e) {
$result = $e->getMessage();
}
return $result;
}
public static function entry($args)
{
$sql = "INSERT INTO `client_session` (`ip_address`, `uid`) VALUES (?, ?)";
try {
$db = static::connectDB();
$query = $db->prepare($sql);
$query->bindValue(1, $args['ip_address']);
$query->bindValue(2, $args['uid']);
$query->execute();
$last_entry = "SELECT LAST_INSERT_ID()";
$last_entry = $db->prepare($last_entry);
$last_entry->execute();
$result = $last_entry->fetch(\PDO::FETCH_ASSOC);
return true;
} catch (PDOException $e) {
$result = $e->getMessage();
}
return $result;
}
public static function remove($ip, $id)
{
$sql = "DELETE FROM `client_session` WHERE `ip_address` = ? AND `uid` = ?";
try {
$db = static::connectDB();
$query = $db->prepare($sql);
$query->bindValue(1, $ip);
$query->bindValue(2, $id);
$query->execute();
$result = self::fetch(['uid' => $id]);
} catch (PDOException $e) {
$result = $e->getMessage();
}
return $result;
}
}

118
App/Models/Pengumuman.php Normal file
View File

@ -0,0 +1,118 @@
<?php
namespace App\Models;
use App\Config;
class Pengumuman
{
protected static $conn = null;
protected static function connectDB()
{
try {
if (!self::$conn) {
$dsn = 'mysql:host='.Config::DB_HOST.';dbname='.Config::DB_DB;
self::$conn = new \PDO($dsn, Config::DB_UNAME, Config::DB_PWD);
self::$conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
}
return self::$conn;
} catch (PDOException $e) {
throw new \Exception($e->getMessage, 444);
}
}
public static function fetch($table, $conditions = [])
{
$sql = "SELECT
pengumuman.id, pengumuman.category as category,
kategori.category as categoryName, kategori.background as background, kategori.foreground as foreground,
pengumuman.created_at, pengumuman.valid_at, pengumuman.expired_at, pengumuman.creator, pengumuman.edited_at, pengumuman.content, pengumuman.status, pengumuman.delay,
users.full_name as creatorName
FROM pengumuman INNER JOIN kategori ON pengumuman.category = kategori.id INNER JOIN users ON pengumuman.creator = users.id";
if ($conditions) {
$sql .= " WHERE";
foreach ($conditions as $condition) {
$keys[] = $condition[0];
$operators[] = $condition[1];
$values[] = $condition[2];
}
$x = 0;
foreach ($keys as $key) {
$sql .= " $key $operators[$x] ?";
$x++;
if ($x < count($keys)) {
$sql .= " AND";
}
}
}
try {
$con = static::connectDB();
$query = $con->prepare($sql);
if (count($conditions)) {
$x = 1;
foreach ($values as $value) {
$query->bindValue($x, $value);
$x++;
}
}
$query->execute();
return $query->fetch(\PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo "Error: $e->getMessage()";
}
}
public static function showAll($table, $conditions = [])
{
$sql = "SELECT
pengumuman.id, pengumuman.category as category,
kategori.category as categoryName, kategori.background as background, kategori.foreground as foreground,
pengumuman.created_at, pengumuman.valid_at, pengumuman.expired_at, pengumuman.creator, pengumuman.edited_at, pengumuman.content, pengumuman.status, pengumuman.delay,
users.full_name as creatorName
FROM pengumuman INNER JOIN kategori ON pengumuman.category = kategori.id INNER JOIN users ON pengumuman.creator = users.id";
if ($conditions) {
$sql .= " WHERE";
foreach ($conditions as $condition) {
$keys[] = $condition[0];
$operators[] = $condition[1];
$values[] = $condition[2];
}
$x = 0;
foreach ($keys as $key) {
$sql .= " $key $operators[$x] ?";
$x++;
if ($x < count($keys)) {
$sql .= " AND";
}
}
}
try {
$con = static::connectDB();
$query = $con->prepare($sql);
if (count($conditions)) {
$x = 1;
foreach ($values as $value) {
$query->bindValue($x, $value);
$x++;
}
}
$query->execute();
return $query->fetchAll(\PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo "Error: $e->getMessage()";
}
}
}

View File

@ -174,12 +174,12 @@ class Post extends \Core\Model
$values = ''; $values = '';
// This is if want to insert multiple rows // This is if want to insert multiple rows
foreach ($args as $key => $val) { // foreach ($args as $key => $val) {
if (preg_match('/,/', $val)) { // if (preg_match('/,/', $val)) {
$val = explode(',', $val); // $val = explode(',', $val);
$args[$key] = $val; // $args[$key] = $val;
} // }
} // }
$x = 1; $x = 1;
foreach ($args as $field) { foreach ($args as $field) {
@ -198,6 +198,7 @@ class Post extends \Core\Model
try { try {
$sql = "INSERT INTO {$table} ({$keys}) VALUES {$values}"; $sql = "INSERT INTO {$table} ({$keys}) VALUES {$values}";
$db = static::connectDB(); $db = static::connectDB();
$query = $db->prepare($sql); $query = $db->prepare($sql);
@ -214,6 +215,8 @@ class Post extends \Core\Model
$x++; $x++;
} }
} }
// var_dump($x);die();
$query->execute(); $query->execute();
return true; return true;

View File

@ -107,6 +107,8 @@
</section> </section>
</main> </main>
<script src="/js/rome.js"></script>
<script src="/js/simplemde.min.js"></script>
<script> <script>
rome(left, { rome(left, {
dateValidator: rome.val.beforeEq(right), dateValidator: rome.val.beforeEq(right),

View File

@ -18,7 +18,7 @@
<br> <br>
<label for="expired_at">Berlaku dari: </label> <label for="valid_at">Berlaku dari: </label>
<input id="left" name="valid_at" value="{{ timestamp }}"> <input id="left" name="valid_at" value="{{ timestamp }}">
<br> <br>
@ -53,6 +53,8 @@
</section> </section>
</main> </main>
<script src="/js/rome.js"></script>
<script src="/js/simplemde.min.js"></script>
<script> <script>
rome(left, { rome(left, {
dateValidator: rome.val.beforeEq(right), dateValidator: rome.val.beforeEq(right),

View File

@ -86,9 +86,9 @@
{% if cat.status == 1 %} {% if cat.status == 1 %}
<i class="fa fa-times-circle-o fa-fw"></i> <i class="fa fa-times-circle-o fa-fw"></i>
<span class="font-size:smaller;">Matikan</span> <span style="font-size:smaller;">Matikan</span>
{% elseif cat.status == 0 %} {% elseif cat.status == 0 %}
<i class="fa fa-check fa-fw"></i> <i style="fa fa-check fa-fw"></i>
<span class="font-size:smaller;">Aktifkan</span> <span class="font-size:smaller;">Aktifkan</span>
{% endif %} {% endif %}

View File

@ -1,34 +1,3 @@
{% extends "base.html" %} {% extends "legacy.html" %}
{% block title %}Mithril{% endblock %} {% block title %}Pengumuman{% endblock %}
{% block nav %}
<input type="checkbox" id="bmenug" class="show">
<label for="bmenug" class="burger pseudo button"><i class="fa fa-bars" aria-hidden="true"></i></label>
<div class="menu">
{% if user.privilege != "" %}
{% if user.privilege == 1 %}
<a href="/posts/category" class="navy button" data-tooltip="Kategori"><i class="fa fa-list-ul" aria-hidden="true"></i>&nbsp;Kategori</a>
<a href="/register" class="navy button" data-tooltip="User Baru"><i class="fa fa-user-plus" aria-hidden="true"></i>&nbsp;User</a>
{% endif %}
<a href="/logout" class="navy button" data-tooltip="Keluar"><i class="fa fa-sign-out" aria-hidden="true"></i>&nbsp;Keluar</a>
{% else %}
<a href="/login" class="navy hidden-hover button" data-tooltip="Masuk">
<i class="fa fa-sign-in" aria-hidden="true"></i>&nbsp;Masuk
</a>
{% endif %}
</div>
{% endblock %}
{% block body %}
<main class="documentation">
<div id="nouser" style="text-align:left;width:100%;">
<div style="background:#fff;text-align:left;width:100%;padding:10vh 0 0;">
<div id='navigasi'>
</div>
<div id="mit">
</div>
</div>
</div>
</main>
{% endblock %}

View File

@ -6,6 +6,7 @@
<input type="checkbox" id="bmenug" class="show"> <input type="checkbox" id="bmenug" class="show">
<label for="bmenug" class="burger pseudo button"><i class="fa fa-bars" aria-hidden="true"></i></label> <label for="bmenug" class="burger pseudo button"><i class="fa fa-bars" aria-hidden="true"></i></label>
<div class="menu"> <div class="menu">
<a href="https://backup.lepisi.ac.id/gregorio/lepisi-pengumuman/blob/master/README.md#dokumentasi" class="navy button" data-tooltip="Dokumentasi"><i class="fa fa-dot-circle-o" aria-hidden="true"></i></a>
{% if user.privilege != "" %} {% if user.privilege != "" %}
{% if user.privilege == 1 %} {% if user.privilege == 1 %}
<a href="/posts/category" class="navy button" data-tooltip="Kategori"><i class="fa fa-list-ul" aria-hidden="true"></i>&nbsp;Kategori</a> <a href="/posts/category" class="navy button" data-tooltip="Kategori"><i class="fa fa-list-ul" aria-hidden="true"></i>&nbsp;Kategori</a>
@ -125,9 +126,6 @@
{% endif %} {% endif %}
</div> </div>
</main> </main>
<footer class="cp">
Copyright 2017. Perguruan Tinggi Lepisi. Bingung? Lihat <a href="https://backup.lepisi.ac.id/gregorio/lepisi-pengumuman/blob/master/README.md#dokumentasi" target="_blank">dokumentasi</a>.
</footer>
<script> <script>
if (document.getElementById('slidr-div')) { if (document.getElementById('slidr-div')) {
slidr.create('slidr-div', { slidr.create('slidr-div', {

View File

@ -7,190 +7,8 @@
<link rel="stylesheet" href="/css/picnic.min.css"> <link rel="stylesheet" href="/css/picnic.min.css">
<link rel="stylesheet" href="/css/rome.css"> <link rel="stylesheet" href="/css/rome.css">
<link rel="stylesheet" href="/css/simplemde.min.css"> <link rel="stylesheet" href="/css/simplemde.min.css">
<link href="https://fonts.googleapis.com/css?family=Lobster" rel="stylesheet"> <link rel="stylesheet" href="/css/index.css">
<title>{% block title %}{% endblock %}</title> <title>{% block title %}{% endblock %}</title>
<style>
.documentation > section {
background: #fff;
text-align: left;
width: 90%;
max-width: 960px;
margin: 0 auto;
padding: 80px 0 0;
}
.flex>* {
padding-right: .6em;
}
.flex>h1, .flex>span {
padding: 0;
}
nav.transparent {
box-shadow: none;
background: none;
}
.pseudo.button {
background: transparent;
color: #111;
}
.shyButton {
font-size: .75em;
}
.shyFont {
font-size: .65em;
}
.top {
z-index: 10001;
}
td, th {
padding: .3em .45em .3em .6em;
}
.fitty {
display: inline-block;
white-space: normal;
line-height: 1em;
padding-bottom: .1em;
text-align: center;
}
#slidr-div p,
.fitty p {
margin: 0;
text-align: center;
line-height: 1;
}
@media screen and (orientation: landscape) {
#slidr-div p,
.fitty p {
font-size: 8vw;
}
}
@media screen and (orientation: portrait) {
#slidr-div p,
.fitty p {
font-size: 10vh;
}
}
.title {
font-family: 'Lobster', cursive;
font-size: x-large;
}
nav .menu>.navy {
color: #000;
background-color: transparent;
margin-right: 2.5em;
}
nav .menu>.navy:hover {
background-color: rgba(17, 17, 17, .15);
}
.navy:hover, .title:hover {
color: rgba(17, 17, 17, .3);
}
.hidden-hover {
opacity: 0;
}
.hidden-hover:hover {
opacity: 1;
}
.filter a {
text-align: center;
}
.card footer {
position: absolute;
bottom: 0;
padding-left: 0;
padding-bottom: 0;
}
.card-wrapper {
margin: 0 auto;
}
.box {
padding: 1em;
background-color: rgba(17, 17, 17, .1);
border: none;
height: 17em;
width: 17em;
margin: .6em auto;
}
.new i {
position: absolute;
top: 50%;
left: 50%;
margin-right: -50%;
transform: translate(-50%, -50%);
}
.box:hover {
background-color: rgba(17, 17, 17, .05);
}
nav {
max-width: 100vw;
}
.pengumuman {
width: 100%;
}
#info span {
width: 98%;
padding: .7em 0;
margin: 0;
}
nav a {
color: inherit;
}
.filter > div {
text-align: center;
}
.rd-month button {
color: #000;
}
.rd-container {
z-index: 5;
}
h1 {
padding: .2em 0;
}
.cp {
width: 100%;
font-size: small;
text-align: center;
position: fixed;
bottom: 0;
padding: .3em;
}
.swiper-container {
height: 100vh;
}
</style>
</head> </head>
<body> <body>
<nav> <nav>
@ -199,15 +17,7 @@
</span> </span>
{% block nav %}{% endblock %} {% block nav %}{% endblock %}
</nav> </nav>
{% block body %}{% endblock %}
{% block body %}
{% endblock %}
{% if user %}
<script src="js/index.js"></script>
{% else %}
<script src="js/landing.js"></script>
{% endif %}
<script> <script>
function fadeOutEffect() { function fadeOutEffect() {

17
App/Views/legacy.html Normal file
View File

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="/css/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" href="/css/picnic.min.css">
<link rel="stylesheet" href="/css/rome.css">
<link rel="stylesheet" href="/css/simplemde.min.css">
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<script src="/js/landing.js"></script>
<script></script>
</body>
</html>

View File

@ -1,19 +1,20 @@
<?php <?php
namespace Core; namespace Core;
use Defuse\Crypto\Key;
class Hash class Hash
{ {
public static function make($string, $salt = '') public static function make($string, $salt = '')
{ {
// return hash('sha256', $string . $salt);
// return password_hash($string, PASSWORD_BCRYPT);
return crypt($string, $salt); return crypt($string, $salt);
} }
public static function salt() public static function salt()
{ {
// return mcrypt_create_iv($length); $salt = Key::createNewRandomKey();
return uniqid(mt_rand()); $salt = $salt->saveToAsciiSafeString();
return $salt;
} }
public static function unique() public static function unique()
@ -23,8 +24,6 @@ class Hash
public static function compare($string, $salt, $hash) public static function compare($string, $salt, $hash)
{ {
// return (Hash::make($string, $salt) === $hash) ? true : false;
// return password_verify($string, $hash);
return hash_equals($hash, Hash::make($string, $salt)); return hash_equals($hash, Hash::make($string, $salt));
} }
} }

View File

@ -3,7 +3,7 @@ namespace Core;
class Router class Router
{ {
private protected
$routes = [], $routes = [],
$params = []; $params = [];
@ -32,6 +32,7 @@ class Router
{ {
$url = htmlspecialchars($url); $url = htmlspecialchars($url);
$url = substr_replace($url, '', 0, 1); $url = substr_replace($url, '', 0, 1);
$url = rtrim($url, '/');
foreach ($this->routes as $route => $params) { foreach ($this->routes as $route => $params) {
if (preg_match($route, $url, $matches)) { if (preg_match($route, $url, $matches)) {
@ -50,6 +51,66 @@ class Router
public function dispatch($url) public function dispatch($url)
{ {
// Check token
if (isset($_SERVER['HTTP_X_Token'])) {
if (!$this->checkToken($_SERVER['HTTP_X_Token'])) {
// Logout
$controller = 'Home';
$controller = $this->getNamespace($controller);
$obj = new $controller();
$obj->logout();
Redirect::to('/');
}
}
if ($url != '/login' || $url != '/') {
$query_string = $this->getQueryStringVariable($url);
if ($query_string) {
$sessid = explode('=', $query_string[0]);
$sessid = $sessid[1];
$userid = explode('=', $query_string[1]);
$userid = $userid[1];
$ip_address = isset($_SERVER['HTTP_X_FORWADED_FOR']) ? $_SERVER['HTTP_X_FORWADED_FOR'] : $_SERVER['REMOTE_ADDR'];
// Check if user login
$session = \App\Models\ClientSession::fetch([
'uid' => $userid,
'ip_address' => $ip_address,
'id' => $sessid
]);
if (is_array($session)) {
$token = Token::generate($userid);
header("X-Token: $token");
} else {
$record = \App\Models\ClientSession::fetch(['ip_address' => $ip_address]);
$obj = 'Home';
$obj = $this->getNamespace($obj);
if (is_array($record)) {
$obj = new $obj();
header('client: api');
$obj->logout($record['uid']);
die();
} else {
$obj = new $obj();
$obj->logout($userid);
}
header('Location: /');
}
} elseif ($query_string == false) {
$ip_address = isset($_SERVER['HTTP_X_FORWADED_FOR']) ? $_SERVER['HTTP_X_FORWADED_FOR'] : $_SERVER['REMOTE_ADDR'];
$record = \App\Models\ClientSession::fetch(['ip_address' => $ip_address]);
if (is_array($record)) {
$obj = 'Home';
$obj = $this->getNamespace($obj);
$obj = new $obj();
$obj->logout($record['uid']);
// header('Location: /');
// die();
}
}
}
$url = $this->removeQueryStringVariable($url); $url = $this->removeQueryStringVariable($url);
if ($this->match($url)) { if ($this->match($url)) {
$controller = $this->params['controller']; $controller = $this->params['controller'];
@ -66,30 +127,29 @@ class Router
// Check if there's input to the current page // Check if there's input to the current page
if (Input::exists('post')) { if (Input::exists('post')) {
$var = $_POST; $var = $_POST;
// Check the token // } elseif (Input::exists('get')) {
if (Token::check($var['_token'])) { // $get_var = $_GET;
// Get the method } elseif ($_SERVER['REQUEST_METHOD'] != '') {
if (isset($var['_method'])) { $data = json_decode(file_get_contents('php://input'), true);
$action = $var['_method'];
}
} else {
// Token invalid
throw new \Exception("Token invalid", 498);
}
unset($var['_token']);
unset($var['_method']);
} elseif (Input::exists('get')) {
$get_var = $_GET;
} }
if (isset($var['_method'])) {
$action = $var['_method'];
unset($var['_method']);
}
if (array_key_exists('id', $this->params)) { if (array_key_exists('id', $this->params)) {
$var['id'] = $this->params['id']; $var['id'] = $this->params['id'];
} elseif (array_key_exists('status', $this->params)) { } elseif (array_key_exists('status', $this->params)) {
$get_var = preg_replace('/^[a-z]+=/', '', $get_var['status']); $get_var = preg_replace('/^[a-z]+=/', '', $get_var['status']);
} }
if (isset($var)) { if (isset($var)) {
return $object->$action($var); return $object->$action($var);
} elseif (isset($get_var)) { } elseif (isset($get_var)) {
return $object->$action($get_var); return $object->$action($get_var);
} elseif (isset($data)) {
return $object->$action($data);
} else { } else {
return $object->$action(); return $object->$action();
} }
@ -103,20 +163,31 @@ class Router
private function removeQueryStringVariable($url) private function removeQueryStringVariable($url)
{ {
$parts = explode('&', $url); $parts = explode('&', $url);
return $url = $parts[0]; $parts = explode('?', $parts[0]);
return $parts[0];
} }
private function convertToStudlyCaps($string) protected function getQueryStringVariable($url)
{
$exploded = explode('?', $url);
if (isset($exploded[1])) {
$variables = explode('&', $exploded[1]);
return $variables;
}
return false;
}
protected function convertToStudlyCaps($string)
{ {
return str_replace(' ', '', ucwords(str_replace('-', ' ', $string))); return str_replace(' ', '', ucwords(str_replace('-', ' ', $string)));
} }
private function getNamespace($controller) protected function getNamespace($controller)
{ {
return $namespace = 'App\Controllers\\' . $controller; return $namespace = 'App\Controllers\\' . $controller;
} }
private function convertToCamelCaps($string) protected function convertToCamelCaps($string)
{ {
return lcfirst($this->convertToStudlyCaps($string)); return lcfirst($this->convertToStudlyCaps($string));
} }

71
Core/RouterApi.php Normal file
View File

@ -0,0 +1,71 @@
<?php
namespace Core;
use App\Controllers\Api;
use App\Controllers\Home;
class RouterApi extends Router
{
public function dispatchApi($url)
{
if (isset($_SERVER['HTTP_X_TOKEN']) && Token::validate($_SERVER['HTTP_X_TOKEN']) != true) {
// Logout
$obj = new Home();
$obj->logout();
header('Location: /');
}
if (isset($_SERVER['HTTP_X_QUERY'])) {
// $obj = new Home();
// $obj->logout();
// header('Location: /');
$query_string = $this->getQueryStringVariable($_SERVER['HTTP_X_QUERY']);
$sessid = explode('=', $query_string[0]);
$sessid = $sessid[1];
$userid = explode('=', $query_string[1]);
$userid = $userid[1];
// Check if user login
$session = \App\Models\ClientSession::fetch([
'uid' => $userid,
'id' => $sessid
]);
if (is_array($session)) {
$token = Token::generate($userid);
header("X-Token: $token");
} else {
$response = [];
$response['status'] = 401;
$response['message'] = 'Unauthorized';
echo json_encode($response); die();
// $ip_address = isset($_SERVER['HTTP_X_FORWADED_FOR']) ? $_SERVER['HTTP_X_FORWADED_FOR'] : $_SERVER['REMOTE_ADDR'];
// $record = \App\Models\ClientSession::fetch(['ip_address' => $ip_address]);
// $obj = 'Home';
// $obj = $this->getNamespace($obj);
// if (is_array($record)) {
// $obj = new $obj();
// $obj->logout($record['uid']);
// } else {
// $obj = new $obj();
// $obj->logout($userid);
// }
// header('Location: /');
die();
}
}
$object = new Api();
if (isset($this->params['action'])) {
$action = $this->params['action'];
return $object->$action();
} else {
$method = $_SERVER['REQUEST_METHOD'];
$model = $this->params['model'];
}
return (isset($this->params['id'])) ?
$object->$method($model, $this->params['id'])
:
$object->$method($model, "", (Input::exists('get')) ? $_GET : []);
}
}

View File

@ -1,43 +1,95 @@
<?php <?php
namespace Core; namespace Core;
use App\Models\ApiModel;
use App\Models\ClientSession;
use Defuse\Crypto\Crypto;
use Defuse\Crypto\Key;
class Token class Token
{ {
public static function generate() public static function generate($id)
{ {
if(!Session::exists('tokens')) // $user = ApiModel::fetch('users', [
{ // ['id', '=', $id]
Session::put('tokens', []); // ]);
} // $token = Hash::make($user['full_name'] . $user['salt'], $user['salt']);
$tokens = Session::get('tokens'); // Token exists for x seconds
$expires = 60;
// Talk to database
// Get salt
$user = ApiModel::fetch('users', [
['id', '=', $id]
]);
$salt = $user['salt'];
// Get hash string
$session = ClientSession::fetch(['uid' => $id]);
$hash_string = $session['id'].$session['ip_address'];
// Create array
$array_token = [
'uid' => $id,
'expires' => time() + $expires,
'token' => Hash::make($hash_string, $salt)
];
// Convert array to string and to base64
$token = serialize($array_token);
$token = base64_encode($token);
// Create a key
$key = Key::loadFromAsciiSafeString($salt);
// Encrypt token
$token = Crypto::encrypt($token, $key);
// Configure token (\$id.token)
// Convert id to base64
$id = base64_encode($id);
$token = '\$'.$id.'.'.$token;
if(count($tokens) >= 10) return $token;
{
array_shift($tokens);
}
$tokens[] = md5(uniqid());
Session::put('tokens', $tokens);
return end($tokens);
} }
public static function check($token) public static function validate($token)
{ {
$tokenName = 'tokens'; $request_token = self::fetch($token);
$tokenNow = $token;
if(Session::exists($tokenName)) $exploded = explode('.', $token);
{ $id = self::getId($exploded[0]);
if(in_array($tokenNow, Session::get($tokenName)))
{
Session::delete($tokenName);
return true;
}
}
return false; $user = ApiModel::fetch('users', [
['id', '=', $id]
]);
$salt = $user['salt'];
$session = ClientSession::fetch(['uid' => $id]);
$hash_string = $session['id'].$session['ip_address'];
$server_token = Hash::make($hash_string, $salt);
if ($request_token['expires'] >= time() && $request_token['token'] == $server_token) {
return true;
}
return false;
} }
public static function fetch($token)
{
// Get id and token
$exploded = explode('.', $token);
$id = self::getId($exploded[0]);
$token = $exploded[1];
$user = ApiModel::fetch('users', [
['id', '=', $id]
]);
$key = $user['salt'];
$key = Key::loadFromAsciiSafeString($key);
$token = Crypto::decrypt($token, $key);
$token = base64_decode($token);
$token = unserialize($token);
return $token;
}
public static function getId($raw_id)
{
return base64_decode(substr_replace($raw_id, '', 0, 2));
}
} }

247
README.md
View File

@ -1,123 +1,162 @@
# Dokumentasi # Dokumentasi
Aplikasi berbasis web yang bertujuan menampilkan informasi berupa pengumuman kepada seluruh pihak pada [**Perguruan Tinggi LEPISI**][8c020676]. Panduan penggunaan aplikasi.
[8c020676]: http://lepisi.ac.id "LEPISI" *Catatan :*
1. Semua bentuk tanggal dalam aplikasi ini ditampilkan dalam format `YYYY-MM-DD` (4 digit tahun - 2 digit bulan - 2 digit tanggal).
## Tampilan 2. Perpindahan antar halaman menggunakan `navigasi`.
3. Untuk kembali ke halaman awal, klik pada logo *Live Info*.
### Resolusi 4. Pada setiap proses yang dijalankan, akan ada notifikasi pemberitahuan yang terletak di atas (bagian tengah `navigasi`). Notifikasi tersebut dapat ditutup dengan cara klik pada notifikasi tersebut.
Seluruh halaman ditampilkan dalam bentuk `full-screen`, sehingga menyesuaikan ukuran layar. 5. Jika terjadi `error` atau kesalahan pada aplikasi, silahkan refresh halaman dengan menekan tombol `F5` pada keyboard.
### Label Pemberitahuan
Label pemberitahuan adalah sebuah label yang berfungsi untuk menampilkan pemberitahuan kepada pengguna. Pemberitahuan ini dapat berupa `error`, maupun informasi tambahan (konfirmasi berhasil unggah data, dll). <a href="#menutup-label">`Cara menutup label`</a>.
![label](images/2017/09/2017-09-25-111613_1366x768_scrot.jpg)
### Tampilan Awal
Halaman yang pertama kali ditampilkan adalah halaman yang menampilkan pengumuman dalam ukuran teks yang besar. Jika jumlah pengumuman lebih dari 1, maka setiap pengumuman akan ditampilkan dengan metode animasi bergeser.<br>
Halaman inilah yang ditampilkan ke umum.
![tampilan-awal](images/2017/09/2017-09-25-110501_1366x768_scrot.png)
#### Navigasi
Secara kasat mata, terlihat tidak ada tombol navigasi pada halaman awal. Tetapi, telah tersedia tombol `masuk` (_login_) untuk `user` yang memiliki hak untuk mengubah/menambahkan/menonaktifkan sebuah pengumuman.<br>
![navigasi](images/2017/09/Screenshot from 2017-09-25 09-46-30_1.jpg)
Tombol ini berada di sisi kanan atas halaman, jika user mengarahkan kursor ke sisi tersebut, maka tombol tersebut akan terlihat.
![navigasi-masuk](images/2017/09/Screenshot from 2017-09-25 09-51-02_1.jpg)
### Halaman Login/Masuk
Pada halaman ini, pengguna dapat memasukkan data akun mereka (`username` dan `password`) untuk mendapatkan hak akses untuk mengubah/menambahkan/menonaktifkan pengumuman. <a href="#masuklogin">`Cara masuk/login`</a>.
![masuk-login](images/2017/09/Screenshot from 2017-09-25 09-53-27.jpg)
### Halaman Administrator
Setelah pengguna memasukkan data dengan benar, maka pengguna akan dialihkan ke halaman awal dengan tampilan yang berbeda.<br>
Pada halaman ini ditampilkan seluruh pengumuman yang telah dibuat dalam bentuk `stack` atau berupa kotak-kotak. Pada halaman ini juga terdapat 2 navigasi yaitu `primary` dan `secondary`. <a href="#masuklogin">`Cara masuk/login`</a>.
![halaman-admin](images/2017/09/2017-09-25-135939_1366x768_scrot.jpg)
#### Navigasi
Terdapat 2 jenis navigasi pada halaman administrator, yaitu `primary` dan `secondary`. Navigasi `primary` berfungsi untuk membantu pengguna untuk beralih antar halaman. Sedangkan navigasi `secondary` berfungsi untuk membantu pengguna untuk men-sortir pengumuman yang ingin ditampilkan.
##### Primary
Tersedia tombol `home` pada sisi kiri atas.<br>
> NB: Pada `mobile-view`, navigasi `primary` tersembunyi oleh tombol `menu` (3 garis horizontal) pada sisi kanan atas.
###### Hak Akses User
Terdapat tombol `keluar` (_logout_) yang terletak pada sisi kanan atas, yang berfungsi untuk melepaskan hak akses dari pengguna (_logout_). <a href="#keluarlogout">`Cara keluar/logout`</a>.
![navigasi-user](images/2017/09/Screenshot from 2017-09-25 09-58-10_1.jpg)
###### Hak Akses Admin
Terdapat 3 tombol yang terletak pada sisi kanan atas, yaitu `kategori`, `user`, dan `keluar`.<br>
Tombol `kategori` berfungsi untuk mengalihkan pengguna ke halaman `Kategori`.<br>
Tombol `user` berfungsi untuk mengalihkan pengguna ke halaman registrasi `user` baru.
Tombol `keluar` berfungsi untuk melepaskan hak akses dari pengguna (_logout_).
![navigasi-admin](images/2017/09/Screenshot from 2017-09-25 09-56-35_1.jpg)
##### Secondary
Navigasi ini berupa 4 tombol _sortir_ (`Semua`, `Aktif`, `Belum Aktif`, `Nonaktif`), yang berguna untuk men-_sortir_ pengumuman yang ingin ditampilkan berdasarkan status pengumuman tersebut.
![navigasi-secondary](images/2017/09/Screenshot from 2017-09-25 09-58-10_2.jpg)
#### Daftar Pengumuman
Setiap pengumuman ditampilkan dalam bentuk sebuah kotak yang memiliki warna sesuai warna dari kategori pengumuman tersebut.<br> Dalam setiap kotak pengumuman, terdapat tanggal berlaku dan tanggal berakhir pengumuman tersebut, isi/konten dari pengumuman tersebut, serta tombol `Ubah` dan tombol `Matikan`/`Aktifkan`. <a href="#mengubah-pengumuman">`Cara mengubah pengumuman`</a>. <a href="#menonaktifkan-pengumuman">`Cara menonaktifkan pengumuman`</a>. <a href="#mengaktifkan-pengumuman">`Cara mengaktifkan pengumuman`</a>.<br>
Posisi kotak paling kiri/awal (berbentuk +) merupakan tombol untuk menambahkan atau membuat pengumuman baru. <a href="#menambah-pengumuman-baru">`Cara menambah pengumuman`</a>.
![daftar-pengumuman](images/2017/09/2017-09-25-105313_1366x768_scrot_1.jpg)
### Halaman Registrasi User
Halaman ini ditujukan untuk keperluan penambahan `user` baru. Pada halaman ini tersedia sebuah formulir pendaftaran. Pada formulir ini terdapat 3 `input` berupa teks (`Nama Lengkap`, `Username`, dan `Password`), diikuti di bawahnya sebuah tombol registrasi. <a href="#registrasi-user-baru">`Cara registrasi user baru`</a>.
![registrasi-user](images/2017/09/Screenshot from 2017-09-25 10-01-40.jpg)
### Halaman Kategori
Pada halaman ini terbagi menjadi 2 sisi. Sisi sebelah kiri adalah formulir untuk menambahkan kategori baru. Sementara sisi sebelah kanan adalah daftar kategori yang telah dibuat.<br>
![kategori](images/2017/09/Screenshot from 2017-09-25 10-02-28.jpg)
Pada formulir penambahan kategori baru, terdapat 1 `input` berupa teks (diisi dengan nama kategori baru), 2 `input` berupa warna (`Background`, dan `Foreground`), dan diikuti 1 tombol penambahan. <a href="#menambah-kategori">`Cara menambah kategori`</a>.<br>
![tambah-kategori](images/2017/09/Screenshot from 2017-09-25 10-02-28_2.jpg)
Pada daftar kategori, untuk setiap kategori, terdapat nama kategori (termasuk warna `background` dan `foreground` kategori tersebut.), serta 2 tombol, yaitu tombol `Ubah` dan tombol `Matikan`/`Aktifkan`. Tombol `Ubah` berfungsi untuk mengalihkan pengguna ke halaman baru (memiliki layout sama seperti halaman kategori) untuk mengubah kategori tersebut (nama, `background`, atau `foreground`). Tombol `Matikan` berfungsi untuk menonaktifkan kategori tersebut sehingga tidak dapat digunakan dalam pembuatan pengumuman baru. Sedangkan tombol `Aktifkan` berfungsi untuk mengaktifkan sebuah kategori sehingga dapat digunakan dalam pembuatan pengumuman baru. <a href="#mengubah-kategori">`Cara mengubah kategori`</a>. <a href="#menonaktifkan-kategori">`Cara menonaktifkan kategori`</a>. <a href="#mengkatifkan-kategori">`Cara mengaktifkan kategori`</a>.<br>
![daftar-pengumuman](images/2017/09/Screenshot from 2017-09-25 10-02-28_3.jpg)
## Penggunaan # Landing Page
Tampilan yang disajikan pada awal mengunjungi halaman ini.
Terbagi menjadi 2 bagian, yaitu `navigasi` dan `konten`.
### Masuk/Login Pada `navigasi` terdapat logo *Live Info* pada bagian kiri, dan terdapat tombol *Masuk* atau `login` yang hanya dapat di lihat jika anda mengarahkan kursor ke tombol tersebut. Tombol ini berada di sisi kanan `navigasi`.
Beralih ke <a href="#halaman-loginmasuk">`Halaman Login/Masuk`</a> lalu masukkan `username` dan `password` dari `user` yang sudah terdaftar, setelah itu klik tombol `Masuk`. Jika berhasil, maka akan muncul label `Berhasil masuk`.
### Keluar/Logout Bagian `konten` berisi pengumuman-pengumuman yang tersedia (disediakan oleh admin). Pengumuman-pengumuman ini secara bergilir ditampilkan dengan animasi transisi `slide`.
Klik tombol `Keluar` yang terletak pada pojok kanan atas navigasi `primary`. Jika berhasil, maka akan muncul label `Berhasil keluar` dan dialihkan ke <a href="#halaman-awal">`Halaman Awal`</a>.
### Registrasi User Baru ###### *Screenshot :*
Untuk mendaftarkan user baru, ada 3 data yang diperlukan pada <a href="#halaman-registrasi-user">`Halaman Registrasi User`</a>. `Nama Lengkap` merupakan nama lengkap/asli dari user baru. `username` dan `password` merupakan data yang nanti digunakan user baru untuk dapat `masuk`/`login`. Setelah semua data terisi, klik pada tombol `Registrasi`. ![landingpage](images/screenshots/landingpage.jpg)
> NB: Hanya `admin` yang dapat menambahkan user baru.
### Pengumuman ---
Pengguna hanya dapat melakukan perubahan pada pengumuman yang dibuat oleh dirinya sendiri. # Login Page
Tampilan yang disajikan ketika user akan melakukan `login`.
Terbagi menjadi 2 bagian, yaitu `navigasi` dan `konten`.
#### Membuat Pengumuman Baru Bagian `navigasi` mirip dengan `navigasi` pada <a href="#landing-page">**Landing Page**</a>, hanya tidak terdapat tombol *Masuk*. Untuk kembali ke <a href="#landing-page">**Landing Page**</a>, hanya perlu klik pada logo *Live Info*.
Klik pada tombol `+` yang ada pada <a href="#halaman-administrator">`Halaman Administrator`</a> (akan dialihkan ke <a href="#halaman-pengumuman-baru">`Halaman Pengumuman Baru`</a>). Pilih kategori dari pengumuman yang akan dibuat. Pilih tanggal berlaku dan tanggal berakhir pengumuman tersebut (jika tidak diubah, maka secara otomatis menggunakan tanggal hari ini). Setelah itu, isi konten dari pengumuman tersebut. Setelah selesai, klik tombol `Unggah` yang terletak di bawah formulir. Jika berhasil, maka akan ada label `Data berhasil diunggah`.
#### Mengubah Pengumuman Pada bagian `konten` terdapat sebuah `form` yang memiliki 2 data yang harus di isi untuk dapat `login`, yaitu `username` dan `password`.
Klik tombol `Ubah` pada pengumuman yang akan diubah. Pengguna dapat mengubah kategori, tanggal berlaku dan berakhir, serta isi dari pengumuman tersebut. Setelah selesai, klik tombol `Ubah` yang terletak di bawah formulir. Jika berhasil akan muncul label `Data berhasil diperbarui`.
#### Menonaktifkan Pengumuman ###### *Screenshot :*
Klik tombol `Matikan` pada pengumuman yang akan dinonaktifkan. Jika berhasil akan muncul label `Data berhasil dinonaktifkan`. ![loginpage](images/screenshots/loginpage.jpg)
#### Mengaktifkan Pengumuman ---
Klik tombol `Aktifkan` pada pengumuman yang akan diaktifkan. Jika berhasil, maka akan muncul label `Data berhasil diperbarui` dan tanggal berlaku dari pengumuman tersebut secara otomatis diubah ke tanggal hari ini. # Administrator Page
Tampilan yang disajikan setelah user berhasil `login`.
Terbagi menjadi 3 bagian, yaitu `navigasi`, `navigasi sekunder`, dan `konten`.
### Kategori Pada `navigasi` terdapat logo *Live Info* pada bagian kiri, serta 4 tombol pada bagian kanan. Tombol-tombol tersebut adalah:
Hanya `admin` yang dapat mengubah sebuah kategori. - *Dokumentasi*, membuka tab baru yang akan menampilkan halaman ini.
- *Kategori*, mengalihkan ke halaman untuk mengubah dan menambah kategori.
- *User*, mengalihkan ke halaman untuk menambah user baru. Hanya user dengan hak `administrator` yang memiliki akses ke halaman ini.
- *Profil*, mengalihkan ke halaman untuk mengubah profil.
- *Keluar*, berfungsi jika user ingin `logout`.
#### Menambah Kategori Bagian `navigasi sekunder` merupakan navigasi yang berfungsi untuk menyaring pengumuman yang ingin di lihat. Terdapat 4 kategori penyaringan, yaitu:
Beralih ke <a href="#halaman-kategori">`Halaman Kategori`</a>. Masukkan nama kategori (tidak dapat sama dengan kategori yang sudah tersedia). Pilih warna `background` dan `foreground`. Klik tombol `Tambah`. Jika berhasil akan muncul label `Data berhasil diunggah`. - *Semua*, menampilkan semua pengumuman yang telah dibuat.
> NB: `Background` adalah warna latar yang digunakan pada pengumuman. `Foreground` adalah warna teks yang digunakan pada pengumuman. - *Aktif*, menampilkan semua pengumuman yang aktif.
- *Belum Aktif*, menampilkan semua pengumuman yang belum aktif.
- *Nonaktif*, menampilkan semua pengumuman yang tidak aktif (`expired`).
#### Mengubah Kategori Bagian `konten` berisi daftar semua pengumuman yang telah dibuat (atau yang telah disaring melalui `navigasi sekunder`). Daftar ini ditampilkan dalam bentuk box/kotak yang terdiri dari 3 bagian, yaitu pada bagian atas merupakan informasi singkat tentang pengumuman tersebut (pembuat, tanggal dibuat, kategori, masa aktif, tanggal edit/ubah), lalu pada bagian tengah terdapat isi dari pengumuman tersebut, dan pada bagian bawah terdapat 2 tombol, yaitu:
Beralih ke <a href="#halaman-kategori">`Halaman Kategori`</a>. Klik tombol `Ubah` pada kategori yang akan diubah. Ubah data dari kategori tersebut. Klik `Ubah` yang terletak di bawah formulir (sisi sebelah kiri). - *Ubah*, untuk mengubah pengumuman yang dipilih.
- *Aktifkan*/*Matikan*, mengaktifkan/menonaktifkan pengumuman yang dipilih.
#### Menonaktifkan Kategori > Jika pengumuman tidak aktif atau `expired` maka kedua tombol tersebut tidak tersedia, tetapi digantikan dengan tulisan yang menyatakan bahwa pengumuman tersebut tidak aktif).
Beralih ke <a href="#halaman-kategori">Halaman Kategori</a>. Klik tombol `Matikan` pada kategori yang akan dinonaktifkan. Jika berhasil, akan muncul label `Data berhasil dinonaktifkan` dan tombol `Matikan` berubah menjadi tombol `Aktifkan`. > Hanya user yang membuat pengumuman tersebut yang dapat mengubah dan/atau mengaktifkan/menonaktifkan pengumuman tersebut, terkecuali `administrator` memiliki hak kepada semua pengumuman.
#### Mengaktifkan Kategori ###### *Screenshot :*
Beralih ke <a href="#halaman-kategori">`Halaman Kategori`</a>. Klik tombol `Aktifkan` pada kategori yang akan diaktifkan. Jika berhasil, akan muncul label `Data berhasil diperbarui` dan tombol `Aktifkan` berubah menjadi tombol `Matikan`. ![administratorpage](images/screenshots/administratorpage.jpg)
### Label ---
# New-Post Page
Tampilan yang disajikan ketika user ingin menambah pengumuman baru.
Terbagi menjadi 2 bagian, yaitu `navigasi` dan `konten`.
#### Menutup Label Bagian `navigasi` sama seperti yang ada pada <a href="#administrator-page">**Administrator Page**</a>.
Klik pada label tersebut.~
Pada bagian `konten` terdapat sebuah `form` yang harus di isi oleh user untuk membuat pengumuman baru. Terdapat 4 data yang harus di isi, yaitu:
- *Kategori*, yaitu kategori dari pengumuman tersebut.
- *Berlaku dari*, tanggal pengumuman tersebut mulai aktif.
- *Berlaku sampai*, tanggal pengumuman tersebut `expire`.
- *Konten*, isi dari pengumuman tersebut. User dapat memodifikasi isi dari pengumuman yang ingin dibuat, seperti menebalkan huruf (`bold`), memiringkan huruf (`italic`), dan lain-lain.
###### *Screenshot :*
![newpostpage](images/screenshots/newpostpage.jpg)
---
# Edit-Post Page
Tampilan yang disajikan ketika user akan mengubah sebuah pengumuman.
Terbagi menjadi 2 bagian, yaitu `navigasi` dan `konten`.
Bagian `navigasi` sama seperti yang ada pada <a href="#administrator-page">**Administrator Page**</a>.
Pada bagian `konten` terdapat sebuah `form` yang sama seperti `form` pada <a href="#new-post-page">**New-Post Page**</a>, hanya pada `form` ini telah terisi data sesuai pengumuman yang akan diubah.
###### *Screenshot :*
![editpostpage](images/screenshots/editpostpage.jpg)
---
# Category Page
Tampilan yang disajikan setelah user klik pada tombol *Kategori* pada `navigasi`.
Terbagi menjadi 2 bagian, yaitu `navigasi` dan `konten`.
Bagian `navigasi` sama seperti yang ada pada <a href="#administrator-page">**Administrator Page**</a>.
Bagian `konten` terbagi menjadi 2 bagian, yaitu pada bagian kiri adalah `form` untuk membuat kategori baru, dan pada bagian kanan merupakan daftar kategori yang telah dibuat.
Untuk membuat kategori baru, pengguna harus mengisi `form` yang tersedia, yang terdapat 3 data yang harus di isi lengkap, yaitu:
- *Nama*, nama dari kategori yang akan dibuat.
- *Background*, warna latar yang akan ada pada pengumuman yang menggunakan kategori ini.
- *Foreground*, warna tulisan yang akan digunakan pada pengumuman yang menggunakan kategori ini.
Pada daftar kategori, user dapat memodifikasi sebuah kategori. Pada setiap kategori, terdapat nama kategori tersebut beserta warna *background* dan warna *foreground* dari kategori tersebut. Lalu di bawahnya terdapat 2 tombol yaitu:
- *Ubah*, mengalihkan ke halaman untuk mengubah sebuah kategori.
- *Aktifkan*/*Matikan*, mengaktifkan/menonaktifkan kategori yang dipilih.
> Kategori yang tidak aktif tidak akan ditampilkan dalam pembuatan pengumuman baru.
> Jika terdapat pengumuman yang sedang aktif dengan kategori yang dipilih, maka kategori tersebut tidak dapat dinonaktifkan.
###### *Screenshot :*
![categorypage](images/screenshots/categorypage.jpg)
---
### Edit-Category Page
Tampilan yang disajikan setelah user klik tombol *Ubah* pada daftar kategori yang terdapat pada <a href="#category-page">**Category Page**</a>.
Terbagi menjadi 2 bagian, yaitu `navigasi` dan `konten`.
Bagian `navigasi` sama seperti yang ada pada <a href="#administrator-page">**Administrator Page**</a>.
Bagian `konten` terdapat sebuah `form` yang sama seperti `form` pada <a href="#category-page">**Category Page**</a>. Pengguna harus mengisi data yang ingin diubah dari kategori tersebut.
###### *Screenshot :*
![editcategorypage](images/screenshots/editcategorypage.jpg)
---
# New-User Page
Tampilan yang disajikan setelah user klik pada tombol *Kategori* pada `navigasi`.
Terbagi menjadi 2 bagian, yaitu `navigasi` dan `konten`.
Bagian `navigasi` sama seperti yang ada pada <a href="#administrator-page">**Administrator Page**</a>.
Pada bagian `konten` terdapat sebuah `form` untuk mendaftarkan user baru yang terdiri dari 3 data yang harus diisi, yaitu:
- *Nama Lengkap*, nama dari user baru.
- *Username*, username yang digunakan pada saat `login`.
- *Password*, password yang digunakan pada saat `login`.
###### *Screenshot :*
![newuserpage](images/screenshots/newuserpage.jpg)
---
# Profile Page
Tampilan yang disajikan setelah user klik pada tombol *Profil* pada `navigasi`.
Terbagi menjadi 2 bagian, yaitu `navigasi` dan `konten`.
Halaman ini memiliki `navigasi` yang sama seperti pada <a href="#administrator-page">**Administrator Page**</a>.
Pada bagian `konten` terdapat sebuah `form` untuk mengubah profil. Bagian profil yang dapat diubah adalah *Nama Lengkap* dan *Password*.
Ketika user klik pada `input` *Password*, maka kolom *Password* akan memiliki 3 `input`, yaitu:
- *Password Baru*: `password` baru.
- *Password Lama*: `password` lama yang ingin diganti.
- *Ulangi Password Baru*: user diminta untuk mengetik ulang `password` barunya.
Jika user klik pada tombol *Simpan*, maka data user tersebut akan diperbarui sesuai isi `form` tersebut. Setelah proses berhasil, maka user akan `logout` secara otomatis.
###### *Screenshot :*
![profilepage](images/screenshots/profilepage.jpg)
---
Jika masih belum jelas, silahkan kirim e-mail ke <a href="mailto:gregorio@lepisi.ac.id">gregorio@lepisi.ac.id</a>.

251
assets/css/index.css Normal file
View File

@ -0,0 +1,251 @@
@font-face {
font-family: 'Lobster';
font-style: normal;
font-weight: 400;
src: local('Lobster'), local('Lobster-Regular'), url(/font/Lobster.woff) format('woff');
}
.documentation > section {
background: #fff;
text-align: left;
width: 90%;
max-width: 960px;
margin: 0 auto;
padding: 80px 0 0;
}
.flex>* {
padding-right: .6em;
}
.flex>h1, .flex>span {
padding: 0;
}
nav.transparent {
box-shadow: none;
background: none;
}
.pseudo.button {
background: transparent;
color: #111;
}
.shyButton {
font-size: .75em;
}
.shyFont {
font-size: .75em;
}
.top {
position: relative;
z-index: 10001;
}
td, th {
padding: .3em .45em .3em .6em;
}
.fitty {
display: inline-block;
white-space: normal;
line-height: 1em;
padding-bottom: .1em;
text-align: center;
}
.fitThis {
padding-top: 13vh;
}
#slidr-div p,
.fitty p,
.fitThis p {
margin: 0;
text-align: center;
line-height: 1.1;
padding: 0 5vw;
}
@media screen and (orientation: landscape) {
#slidr-div p,
.fitty p {
font-size: 8vw;
}
}
@media screen and (orientation: portrait) {
#slidr-div p,
.fitty p {
font-size: 10vh;
}
}
.title {
font-family: 'Lobster', cursive;
font-size: x-large;
}
.title,
.navy,
.new,
section > h2,
label,
section h1 {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
nav .menu>.navy {
color: #000;
background-color: transparent;
margin-right: 2.5em;
}
nav .menu>.navy:hover {
background-color: rgba(17, 17, 17, .15);
}
.navy:hover, .title:hover {
color: rgba(17, 17, 17, .3);
}
.hidden-hover {
opacity: 0;
}
.hidden-hover:hover {
opacity: 1;
}
.filter a {
text-align: center;
}
.card footer {
position: absolute;
bottom: 0;
padding-left: 0;
padding-bottom: 0;
}
.card-wrapper {
margin: 0 auto;
}
.box {
padding: 1em;
background-color: rgba(17, 17, 17, .1);
border: none;
height: 17em;
width: 17em;
margin: .6em auto;
}
.new i {
position: absolute;
top: 50%;
left: 50%;
margin-right: -50%;
transform: translate(-50%, -50%);
}
.box:hover {
background-color: rgba(17, 17, 17, .05);
}
nav {
max-width: 100vw;
}
.pengumuman {
width: 100%;
}
#info span {
width: 98%;
padding: .7em 0;
margin: 0;
}
nav a {
color: inherit;
}
.filter > div {
text-align: center;
}
.rd-month button {
color: #000;
}
.rd-container {
z-index: 5;
}
h1 {
padding: .2em 0;
}
.cp {
width: 100%;
font-size: small;
text-align: center;
position: fixed;
bottom: 0;
padding: .3em;
}
.swiper-container {
height: 100vh;
}
.loading {
position: absolute;
top: 50%;
left: 50%;
}
.loading-bar {
display: inline-block;
margin: .1em;
width: 4px;
height: 18px;
border-radius: 4px;
animation: loading 1s ease-in-out infinite;
}
.loading-bar:nth-child(1) {
background-color: #3498db;
animation-delay: 0;
}
.loading-bar:nth-child(2) {
background-color: #c0392b;
animation-delay: 0.09s;
}
.loading-bar:nth-child(3) {
background-color: #f1c40f;
animation-delay: .18s;
}
.loading-bar:nth-child(4) {
background-color: #27ae60;
animation-delay: .27s;
}
@keyframes loading {
0% {
transform: scale(1);
}
20% {
transform: scale(1, 2.2);
}
40% {
transform: scale(1);
}
}
.noTrans {
transition: none;
}

View File

@ -0,0 +1,7 @@
I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project,
Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome,
comprehensive icon sets or copy and paste your own.
Please. Check it out.
-Dave Gandy

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

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.

View File

@ -0,0 +1,34 @@
// Animated Icons
// --------------------------
.@{fa-css-prefix}-spin {
-webkit-animation: fa-spin 2s infinite linear;
animation: fa-spin 2s infinite linear;
}
.@{fa-css-prefix}-pulse {
-webkit-animation: fa-spin 1s infinite steps(8);
animation: fa-spin 1s infinite steps(8);
}
@-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);
}
}

View File

@ -0,0 +1,25 @@
// Bordered & Pulled
// -------------------------
.@{fa-css-prefix}-border {
padding: .2em .25em .15em;
border: solid .08em @fa-border-color;
border-radius: .1em;
}
.@{fa-css-prefix}-pull-left { float: left; }
.@{fa-css-prefix}-pull-right { float: right; }
.@{fa-css-prefix} {
&.@{fa-css-prefix}-pull-left { margin-right: .3em; }
&.@{fa-css-prefix}-pull-right { margin-left: .3em; }
}
/* Deprecated as of 4.4.0 */
.pull-right { float: right; }
.pull-left { float: left; }
.@{fa-css-prefix} {
&.pull-left { margin-right: .3em; }
&.pull-right { margin-left: .3em; }
}

View File

@ -0,0 +1,12 @@
// Base Class Definition
// -------------------------
.@{fa-css-prefix} {
display: inline-block;
font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}

View File

@ -0,0 +1,6 @@
// Fixed Width Icons
// -------------------------
.@{fa-css-prefix}-fw {
width: (18em / 14);
text-align: center;
}

View File

@ -0,0 +1,18 @@
/*!
* Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/
@import "variables.less";
@import "mixins.less";
@import "path.less";
@import "core.less";
@import "larger.less";
@import "fixed-width.less";
@import "list.less";
@import "bordered-pulled.less";
@import "animated.less";
@import "rotated-flipped.less";
@import "stacked.less";
@import "icons.less";
@import "screen-reader.less";

View File

@ -0,0 +1,789 @@
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
readers do not read off random characters that represent icons */
.@{fa-css-prefix}-glass:before { content: @fa-var-glass; }
.@{fa-css-prefix}-music:before { content: @fa-var-music; }
.@{fa-css-prefix}-search:before { content: @fa-var-search; }
.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; }
.@{fa-css-prefix}-heart:before { content: @fa-var-heart; }
.@{fa-css-prefix}-star:before { content: @fa-var-star; }
.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; }
.@{fa-css-prefix}-user:before { content: @fa-var-user; }
.@{fa-css-prefix}-film:before { content: @fa-var-film; }
.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; }
.@{fa-css-prefix}-th:before { content: @fa-var-th; }
.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; }
.@{fa-css-prefix}-check:before { content: @fa-var-check; }
.@{fa-css-prefix}-remove:before,
.@{fa-css-prefix}-close:before,
.@{fa-css-prefix}-times:before { content: @fa-var-times; }
.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; }
.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; }
.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; }
.@{fa-css-prefix}-signal:before { content: @fa-var-signal; }
.@{fa-css-prefix}-gear:before,
.@{fa-css-prefix}-cog:before { content: @fa-var-cog; }
.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; }
.@{fa-css-prefix}-home:before { content: @fa-var-home; }
.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; }
.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; }
.@{fa-css-prefix}-road:before { content: @fa-var-road; }
.@{fa-css-prefix}-download:before { content: @fa-var-download; }
.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; }
.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; }
.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; }
.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; }
.@{fa-css-prefix}-rotate-right:before,
.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; }
.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; }
.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; }
.@{fa-css-prefix}-lock:before { content: @fa-var-lock; }
.@{fa-css-prefix}-flag:before { content: @fa-var-flag; }
.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; }
.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; }
.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; }
.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; }
.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; }
.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; }
.@{fa-css-prefix}-tag:before { content: @fa-var-tag; }
.@{fa-css-prefix}-tags:before { content: @fa-var-tags; }
.@{fa-css-prefix}-book:before { content: @fa-var-book; }
.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; }
.@{fa-css-prefix}-print:before { content: @fa-var-print; }
.@{fa-css-prefix}-camera:before { content: @fa-var-camera; }
.@{fa-css-prefix}-font:before { content: @fa-var-font; }
.@{fa-css-prefix}-bold:before { content: @fa-var-bold; }
.@{fa-css-prefix}-italic:before { content: @fa-var-italic; }
.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; }
.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; }
.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; }
.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; }
.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; }
.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; }
.@{fa-css-prefix}-list:before { content: @fa-var-list; }
.@{fa-css-prefix}-dedent:before,
.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; }
.@{fa-css-prefix}-indent:before { content: @fa-var-indent; }
.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; }
.@{fa-css-prefix}-photo:before,
.@{fa-css-prefix}-image:before,
.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; }
.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; }
.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; }
.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; }
.@{fa-css-prefix}-tint:before { content: @fa-var-tint; }
.@{fa-css-prefix}-edit:before,
.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; }
.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; }
.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; }
.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; }
.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; }
.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; }
.@{fa-css-prefix}-backward:before { content: @fa-var-backward; }
.@{fa-css-prefix}-play:before { content: @fa-var-play; }
.@{fa-css-prefix}-pause:before { content: @fa-var-pause; }
.@{fa-css-prefix}-stop:before { content: @fa-var-stop; }
.@{fa-css-prefix}-forward:before { content: @fa-var-forward; }
.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; }
.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; }
.@{fa-css-prefix}-eject:before { content: @fa-var-eject; }
.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; }
.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; }
.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; }
.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; }
.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; }
.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; }
.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; }
.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; }
.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; }
.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; }
.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; }
.@{fa-css-prefix}-ban:before { content: @fa-var-ban; }
.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; }
.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; }
.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; }
.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; }
.@{fa-css-prefix}-mail-forward:before,
.@{fa-css-prefix}-share:before { content: @fa-var-share; }
.@{fa-css-prefix}-expand:before { content: @fa-var-expand; }
.@{fa-css-prefix}-compress:before { content: @fa-var-compress; }
.@{fa-css-prefix}-plus:before { content: @fa-var-plus; }
.@{fa-css-prefix}-minus:before { content: @fa-var-minus; }
.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; }
.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; }
.@{fa-css-prefix}-gift:before { content: @fa-var-gift; }
.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; }
.@{fa-css-prefix}-fire:before { content: @fa-var-fire; }
.@{fa-css-prefix}-eye:before { content: @fa-var-eye; }
.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; }
.@{fa-css-prefix}-warning:before,
.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; }
.@{fa-css-prefix}-plane:before { content: @fa-var-plane; }
.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; }
.@{fa-css-prefix}-random:before { content: @fa-var-random; }
.@{fa-css-prefix}-comment:before { content: @fa-var-comment; }
.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; }
.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; }
.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; }
.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; }
.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; }
.@{fa-css-prefix}-folder:before { content: @fa-var-folder; }
.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; }
.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; }
.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; }
.@{fa-css-prefix}-bar-chart-o:before,
.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; }
.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; }
.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; }
.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; }
.@{fa-css-prefix}-key:before { content: @fa-var-key; }
.@{fa-css-prefix}-gears:before,
.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; }
.@{fa-css-prefix}-comments:before { content: @fa-var-comments; }
.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; }
.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; }
.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; }
.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; }
.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; }
.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; }
.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; }
.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; }
.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; }
.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; }
.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; }
.@{fa-css-prefix}-upload:before { content: @fa-var-upload; }
.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; }
.@{fa-css-prefix}-phone:before { content: @fa-var-phone; }
.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; }
.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; }
.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; }
.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; }
.@{fa-css-prefix}-facebook-f:before,
.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; }
.@{fa-css-prefix}-github:before { content: @fa-var-github; }
.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; }
.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; }
.@{fa-css-prefix}-feed:before,
.@{fa-css-prefix}-rss:before { content: @fa-var-rss; }
.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; }
.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; }
.@{fa-css-prefix}-bell:before { content: @fa-var-bell; }
.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; }
.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; }
.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; }
.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; }
.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; }
.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; }
.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; }
.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; }
.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; }
.@{fa-css-prefix}-globe:before { content: @fa-var-globe; }
.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; }
.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; }
.@{fa-css-prefix}-filter:before { content: @fa-var-filter; }
.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; }
.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; }
.@{fa-css-prefix}-group:before,
.@{fa-css-prefix}-users:before { content: @fa-var-users; }
.@{fa-css-prefix}-chain:before,
.@{fa-css-prefix}-link:before { content: @fa-var-link; }
.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; }
.@{fa-css-prefix}-flask:before { content: @fa-var-flask; }
.@{fa-css-prefix}-cut:before,
.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; }
.@{fa-css-prefix}-copy:before,
.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; }
.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; }
.@{fa-css-prefix}-save:before,
.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; }
.@{fa-css-prefix}-square:before { content: @fa-var-square; }
.@{fa-css-prefix}-navicon:before,
.@{fa-css-prefix}-reorder:before,
.@{fa-css-prefix}-bars:before { content: @fa-var-bars; }
.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; }
.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; }
.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; }
.@{fa-css-prefix}-underline:before { content: @fa-var-underline; }
.@{fa-css-prefix}-table:before { content: @fa-var-table; }
.@{fa-css-prefix}-magic:before { content: @fa-var-magic; }
.@{fa-css-prefix}-truck:before { content: @fa-var-truck; }
.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; }
.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; }
.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; }
.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; }
.@{fa-css-prefix}-money:before { content: @fa-var-money; }
.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; }
.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; }
.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; }
.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; }
.@{fa-css-prefix}-columns:before { content: @fa-var-columns; }
.@{fa-css-prefix}-unsorted:before,
.@{fa-css-prefix}-sort:before { content: @fa-var-sort; }
.@{fa-css-prefix}-sort-down:before,
.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; }
.@{fa-css-prefix}-sort-up:before,
.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; }
.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; }
.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; }
.@{fa-css-prefix}-rotate-left:before,
.@{fa-css-prefix}-undo:before { content: @fa-var-undo; }
.@{fa-css-prefix}-legal:before,
.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; }
.@{fa-css-prefix}-dashboard:before,
.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; }
.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; }
.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; }
.@{fa-css-prefix}-flash:before,
.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; }
.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; }
.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; }
.@{fa-css-prefix}-paste:before,
.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; }
.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; }
.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; }
.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; }
.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; }
.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; }
.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; }
.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; }
.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; }
.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; }
.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; }
.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; }
.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; }
.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; }
.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; }
.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; }
.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; }
.@{fa-css-prefix}-beer:before { content: @fa-var-beer; }
.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; }
.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; }
.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; }
.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; }
.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; }
.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; }
.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; }
.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; }
.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; }
.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; }
.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; }
.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; }
.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; }
.@{fa-css-prefix}-mobile-phone:before,
.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; }
.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; }
.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; }
.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; }
.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; }
.@{fa-css-prefix}-circle:before { content: @fa-var-circle; }
.@{fa-css-prefix}-mail-reply:before,
.@{fa-css-prefix}-reply:before { content: @fa-var-reply; }
.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; }
.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; }
.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; }
.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; }
.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; }
.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; }
.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; }
.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; }
.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; }
.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; }
.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; }
.@{fa-css-prefix}-code:before { content: @fa-var-code; }
.@{fa-css-prefix}-mail-reply-all:before,
.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; }
.@{fa-css-prefix}-star-half-empty:before,
.@{fa-css-prefix}-star-half-full:before,
.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; }
.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; }
.@{fa-css-prefix}-crop:before { content: @fa-var-crop; }
.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; }
.@{fa-css-prefix}-unlink:before,
.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; }
.@{fa-css-prefix}-question:before { content: @fa-var-question; }
.@{fa-css-prefix}-info:before { content: @fa-var-info; }
.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; }
.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; }
.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; }
.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; }
.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; }
.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; }
.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; }
.@{fa-css-prefix}-shield:before { content: @fa-var-shield; }
.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; }
.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; }
.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; }
.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; }
.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; }
.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; }
.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; }
.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; }
.@{fa-css-prefix}-html5:before { content: @fa-var-html5; }
.@{fa-css-prefix}-css3:before { content: @fa-var-css3; }
.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; }
.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; }
.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; }
.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; }
.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; }
.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; }
.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; }
.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; }
.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; }
.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; }
.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; }
.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; }
.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; }
.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; }
.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; }
.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; }
.@{fa-css-prefix}-compass:before { content: @fa-var-compass; }
.@{fa-css-prefix}-toggle-down:before,
.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; }
.@{fa-css-prefix}-toggle-up:before,
.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; }
.@{fa-css-prefix}-toggle-right:before,
.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; }
.@{fa-css-prefix}-euro:before,
.@{fa-css-prefix}-eur:before { content: @fa-var-eur; }
.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; }
.@{fa-css-prefix}-dollar:before,
.@{fa-css-prefix}-usd:before { content: @fa-var-usd; }
.@{fa-css-prefix}-rupee:before,
.@{fa-css-prefix}-inr:before { content: @fa-var-inr; }
.@{fa-css-prefix}-cny:before,
.@{fa-css-prefix}-rmb:before,
.@{fa-css-prefix}-yen:before,
.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; }
.@{fa-css-prefix}-ruble:before,
.@{fa-css-prefix}-rouble:before,
.@{fa-css-prefix}-rub:before { content: @fa-var-rub; }
.@{fa-css-prefix}-won:before,
.@{fa-css-prefix}-krw:before { content: @fa-var-krw; }
.@{fa-css-prefix}-bitcoin:before,
.@{fa-css-prefix}-btc:before { content: @fa-var-btc; }
.@{fa-css-prefix}-file:before { content: @fa-var-file; }
.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; }
.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; }
.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; }
.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; }
.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; }
.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; }
.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; }
.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; }
.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; }
.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; }
.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; }
.@{fa-css-prefix}-xing:before { content: @fa-var-xing; }
.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; }
.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; }
.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; }
.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; }
.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; }
.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; }
.@{fa-css-prefix}-adn:before { content: @fa-var-adn; }
.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; }
.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; }
.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; }
.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; }
.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; }
.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; }
.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; }
.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; }
.@{fa-css-prefix}-apple:before { content: @fa-var-apple; }
.@{fa-css-prefix}-windows:before { content: @fa-var-windows; }
.@{fa-css-prefix}-android:before { content: @fa-var-android; }
.@{fa-css-prefix}-linux:before { content: @fa-var-linux; }
.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; }
.@{fa-css-prefix}-skype:before { content: @fa-var-skype; }
.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; }
.@{fa-css-prefix}-trello:before { content: @fa-var-trello; }
.@{fa-css-prefix}-female:before { content: @fa-var-female; }
.@{fa-css-prefix}-male:before { content: @fa-var-male; }
.@{fa-css-prefix}-gittip:before,
.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; }
.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; }
.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; }
.@{fa-css-prefix}-archive:before { content: @fa-var-archive; }
.@{fa-css-prefix}-bug:before { content: @fa-var-bug; }
.@{fa-css-prefix}-vk:before { content: @fa-var-vk; }
.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; }
.@{fa-css-prefix}-renren:before { content: @fa-var-renren; }
.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; }
.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; }
.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; }
.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; }
.@{fa-css-prefix}-toggle-left:before,
.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; }
.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; }
.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; }
.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; }
.@{fa-css-prefix}-turkish-lira:before,
.@{fa-css-prefix}-try:before { content: @fa-var-try; }
.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; }
.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; }
.@{fa-css-prefix}-slack:before { content: @fa-var-slack; }
.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; }
.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; }
.@{fa-css-prefix}-openid:before { content: @fa-var-openid; }
.@{fa-css-prefix}-institution:before,
.@{fa-css-prefix}-bank:before,
.@{fa-css-prefix}-university:before { content: @fa-var-university; }
.@{fa-css-prefix}-mortar-board:before,
.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; }
.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; }
.@{fa-css-prefix}-google:before { content: @fa-var-google; }
.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; }
.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; }
.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; }
.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; }
.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; }
.@{fa-css-prefix}-digg:before { content: @fa-var-digg; }
.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; }
.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; }
.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; }
.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; }
.@{fa-css-prefix}-language:before { content: @fa-var-language; }
.@{fa-css-prefix}-fax:before { content: @fa-var-fax; }
.@{fa-css-prefix}-building:before { content: @fa-var-building; }
.@{fa-css-prefix}-child:before { content: @fa-var-child; }
.@{fa-css-prefix}-paw:before { content: @fa-var-paw; }
.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; }
.@{fa-css-prefix}-cube:before { content: @fa-var-cube; }
.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; }
.@{fa-css-prefix}-behance:before { content: @fa-var-behance; }
.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; }
.@{fa-css-prefix}-steam:before { content: @fa-var-steam; }
.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; }
.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; }
.@{fa-css-prefix}-automobile:before,
.@{fa-css-prefix}-car:before { content: @fa-var-car; }
.@{fa-css-prefix}-cab:before,
.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; }
.@{fa-css-prefix}-tree:before { content: @fa-var-tree; }
.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; }
.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; }
.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; }
.@{fa-css-prefix}-database:before { content: @fa-var-database; }
.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; }
.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; }
.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; }
.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; }
.@{fa-css-prefix}-file-photo-o:before,
.@{fa-css-prefix}-file-picture-o:before,
.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; }
.@{fa-css-prefix}-file-zip-o:before,
.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; }
.@{fa-css-prefix}-file-sound-o:before,
.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; }
.@{fa-css-prefix}-file-movie-o:before,
.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; }
.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; }
.@{fa-css-prefix}-vine:before { content: @fa-var-vine; }
.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; }
.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; }
.@{fa-css-prefix}-life-bouy:before,
.@{fa-css-prefix}-life-buoy:before,
.@{fa-css-prefix}-life-saver:before,
.@{fa-css-prefix}-support:before,
.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; }
.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; }
.@{fa-css-prefix}-ra:before,
.@{fa-css-prefix}-resistance:before,
.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; }
.@{fa-css-prefix}-ge:before,
.@{fa-css-prefix}-empire:before { content: @fa-var-empire; }
.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; }
.@{fa-css-prefix}-git:before { content: @fa-var-git; }
.@{fa-css-prefix}-y-combinator-square:before,
.@{fa-css-prefix}-yc-square:before,
.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; }
.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; }
.@{fa-css-prefix}-qq:before { content: @fa-var-qq; }
.@{fa-css-prefix}-wechat:before,
.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; }
.@{fa-css-prefix}-send:before,
.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; }
.@{fa-css-prefix}-send-o:before,
.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; }
.@{fa-css-prefix}-history:before { content: @fa-var-history; }
.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; }
.@{fa-css-prefix}-header:before { content: @fa-var-header; }
.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; }
.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; }
.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; }
.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; }
.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; }
.@{fa-css-prefix}-soccer-ball-o:before,
.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; }
.@{fa-css-prefix}-tty:before { content: @fa-var-tty; }
.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; }
.@{fa-css-prefix}-plug:before { content: @fa-var-plug; }
.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; }
.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; }
.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; }
.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; }
.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; }
.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; }
.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; }
.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; }
.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; }
.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; }
.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; }
.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; }
.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; }
.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; }
.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; }
.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; }
.@{fa-css-prefix}-trash:before { content: @fa-var-trash; }
.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; }
.@{fa-css-prefix}-at:before { content: @fa-var-at; }
.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; }
.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; }
.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; }
.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; }
.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; }
.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; }
.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; }
.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; }
.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; }
.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; }
.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; }
.@{fa-css-prefix}-bus:before { content: @fa-var-bus; }
.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; }
.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; }
.@{fa-css-prefix}-cc:before { content: @fa-var-cc; }
.@{fa-css-prefix}-shekel:before,
.@{fa-css-prefix}-sheqel:before,
.@{fa-css-prefix}-ils:before { content: @fa-var-ils; }
.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; }
.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; }
.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; }
.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; }
.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; }
.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; }
.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; }
.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; }
.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; }
.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; }
.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; }
.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; }
.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; }
.@{fa-css-prefix}-ship:before { content: @fa-var-ship; }
.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; }
.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; }
.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; }
.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; }
.@{fa-css-prefix}-venus:before { content: @fa-var-venus; }
.@{fa-css-prefix}-mars:before { content: @fa-var-mars; }
.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; }
.@{fa-css-prefix}-intersex:before,
.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; }
.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; }
.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; }
.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; }
.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; }
.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; }
.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; }
.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; }
.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; }
.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; }
.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; }
.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; }
.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; }
.@{fa-css-prefix}-server:before { content: @fa-var-server; }
.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; }
.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; }
.@{fa-css-prefix}-hotel:before,
.@{fa-css-prefix}-bed:before { content: @fa-var-bed; }
.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; }
.@{fa-css-prefix}-train:before { content: @fa-var-train; }
.@{fa-css-prefix}-subway:before { content: @fa-var-subway; }
.@{fa-css-prefix}-medium:before { content: @fa-var-medium; }
.@{fa-css-prefix}-yc:before,
.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; }
.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; }
.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; }
.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; }
.@{fa-css-prefix}-battery-4:before,
.@{fa-css-prefix}-battery:before,
.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; }
.@{fa-css-prefix}-battery-3:before,
.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; }
.@{fa-css-prefix}-battery-2:before,
.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; }
.@{fa-css-prefix}-battery-1:before,
.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; }
.@{fa-css-prefix}-battery-0:before,
.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; }
.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; }
.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; }
.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; }
.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; }
.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; }
.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; }
.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; }
.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; }
.@{fa-css-prefix}-clone:before { content: @fa-var-clone; }
.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; }
.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; }
.@{fa-css-prefix}-hourglass-1:before,
.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; }
.@{fa-css-prefix}-hourglass-2:before,
.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; }
.@{fa-css-prefix}-hourglass-3:before,
.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; }
.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; }
.@{fa-css-prefix}-hand-grab-o:before,
.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; }
.@{fa-css-prefix}-hand-stop-o:before,
.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; }
.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; }
.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; }
.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; }
.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; }
.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; }
.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; }
.@{fa-css-prefix}-registered:before { content: @fa-var-registered; }
.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; }
.@{fa-css-prefix}-gg:before { content: @fa-var-gg; }
.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; }
.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; }
.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; }
.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; }
.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; }
.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; }
.@{fa-css-prefix}-safari:before { content: @fa-var-safari; }
.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; }
.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; }
.@{fa-css-prefix}-opera:before { content: @fa-var-opera; }
.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; }
.@{fa-css-prefix}-tv:before,
.@{fa-css-prefix}-television:before { content: @fa-var-television; }
.@{fa-css-prefix}-contao:before { content: @fa-var-contao; }
.@{fa-css-prefix}-500px:before { content: @fa-var-500px; }
.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; }
.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; }
.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; }
.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; }
.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; }
.@{fa-css-prefix}-industry:before { content: @fa-var-industry; }
.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; }
.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; }
.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; }
.@{fa-css-prefix}-map:before { content: @fa-var-map; }
.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; }
.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; }
.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; }
.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; }
.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; }
.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; }
.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; }
.@{fa-css-prefix}-edge:before { content: @fa-var-edge; }
.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; }
.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; }
.@{fa-css-prefix}-modx:before { content: @fa-var-modx; }
.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; }
.@{fa-css-prefix}-usb:before { content: @fa-var-usb; }
.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; }
.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; }
.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; }
.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; }
.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; }
.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; }
.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; }
.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; }
.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; }
.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; }
.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; }
.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; }
.@{fa-css-prefix}-percent:before { content: @fa-var-percent; }
.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; }
.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; }
.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; }
.@{fa-css-prefix}-envira:before { content: @fa-var-envira; }
.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; }
.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; }
.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; }
.@{fa-css-prefix}-blind:before { content: @fa-var-blind; }
.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; }
.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; }
.@{fa-css-prefix}-braille:before { content: @fa-var-braille; }
.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; }
.@{fa-css-prefix}-asl-interpreting:before,
.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; }
.@{fa-css-prefix}-deafness:before,
.@{fa-css-prefix}-hard-of-hearing:before,
.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; }
.@{fa-css-prefix}-glide:before { content: @fa-var-glide; }
.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; }
.@{fa-css-prefix}-signing:before,
.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; }
.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; }
.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; }
.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; }
.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; }
.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; }
.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; }
.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; }
.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; }
.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; }
.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; }
.@{fa-css-prefix}-google-plus-circle:before,
.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; }
.@{fa-css-prefix}-fa:before,
.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; }
.@{fa-css-prefix}-handshake-o:before { content: @fa-var-handshake-o; }
.@{fa-css-prefix}-envelope-open:before { content: @fa-var-envelope-open; }
.@{fa-css-prefix}-envelope-open-o:before { content: @fa-var-envelope-open-o; }
.@{fa-css-prefix}-linode:before { content: @fa-var-linode; }
.@{fa-css-prefix}-address-book:before { content: @fa-var-address-book; }
.@{fa-css-prefix}-address-book-o:before { content: @fa-var-address-book-o; }
.@{fa-css-prefix}-vcard:before,
.@{fa-css-prefix}-address-card:before { content: @fa-var-address-card; }
.@{fa-css-prefix}-vcard-o:before,
.@{fa-css-prefix}-address-card-o:before { content: @fa-var-address-card-o; }
.@{fa-css-prefix}-user-circle:before { content: @fa-var-user-circle; }
.@{fa-css-prefix}-user-circle-o:before { content: @fa-var-user-circle-o; }
.@{fa-css-prefix}-user-o:before { content: @fa-var-user-o; }
.@{fa-css-prefix}-id-badge:before { content: @fa-var-id-badge; }
.@{fa-css-prefix}-drivers-license:before,
.@{fa-css-prefix}-id-card:before { content: @fa-var-id-card; }
.@{fa-css-prefix}-drivers-license-o:before,
.@{fa-css-prefix}-id-card-o:before { content: @fa-var-id-card-o; }
.@{fa-css-prefix}-quora:before { content: @fa-var-quora; }
.@{fa-css-prefix}-free-code-camp:before { content: @fa-var-free-code-camp; }
.@{fa-css-prefix}-telegram:before { content: @fa-var-telegram; }
.@{fa-css-prefix}-thermometer-4:before,
.@{fa-css-prefix}-thermometer:before,
.@{fa-css-prefix}-thermometer-full:before { content: @fa-var-thermometer-full; }
.@{fa-css-prefix}-thermometer-3:before,
.@{fa-css-prefix}-thermometer-three-quarters:before { content: @fa-var-thermometer-three-quarters; }
.@{fa-css-prefix}-thermometer-2:before,
.@{fa-css-prefix}-thermometer-half:before { content: @fa-var-thermometer-half; }
.@{fa-css-prefix}-thermometer-1:before,
.@{fa-css-prefix}-thermometer-quarter:before { content: @fa-var-thermometer-quarter; }
.@{fa-css-prefix}-thermometer-0:before,
.@{fa-css-prefix}-thermometer-empty:before { content: @fa-var-thermometer-empty; }
.@{fa-css-prefix}-shower:before { content: @fa-var-shower; }
.@{fa-css-prefix}-bathtub:before,
.@{fa-css-prefix}-s15:before,
.@{fa-css-prefix}-bath:before { content: @fa-var-bath; }
.@{fa-css-prefix}-podcast:before { content: @fa-var-podcast; }
.@{fa-css-prefix}-window-maximize:before { content: @fa-var-window-maximize; }
.@{fa-css-prefix}-window-minimize:before { content: @fa-var-window-minimize; }
.@{fa-css-prefix}-window-restore:before { content: @fa-var-window-restore; }
.@{fa-css-prefix}-times-rectangle:before,
.@{fa-css-prefix}-window-close:before { content: @fa-var-window-close; }
.@{fa-css-prefix}-times-rectangle-o:before,
.@{fa-css-prefix}-window-close-o:before { content: @fa-var-window-close-o; }
.@{fa-css-prefix}-bandcamp:before { content: @fa-var-bandcamp; }
.@{fa-css-prefix}-grav:before { content: @fa-var-grav; }
.@{fa-css-prefix}-etsy:before { content: @fa-var-etsy; }
.@{fa-css-prefix}-imdb:before { content: @fa-var-imdb; }
.@{fa-css-prefix}-ravelry:before { content: @fa-var-ravelry; }
.@{fa-css-prefix}-eercast:before { content: @fa-var-eercast; }
.@{fa-css-prefix}-microchip:before { content: @fa-var-microchip; }
.@{fa-css-prefix}-snowflake-o:before { content: @fa-var-snowflake-o; }
.@{fa-css-prefix}-superpowers:before { content: @fa-var-superpowers; }
.@{fa-css-prefix}-wpexplorer:before { content: @fa-var-wpexplorer; }
.@{fa-css-prefix}-meetup:before { content: @fa-var-meetup; }

View File

@ -0,0 +1,13 @@
// Icon Sizes
// -------------------------
/* makes the font 33% larger relative to the icon container */
.@{fa-css-prefix}-lg {
font-size: (4em / 3);
line-height: (3em / 4);
vertical-align: -15%;
}
.@{fa-css-prefix}-2x { font-size: 2em; }
.@{fa-css-prefix}-3x { font-size: 3em; }
.@{fa-css-prefix}-4x { font-size: 4em; }
.@{fa-css-prefix}-5x { font-size: 5em; }

View File

@ -0,0 +1,19 @@
// List Icons
// -------------------------
.@{fa-css-prefix}-ul {
padding-left: 0;
margin-left: @fa-li-width;
list-style-type: none;
> li { position: relative; }
}
.@{fa-css-prefix}-li {
position: absolute;
left: -@fa-li-width;
width: @fa-li-width;
top: (2em / 14);
text-align: center;
&.@{fa-css-prefix}-lg {
left: (-@fa-li-width + (4em / 14));
}
}

View File

@ -0,0 +1,60 @@
// Mixins
// --------------------------
.fa-icon() {
display: inline-block;
font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.fa-icon-rotate(@degrees, @rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})";
-webkit-transform: rotate(@degrees);
-ms-transform: rotate(@degrees);
transform: rotate(@degrees);
}
.fa-icon-flip(@horiz, @vert, @rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)";
-webkit-transform: scale(@horiz, @vert);
-ms-transform: scale(@horiz, @vert);
transform: scale(@horiz, @vert);
}
// Only display content to screen readers. A la Bootstrap 4.
//
// See: http://a11yproject.com/posts/how-to-hide-content/
.sr-only() {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0,0,0,0);
border: 0;
}
// Use in conjunction with .sr-only to only display content when it's focused.
//
// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
//
// Credit: HTML5 Boilerplate
.sr-only-focusable() {
&:active,
&:focus {
position: static;
width: auto;
height: auto;
margin: 0;
overflow: visible;
clip: auto;
}
}

View File

@ -0,0 +1,15 @@
/* FONT PATH
* -------------------------- */
@font-face {
font-family: 'FontAwesome';
src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),
url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'),
url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),
url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');
// src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
font-weight: normal;
font-style: normal;
}

View File

@ -0,0 +1,20 @@
// Rotated & Flipped Icons
// -------------------------
.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); }
.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); }
// Hook for IE8-9
// -------------------------
:root .@{fa-css-prefix}-rotate-90,
:root .@{fa-css-prefix}-rotate-180,
:root .@{fa-css-prefix}-rotate-270,
:root .@{fa-css-prefix}-flip-horizontal,
:root .@{fa-css-prefix}-flip-vertical {
filter: none;
}

View File

@ -0,0 +1,5 @@
// Screen Readers
// -------------------------
.sr-only { .sr-only(); }
.sr-only-focusable { .sr-only-focusable(); }

View File

@ -0,0 +1,20 @@
// Stacked Icons
// -------------------------
.@{fa-css-prefix}-stack {
position: relative;
display: inline-block;
width: 2em;
height: 2em;
line-height: 2em;
vertical-align: middle;
}
.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
position: absolute;
left: 0;
width: 100%;
text-align: center;
}
.@{fa-css-prefix}-stack-1x { line-height: inherit; }
.@{fa-css-prefix}-stack-2x { font-size: 2em; }
.@{fa-css-prefix}-inverse { color: @fa-inverse; }

View File

@ -0,0 +1,800 @@
// Variables
// --------------------------
@fa-font-path: "../fonts";
@fa-font-size-base: 14px;
@fa-line-height-base: 1;
//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts"; // for referencing Bootstrap CDN font files directly
@fa-css-prefix: fa;
@fa-version: "4.7.0";
@fa-border-color: #eee;
@fa-inverse: #fff;
@fa-li-width: (30em / 14);
@fa-var-500px: "\f26e";
@fa-var-address-book: "\f2b9";
@fa-var-address-book-o: "\f2ba";
@fa-var-address-card: "\f2bb";
@fa-var-address-card-o: "\f2bc";
@fa-var-adjust: "\f042";
@fa-var-adn: "\f170";
@fa-var-align-center: "\f037";
@fa-var-align-justify: "\f039";
@fa-var-align-left: "\f036";
@fa-var-align-right: "\f038";
@fa-var-amazon: "\f270";
@fa-var-ambulance: "\f0f9";
@fa-var-american-sign-language-interpreting: "\f2a3";
@fa-var-anchor: "\f13d";
@fa-var-android: "\f17b";
@fa-var-angellist: "\f209";
@fa-var-angle-double-down: "\f103";
@fa-var-angle-double-left: "\f100";
@fa-var-angle-double-right: "\f101";
@fa-var-angle-double-up: "\f102";
@fa-var-angle-down: "\f107";
@fa-var-angle-left: "\f104";
@fa-var-angle-right: "\f105";
@fa-var-angle-up: "\f106";
@fa-var-apple: "\f179";
@fa-var-archive: "\f187";
@fa-var-area-chart: "\f1fe";
@fa-var-arrow-circle-down: "\f0ab";
@fa-var-arrow-circle-left: "\f0a8";
@fa-var-arrow-circle-o-down: "\f01a";
@fa-var-arrow-circle-o-left: "\f190";
@fa-var-arrow-circle-o-right: "\f18e";
@fa-var-arrow-circle-o-up: "\f01b";
@fa-var-arrow-circle-right: "\f0a9";
@fa-var-arrow-circle-up: "\f0aa";
@fa-var-arrow-down: "\f063";
@fa-var-arrow-left: "\f060";
@fa-var-arrow-right: "\f061";
@fa-var-arrow-up: "\f062";
@fa-var-arrows: "\f047";
@fa-var-arrows-alt: "\f0b2";
@fa-var-arrows-h: "\f07e";
@fa-var-arrows-v: "\f07d";
@fa-var-asl-interpreting: "\f2a3";
@fa-var-assistive-listening-systems: "\f2a2";
@fa-var-asterisk: "\f069";
@fa-var-at: "\f1fa";
@fa-var-audio-description: "\f29e";
@fa-var-automobile: "\f1b9";
@fa-var-backward: "\f04a";
@fa-var-balance-scale: "\f24e";
@fa-var-ban: "\f05e";
@fa-var-bandcamp: "\f2d5";
@fa-var-bank: "\f19c";
@fa-var-bar-chart: "\f080";
@fa-var-bar-chart-o: "\f080";
@fa-var-barcode: "\f02a";
@fa-var-bars: "\f0c9";
@fa-var-bath: "\f2cd";
@fa-var-bathtub: "\f2cd";
@fa-var-battery: "\f240";
@fa-var-battery-0: "\f244";
@fa-var-battery-1: "\f243";
@fa-var-battery-2: "\f242";
@fa-var-battery-3: "\f241";
@fa-var-battery-4: "\f240";
@fa-var-battery-empty: "\f244";
@fa-var-battery-full: "\f240";
@fa-var-battery-half: "\f242";
@fa-var-battery-quarter: "\f243";
@fa-var-battery-three-quarters: "\f241";
@fa-var-bed: "\f236";
@fa-var-beer: "\f0fc";
@fa-var-behance: "\f1b4";
@fa-var-behance-square: "\f1b5";
@fa-var-bell: "\f0f3";
@fa-var-bell-o: "\f0a2";
@fa-var-bell-slash: "\f1f6";
@fa-var-bell-slash-o: "\f1f7";
@fa-var-bicycle: "\f206";
@fa-var-binoculars: "\f1e5";
@fa-var-birthday-cake: "\f1fd";
@fa-var-bitbucket: "\f171";
@fa-var-bitbucket-square: "\f172";
@fa-var-bitcoin: "\f15a";
@fa-var-black-tie: "\f27e";
@fa-var-blind: "\f29d";
@fa-var-bluetooth: "\f293";
@fa-var-bluetooth-b: "\f294";
@fa-var-bold: "\f032";
@fa-var-bolt: "\f0e7";
@fa-var-bomb: "\f1e2";
@fa-var-book: "\f02d";
@fa-var-bookmark: "\f02e";
@fa-var-bookmark-o: "\f097";
@fa-var-braille: "\f2a1";
@fa-var-briefcase: "\f0b1";
@fa-var-btc: "\f15a";
@fa-var-bug: "\f188";
@fa-var-building: "\f1ad";
@fa-var-building-o: "\f0f7";
@fa-var-bullhorn: "\f0a1";
@fa-var-bullseye: "\f140";
@fa-var-bus: "\f207";
@fa-var-buysellads: "\f20d";
@fa-var-cab: "\f1ba";
@fa-var-calculator: "\f1ec";
@fa-var-calendar: "\f073";
@fa-var-calendar-check-o: "\f274";
@fa-var-calendar-minus-o: "\f272";
@fa-var-calendar-o: "\f133";
@fa-var-calendar-plus-o: "\f271";
@fa-var-calendar-times-o: "\f273";
@fa-var-camera: "\f030";
@fa-var-camera-retro: "\f083";
@fa-var-car: "\f1b9";
@fa-var-caret-down: "\f0d7";
@fa-var-caret-left: "\f0d9";
@fa-var-caret-right: "\f0da";
@fa-var-caret-square-o-down: "\f150";
@fa-var-caret-square-o-left: "\f191";
@fa-var-caret-square-o-right: "\f152";
@fa-var-caret-square-o-up: "\f151";
@fa-var-caret-up: "\f0d8";
@fa-var-cart-arrow-down: "\f218";
@fa-var-cart-plus: "\f217";
@fa-var-cc: "\f20a";
@fa-var-cc-amex: "\f1f3";
@fa-var-cc-diners-club: "\f24c";
@fa-var-cc-discover: "\f1f2";
@fa-var-cc-jcb: "\f24b";
@fa-var-cc-mastercard: "\f1f1";
@fa-var-cc-paypal: "\f1f4";
@fa-var-cc-stripe: "\f1f5";
@fa-var-cc-visa: "\f1f0";
@fa-var-certificate: "\f0a3";
@fa-var-chain: "\f0c1";
@fa-var-chain-broken: "\f127";
@fa-var-check: "\f00c";
@fa-var-check-circle: "\f058";
@fa-var-check-circle-o: "\f05d";
@fa-var-check-square: "\f14a";
@fa-var-check-square-o: "\f046";
@fa-var-chevron-circle-down: "\f13a";
@fa-var-chevron-circle-left: "\f137";
@fa-var-chevron-circle-right: "\f138";
@fa-var-chevron-circle-up: "\f139";
@fa-var-chevron-down: "\f078";
@fa-var-chevron-left: "\f053";
@fa-var-chevron-right: "\f054";
@fa-var-chevron-up: "\f077";
@fa-var-child: "\f1ae";
@fa-var-chrome: "\f268";
@fa-var-circle: "\f111";
@fa-var-circle-o: "\f10c";
@fa-var-circle-o-notch: "\f1ce";
@fa-var-circle-thin: "\f1db";
@fa-var-clipboard: "\f0ea";
@fa-var-clock-o: "\f017";
@fa-var-clone: "\f24d";
@fa-var-close: "\f00d";
@fa-var-cloud: "\f0c2";
@fa-var-cloud-download: "\f0ed";
@fa-var-cloud-upload: "\f0ee";
@fa-var-cny: "\f157";
@fa-var-code: "\f121";
@fa-var-code-fork: "\f126";
@fa-var-codepen: "\f1cb";
@fa-var-codiepie: "\f284";
@fa-var-coffee: "\f0f4";
@fa-var-cog: "\f013";
@fa-var-cogs: "\f085";
@fa-var-columns: "\f0db";
@fa-var-comment: "\f075";
@fa-var-comment-o: "\f0e5";
@fa-var-commenting: "\f27a";
@fa-var-commenting-o: "\f27b";
@fa-var-comments: "\f086";
@fa-var-comments-o: "\f0e6";
@fa-var-compass: "\f14e";
@fa-var-compress: "\f066";
@fa-var-connectdevelop: "\f20e";
@fa-var-contao: "\f26d";
@fa-var-copy: "\f0c5";
@fa-var-copyright: "\f1f9";
@fa-var-creative-commons: "\f25e";
@fa-var-credit-card: "\f09d";
@fa-var-credit-card-alt: "\f283";
@fa-var-crop: "\f125";
@fa-var-crosshairs: "\f05b";
@fa-var-css3: "\f13c";
@fa-var-cube: "\f1b2";
@fa-var-cubes: "\f1b3";
@fa-var-cut: "\f0c4";
@fa-var-cutlery: "\f0f5";
@fa-var-dashboard: "\f0e4";
@fa-var-dashcube: "\f210";
@fa-var-database: "\f1c0";
@fa-var-deaf: "\f2a4";
@fa-var-deafness: "\f2a4";
@fa-var-dedent: "\f03b";
@fa-var-delicious: "\f1a5";
@fa-var-desktop: "\f108";
@fa-var-deviantart: "\f1bd";
@fa-var-diamond: "\f219";
@fa-var-digg: "\f1a6";
@fa-var-dollar: "\f155";
@fa-var-dot-circle-o: "\f192";
@fa-var-download: "\f019";
@fa-var-dribbble: "\f17d";
@fa-var-drivers-license: "\f2c2";
@fa-var-drivers-license-o: "\f2c3";
@fa-var-dropbox: "\f16b";
@fa-var-drupal: "\f1a9";
@fa-var-edge: "\f282";
@fa-var-edit: "\f044";
@fa-var-eercast: "\f2da";
@fa-var-eject: "\f052";
@fa-var-ellipsis-h: "\f141";
@fa-var-ellipsis-v: "\f142";
@fa-var-empire: "\f1d1";
@fa-var-envelope: "\f0e0";
@fa-var-envelope-o: "\f003";
@fa-var-envelope-open: "\f2b6";
@fa-var-envelope-open-o: "\f2b7";
@fa-var-envelope-square: "\f199";
@fa-var-envira: "\f299";
@fa-var-eraser: "\f12d";
@fa-var-etsy: "\f2d7";
@fa-var-eur: "\f153";
@fa-var-euro: "\f153";
@fa-var-exchange: "\f0ec";
@fa-var-exclamation: "\f12a";
@fa-var-exclamation-circle: "\f06a";
@fa-var-exclamation-triangle: "\f071";
@fa-var-expand: "\f065";
@fa-var-expeditedssl: "\f23e";
@fa-var-external-link: "\f08e";
@fa-var-external-link-square: "\f14c";
@fa-var-eye: "\f06e";
@fa-var-eye-slash: "\f070";
@fa-var-eyedropper: "\f1fb";
@fa-var-fa: "\f2b4";
@fa-var-facebook: "\f09a";
@fa-var-facebook-f: "\f09a";
@fa-var-facebook-official: "\f230";
@fa-var-facebook-square: "\f082";
@fa-var-fast-backward: "\f049";
@fa-var-fast-forward: "\f050";
@fa-var-fax: "\f1ac";
@fa-var-feed: "\f09e";
@fa-var-female: "\f182";
@fa-var-fighter-jet: "\f0fb";
@fa-var-file: "\f15b";
@fa-var-file-archive-o: "\f1c6";
@fa-var-file-audio-o: "\f1c7";
@fa-var-file-code-o: "\f1c9";
@fa-var-file-excel-o: "\f1c3";
@fa-var-file-image-o: "\f1c5";
@fa-var-file-movie-o: "\f1c8";
@fa-var-file-o: "\f016";
@fa-var-file-pdf-o: "\f1c1";
@fa-var-file-photo-o: "\f1c5";
@fa-var-file-picture-o: "\f1c5";
@fa-var-file-powerpoint-o: "\f1c4";
@fa-var-file-sound-o: "\f1c7";
@fa-var-file-text: "\f15c";
@fa-var-file-text-o: "\f0f6";
@fa-var-file-video-o: "\f1c8";
@fa-var-file-word-o: "\f1c2";
@fa-var-file-zip-o: "\f1c6";
@fa-var-files-o: "\f0c5";
@fa-var-film: "\f008";
@fa-var-filter: "\f0b0";
@fa-var-fire: "\f06d";
@fa-var-fire-extinguisher: "\f134";
@fa-var-firefox: "\f269";
@fa-var-first-order: "\f2b0";
@fa-var-flag: "\f024";
@fa-var-flag-checkered: "\f11e";
@fa-var-flag-o: "\f11d";
@fa-var-flash: "\f0e7";
@fa-var-flask: "\f0c3";
@fa-var-flickr: "\f16e";
@fa-var-floppy-o: "\f0c7";
@fa-var-folder: "\f07b";
@fa-var-folder-o: "\f114";
@fa-var-folder-open: "\f07c";
@fa-var-folder-open-o: "\f115";
@fa-var-font: "\f031";
@fa-var-font-awesome: "\f2b4";
@fa-var-fonticons: "\f280";
@fa-var-fort-awesome: "\f286";
@fa-var-forumbee: "\f211";
@fa-var-forward: "\f04e";
@fa-var-foursquare: "\f180";
@fa-var-free-code-camp: "\f2c5";
@fa-var-frown-o: "\f119";
@fa-var-futbol-o: "\f1e3";
@fa-var-gamepad: "\f11b";
@fa-var-gavel: "\f0e3";
@fa-var-gbp: "\f154";
@fa-var-ge: "\f1d1";
@fa-var-gear: "\f013";
@fa-var-gears: "\f085";
@fa-var-genderless: "\f22d";
@fa-var-get-pocket: "\f265";
@fa-var-gg: "\f260";
@fa-var-gg-circle: "\f261";
@fa-var-gift: "\f06b";
@fa-var-git: "\f1d3";
@fa-var-git-square: "\f1d2";
@fa-var-github: "\f09b";
@fa-var-github-alt: "\f113";
@fa-var-github-square: "\f092";
@fa-var-gitlab: "\f296";
@fa-var-gittip: "\f184";
@fa-var-glass: "\f000";
@fa-var-glide: "\f2a5";
@fa-var-glide-g: "\f2a6";
@fa-var-globe: "\f0ac";
@fa-var-google: "\f1a0";
@fa-var-google-plus: "\f0d5";
@fa-var-google-plus-circle: "\f2b3";
@fa-var-google-plus-official: "\f2b3";
@fa-var-google-plus-square: "\f0d4";
@fa-var-google-wallet: "\f1ee";
@fa-var-graduation-cap: "\f19d";
@fa-var-gratipay: "\f184";
@fa-var-grav: "\f2d6";
@fa-var-group: "\f0c0";
@fa-var-h-square: "\f0fd";
@fa-var-hacker-news: "\f1d4";
@fa-var-hand-grab-o: "\f255";
@fa-var-hand-lizard-o: "\f258";
@fa-var-hand-o-down: "\f0a7";
@fa-var-hand-o-left: "\f0a5";
@fa-var-hand-o-right: "\f0a4";
@fa-var-hand-o-up: "\f0a6";
@fa-var-hand-paper-o: "\f256";
@fa-var-hand-peace-o: "\f25b";
@fa-var-hand-pointer-o: "\f25a";
@fa-var-hand-rock-o: "\f255";
@fa-var-hand-scissors-o: "\f257";
@fa-var-hand-spock-o: "\f259";
@fa-var-hand-stop-o: "\f256";
@fa-var-handshake-o: "\f2b5";
@fa-var-hard-of-hearing: "\f2a4";
@fa-var-hashtag: "\f292";
@fa-var-hdd-o: "\f0a0";
@fa-var-header: "\f1dc";
@fa-var-headphones: "\f025";
@fa-var-heart: "\f004";
@fa-var-heart-o: "\f08a";
@fa-var-heartbeat: "\f21e";
@fa-var-history: "\f1da";
@fa-var-home: "\f015";
@fa-var-hospital-o: "\f0f8";
@fa-var-hotel: "\f236";
@fa-var-hourglass: "\f254";
@fa-var-hourglass-1: "\f251";
@fa-var-hourglass-2: "\f252";
@fa-var-hourglass-3: "\f253";
@fa-var-hourglass-end: "\f253";
@fa-var-hourglass-half: "\f252";
@fa-var-hourglass-o: "\f250";
@fa-var-hourglass-start: "\f251";
@fa-var-houzz: "\f27c";
@fa-var-html5: "\f13b";
@fa-var-i-cursor: "\f246";
@fa-var-id-badge: "\f2c1";
@fa-var-id-card: "\f2c2";
@fa-var-id-card-o: "\f2c3";
@fa-var-ils: "\f20b";
@fa-var-image: "\f03e";
@fa-var-imdb: "\f2d8";
@fa-var-inbox: "\f01c";
@fa-var-indent: "\f03c";
@fa-var-industry: "\f275";
@fa-var-info: "\f129";
@fa-var-info-circle: "\f05a";
@fa-var-inr: "\f156";
@fa-var-instagram: "\f16d";
@fa-var-institution: "\f19c";
@fa-var-internet-explorer: "\f26b";
@fa-var-intersex: "\f224";
@fa-var-ioxhost: "\f208";
@fa-var-italic: "\f033";
@fa-var-joomla: "\f1aa";
@fa-var-jpy: "\f157";
@fa-var-jsfiddle: "\f1cc";
@fa-var-key: "\f084";
@fa-var-keyboard-o: "\f11c";
@fa-var-krw: "\f159";
@fa-var-language: "\f1ab";
@fa-var-laptop: "\f109";
@fa-var-lastfm: "\f202";
@fa-var-lastfm-square: "\f203";
@fa-var-leaf: "\f06c";
@fa-var-leanpub: "\f212";
@fa-var-legal: "\f0e3";
@fa-var-lemon-o: "\f094";
@fa-var-level-down: "\f149";
@fa-var-level-up: "\f148";
@fa-var-life-bouy: "\f1cd";
@fa-var-life-buoy: "\f1cd";
@fa-var-life-ring: "\f1cd";
@fa-var-life-saver: "\f1cd";
@fa-var-lightbulb-o: "\f0eb";
@fa-var-line-chart: "\f201";
@fa-var-link: "\f0c1";
@fa-var-linkedin: "\f0e1";
@fa-var-linkedin-square: "\f08c";
@fa-var-linode: "\f2b8";
@fa-var-linux: "\f17c";
@fa-var-list: "\f03a";
@fa-var-list-alt: "\f022";
@fa-var-list-ol: "\f0cb";
@fa-var-list-ul: "\f0ca";
@fa-var-location-arrow: "\f124";
@fa-var-lock: "\f023";
@fa-var-long-arrow-down: "\f175";
@fa-var-long-arrow-left: "\f177";
@fa-var-long-arrow-right: "\f178";
@fa-var-long-arrow-up: "\f176";
@fa-var-low-vision: "\f2a8";
@fa-var-magic: "\f0d0";
@fa-var-magnet: "\f076";
@fa-var-mail-forward: "\f064";
@fa-var-mail-reply: "\f112";
@fa-var-mail-reply-all: "\f122";
@fa-var-male: "\f183";
@fa-var-map: "\f279";
@fa-var-map-marker: "\f041";
@fa-var-map-o: "\f278";
@fa-var-map-pin: "\f276";
@fa-var-map-signs: "\f277";
@fa-var-mars: "\f222";
@fa-var-mars-double: "\f227";
@fa-var-mars-stroke: "\f229";
@fa-var-mars-stroke-h: "\f22b";
@fa-var-mars-stroke-v: "\f22a";
@fa-var-maxcdn: "\f136";
@fa-var-meanpath: "\f20c";
@fa-var-medium: "\f23a";
@fa-var-medkit: "\f0fa";
@fa-var-meetup: "\f2e0";
@fa-var-meh-o: "\f11a";
@fa-var-mercury: "\f223";
@fa-var-microchip: "\f2db";
@fa-var-microphone: "\f130";
@fa-var-microphone-slash: "\f131";
@fa-var-minus: "\f068";
@fa-var-minus-circle: "\f056";
@fa-var-minus-square: "\f146";
@fa-var-minus-square-o: "\f147";
@fa-var-mixcloud: "\f289";
@fa-var-mobile: "\f10b";
@fa-var-mobile-phone: "\f10b";
@fa-var-modx: "\f285";
@fa-var-money: "\f0d6";
@fa-var-moon-o: "\f186";
@fa-var-mortar-board: "\f19d";
@fa-var-motorcycle: "\f21c";
@fa-var-mouse-pointer: "\f245";
@fa-var-music: "\f001";
@fa-var-navicon: "\f0c9";
@fa-var-neuter: "\f22c";
@fa-var-newspaper-o: "\f1ea";
@fa-var-object-group: "\f247";
@fa-var-object-ungroup: "\f248";
@fa-var-odnoklassniki: "\f263";
@fa-var-odnoklassniki-square: "\f264";
@fa-var-opencart: "\f23d";
@fa-var-openid: "\f19b";
@fa-var-opera: "\f26a";
@fa-var-optin-monster: "\f23c";
@fa-var-outdent: "\f03b";
@fa-var-pagelines: "\f18c";
@fa-var-paint-brush: "\f1fc";
@fa-var-paper-plane: "\f1d8";
@fa-var-paper-plane-o: "\f1d9";
@fa-var-paperclip: "\f0c6";
@fa-var-paragraph: "\f1dd";
@fa-var-paste: "\f0ea";
@fa-var-pause: "\f04c";
@fa-var-pause-circle: "\f28b";
@fa-var-pause-circle-o: "\f28c";
@fa-var-paw: "\f1b0";
@fa-var-paypal: "\f1ed";
@fa-var-pencil: "\f040";
@fa-var-pencil-square: "\f14b";
@fa-var-pencil-square-o: "\f044";
@fa-var-percent: "\f295";
@fa-var-phone: "\f095";
@fa-var-phone-square: "\f098";
@fa-var-photo: "\f03e";
@fa-var-picture-o: "\f03e";
@fa-var-pie-chart: "\f200";
@fa-var-pied-piper: "\f2ae";
@fa-var-pied-piper-alt: "\f1a8";
@fa-var-pied-piper-pp: "\f1a7";
@fa-var-pinterest: "\f0d2";
@fa-var-pinterest-p: "\f231";
@fa-var-pinterest-square: "\f0d3";
@fa-var-plane: "\f072";
@fa-var-play: "\f04b";
@fa-var-play-circle: "\f144";
@fa-var-play-circle-o: "\f01d";
@fa-var-plug: "\f1e6";
@fa-var-plus: "\f067";
@fa-var-plus-circle: "\f055";
@fa-var-plus-square: "\f0fe";
@fa-var-plus-square-o: "\f196";
@fa-var-podcast: "\f2ce";
@fa-var-power-off: "\f011";
@fa-var-print: "\f02f";
@fa-var-product-hunt: "\f288";
@fa-var-puzzle-piece: "\f12e";
@fa-var-qq: "\f1d6";
@fa-var-qrcode: "\f029";
@fa-var-question: "\f128";
@fa-var-question-circle: "\f059";
@fa-var-question-circle-o: "\f29c";
@fa-var-quora: "\f2c4";
@fa-var-quote-left: "\f10d";
@fa-var-quote-right: "\f10e";
@fa-var-ra: "\f1d0";
@fa-var-random: "\f074";
@fa-var-ravelry: "\f2d9";
@fa-var-rebel: "\f1d0";
@fa-var-recycle: "\f1b8";
@fa-var-reddit: "\f1a1";
@fa-var-reddit-alien: "\f281";
@fa-var-reddit-square: "\f1a2";
@fa-var-refresh: "\f021";
@fa-var-registered: "\f25d";
@fa-var-remove: "\f00d";
@fa-var-renren: "\f18b";
@fa-var-reorder: "\f0c9";
@fa-var-repeat: "\f01e";
@fa-var-reply: "\f112";
@fa-var-reply-all: "\f122";
@fa-var-resistance: "\f1d0";
@fa-var-retweet: "\f079";
@fa-var-rmb: "\f157";
@fa-var-road: "\f018";
@fa-var-rocket: "\f135";
@fa-var-rotate-left: "\f0e2";
@fa-var-rotate-right: "\f01e";
@fa-var-rouble: "\f158";
@fa-var-rss: "\f09e";
@fa-var-rss-square: "\f143";
@fa-var-rub: "\f158";
@fa-var-ruble: "\f158";
@fa-var-rupee: "\f156";
@fa-var-s15: "\f2cd";
@fa-var-safari: "\f267";
@fa-var-save: "\f0c7";
@fa-var-scissors: "\f0c4";
@fa-var-scribd: "\f28a";
@fa-var-search: "\f002";
@fa-var-search-minus: "\f010";
@fa-var-search-plus: "\f00e";
@fa-var-sellsy: "\f213";
@fa-var-send: "\f1d8";
@fa-var-send-o: "\f1d9";
@fa-var-server: "\f233";
@fa-var-share: "\f064";
@fa-var-share-alt: "\f1e0";
@fa-var-share-alt-square: "\f1e1";
@fa-var-share-square: "\f14d";
@fa-var-share-square-o: "\f045";
@fa-var-shekel: "\f20b";
@fa-var-sheqel: "\f20b";
@fa-var-shield: "\f132";
@fa-var-ship: "\f21a";
@fa-var-shirtsinbulk: "\f214";
@fa-var-shopping-bag: "\f290";
@fa-var-shopping-basket: "\f291";
@fa-var-shopping-cart: "\f07a";
@fa-var-shower: "\f2cc";
@fa-var-sign-in: "\f090";
@fa-var-sign-language: "\f2a7";
@fa-var-sign-out: "\f08b";
@fa-var-signal: "\f012";
@fa-var-signing: "\f2a7";
@fa-var-simplybuilt: "\f215";
@fa-var-sitemap: "\f0e8";
@fa-var-skyatlas: "\f216";
@fa-var-skype: "\f17e";
@fa-var-slack: "\f198";
@fa-var-sliders: "\f1de";
@fa-var-slideshare: "\f1e7";
@fa-var-smile-o: "\f118";
@fa-var-snapchat: "\f2ab";
@fa-var-snapchat-ghost: "\f2ac";
@fa-var-snapchat-square: "\f2ad";
@fa-var-snowflake-o: "\f2dc";
@fa-var-soccer-ball-o: "\f1e3";
@fa-var-sort: "\f0dc";
@fa-var-sort-alpha-asc: "\f15d";
@fa-var-sort-alpha-desc: "\f15e";
@fa-var-sort-amount-asc: "\f160";
@fa-var-sort-amount-desc: "\f161";
@fa-var-sort-asc: "\f0de";
@fa-var-sort-desc: "\f0dd";
@fa-var-sort-down: "\f0dd";
@fa-var-sort-numeric-asc: "\f162";
@fa-var-sort-numeric-desc: "\f163";
@fa-var-sort-up: "\f0de";
@fa-var-soundcloud: "\f1be";
@fa-var-space-shuttle: "\f197";
@fa-var-spinner: "\f110";
@fa-var-spoon: "\f1b1";
@fa-var-spotify: "\f1bc";
@fa-var-square: "\f0c8";
@fa-var-square-o: "\f096";
@fa-var-stack-exchange: "\f18d";
@fa-var-stack-overflow: "\f16c";
@fa-var-star: "\f005";
@fa-var-star-half: "\f089";
@fa-var-star-half-empty: "\f123";
@fa-var-star-half-full: "\f123";
@fa-var-star-half-o: "\f123";
@fa-var-star-o: "\f006";
@fa-var-steam: "\f1b6";
@fa-var-steam-square: "\f1b7";
@fa-var-step-backward: "\f048";
@fa-var-step-forward: "\f051";
@fa-var-stethoscope: "\f0f1";
@fa-var-sticky-note: "\f249";
@fa-var-sticky-note-o: "\f24a";
@fa-var-stop: "\f04d";
@fa-var-stop-circle: "\f28d";
@fa-var-stop-circle-o: "\f28e";
@fa-var-street-view: "\f21d";
@fa-var-strikethrough: "\f0cc";
@fa-var-stumbleupon: "\f1a4";
@fa-var-stumbleupon-circle: "\f1a3";
@fa-var-subscript: "\f12c";
@fa-var-subway: "\f239";
@fa-var-suitcase: "\f0f2";
@fa-var-sun-o: "\f185";
@fa-var-superpowers: "\f2dd";
@fa-var-superscript: "\f12b";
@fa-var-support: "\f1cd";
@fa-var-table: "\f0ce";
@fa-var-tablet: "\f10a";
@fa-var-tachometer: "\f0e4";
@fa-var-tag: "\f02b";
@fa-var-tags: "\f02c";
@fa-var-tasks: "\f0ae";
@fa-var-taxi: "\f1ba";
@fa-var-telegram: "\f2c6";
@fa-var-television: "\f26c";
@fa-var-tencent-weibo: "\f1d5";
@fa-var-terminal: "\f120";
@fa-var-text-height: "\f034";
@fa-var-text-width: "\f035";
@fa-var-th: "\f00a";
@fa-var-th-large: "\f009";
@fa-var-th-list: "\f00b";
@fa-var-themeisle: "\f2b2";
@fa-var-thermometer: "\f2c7";
@fa-var-thermometer-0: "\f2cb";
@fa-var-thermometer-1: "\f2ca";
@fa-var-thermometer-2: "\f2c9";
@fa-var-thermometer-3: "\f2c8";
@fa-var-thermometer-4: "\f2c7";
@fa-var-thermometer-empty: "\f2cb";
@fa-var-thermometer-full: "\f2c7";
@fa-var-thermometer-half: "\f2c9";
@fa-var-thermometer-quarter: "\f2ca";
@fa-var-thermometer-three-quarters: "\f2c8";
@fa-var-thumb-tack: "\f08d";
@fa-var-thumbs-down: "\f165";
@fa-var-thumbs-o-down: "\f088";
@fa-var-thumbs-o-up: "\f087";
@fa-var-thumbs-up: "\f164";
@fa-var-ticket: "\f145";
@fa-var-times: "\f00d";
@fa-var-times-circle: "\f057";
@fa-var-times-circle-o: "\f05c";
@fa-var-times-rectangle: "\f2d3";
@fa-var-times-rectangle-o: "\f2d4";
@fa-var-tint: "\f043";
@fa-var-toggle-down: "\f150";
@fa-var-toggle-left: "\f191";
@fa-var-toggle-off: "\f204";
@fa-var-toggle-on: "\f205";
@fa-var-toggle-right: "\f152";
@fa-var-toggle-up: "\f151";
@fa-var-trademark: "\f25c";
@fa-var-train: "\f238";
@fa-var-transgender: "\f224";
@fa-var-transgender-alt: "\f225";
@fa-var-trash: "\f1f8";
@fa-var-trash-o: "\f014";
@fa-var-tree: "\f1bb";
@fa-var-trello: "\f181";
@fa-var-tripadvisor: "\f262";
@fa-var-trophy: "\f091";
@fa-var-truck: "\f0d1";
@fa-var-try: "\f195";
@fa-var-tty: "\f1e4";
@fa-var-tumblr: "\f173";
@fa-var-tumblr-square: "\f174";
@fa-var-turkish-lira: "\f195";
@fa-var-tv: "\f26c";
@fa-var-twitch: "\f1e8";
@fa-var-twitter: "\f099";
@fa-var-twitter-square: "\f081";
@fa-var-umbrella: "\f0e9";
@fa-var-underline: "\f0cd";
@fa-var-undo: "\f0e2";
@fa-var-universal-access: "\f29a";
@fa-var-university: "\f19c";
@fa-var-unlink: "\f127";
@fa-var-unlock: "\f09c";
@fa-var-unlock-alt: "\f13e";
@fa-var-unsorted: "\f0dc";
@fa-var-upload: "\f093";
@fa-var-usb: "\f287";
@fa-var-usd: "\f155";
@fa-var-user: "\f007";
@fa-var-user-circle: "\f2bd";
@fa-var-user-circle-o: "\f2be";
@fa-var-user-md: "\f0f0";
@fa-var-user-o: "\f2c0";
@fa-var-user-plus: "\f234";
@fa-var-user-secret: "\f21b";
@fa-var-user-times: "\f235";
@fa-var-users: "\f0c0";
@fa-var-vcard: "\f2bb";
@fa-var-vcard-o: "\f2bc";
@fa-var-venus: "\f221";
@fa-var-venus-double: "\f226";
@fa-var-venus-mars: "\f228";
@fa-var-viacoin: "\f237";
@fa-var-viadeo: "\f2a9";
@fa-var-viadeo-square: "\f2aa";
@fa-var-video-camera: "\f03d";
@fa-var-vimeo: "\f27d";
@fa-var-vimeo-square: "\f194";
@fa-var-vine: "\f1ca";
@fa-var-vk: "\f189";
@fa-var-volume-control-phone: "\f2a0";
@fa-var-volume-down: "\f027";
@fa-var-volume-off: "\f026";
@fa-var-volume-up: "\f028";
@fa-var-warning: "\f071";
@fa-var-wechat: "\f1d7";
@fa-var-weibo: "\f18a";
@fa-var-weixin: "\f1d7";
@fa-var-whatsapp: "\f232";
@fa-var-wheelchair: "\f193";
@fa-var-wheelchair-alt: "\f29b";
@fa-var-wifi: "\f1eb";
@fa-var-wikipedia-w: "\f266";
@fa-var-window-close: "\f2d3";
@fa-var-window-close-o: "\f2d4";
@fa-var-window-maximize: "\f2d0";
@fa-var-window-minimize: "\f2d1";
@fa-var-window-restore: "\f2d2";
@fa-var-windows: "\f17a";
@fa-var-won: "\f159";
@fa-var-wordpress: "\f19a";
@fa-var-wpbeginner: "\f297";
@fa-var-wpexplorer: "\f2de";
@fa-var-wpforms: "\f298";
@fa-var-wrench: "\f0ad";
@fa-var-xing: "\f168";
@fa-var-xing-square: "\f169";
@fa-var-y-combinator: "\f23b";
@fa-var-y-combinator-square: "\f1d4";
@fa-var-yahoo: "\f19e";
@fa-var-yc: "\f23b";
@fa-var-yc-square: "\f1d4";
@fa-var-yelp: "\f1e9";
@fa-var-yen: "\f157";
@fa-var-yoast: "\f2b1";
@fa-var-youtube: "\f167";
@fa-var-youtube-play: "\f16a";
@fa-var-youtube-square: "\f166";

View File

@ -0,0 +1,34 @@
// Spinning Icons
// --------------------------
.#{$fa-css-prefix}-spin {
-webkit-animation: fa-spin 2s infinite linear;
animation: fa-spin 2s infinite linear;
}
.#{$fa-css-prefix}-pulse {
-webkit-animation: fa-spin 1s infinite steps(8);
animation: fa-spin 1s infinite steps(8);
}
@-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);
}
}

View File

@ -0,0 +1,25 @@
// Bordered & Pulled
// -------------------------
.#{$fa-css-prefix}-border {
padding: .2em .25em .15em;
border: solid .08em $fa-border-color;
border-radius: .1em;
}
.#{$fa-css-prefix}-pull-left { float: left; }
.#{$fa-css-prefix}-pull-right { float: right; }
.#{$fa-css-prefix} {
&.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
&.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
}
/* Deprecated as of 4.4.0 */
.pull-right { float: right; }
.pull-left { float: left; }
.#{$fa-css-prefix} {
&.pull-left { margin-right: .3em; }
&.pull-right { margin-left: .3em; }
}

View File

@ -0,0 +1,12 @@
// Base Class Definition
// -------------------------
.#{$fa-css-prefix} {
display: inline-block;
font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}

View File

@ -0,0 +1,6 @@
// Fixed Width Icons
// -------------------------
.#{$fa-css-prefix}-fw {
width: (18em / 14);
text-align: center;
}

View File

@ -0,0 +1,789 @@
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
readers do not read off random characters that represent icons */
.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; }
.#{$fa-css-prefix}-music:before { content: $fa-var-music; }
.#{$fa-css-prefix}-search:before { content: $fa-var-search; }
.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; }
.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; }
.#{$fa-css-prefix}-star:before { content: $fa-var-star; }
.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; }
.#{$fa-css-prefix}-user:before { content: $fa-var-user; }
.#{$fa-css-prefix}-film:before { content: $fa-var-film; }
.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; }
.#{$fa-css-prefix}-th:before { content: $fa-var-th; }
.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; }
.#{$fa-css-prefix}-check:before { content: $fa-var-check; }
.#{$fa-css-prefix}-remove:before,
.#{$fa-css-prefix}-close:before,
.#{$fa-css-prefix}-times:before { content: $fa-var-times; }
.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; }
.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; }
.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; }
.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; }
.#{$fa-css-prefix}-gear:before,
.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; }
.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; }
.#{$fa-css-prefix}-home:before { content: $fa-var-home; }
.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; }
.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; }
.#{$fa-css-prefix}-road:before { content: $fa-var-road; }
.#{$fa-css-prefix}-download:before { content: $fa-var-download; }
.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; }
.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; }
.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; }
.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; }
.#{$fa-css-prefix}-rotate-right:before,
.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; }
.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; }
.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; }
.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; }
.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; }
.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; }
.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; }
.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; }
.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; }
.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; }
.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; }
.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; }
.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; }
.#{$fa-css-prefix}-book:before { content: $fa-var-book; }
.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; }
.#{$fa-css-prefix}-print:before { content: $fa-var-print; }
.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; }
.#{$fa-css-prefix}-font:before { content: $fa-var-font; }
.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; }
.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; }
.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; }
.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; }
.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; }
.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; }
.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; }
.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; }
.#{$fa-css-prefix}-list:before { content: $fa-var-list; }
.#{$fa-css-prefix}-dedent:before,
.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; }
.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; }
.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; }
.#{$fa-css-prefix}-photo:before,
.#{$fa-css-prefix}-image:before,
.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; }
.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; }
.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; }
.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; }
.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; }
.#{$fa-css-prefix}-edit:before,
.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; }
.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; }
.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; }
.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; }
.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; }
.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; }
.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; }
.#{$fa-css-prefix}-play:before { content: $fa-var-play; }
.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; }
.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; }
.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; }
.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; }
.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; }
.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; }
.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; }
.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; }
.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; }
.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; }
.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; }
.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; }
.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; }
.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; }
.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; }
.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; }
.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; }
.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; }
.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; }
.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; }
.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; }
.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; }
.#{$fa-css-prefix}-mail-forward:before,
.#{$fa-css-prefix}-share:before { content: $fa-var-share; }
.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; }
.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; }
.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; }
.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; }
.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; }
.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; }
.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; }
.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; }
.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; }
.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; }
.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; }
.#{$fa-css-prefix}-warning:before,
.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; }
.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; }
.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; }
.#{$fa-css-prefix}-random:before { content: $fa-var-random; }
.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; }
.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; }
.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; }
.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; }
.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; }
.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; }
.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; }
.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; }
.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; }
.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; }
.#{$fa-css-prefix}-bar-chart-o:before,
.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; }
.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; }
.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; }
.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; }
.#{$fa-css-prefix}-key:before { content: $fa-var-key; }
.#{$fa-css-prefix}-gears:before,
.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; }
.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; }
.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; }
.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; }
.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; }
.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; }
.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; }
.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; }
.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; }
.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; }
.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; }
.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; }
.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; }
.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; }
.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; }
.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; }
.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; }
.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; }
.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; }
.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; }
.#{$fa-css-prefix}-facebook-f:before,
.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; }
.#{$fa-css-prefix}-github:before { content: $fa-var-github; }
.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }
.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }
.#{$fa-css-prefix}-feed:before,
.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }
.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }
.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }
.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; }
.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; }
.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; }
.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; }
.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; }
.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; }
.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; }
.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; }
.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; }
.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; }
.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; }
.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; }
.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; }
.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; }
.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; }
.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; }
.#{$fa-css-prefix}-group:before,
.#{$fa-css-prefix}-users:before { content: $fa-var-users; }
.#{$fa-css-prefix}-chain:before,
.#{$fa-css-prefix}-link:before { content: $fa-var-link; }
.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; }
.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; }
.#{$fa-css-prefix}-cut:before,
.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; }
.#{$fa-css-prefix}-copy:before,
.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; }
.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; }
.#{$fa-css-prefix}-save:before,
.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; }
.#{$fa-css-prefix}-square:before { content: $fa-var-square; }
.#{$fa-css-prefix}-navicon:before,
.#{$fa-css-prefix}-reorder:before,
.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; }
.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; }
.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; }
.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; }
.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; }
.#{$fa-css-prefix}-table:before { content: $fa-var-table; }
.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; }
.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; }
.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; }
.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; }
.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; }
.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; }
.#{$fa-css-prefix}-money:before { content: $fa-var-money; }
.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; }
.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; }
.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; }
.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; }
.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; }
.#{$fa-css-prefix}-unsorted:before,
.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; }
.#{$fa-css-prefix}-sort-down:before,
.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; }
.#{$fa-css-prefix}-sort-up:before,
.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; }
.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; }
.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; }
.#{$fa-css-prefix}-rotate-left:before,
.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; }
.#{$fa-css-prefix}-legal:before,
.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; }
.#{$fa-css-prefix}-dashboard:before,
.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; }
.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; }
.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; }
.#{$fa-css-prefix}-flash:before,
.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; }
.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; }
.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; }
.#{$fa-css-prefix}-paste:before,
.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; }
.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; }
.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; }
.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; }
.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; }
.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; }
.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; }
.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; }
.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; }
.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; }
.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; }
.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; }
.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; }
.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; }
.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; }
.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; }
.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; }
.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; }
.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; }
.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; }
.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; }
.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; }
.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; }
.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; }
.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; }
.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; }
.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; }
.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; }
.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; }
.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; }
.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; }
.#{$fa-css-prefix}-mobile-phone:before,
.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; }
.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; }
.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; }
.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; }
.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; }
.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; }
.#{$fa-css-prefix}-mail-reply:before,
.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; }
.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; }
.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; }
.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; }
.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; }
.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; }
.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; }
.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; }
.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; }
.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; }
.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; }
.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; }
.#{$fa-css-prefix}-code:before { content: $fa-var-code; }
.#{$fa-css-prefix}-mail-reply-all:before,
.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; }
.#{$fa-css-prefix}-star-half-empty:before,
.#{$fa-css-prefix}-star-half-full:before,
.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; }
.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; }
.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; }
.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; }
.#{$fa-css-prefix}-unlink:before,
.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; }
.#{$fa-css-prefix}-question:before { content: $fa-var-question; }
.#{$fa-css-prefix}-info:before { content: $fa-var-info; }
.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; }
.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; }
.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; }
.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; }
.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; }
.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; }
.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; }
.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; }
.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; }
.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; }
.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; }
.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; }
.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; }
.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; }
.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; }
.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; }
.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; }
.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; }
.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; }
.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; }
.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; }
.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; }
.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; }
.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; }
.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; }
.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; }
.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; }
.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; }
.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; }
.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; }
.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; }
.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; }
.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; }
.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; }
.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; }
.#{$fa-css-prefix}-toggle-down:before,
.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; }
.#{$fa-css-prefix}-toggle-up:before,
.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; }
.#{$fa-css-prefix}-toggle-right:before,
.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; }
.#{$fa-css-prefix}-euro:before,
.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; }
.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; }
.#{$fa-css-prefix}-dollar:before,
.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; }
.#{$fa-css-prefix}-rupee:before,
.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; }
.#{$fa-css-prefix}-cny:before,
.#{$fa-css-prefix}-rmb:before,
.#{$fa-css-prefix}-yen:before,
.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; }
.#{$fa-css-prefix}-ruble:before,
.#{$fa-css-prefix}-rouble:before,
.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; }
.#{$fa-css-prefix}-won:before,
.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; }
.#{$fa-css-prefix}-bitcoin:before,
.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; }
.#{$fa-css-prefix}-file:before { content: $fa-var-file; }
.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; }
.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; }
.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; }
.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; }
.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; }
.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; }
.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; }
.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; }
.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; }
.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; }
.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; }
.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; }
.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; }
.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; }
.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; }
.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; }
.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; }
.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; }
.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; }
.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; }
.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; }
.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; }
.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; }
.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; }
.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; }
.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; }
.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; }
.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; }
.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; }
.#{$fa-css-prefix}-android:before { content: $fa-var-android; }
.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; }
.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; }
.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; }
.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; }
.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; }
.#{$fa-css-prefix}-female:before { content: $fa-var-female; }
.#{$fa-css-prefix}-male:before { content: $fa-var-male; }
.#{$fa-css-prefix}-gittip:before,
.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; }
.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; }
.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; }
.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; }
.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; }
.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; }
.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; }
.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; }
.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; }
.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; }
.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; }
.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; }
.#{$fa-css-prefix}-toggle-left:before,
.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; }
.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; }
.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; }
.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; }
.#{$fa-css-prefix}-turkish-lira:before,
.#{$fa-css-prefix}-try:before { content: $fa-var-try; }
.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; }
.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; }
.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; }
.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; }
.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; }
.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; }
.#{$fa-css-prefix}-institution:before,
.#{$fa-css-prefix}-bank:before,
.#{$fa-css-prefix}-university:before { content: $fa-var-university; }
.#{$fa-css-prefix}-mortar-board:before,
.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; }
.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; }
.#{$fa-css-prefix}-google:before { content: $fa-var-google; }
.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; }
.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; }
.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; }
.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }
.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }
.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }
.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; }
.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }
.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }
.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }
.#{$fa-css-prefix}-language:before { content: $fa-var-language; }
.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; }
.#{$fa-css-prefix}-building:before { content: $fa-var-building; }
.#{$fa-css-prefix}-child:before { content: $fa-var-child; }
.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; }
.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; }
.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; }
.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; }
.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; }
.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; }
.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; }
.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; }
.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; }
.#{$fa-css-prefix}-automobile:before,
.#{$fa-css-prefix}-car:before { content: $fa-var-car; }
.#{$fa-css-prefix}-cab:before,
.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; }
.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; }
.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; }
.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; }
.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; }
.#{$fa-css-prefix}-database:before { content: $fa-var-database; }
.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; }
.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; }
.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; }
.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; }
.#{$fa-css-prefix}-file-photo-o:before,
.#{$fa-css-prefix}-file-picture-o:before,
.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; }
.#{$fa-css-prefix}-file-zip-o:before,
.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; }
.#{$fa-css-prefix}-file-sound-o:before,
.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; }
.#{$fa-css-prefix}-file-movie-o:before,
.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; }
.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; }
.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; }
.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; }
.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; }
.#{$fa-css-prefix}-life-bouy:before,
.#{$fa-css-prefix}-life-buoy:before,
.#{$fa-css-prefix}-life-saver:before,
.#{$fa-css-prefix}-support:before,
.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }
.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }
.#{$fa-css-prefix}-ra:before,
.#{$fa-css-prefix}-resistance:before,
.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }
.#{$fa-css-prefix}-ge:before,
.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }
.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }
.#{$fa-css-prefix}-git:before { content: $fa-var-git; }
.#{$fa-css-prefix}-y-combinator-square:before,
.#{$fa-css-prefix}-yc-square:before,
.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }
.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }
.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }
.#{$fa-css-prefix}-wechat:before,
.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; }
.#{$fa-css-prefix}-send:before,
.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; }
.#{$fa-css-prefix}-send-o:before,
.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }
.#{$fa-css-prefix}-history:before { content: $fa-var-history; }
.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }
.#{$fa-css-prefix}-header:before { content: $fa-var-header; }
.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }
.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; }
.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; }
.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; }
.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; }
.#{$fa-css-prefix}-soccer-ball-o:before,
.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; }
.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; }
.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; }
.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; }
.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; }
.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; }
.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; }
.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; }
.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; }
.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; }
.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; }
.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; }
.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; }
.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; }
.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; }
.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; }
.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; }
.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; }
.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; }
.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; }
.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; }
.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; }
.#{$fa-css-prefix}-at:before { content: $fa-var-at; }
.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; }
.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; }
.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; }
.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; }
.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; }
.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; }
.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; }
.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; }
.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; }
.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; }
.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; }
.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; }
.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; }
.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; }
.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; }
.#{$fa-css-prefix}-shekel:before,
.#{$fa-css-prefix}-sheqel:before,
.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; }
.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; }
.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; }
.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; }
.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; }
.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; }
.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; }
.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; }
.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; }
.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; }
.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; }
.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; }
.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; }
.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; }
.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; }
.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; }
.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; }
.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; }
.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; }
.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; }
.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; }
.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; }
.#{$fa-css-prefix}-intersex:before,
.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; }
.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; }
.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; }
.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; }
.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; }
.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; }
.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; }
.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; }
.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; }
.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; }
.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; }
.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; }
.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; }
.#{$fa-css-prefix}-server:before { content: $fa-var-server; }
.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; }
.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; }
.#{$fa-css-prefix}-hotel:before,
.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; }
.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; }
.#{$fa-css-prefix}-train:before { content: $fa-var-train; }
.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; }
.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; }
.#{$fa-css-prefix}-yc:before,
.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; }
.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; }
.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; }
.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; }
.#{$fa-css-prefix}-battery-4:before,
.#{$fa-css-prefix}-battery:before,
.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; }
.#{$fa-css-prefix}-battery-3:before,
.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; }
.#{$fa-css-prefix}-battery-2:before,
.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; }
.#{$fa-css-prefix}-battery-1:before,
.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; }
.#{$fa-css-prefix}-battery-0:before,
.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; }
.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; }
.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; }
.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; }
.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; }
.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; }
.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; }
.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; }
.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; }
.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; }
.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; }
.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; }
.#{$fa-css-prefix}-hourglass-1:before,
.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; }
.#{$fa-css-prefix}-hourglass-2:before,
.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; }
.#{$fa-css-prefix}-hourglass-3:before,
.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; }
.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; }
.#{$fa-css-prefix}-hand-grab-o:before,
.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; }
.#{$fa-css-prefix}-hand-stop-o:before,
.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; }
.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; }
.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; }
.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; }
.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; }
.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; }
.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; }
.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; }
.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; }
.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; }
.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; }
.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; }
.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; }
.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; }
.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; }
.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; }
.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; }
.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; }
.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; }
.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; }
.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; }
.#{$fa-css-prefix}-tv:before,
.#{$fa-css-prefix}-television:before { content: $fa-var-television; }
.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; }
.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; }
.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; }
.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; }
.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; }
.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; }
.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; }
.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; }
.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; }
.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; }
.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; }
.#{$fa-css-prefix}-map:before { content: $fa-var-map; }
.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; }
.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; }
.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; }
.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; }
.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; }
.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; }
.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; }
.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; }
.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; }
.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; }
.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; }
.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; }
.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; }
.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; }
.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; }
.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; }
.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; }
.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; }
.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; }
.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; }
.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; }
.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; }
.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; }
.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; }
.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; }
.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; }
.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; }
.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; }
.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; }
.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; }
.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; }
.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; }
.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; }
.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; }
.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; }
.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; }
.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; }
.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; }
.#{$fa-css-prefix}-asl-interpreting:before,
.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; }
.#{$fa-css-prefix}-deafness:before,
.#{$fa-css-prefix}-hard-of-hearing:before,
.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; }
.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; }
.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; }
.#{$fa-css-prefix}-signing:before,
.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; }
.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; }
.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; }
.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; }
.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; }
.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; }
.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; }
.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }
.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; }
.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; }
.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; }
.#{$fa-css-prefix}-google-plus-circle:before,
.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; }
.#{$fa-css-prefix}-fa:before,
.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; }
.#{$fa-css-prefix}-handshake-o:before { content: $fa-var-handshake-o; }
.#{$fa-css-prefix}-envelope-open:before { content: $fa-var-envelope-open; }
.#{$fa-css-prefix}-envelope-open-o:before { content: $fa-var-envelope-open-o; }
.#{$fa-css-prefix}-linode:before { content: $fa-var-linode; }
.#{$fa-css-prefix}-address-book:before { content: $fa-var-address-book; }
.#{$fa-css-prefix}-address-book-o:before { content: $fa-var-address-book-o; }
.#{$fa-css-prefix}-vcard:before,
.#{$fa-css-prefix}-address-card:before { content: $fa-var-address-card; }
.#{$fa-css-prefix}-vcard-o:before,
.#{$fa-css-prefix}-address-card-o:before { content: $fa-var-address-card-o; }
.#{$fa-css-prefix}-user-circle:before { content: $fa-var-user-circle; }
.#{$fa-css-prefix}-user-circle-o:before { content: $fa-var-user-circle-o; }
.#{$fa-css-prefix}-user-o:before { content: $fa-var-user-o; }
.#{$fa-css-prefix}-id-badge:before { content: $fa-var-id-badge; }
.#{$fa-css-prefix}-drivers-license:before,
.#{$fa-css-prefix}-id-card:before { content: $fa-var-id-card; }
.#{$fa-css-prefix}-drivers-license-o:before,
.#{$fa-css-prefix}-id-card-o:before { content: $fa-var-id-card-o; }
.#{$fa-css-prefix}-quora:before { content: $fa-var-quora; }
.#{$fa-css-prefix}-free-code-camp:before { content: $fa-var-free-code-camp; }
.#{$fa-css-prefix}-telegram:before { content: $fa-var-telegram; }
.#{$fa-css-prefix}-thermometer-4:before,
.#{$fa-css-prefix}-thermometer:before,
.#{$fa-css-prefix}-thermometer-full:before { content: $fa-var-thermometer-full; }
.#{$fa-css-prefix}-thermometer-3:before,
.#{$fa-css-prefix}-thermometer-three-quarters:before { content: $fa-var-thermometer-three-quarters; }
.#{$fa-css-prefix}-thermometer-2:before,
.#{$fa-css-prefix}-thermometer-half:before { content: $fa-var-thermometer-half; }
.#{$fa-css-prefix}-thermometer-1:before,
.#{$fa-css-prefix}-thermometer-quarter:before { content: $fa-var-thermometer-quarter; }
.#{$fa-css-prefix}-thermometer-0:before,
.#{$fa-css-prefix}-thermometer-empty:before { content: $fa-var-thermometer-empty; }
.#{$fa-css-prefix}-shower:before { content: $fa-var-shower; }
.#{$fa-css-prefix}-bathtub:before,
.#{$fa-css-prefix}-s15:before,
.#{$fa-css-prefix}-bath:before { content: $fa-var-bath; }
.#{$fa-css-prefix}-podcast:before { content: $fa-var-podcast; }
.#{$fa-css-prefix}-window-maximize:before { content: $fa-var-window-maximize; }
.#{$fa-css-prefix}-window-minimize:before { content: $fa-var-window-minimize; }
.#{$fa-css-prefix}-window-restore:before { content: $fa-var-window-restore; }
.#{$fa-css-prefix}-times-rectangle:before,
.#{$fa-css-prefix}-window-close:before { content: $fa-var-window-close; }
.#{$fa-css-prefix}-times-rectangle-o:before,
.#{$fa-css-prefix}-window-close-o:before { content: $fa-var-window-close-o; }
.#{$fa-css-prefix}-bandcamp:before { content: $fa-var-bandcamp; }
.#{$fa-css-prefix}-grav:before { content: $fa-var-grav; }
.#{$fa-css-prefix}-etsy:before { content: $fa-var-etsy; }
.#{$fa-css-prefix}-imdb:before { content: $fa-var-imdb; }
.#{$fa-css-prefix}-ravelry:before { content: $fa-var-ravelry; }
.#{$fa-css-prefix}-eercast:before { content: $fa-var-eercast; }
.#{$fa-css-prefix}-microchip:before { content: $fa-var-microchip; }
.#{$fa-css-prefix}-snowflake-o:before { content: $fa-var-snowflake-o; }
.#{$fa-css-prefix}-superpowers:before { content: $fa-var-superpowers; }
.#{$fa-css-prefix}-wpexplorer:before { content: $fa-var-wpexplorer; }
.#{$fa-css-prefix}-meetup:before { content: $fa-var-meetup; }

View File

@ -0,0 +1,13 @@
// Icon Sizes
// -------------------------
/* makes the font 33% larger relative to the icon container */
.#{$fa-css-prefix}-lg {
font-size: (4em / 3);
line-height: (3em / 4);
vertical-align: -15%;
}
.#{$fa-css-prefix}-2x { font-size: 2em; }
.#{$fa-css-prefix}-3x { font-size: 3em; }
.#{$fa-css-prefix}-4x { font-size: 4em; }
.#{$fa-css-prefix}-5x { font-size: 5em; }

View File

@ -0,0 +1,19 @@
// List Icons
// -------------------------
.#{$fa-css-prefix}-ul {
padding-left: 0;
margin-left: $fa-li-width;
list-style-type: none;
> li { position: relative; }
}
.#{$fa-css-prefix}-li {
position: absolute;
left: -$fa-li-width;
width: $fa-li-width;
top: (2em / 14);
text-align: center;
&.#{$fa-css-prefix}-lg {
left: -$fa-li-width + (4em / 14);
}
}

View File

@ -0,0 +1,60 @@
// Mixins
// --------------------------
@mixin fa-icon() {
display: inline-block;
font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
@mixin fa-icon-rotate($degrees, $rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})";
-webkit-transform: rotate($degrees);
-ms-transform: rotate($degrees);
transform: rotate($degrees);
}
@mixin fa-icon-flip($horiz, $vert, $rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)";
-webkit-transform: scale($horiz, $vert);
-ms-transform: scale($horiz, $vert);
transform: scale($horiz, $vert);
}
// Only display content to screen readers. A la Bootstrap 4.
//
// See: http://a11yproject.com/posts/how-to-hide-content/
@mixin sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0,0,0,0);
border: 0;
}
// Use in conjunction with .sr-only to only display content when it's focused.
//
// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
//
// Credit: HTML5 Boilerplate
@mixin sr-only-focusable {
&:active,
&:focus {
position: static;
width: auto;
height: auto;
margin: 0;
overflow: visible;
clip: auto;
}
}

View File

@ -0,0 +1,15 @@
/* FONT PATH
* -------------------------- */
@font-face {
font-family: 'FontAwesome';
src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),
url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
font-weight: normal;
font-style: normal;
}

View File

@ -0,0 +1,20 @@
// Rotated & Flipped Icons
// -------------------------
.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
// Hook for IE8-9
// -------------------------
:root .#{$fa-css-prefix}-rotate-90,
:root .#{$fa-css-prefix}-rotate-180,
:root .#{$fa-css-prefix}-rotate-270,
:root .#{$fa-css-prefix}-flip-horizontal,
:root .#{$fa-css-prefix}-flip-vertical {
filter: none;
}

View File

@ -0,0 +1,5 @@
// Screen Readers
// -------------------------
.sr-only { @include sr-only(); }
.sr-only-focusable { @include sr-only-focusable(); }

View File

@ -0,0 +1,20 @@
// Stacked Icons
// -------------------------
.#{$fa-css-prefix}-stack {
position: relative;
display: inline-block;
width: 2em;
height: 2em;
line-height: 2em;
vertical-align: middle;
}
.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {
position: absolute;
left: 0;
width: 100%;
text-align: center;
}
.#{$fa-css-prefix}-stack-1x { line-height: inherit; }
.#{$fa-css-prefix}-stack-2x { font-size: 2em; }
.#{$fa-css-prefix}-inverse { color: $fa-inverse; }

View File

@ -0,0 +1,800 @@
// Variables
// --------------------------
$fa-font-path: "../fonts" !default;
$fa-font-size-base: 14px !default;
$fa-line-height-base: 1 !default;
//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts" !default; // for referencing Bootstrap CDN font files directly
$fa-css-prefix: fa !default;
$fa-version: "4.7.0" !default;
$fa-border-color: #eee !default;
$fa-inverse: #fff !default;
$fa-li-width: (30em / 14) !default;
$fa-var-500px: "\f26e";
$fa-var-address-book: "\f2b9";
$fa-var-address-book-o: "\f2ba";
$fa-var-address-card: "\f2bb";
$fa-var-address-card-o: "\f2bc";
$fa-var-adjust: "\f042";
$fa-var-adn: "\f170";
$fa-var-align-center: "\f037";
$fa-var-align-justify: "\f039";
$fa-var-align-left: "\f036";
$fa-var-align-right: "\f038";
$fa-var-amazon: "\f270";
$fa-var-ambulance: "\f0f9";
$fa-var-american-sign-language-interpreting: "\f2a3";
$fa-var-anchor: "\f13d";
$fa-var-android: "\f17b";
$fa-var-angellist: "\f209";
$fa-var-angle-double-down: "\f103";
$fa-var-angle-double-left: "\f100";
$fa-var-angle-double-right: "\f101";
$fa-var-angle-double-up: "\f102";
$fa-var-angle-down: "\f107";
$fa-var-angle-left: "\f104";
$fa-var-angle-right: "\f105";
$fa-var-angle-up: "\f106";
$fa-var-apple: "\f179";
$fa-var-archive: "\f187";
$fa-var-area-chart: "\f1fe";
$fa-var-arrow-circle-down: "\f0ab";
$fa-var-arrow-circle-left: "\f0a8";
$fa-var-arrow-circle-o-down: "\f01a";
$fa-var-arrow-circle-o-left: "\f190";
$fa-var-arrow-circle-o-right: "\f18e";
$fa-var-arrow-circle-o-up: "\f01b";
$fa-var-arrow-circle-right: "\f0a9";
$fa-var-arrow-circle-up: "\f0aa";
$fa-var-arrow-down: "\f063";
$fa-var-arrow-left: "\f060";
$fa-var-arrow-right: "\f061";
$fa-var-arrow-up: "\f062";
$fa-var-arrows: "\f047";
$fa-var-arrows-alt: "\f0b2";
$fa-var-arrows-h: "\f07e";
$fa-var-arrows-v: "\f07d";
$fa-var-asl-interpreting: "\f2a3";
$fa-var-assistive-listening-systems: "\f2a2";
$fa-var-asterisk: "\f069";
$fa-var-at: "\f1fa";
$fa-var-audio-description: "\f29e";
$fa-var-automobile: "\f1b9";
$fa-var-backward: "\f04a";
$fa-var-balance-scale: "\f24e";
$fa-var-ban: "\f05e";
$fa-var-bandcamp: "\f2d5";
$fa-var-bank: "\f19c";
$fa-var-bar-chart: "\f080";
$fa-var-bar-chart-o: "\f080";
$fa-var-barcode: "\f02a";
$fa-var-bars: "\f0c9";
$fa-var-bath: "\f2cd";
$fa-var-bathtub: "\f2cd";
$fa-var-battery: "\f240";
$fa-var-battery-0: "\f244";
$fa-var-battery-1: "\f243";
$fa-var-battery-2: "\f242";
$fa-var-battery-3: "\f241";
$fa-var-battery-4: "\f240";
$fa-var-battery-empty: "\f244";
$fa-var-battery-full: "\f240";
$fa-var-battery-half: "\f242";
$fa-var-battery-quarter: "\f243";
$fa-var-battery-three-quarters: "\f241";
$fa-var-bed: "\f236";
$fa-var-beer: "\f0fc";
$fa-var-behance: "\f1b4";
$fa-var-behance-square: "\f1b5";
$fa-var-bell: "\f0f3";
$fa-var-bell-o: "\f0a2";
$fa-var-bell-slash: "\f1f6";
$fa-var-bell-slash-o: "\f1f7";
$fa-var-bicycle: "\f206";
$fa-var-binoculars: "\f1e5";
$fa-var-birthday-cake: "\f1fd";
$fa-var-bitbucket: "\f171";
$fa-var-bitbucket-square: "\f172";
$fa-var-bitcoin: "\f15a";
$fa-var-black-tie: "\f27e";
$fa-var-blind: "\f29d";
$fa-var-bluetooth: "\f293";
$fa-var-bluetooth-b: "\f294";
$fa-var-bold: "\f032";
$fa-var-bolt: "\f0e7";
$fa-var-bomb: "\f1e2";
$fa-var-book: "\f02d";
$fa-var-bookmark: "\f02e";
$fa-var-bookmark-o: "\f097";
$fa-var-braille: "\f2a1";
$fa-var-briefcase: "\f0b1";
$fa-var-btc: "\f15a";
$fa-var-bug: "\f188";
$fa-var-building: "\f1ad";
$fa-var-building-o: "\f0f7";
$fa-var-bullhorn: "\f0a1";
$fa-var-bullseye: "\f140";
$fa-var-bus: "\f207";
$fa-var-buysellads: "\f20d";
$fa-var-cab: "\f1ba";
$fa-var-calculator: "\f1ec";
$fa-var-calendar: "\f073";
$fa-var-calendar-check-o: "\f274";
$fa-var-calendar-minus-o: "\f272";
$fa-var-calendar-o: "\f133";
$fa-var-calendar-plus-o: "\f271";
$fa-var-calendar-times-o: "\f273";
$fa-var-camera: "\f030";
$fa-var-camera-retro: "\f083";
$fa-var-car: "\f1b9";
$fa-var-caret-down: "\f0d7";
$fa-var-caret-left: "\f0d9";
$fa-var-caret-right: "\f0da";
$fa-var-caret-square-o-down: "\f150";
$fa-var-caret-square-o-left: "\f191";
$fa-var-caret-square-o-right: "\f152";
$fa-var-caret-square-o-up: "\f151";
$fa-var-caret-up: "\f0d8";
$fa-var-cart-arrow-down: "\f218";
$fa-var-cart-plus: "\f217";
$fa-var-cc: "\f20a";
$fa-var-cc-amex: "\f1f3";
$fa-var-cc-diners-club: "\f24c";
$fa-var-cc-discover: "\f1f2";
$fa-var-cc-jcb: "\f24b";
$fa-var-cc-mastercard: "\f1f1";
$fa-var-cc-paypal: "\f1f4";
$fa-var-cc-stripe: "\f1f5";
$fa-var-cc-visa: "\f1f0";
$fa-var-certificate: "\f0a3";
$fa-var-chain: "\f0c1";
$fa-var-chain-broken: "\f127";
$fa-var-check: "\f00c";
$fa-var-check-circle: "\f058";
$fa-var-check-circle-o: "\f05d";
$fa-var-check-square: "\f14a";
$fa-var-check-square-o: "\f046";
$fa-var-chevron-circle-down: "\f13a";
$fa-var-chevron-circle-left: "\f137";
$fa-var-chevron-circle-right: "\f138";
$fa-var-chevron-circle-up: "\f139";
$fa-var-chevron-down: "\f078";
$fa-var-chevron-left: "\f053";
$fa-var-chevron-right: "\f054";
$fa-var-chevron-up: "\f077";
$fa-var-child: "\f1ae";
$fa-var-chrome: "\f268";
$fa-var-circle: "\f111";
$fa-var-circle-o: "\f10c";
$fa-var-circle-o-notch: "\f1ce";
$fa-var-circle-thin: "\f1db";
$fa-var-clipboard: "\f0ea";
$fa-var-clock-o: "\f017";
$fa-var-clone: "\f24d";
$fa-var-close: "\f00d";
$fa-var-cloud: "\f0c2";
$fa-var-cloud-download: "\f0ed";
$fa-var-cloud-upload: "\f0ee";
$fa-var-cny: "\f157";
$fa-var-code: "\f121";
$fa-var-code-fork: "\f126";
$fa-var-codepen: "\f1cb";
$fa-var-codiepie: "\f284";
$fa-var-coffee: "\f0f4";
$fa-var-cog: "\f013";
$fa-var-cogs: "\f085";
$fa-var-columns: "\f0db";
$fa-var-comment: "\f075";
$fa-var-comment-o: "\f0e5";
$fa-var-commenting: "\f27a";
$fa-var-commenting-o: "\f27b";
$fa-var-comments: "\f086";
$fa-var-comments-o: "\f0e6";
$fa-var-compass: "\f14e";
$fa-var-compress: "\f066";
$fa-var-connectdevelop: "\f20e";
$fa-var-contao: "\f26d";
$fa-var-copy: "\f0c5";
$fa-var-copyright: "\f1f9";
$fa-var-creative-commons: "\f25e";
$fa-var-credit-card: "\f09d";
$fa-var-credit-card-alt: "\f283";
$fa-var-crop: "\f125";
$fa-var-crosshairs: "\f05b";
$fa-var-css3: "\f13c";
$fa-var-cube: "\f1b2";
$fa-var-cubes: "\f1b3";
$fa-var-cut: "\f0c4";
$fa-var-cutlery: "\f0f5";
$fa-var-dashboard: "\f0e4";
$fa-var-dashcube: "\f210";
$fa-var-database: "\f1c0";
$fa-var-deaf: "\f2a4";
$fa-var-deafness: "\f2a4";
$fa-var-dedent: "\f03b";
$fa-var-delicious: "\f1a5";
$fa-var-desktop: "\f108";
$fa-var-deviantart: "\f1bd";
$fa-var-diamond: "\f219";
$fa-var-digg: "\f1a6";
$fa-var-dollar: "\f155";
$fa-var-dot-circle-o: "\f192";
$fa-var-download: "\f019";
$fa-var-dribbble: "\f17d";
$fa-var-drivers-license: "\f2c2";
$fa-var-drivers-license-o: "\f2c3";
$fa-var-dropbox: "\f16b";
$fa-var-drupal: "\f1a9";
$fa-var-edge: "\f282";
$fa-var-edit: "\f044";
$fa-var-eercast: "\f2da";
$fa-var-eject: "\f052";
$fa-var-ellipsis-h: "\f141";
$fa-var-ellipsis-v: "\f142";
$fa-var-empire: "\f1d1";
$fa-var-envelope: "\f0e0";
$fa-var-envelope-o: "\f003";
$fa-var-envelope-open: "\f2b6";
$fa-var-envelope-open-o: "\f2b7";
$fa-var-envelope-square: "\f199";
$fa-var-envira: "\f299";
$fa-var-eraser: "\f12d";
$fa-var-etsy: "\f2d7";
$fa-var-eur: "\f153";
$fa-var-euro: "\f153";
$fa-var-exchange: "\f0ec";
$fa-var-exclamation: "\f12a";
$fa-var-exclamation-circle: "\f06a";
$fa-var-exclamation-triangle: "\f071";
$fa-var-expand: "\f065";
$fa-var-expeditedssl: "\f23e";
$fa-var-external-link: "\f08e";
$fa-var-external-link-square: "\f14c";
$fa-var-eye: "\f06e";
$fa-var-eye-slash: "\f070";
$fa-var-eyedropper: "\f1fb";
$fa-var-fa: "\f2b4";
$fa-var-facebook: "\f09a";
$fa-var-facebook-f: "\f09a";
$fa-var-facebook-official: "\f230";
$fa-var-facebook-square: "\f082";
$fa-var-fast-backward: "\f049";
$fa-var-fast-forward: "\f050";
$fa-var-fax: "\f1ac";
$fa-var-feed: "\f09e";
$fa-var-female: "\f182";
$fa-var-fighter-jet: "\f0fb";
$fa-var-file: "\f15b";
$fa-var-file-archive-o: "\f1c6";
$fa-var-file-audio-o: "\f1c7";
$fa-var-file-code-o: "\f1c9";
$fa-var-file-excel-o: "\f1c3";
$fa-var-file-image-o: "\f1c5";
$fa-var-file-movie-o: "\f1c8";
$fa-var-file-o: "\f016";
$fa-var-file-pdf-o: "\f1c1";
$fa-var-file-photo-o: "\f1c5";
$fa-var-file-picture-o: "\f1c5";
$fa-var-file-powerpoint-o: "\f1c4";
$fa-var-file-sound-o: "\f1c7";
$fa-var-file-text: "\f15c";
$fa-var-file-text-o: "\f0f6";
$fa-var-file-video-o: "\f1c8";
$fa-var-file-word-o: "\f1c2";
$fa-var-file-zip-o: "\f1c6";
$fa-var-files-o: "\f0c5";
$fa-var-film: "\f008";
$fa-var-filter: "\f0b0";
$fa-var-fire: "\f06d";
$fa-var-fire-extinguisher: "\f134";
$fa-var-firefox: "\f269";
$fa-var-first-order: "\f2b0";
$fa-var-flag: "\f024";
$fa-var-flag-checkered: "\f11e";
$fa-var-flag-o: "\f11d";
$fa-var-flash: "\f0e7";
$fa-var-flask: "\f0c3";
$fa-var-flickr: "\f16e";
$fa-var-floppy-o: "\f0c7";
$fa-var-folder: "\f07b";
$fa-var-folder-o: "\f114";
$fa-var-folder-open: "\f07c";
$fa-var-folder-open-o: "\f115";
$fa-var-font: "\f031";
$fa-var-font-awesome: "\f2b4";
$fa-var-fonticons: "\f280";
$fa-var-fort-awesome: "\f286";
$fa-var-forumbee: "\f211";
$fa-var-forward: "\f04e";
$fa-var-foursquare: "\f180";
$fa-var-free-code-camp: "\f2c5";
$fa-var-frown-o: "\f119";
$fa-var-futbol-o: "\f1e3";
$fa-var-gamepad: "\f11b";
$fa-var-gavel: "\f0e3";
$fa-var-gbp: "\f154";
$fa-var-ge: "\f1d1";
$fa-var-gear: "\f013";
$fa-var-gears: "\f085";
$fa-var-genderless: "\f22d";
$fa-var-get-pocket: "\f265";
$fa-var-gg: "\f260";
$fa-var-gg-circle: "\f261";
$fa-var-gift: "\f06b";
$fa-var-git: "\f1d3";
$fa-var-git-square: "\f1d2";
$fa-var-github: "\f09b";
$fa-var-github-alt: "\f113";
$fa-var-github-square: "\f092";
$fa-var-gitlab: "\f296";
$fa-var-gittip: "\f184";
$fa-var-glass: "\f000";
$fa-var-glide: "\f2a5";
$fa-var-glide-g: "\f2a6";
$fa-var-globe: "\f0ac";
$fa-var-google: "\f1a0";
$fa-var-google-plus: "\f0d5";
$fa-var-google-plus-circle: "\f2b3";
$fa-var-google-plus-official: "\f2b3";
$fa-var-google-plus-square: "\f0d4";
$fa-var-google-wallet: "\f1ee";
$fa-var-graduation-cap: "\f19d";
$fa-var-gratipay: "\f184";
$fa-var-grav: "\f2d6";
$fa-var-group: "\f0c0";
$fa-var-h-square: "\f0fd";
$fa-var-hacker-news: "\f1d4";
$fa-var-hand-grab-o: "\f255";
$fa-var-hand-lizard-o: "\f258";
$fa-var-hand-o-down: "\f0a7";
$fa-var-hand-o-left: "\f0a5";
$fa-var-hand-o-right: "\f0a4";
$fa-var-hand-o-up: "\f0a6";
$fa-var-hand-paper-o: "\f256";
$fa-var-hand-peace-o: "\f25b";
$fa-var-hand-pointer-o: "\f25a";
$fa-var-hand-rock-o: "\f255";
$fa-var-hand-scissors-o: "\f257";
$fa-var-hand-spock-o: "\f259";
$fa-var-hand-stop-o: "\f256";
$fa-var-handshake-o: "\f2b5";
$fa-var-hard-of-hearing: "\f2a4";
$fa-var-hashtag: "\f292";
$fa-var-hdd-o: "\f0a0";
$fa-var-header: "\f1dc";
$fa-var-headphones: "\f025";
$fa-var-heart: "\f004";
$fa-var-heart-o: "\f08a";
$fa-var-heartbeat: "\f21e";
$fa-var-history: "\f1da";
$fa-var-home: "\f015";
$fa-var-hospital-o: "\f0f8";
$fa-var-hotel: "\f236";
$fa-var-hourglass: "\f254";
$fa-var-hourglass-1: "\f251";
$fa-var-hourglass-2: "\f252";
$fa-var-hourglass-3: "\f253";
$fa-var-hourglass-end: "\f253";
$fa-var-hourglass-half: "\f252";
$fa-var-hourglass-o: "\f250";
$fa-var-hourglass-start: "\f251";
$fa-var-houzz: "\f27c";
$fa-var-html5: "\f13b";
$fa-var-i-cursor: "\f246";
$fa-var-id-badge: "\f2c1";
$fa-var-id-card: "\f2c2";
$fa-var-id-card-o: "\f2c3";
$fa-var-ils: "\f20b";
$fa-var-image: "\f03e";
$fa-var-imdb: "\f2d8";
$fa-var-inbox: "\f01c";
$fa-var-indent: "\f03c";
$fa-var-industry: "\f275";
$fa-var-info: "\f129";
$fa-var-info-circle: "\f05a";
$fa-var-inr: "\f156";
$fa-var-instagram: "\f16d";
$fa-var-institution: "\f19c";
$fa-var-internet-explorer: "\f26b";
$fa-var-intersex: "\f224";
$fa-var-ioxhost: "\f208";
$fa-var-italic: "\f033";
$fa-var-joomla: "\f1aa";
$fa-var-jpy: "\f157";
$fa-var-jsfiddle: "\f1cc";
$fa-var-key: "\f084";
$fa-var-keyboard-o: "\f11c";
$fa-var-krw: "\f159";
$fa-var-language: "\f1ab";
$fa-var-laptop: "\f109";
$fa-var-lastfm: "\f202";
$fa-var-lastfm-square: "\f203";
$fa-var-leaf: "\f06c";
$fa-var-leanpub: "\f212";
$fa-var-legal: "\f0e3";
$fa-var-lemon-o: "\f094";
$fa-var-level-down: "\f149";
$fa-var-level-up: "\f148";
$fa-var-life-bouy: "\f1cd";
$fa-var-life-buoy: "\f1cd";
$fa-var-life-ring: "\f1cd";
$fa-var-life-saver: "\f1cd";
$fa-var-lightbulb-o: "\f0eb";
$fa-var-line-chart: "\f201";
$fa-var-link: "\f0c1";
$fa-var-linkedin: "\f0e1";
$fa-var-linkedin-square: "\f08c";
$fa-var-linode: "\f2b8";
$fa-var-linux: "\f17c";
$fa-var-list: "\f03a";
$fa-var-list-alt: "\f022";
$fa-var-list-ol: "\f0cb";
$fa-var-list-ul: "\f0ca";
$fa-var-location-arrow: "\f124";
$fa-var-lock: "\f023";
$fa-var-long-arrow-down: "\f175";
$fa-var-long-arrow-left: "\f177";
$fa-var-long-arrow-right: "\f178";
$fa-var-long-arrow-up: "\f176";
$fa-var-low-vision: "\f2a8";
$fa-var-magic: "\f0d0";
$fa-var-magnet: "\f076";
$fa-var-mail-forward: "\f064";
$fa-var-mail-reply: "\f112";
$fa-var-mail-reply-all: "\f122";
$fa-var-male: "\f183";
$fa-var-map: "\f279";
$fa-var-map-marker: "\f041";
$fa-var-map-o: "\f278";
$fa-var-map-pin: "\f276";
$fa-var-map-signs: "\f277";
$fa-var-mars: "\f222";
$fa-var-mars-double: "\f227";
$fa-var-mars-stroke: "\f229";
$fa-var-mars-stroke-h: "\f22b";
$fa-var-mars-stroke-v: "\f22a";
$fa-var-maxcdn: "\f136";
$fa-var-meanpath: "\f20c";
$fa-var-medium: "\f23a";
$fa-var-medkit: "\f0fa";
$fa-var-meetup: "\f2e0";
$fa-var-meh-o: "\f11a";
$fa-var-mercury: "\f223";
$fa-var-microchip: "\f2db";
$fa-var-microphone: "\f130";
$fa-var-microphone-slash: "\f131";
$fa-var-minus: "\f068";
$fa-var-minus-circle: "\f056";
$fa-var-minus-square: "\f146";
$fa-var-minus-square-o: "\f147";
$fa-var-mixcloud: "\f289";
$fa-var-mobile: "\f10b";
$fa-var-mobile-phone: "\f10b";
$fa-var-modx: "\f285";
$fa-var-money: "\f0d6";
$fa-var-moon-o: "\f186";
$fa-var-mortar-board: "\f19d";
$fa-var-motorcycle: "\f21c";
$fa-var-mouse-pointer: "\f245";
$fa-var-music: "\f001";
$fa-var-navicon: "\f0c9";
$fa-var-neuter: "\f22c";
$fa-var-newspaper-o: "\f1ea";
$fa-var-object-group: "\f247";
$fa-var-object-ungroup: "\f248";
$fa-var-odnoklassniki: "\f263";
$fa-var-odnoklassniki-square: "\f264";
$fa-var-opencart: "\f23d";
$fa-var-openid: "\f19b";
$fa-var-opera: "\f26a";
$fa-var-optin-monster: "\f23c";
$fa-var-outdent: "\f03b";
$fa-var-pagelines: "\f18c";
$fa-var-paint-brush: "\f1fc";
$fa-var-paper-plane: "\f1d8";
$fa-var-paper-plane-o: "\f1d9";
$fa-var-paperclip: "\f0c6";
$fa-var-paragraph: "\f1dd";
$fa-var-paste: "\f0ea";
$fa-var-pause: "\f04c";
$fa-var-pause-circle: "\f28b";
$fa-var-pause-circle-o: "\f28c";
$fa-var-paw: "\f1b0";
$fa-var-paypal: "\f1ed";
$fa-var-pencil: "\f040";
$fa-var-pencil-square: "\f14b";
$fa-var-pencil-square-o: "\f044";
$fa-var-percent: "\f295";
$fa-var-phone: "\f095";
$fa-var-phone-square: "\f098";
$fa-var-photo: "\f03e";
$fa-var-picture-o: "\f03e";
$fa-var-pie-chart: "\f200";
$fa-var-pied-piper: "\f2ae";
$fa-var-pied-piper-alt: "\f1a8";
$fa-var-pied-piper-pp: "\f1a7";
$fa-var-pinterest: "\f0d2";
$fa-var-pinterest-p: "\f231";
$fa-var-pinterest-square: "\f0d3";
$fa-var-plane: "\f072";
$fa-var-play: "\f04b";
$fa-var-play-circle: "\f144";
$fa-var-play-circle-o: "\f01d";
$fa-var-plug: "\f1e6";
$fa-var-plus: "\f067";
$fa-var-plus-circle: "\f055";
$fa-var-plus-square: "\f0fe";
$fa-var-plus-square-o: "\f196";
$fa-var-podcast: "\f2ce";
$fa-var-power-off: "\f011";
$fa-var-print: "\f02f";
$fa-var-product-hunt: "\f288";
$fa-var-puzzle-piece: "\f12e";
$fa-var-qq: "\f1d6";
$fa-var-qrcode: "\f029";
$fa-var-question: "\f128";
$fa-var-question-circle: "\f059";
$fa-var-question-circle-o: "\f29c";
$fa-var-quora: "\f2c4";
$fa-var-quote-left: "\f10d";
$fa-var-quote-right: "\f10e";
$fa-var-ra: "\f1d0";
$fa-var-random: "\f074";
$fa-var-ravelry: "\f2d9";
$fa-var-rebel: "\f1d0";
$fa-var-recycle: "\f1b8";
$fa-var-reddit: "\f1a1";
$fa-var-reddit-alien: "\f281";
$fa-var-reddit-square: "\f1a2";
$fa-var-refresh: "\f021";
$fa-var-registered: "\f25d";
$fa-var-remove: "\f00d";
$fa-var-renren: "\f18b";
$fa-var-reorder: "\f0c9";
$fa-var-repeat: "\f01e";
$fa-var-reply: "\f112";
$fa-var-reply-all: "\f122";
$fa-var-resistance: "\f1d0";
$fa-var-retweet: "\f079";
$fa-var-rmb: "\f157";
$fa-var-road: "\f018";
$fa-var-rocket: "\f135";
$fa-var-rotate-left: "\f0e2";
$fa-var-rotate-right: "\f01e";
$fa-var-rouble: "\f158";
$fa-var-rss: "\f09e";
$fa-var-rss-square: "\f143";
$fa-var-rub: "\f158";
$fa-var-ruble: "\f158";
$fa-var-rupee: "\f156";
$fa-var-s15: "\f2cd";
$fa-var-safari: "\f267";
$fa-var-save: "\f0c7";
$fa-var-scissors: "\f0c4";
$fa-var-scribd: "\f28a";
$fa-var-search: "\f002";
$fa-var-search-minus: "\f010";
$fa-var-search-plus: "\f00e";
$fa-var-sellsy: "\f213";
$fa-var-send: "\f1d8";
$fa-var-send-o: "\f1d9";
$fa-var-server: "\f233";
$fa-var-share: "\f064";
$fa-var-share-alt: "\f1e0";
$fa-var-share-alt-square: "\f1e1";
$fa-var-share-square: "\f14d";
$fa-var-share-square-o: "\f045";
$fa-var-shekel: "\f20b";
$fa-var-sheqel: "\f20b";
$fa-var-shield: "\f132";
$fa-var-ship: "\f21a";
$fa-var-shirtsinbulk: "\f214";
$fa-var-shopping-bag: "\f290";
$fa-var-shopping-basket: "\f291";
$fa-var-shopping-cart: "\f07a";
$fa-var-shower: "\f2cc";
$fa-var-sign-in: "\f090";
$fa-var-sign-language: "\f2a7";
$fa-var-sign-out: "\f08b";
$fa-var-signal: "\f012";
$fa-var-signing: "\f2a7";
$fa-var-simplybuilt: "\f215";
$fa-var-sitemap: "\f0e8";
$fa-var-skyatlas: "\f216";
$fa-var-skype: "\f17e";
$fa-var-slack: "\f198";
$fa-var-sliders: "\f1de";
$fa-var-slideshare: "\f1e7";
$fa-var-smile-o: "\f118";
$fa-var-snapchat: "\f2ab";
$fa-var-snapchat-ghost: "\f2ac";
$fa-var-snapchat-square: "\f2ad";
$fa-var-snowflake-o: "\f2dc";
$fa-var-soccer-ball-o: "\f1e3";
$fa-var-sort: "\f0dc";
$fa-var-sort-alpha-asc: "\f15d";
$fa-var-sort-alpha-desc: "\f15e";
$fa-var-sort-amount-asc: "\f160";
$fa-var-sort-amount-desc: "\f161";
$fa-var-sort-asc: "\f0de";
$fa-var-sort-desc: "\f0dd";
$fa-var-sort-down: "\f0dd";
$fa-var-sort-numeric-asc: "\f162";
$fa-var-sort-numeric-desc: "\f163";
$fa-var-sort-up: "\f0de";
$fa-var-soundcloud: "\f1be";
$fa-var-space-shuttle: "\f197";
$fa-var-spinner: "\f110";
$fa-var-spoon: "\f1b1";
$fa-var-spotify: "\f1bc";
$fa-var-square: "\f0c8";
$fa-var-square-o: "\f096";
$fa-var-stack-exchange: "\f18d";
$fa-var-stack-overflow: "\f16c";
$fa-var-star: "\f005";
$fa-var-star-half: "\f089";
$fa-var-star-half-empty: "\f123";
$fa-var-star-half-full: "\f123";
$fa-var-star-half-o: "\f123";
$fa-var-star-o: "\f006";
$fa-var-steam: "\f1b6";
$fa-var-steam-square: "\f1b7";
$fa-var-step-backward: "\f048";
$fa-var-step-forward: "\f051";
$fa-var-stethoscope: "\f0f1";
$fa-var-sticky-note: "\f249";
$fa-var-sticky-note-o: "\f24a";
$fa-var-stop: "\f04d";
$fa-var-stop-circle: "\f28d";
$fa-var-stop-circle-o: "\f28e";
$fa-var-street-view: "\f21d";
$fa-var-strikethrough: "\f0cc";
$fa-var-stumbleupon: "\f1a4";
$fa-var-stumbleupon-circle: "\f1a3";
$fa-var-subscript: "\f12c";
$fa-var-subway: "\f239";
$fa-var-suitcase: "\f0f2";
$fa-var-sun-o: "\f185";
$fa-var-superpowers: "\f2dd";
$fa-var-superscript: "\f12b";
$fa-var-support: "\f1cd";
$fa-var-table: "\f0ce";
$fa-var-tablet: "\f10a";
$fa-var-tachometer: "\f0e4";
$fa-var-tag: "\f02b";
$fa-var-tags: "\f02c";
$fa-var-tasks: "\f0ae";
$fa-var-taxi: "\f1ba";
$fa-var-telegram: "\f2c6";
$fa-var-television: "\f26c";
$fa-var-tencent-weibo: "\f1d5";
$fa-var-terminal: "\f120";
$fa-var-text-height: "\f034";
$fa-var-text-width: "\f035";
$fa-var-th: "\f00a";
$fa-var-th-large: "\f009";
$fa-var-th-list: "\f00b";
$fa-var-themeisle: "\f2b2";
$fa-var-thermometer: "\f2c7";
$fa-var-thermometer-0: "\f2cb";
$fa-var-thermometer-1: "\f2ca";
$fa-var-thermometer-2: "\f2c9";
$fa-var-thermometer-3: "\f2c8";
$fa-var-thermometer-4: "\f2c7";
$fa-var-thermometer-empty: "\f2cb";
$fa-var-thermometer-full: "\f2c7";
$fa-var-thermometer-half: "\f2c9";
$fa-var-thermometer-quarter: "\f2ca";
$fa-var-thermometer-three-quarters: "\f2c8";
$fa-var-thumb-tack: "\f08d";
$fa-var-thumbs-down: "\f165";
$fa-var-thumbs-o-down: "\f088";
$fa-var-thumbs-o-up: "\f087";
$fa-var-thumbs-up: "\f164";
$fa-var-ticket: "\f145";
$fa-var-times: "\f00d";
$fa-var-times-circle: "\f057";
$fa-var-times-circle-o: "\f05c";
$fa-var-times-rectangle: "\f2d3";
$fa-var-times-rectangle-o: "\f2d4";
$fa-var-tint: "\f043";
$fa-var-toggle-down: "\f150";
$fa-var-toggle-left: "\f191";
$fa-var-toggle-off: "\f204";
$fa-var-toggle-on: "\f205";
$fa-var-toggle-right: "\f152";
$fa-var-toggle-up: "\f151";
$fa-var-trademark: "\f25c";
$fa-var-train: "\f238";
$fa-var-transgender: "\f224";
$fa-var-transgender-alt: "\f225";
$fa-var-trash: "\f1f8";
$fa-var-trash-o: "\f014";
$fa-var-tree: "\f1bb";
$fa-var-trello: "\f181";
$fa-var-tripadvisor: "\f262";
$fa-var-trophy: "\f091";
$fa-var-truck: "\f0d1";
$fa-var-try: "\f195";
$fa-var-tty: "\f1e4";
$fa-var-tumblr: "\f173";
$fa-var-tumblr-square: "\f174";
$fa-var-turkish-lira: "\f195";
$fa-var-tv: "\f26c";
$fa-var-twitch: "\f1e8";
$fa-var-twitter: "\f099";
$fa-var-twitter-square: "\f081";
$fa-var-umbrella: "\f0e9";
$fa-var-underline: "\f0cd";
$fa-var-undo: "\f0e2";
$fa-var-universal-access: "\f29a";
$fa-var-university: "\f19c";
$fa-var-unlink: "\f127";
$fa-var-unlock: "\f09c";
$fa-var-unlock-alt: "\f13e";
$fa-var-unsorted: "\f0dc";
$fa-var-upload: "\f093";
$fa-var-usb: "\f287";
$fa-var-usd: "\f155";
$fa-var-user: "\f007";
$fa-var-user-circle: "\f2bd";
$fa-var-user-circle-o: "\f2be";
$fa-var-user-md: "\f0f0";
$fa-var-user-o: "\f2c0";
$fa-var-user-plus: "\f234";
$fa-var-user-secret: "\f21b";
$fa-var-user-times: "\f235";
$fa-var-users: "\f0c0";
$fa-var-vcard: "\f2bb";
$fa-var-vcard-o: "\f2bc";
$fa-var-venus: "\f221";
$fa-var-venus-double: "\f226";
$fa-var-venus-mars: "\f228";
$fa-var-viacoin: "\f237";
$fa-var-viadeo: "\f2a9";
$fa-var-viadeo-square: "\f2aa";
$fa-var-video-camera: "\f03d";
$fa-var-vimeo: "\f27d";
$fa-var-vimeo-square: "\f194";
$fa-var-vine: "\f1ca";
$fa-var-vk: "\f189";
$fa-var-volume-control-phone: "\f2a0";
$fa-var-volume-down: "\f027";
$fa-var-volume-off: "\f026";
$fa-var-volume-up: "\f028";
$fa-var-warning: "\f071";
$fa-var-wechat: "\f1d7";
$fa-var-weibo: "\f18a";
$fa-var-weixin: "\f1d7";
$fa-var-whatsapp: "\f232";
$fa-var-wheelchair: "\f193";
$fa-var-wheelchair-alt: "\f29b";
$fa-var-wifi: "\f1eb";
$fa-var-wikipedia-w: "\f266";
$fa-var-window-close: "\f2d3";
$fa-var-window-close-o: "\f2d4";
$fa-var-window-maximize: "\f2d0";
$fa-var-window-minimize: "\f2d1";
$fa-var-window-restore: "\f2d2";
$fa-var-windows: "\f17a";
$fa-var-won: "\f159";
$fa-var-wordpress: "\f19a";
$fa-var-wpbeginner: "\f297";
$fa-var-wpexplorer: "\f2de";
$fa-var-wpforms: "\f298";
$fa-var-wrench: "\f0ad";
$fa-var-xing: "\f168";
$fa-var-xing-square: "\f169";
$fa-var-y-combinator: "\f23b";
$fa-var-y-combinator-square: "\f1d4";
$fa-var-yahoo: "\f19e";
$fa-var-yc: "\f23b";
$fa-var-yc-square: "\f1d4";
$fa-var-yelp: "\f1e9";
$fa-var-yen: "\f157";
$fa-var-yoast: "\f2b1";
$fa-var-youtube: "\f167";
$fa-var-youtube-play: "\f16a";
$fa-var-youtube-square: "\f166";

View File

@ -0,0 +1,18 @@
/*!
* Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/
@import "variables";
@import "mixins";
@import "path";
@import "core";
@import "larger";
@import "fixed-width";
@import "list";
@import "bordered-pulled";
@import "animated";
@import "rotated-flipped";
@import "stacked";
@import "icons";
@import "screen-reader";

2
assets/css/vendor/picnic.min.css vendored Normal file

File diff suppressed because one or more lines are too long

95
assets/css/vendor/rome.css vendored Normal file
View File

@ -0,0 +1,95 @@
/**
* rome - Customizable date (and time) picker. Opt-in UI, no jQuery!
* @version v2.1.22
* @link https://github.com/bevacqua/rome
* @license MIT
*/
.rd-container {
display: none;
/*border: 1px solid #333;*/
border: none;
background-color: #fff;
padding: 10px;
text-align: center;
}
.rd-container-attachment {
position: absolute;
}
.rd-month {
display: inline-block;
margin-right: 25px;
}
.rd-month:last-child {
margin-right: 0;
}
.rd-back,
.rd-next {
cursor: pointer;
border: none;
outline: none;
background: none;
padding: 0;
margin: 0;
}
.rd-back[disabled],
.rd-next[disabled] {
cursor: default;
}
.rd-back {
float: left;
}
.rd-next {
float: right;
}
.rd-back:before {
display: block;
content: '\2190';
}
.rd-next:before {
display: block;
content: '\2192';
}
.rd-day-body {
cursor: pointer;
text-align: center;
}
.rd-day-selected,
.rd-time-selected,
.rd-time-option:hover {
cursor: pointer;
background-color: #333;
color: #fff;
}
.rd-day-prev-month,
.rd-day-next-month {
color: #999;
}
.rd-day-disabled {
cursor: default;
color: #fcc;
}
.rd-time {
position: relative;
display: inline-block;
margin-top: 5px;
min-width: 80px;
}
.rd-time-list {
display: none;
position: absolute;
overflow-y: scroll;
max-height: 160px;
left: 0;
right: 0;
background-color: #fff;
color: #333;
}
.rd-time-selected {
padding: 5px;
}
.rd-time-option {
padding: 5px;
}
.rd-day-concealed {
visibility: hidden;
}

7
assets/css/vendor/simplemde.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,14 @@
let m = require('mithril')
var Loading = {
view: function() {
return m('.loading', [
m('.loading-bar'),
m('.loading-bar'),
m('.loading-bar'),
m('.loading-bar')
])
}
}
module.exports = Loading

View File

@ -0,0 +1,109 @@
let m = require('mithril')
let _ = require('lodash')
let category = require('../models/category')
let nav = require('./nav')
let Loading = require('./Loading')
var createCategory = {
oninit: function() {
category.loadList()
},
current: [],
view: function() {
return m('main.documentation', m('section', [
m('h1', 'Kategori'),
category.loading ? m(Loading) :
m('.flex.two-600.full.grow', [
m('div', m('form', {
onsubmit: function(e) {
e.preventDefault()
category.entry()
}
}, [
m('h2', 'Tambah Kategori'),
m('.flex.three-600.two.grow', [
m('.third-600.full', m('label', {for: 'category'}, 'Nama')),
m('.two-third-600.full', m('input', {
type: 'text',
name: 'category',
autocomplete: 'off',
oninput: m.withAttr('value', function(value) {
category.current.category = value
}),
value: _.isString(category.current.category) ? category.current.category : ''
})),
m('.third-600.full', m('label', {for: 'background'}, 'Background')),
m('.two-third-600.full', m('input', {
type: 'color',
name: 'background',
oninput: m.withAttr('value', function(value) {
category.current.background = value
}),
value: _.isString(category.current.background) ? category.current.background : ''
})),
m('.third-600.full', m('label', {for: 'foreground'}, 'Teks')),
m('.two-third-600.full', m('input', {
type: 'color',
name: 'foreground',
oninput: m.withAttr('value', function(value) {
category.current.foreground = value
}),
value: _.isString(category.current.foreground) ? category.current.foreground : ''
})),
m('button.pseudo.full', {
type: 'submit'
}, [
m('i.fa.fa-plus.fa-fw', {
'aria-hidden': 'true'
}),
m('span', 'Tambah')
])
])
])),
m('div', [
m('h2', 'List'),
m('ul', {
style: 'margin-top:0;'
}, category.list.map(function(cat) {
return m('li', [
m('div', {
style: 'height: initial; text-align: center; border-radius: 5px; background-color: ' + cat.background + '; color: ' + cat.foreground + ';'
}, m('span', cat.category)),
m('.flex.two-600.full.grow', {
style: 'margin: 0;'
}, [
m('div', m('a.pseudo.button.full', {
style: 'cursor: pointer;',
onclick: function() {
m.route.set('/kategori/' + cat.id)
}
}, [
m('i.fa.fa-edit.fa-fw'),
m('span', {
style: 'font-size: smaller'
}, 'Ubah')
])),
m('div', m('button.pseudo.full', {
style: 'height: inherit',
onclick: function() {
category.toggleStatus(cat.id)
}
}, [
m('i.fa.fa-fw', {
class: (cat.status == 1) ? 'fa-times-circle-o' : 'fa-check'
}),
m('span', {
style: 'font-size: smaller;'
}, (cat.status == 1) ? 'Matikan' : 'Aktifkan')
]))
]),
m('.fourth-600.none')
])
}))
])
])
]))
}
}
module.exports = createCategory

View File

@ -0,0 +1,88 @@
let m = require('mithril')
let fecha = require('fecha')
let category = require('../models/category')
let rome = require('../vendor/rome')
let SimpleMDE = require('../vendor/simplemde.min')
let post = require('../models/post')
var createPost = {
oninit: function() {
category.loadList()
post.current = {}
},
oncreate: function() {
clearInterval(window.intv)
var valid_at = rome(left, {
dateValidator: rome.val.beforeEq(right),
time: false,
inputFormat: 'YYYY-MM-DD',
required: true
})
var expired_at = rome(right, {
dateValidator: rome.val.afterEq(left),
time: false,
inputFormat: 'YYYY-MM-DD',
required: true
})
var simplemde = new SimpleMDE({ element: document.getElementById("smde") });
simplemde.codemirror.on('change', function() {
post.current.content = simplemde.value();
});
},
view: function() {
return m('main.documentation', m('section', [
m('h2', 'Tambah Pengumuman'),
m('form', {
onsubmit: function(e) {
e.preventDefault()
// do things
// console.log(post.current);
post.upload()
}
}, m('.flex.three.grow', [
m('.full.third-600', [
m('label', {for: 'category'}, 'Kategori:'),
m('select', {
name: 'category',
oninput: m.withAttr('value', function(value) {
post.current.category = value
})
}, [
m('option'),
category.list.map(function(cat) {
return m('option', {value: cat.id}, cat.category)
})
]),
m('br'),
m('label', {for: 'valid_at'}, 'Berlaku dari: '),
m('input#left', {
name: 'valid_at',
onfocusout: m.withAttr('value', function(value) {
post.current.valid_at = value
})
}),
m('br'),
m('label', {for: 'expired_at'}, 'Berlaku sampai: '),
m('input#right', {
name: 'expired_at',
onfocusout: m.withAttr('value', function(value) {
post.current.expired_at = value
})
})
]),
m('.full.two-third-600', [
m('label', {for: 'content'}, 'Konten: '),
m('textarea#smde', {name: 'content'})
]),
m('br'),
m('button.pseudo', {type: 'submit'}, [
m('i.fa.fa-check.fa-fw'),
m('span', {style: 'font-size: smaller'}, 'Unggah')
])
]))
]))
}
}
module.exports = createPost

View File

@ -0,0 +1,67 @@
let m = require('mithril')
let category = require('../models/category')
let nav = require('./nav')
let _ = require('lodash')
let Loading = require('./Loading')
var editCategory = {
oninit: function(vnode) {
category.loadCurrent(vnode.attrs.id)
},
view: function() {
return m('main.documentation', m('section', [
m('h1', 'Kategori'),
category.loading ? m(Loading) :
m('.flex.two-600.full.grow', [
m('div', m('form', {
onsubmit: function(e) {
e.preventDefault()
category.save()
}
}, [
m('h2', 'Ubah Kategori'),
m('.flex.three-600.two.grow', [
m('.third-600.full', m('label', {for: 'category'}, 'Nama')),
m('.two-third-600.full', m('input', {
type: 'text',
name: 'category',
autocomplete: 'off',
oninput: m.withAttr('value', function(value) {
category.current.category = value
}),
value: category.current.category
})),
m('.third-600.full', m('label', {for: 'background'}, 'Background')),
m('.two-third-600.full', m('input', {
type: 'color',
name: 'background',
oninput: m.withAttr('value', function(value) {
category.current.background = value
}),
value: category.current.background
})),
m('.third-600.full', m('label', {for: 'foreground'}, 'Teks')),
m('.two-third-600.full', m('input', {
type: 'color',
name: 'foreground',
oninput: m.withAttr('value', function(value) {
category.current.foreground = value
}),
value: category.current.foreground
})),
m('button.pseudo.full', {
type: 'submit'
}, [
m('i.fa.fa-edit.fa-fw', {
'aria-hidden': 'true'
}),
m('span', 'Ubah')
])
])
]))
])
]))
}
}
module.exports = editCategory

View File

@ -0,0 +1,113 @@
let m = require('mithril')
let fecha = require('fecha')
let category = require('../models/category')
let rome = require('../vendor/rome')
let SimpleMDE = require('../vendor/simplemde.min')
let post = require('../models/post')
var createPost = {
oninit: function(vnode) {
post.current = {}
post.loadCurrent(vnode.attrs.id)
category.loadList(1)
},
oncreate: function() {
var valid_at = rome(left, {
dateValidator: rome.val.beforeEq(right),
time: false,
inputFormat: 'YYYY-MM-DD',
required: true
})
var expired_at = rome(right, {
dateValidator: rome.val.afterEq(left),
time: false,
inputFormat: 'YYYY-MM-DD',
required: true
})
var simplemde = new SimpleMDE({ element: document.getElementById("smde") });
setTimeout(function() {
simplemde.value(post.current.content)
simplemde.codemirror.on('change', function() {
post.current.content = simplemde.value();
});
}, 1000)
},
view: function() {
return m('main.documentation', m('section', [
m('h2', 'Ubah Pengumuman'),
m('form', {
onsubmit: function(e) {
e.preventDefault()
// do things
// console.log(post.current);
post.save()
}
}, m('.flex.three.grow', [
m('.full.third-600', [
m('label', {for: 'category'}, 'Kategori:'),
m('select', {
name: 'category',
oninput: m.withAttr('value', function(value) {
post.current.category = value
})
}, [
// m('option'),
category.list.map(function(cat) {
return cat.id == post.current.category ? [
m('option', {
value: cat.id,
selected: 'selected'
}, cat.category)
] : [
m('option', {
value: cat.id
}, cat.category)
]
})
]),
m('br'),
m('label', {for: 'valid_at'}, 'Berlaku dari: '),
m('input#left', {
name: 'valid_at',
onfocusout: m.withAttr('value', function(value) {
post.current.valid_at = value
}),
value: post.current.valid_at ?
fecha.format(
fecha.parse(post.current.valid_at, 'YYYY-MM-DD HH:mm:ss'),
'YYYY-MM-DD'
)
: ''
}),
m('br'),
m('label', {for: 'expired_at'}, 'Berlaku sampai: '),
m('input#right', {
name: 'expired_at',
onfocusout: m.withAttr('value', function(value) {
post.current.expired_at = value
}),
value: post.current.expired_at ?
fecha.format(
fecha.parse(post.current.expired_at, 'YYYY-MM-DD HH:mm:ss'),
'YYYY-MM-DD'
)
: ''
})
]),
m('.full.two-third-600', [
m('label', {for: 'content'}, 'Konten: '),
m('textarea#smde', {name: 'content'})
]),
m('br'),
m('button.pseudo', {type: 'submit'}, [
m('i.fa.fa-check.fa-fw'),
m('span', {style: 'font-size: smaller'}, 'Unggah')
])
]))
]))
}
}
module.exports = createPost

View File

@ -0,0 +1,41 @@
let m = require('mithril')
let images = require('./images')
var header = {
oncreate: function() {
var rootSwiper = document.getElementById('nouser')
images.root = rootSwiper
m.mount(rootSwiper, images)
},
view: function() {
return m('span', [
m('nav', [
m('span.brand', m('a.title', {
style: 'cursor: pointer;',
onclick: function() {
m.route.set('')
}
}, 'Live Info')),
// m('input#bmenug.show', {type: 'checkbox'}),
// m('label.burger.pseudo.button', {for: 'bmenug'}, m('i.fa.fa-bars', {'aria-hidden': 'true'})),
m('.menu', m('a.navy.hidden-hover.button', {
'data-tooltip': 'Masuk',
style: 'cursor: pointer;',
onclick: function() {
m.route.set('/login')
}
}, [
m('i.fa.fa-sign-in', {
'aria-hidden': 'true'
}),
' Masuk'
]))
]),
m('main.documentation#doc-main', [
m('#nouser', {style: 'text-align:left;width:100%'})
])
])
}
}
module.exports = header

View File

@ -0,0 +1,48 @@
let m = require('mithril')
let landingPost = require('../models/landingPost')
let swiper = require('swiper')
let marked = require('../vendor/marked')
let fitText = require('../others/fitText')
require('../../../node_modules/swiper/dist/css/swiper.css')
var images = {
root: null,
oncreate: function() {
setTimeout(function() {
landingPost(images.root)
var imgSwiper = new swiper('.swiper-container', {
speed: 500,
autoplay: 5000,
autoplayDisableOnInteraction: false,
loop: true,
onTransitionEnd: function(imgSwiper) {
landingPost(images.root)
}
})
fitText.fitAll('fitThis')
}, 500)
window.onresize = function() {
setTimeout(function() {
fitText.fitAll('fitThis')
}, 100)
}
},
list: [],
view: function() {
return m('.swiper-container', [
m('.swiper-wrapper', images.list != [] ? [
images.list.map(function(item) {
return m('.swiper-slide.fitThis', {
"data-swiper-autoplay": item.delay,
style: "text-align: center; word-wrap: break-word;background-color:" + item.background + "; color:" + item.foreground + ";"
}, m.trust(marked(item.content)))
})
] : m('.swiper-slide.fitty', {
style: "background-color: #F0F0F0;color: #FFF;padding: 15vh 0;"
}, m.trust(marked("*Tidak ada pengumuman*"))))
])
}
}
module.exports = images

View File

@ -0,0 +1,23 @@
let m = require('mithril')
let fadeOutEffect = require('../others/fadeOutEffect')
module.exports = {
view: function() {
return m('.label.top', {
style: {
position: 'fixed',
top: '15px',
fontSize: 'small',
margin: '0 35%',
left: '0',
right: '0',
overflowY: 'auto',
maxWidth: '100%',
maxHeight: '100%'
},
onclick: function() {
fadeOutEffect.fade(this)
}
}, window.message)
}
}

View File

@ -1,41 +1,63 @@
let m = require('mithril') let m = require('mithril')
let post = require('../models/post') let post = require('../models/post')
let marked = require('../vendor/marked') let marked = require('../vendor/marked')
let fecha = require('fecha')
let Loading = require('./Loading')
let cookie = require('../others/cookie')
var listAdmin = { var listAdmin = {
view: function() { view: function() {
return m('.flex.four-900.full.card-wrapper', [ return m('.flex.four-900.full.card-wrapper', [
m('a.fourth-900.half-600.card.box.new', {href:'/posts/entry'}, m('i.fa.fa-plus.fa-3x', '')), post.loading ? m(Loading) :
post.list.map(function(post) { m('.fourth-900.half-600.card.box.new', {
return m('.fourth-900.half-600.card.box', {style:'background-color:' + post.background}, [ style: 'cursor: pointer; color: lightseagreen',
m('span.stack', {style:'font-size:smaller;color:rgba(17,17,17,.4);margin-bottom:.6em;'}, post.valid_at + ' - ' + post.expired_at), onclick: function() {
m('span.stack', {style:'color:' + post.foreground}, m.trust(marked(post.content))), m.route.set('/posts/entry')
m('form', {method:'post',action:'/'}, m('footer.flex.full.grow', (post.status != 0) ? [ }
m('.half-900', m('a.button.full', {href: '/posts/edit/' + post.id}, [ }, m('i.fa.fa-plus.fa-3x', '')),
post.list.map(function(pengumuman) {
return m('.fourth-900.half-600.card.box', {style:'background-color:' + pengumuman.background}, [
m('span.stack', {
style:'font-size: small; color:rgba(17,17,17,.4);',
'data-tooltip':
pengumuman.categoryName
+ "\nAktif: "
+ fecha.format(fecha.parse(pengumuman.valid_at, 'YYYY-MM-DD HH:mm:ss'), 'YYYY-MM-DD')
+ ' - '
+ fecha.format(fecha.parse(pengumuman.expired_at, 'YYYY-MM-DD HH:mm:ss'), 'YYYY-MM-DD')
+ "\n"
+ 'Diubah: '
+ fecha.format(fecha.parse(pengumuman.edited_at, 'YYYY-MM-DD HH:mm:ss'), 'YYYY-MM-DD')
}, [
m('em', {
style: 'color: ' + pengumuman.foreground
}, [
pengumuman.creatorName.split(' ')[0],
' - ',
fecha.format(fecha.parse(pengumuman.created_at, 'YYYY-MM-DD HH:mm:ss'), 'YYYY-MM-DD')
])
]),
m('span.stack', {style:'color:' + pengumuman.foreground + '; overflow-y: auto;'}, m.trust(marked(pengumuman.content))),
m('span', m('footer.flex.full.grow', (pengumuman.status != 0) ? pengumuman.creator == window.location.search.split('&')[1].slice('2') || cookie.get('signal') == 1 ? [
m('.half-900', m('a.button.full', {
style: 'cursor: pointer;',
onclick: function() {
m.route.set('/posts/edit/' + pengumuman.id)
}
}, [
m('i.fa.fa-edit.fa-fw', ''), m('i.fa.fa-edit.fa-fw', ''),
m('span', {style: 'font-size:smaller'}, 'Ubah') m('span', {style: 'font-size:smaller'}, 'Ubah')
])), ])),
m('.half-900', (post.status == 1) ? [ m('.half-900', m('button.full', {
m('input', {type: 'hidden', name: 'id'}, post.id), class: pengumuman.status == 1 ? 'error' : 'success',
m('input', {type: 'hidden', name: 'status'}, '0'), onclick: function() { post.toggleStatus(pengumuman.id) }
m('input', {type: 'hidden', name: '_method'}, 'delete'), }, [
m('input', {type: 'hidden', name: '_token'}, 'abc123'), m('i.fa.fa-fw', {
m('button.error.full', {type: 'submit'}, [ class: pengumuman.status == 1 ? 'fa-times-circle-o' : 'fa-check'
m('i.fa.fa-times-circle-o.fa-fw', ''), }),
m('span', {style: 'font-size:smaller'}, 'Matikan') m('span', {style: 'font-size:smaller'}, pengumuman.status == 1 ? 'Matikan' : 'Aktifkan')
]) ]))
] : [ ] : null : m('.half-900', m('span.button.pseudo.full', {style: 'color:rgba(17,17,17,.3);'}, 'Nonaktif'))))
m('input', {type: 'hidden', name: 'id'}, post.id),
m('input', {type: 'hidden', name: 'valid_at'}, '##date##'),
m('input', {type: 'hidden', name: 'status'}, '1'),
m('input', {type: 'hidden', name: '_method'}, 'put'),
m('input', {type: 'hidden', name: '_token'}, 'abc123'),
m('button.success.full', {type: 'submit'}, [
m('i.fa.fa-check.fa-fw', ''),
m('span', {style: 'font-size:smaller;'}, 'Aktifkan')
])
])
] : m('.half-900', m('span.button.pseudo.full', {style: 'color:rgba(17,17,17,.3);'}, 'Nonaktif'))))
]) ])
}) })
]) ])

View File

@ -0,0 +1,64 @@
let m = require('mithril')
let _ = require('lodash')
let user = require('../models/user')
let fadeOutEffect = require('../others/fadeOutEffect')
var login = {
view: function() {
return m('section', m('form', {
onsubmit: function(e) {
e.preventDefault()
user.login()
}
}, [
m('h1', 'Masuk'),
m('.flex.four.grow', [
m('.fourth-600.full', m('input', {
type: 'text',
name: 'username',
placeholder: 'Username',
maxlength: '25',
autocomplete: 'off',
oninput: m.withAttr('value', function(value) {user.current.username = value}),
value: user.current.username,
required: 'required'
})),
m('.fourth-600.full', m('input', {
type: 'password',
name: 'password',
placeholder: 'Password',
oninput: m.withAttr('value', function(value) {
user.current.password = value
}),
value: user.current.password,
required: 'required'
})),
m('.fourth-600.none'),
m('.fourth-600.none'),
m('.half-600.full', m('button.full.pseudo', {
type: 'submit'
}, [
m('i.fa.fa-check.fa-fw'),
m('span', {
style: 'font-size:smaller;'
}, 'Masuk')
])),
m('.fourth-600.none'),
m('.fourth-600.none'),
_.isNil(window.message) == false ? [
m('.half-600.full.label.error', {
style: 'margin: 0; font-size: smaller;',
onclick: function() {
window.message = null
}
}, window.message),
m('.fourth-600.none'),
m('.fourth-600.none')
]
: null
])
]))
}
}
module.exports = login

View File

@ -0,0 +1,74 @@
let m = require('mithril')
let user = require('../models/user')
let cookie = require('../others/cookie')
var nav = {
view: function() {
return m('nav', [
m('span.brand', m('a.title', {
style: 'cursor: pointer;',
onclick: function() {
m.route.set('')
}
}, 'Live Info')),
m('input#bmenug.show', {type: 'checkbox'}),
m('label.burger.pseudo.button', {for: 'bmenug'}, m('i.fa.fa-bars', {'aria-hidden': 'true'})),
m('.menu#menu', [
m('a.navy.button', {
href: 'https://backup.lepisi.ac.id/gregorio/lepisi-pengumuman/blob/master/README.md#dokumentasi',
target: '_blank',
'data-tooltip': 'Dokumentasi'
}, m('i.fa.fa-dot-circle-o', {
'aria-hidden': 'true'
})
),
m('a.navy.button', {
'data-tooltip': 'Kategori',
style: 'cursor: pointer;',
onclick: function() {
m.route.set('/kategori')
}
}, [
m('i.fa.fa-list-ul', {
'aria-hidden': 'true'
}),
' Kategori'
]),
cookie.get('signal') == 1 ? m('a.navy.button', {
'data-tooltip': 'User Baru',
style: 'cursor: pointer;',
onclick: function() {
m.route.set('/register')
}
}, [
m('i.fa.fa-user-plus', {
'aria-hidden': 'true'
}),
' User'
]) : null,
m('a.navy.button', {
'data-tooltip': 'Profil',
onclick: function() {
m.route.set('/user/' + window.location.search.split('&')[1].slice('2'))
}
}, [
m('i.fa.fa-user-circle-o', {
'aria-hidden': 'true'
}),
' Profil'
]),
m('a.navy.button', {
'data-tooltip': 'Keluar',
onclick: function() {user.logout()}
}, [
m('i.fa.fa-sign-out', {
'aria-hidden': 'true'
}),
' Keluar'
])
])
])
}
}
module.exports = nav

View File

@ -0,0 +1,60 @@
let m = require('mithril')
let user = require('../models/user')
var registerUser = {
view: function() {
return m('main.documentation', m('section', [
m('h1', 'Registrasi'),
m('form', {
onsubmit: function(e) {
e.preventDefault()
user.register()
}
}, m('.flex.four.grow', [
m('.fourth-600.full', m('input', {
type: 'text',
name: 'full_name',
placeholder: 'Nama Lengkap',
autocomplete: 'off',
oninput: m.withAttr('value', function(value) {
user.current.full_name = value
}),
required: 'required'
})),
m('.fourth-600.full', m('input', {
type: 'text',
name: 'username',
placeholder: 'Username',
maxlength: '25',
autocomplete: 'off',
oninput: m.withAttr('value', function(value) {
user.current.username = value
}),
required: 'required'
})),
m('.fourth-600.full', m('input', {
type: 'password',
name: 'password',
placeholder: 'Password',
oninput: m.withAttr('value', function(value) {
user.current.password = value
}),
required: 'required'
})),
m('.fourth-600.none'),
m('div', m('button.pseudo.three-fourth-600.full', {
type: 'submit'
}, [
m('i.fa.fa-plus-circle.fa-fw', {
'aria-hidden': 'true'
}),
m('span', {
style: 'font-size: smaller;'
}, 'Register')
]))
]))
]))
}
}
module.exports = registerUser

View File

@ -4,21 +4,29 @@ var secondaryNav = {
view: function() { view: function() {
return m('.filter.flex.six-600.four.grow', [ return m('.filter.flex.six-600.four.grow', [
m('.sixth-600.none', ''), m('.sixth-600.none', ''),
m('div', m('a[href=/].navy', { m('div', m('a.navy', {
oncreate: m.route.link, style: 'cursor: pointer; font-size: smaller;',
style: 'font-size:smaller;' onclick: function() {
m.route.set('')
}
}, 'Semua')), }, 'Semua')),
m('div', m('a[href=/active].navy', { m('div', m('a.navy', {
oncreate: m.route.link, style: 'cursor: pointer; font-size: smaller;',
style: 'font-size:smaller;' onclick: function() {
m.route.set('/posts/active')
}
}, 'Aktif')), }, 'Aktif')),
m('div', m('a[href=/soon].navy', { m('div', m('a.navy', {
oncreate: m.route.link, style: 'cursor: pointer; font-size: smaller;',
style: 'font-size:smaller;' onclick: function() {
m.route.set('/posts/soon')
}
}, 'Belum Aktif')), }, 'Belum Aktif')),
m('div', m('a[href=/inactive].navy', { m('div', m('a.navy', {
oncreate: m.route.link, style: 'cursor: pointer; font-size: smaller;',
style: 'font-size:smaller;' onclick: function() {
m.route.set('/posts/inactive')
}
}, 'Nonaktif')), }, 'Nonaktif')),
m('.sixth-600.none', '') m('.sixth-600.none', '')
]) ])

View File

@ -1,17 +1,31 @@
let m = require('mithril') let m = require('mithril')
let post = require('../models/post') let post = require('../models/post')
let listAdmin = require('./listAdmin') let listAdmin = require('./listAdmin')
let secondaryNav = require('./secondaryNav')
var showPost = { var showPost = {
interval: 10000,
oninit: function(vnode) { oninit: function(vnode) {
post.curStatus = vnode.attrs.status post.curStatus = vnode.attrs.status
post.loadList() post.loadList()
setInterval(function() { window.intv = setInterval(function() {
post.loadList() post.loadList()
}, post.interval) }, showPost.interval)
}, },
view: function() { view: function() {
return m(listAdmin) return m('main.documentation', m('#nouser', {
style: 'text-align:left;width:100%'
}, m('div', {
style: 'background:#FFF;text-align:left;width:100%;padding:10vh 0 0;'
}, [
m('#secondaryNav', m(secondaryNav)),
m('#mit', {
style: 'padding: 0 .6em'
}, m(listAdmin))
])))
},
onremove: function() {
clearInterval(window.intv)
} }
} }

View File

@ -0,0 +1,22 @@
let m = require('mithril')
let doc = require('./doc')
let user = require('../models/user')
let editCategory = require('../components/editCategory')
var title = {
view: function() {
return m('span', [
m('span#doc')
])
},
oncreate: function() {
var rootDoc = document.getElementById('doc')
// m.route(document.getElementById('menu'), '/kategori', {
// // '': doc,
// '/kategori': editCategory
// })
// m.mount(rootDoc, doc)
}
}
module.exports = title

View File

@ -0,0 +1,106 @@
let m = require('mithril')
let fecha = require('fecha')
let user = require('../models/user')
let Loading = require('./Loading')
var userProfile = {
changePassword: false,
oninit: function(vnode) {
user.current = {}
user.loadCurrent(vnode.attrs.id)
},
oncreate: function() {
userProfile.changePassword = false
},
view: function() {
return m('main.documentation', m('section', [
user.loading ? m(Loading) :
m('form', {
onsubmit: function(e) {
e.preventDefault()
user.editProfile()
}
}, [
m('h1', m('input', {
type: 'text',
required: 'required',
placeholder: 'Nama Lengkap',
value: user.current.full_name,
onclick: function() {
user.current.full_name = ''
},
oninput: m.withAttr('value', function(value) {
user.current.full_name = value
})
})),
m('table.full', [
m('tr.full', [
m('td', 'Username'),
m('td', ':'),
m('td', user.current.username)
]),
m('tr', [
m('td', 'Password'),
m('td', ':'),
m('td', [
m('input.full.noTrans#nPwd', {
type: 'password',
required: 'required',
placeholder: 'Password Baru',
value: user.current.new_password,
onclick: function() {
user.current.new_password = ''
this.className = 'third noTrans'
userProfile.changePassword = true
},
oninput: m.withAttr('value', function(value) {
user.current.new_password = value
})
}),
userProfile.changePassword ? [
m('input.third#oPwd', {
type: 'password',
required: 'required',
placeholder: 'Password Lama',
oninput: m.withAttr('value', function(value) {
user.current.old_password = value
})
}),
m('input.third#rNPwd', {
type: 'password',
required: 'required',
placeholder: 'Ulang Password Baru',
oninput: m.withAttr('value', function(value) {
user.current.re_new_password = value
})
})
] : null
])
]),
m('tr', [
m('td', 'Hak Akses'),
m('td', ':'),
m('td', user.current.privilege == 1 ? 'Admin' : 'User')
]),
m('tr', [
m('td', 'Registrasi'),
m('td', ':'),
m('td', fecha.format(new Date(user.current.registered_at), 'YYYY-MM-DD'))
])
]),
m('button.full.pseudo', {
type: 'submit',
}, [
m('i.fa.fa-check-square-o', {
'aria-hidden': 'true'
}),
m('span', {
style: 'font-size: smaller;'
}, ' Simpan')
])
])
]))
}
}
module.exports = userProfile

View File

@ -1,56 +1,132 @@
let m = require('mithril') let m = require('mithril')
let swiper = require('swiper') let header = require('./components/header')
let _ = require('lodash') let login = require('./components/login')
require('../../node_modules/swiper/dist/css/swiper.css') let nav = require('./components/nav')
let showPost = require('./components/showPost')
let createCategory = require('./components/createCategory')
let editCategory = require('./components/editCategory')
let registerUser = require('./components/registerUser')
let userProfile = require('./components/userProfile')
let createPost = require('./components/createPost')
let editPost = require('./components/editPost')
let cookie = require('./others/cookie')
let idleTimeout = require('./others/idleTimeout')
let label = require('./components/label')
let marked = require('./vendor/marked') require('../css/index.css')
var root = document.getElementById('nouser') var root = document.body
var page = cookie.get('signal')
const getPageData = function() { if (page == '') {
m.request({ m.mount(root, header)
method: 'GET', m.route(document.getElementById('doc-main'), '', {
url: '/api/posts', '': header,
background: false '/login': login
}) })
.then(function(res) { } else {
if (!_.isEqual(res['data'], images.list)) { m.route(root, '', {
images.list = res['data'] '': { view: function() { return m('span',
m.mount(root, null) window.message || window.message != null ?
m.mount(root, images) m(label) : null,
[
m(nav),
m(showPost, { 'status': 3 })
]) } },
'/kategori': {
view: function() {
return m('span',
window.message || window.message != null ?
m(label) : null,
[
m(nav),
m(createCategory, { 'id': 0 })
])
}
},
'/kategori/:id': {
view: function(vnode) {
return m('span',
window.message || window.message != null ?
m(label) : null,
[
m(nav),
m(editCategory, { 'id': vnode.attrs.id })
])
}
},
'/register': { view: function() {
return m('span',
window.message || window.message != null ?
m(label) : null,
[
m(nav),
cookie.get('signal') == 1 ? m(registerUser) : null
])
}
},
'/user/:id': { view: function(vnode) {
return m('span',
window.message || window.message != null ?
m(label) : null,
[
m(nav),
m(userProfile, { 'id': vnode.attrs.id })
])
}
},
'/posts/edit/:id': {
view: function(vnode) {
return m('span',
window.message || window.message != null ?
m(label) : null,
[
m(nav),
m(editPost, { 'id': vnode.attrs.id })
])
}
},
'/posts/active': { view: function() {
return m('span',
window.message || window.message != null ?
m(label) : null,
[
m(nav),
m(showPost, { 'status': 1 })
])
}
},
'/posts/soon': { view: function() {
return m('span',
window.message || window.message != null ?
m(label) : null,
[
m(nav),
m(showPost, { 'status': 2 })
])
}
},
'/posts/inactive': { view: function() {
return m('span',
window.message || window.message != null ?
m(label) : null,
[
m(nav),
m(showPost, { 'status': 0 })
])
}
},
'/posts/entry': { view: function() {
return m('span',
window.message || window.message != null ?
m(label) : null,
[
m(nav),
m(createPost)
])
}
} }
}) })
}
var images = { idleTimeout.setup();
oninit: getPageData,
oncreate: function() {
setTimeout(function() {
var imgSwiper = new swiper('.swiper-container', {
speed: 500,
autoplay: 5000,
autoplayDisableOnInteraction: false,
loop: true,
onTransitionEnd: function(imgSwiper) {
getPageData()
}
})
}, 500)
},
list: [],
view: function() {
return m('.swiper-container', {
}, [
m('.swiper-wrapper', [
images.list.map(function(item) {
return m('.swiper-slide.fitty', {
"data-swiper-autoplay": item.delay,
style: "background-color:" + item.background + "; color:" + item.foreground + "; padding: 15vh 0;"
}, m.trust(marked(item.content)))
})
])
])
}
} }
m.mount(root, images)

View File

@ -0,0 +1,83 @@
let m = require('mithril')
let _ = require('lodash')
let post = require('./post')
let user = require('./user')
var category = {
loading: false,
list: [],
current: {},
loadList: function() {
category.loading = true
category.current = {}
return m.request({
method: 'GET',
url: '/api/kategori',
withCredentials: true
})
.then(function(results) {
category.list = results.data
category.loading = false
})
},
loadCurrent: function(id) {
category.loading = true
return m.request({
method: 'GET',
url: '/api/kategori/' + id,
withCredentials: true
})
.then(function(result) {
category.current = result.data
category.loading = false
})
},
save: function() {
return m.request({
method: 'PUT',
url: '/api/kategori',
data: category.current,
withCredentials: true,
headers: {'x-query': window.location.search}
})
.then(function(result) {
category.current = {}
if (result.status == true) {
m.route.set('/kategori')
} else if (result.status == 401) {
user.logout();
}
window.message = result.message
})
},
entry: function() {
return m.request({
method: 'POST',
url: '/api/kategori',
data: category.current,
withCredentials: true,
headers: {'x-query': window.location.search}
})
.then(function(result) {
if (result.status == true) {
category.loadList()
} else if (result.status == 401) {
user.logout()
}
window.message = result.message
})
},
toggleStatus: function(id){
category.current = _.find(category.list, function(o) { return o.id == id })
if (category.current.posts == 0) {
category.current.status == 1 ? category.current.status = 0 : category.current.status = 1
category.save()
} else {
category.current = {}
m.redraw()
window.message = 'Kategori memiliki pengumuman aktif'
}
}
}
module.exports = category

View File

@ -0,0 +1,20 @@
let m = require('mithril')
let _ = require('lodash')
const landingPost = function(root) {
m.request({
method: 'GET',
url: '/api/pengumuman/?status=1',
background: false
})
.then(function(res) {
let images = require('../components/images')
if (!_.isEqual(res['data'], images.list)) {
images.list = res['data']
m.mount(root, null)
m.mount(root, images)
}
})
}
module.exports = landingPost

View File

@ -1,18 +1,110 @@
let m = require('mithril') let m = require('mithril')
let fecha = require('fecha')
let user = require('./user')
let cookie = require('../others/cookie')
var post = { var post = {
loading: false,
list: [], list: [],
current: {},
curStatus: 3, curStatus: 3,
interval: 10000,
loadList: function() { loadList: function() {
post.loading = true
return m.request({ return m.request({
method: 'GET', method: 'GET',
url: '/api/posts/' + post.curStatus, url: '/api/pengumuman/?status=' + post.curStatus,
withCredentials: true withCredentials: true
}) })
.then(function(result) { .then(function(result) {
post.list = result.data post.list = result.data
post.list.map(function(p) {
post.validateStatus(p.id)
})
post.loading = false
}) })
},
loadCurrent: function(id) {
post.loading = true
return m.request({
method: 'GET',
url: '/api/pengumuman/' + id,
withCredentials: true
})
.then(function(result) {
post.current = result.data
post.loading = false
})
},
upload: function() {
post.loading = true
return m.request({
method: 'POST',
url: '/posts/post/' + window.location.search,
data: post.current,
withCredentials: true,
headers: {client: 'api', 'x-query': window.location.search}
})
.then(function(response) {
if (response.status) {
m.route.set(response.route_to)
}
post.current = {}
post.loading = false
window.message = response.message
})
},
save: function() {
post.loading = true
return m.request({
method: 'POST',
url: '/posts/put/' + window.location.search,
data: post.current,
withCredentials: true,
headers: {client: 'api', 'x-query': window.location.search}
})
.then(function(response) {
post.current = {}
if (response.status) {
m.route.set(response.route_to)
}
post.loading = false;
window.message = response.message
})
},
toggleStatus: function(id) {
post.current = _.find(post.list, function(o) { return o.id == id })
if (post.current.status == 2) {
post.current.status = 1
var d = new Date();
post.current.valid_at = fecha.format(new Date(), 'YYYY-MM-DD H:mm:s')
} else if (post.current.status == 1) {
post.current.status = 0
}
post.save()
},
validateStatus: function(id) {
post.current = _.find(post.list, function(o) { return o.id == id })
// console.log(new Date(post.current.valid_at) > new Date());
if (post.current.status != 0) {
if (new Date(post.current.valid_at) > new Date()) {
status = 2
// console.log(post.current.id, 'soon');
} else if (new Date(post.current.valid_at) <= new Date()) {
if (new Date(post.current.expired_at) < new Date()) {
status = 0
// console.log(post.current.id, 'expired');
} else {
status = 1
// console.log(post.current.id, 'active');
}
}
if (post.current.status != status) {
post.current.status = status
post.save()
}
}
// console.log(post.current);
} }
} }

96
assets/js/models/user.js Normal file
View File

@ -0,0 +1,96 @@
let m = require('mithril')
let _ = require('lodash')
var user = {
current: {},
loading: false,
loadCurrent: function(id) {
user.loading = true
return m.request({
method: 'GET',
url: '/api/users/' + id,
withCredentials: true
})
.then(function(result) {
if (result.status == true) {
user.current = result.data
user.current.new_password = user.current.password
} else {
window.message = result.message
}
user.loading = false
})
},
login: function() {
return m.request({
method: 'POST',
url: '/login',
data: user.current,
withCredentials: true,
headers: {client: 'api'}
})
.then(function(response) {
if (response.status == true) {
window.location = response.redirect_to
}
window.message = response.message
})
},
logout: function() {
return m.request({
method: 'GET',
url: '/logout',
withCredentials: true,
headers: {client: 'api', 'x-query': window.location.search}
})
.then(function(response) {
if (response.status) {
window.location = response.redirect_to
}
window.message = response.message
})
},
register: function() {
return m.request({
method: 'POST',
url: '/post/' + window.location.search,
data: user.current,
withCredentials: true,
headers: {client: 'api', 'x-query': window.location.search}
})
.then(function(response) {
if (response.status == true) {
m.route.set(response.route_to)
}
window.message = response.message
})
},
editProfile: function() {
if (!_.isNil(user.current.old_password) && !_.isNil(user.current.re_new_password)) {
if (_.isEqual(user.current.re_new_password, user.current.new_password)) {
_.unset(user.current, 're_new_password')
} else {
window.message = 'Password baru tidak sama'
m.redraw()
return false
}
} else {
_.unset(user.current, 'new_password')
}
return m.request({
method: 'POST',
url: '/edit-profile/' + window.location.search,
data: user.current,
withCredentials: true,
headers: {client: 'api', 'x-query': window.location.search}
})
.then(function(response) {
if (response.status == true) {
user.logout()
}
window.message = response.message
})
}
}
module.exports = user

View File

@ -0,0 +1,17 @@
module.exports = {
get: function(cname) {
var name = cname + "=";
var decodedCookie = decodeURIComponent(document.cookie);
var ca = decodedCookie.split(';');
for(var i = 0; i <ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
}

View File

@ -0,0 +1,18 @@
module.exports = {
fade: function(target) {
// var fadeTarget = document.getElementById(target);
var fadeTarget = target
var fadeEffect = setInterval(function () {
if (!fadeTarget.style.opacity) {
fadeTarget.style.opacity = 1;
}
if (fadeTarget.style.opacity < 0.1) {
clearInterval(fadeEffect);
fadeTarget.remove();
window.message = null;
} else {
fadeTarget.style.opacity -= 0.1;
}
}, 50);
}
}

View File

@ -0,0 +1,32 @@
var fitText = {
fitAll: function(cl) {
var elFS, elH
cl = document.getElementsByClassName(cl)
var h = window.innerHeight
|| document.documentElement.clientHeight
|| document.body.clientHeight
// console.log(h, window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight);
for (var i = 0; i < cl.length; i++) {
elFS = parseInt(window.getComputedStyle(cl[i].children[0]).fontSize)
cl[i].children[0].style.fontSize = elFS + 'px'
elH = parseInt(window.getComputedStyle(cl[i].children[0]).height)
while (elH < h - (h*.15)) {
elFS++
cl[i].children[0].style.fontSize = elFS + 'px'
elH = parseInt(window.getComputedStyle(cl[i].children[0]).height)
}
while (elH > h - (h*.15)) {
elFS--
cl[i].children[0].style.fontSize = elFS + 'px'
elH = parseInt(window.getComputedStyle(cl[i].children[0]).height)
}
}
return true
}
}
module.exports = fitText

View File

@ -0,0 +1,25 @@
let user = require('../models/user')
var idleTimeout = {
timeoutId: 0,
setup: function() {
window.addEventListener("mousemove", idleTimeout.resetTimer, false);
window.addEventListener("mousedown", idleTimeout.resetTimer, false);
window.addEventListener("keypress", idleTimeout.resetTimer, false);
window.addEventListener("DOMMouseScroll", idleTimeout.resetTimer, false);
window.addEventListener("mousewheel", idleTimeout.resetTimer, false);
window.addEventListener("touchmove", idleTimeout.resetTimer, false);
window.addEventListener("MSPointerMove", idleTimeout.resetTimer, false);
idleTimeout.startTimer();
},
startTimer: function() {
idleTimeout.timeoutId = window.setTimeout(user.logout, 60000*5);
},
resetTimer: function() {
window.clearTimeout(idleTimeout.timeoutId);
idleTimeout.startTimer();
}
}
module.exports = idleTimeout

11
composer.json Normal file
View File

@ -0,0 +1,11 @@
{
"require": {
"defuse/php-encryption": "^2.1"
},
"autoload": {
"psr-4": {
"Core\\": "Core/",
"App\\": "App/"
}
}
}

1861
composer.lock generated Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

View File

@ -1,56 +0,0 @@
-- Adminer 4.3.0 MySQL dump
SET NAMES utf8;
SET time_zone = '+00:00';
SET foreign_key_checks = 0;
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
DROP TABLE IF EXISTS `kategori`;
CREATE TABLE `kategori` (
`id` int(3) NOT NULL AUTO_INCREMENT,
`category` varchar(20) NOT NULL,
`background` char(7) NOT NULL DEFAULT '#ffffff',
`foreground` char(7) NOT NULL DEFAULT '#000000',
`status` tinyint(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `pengumuman`;
CREATE TABLE `pengumuman` (
`id` int(3) NOT NULL AUTO_INCREMENT,
`category` int(3) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`valid_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`expired_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`creator` int(3) NOT NULL,
`edited_at` timestamp NULL DEFAULT NULL,
`editor` int(3) DEFAULT NULL,
`content` varchar(255) NOT NULL,
`status` tinyint(1) NOT NULL DEFAULT 1,
`delay` int(11) NOT NULL DEFAULT 5000,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `pengumuman` (`id`, `category`, `created_at`, `valid_at`, `expired_at`, `creator`, `edited_at`, `editor`, `content`, `status`, `delay`) VALUES
(1, 2, '2017-09-20 00:00:00', '2017-09-26 00:00:00', '2017-09-29 00:00:00', 1, NULL, NULL, 'Pengambilan &amp; pengisian KRS tanggal **21 - 26 Agustus 2017**.', 1, 5000),
(2, 1, '2017-08-15 00:00:00', '2017-09-16 00:00:00', '2017-09-20 00:00:00', 1, '2017-09-20 00:00:00', 1, '**Almamater gelombang 3** sudah dapat diambil di ruang **Student Admission Officer (Marketing)**.', 0, 5000),
(3, 1, '2017-09-10 00:00:00', '2017-09-11 00:00:00', '2017-09-30 00:00:00', 1, NULL, NULL, 'Perkuliahan semester ganjil dimulai pada tanggal **11 September 2017**.', 1, 5000),
(4, 3, '0000-00-00 00:00:00', '2017-09-30 00:00:00', '2017-09-30 00:00:00', 1, '2017-09-29 00:00:00', 1, 'Kelas **TI-123** pindah ke ruangan **321** untuk hari ini *30 Sep 2017*', 1, 5000)
ON DUPLICATE KEY UPDATE `id` = VALUES(`id`), `category` = VALUES(`category`), `created_at` = VALUES(`created_at`), `valid_at` = VALUES(`valid_at`), `expired_at` = VALUES(`expired_at`), `creator` = VALUES(`creator`), `edited_at` = VALUES(`edited_at`), `editor` = VALUES(`editor`), `content` = VALUES(`content`), `status` = VALUES(`status`), `delay` = VALUES(`delay`);
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(3) NOT NULL AUTO_INCREMENT,
`username` varchar(25) NOT NULL,
`password` char(13) NOT NULL,
`salt` char(23) NOT NULL,
`full_name` varchar(50) NOT NULL,
`registered_at` timestamp NOT NULL DEFAULT current_timestamp(),
`privilege` tinyint(1) NOT NULL DEFAULT 0,
`max_user` int(1) NOT NULL DEFAULT 5,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 2017-10-05 09:25:05

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