Compare commits
211 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
43f9b76ff3 | ||
|
|
85c68c1f46 | ||
|
|
ffcfef8d1c | ||
|
|
fc2191b8db | ||
|
|
03edaea99a | ||
|
|
ee36a0cfae | ||
|
|
a868a6cac1 | ||
|
|
574756b236 | ||
|
|
f9599079e5 | ||
|
|
10afffb71d | ||
|
|
79d53af339 | ||
|
|
8cc6a9cc63 | ||
|
|
18001fbdd0 | ||
|
|
41c2983312 | ||
|
|
e52bc9c6b2 | ||
|
|
a16233ee10 | ||
|
|
5b177f1127 | ||
|
|
f7633b6a5f | ||
|
|
d58e6cb560 | ||
|
|
87fe9c1771 | ||
|
|
95d9e9edb9 | ||
|
|
f7b2c51f9d | ||
|
|
72c70e27f2 | ||
|
|
becbe5ab96 | ||
|
|
f5bce95808 | ||
|
|
1e2b807e05 | ||
|
|
ed3dbf2f14 | ||
|
|
1e35f83fed | ||
|
|
8499d100ff | ||
|
|
bdeae6a722 | ||
|
|
4c63b66dbf | ||
|
|
371f52f92e | ||
|
|
6daaf94974 | ||
|
|
b8e5a22648 | ||
|
|
e821edf01a | ||
|
|
188316df47 | ||
|
|
dd14ce8738 | ||
|
|
d8e4053ce4 | ||
|
|
f73b78f292 | ||
|
|
96ec1e0b08 | ||
|
|
1904d9d910 | ||
|
|
beb2851f4a | ||
|
|
645a0bc7fe | ||
|
|
ef73918098 | ||
|
|
06a23c70af | ||
|
|
323a6e17c7 | ||
|
|
0ca07c9698 | ||
|
|
fbb21d2885 | ||
|
|
b6741c8ff0 | ||
|
|
7fdca02af7 | ||
|
|
271100c25b | ||
|
|
cfecce6100 | ||
|
|
d71341df7a | ||
|
|
ac851f5a02 | ||
|
|
d2a8b7af48 | ||
|
|
4d7a86fbf7 | ||
|
|
87a3af3dbf | ||
|
|
79c76b9f50 | ||
|
|
d7742df802 | ||
|
|
736222e173 | ||
|
|
047ffb0b55 | ||
|
|
505d17cf57 | ||
|
|
71c2da160d | ||
|
|
3487b9e479 | ||
|
|
7cdf315d78 | ||
|
|
a1812a962c | ||
|
|
b97cab34b0 | ||
|
|
3426450b3c | ||
|
|
75804f4624 | ||
|
|
23f757e06f | ||
|
|
fabd704bab | ||
|
|
c16fbae963 | ||
|
|
348759b9ad | ||
|
|
d961aeb19b | ||
|
|
987a9c03b0 | ||
|
|
d17fb04983 | ||
|
|
b07918d751 | ||
|
|
f9a19fce91 | ||
|
|
1b71e80d52 | ||
|
|
9fac11cb77 | ||
|
|
a94fb108fa | ||
|
|
f51893b2d6 | ||
|
|
a4b32dcafd | ||
|
|
862f870303 | ||
|
|
869cfd34ab | ||
|
|
9e67b7c72e | ||
|
|
a5b7f10809 | ||
|
|
698665176c | ||
|
|
1bd65222e4 | ||
|
|
61a5a1a8b0 | ||
|
|
e51cdd7f7a | ||
|
|
a626222ff3 | ||
|
|
af68a45a3d | ||
|
|
7969df9344 | ||
|
|
67bc656325 | ||
|
|
b5baf0d606 | ||
|
|
32964e9045 | ||
|
|
27a667675a | ||
|
|
9a221f47bf | ||
|
|
8d2fbc5599 | ||
|
|
84ebe6587d | ||
|
|
89a71a18da | ||
|
|
05dd7a090b | ||
|
|
3a9bdd2c43 | ||
|
|
0292e9976e | ||
|
|
365de9512f | ||
|
|
e857023903 | ||
|
|
c058e1a452 | ||
|
|
7f42967b67 | ||
|
|
994961de54 | ||
|
|
049d20536c | ||
|
|
c9c8171a52 | ||
|
|
e7a6ac5a75 | ||
|
|
3a372107ba | ||
|
|
493374de65 | ||
|
|
c43fc929f7 | ||
|
|
895d5f2ebe | ||
|
|
cb4768e2cf | ||
|
|
6ca4bfb9ee | ||
|
|
1f7de03d90 | ||
|
|
861d287750 | ||
|
|
e2cc32fd0a | ||
|
|
762df25c45 | ||
|
|
0b114e7dc1 | ||
|
|
981876c43c | ||
|
|
7fe9c477e3 | ||
|
|
5b3a7f4e02 | ||
|
|
60e20c4023 | ||
|
|
9e1bb6c075 | ||
|
|
9c05d0d803 | ||
|
|
3d1393c0b3 | ||
|
|
9914fdb111 | ||
|
|
9b24c9f1b5 | ||
|
|
81b8c646d2 | ||
|
|
f734832e0f | ||
|
|
1bde11b30b | ||
|
|
9e80c3fe40 | ||
|
|
f272dd13ce | ||
|
|
9f26de89a4 | ||
|
|
e23964ebad | ||
|
|
d0584ac941 | ||
|
|
1410c41f48 | ||
|
|
5f524563cf | ||
|
|
3d181623c3 | ||
|
|
1919dbfd96 | ||
|
|
8e1615ac5f | ||
|
|
7966f07fdb | ||
|
|
ac8fe7012b | ||
|
|
51d89dae82 | ||
|
|
ef21ac0fe7 | ||
|
|
02697687cc | ||
|
|
fd2f7f27a6 | ||
|
|
21b1ef5e4b | ||
|
|
e452d3b5f6 | ||
|
|
1419882455 | ||
|
|
d79202ed87 | ||
|
|
aa05c947a9 | ||
|
|
eb69ea05fa | ||
|
|
244b0998f9 | ||
|
|
1f608b1c21 | ||
|
|
7d6df3843b | ||
|
|
dd4b94ba71 | ||
|
|
edb9397a47 | ||
|
|
66815a8487 | ||
|
|
5ee19bceb6 | ||
|
|
deba7d0279 | ||
|
|
38e93d33f1 | ||
|
|
f182f305fc | ||
|
|
03c675ed57 | ||
|
|
3916b2d4dc | ||
|
|
698a7a9bbc | ||
|
|
9954d1b6bf | ||
|
|
a98b981efe | ||
|
|
dd2ca62eaf | ||
|
|
dc2a42ad6d | ||
|
|
b5b25458db | ||
|
|
ac4bbceb2f | ||
|
|
4980bfab12 | ||
|
|
63e0d07d50 | ||
|
|
2b76520e3a | ||
|
|
6631b8a23b | ||
|
|
04d34017c1 | ||
|
|
6dcbcb452e | ||
|
|
7c74b3bb13 | ||
|
|
b76a9ee118 | ||
|
|
40da649b10 | ||
|
|
cd64d762e7 | ||
|
|
b91c52820a | ||
|
|
1204ffd306 | ||
|
|
978267dd14 | ||
|
|
f935fd94c6 | ||
|
|
fb2428e21b | ||
|
|
e36a126c01 | ||
|
|
b186978624 | ||
|
|
49773d7654 | ||
|
|
53c03751a1 | ||
|
|
9d2908449a | ||
|
|
caf92bcf6d | ||
|
|
cbef469e02 | ||
|
|
a6bfc1d76c | ||
|
|
0446a74de9 | ||
|
|
1a14079b39 | ||
|
|
d9c1919ddc | ||
|
|
f42ac0c5ba | ||
|
|
c073929895 | ||
|
|
02df7844a4 | ||
|
|
e43aba0111 | ||
|
|
ac7446ffe6 | ||
|
|
e45d3ca6ec | ||
|
|
603550a453 | ||
|
|
4463ef4a9a |
31
.env
@@ -1,31 +0,0 @@
|
||||
APP_NAME=Heimdall
|
||||
APP_ENV=local
|
||||
APP_KEY=base64:I206O8ibx+GQyRE7BeOxDobn04Mfmyyc5Ptzns/C0mY=
|
||||
APP_DEBUG=true
|
||||
APP_LOG_LEVEL=debug
|
||||
APP_URL=http://localhost
|
||||
|
||||
DB_CONNECTION=sqlite
|
||||
DB_DATABASE=app.sqlite
|
||||
|
||||
BROADCAST_DRIVER=log
|
||||
CACHE_DRIVER=file
|
||||
SESSION_DRIVER=file
|
||||
SESSION_LIFETIME=120
|
||||
QUEUE_DRIVER=sync
|
||||
|
||||
REDIS_HOST=127.0.0.1
|
||||
REDIS_PASSWORD=null
|
||||
REDIS_PORT=6379
|
||||
|
||||
MAIL_DRIVER=smtp
|
||||
MAIL_HOST=smtp.mailtrap.io
|
||||
MAIL_PORT=2525
|
||||
MAIL_USERNAME=null
|
||||
MAIL_PASSWORD=null
|
||||
MAIL_ENCRYPTION=null
|
||||
|
||||
PUSHER_APP_ID=
|
||||
PUSHER_APP_KEY=
|
||||
PUSHER_APP_SECRET=
|
||||
PUSHER_APP_CLUSTER=mt1
|
||||
28
.env.example
@@ -1,19 +1,17 @@
|
||||
APP_NAME=Laravel
|
||||
APP_NAME=Heimdall
|
||||
APP_ENV=local
|
||||
APP_KEY=
|
||||
APP_DEBUG=true
|
||||
APP_LOG_LEVEL=debug
|
||||
APP_DEBUG=false
|
||||
APP_URL=http://localhost
|
||||
|
||||
DB_CONNECTION=mysql
|
||||
DB_HOST=127.0.0.1
|
||||
DB_PORT=3306
|
||||
DB_DATABASE=homestead
|
||||
DB_USERNAME=homestead
|
||||
DB_PASSWORD=secret
|
||||
LOG_CHANNEL=daily
|
||||
|
||||
DB_CONNECTION=sqlite
|
||||
DB_DATABASE=app.sqlite
|
||||
|
||||
BROADCAST_DRIVER=log
|
||||
CACHE_DRIVER=file
|
||||
QUEUE_CONNECTION=sync
|
||||
SESSION_DRIVER=file
|
||||
SESSION_LIFETIME=120
|
||||
QUEUE_DRIVER=sync
|
||||
@@ -22,14 +20,24 @@ REDIS_HOST=127.0.0.1
|
||||
REDIS_PASSWORD=null
|
||||
REDIS_PORT=6379
|
||||
|
||||
MAIL_DRIVER=smtp
|
||||
MAIL_MAILER=smtp
|
||||
MAIL_HOST=smtp.mailtrap.io
|
||||
MAIL_PORT=2525
|
||||
MAIL_USERNAME=null
|
||||
MAIL_PASSWORD=null
|
||||
MAIL_ENCRYPTION=null
|
||||
MAIL_FROM_ADDRESS=null
|
||||
MAIL_FROM_NAME="${APP_NAME}"
|
||||
|
||||
AWS_ACCESS_KEY_ID=
|
||||
AWS_SECRET_ACCESS_KEY=
|
||||
AWS_DEFAULT_REGION=us-east-1
|
||||
AWS_BUCKET=
|
||||
|
||||
PUSHER_APP_ID=
|
||||
PUSHER_APP_KEY=
|
||||
PUSHER_APP_SECRET=
|
||||
PUSHER_APP_CLUSTER=mt1
|
||||
|
||||
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
|
||||
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
|
||||
|
||||
2
.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
/app/SupportedApps
|
||||
/node_modules
|
||||
/public/hot
|
||||
/public/storage
|
||||
@@ -25,3 +26,4 @@ yarn-error.log
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
storage/app/public/avatars/*
|
||||
.env
|
||||
|
||||
14
SECURITY.md
Normal file
@@ -0,0 +1,14 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 2.3.x | :white_check_mark: |
|
||||
| < 2.3 | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
You can report any vulnerabilities on our discord server by DM-ing a team member, or asking a team member to DM you.
|
||||
|
||||
https://discord.com/invite/YWrKVTn
|
||||
@@ -39,22 +39,86 @@ class Application extends Model
|
||||
public function class()
|
||||
{
|
||||
$name = $this->name;
|
||||
$name = preg_replace('/\PL/u', '', $name);
|
||||
$name = preg_replace('/[^\p{L}\p{N}]/u', '', $name);
|
||||
|
||||
$class = '\App\SupportedApps\\'.$name.'\\'.$name;
|
||||
return $class;
|
||||
}
|
||||
|
||||
public static function classFromName($name)
|
||||
{
|
||||
$name = preg_replace('/[^\p{L}\p{N}]/u', '', $name);
|
||||
|
||||
$class = '\App\SupportedApps\\'.$name.'\\'.$name;
|
||||
return $class;
|
||||
}
|
||||
|
||||
|
||||
public static function apps()
|
||||
{
|
||||
$json = json_decode(file_get_contents(storage_path('app/supportedapps.json'))) ?? [];
|
||||
$apps = collect($json->apps);
|
||||
$sorted = $apps->sortBy('name', SORT_NATURAL|SORT_FLAG_CASE);
|
||||
return $sorted;
|
||||
}
|
||||
|
||||
public static function autocomplete()
|
||||
{
|
||||
$apps = self::apps();
|
||||
$list = [];
|
||||
foreach($apps as $app) {
|
||||
$list[] = (object)[
|
||||
'label' => $app->name,
|
||||
'value' => $app->appid
|
||||
];
|
||||
}
|
||||
return $list;
|
||||
}
|
||||
|
||||
public static function getApp($appid)
|
||||
{
|
||||
$localapp = Application::where('appid', $appid)->first();
|
||||
$app = self::single($appid);
|
||||
|
||||
$application = ($localapp) ? $localapp : new Application;
|
||||
|
||||
if(!file_exists(app_path('SupportedApps/'.className($app->name)))) {
|
||||
SupportedApps::getFiles($app);
|
||||
SupportedApps::saveApp($app, $application);
|
||||
} else {
|
||||
// check if there has been an update for this app
|
||||
if($localapp) {
|
||||
if($localapp->sha !== $app->sha) {
|
||||
SupportedApps::getFiles($app);
|
||||
$app = SupportedApps::saveApp($app, $application);
|
||||
}
|
||||
} else {
|
||||
SupportedApps::getFiles($app);
|
||||
$app = SupportedApps::saveApp($app, $application);
|
||||
|
||||
}
|
||||
}
|
||||
return $app;
|
||||
|
||||
}
|
||||
|
||||
public static function single($appid)
|
||||
{
|
||||
$apps = self::apps();
|
||||
$app = $apps->where('appid', $appid)->first();
|
||||
if ($app === null) return null;
|
||||
$classname = preg_replace('/[^\p{L}\p{N}]/u', '', $app->name);
|
||||
$app->class = '\App\SupportedApps\\'.$classname.'\\'.$classname;
|
||||
return $app;
|
||||
}
|
||||
|
||||
public static function applist()
|
||||
{
|
||||
$list = [];
|
||||
$all = self::orderBy('name')->get()->sortBy('name', SORT_NATURAL|SORT_FLAG_CASE);
|
||||
$list['null'] = 'None';
|
||||
foreach($all as $app) {
|
||||
$name = $app->name;
|
||||
$name = preg_replace('/\PL/u', '', $name);
|
||||
|
||||
$list['\App\SupportedApps\\'.$name.'\\'.$name] = $app->name;
|
||||
$apps = self::apps();
|
||||
foreach($apps as $app) {
|
||||
$list[$app->appid] = $app->name;
|
||||
}
|
||||
return $list;
|
||||
}
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
namespace App\Exceptions;
|
||||
|
||||
use Exception;
|
||||
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
|
||||
use Throwable;
|
||||
|
||||
class Handler extends ExceptionHandler
|
||||
{
|
||||
@@ -22,32 +22,20 @@ class Handler extends ExceptionHandler
|
||||
* @var array
|
||||
*/
|
||||
protected $dontFlash = [
|
||||
'current_password',
|
||||
'password',
|
||||
'password_confirmation',
|
||||
];
|
||||
|
||||
/**
|
||||
* Report or log an exception.
|
||||
* Register the exception handling callbacks for the application.
|
||||
*
|
||||
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
|
||||
*
|
||||
* @param \Exception $exception
|
||||
* @return void
|
||||
*/
|
||||
public function report(Exception $exception)
|
||||
public function register()
|
||||
{
|
||||
parent::report($exception);
|
||||
}
|
||||
|
||||
/**
|
||||
* Render an exception into an HTTP response.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Exception $exception
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function render($request, Exception $exception)
|
||||
{
|
||||
return parent::render($request, $exception);
|
||||
$this->reportable(function (Throwable $e) {
|
||||
//
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
function format_bytes($bytes, $is_drive_size = true, $beforeunit = '', $afterunit = '')
|
||||
{
|
||||
$btype = ($is_drive_size === true) ? 1000 : 1024;
|
||||
@@ -11,6 +13,27 @@ function format_bytes($bytes, $is_drive_size = true, $beforeunit = '', $afteruni
|
||||
else return(round($bytes, 0).$beforeunit.$labels[$x].$afterunit);
|
||||
}
|
||||
|
||||
function str_slug($title, $separator = '-', $language = 'en')
|
||||
{
|
||||
return Str::slug($title, $separator, $language);
|
||||
}
|
||||
|
||||
if (! function_exists('str_is')) {
|
||||
/**
|
||||
* Determine if a given string matches a given pattern.
|
||||
*
|
||||
* @param string|array $pattern
|
||||
* @param string $value
|
||||
* @return bool
|
||||
*
|
||||
* @deprecated Str::is() should be used directly instead. Will be removed in Laravel 6.0.
|
||||
*/
|
||||
function str_is($pattern, $value)
|
||||
{
|
||||
return Str::is($pattern, $value);
|
||||
}
|
||||
}
|
||||
|
||||
function get_brightness($hex) {
|
||||
// returns brightness value from 0 to 255
|
||||
// strip off any leading #
|
||||
@@ -35,10 +58,22 @@ function title_color($hex)
|
||||
}
|
||||
}
|
||||
|
||||
function getLinkTargetAttribute()
|
||||
{
|
||||
$target = \App\Setting::fetch('window_target');
|
||||
|
||||
if($target === 'current') {
|
||||
return '';
|
||||
} else {
|
||||
return ' target="' . $target . '"';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
function className($name)
|
||||
{
|
||||
$name = preg_replace('/\PL/u', '', $name);
|
||||
$name = preg_replace('/[^\p{L}\p{N}]/u', '', $name);
|
||||
return $name;
|
||||
}
|
||||
|
||||
|
||||
105
app/Http/Controllers/ApiItemController.php
Normal file
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use App\Item;
|
||||
use App\SettingUser;
|
||||
use App\User;
|
||||
|
||||
class ApiItemController extends Controller
|
||||
{
|
||||
protected $api_key;
|
||||
protected $user;
|
||||
|
||||
function __construct(Request $request) {
|
||||
$this->middleware('apikey');
|
||||
|
||||
$key = $request->input('api_key');
|
||||
if ($key) {
|
||||
$details = SettingUser::where('setting_id', 12)->where('uservalue', $key)->first();
|
||||
$this->api_key = $key;
|
||||
$this->user = User::find($details->user_id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return $this->user->items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
$request->merge([
|
||||
'user_id' => $this->user->id
|
||||
]);
|
||||
// die(print_r($request->all()));
|
||||
Item::create($request->all());
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function destroy($id)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
@@ -59,7 +59,7 @@ class LoginController extends Controller
|
||||
public function login(Request $request)
|
||||
{
|
||||
$current_user = User::currentUser();
|
||||
$request->merge(['username' => $current_user->username]);
|
||||
$request->merge(['username' => $current_user->username, 'remember' => true]);
|
||||
//die(print_r($request->all()));
|
||||
$this->validateLogin($request);
|
||||
|
||||
@@ -98,7 +98,7 @@ class LoginController extends Controller
|
||||
public function autologin($uuid)
|
||||
{
|
||||
$user = User::where('autologin', $uuid)->first();
|
||||
Auth::login($user);
|
||||
Auth::login($user, true);
|
||||
session(['current_user' => $user]);
|
||||
return redirect()->route('dash');
|
||||
}
|
||||
|
||||
@@ -12,6 +12,13 @@ use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use App\SupportedApps;
|
||||
use App\Jobs\ProcessApps;
|
||||
use App\Search;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use GuzzleHttp\Client;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
|
||||
class ItemController extends Controller
|
||||
{
|
||||
@@ -26,8 +33,16 @@ class ItemController extends Controller
|
||||
*/
|
||||
public function dash()
|
||||
{
|
||||
$data['apps'] = Item::doesntHave('parents')->pinned()->orderBy('order', 'asc')->get();
|
||||
$data['all_apps'] = Item::doesntHave('parents')->get();
|
||||
$data['apps'] = Item::whereHas('parents', function ($query) {
|
||||
$query->where('id', 0);
|
||||
})->orWhere('type', 1)->pinned()->orderBy('order', 'asc')->get();
|
||||
|
||||
$data['all_apps'] = Item::whereHas('parents', function ($query) {
|
||||
$query->where('id', 0);
|
||||
})->orWhere('type', 1)->orderBy('order', 'asc')->get();
|
||||
|
||||
//$data['all_apps'] = Item::doesntHave('parents')->get();
|
||||
//die(print_r($data['apps']));
|
||||
return view('welcome', $data);
|
||||
}
|
||||
|
||||
@@ -56,7 +71,7 @@ class ItemController extends Controller
|
||||
$item = Item::findOrFail($id);
|
||||
$item->pinned = true;
|
||||
$item->save();
|
||||
$route = route('dash', [], false);
|
||||
$route = route('dash', []);
|
||||
return redirect($route);
|
||||
}
|
||||
|
||||
@@ -70,7 +85,7 @@ class ItemController extends Controller
|
||||
$item = Item::findOrFail($id);
|
||||
$item->pinned = false;
|
||||
$item->save();
|
||||
$route = route('dash', [], false);
|
||||
$route = route('dash', []);
|
||||
return redirect($route);
|
||||
}
|
||||
|
||||
@@ -79,20 +94,25 @@ class ItemController extends Controller
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function pinToggle($id, $ajax=false)
|
||||
public function pinToggle($id, $ajax=false, $tag=false)
|
||||
{
|
||||
$item = Item::findOrFail($id);
|
||||
$new = ((bool)$item->pinned === true) ? false : true;
|
||||
$item->pinned = $new;
|
||||
$item->save();
|
||||
if($ajax) {
|
||||
$data['apps'] = Item::pinned()->get();
|
||||
if(is_numeric($tag) && $tag > 0) {
|
||||
$item = Item::whereId($tag)->first();
|
||||
$data['apps'] = $item->children()->pinned()->orderBy('order', 'asc')->get();
|
||||
} else {
|
||||
$data['apps'] = Item::pinned()->orderBy('order', 'asc')->get();
|
||||
}
|
||||
$data['ajax'] = true;
|
||||
return view('sortable', $data);
|
||||
} else {
|
||||
$route = route('dash', [], false);
|
||||
$route = route('dash', []);
|
||||
return redirect($route);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -124,23 +144,45 @@ class ItemController extends Controller
|
||||
{
|
||||
//
|
||||
$data['tags'] = Item::ofType('tag')->orderBy('title', 'asc')->pluck('title', 'id');
|
||||
$data['current_tags'] = [];
|
||||
$data['tags']->prepend(__('app.dashboard'), 0);
|
||||
$data['current_tags'] = '0';
|
||||
return view('items.create', $data);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function store(Request $request)
|
||||
public function edit($id)
|
||||
{
|
||||
//
|
||||
// Get the item
|
||||
$item = Item::find($id);
|
||||
if($item->appid === null && $item->class !== null) { // old apps wont have an app id so set it
|
||||
$app = Application::where('class', $item->class)->first();
|
||||
if($app) {
|
||||
$item->appid = $app->appid;
|
||||
}
|
||||
}
|
||||
$data['item'] = $item;
|
||||
$data['tags'] = Item::ofType('tag')->orderBy('title', 'asc')->pluck('title', 'id');
|
||||
$data['tags']->prepend(__('app.dashboard'), 0);
|
||||
$data['current_tags'] = $data['item']->tags();
|
||||
//$data['current_tags'] = $data['item']->parent;
|
||||
//die(print_r($data['current_tags']));
|
||||
// show the edit form and pass the nerd
|
||||
return view('items.edit', $data);
|
||||
}
|
||||
|
||||
|
||||
public function storelogic($request, $id = null)
|
||||
{
|
||||
$application = Application::single($request->input('appid'));
|
||||
$validatedData = $request->validate([
|
||||
'title' => 'required|max:255',
|
||||
'url' => 'required|url',
|
||||
'url' => 'required',
|
||||
]);
|
||||
|
||||
if($request->hasFile('file')) {
|
||||
@@ -148,6 +190,22 @@ class ItemController extends Controller
|
||||
$request->merge([
|
||||
'icon' => $path
|
||||
]);
|
||||
} elseif(strpos($request->input('icon'), 'http') === 0) {
|
||||
$contents = file_get_contents($request->input('icon'));
|
||||
|
||||
if ($application) {
|
||||
$icon = $application->icon;
|
||||
} else {
|
||||
$file = $request->input('icon');
|
||||
$path_parts = pathinfo($file);
|
||||
$icon = md5($contents);
|
||||
$icon .= '.'.$path_parts['extension'];
|
||||
}
|
||||
$path = 'icons/'.$icon;
|
||||
Storage::disk('public')->put($path, $contents);
|
||||
$request->merge([
|
||||
'icon' => $path
|
||||
]);
|
||||
}
|
||||
|
||||
$config = Item::checkConfig($request->input('config'));
|
||||
@@ -157,20 +215,41 @@ class ItemController extends Controller
|
||||
'user_id' => $current_user->id
|
||||
]);
|
||||
|
||||
if($request->input('class') === 'null') {
|
||||
if($request->input('appid') === 'null') {
|
||||
$request->merge([
|
||||
'class' => null,
|
||||
]);
|
||||
} else {
|
||||
$request->merge([
|
||||
'class' => Application::classFromName($application->name),
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//die(print_r($request->input('config')));
|
||||
|
||||
$item = Item::create($request->all());
|
||||
if($id === null) {
|
||||
$item = Item::create($request->all());
|
||||
} else {
|
||||
$item = Item::find($id);
|
||||
$item->update($request->all());
|
||||
}
|
||||
|
||||
|
||||
$item->parents()->sync($request->tags);
|
||||
|
||||
$route = route('dash', [], false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
$this->storelogic($request);
|
||||
|
||||
$route = route('dash', []);
|
||||
return redirect($route)
|
||||
->with('success', __('app.alert.success.item_created'));
|
||||
}
|
||||
@@ -186,22 +265,6 @@ class ItemController extends Controller
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
// Get the item
|
||||
$data['item'] = Item::find($id);
|
||||
$data['tags'] = Item::ofType('tag')->orderBy('title', 'asc')->pluck('title', 'id');
|
||||
$data['current_tags'] = $data['item']->parents;
|
||||
|
||||
// show the edit form and pass the nerd
|
||||
return view('items.edit', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
@@ -212,38 +275,8 @@ class ItemController extends Controller
|
||||
*/
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$validatedData = $request->validate([
|
||||
'title' => 'required|max:255',
|
||||
'url' => 'required|url',
|
||||
]);
|
||||
//die(print_r($request->all()));
|
||||
if($request->hasFile('file')) {
|
||||
$path = $request->file('file')->store('icons');
|
||||
$request->merge([
|
||||
'icon' => $path
|
||||
]);
|
||||
}
|
||||
|
||||
$config = Item::checkConfig($request->input('config'));
|
||||
$current_user = User::currentUser();
|
||||
$request->merge([
|
||||
'description' => $config,
|
||||
'user_id' => $current_user->id
|
||||
]);
|
||||
|
||||
if($request->input('class') === 'null') {
|
||||
$request->merge([
|
||||
'class' => null,
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
$item = Item::find($id);
|
||||
$item->update($request->all());
|
||||
|
||||
$item->parents()->sync($request->tags);
|
||||
|
||||
$route = route('dash', [], false);
|
||||
$this->storelogic($request, $id);
|
||||
$route = route('dash', []);
|
||||
return redirect($route)
|
||||
->with('success',__('app.alert.success.item_updated'));
|
||||
}
|
||||
@@ -266,7 +299,7 @@ class ItemController extends Controller
|
||||
Item::find($id)->delete();
|
||||
}
|
||||
|
||||
$route = route('items.index', [], false);
|
||||
$route = route('items.index', []);
|
||||
return redirect($route)
|
||||
->with('success',__('app.alert.success.item_deleted'));
|
||||
}
|
||||
@@ -284,7 +317,7 @@ class ItemController extends Controller
|
||||
->where('id', $id)
|
||||
->restore();
|
||||
|
||||
$route = route('items.inded', [], false);
|
||||
$route = route('items.index', []);
|
||||
return redirect($route)
|
||||
->with('success',__('app.alert.success.item_restored'));
|
||||
}
|
||||
@@ -297,7 +330,10 @@ class ItemController extends Controller
|
||||
public function appload(Request $request)
|
||||
{
|
||||
$output = [];
|
||||
$appname = $request->input('app');
|
||||
$appid = $request->input('app');
|
||||
|
||||
if($appid === "null") return null;
|
||||
/*$appname = $request->input('app');
|
||||
//die($appname);
|
||||
|
||||
$app_details = Application::where('name', $appname)->firstOrFail();
|
||||
@@ -316,8 +352,28 @@ class ItemController extends Controller
|
||||
$output['config'] = className($app_details->name).'.config';
|
||||
} else {
|
||||
$output['config'] = null;
|
||||
}*/
|
||||
|
||||
$output['config'] = null;
|
||||
$output['custom'] = null;
|
||||
|
||||
$app = Application::single($appid);
|
||||
$output = (array)$app;
|
||||
|
||||
$appdetails = Application::getApp($appid);
|
||||
|
||||
if((boolean)$app->enhanced === true) {
|
||||
// if(!isset($app->config)) { // class based config
|
||||
$output['custom'] = className($appdetails->name).'.config';
|
||||
// }
|
||||
}
|
||||
|
||||
$output['colour'] = ($app->tile_background == 'light') ? '#fafbfc' : '#161b1f';
|
||||
$output['iconview'] = config('app.appsource').'icons/' . $app->icon;
|
||||
|
||||
;
|
||||
|
||||
|
||||
return json_encode($output);
|
||||
}
|
||||
|
||||
@@ -325,14 +381,49 @@ class ItemController extends Controller
|
||||
{
|
||||
$data = $request->input('data');
|
||||
//$url = $data[array_search('url', array_column($data, 'name'))]['value'];
|
||||
|
||||
$app = $data['type'];
|
||||
$single = Application::single($data['type']);
|
||||
$app = $single->class;
|
||||
|
||||
$app_details = new $app();
|
||||
$app_details->config = (object)$data;
|
||||
$app_details->test();
|
||||
}
|
||||
|
||||
public function execute($url, $attrs = [], $overridevars=false)
|
||||
{
|
||||
$res = null;
|
||||
|
||||
$vars = ($overridevars !== false) ?
|
||||
$overridevars : [
|
||||
'http_errors' => false,
|
||||
'timeout' => 15,
|
||||
'connect_timeout' => 15,
|
||||
'verify' => false
|
||||
];
|
||||
|
||||
$client = new Client($vars);
|
||||
|
||||
$method = 'GET';
|
||||
|
||||
try {
|
||||
return $client->request($method, $url, $attrs);
|
||||
} catch (\GuzzleHttp\Exception\ConnectException $e) {
|
||||
Log::error("Connection refused");
|
||||
Log::debug($e->getMessage());
|
||||
} catch (\GuzzleHttp\Exception\ServerException $e) {
|
||||
Log::debug($e->getMessage());
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
|
||||
public function websitelookup($url)
|
||||
{
|
||||
$url = \base64_decode($url);
|
||||
$data = $this->execute($url);
|
||||
return $data->getBody();
|
||||
}
|
||||
|
||||
public function getStats($id)
|
||||
{
|
||||
$item = Item::find($id);
|
||||
|
||||
28
app/Http/Controllers/SearchController.php
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Search;
|
||||
|
||||
class SearchController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$requestprovider = $request->input('provider');
|
||||
$query = $request->input('q');
|
||||
|
||||
$provider = Search::providerDetails($requestprovider);
|
||||
|
||||
if($provider->type == 'standard') {
|
||||
return redirect($provider->url.'?'.$provider->query.'='.urlencode($query));
|
||||
} elseif($provider->type == 'external') {
|
||||
$class = new $provider->class;
|
||||
//print_r($provider);
|
||||
return $class->getResults($query, $provider);
|
||||
}
|
||||
|
||||
//print_r($provider);
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,7 @@ use App\SettingGroup;
|
||||
use App\User;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class SettingsController extends Controller
|
||||
{
|
||||
@@ -47,7 +48,7 @@ class SettingsController extends Controller
|
||||
'setting' => $setting,
|
||||
]);
|
||||
} else {
|
||||
$route = route('settings.list', [], false);
|
||||
$route = route('settings.list', []);
|
||||
return redirect($route)
|
||||
->with([
|
||||
'error' => __('app.alert.error.not_exist'),
|
||||
@@ -66,7 +67,7 @@ class SettingsController extends Controller
|
||||
$user = $this->user();
|
||||
|
||||
if (!is_null($setting)) {
|
||||
$data = Setting::getInput();
|
||||
$data = Setting::getInput($request);
|
||||
|
||||
$setting_value = null;
|
||||
|
||||
@@ -77,7 +78,8 @@ class SettingsController extends Controller
|
||||
$path = $request->file('value')->store('backgrounds');
|
||||
$setting_value = $path;
|
||||
}
|
||||
|
||||
} elseif ($setting->type == 'apikey') {
|
||||
$setting_value = Str::random(40);
|
||||
} else {
|
||||
$setting_value = $data->value;
|
||||
}
|
||||
@@ -85,13 +87,13 @@ class SettingsController extends Controller
|
||||
$user->settings()->detach($setting->id);
|
||||
$user->settings()->save($setting, ['uservalue' => $setting_value]);
|
||||
|
||||
$route = route('settings.index', [], false);
|
||||
$route = route('settings.index', []);
|
||||
return redirect($route)
|
||||
->with([
|
||||
'success' => __('app.alert.success.setting_updated'),
|
||||
]);
|
||||
} else {
|
||||
$route = route('settings.index', [], false);
|
||||
$route = route('settings.index', []);
|
||||
return redirect($route)
|
||||
->with([
|
||||
'error' => __('app.alert.error.not_exist'),
|
||||
@@ -111,11 +113,17 @@ class SettingsController extends Controller
|
||||
$user->settings()->detach($setting->id);
|
||||
$user->settings()->save($setting, ['uservalue' => '']);
|
||||
}
|
||||
$route = route('settings.index', [], false);
|
||||
$route = route('settings.index', []);
|
||||
return redirect($route)
|
||||
->with([
|
||||
'success' => __('app.alert.success.setting_updated'),
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
public function search(Request $request)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -22,8 +22,8 @@ class TagController extends Controller
|
||||
{
|
||||
$trash = (bool)$request->input('trash');
|
||||
|
||||
$data['apps'] = Item::ofType('tag')->orderBy('title', 'asc')->get();
|
||||
$data['trash'] = Item::ofType('tag')->onlyTrashed()->get();
|
||||
$data['apps'] = Item::ofType('tag')->where('id', '>', 0)->orderBy('title', 'asc')->get();
|
||||
$data['trash'] = Item::ofType('tag')->where('id', '>', 0)->onlyTrashed()->get();
|
||||
if($trash) {
|
||||
return view('tags.trash', $data);
|
||||
} else {
|
||||
@@ -74,7 +74,7 @@ class TagController extends Controller
|
||||
//die(print_r($request->all()));
|
||||
Item::create($request->all());
|
||||
|
||||
$route = route('dash', [], false);
|
||||
$route = route('dash', []);
|
||||
return redirect($route)
|
||||
->with('success', __('app.alert.success.tag_created'));
|
||||
}
|
||||
@@ -90,6 +90,7 @@ class TagController extends Controller
|
||||
$item = Item::whereUrl($slug)->first();
|
||||
//print_r($item);
|
||||
$data['apps'] = $item->children()->pinned()->orderBy('order', 'asc')->get();
|
||||
$data['tag'] = $item->id;
|
||||
$data['all_apps'] = $item->children;
|
||||
return view('welcome', $data);
|
||||
}
|
||||
@@ -138,7 +139,7 @@ class TagController extends Controller
|
||||
|
||||
Item::find($id)->update($request->all());
|
||||
|
||||
$route = route('dash', [], false);
|
||||
$route = route('dash', []);
|
||||
return redirect($route)
|
||||
->with('success',__('app.alert.success.tag_updated'));
|
||||
}
|
||||
@@ -161,7 +162,7 @@ class TagController extends Controller
|
||||
Item::find($id)->delete();
|
||||
}
|
||||
|
||||
$route = route('tags.index', [], false);
|
||||
$route = route('tags.index', []);
|
||||
return redirect($route)
|
||||
->with('success',__('app.alert.success.item_deleted'));
|
||||
}
|
||||
@@ -178,7 +179,7 @@ class TagController extends Controller
|
||||
Item::withTrashed()
|
||||
->where('id', $id)
|
||||
->restore();
|
||||
$route = route('tags.index', [], false);
|
||||
$route = route('tags.index', []);
|
||||
return redirect($route)
|
||||
->with('success',__('app.alert.success.item_restored'));
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ class UserController extends Controller
|
||||
|
||||
$user->save();
|
||||
|
||||
$route = route('dash', [], false);
|
||||
$route = route('dash', []);
|
||||
return redirect($route)
|
||||
->with('success',__('app.alert.success.user_updated'));
|
||||
}
|
||||
@@ -150,7 +150,7 @@ class UserController extends Controller
|
||||
|
||||
$user->save();
|
||||
|
||||
$route = route('dash', [], false);
|
||||
$route = route('dash', []);
|
||||
return redirect($route)
|
||||
->with('success',__('app.alert.success.user_updated'));
|
||||
|
||||
@@ -166,7 +166,7 @@ class UserController extends Controller
|
||||
{
|
||||
if($user->id !== 1) {
|
||||
$user->delete();
|
||||
$route = route('dash', [], false);
|
||||
$route = route('dash', []);
|
||||
return redirect($route)
|
||||
->with('success',__('app.alert.success.user_deleted'));
|
||||
|
||||
|
||||
@@ -58,5 +58,6 @@ class Kernel extends HttpKernel
|
||||
'can' => \Illuminate\Auth\Middleware\Authorize::class,
|
||||
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
|
||||
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
|
||||
'apikey' => \App\Http\Middleware\UserApiKey::class,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ class TrustProxies extends Middleware
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $proxies;
|
||||
protected $proxies = ['192.168.0.0/16', '172.16.0.0/12','10.0.0.0/8', '127.0.0.1'];
|
||||
|
||||
/**
|
||||
* The current proxy header mappings.
|
||||
|
||||
30
app/Http/Middleware/UserApiKey.php
Normal file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use \App\SettingUser;
|
||||
|
||||
class UserApiKey
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Closure $next
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
$key = $request->input('api_key');
|
||||
$details = SettingUser::where('setting_id', 12)->where('uservalue', $key)->first();
|
||||
// die(var_dump($details));
|
||||
if($details === null) {
|
||||
return response()->json([
|
||||
'status' => 401,
|
||||
'message' => 'invalid api key'
|
||||
], 401);
|
||||
}
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
|
||||
use Symfony\Component\HttpFoundation\Cookie;
|
||||
|
||||
class VerifyCsrfToken extends Middleware
|
||||
{
|
||||
@@ -18,4 +19,40 @@ class VerifyCsrfToken extends Middleware
|
||||
'test_config',
|
||||
//'get_stats'
|
||||
];
|
||||
|
||||
/**
|
||||
* Add the CSRF token to the response cookies.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Symfony\Component\HttpFoundation\Response $response
|
||||
* @return \Symfony\Component\HttpFoundation\Response
|
||||
*/
|
||||
protected function addCookieToResponse($request, $response)
|
||||
{
|
||||
$config = config('session');
|
||||
|
||||
if ($response instanceof Responsable) {
|
||||
$response = $response->toResponse($request);
|
||||
}
|
||||
|
||||
$response->headers->setCookie(
|
||||
new Cookie(
|
||||
'HEIMDALL-XSRF-TOKEN', $request->session()->token(), $this->availableAt(60 * $config['lifetime']),
|
||||
$config['path'], $config['domain'], $config['secure'], false, false, $config['same_site'] ?? null
|
||||
)
|
||||
);
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the cookie contents should be serialized.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function serialized()
|
||||
{
|
||||
return EncryptCookies::serialized('HEIMDALL-XSRF-TOKEN');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
86
app/Item.php
@@ -7,6 +7,8 @@ use Symfony\Component\ClassLoader\ClassMapGenerator;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use App\User;
|
||||
use App\ItemTag;
|
||||
use App\Application;
|
||||
|
||||
class Item extends Model
|
||||
{
|
||||
@@ -18,13 +20,17 @@ class Item extends Model
|
||||
|
||||
static::addGlobalScope('user_id', function (Builder $builder) {
|
||||
$current_user = User::currentUser();
|
||||
$builder->where('user_id', $current_user->id);
|
||||
if($current_user) {
|
||||
$builder->where('user_id', $current_user->id)->orWhere('user_id', 0);
|
||||
} else {
|
||||
$builder->where('user_id', 0);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//
|
||||
protected $fillable = [
|
||||
'title', 'url', 'colour', 'icon', 'description', 'pinned', 'order', 'type', 'class', 'user_id'
|
||||
'title', 'url', 'colour', 'icon', 'appdescription', 'description', 'pinned', 'order', 'type', 'class', 'user_id', 'appid'
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -47,28 +53,35 @@ class Item extends Model
|
||||
|
||||
public static function checkConfig($config)
|
||||
{
|
||||
// die(print_r($config));
|
||||
if(empty($config)) {
|
||||
$config = null;
|
||||
} else {
|
||||
$store = false;
|
||||
//die(var_dump($config));
|
||||
foreach($config as $key => $check) {
|
||||
if($key == 'type') continue;
|
||||
if($key == 'dataonly') continue;
|
||||
if(!empty($check) && $check != '0') {
|
||||
$store = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
//die(var_dump($store))
|
||||
|
||||
$config['enabled'] = ($store) ? true : false;
|
||||
$config = json_encode($config);
|
||||
}
|
||||
return $config;
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function tags()
|
||||
{
|
||||
$id = $this->id;
|
||||
$tags = ItemTag::select('tag_id')->where('item_id', $id)->pluck('tag_id')->toArray();
|
||||
$tagdetails = Item::select('id', 'title', 'url', 'pinned')->whereIn('id', $tags)->get();
|
||||
//print_r($tags);
|
||||
if(in_array(0, $tags)) {
|
||||
$details = new Item([
|
||||
"id" => 0,
|
||||
"title" => __('app.dashboard'),
|
||||
"url" => '',
|
||||
"pinned" => 0
|
||||
]);
|
||||
$tagdetails->prepend($details);
|
||||
}
|
||||
return $tagdetails;
|
||||
}
|
||||
|
||||
public function parents()
|
||||
{
|
||||
return $this->belongsToMany('App\Item', 'item_tag', 'item_id', 'tag_id');
|
||||
@@ -81,7 +94,7 @@ class Item extends Model
|
||||
public function getLinkAttribute()
|
||||
{
|
||||
if((int)$this->type === 1) {
|
||||
return '/tag/'.$this->url;
|
||||
return url('tag/'.$this->url);
|
||||
} else {
|
||||
return $this->url;
|
||||
}
|
||||
@@ -148,20 +161,28 @@ class Item extends Model
|
||||
|
||||
public function enhanced()
|
||||
{
|
||||
if(isset($this->class) && !empty($this->class)) {
|
||||
/*if(isset($this->class) && !empty($this->class)) {
|
||||
$app = new $this->class;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
return (bool)($app instanceof \App\EnhancedApps);
|
||||
return (bool)($app instanceof \App\EnhancedApps);*/
|
||||
return $this->description !== null;
|
||||
}
|
||||
|
||||
public static function isEnhanced($class)
|
||||
{
|
||||
if($class === null || $class === 'null') return false;
|
||||
$app = new $class;
|
||||
return (bool)($app instanceof \App\EnhancedApps);
|
||||
}
|
||||
|
||||
public static function isSearchProvider($class)
|
||||
{
|
||||
$app = new $class;
|
||||
return ((bool)($app instanceof \App\SearchInterface)) ? $app : false;
|
||||
}
|
||||
|
||||
public function enabled()
|
||||
{
|
||||
if($this->enhanced()) {
|
||||
@@ -175,13 +196,15 @@ class Item extends Model
|
||||
|
||||
public function getconfig()
|
||||
{
|
||||
$explode = explode('\\', $this->class);
|
||||
// $explode = explode('\\', $this->class);
|
||||
|
||||
|
||||
if(!isset($this->description) || empty($this->description)) {
|
||||
$config = new \stdClass;
|
||||
$config->name = end($explode);
|
||||
// $config->name = end($explode);
|
||||
$config->enabled = false;
|
||||
$config->override_url = null;
|
||||
$config->apikey = null;
|
||||
return $config;
|
||||
}
|
||||
|
||||
@@ -189,18 +212,39 @@ class Item extends Model
|
||||
|
||||
$config = json_decode($this->description);
|
||||
|
||||
$config->name = end($explode);
|
||||
// $config->name = end($explode);
|
||||
|
||||
|
||||
$config->url = $this->url;
|
||||
if(isset($config->override_url) && !empty($config->override_url)) {
|
||||
$config->url = $config->override_url;
|
||||
} else {
|
||||
$config->override_url = null;
|
||||
}
|
||||
|
||||
return $config;
|
||||
}
|
||||
|
||||
public static function applicationDetails($class)
|
||||
{
|
||||
if(!empty($class)) {
|
||||
$name = self::nameFromClass($class);
|
||||
$application = Application::where('name', $name)->first();
|
||||
if($application) return $application;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
public static function getApplicationDescription($class)
|
||||
{
|
||||
$details = self::applicationDetails($class);
|
||||
if($details !== false) {
|
||||
return $details->description.' - '.$details->license;
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the user that owns the item.
|
||||
|
||||
10
app/ItemTag.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App;
|
||||
|
||||
use Illuminate\Database\Eloquent\Relations\Pivot;
|
||||
|
||||
class ItemTag extends Pivot
|
||||
{
|
||||
|
||||
}
|
||||
@@ -7,8 +7,10 @@ use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use App\Application;
|
||||
use App\SupportedApps;
|
||||
use App\Item;
|
||||
|
||||
class ProcessApps implements ShouldQueue
|
||||
{
|
||||
@@ -31,36 +33,23 @@ class ProcessApps implements ShouldQueue
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$localapps = Application::all();
|
||||
$list = json_decode(SupportedApps::getList()->getBody());
|
||||
$validapps = [];
|
||||
|
||||
foreach($list->apps as $app) {
|
||||
$validapps[] = $app->appid;
|
||||
$localapp = $localapps->where('appid', $app->appid)->first();
|
||||
$localapps = Application::whereNull('class')->get();
|
||||
$json = SupportedApps::getList()->getBody();
|
||||
|
||||
$application = ($localapp) ? $localapp : new Application;
|
||||
Storage::disk('local')->put('supportedapps.json', $json);
|
||||
|
||||
if(!file_exists(app_path('SupportedApps/'.className($app->name)))) {
|
||||
SupportedApps::getFiles($app);
|
||||
SupportedApps::saveApp($app, $application);
|
||||
} else {
|
||||
// check if there has been an update for this app
|
||||
$localapp = $localapps->where('appid', $app->appid)->first();
|
||||
if($localapp) {
|
||||
if($localapp->sha !== $app->sha) {
|
||||
SupportedApps::getFiles($app);
|
||||
SupportedApps::saveApp($app, $application);
|
||||
}
|
||||
} else {
|
||||
SupportedApps::getFiles($app);
|
||||
SupportedApps::saveApp($app, $application);
|
||||
|
||||
}
|
||||
foreach($localapps as $app) {
|
||||
$app->class = $app->class();
|
||||
$app->save();
|
||||
}
|
||||
|
||||
$items = Item::whereNotNull('class')->get();
|
||||
foreach($items as $item) {
|
||||
if(!file_exists(app_path('SupportedApps/'.Item::nameFromClass($item->class)))) {
|
||||
$app = Application::where('class', $item->class)->first();
|
||||
Application::getApp($app->appid);
|
||||
}
|
||||
}
|
||||
//$delete = Application::whereNotIn('appid', $validapps)->delete(); // delete any apps not in list
|
||||
// removed the delete so local apps can be added
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,9 +21,9 @@ class AppServiceProvider extends ServiceProvider
|
||||
{
|
||||
|
||||
if(!is_file(base_path('.env'))) {
|
||||
touch(base_path('.env'));
|
||||
Artisan::call('key:generate');
|
||||
copy(base_path('.env.example'), base_path('.env'));
|
||||
}
|
||||
$this->genKey();
|
||||
if(!is_file(database_path('app.sqlite'))) {
|
||||
// first time setup
|
||||
touch(database_path('app.sqlite'));
|
||||
@@ -48,10 +48,14 @@ class AppServiceProvider extends ServiceProvider
|
||||
|
||||
}
|
||||
|
||||
if(!is_file(public_path('storage'))) {
|
||||
if(!is_file(public_path('storage/.gitignore'))) {
|
||||
Artisan::call('storage:link');
|
||||
\Session::put('current_user', null);
|
||||
}
|
||||
|
||||
$lang = Setting::fetch('language');
|
||||
\App::setLocale($lang);
|
||||
|
||||
|
||||
$applications = Application::all();
|
||||
if($applications->count() <= 0) {
|
||||
@@ -72,25 +76,31 @@ class AppServiceProvider extends ServiceProvider
|
||||
explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
|
||||
}
|
||||
if(!\Auth::check()) {
|
||||
if(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
|
||||
if(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])
|
||||
&& !empty($_SERVER['PHP_AUTH_USER']) && !empty($_SERVER['PHP_AUTH_PW'])) {
|
||||
$credentials = ['username' => $_SERVER['PHP_AUTH_USER'], 'password' => $_SERVER['PHP_AUTH_PW']];
|
||||
|
||||
if (\Auth::attempt($credentials)) {
|
||||
if (\Auth::attempt($credentials, true)) {
|
||||
// Authentication passed...
|
||||
$user = \Auth::user();
|
||||
//\Session::put('current_user', $user);
|
||||
session(['current_user' => $user]);
|
||||
}
|
||||
}
|
||||
elseif(isset($_SERVER['REMOTE_USER']) && !empty($_SERVER['REMOTE_USER'])) {
|
||||
$user = User::where('username', $_SERVER['REMOTE_USER'])->first();
|
||||
if ($user) {
|
||||
\Auth::login($user, true);
|
||||
session(['current_user' => $user]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$alt_bg = '';
|
||||
if($bg_image = Setting::fetch('background_image')) {
|
||||
$alt_bg = ' style="background-image: url(/storage/'.$bg_image.')"';
|
||||
$alt_bg = ' style="background-image: url(storage/'.$bg_image.')"';
|
||||
}
|
||||
$lang = Setting::fetch('language');
|
||||
\App::setLocale($lang);
|
||||
|
||||
$allusers = User::all();
|
||||
$current_user = User::currentUser();
|
||||
@@ -117,6 +127,21 @@ class AppServiceProvider extends ServiceProvider
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate app key if missing and .env exists
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function genKey()
|
||||
{
|
||||
if(is_file(base_path('.env'))) {
|
||||
if(empty(env('APP_KEY'))) {
|
||||
Artisan::call('key:generate', array('--force' => true, '--no-interaction' => true));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Register any application services.
|
||||
*
|
||||
|
||||
131
app/Search.php
Normal file
@@ -0,0 +1,131 @@
|
||||
<?php namespace App;
|
||||
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use GuzzleHttp\Client;
|
||||
use App\Item;
|
||||
use App\Setting;
|
||||
use Form;
|
||||
use Cache;
|
||||
use Yaml;
|
||||
|
||||
abstract class Search
|
||||
{
|
||||
|
||||
/**
|
||||
* List of all search providers
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public static function providers()
|
||||
{
|
||||
$providers = self::standardProviders();
|
||||
$providers = $providers + self::appProviders();
|
||||
return collect($providers);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets details for a single provider
|
||||
*
|
||||
* @return Object
|
||||
*/
|
||||
public static function providerDetails($provider)
|
||||
{
|
||||
$providers = self::providers();
|
||||
if(!isset($providers[$provider])) return false;
|
||||
return (object)$providers[$provider] ?? false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Array of the standard providers
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public static function standardProviders()
|
||||
{
|
||||
// $providers = json_decode(file_get_contents(storage_path('app/searchproviders.json')));
|
||||
// print_r($providers);
|
||||
$providers = Yaml::parseFile(storage_path('app/searchproviders.yaml'));
|
||||
$all = [];
|
||||
foreach($providers as $key => $provider) {
|
||||
$all[$key] = $provider;
|
||||
$all[$key]['type'] = 'standard';
|
||||
}
|
||||
|
||||
return $all;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loops through users apps to see if app is a search provider, might be worth
|
||||
* looking into caching this at some point
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public static function appProviders()
|
||||
{
|
||||
$providers = [];
|
||||
$userapps = Item::all();
|
||||
foreach($userapps as $app) {
|
||||
if(empty($app->class)) continue;
|
||||
if(($provider = Item::isSearchProvider($app->class)) !== false) {
|
||||
$name = Item::nameFromClass($app->class);
|
||||
$providers[$app->id] = [
|
||||
'id' => $app->id,
|
||||
'type' => $provider->type,
|
||||
'class' => $app->class,
|
||||
'url' => $app->url,
|
||||
'name' => $app->title,
|
||||
'colour' => $app->colour,
|
||||
'icon' => $app->icon,
|
||||
'description' => $app->description
|
||||
];
|
||||
|
||||
}
|
||||
}
|
||||
return $providers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Outputs the search form
|
||||
*
|
||||
* @return html
|
||||
*/
|
||||
public static function form()
|
||||
{
|
||||
$output = '';
|
||||
$homepage_search = Setting::fetch('homepage_search');
|
||||
$search_provider = Setting::where('key', '=', 'search_provider')->first();
|
||||
$user_search_provider = Setting::fetch('search_provider');
|
||||
//die(print_r($search_provider));
|
||||
|
||||
//die(var_dump($user_search_provider));
|
||||
// return early if search isn't applicable
|
||||
if((bool)$homepage_search !== true) return $output;
|
||||
$user_search_provider = $user_search_provider ?? 'none';
|
||||
|
||||
if((bool)$homepage_search && (bool)$search_provider) {
|
||||
|
||||
if((bool)$user_search_provider) {
|
||||
$name = 'app.options.'.$user_search_provider;
|
||||
$provider = self::providerDetails($user_search_provider);
|
||||
|
||||
$output .= '<div class="searchform">';
|
||||
$output .= '<form action="'.url('search').'"'.getLinkTargetAttribute().' method="get">';
|
||||
$output .= '<div id="search-container" class="input-container">';
|
||||
$output .= '<select name="provider">';
|
||||
foreach(self::providers() as $key => $searchprovider) {
|
||||
$selected = ((string)$key === (string)$user_search_provider) ? ' selected="selected"' : '';
|
||||
$output .= '<option value="'.$key.'"'.$selected.'>'.$searchprovider['name'].'</option>';
|
||||
}
|
||||
$output .= '</select>';
|
||||
$output .= Form::text('q', null, ['class' => 'homesearch', 'autofocus' => 'autofocus', 'placeholder' => __('app.settings.search').'...']);
|
||||
$output .= '<button type="submit">'.ucwords(__('app.settings.search')).'</button>';
|
||||
$output .= '</div>';
|
||||
$output .= '</form>';
|
||||
$output .= '</div>';
|
||||
}
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
10
app/SearchInterface.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php namespace App;
|
||||
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use GuzzleHttp\Client;
|
||||
|
||||
interface SearchInterface
|
||||
{
|
||||
public function getResults($query, $providerdetails);
|
||||
|
||||
}
|
||||
@@ -7,6 +7,8 @@ use Illuminate\Support\Facades\Input;
|
||||
use Form;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use App\User;
|
||||
use App\Search;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class Setting extends Model
|
||||
{
|
||||
@@ -38,11 +40,11 @@ class Setting extends Model
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public static function getInput()
|
||||
public static function getInput(Request $request)
|
||||
{
|
||||
return (object) [
|
||||
'value' => Input::get('value'),
|
||||
'image' => Input::file('value'),
|
||||
'value' => $request->input('value'),
|
||||
'image' => $request->file('value'),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -72,6 +74,9 @@ class Setting extends Model
|
||||
case 'select':
|
||||
if(!empty($this->value) && $this->value !== 'none') {
|
||||
$options = (array)json_decode($this->options);
|
||||
if($this->key === 'search_provider') {
|
||||
$options = Search::providers()->pluck('name', 'id')->toArray();
|
||||
}
|
||||
$value = __($options[$this->value]);
|
||||
} else {
|
||||
$value = __('app.options.none');
|
||||
@@ -120,11 +125,25 @@ class Setting extends Model
|
||||
break;
|
||||
case 'select':
|
||||
$options = json_decode($this->options);
|
||||
if($this->key === 'search_provider') {
|
||||
$options = Search::providers()->pluck('name', 'id');
|
||||
}
|
||||
foreach($options as $key => $opt) {
|
||||
$options->$key = __($opt);
|
||||
}
|
||||
$value = Form::select('value', $options, null, ['class' => 'form-control']);
|
||||
break;
|
||||
case 'textarea':
|
||||
$value = Form::textarea('value', null, ['class' => 'form-control', 'cols' => '44', 'rows' => '15', 'style' => 'width: 100%;']);
|
||||
break;
|
||||
case 'apikey':
|
||||
if (isset($this->value) && !empty($this->value)) {
|
||||
$value = Form::text('value', null, ['class' => 'form-control']);
|
||||
} else {
|
||||
$value = '<div>'.$current.'</div>';
|
||||
}
|
||||
$value .= '<small style="margin-top: 10px; display: block">'.__('app.settings.click_generate').'</small>';
|
||||
break;
|
||||
default:
|
||||
$value = Form::text('value', null, ['class' => 'form-control']);
|
||||
break;
|
||||
@@ -216,59 +235,6 @@ class Setting extends Model
|
||||
return array_key_exists($key, Setting::$cache);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return html
|
||||
*/
|
||||
public static function search()
|
||||
{
|
||||
$output = '';
|
||||
$homepage_search = self::fetch('homepage_search');
|
||||
$search_provider = self::where('key', '=', 'search_provider')->first();
|
||||
$user_search_provider = self::fetch('search_provider');
|
||||
//die(print_r($search_provider));
|
||||
|
||||
//die(var_dump($user_search_provider));
|
||||
// return early if search isn't applicable
|
||||
if((bool)$homepage_search !== true) return $output;
|
||||
if($user_search_provider === 'none') return $output;
|
||||
if(empty($user_search_provider)) return $output;
|
||||
if(is_null($user_search_provider)) return $output;
|
||||
|
||||
|
||||
if((bool)$homepage_search && (bool)$search_provider) {
|
||||
|
||||
$options = (array)json_decode($search_provider->options);
|
||||
$name = $options[$user_search_provider];
|
||||
if((bool)$user_search_provider) {
|
||||
switch($user_search_provider) {
|
||||
case 'google':
|
||||
$url = 'https://www.google.com/search';
|
||||
$var = 'q';
|
||||
break;
|
||||
case 'ddg':
|
||||
$url = 'https://duckduckgo.com/';
|
||||
$var = 'q';
|
||||
break;
|
||||
case 'bing':
|
||||
$url = 'https://www.bing.com/search';
|
||||
$var = 'q';
|
||||
break;
|
||||
case 'startpage':
|
||||
$url = 'https://www.startpage.com/';
|
||||
$var = 'q';
|
||||
}
|
||||
$output .= '<div class="searchform">';
|
||||
$output .= Form::open(['url' => $url, 'method' => 'get']);
|
||||
$output .= '<div class="input-container">';
|
||||
$output .= Form::text($var, null, ['class' => 'homesearch', 'autofocus' => 'autofocus', 'placeholder' => __($name).' '.__('app.settings.search').'...']);
|
||||
$output .= '<button type="submit">'.ucwords(__('app.settings.search')).'</button>';
|
||||
$output .= '</div>';
|
||||
$output .= Form::close();
|
||||
$output .= '</div>';
|
||||
}
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* The users that belong to the setting.
|
||||
|
||||
@@ -107,7 +107,8 @@ abstract class SupportedApps
|
||||
|
||||
public static function getList()
|
||||
{
|
||||
$list_url = 'https://apps.heimdall.site/list';
|
||||
// $list_url = 'https://apps.heimdall.site/list';
|
||||
$list_url = config('app.appsource').'list.json';
|
||||
$client = new Client(['http_errors' => false, 'timeout' => 15, 'connect_timeout' => 15]);
|
||||
return $client->request('GET', $list_url);
|
||||
}
|
||||
@@ -121,7 +122,8 @@ abstract class SupportedApps
|
||||
|
||||
public static function getFiles($app)
|
||||
{
|
||||
$zipurl = $app->files;
|
||||
$zipurl = config('app.appsource').'files/'.$app->sha.'.zip';
|
||||
|
||||
$client = new Client(['http_errors' => false, 'timeout' => 60, 'connect_timeout' => 15]);
|
||||
$res = $client->request('GET', $zipurl);
|
||||
|
||||
@@ -138,35 +140,28 @@ abstract class SupportedApps
|
||||
$zip->extractTo(app_path('SupportedApps')); // place in the directory with same name
|
||||
$zip->close();
|
||||
unlink($src); //Deleting the Zipped file
|
||||
} else {
|
||||
var_dump($x);
|
||||
}
|
||||
}
|
||||
|
||||
public static function saveApp($details, $app)
|
||||
{
|
||||
if(!file_exists(storage_path('app/public/icons'))) {
|
||||
mkdir(storage_path('app/public/icons'), 0777, true);
|
||||
}
|
||||
|
||||
$img_src = app_path('SupportedApps/'.className($details->name).'/'.$details->icon);
|
||||
$img_dest = storage_path('app/public/icons/'.$details->icon);
|
||||
//die("i: ".$img_src);
|
||||
@copy($img_src, $img_dest);
|
||||
|
||||
{
|
||||
$app->appid = $details->appid;
|
||||
$app->name = $details->name;
|
||||
$app->sha = $details->sha ?? null;
|
||||
$app->icon = 'icons/'.$details->icon;
|
||||
$app->website = $details->website;
|
||||
$app->license = $details->license;
|
||||
$app->description = $details->description;
|
||||
|
||||
$appclass = $app->class();
|
||||
$application = new $appclass;
|
||||
$enhanced = (bool)($application instanceof \App\EnhancedApps);
|
||||
|
||||
$app->class = $appclass;
|
||||
$app->enhanced = $enhanced;
|
||||
$app->tile_background = $details->tile_background;
|
||||
$app->save();
|
||||
return $app;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
<?php namespace App\SupportedApps\Ghost;
|
||||
|
||||
class Ghost extends \App\SupportedApps {
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"appid": "c4745785181de931cfd5bd79294cb1687d82aea9",
|
||||
"name": "Ghost",
|
||||
"website": "https://github.com/tryghost/ghost",
|
||||
"license": "MIT License",
|
||||
"description": "Fiercely independent, professional publishing. A fully open source, powerful platform for building and running modern publications, we power serious blogs, magazines and journalism from DuckDuckGo to OpenAI & Sky News.",
|
||||
"enhanced": false,
|
||||
"tile_background": "light",
|
||||
"icon": "ghost.png"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 3.0 KiB |
@@ -1,5 +0,0 @@
|
||||
<?php namespace App\SupportedApps\MailcowSOGo;
|
||||
|
||||
class MailcowSOGo extends \App\SupportedApps {
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"appid": "1ec48781d2c87a9e6dc9ee99e5eff0ab5958df09",
|
||||
"name": "Mailcow - SOGo",
|
||||
"website": "https://sogo.nu/",
|
||||
"license": "GNU GPL/LGPL v2 and above",
|
||||
"description": "SOGo is a fully supported and trusted groupware server with a focus on scalability and open standards.\r\n\r\nPart of the Mailcow stack.",
|
||||
"enhanced": false,
|
||||
"tile_background": "dark",
|
||||
"icon": "mailcowsogo.svg"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 10 KiB |
@@ -1,5 +0,0 @@
|
||||
<?php namespace App\SupportedApps\Mattermost;
|
||||
|
||||
class Mattermost extends \App\SupportedApps {
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"appid": "b3e1424fb69ca08481b03ad9d81e95488421997f",
|
||||
"name": "Mattermost",
|
||||
"website": "https://mattermost.com/",
|
||||
"license": "MIT License",
|
||||
"description": "Mattermost provides high trust collaboration and messaging solutions through an open source, community-powered approach. Enjoy all the productivity benefits of workplace messaging across web, mobile and PC, with unlimited archiving, search and integrations within IT-controlled private environments in public clouds, including AWS and Azure, as well as on-premise in private clouds and virtual or physical servers.",
|
||||
"enhanced": false,
|
||||
"tile_background": "light",
|
||||
"icon": "mattermost.png"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 25 KiB |
@@ -1,5 +0,0 @@
|
||||
<?php namespace App\SupportedApps\MayanEDMS;
|
||||
|
||||
class MayanEDMS extends \App\SupportedApps {
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"appid": "6b9e062ff02ea610df64e9b0eca1c973faf1b51d",
|
||||
"name": "Mayan EDMS",
|
||||
"website": "https://github.com/tryghost/ghost",
|
||||
"license": "Apache License 2.0",
|
||||
"description": "Mayan EDMS is an open-source document management system. Its main purpose is to store, introspect, and categorize files, with a strong emphasis on preserving the contextual and business information of documents. It can also OCR, preview, label, sign, send, and receive thoses files. Other features of interest are its workflow system, role based access control, and REST API.",
|
||||
"enhanced": false,
|
||||
"tile_background": "light",
|
||||
"icon": "mayanedms.png"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 2.9 KiB |
@@ -1,45 +0,0 @@
|
||||
<?php namespace App\SupportedApps\Nzbget;
|
||||
|
||||
class Nzbget extends \App\SupportedApps implements \App\EnhancedApps {
|
||||
|
||||
public $config;
|
||||
|
||||
public function test()
|
||||
{
|
||||
$test = parent::appTest($this->url('status'));
|
||||
echo $test->status;
|
||||
}
|
||||
|
||||
public function livestats()
|
||||
{
|
||||
$status = 'inactive';
|
||||
$res = parent::execute($this->url('status'));
|
||||
$details = json_decode($res->getBody());
|
||||
|
||||
$data = [];
|
||||
|
||||
if($details) {
|
||||
$size = $details->result->RemainingSizeMB;
|
||||
$rate = $details->result->DownloadRate;
|
||||
$data['queue_size'] = format_bytes($size*1000*1000, false, ' <span>', '</span>');
|
||||
$data['current_speed'] = format_bytes($rate, false, ' <span>');
|
||||
$status = ($size > 0 || $rate > 0) ? 'active' : 'inactive';
|
||||
}
|
||||
|
||||
return parent::getLiveStats($status, $data);
|
||||
|
||||
}
|
||||
|
||||
public function url($endpoint)
|
||||
{
|
||||
$api_url = parent::normaliseurl($this->config->url);
|
||||
$username = $this->config->username;
|
||||
$password = $this->config->password;
|
||||
$rebuild_url = str_replace('http://', 'http://'.$username.':'.$password.'@', $api_url);
|
||||
$rebuild_url = str_replace('https://', 'https://'.$username.':'.$password.'@', $rebuild_url);
|
||||
$rebuild_url = rtrim($rebuild_url, '/');
|
||||
|
||||
$api_url = $rebuild_url.'/jsonrpc/'.$endpoint;
|
||||
return $api_url;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
<?php namespace App\SupportedApps\Privatebin;
|
||||
|
||||
class Privatebin extends \App\SupportedApps {
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"appid": "87ecbead58e42b5ab9e1a92ccc0b42075f4fba91",
|
||||
"name": "Privatebin",
|
||||
"website": "https://privatebin.info/",
|
||||
"license": "zlib/libpng License with Acknowledgement",
|
||||
"description": "PrivateBin is a minimalist, open source online pastebin where the server has zero knowledge of pasted data.\r\n\r\nData is encrypted and decrypted in the browser using 256bit AES in Galois Counter mode.",
|
||||
"enhanced": false,
|
||||
"tile_background": "light",
|
||||
"icon": "privatebin.png"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 13 KiB |
@@ -1,5 +0,0 @@
|
||||
<?php namespace App\SupportedApps\Rspamd;
|
||||
|
||||
class Rspamd extends \App\SupportedApps {
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"appid": "5876529d5d47f91c435d9230576044bc4cad8547",
|
||||
"name": "Rspamd",
|
||||
"website": "https://rspamd.com/",
|
||||
"license": "Apache 2.0",
|
||||
"description": "Fast, free and open-source spam filtering system.",
|
||||
"enhanced": false,
|
||||
"tile_background": "dark",
|
||||
"icon": "rspamd.png"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 15 KiB |
@@ -1,5 +0,0 @@
|
||||
<?php namespace App\SupportedApps\SOGo;
|
||||
|
||||
class SOGo extends \App\SupportedApps {
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"appid": "d143b3a76b72591495655c5257c7523456bdd736",
|
||||
"name": "SOGo",
|
||||
"website": "https://sogo.nu/",
|
||||
"license": "GNU GPL/LGPL v2 and above",
|
||||
"description": "SOGo is a fully supported and trusted groupware server with a focus on scalability and open standards.",
|
||||
"enhanced": false,
|
||||
"tile_background": "light",
|
||||
"icon": "sogo.svg"
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="792px" height="464px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<path d="M643.711,144.938C633.849,144.938 626.847,137.721 626.847,128.035C626.847,118.341 633.849,111.123 643.711,111.123C653.65,111.123 660.652,118.341 660.652,128.035C660.652,137.721 653.65,144.938 643.711,144.938ZM643.681,94.5835C624.154,94.5835 610.288,108.861 610.288,128.035C610.288,147.2 624.154,161.478 643.681,161.478C663.335,161.478 677.202,147.2 677.202,128.035C677.202,108.861 663.335,94.5835 643.681,94.5835ZM643.652,178.811C614.019,178.811 592.965,157.13 592.965,128.035C592.965,98.9315 614.019,77.2602 643.652,77.2602C673.48,77.2602 694.525,98.9315 694.525,128.035C694.525,157.13 673.48,178.811 643.652,178.811ZM643.613,58.4876C603.032,58.4876 574.212,88.1791 574.212,128.035C574.212,167.882 603.032,197.564 643.613,197.564C684.458,197.564 713.288,167.882 713.288,128.035C713.288,88.1791 684.458,58.4876 643.613,58.4876ZM157.492,182.836L136.653,177.871C117.684,173.513 108.048,168.538 108.048,154.858C108.048,139.307 123.903,133.079 138.21,133.079C152.752,133.079 163.377,140.345 169.635,151.656C169.654,151.704 169.684,151.753 169.723,151.812C169.85,152.057 169.997,152.292 170.124,152.537L170.154,152.517C172.122,155.494 175.432,157.482 178.997,157.482C185.068,157.482 189.465,153.095 189.465,147.024C189.465,144.703 188.966,142.245 187.879,140.394C177.205,122.248 159.607,114.424 139.454,114.424C112.093,114.424 85.6524,128.104 85.6524,158.266C85.6524,185.95 113.023,194.038 122.972,196.516L142.871,201.187C158.109,204.918 170.546,209.903 170.546,224.504C170.546,241.298 153.134,248.77 136.34,248.77C119.241,248.77 106.579,240.025 97.8541,227.118L97.8443,227.118C95.9054,224.288 92.899,222.3 89.2169,222.3C83.2826,222.3 78.5037,227.177 78.7191,233.102C78.8171,235.52 79.6201,237.567 80.854,239.32C94.5246,259.777 114.296,267.425 136.34,267.425C164.641,267.425 192.942,254.362 192.942,222.643C192.942,202.127 177.704,187.507 157.492,182.836ZM296.617,248.682C263.038,248.682 241.886,223.495 241.886,190.846C241.886,158.187 263.038,133 296.617,133C330.52,133 351.662,158.187 351.662,190.846C351.662,223.495 330.52,248.682 296.617,248.682ZM296.617,114.345C251.531,114.345 219.499,146.994 219.499,190.846C219.499,234.688 251.531,267.337 296.617,267.337C342.016,267.337 374.048,234.688 374.048,190.846C374.048,146.994 342.016,114.345 296.617,114.345ZM514.985,232.818C514.221,233.552 513.448,234.277 512.606,234.972C511.509,235.981 510.236,237.068 508.786,238.155C500.032,244.491 488.976,248.163 476.049,248.163C442.46,248.163 421.318,222.976 421.318,190.327C421.318,157.668 442.46,132.481 476.049,132.481C509.942,132.481 531.084,157.668 531.084,190.327C531.084,207.376 525.316,222.369 514.985,232.818ZM464.797,315.733C467.304,315.733 469.899,315.566 472.592,315.233C477.567,314.607 482.101,314.332 486.204,314.332C505.281,314.44 514.995,319.983 520.851,326.387C526.697,332.831 528.95,341.566 528.94,348.989C528.95,352.544 528.391,355.726 527.774,357.636C524.856,366.488 518.961,372.511 509.932,377.045C500.972,381.491 489.015,383.763 476.51,383.743C472.034,383.743 467.481,383.459 462.986,382.921C454.486,381.941 443.244,378.289 435.096,371.923C430.993,368.751 427.614,364.99 425.235,360.534C422.875,356.059 421.406,350.869 421.396,344.23L421.396,343.495C421.651,331.254 427.272,323.126 433.431,317.221C436.477,314.342 439.611,312.198 441.892,310.836C442.255,310.621 442.597,310.425 442.911,310.249C448.953,313.823 456.454,315.762 464.797,315.733ZM476.049,113.826C430.964,113.826 398.922,146.475 398.922,190.327C398.922,219.96 413.562,244.461 436.976,257.241C436.663,257.554 436.359,257.877 436.066,258.2C430.014,264.83 426.919,273.32 426.909,281.909C426.9,285.698 427.526,289.586 428.868,293.307C425.832,295.246 422.209,297.9 418.497,301.386C409.547,309.72 399.921,323.733 399.637,343.123C399.627,343.573 399.627,343.946 399.627,344.23C399.617,354.218 401.987,363.227 406.031,370.778C412.113,382.147 421.582,390.059 431.355,395.338C441.187,400.626 451.44,403.436 460.381,404.533C465.708,405.17 471.114,405.512 476.51,405.512C491.532,405.493 506.514,402.957 519.549,396.572C532.524,390.285 543.678,379.464 548.496,364.285C549.926,359.771 550.689,354.649 550.709,348.989C550.689,337.492 547.389,323.449 537.058,311.855C526.727,300.221 509.638,292.455 486.204,292.563C481.112,292.563 475.687,292.916 469.919,293.63C468.058,293.856 466.354,293.963 464.797,293.963C457.619,293.915 454.016,291.927 451.871,289.899C449.756,287.833 448.698,285.101 448.669,281.909C448.659,278.657 449.942,275.24 452.106,272.909C454.319,270.598 457.071,269.031 461.869,268.972C462.3,268.972 462.761,268.982 463.231,269.021C466.306,269.237 469.292,269.345 472.191,269.345C496.173,269.393 514.212,261.961 526.482,251.737C538.791,241.514 545.294,229.077 548.369,219.255L548.329,219.245C551.669,210.422 553.48,200.688 553.48,190.327C553.48,146.475 521.448,113.826 476.049,113.826Z" style="fill:rgb(80,189,55);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 5.2 KiB |
@@ -1,5 +0,0 @@
|
||||
<?php namespace App\SupportedApps\Snibox;
|
||||
|
||||
class Snibox extends \App\SupportedApps {
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"appid": "6c050d5bdf522fa20599560ff0f6b74e7dcd97a8",
|
||||
"name": "Snibox",
|
||||
"website": "https://github.com/snibox/snibox",
|
||||
"license": "MIT License",
|
||||
"description": "Snibox is a self-hosted, single-user (for now) snippet manager. Developed to collect and organize code snippets. Supports various programming languages, markdown, plain text.",
|
||||
"enhanced": false,
|
||||
"tile_background": "dark",
|
||||
"icon": "snibox.png"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 8.6 KiB |
@@ -5,14 +5,15 @@
|
||||
"license": "MIT",
|
||||
"type": "project",
|
||||
"require": {
|
||||
"php": ">=7.0.0",
|
||||
"php": ">=7.2.5",
|
||||
"fideloper/proxy": "^4.0",
|
||||
"graham-campbell/github": "^7.5",
|
||||
"guzzlehttp/guzzle": "^6.3",
|
||||
"laravel/framework": "5.7.*",
|
||||
"laravel/tinker": "~1.0",
|
||||
"laravelcollective/html": "^5.5",
|
||||
"php-http/guzzle6-adapter": "^1.1"
|
||||
"graham-campbell/github": "^10.5",
|
||||
"guzzlehttp/guzzle": "^7.4",
|
||||
"laravel/framework": "^7.0",
|
||||
"laravel/tinker": "^2.0",
|
||||
"laravel/ui": "^2.4",
|
||||
"laravelcollective/html": "^6.0",
|
||||
"symfony/yaml": "^5.4"
|
||||
},
|
||||
"require-dev": {
|
||||
"filp/whoops": "~2.0",
|
||||
@@ -59,6 +60,10 @@
|
||||
"config": {
|
||||
"preferred-install": "dist",
|
||||
"sort-packages": true,
|
||||
"optimize-autoloader": true
|
||||
"optimize-autoloader": true,
|
||||
"allow-plugins": {
|
||||
"kylekatarnls/update-helper": true,
|
||||
"symfony/thanks": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
5424
composer.lock
generated
@@ -14,7 +14,7 @@ return [
|
||||
*/
|
||||
|
||||
'name' => env('APP_NAME', 'Heimdall'),
|
||||
'version' => '2.1.11',
|
||||
'version' => '2.5.0-beta1',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
@@ -54,6 +54,8 @@ return [
|
||||
*/
|
||||
|
||||
'url' => env('APP_URL', 'http://localhost'),
|
||||
'appsource' => env('APP_SOURCE', 'https://appslist.heimdall.site/'),
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
@@ -228,6 +230,7 @@ return [
|
||||
'URL' => Illuminate\Support\Facades\URL::class,
|
||||
'Validator' => Illuminate\Support\Facades\Validator::class,
|
||||
'View' => Illuminate\Support\Facades\View::class,
|
||||
'Yaml' => Symfony\Component\Yaml\Yaml::class,
|
||||
|
||||
'SupportedApps' => App\SupportedApps::class,
|
||||
'EnhancedApps' => App\EnhancedApps::class,
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
@@ -107,13 +109,27 @@ return [
|
||||
|
||||
'redis' => [
|
||||
|
||||
'client' => 'predis',
|
||||
'client' => env('REDIS_CLIENT', 'phpredis'),
|
||||
|
||||
'options' => [
|
||||
'cluster' => env('REDIS_CLUSTER', 'redis'),
|
||||
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
|
||||
],
|
||||
|
||||
'default' => [
|
||||
'url' => env('REDIS_URL'),
|
||||
'host' => env('REDIS_HOST', '127.0.0.1'),
|
||||
'password' => env('REDIS_PASSWORD', null),
|
||||
'port' => env('REDIS_PORT', 6379),
|
||||
'database' => 0,
|
||||
'port' => env('REDIS_PORT', '6379'),
|
||||
'database' => env('REDIS_DB', '0'),
|
||||
],
|
||||
|
||||
'cache' => [
|
||||
'url' => env('REDIS_URL'),
|
||||
'host' => env('REDIS_HOST', '127.0.0.1'),
|
||||
'password' => env('REDIS_PASSWORD', null),
|
||||
'port' => env('REDIS_PORT', '6379'),
|
||||
'database' => env('REDIS_CACHE_DB', '1'),
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
104
config/logging.php
Normal file
@@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
use Monolog\Handler\NullHandler;
|
||||
use Monolog\Handler\StreamHandler;
|
||||
use Monolog\Handler\SyslogUdpHandler;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Log Channel
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option defines the default log channel that gets used when writing
|
||||
| messages to the logs. The name specified in this option should match
|
||||
| one of the channels defined in the "channels" configuration array.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('LOG_CHANNEL', 'stack'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Log Channels
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may configure the log channels for your application. Out of
|
||||
| the box, Laravel uses the Monolog PHP logging library. This gives
|
||||
| you a variety of powerful log handlers / formatters to utilize.
|
||||
|
|
||||
| Available Drivers: "single", "daily", "slack", "syslog",
|
||||
| "errorlog", "monolog",
|
||||
| "custom", "stack"
|
||||
|
|
||||
*/
|
||||
|
||||
'channels' => [
|
||||
'stack' => [
|
||||
'driver' => 'stack',
|
||||
'channels' => ['single'],
|
||||
'ignore_exceptions' => false,
|
||||
],
|
||||
|
||||
'single' => [
|
||||
'driver' => 'single',
|
||||
'path' => storage_path('logs/laravel.log'),
|
||||
'level' => 'debug',
|
||||
],
|
||||
|
||||
'daily' => [
|
||||
'driver' => 'daily',
|
||||
'path' => storage_path('logs/laravel.log'),
|
||||
'level' => 'debug',
|
||||
'days' => 14,
|
||||
],
|
||||
|
||||
'slack' => [
|
||||
'driver' => 'slack',
|
||||
'url' => env('LOG_SLACK_WEBHOOK_URL'),
|
||||
'username' => 'Laravel Log',
|
||||
'emoji' => ':boom:',
|
||||
'level' => 'critical',
|
||||
],
|
||||
|
||||
'papertrail' => [
|
||||
'driver' => 'monolog',
|
||||
'level' => 'debug',
|
||||
'handler' => SyslogUdpHandler::class,
|
||||
'handler_with' => [
|
||||
'host' => env('PAPERTRAIL_URL'),
|
||||
'port' => env('PAPERTRAIL_PORT'),
|
||||
],
|
||||
],
|
||||
|
||||
'stderr' => [
|
||||
'driver' => 'monolog',
|
||||
'handler' => StreamHandler::class,
|
||||
'formatter' => env('LOG_STDERR_FORMATTER'),
|
||||
'with' => [
|
||||
'stream' => 'php://stderr',
|
||||
],
|
||||
],
|
||||
|
||||
'syslog' => [
|
||||
'driver' => 'syslog',
|
||||
'level' => 'debug',
|
||||
],
|
||||
|
||||
'errorlog' => [
|
||||
'driver' => 'errorlog',
|
||||
'level' => 'debug',
|
||||
],
|
||||
|
||||
'null' => [
|
||||
'driver' => 'monolog',
|
||||
'handler' => NullHandler::class,
|
||||
],
|
||||
|
||||
'emergency' => [
|
||||
'path' => storage_path('logs/laravel.log'),
|
||||
],
|
||||
],
|
||||
|
||||
];
|
||||
@@ -164,7 +164,7 @@ return [
|
||||
|
|
||||
*/
|
||||
|
||||
'secure' => env('SESSION_SECURE_COOKIE', false),
|
||||
'secure' => env('SESSION_SECURE_COOKIE', null),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
||||
32
database/migrations/2022_03_15_140911_add_appid_to_items.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddAppidToItems extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('items', function (Blueprint $table) {
|
||||
$table->string('appid')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('items', function (Blueprint $table) {
|
||||
$table->dropColumn(['appid']);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddClassToApplication extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('applications', function (Blueprint $table) {
|
||||
$table->string('class')->nullable()->index();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('applications', function (Blueprint $table) {
|
||||
$table->dropColumn(['class']);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddAppDescriptionToItems extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('items', function (Blueprint $table) {
|
||||
$table->text('appdescription')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('items', function (Blueprint $table) {
|
||||
//
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -44,6 +44,16 @@ class SettingsSeeder extends Seeder
|
||||
$setting_group->title = 'app.settings.miscellaneous';
|
||||
$setting_group->save();
|
||||
}
|
||||
if(!$setting_group = SettingGroup::find(4)) {
|
||||
$setting_group = new SettingGroup;
|
||||
$setting_group->id = 4;
|
||||
$setting_group->title = 'app.settings.advanced';
|
||||
$setting_group->order = 3;
|
||||
$setting_group->save();
|
||||
} else {
|
||||
$setting_group->title = 'app.settings.advanced';
|
||||
$setting_group->save();
|
||||
}
|
||||
|
||||
if($version = Setting::find(1)) {
|
||||
$version->label = 'app.settings.version';
|
||||
@@ -90,12 +100,13 @@ class SettingsSeeder extends Seeder
|
||||
'none' => 'app.options.none',
|
||||
'google' => 'app.options.google',
|
||||
'ddg' => 'app.options.ddg',
|
||||
'qwant' => 'app.options.qwant',
|
||||
'bing' => 'app.options.bing',
|
||||
'startpage' => 'app.options.startpage',
|
||||
]);
|
||||
|
||||
if(!$setting = Setting::find(4)) {
|
||||
|
||||
|
||||
$setting = new Setting;
|
||||
$setting->id = 4;
|
||||
$setting->group_id = 3;
|
||||
@@ -116,9 +127,10 @@ class SettingsSeeder extends Seeder
|
||||
'en' => 'English',
|
||||
'fi' => 'Suomi (Finnish)',
|
||||
'fr' => 'Français (French)',
|
||||
'el' => 'Ελληνικά (Greek)',
|
||||
'it' => 'Italiano (Italian)',
|
||||
'no' => 'Norsk (Norwegian)',
|
||||
'pl' => 'Polski (Polish)',
|
||||
'no' => 'Norsk (Norwegian)',
|
||||
'pl' => 'Polski (Polish)',
|
||||
'sv' => 'Svenska (Swedish)',
|
||||
'es' => 'Español (Spanish)',
|
||||
'tr' => 'Türkçe (Turkish)',
|
||||
@@ -145,7 +157,7 @@ class SettingsSeeder extends Seeder
|
||||
]);
|
||||
|
||||
if(!$setting = Setting::find(7)) {
|
||||
|
||||
|
||||
$setting = new Setting;
|
||||
$setting->id = 7;
|
||||
$setting->group_id = 3;
|
||||
@@ -192,6 +204,71 @@ class SettingsSeeder extends Seeder
|
||||
$setting->system = true;
|
||||
$setting->save();
|
||||
}
|
||||
|
||||
if(!$setting = Setting::find(10)) {
|
||||
$setting = new Setting;
|
||||
$setting->id = 10;
|
||||
$setting->group_id = 4;
|
||||
$setting->key = 'custom_css';
|
||||
$setting->type = 'textarea';
|
||||
$setting->label = 'app.settings.custom_css';
|
||||
$setting->value = '';
|
||||
$setting->save();
|
||||
} else {
|
||||
$setting->type = 'textarea';
|
||||
$setting->group_id = 4;
|
||||
$setting->label = 'app.settings.custom_css';
|
||||
$setting->save();
|
||||
}
|
||||
|
||||
if(!$setting = Setting::find(11)) {
|
||||
$setting = new Setting;
|
||||
$setting->id = 11;
|
||||
$setting->group_id = 4;
|
||||
$setting->key = 'custom_js';
|
||||
$setting->type = 'textarea';
|
||||
$setting->label = 'app.settings.custom_js';
|
||||
$setting->value = '';
|
||||
$setting->save();
|
||||
} else {
|
||||
$setting->type = 'textarea';
|
||||
$setting->group_id = 4;
|
||||
$setting->label = 'app.settings.custom_js';
|
||||
$setting->save();
|
||||
}
|
||||
|
||||
if(!$setting = Setting::find(12)) {
|
||||
$setting = new Setting;
|
||||
$setting->id = 12;
|
||||
$setting->group_id = 1;
|
||||
$setting->key = 'api_key';
|
||||
$setting->type = 'apikey';
|
||||
$setting->label = 'app.settings.apikey';
|
||||
$setting->value = '';
|
||||
$setting->save();
|
||||
} else {
|
||||
$setting->type = 'apikey';
|
||||
$setting->group_id = 1;
|
||||
$setting->label = 'app.settings.apikey';
|
||||
$setting->save();
|
||||
}
|
||||
|
||||
if(!$home_tag = \App\Item::find(0)) {
|
||||
$home_tag = new \App\Item;
|
||||
$home_tag->id = 0;
|
||||
$home_tag->title = 'app.dashboard';
|
||||
$home_tag->pinned = 0;
|
||||
$home_tag->url = '';
|
||||
$home_tag->type = 1;
|
||||
$home_tag->user_id = 0;
|
||||
$home_tag->save();
|
||||
|
||||
$homeapps = \App\Item::withoutGlobalScope('user_id')->doesntHave('parents')->get();
|
||||
foreach($homeapps as $app) {
|
||||
if($app->id === 0) continue;
|
||||
$app->parents()->attach(0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
9975
package-lock.json
generated
10
package.json
@@ -10,12 +10,14 @@
|
||||
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"bootstrap-sass": "^3.3.7",
|
||||
"bootstrap-sass": "^3.4.1",
|
||||
"cross-env": "^5.2.0",
|
||||
"jquery": "^3.2",
|
||||
"laravel-mix": "^2.1.14"
|
||||
"jquery": "^3.4.1",
|
||||
"laravel-mix": "^4.0.16",
|
||||
"sass": "^1.21.0",
|
||||
"sass-loader": "7.*"
|
||||
},
|
||||
"dependencies": {
|
||||
"select2": "^4.0.6-rc.1"
|
||||
"select2": "^4.0.7"
|
||||
}
|
||||
}
|
||||
|
||||
5
public/css/all.min.css
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
/*!
|
||||
* Font Awesome Pro 5.15.4 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license (Commercial License)
|
||||
*/
|
||||
.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-ban:before{content:"\f05e"}.fa-check:before{content:"\f00c"}.fa-cloud-download:before{content:"\f0ed"}.fa-cogs:before{content:"\f085"}.fa-edit:before{content:"\f044"}.fa-exchange:before{content:"\f0ec"}.fa-list:before{content:"\f03a"}.fa-pencil:before{content:"\f040"}.fa-plus:before{content:"\f067"}.fa-save:before{content:"\f0c7"}.fa-tag:before{content:"\f02b"}.fa-th:before{content:"\f00a"}.fa-thumbtack:before{content:"\f08d"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-user:before{content:"\f007"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Pro";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Pro";font-weight:900}
|
||||
4766
public/css/app.css
vendored
843
public/js/app.js
vendored
2482
public/js/fontawesome.js
vendored
Normal file
2
public/js/jquery-3.3.1.min.js
vendored
2
public/js/jquery-3.6.0.min.js
vendored
Normal file
2
public/manifest.json
generated
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "App",
|
||||
"name": "Heimdall",
|
||||
"icons": [
|
||||
{
|
||||
"src": "\/android-icon-36x36.png",
|
||||
|
||||
4
public/mix-manifest.json
generated
@@ -1,4 +1,4 @@
|
||||
{
|
||||
"/js/app.js": "/js/app.js?id=8dc4a6ea723d0df7469d",
|
||||
"/css/app.css": "/css/app.css?id=476a34b0b53427a036fd"
|
||||
"/css/app.css": "/css/app.css?id=ad45b1705b7f7906db0b",
|
||||
"/js/app.js": "/js/app.js?id=5446aeb4aa754e641c77"
|
||||
}
|
||||
|
||||
33
readme.md
@@ -34,16 +34,36 @@ Supported applications are recognized by the title of the application as entered
|
||||
[](https://apps.heimdall.site/applications/foundation)
|
||||
|
||||
## Installing
|
||||
Apart from the Laravel dependencies, namely PHP >= 7.1.3, OpenSSL PHP Extension, PDO PHP Extension, Mbstring PHP Extension, Tokenizer PHP Extension, XML PHP Extension, Ctype PHP Extension and JSON PHP Extension, the only other thing Heimdall needs is sqlite support and zip support (php-zip).
|
||||
Apart from the Laravel dependencies, namely PHP >= 7.2.5, BCMath PHP Extension, Ctype PHP Extension, Fileinfo PHP extension, JSON PHP Extension, Mbstring PHP Extension, OpenSSL PHP Extension, PDO PHP Extension, Tokenizer PHP Extension, XML PHP Extension, the only other thing Heimdall needs is sqlite support and zip support (php-zip).
|
||||
|
||||
If you find you can't change the background make sure `php_fileinfo` is enabled in your php.ini. I believe it should be by default, but one user came across the issue on a windows system.
|
||||
|
||||
Installation is as simple as cloning the repository somewhere, or downloading and extracting the zip/tar and pointing your httpd document root to the `/public` folder. For simple testing you could just go to the folder and type `php artisan serve`
|
||||
Installation is as simple as cloning the repository somewhere, or downloading and extracting the zip/tar and pointing your httpd document root to the `/public` folder then creating the .env file and generating an encryption key (this is all taken care of for you with the docker).
|
||||
|
||||
```
|
||||
cd /path/to/heimdall
|
||||
cp .env.example .env
|
||||
php artisan key:generate
|
||||
```
|
||||
|
||||
For simple testing you could just go to the folder and type `php artisan serve`
|
||||
|
||||
There is also a multi-arch Docker which supports x86-64, armhf and arm64, instructions on how to use them at
|
||||
|
||||
- https://hub.docker.com/r/linuxserver/heimdall/
|
||||
|
||||
## Updating
|
||||
To update your instance, simply clone this repository or download the zip/tar file with the new version and copy it over the old installation.
|
||||
|
||||
## Search Providers
|
||||
v2.3.0 added the ability for users to customise the search options.
|
||||
|
||||
Options are stored in `/storage/app/searchproviders.yaml` (`/config/www/searchproviders.yaml` on docker installs), feel free to rearrange the options, add new ones, delete ones you don't use, etc.
|
||||
|
||||
Consider contributing to https://github.com/linuxserver/Heimdall/discussions/categories/search-providers to help others add new ones.
|
||||
|
||||
The item at the top of the list `Tiles` allows you to search for apps on your dashboard by name, helpful when you have lots of icons.
|
||||
|
||||
## New background image not being set
|
||||
If you are using the docker image or a default php install you may find images over 2MB wont get set as the background image, you just need to change the `upload_max_filesize` in the php.ini.
|
||||
|
||||
@@ -70,12 +90,14 @@ Currently added languages are
|
||||
- Swedish
|
||||
- Spanish
|
||||
- Turkish
|
||||
- Russian
|
||||
|
||||
## Web Server Configuration
|
||||
|
||||
### Apache
|
||||
A `.htaccess` file ships with the app, however, a lot of apache installations disallow `.htaccess` files by default.
|
||||
You will notice this due to some links not working like `/settings`.
|
||||
In addition mod-rewrite needs to be enabled if it isn't already.
|
||||
|
||||
#### Fixes & work around options
|
||||
##### - Apache global allow .htaccess
|
||||
@@ -120,7 +142,7 @@ location /webfonts {
|
||||
If there are any other locations which might interfere with any of the folders in the `/public` folder, you might have to do the same for those as well, but it's a super fringe case.
|
||||
|
||||
### Reverse proxy
|
||||
If you'd like to reverse proxy this app, we recommend using our letsencrypt/nginx docker image: [Letsencrypt/Nginx](https://hub.docker.com/r/linuxserver/letsencrypt/)
|
||||
If you'd like to reverse proxy this app, we recommend using our letsencrypt/nginx docker image: [SWAG - Secure Web Application Gateway](https://hub.docker.com/r/linuxserver/swag)
|
||||
You can either reverse proxy from the root location, or from a subdomain (subfolder method is currently not supported). For HTTPS proxy, make sure you use the HTTPS port of Heimdall webserver, otherwise some links may break. You can add security through `.htpasswd`
|
||||
|
||||
```
|
||||
@@ -128,12 +150,11 @@ location / {
|
||||
auth_basic "Restricted";
|
||||
auth_basic_user_file /config/nginx/.htpasswd;
|
||||
include /config/nginx/proxy.conf;
|
||||
proxy_pass https://heimdall:443;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
proxy_pass http://heimdall;
|
||||
}
|
||||
```
|
||||
|
||||
If you are using HTTPS and things aren't working try adding `FORCE_HTTPS=true` to the end of your `.env` file or proxy to the https version of the app.
|
||||
|
||||
### Self-signed certificates and local CAs
|
||||
Per default Heimdall uses the standard certificate bundle file (`ca-certificates.crt`) to verify HTTPS sites and will ignore additional certificates placed in `/etc/ssl/certs`. If you wish to use enhanced apps with HTTPS sites that use a self-signed certificate or certs signed with your own local CA, you can override the default bundle:
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
$.when( $.ready ).then(function() {
|
||||
|
||||
var base = (document.querySelector('base') || {}).href;
|
||||
|
||||
if($('.message-container').length) {
|
||||
setTimeout(
|
||||
function()
|
||||
@@ -8,17 +10,57 @@ $.when( $.ready ).then(function() {
|
||||
}, 3500);
|
||||
}
|
||||
|
||||
if($('.livestats-container').length) {
|
||||
$('.livestats-container').each(function(index){
|
||||
// from https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API
|
||||
// Set the name of the hidden property and the change event for visibility
|
||||
var hidden, visibilityChange;
|
||||
if (typeof document.hidden !== "undefined") { // Opera 12.10 and Firefox 18 and later support
|
||||
hidden = "hidden";
|
||||
visibilityChange = "visibilitychange";
|
||||
} else if (typeof document.msHidden !== "undefined") {
|
||||
hidden = "msHidden";
|
||||
visibilityChange = "msvisibilitychange";
|
||||
} else if (typeof document.webkitHidden !== "undefined") {
|
||||
hidden = "webkitHidden";
|
||||
visibilityChange = "webkitvisibilitychange";
|
||||
}
|
||||
|
||||
var livestatsRefreshTimeouts = [];
|
||||
var livestatsFuncs = [];
|
||||
var livestatsContainers = $('.livestats-container');
|
||||
function stopLivestatsRefresh() {
|
||||
for (var timeoutId of livestatsRefreshTimeouts) {
|
||||
window.clearTimeout(timeoutId);
|
||||
}
|
||||
}
|
||||
function startLivestatsRefresh() {
|
||||
for (var fun of livestatsFuncs) {
|
||||
fun();
|
||||
}
|
||||
}
|
||||
|
||||
if (livestatsContainers.length > 0) {
|
||||
if (typeof document.addEventListener === "undefined" || hidden === undefined) {
|
||||
console.log("This browser does not support visibilityChange");
|
||||
} else {
|
||||
document.addEventListener(visibilityChange, function() {
|
||||
if (document[hidden]) {
|
||||
stopLivestatsRefresh();
|
||||
} else {
|
||||
startLivestatsRefresh();
|
||||
}
|
||||
}, false);
|
||||
}
|
||||
|
||||
livestatsContainers.each(function(index){
|
||||
var id = $(this).data('id');
|
||||
var dataonly = $(this).data('dataonly');
|
||||
var increaseby = (dataonly == 1) ? 20000 : 1000;
|
||||
var container = $(this);
|
||||
var max_timer = 30000;
|
||||
var timer = 5000;
|
||||
(function worker() {
|
||||
var fun = function worker() {
|
||||
$.ajax({
|
||||
url: '/get_stats/'+id,
|
||||
url: base+'get_stats/'+id,
|
||||
dataType: 'json',
|
||||
success: function(data) {
|
||||
container.html(data.html);
|
||||
@@ -29,10 +71,12 @@ $.when( $.ready ).then(function() {
|
||||
},
|
||||
complete: function() {
|
||||
// Schedule the next request when the current one's complete
|
||||
setTimeout(worker, timer);
|
||||
livestatsRefreshTimeouts[index] = window.setTimeout(worker, timer);
|
||||
}
|
||||
});
|
||||
})();
|
||||
};
|
||||
livestatsFuncs[index] = fun;
|
||||
fun();
|
||||
});
|
||||
|
||||
}
|
||||
@@ -76,7 +120,7 @@ $.when( $.ready ).then(function() {
|
||||
attribute: 'data-id'
|
||||
});
|
||||
$.post(
|
||||
'/order',
|
||||
base+'order',
|
||||
{ order:idsInOrder }
|
||||
);
|
||||
}
|
||||
@@ -84,7 +128,49 @@ $.when( $.ready ).then(function() {
|
||||
});
|
||||
$('#sortable').sortable('disable');
|
||||
|
||||
$('#sortable').on('mouseenter', '.item', function () {
|
||||
$(this).siblings('.tooltip').addClass('active')
|
||||
$('.refresh', this).addClass('active')
|
||||
}).on('mouseleave', '.item', function () {
|
||||
$(this).siblings('.tooltip').removeClass('active')
|
||||
$('.refresh', this).removeClass('active')
|
||||
})
|
||||
|
||||
$('#search-container').on('input', 'input[name=q]', function () {
|
||||
const search = this.value
|
||||
const items = $('#sortable').children('.item-container')
|
||||
if($('#search-container select[name=provider]').val() === 'tiles') {
|
||||
if(search.length > 0) {
|
||||
items.hide()
|
||||
items.filter(function () {
|
||||
const name = $(this).data('name').toLowerCase();
|
||||
return name.includes(search.toLowerCase())
|
||||
}).show()
|
||||
} else {
|
||||
items.show()
|
||||
}
|
||||
} else {
|
||||
items.show()
|
||||
}
|
||||
}).on('change', 'select[name=provider]', function () {
|
||||
const items = $('#sortable').children('.item-container')
|
||||
if($(this).val() === 'tiles') {
|
||||
$('#search-container button').hide()
|
||||
const search = $('#search-container input[name=q]').val()
|
||||
if(search.length > 0) {
|
||||
items.hide()
|
||||
items.filter(function () {
|
||||
const name = $(this).data('name').toLowerCase();
|
||||
return name.includes(search.toLowerCase())
|
||||
}).show()
|
||||
} else {
|
||||
items.show()
|
||||
}
|
||||
} else {
|
||||
$('#search-container button').show()
|
||||
items.show()
|
||||
}
|
||||
})
|
||||
|
||||
$('#app').on('click', '#config-button', function(e) {
|
||||
e.preventDefault();
|
||||
@@ -119,7 +205,7 @@ $.when( $.ready ).then(function() {
|
||||
e.preventDefault();
|
||||
var apiurl = $('#create input[name=url]').val();
|
||||
|
||||
var override_url = $('#create input[name="config[override_url]"]').val();
|
||||
var override_url = $('#sapconfig input[name="config[override_url]"]').val();
|
||||
if(override_url.length && override_url != '') {
|
||||
apiurl = override_url;
|
||||
}
|
||||
@@ -131,7 +217,7 @@ $.when( $.ready ).then(function() {
|
||||
data[config] = $(this).val();
|
||||
});
|
||||
|
||||
$.post('/test_config', { data: data }, function(data) {
|
||||
$.post(base+'test_config', { data: data }, function(data) {
|
||||
alert(data);
|
||||
});
|
||||
|
||||
@@ -140,7 +226,8 @@ $.when( $.ready ).then(function() {
|
||||
e.preventDefault();
|
||||
var current = $(this);
|
||||
var id = current.data('id');
|
||||
$.get('items/pintoggle/'+id+'/true', function(data) {
|
||||
var tag = current.data('tag');
|
||||
$.get(base+'items/pintoggle/'+id+'/true/'+tag, function(data) {
|
||||
var inner = $(data).filter('#sortable').html();
|
||||
$('#sortable').html(inner);
|
||||
current.toggleClass('active');
|
||||
|
||||
@@ -47,6 +47,66 @@ body {
|
||||
}
|
||||
}
|
||||
}
|
||||
#tile-preview {
|
||||
align-items: center;
|
||||
}
|
||||
.create {
|
||||
.textarea {
|
||||
width: 100%;
|
||||
margin: 0px 20px;
|
||||
textarea{
|
||||
width: 100%;
|
||||
border: 1px solid #dedfe2;
|
||||
padding: 15px;
|
||||
border-radius: 6px;
|
||||
height: 100px;
|
||||
font-size: 14px;
|
||||
}
|
||||
label:not(.switch) {
|
||||
width: 100%;
|
||||
font-size: 13px;
|
||||
color: lighten($app-text, 40%);
|
||||
margin-bottom: 15px;
|
||||
display: block;
|
||||
font-weight: 300;
|
||||
}
|
||||
}
|
||||
}
|
||||
.appoptions {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 20px;
|
||||
gap: 5px;
|
||||
.optdetails {
|
||||
display: flex;
|
||||
.input {
|
||||
margin: 0 20px;
|
||||
width: 200px;
|
||||
}
|
||||
}
|
||||
.optvalue {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
opacity: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
overflow: hidden;
|
||||
&.active {
|
||||
opacity: 1;
|
||||
width: auto;
|
||||
height: auto;
|
||||
overflow: visible;
|
||||
}
|
||||
}
|
||||
button.dark {
|
||||
background: #1b1b1b;
|
||||
border: none;
|
||||
padding: 12px 15px;
|
||||
border-radius: 4px;
|
||||
color: white;
|
||||
min-width: 240px;
|
||||
}
|
||||
}
|
||||
#app {
|
||||
display: flex;
|
||||
min-height: 100vh;
|
||||
@@ -200,6 +260,59 @@ body {
|
||||
text-align: center;
|
||||
line-height: 30px;
|
||||
display: none;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.tooltip {
|
||||
padding: 25px;
|
||||
border-radius: 5px;
|
||||
background: #000000c8;
|
||||
color: white;
|
||||
position: absolute;
|
||||
bottom: 120px;
|
||||
left: 0;
|
||||
right: 0;
|
||||
font-size: 13px;
|
||||
backdrop-filter: blur(8px);
|
||||
z-index: 0;
|
||||
opacity: 0;
|
||||
transform: translateY(-20px);
|
||||
transition: all 0.3s;
|
||||
&.active {
|
||||
transform: translateY(0);
|
||||
opacity: 1;
|
||||
z-index: 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
.tile-actions {
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0;
|
||||
padding: 7px;
|
||||
background: #000000d9;
|
||||
font-size: 12px;
|
||||
line-height: 1;
|
||||
border-radius: 6px;
|
||||
width: 80px;
|
||||
height: 90px;
|
||||
display: flex;
|
||||
opacity: 0;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
transition: all 0.3s;
|
||||
flex-direction: column;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
&.active {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
.refresh {
|
||||
z-index: 3;
|
||||
.icon {
|
||||
font-size: 20px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
}
|
||||
.black {
|
||||
@@ -434,6 +547,8 @@ body {
|
||||
padding: 20px 25px;
|
||||
font-size: 13px;
|
||||
color: $app-text;
|
||||
max-width: 500px;
|
||||
word-break: break-word;
|
||||
&.form-error {
|
||||
background: #e69191;
|
||||
color: white;
|
||||
@@ -509,6 +624,15 @@ body {
|
||||
}
|
||||
}
|
||||
}
|
||||
.input {
|
||||
position: relative;
|
||||
.help {
|
||||
position: absolute;
|
||||
bottom: -22px;
|
||||
left: 10px;
|
||||
color: #c00;
|
||||
}
|
||||
}
|
||||
div.create {
|
||||
padding: 30px 15px;
|
||||
display: flex;
|
||||
@@ -532,10 +656,19 @@ div.create {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.app-icon-container {
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-right: 15px;
|
||||
flex: 0 0 60px;
|
||||
}
|
||||
.app-icon {
|
||||
max-width: 60px;
|
||||
margin-right: 15px;
|
||||
display: block;
|
||||
max-height: 60px;
|
||||
}
|
||||
|
||||
.sidenav {
|
||||
@@ -574,6 +707,41 @@ div.create {
|
||||
color: #91a1b3;
|
||||
margin-left: 20px;
|
||||
}
|
||||
#websiteiconoptions {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 20px;
|
||||
.results {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
.header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
padding: 10px 0;
|
||||
}
|
||||
.selectclose {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
.iconbutton {
|
||||
width: 160px;
|
||||
height: 160px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.selecticon {
|
||||
max-width: 120px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.switch {
|
||||
position: relative;
|
||||
@@ -691,7 +859,9 @@ div.create {
|
||||
border-bottom: 1px solid rgba(255,255,255,0.35);
|
||||
position: relative;
|
||||
width: 100%;
|
||||
max-width: 500px;
|
||||
max-width: 620px;
|
||||
position: relative;
|
||||
z-index: 4;
|
||||
form {
|
||||
width: 100%;
|
||||
}
|
||||
@@ -701,6 +871,8 @@ div.create {
|
||||
box-shadow: 0px 0px 5px 0 rgba(0,0,0,0.4);
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
display: flex;
|
||||
|
||||
}
|
||||
input {
|
||||
padding: 17px 15px;
|
||||
@@ -724,6 +896,12 @@ div.create {
|
||||
text-transform: uppercase;
|
||||
background: $app-red;
|
||||
}
|
||||
select {
|
||||
padding: 0 10px;
|
||||
background: #f5f5f5;
|
||||
border: none;
|
||||
border-right: 1px solid #ddd;
|
||||
}
|
||||
}
|
||||
|
||||
.ui-autocomplete {
|
||||
@@ -774,7 +952,7 @@ div.create {
|
||||
|
||||
#appimage {
|
||||
img {
|
||||
max-width: 95px;
|
||||
width: 95px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -866,11 +1044,6 @@ hr {
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
|
||||
li {
|
||||
text-align: center;
|
||||
margin: 0;
|
||||
line-height: 1;
|
||||
}
|
||||
span {
|
||||
display: block;
|
||||
text-transform: uppercase;
|
||||
@@ -893,6 +1066,18 @@ hr {
|
||||
margin-left: 4px;
|
||||
}
|
||||
}
|
||||
li {
|
||||
text-align: center;
|
||||
margin: 0;
|
||||
line-height: 1;
|
||||
&.right {
|
||||
text-align: right;
|
||||
span {
|
||||
justify-content: flex-end;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.flexcolumn {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
4
resources/assets/sass/app.scss
vendored
@@ -15,9 +15,5 @@
|
||||
// Huebee
|
||||
@import "huebee";
|
||||
|
||||
// fontawesome
|
||||
@import "fontawesome/fontawesome";
|
||||
@import "fontawesome/fa-solid";
|
||||
|
||||
@import "select2";
|
||||
|
||||
|
||||
BIN
resources/assets/sass/fontawesome/.__animated.scss
vendored
BIN
resources/assets/sass/fontawesome/.__core.scss
vendored
BIN
resources/assets/sass/fontawesome/.__icons.scss
vendored
BIN
resources/assets/sass/fontawesome/.__larger.scss
vendored
BIN
resources/assets/sass/fontawesome/.__list.scss
vendored
BIN
resources/assets/sass/fontawesome/.__mixins.scss
vendored
BIN
resources/assets/sass/fontawesome/.__stacked.scss
vendored
BIN
resources/assets/sass/fontawesome/.__variables.scss
vendored
BIN
resources/assets/sass/fontawesome/._fa-brands.scss
vendored
BIN
resources/assets/sass/fontawesome/._fa-light.scss
vendored
BIN
resources/assets/sass/fontawesome/._fa-regular.scss
vendored
BIN
resources/assets/sass/fontawesome/._fa-solid.scss
vendored
BIN
resources/assets/sass/fontawesome/._fontawesome.scss
vendored
20
resources/assets/sass/fontawesome/_animated.scss
vendored
@@ -1,20 +0,0 @@
|
||||
// Animated Icons
|
||||
// --------------------------
|
||||
|
||||
.#{$fa-css-prefix}-spin {
|
||||
animation: fa-spin 2s infinite linear;
|
||||
}
|
||||
|
||||
.#{$fa-css-prefix}-pulse {
|
||||
animation: fa-spin 1s infinite steps(8);
|
||||
}
|
||||
|
||||
@keyframes fa-spin {
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
// Bordered & Pulled
|
||||
// -------------------------
|
||||
|
||||
.#{$fa-css-prefix}-border {
|
||||
border: solid .08em $fa-border-color;
|
||||
border-radius: .1em;
|
||||
padding: .2em .25em .15em;
|
||||
}
|
||||
|
||||
.#{$fa-css-prefix}-pull-left { float: left; }
|
||||
.#{$fa-css-prefix}-pull-right { float: right; }
|
||||
|
||||
.#{$fa-css-prefix},
|
||||
.fas,
|
||||
.far,
|
||||
.fal,
|
||||
.fab {
|
||||
&.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
|
||||
&.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
|
||||
}
|
||||
16
resources/assets/sass/fontawesome/_core.scss
vendored
@@ -1,16 +0,0 @@
|
||||
// Base Class Definition
|
||||
// -------------------------
|
||||
|
||||
.#{$fa-css-prefix},
|
||||
.fas,
|
||||
.far,
|
||||
.fal,
|
||||
.fab {
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
display: inline-block;
|
||||
font-style: normal;
|
||||
font-variant: normal;
|
||||
text-rendering: auto;
|
||||
line-height: 1;
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
// Fixed Width Icons
|
||||
// -------------------------
|
||||
.#{$fa-css-prefix}-fw {
|
||||
text-align: center;
|
||||
width: (20em / 16);
|
||||
}
|
||||
946
resources/assets/sass/fontawesome/_icons.scss
vendored
@@ -1,946 +0,0 @@
|
||||
/* 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}-500px:before { content: fa-content($fa-var-500px); }
|
||||
.#{$fa-css-prefix}-accessible-icon:before { content: fa-content($fa-var-accessible-icon); }
|
||||
.#{$fa-css-prefix}-accusoft:before { content: fa-content($fa-var-accusoft); }
|
||||
.#{$fa-css-prefix}-address-book:before { content: fa-content($fa-var-address-book); }
|
||||
.#{$fa-css-prefix}-address-card:before { content: fa-content($fa-var-address-card); }
|
||||
.#{$fa-css-prefix}-adjust:before { content: fa-content($fa-var-adjust); }
|
||||
.#{$fa-css-prefix}-adn:before { content: fa-content($fa-var-adn); }
|
||||
.#{$fa-css-prefix}-adversal:before { content: fa-content($fa-var-adversal); }
|
||||
.#{$fa-css-prefix}-affiliatetheme:before { content: fa-content($fa-var-affiliatetheme); }
|
||||
.#{$fa-css-prefix}-alarm-clock:before { content: fa-content($fa-var-alarm-clock); }
|
||||
.#{$fa-css-prefix}-algolia:before { content: fa-content($fa-var-algolia); }
|
||||
.#{$fa-css-prefix}-align-center:before { content: fa-content($fa-var-align-center); }
|
||||
.#{$fa-css-prefix}-align-justify:before { content: fa-content($fa-var-align-justify); }
|
||||
.#{$fa-css-prefix}-align-left:before { content: fa-content($fa-var-align-left); }
|
||||
.#{$fa-css-prefix}-align-right:before { content: fa-content($fa-var-align-right); }
|
||||
.#{$fa-css-prefix}-amazon:before { content: fa-content($fa-var-amazon); }
|
||||
.#{$fa-css-prefix}-amazon-pay:before { content: fa-content($fa-var-amazon-pay); }
|
||||
.#{$fa-css-prefix}-ambulance:before { content: fa-content($fa-var-ambulance); }
|
||||
.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: fa-content($fa-var-american-sign-language-interpreting); }
|
||||
.#{$fa-css-prefix}-amilia:before { content: fa-content($fa-var-amilia); }
|
||||
.#{$fa-css-prefix}-anchor:before { content: fa-content($fa-var-anchor); }
|
||||
.#{$fa-css-prefix}-android:before { content: fa-content($fa-var-android); }
|
||||
.#{$fa-css-prefix}-angellist:before { content: fa-content($fa-var-angellist); }
|
||||
.#{$fa-css-prefix}-angle-double-down:before { content: fa-content($fa-var-angle-double-down); }
|
||||
.#{$fa-css-prefix}-angle-double-left:before { content: fa-content($fa-var-angle-double-left); }
|
||||
.#{$fa-css-prefix}-angle-double-right:before { content: fa-content($fa-var-angle-double-right); }
|
||||
.#{$fa-css-prefix}-angle-double-up:before { content: fa-content($fa-var-angle-double-up); }
|
||||
.#{$fa-css-prefix}-angle-down:before { content: fa-content($fa-var-angle-down); }
|
||||
.#{$fa-css-prefix}-angle-left:before { content: fa-content($fa-var-angle-left); }
|
||||
.#{$fa-css-prefix}-angle-right:before { content: fa-content($fa-var-angle-right); }
|
||||
.#{$fa-css-prefix}-angle-up:before { content: fa-content($fa-var-angle-up); }
|
||||
.#{$fa-css-prefix}-angrycreative:before { content: fa-content($fa-var-angrycreative); }
|
||||
.#{$fa-css-prefix}-angular:before { content: fa-content($fa-var-angular); }
|
||||
.#{$fa-css-prefix}-app-store:before { content: fa-content($fa-var-app-store); }
|
||||
.#{$fa-css-prefix}-app-store-ios:before { content: fa-content($fa-var-app-store-ios); }
|
||||
.#{$fa-css-prefix}-apper:before { content: fa-content($fa-var-apper); }
|
||||
.#{$fa-css-prefix}-apple:before { content: fa-content($fa-var-apple); }
|
||||
.#{$fa-css-prefix}-apple-pay:before { content: fa-content($fa-var-apple-pay); }
|
||||
.#{$fa-css-prefix}-archive:before { content: fa-content($fa-var-archive); }
|
||||
.#{$fa-css-prefix}-arrow-alt-circle-down:before { content: fa-content($fa-var-arrow-alt-circle-down); }
|
||||
.#{$fa-css-prefix}-arrow-alt-circle-left:before { content: fa-content($fa-var-arrow-alt-circle-left); }
|
||||
.#{$fa-css-prefix}-arrow-alt-circle-right:before { content: fa-content($fa-var-arrow-alt-circle-right); }
|
||||
.#{$fa-css-prefix}-arrow-alt-circle-up:before { content: fa-content($fa-var-arrow-alt-circle-up); }
|
||||
.#{$fa-css-prefix}-arrow-alt-down:before { content: fa-content($fa-var-arrow-alt-down); }
|
||||
.#{$fa-css-prefix}-arrow-alt-from-bottom:before { content: fa-content($fa-var-arrow-alt-from-bottom); }
|
||||
.#{$fa-css-prefix}-arrow-alt-from-left:before { content: fa-content($fa-var-arrow-alt-from-left); }
|
||||
.#{$fa-css-prefix}-arrow-alt-from-right:before { content: fa-content($fa-var-arrow-alt-from-right); }
|
||||
.#{$fa-css-prefix}-arrow-alt-from-top:before { content: fa-content($fa-var-arrow-alt-from-top); }
|
||||
.#{$fa-css-prefix}-arrow-alt-left:before { content: fa-content($fa-var-arrow-alt-left); }
|
||||
.#{$fa-css-prefix}-arrow-alt-right:before { content: fa-content($fa-var-arrow-alt-right); }
|
||||
.#{$fa-css-prefix}-arrow-alt-square-down:before { content: fa-content($fa-var-arrow-alt-square-down); }
|
||||
.#{$fa-css-prefix}-arrow-alt-square-left:before { content: fa-content($fa-var-arrow-alt-square-left); }
|
||||
.#{$fa-css-prefix}-arrow-alt-square-right:before { content: fa-content($fa-var-arrow-alt-square-right); }
|
||||
.#{$fa-css-prefix}-arrow-alt-square-up:before { content: fa-content($fa-var-arrow-alt-square-up); }
|
||||
.#{$fa-css-prefix}-arrow-alt-to-bottom:before { content: fa-content($fa-var-arrow-alt-to-bottom); }
|
||||
.#{$fa-css-prefix}-arrow-alt-to-left:before { content: fa-content($fa-var-arrow-alt-to-left); }
|
||||
.#{$fa-css-prefix}-arrow-alt-to-right:before { content: fa-content($fa-var-arrow-alt-to-right); }
|
||||
.#{$fa-css-prefix}-arrow-alt-to-top:before { content: fa-content($fa-var-arrow-alt-to-top); }
|
||||
.#{$fa-css-prefix}-arrow-alt-up:before { content: fa-content($fa-var-arrow-alt-up); }
|
||||
.#{$fa-css-prefix}-arrow-circle-down:before { content: fa-content($fa-var-arrow-circle-down); }
|
||||
.#{$fa-css-prefix}-arrow-circle-left:before { content: fa-content($fa-var-arrow-circle-left); }
|
||||
.#{$fa-css-prefix}-arrow-circle-right:before { content: fa-content($fa-var-arrow-circle-right); }
|
||||
.#{$fa-css-prefix}-arrow-circle-up:before { content: fa-content($fa-var-arrow-circle-up); }
|
||||
.#{$fa-css-prefix}-arrow-down:before { content: fa-content($fa-var-arrow-down); }
|
||||
.#{$fa-css-prefix}-arrow-from-bottom:before { content: fa-content($fa-var-arrow-from-bottom); }
|
||||
.#{$fa-css-prefix}-arrow-from-left:before { content: fa-content($fa-var-arrow-from-left); }
|
||||
.#{$fa-css-prefix}-arrow-from-right:before { content: fa-content($fa-var-arrow-from-right); }
|
||||
.#{$fa-css-prefix}-arrow-from-top:before { content: fa-content($fa-var-arrow-from-top); }
|
||||
.#{$fa-css-prefix}-arrow-left:before { content: fa-content($fa-var-arrow-left); }
|
||||
.#{$fa-css-prefix}-arrow-right:before { content: fa-content($fa-var-arrow-right); }
|
||||
.#{$fa-css-prefix}-arrow-square-down:before { content: fa-content($fa-var-arrow-square-down); }
|
||||
.#{$fa-css-prefix}-arrow-square-left:before { content: fa-content($fa-var-arrow-square-left); }
|
||||
.#{$fa-css-prefix}-arrow-square-right:before { content: fa-content($fa-var-arrow-square-right); }
|
||||
.#{$fa-css-prefix}-arrow-square-up:before { content: fa-content($fa-var-arrow-square-up); }
|
||||
.#{$fa-css-prefix}-arrow-to-bottom:before { content: fa-content($fa-var-arrow-to-bottom); }
|
||||
.#{$fa-css-prefix}-arrow-to-left:before { content: fa-content($fa-var-arrow-to-left); }
|
||||
.#{$fa-css-prefix}-arrow-to-right:before { content: fa-content($fa-var-arrow-to-right); }
|
||||
.#{$fa-css-prefix}-arrow-to-top:before { content: fa-content($fa-var-arrow-to-top); }
|
||||
.#{$fa-css-prefix}-arrow-up:before { content: fa-content($fa-var-arrow-up); }
|
||||
.#{$fa-css-prefix}-arrows:before { content: fa-content($fa-var-arrows); }
|
||||
.#{$fa-css-prefix}-arrows-alt:before { content: fa-content($fa-var-arrows-alt); }
|
||||
.#{$fa-css-prefix}-arrows-alt-h:before { content: fa-content($fa-var-arrows-alt-h); }
|
||||
.#{$fa-css-prefix}-arrows-alt-v:before { content: fa-content($fa-var-arrows-alt-v); }
|
||||
.#{$fa-css-prefix}-arrows-h:before { content: fa-content($fa-var-arrows-h); }
|
||||
.#{$fa-css-prefix}-arrows-v:before { content: fa-content($fa-var-arrows-v); }
|
||||
.#{$fa-css-prefix}-assistive-listening-systems:before { content: fa-content($fa-var-assistive-listening-systems); }
|
||||
.#{$fa-css-prefix}-asterisk:before { content: fa-content($fa-var-asterisk); }
|
||||
.#{$fa-css-prefix}-asymmetrik:before { content: fa-content($fa-var-asymmetrik); }
|
||||
.#{$fa-css-prefix}-at:before { content: fa-content($fa-var-at); }
|
||||
.#{$fa-css-prefix}-audible:before { content: fa-content($fa-var-audible); }
|
||||
.#{$fa-css-prefix}-audio-description:before { content: fa-content($fa-var-audio-description); }
|
||||
.#{$fa-css-prefix}-autoprefixer:before { content: fa-content($fa-var-autoprefixer); }
|
||||
.#{$fa-css-prefix}-avianex:before { content: fa-content($fa-var-avianex); }
|
||||
.#{$fa-css-prefix}-aviato:before { content: fa-content($fa-var-aviato); }
|
||||
.#{$fa-css-prefix}-aws:before { content: fa-content($fa-var-aws); }
|
||||
.#{$fa-css-prefix}-backward:before { content: fa-content($fa-var-backward); }
|
||||
.#{$fa-css-prefix}-badge:before { content: fa-content($fa-var-badge); }
|
||||
.#{$fa-css-prefix}-badge-check:before { content: fa-content($fa-var-badge-check); }
|
||||
.#{$fa-css-prefix}-balance-scale:before { content: fa-content($fa-var-balance-scale); }
|
||||
.#{$fa-css-prefix}-ban:before { content: fa-content($fa-var-ban); }
|
||||
.#{$fa-css-prefix}-bandcamp:before { content: fa-content($fa-var-bandcamp); }
|
||||
.#{$fa-css-prefix}-barcode:before { content: fa-content($fa-var-barcode); }
|
||||
.#{$fa-css-prefix}-bars:before { content: fa-content($fa-var-bars); }
|
||||
.#{$fa-css-prefix}-bath:before { content: fa-content($fa-var-bath); }
|
||||
.#{$fa-css-prefix}-battery-bolt:before { content: fa-content($fa-var-battery-bolt); }
|
||||
.#{$fa-css-prefix}-battery-empty:before { content: fa-content($fa-var-battery-empty); }
|
||||
.#{$fa-css-prefix}-battery-full:before { content: fa-content($fa-var-battery-full); }
|
||||
.#{$fa-css-prefix}-battery-half:before { content: fa-content($fa-var-battery-half); }
|
||||
.#{$fa-css-prefix}-battery-quarter:before { content: fa-content($fa-var-battery-quarter); }
|
||||
.#{$fa-css-prefix}-battery-slash:before { content: fa-content($fa-var-battery-slash); }
|
||||
.#{$fa-css-prefix}-battery-three-quarters:before { content: fa-content($fa-var-battery-three-quarters); }
|
||||
.#{$fa-css-prefix}-bed:before { content: fa-content($fa-var-bed); }
|
||||
.#{$fa-css-prefix}-beer:before { content: fa-content($fa-var-beer); }
|
||||
.#{$fa-css-prefix}-behance:before { content: fa-content($fa-var-behance); }
|
||||
.#{$fa-css-prefix}-behance-square:before { content: fa-content($fa-var-behance-square); }
|
||||
.#{$fa-css-prefix}-bell:before { content: fa-content($fa-var-bell); }
|
||||
.#{$fa-css-prefix}-bell-slash:before { content: fa-content($fa-var-bell-slash); }
|
||||
.#{$fa-css-prefix}-bicycle:before { content: fa-content($fa-var-bicycle); }
|
||||
.#{$fa-css-prefix}-bimobject:before { content: fa-content($fa-var-bimobject); }
|
||||
.#{$fa-css-prefix}-binoculars:before { content: fa-content($fa-var-binoculars); }
|
||||
.#{$fa-css-prefix}-birthday-cake:before { content: fa-content($fa-var-birthday-cake); }
|
||||
.#{$fa-css-prefix}-bitbucket:before { content: fa-content($fa-var-bitbucket); }
|
||||
.#{$fa-css-prefix}-bitcoin:before { content: fa-content($fa-var-bitcoin); }
|
||||
.#{$fa-css-prefix}-bity:before { content: fa-content($fa-var-bity); }
|
||||
.#{$fa-css-prefix}-black-tie:before { content: fa-content($fa-var-black-tie); }
|
||||
.#{$fa-css-prefix}-blackberry:before { content: fa-content($fa-var-blackberry); }
|
||||
.#{$fa-css-prefix}-blind:before { content: fa-content($fa-var-blind); }
|
||||
.#{$fa-css-prefix}-blogger:before { content: fa-content($fa-var-blogger); }
|
||||
.#{$fa-css-prefix}-blogger-b:before { content: fa-content($fa-var-blogger-b); }
|
||||
.#{$fa-css-prefix}-bluetooth:before { content: fa-content($fa-var-bluetooth); }
|
||||
.#{$fa-css-prefix}-bluetooth-b:before { content: fa-content($fa-var-bluetooth-b); }
|
||||
.#{$fa-css-prefix}-bold:before { content: fa-content($fa-var-bold); }
|
||||
.#{$fa-css-prefix}-bolt:before { content: fa-content($fa-var-bolt); }
|
||||
.#{$fa-css-prefix}-bomb:before { content: fa-content($fa-var-bomb); }
|
||||
.#{$fa-css-prefix}-book:before { content: fa-content($fa-var-book); }
|
||||
.#{$fa-css-prefix}-bookmark:before { content: fa-content($fa-var-bookmark); }
|
||||
.#{$fa-css-prefix}-braille:before { content: fa-content($fa-var-braille); }
|
||||
.#{$fa-css-prefix}-briefcase:before { content: fa-content($fa-var-briefcase); }
|
||||
.#{$fa-css-prefix}-browser:before { content: fa-content($fa-var-browser); }
|
||||
.#{$fa-css-prefix}-btc:before { content: fa-content($fa-var-btc); }
|
||||
.#{$fa-css-prefix}-bug:before { content: fa-content($fa-var-bug); }
|
||||
.#{$fa-css-prefix}-building:before { content: fa-content($fa-var-building); }
|
||||
.#{$fa-css-prefix}-bullhorn:before { content: fa-content($fa-var-bullhorn); }
|
||||
.#{$fa-css-prefix}-bullseye:before { content: fa-content($fa-var-bullseye); }
|
||||
.#{$fa-css-prefix}-buromobelexperte:before { content: fa-content($fa-var-buromobelexperte); }
|
||||
.#{$fa-css-prefix}-bus:before { content: fa-content($fa-var-bus); }
|
||||
.#{$fa-css-prefix}-buysellads:before { content: fa-content($fa-var-buysellads); }
|
||||
.#{$fa-css-prefix}-calculator:before { content: fa-content($fa-var-calculator); }
|
||||
.#{$fa-css-prefix}-calendar:before { content: fa-content($fa-var-calendar); }
|
||||
.#{$fa-css-prefix}-calendar-alt:before { content: fa-content($fa-var-calendar-alt); }
|
||||
.#{$fa-css-prefix}-calendar-check:before { content: fa-content($fa-var-calendar-check); }
|
||||
.#{$fa-css-prefix}-calendar-edit:before { content: fa-content($fa-var-calendar-edit); }
|
||||
.#{$fa-css-prefix}-calendar-exclamation:before { content: fa-content($fa-var-calendar-exclamation); }
|
||||
.#{$fa-css-prefix}-calendar-minus:before { content: fa-content($fa-var-calendar-minus); }
|
||||
.#{$fa-css-prefix}-calendar-plus:before { content: fa-content($fa-var-calendar-plus); }
|
||||
.#{$fa-css-prefix}-calendar-times:before { content: fa-content($fa-var-calendar-times); }
|
||||
.#{$fa-css-prefix}-camera:before { content: fa-content($fa-var-camera); }
|
||||
.#{$fa-css-prefix}-camera-alt:before { content: fa-content($fa-var-camera-alt); }
|
||||
.#{$fa-css-prefix}-camera-retro:before { content: fa-content($fa-var-camera-retro); }
|
||||
.#{$fa-css-prefix}-car:before { content: fa-content($fa-var-car); }
|
||||
.#{$fa-css-prefix}-caret-circle-down:before { content: fa-content($fa-var-caret-circle-down); }
|
||||
.#{$fa-css-prefix}-caret-circle-left:before { content: fa-content($fa-var-caret-circle-left); }
|
||||
.#{$fa-css-prefix}-caret-circle-right:before { content: fa-content($fa-var-caret-circle-right); }
|
||||
.#{$fa-css-prefix}-caret-circle-up:before { content: fa-content($fa-var-caret-circle-up); }
|
||||
.#{$fa-css-prefix}-caret-down:before { content: fa-content($fa-var-caret-down); }
|
||||
.#{$fa-css-prefix}-caret-left:before { content: fa-content($fa-var-caret-left); }
|
||||
.#{$fa-css-prefix}-caret-right:before { content: fa-content($fa-var-caret-right); }
|
||||
.#{$fa-css-prefix}-caret-square-down:before { content: fa-content($fa-var-caret-square-down); }
|
||||
.#{$fa-css-prefix}-caret-square-left:before { content: fa-content($fa-var-caret-square-left); }
|
||||
.#{$fa-css-prefix}-caret-square-right:before { content: fa-content($fa-var-caret-square-right); }
|
||||
.#{$fa-css-prefix}-caret-square-up:before { content: fa-content($fa-var-caret-square-up); }
|
||||
.#{$fa-css-prefix}-caret-up:before { content: fa-content($fa-var-caret-up); }
|
||||
.#{$fa-css-prefix}-cart-arrow-down:before { content: fa-content($fa-var-cart-arrow-down); }
|
||||
.#{$fa-css-prefix}-cart-plus:before { content: fa-content($fa-var-cart-plus); }
|
||||
.#{$fa-css-prefix}-cc-amazon-pay:before { content: fa-content($fa-var-cc-amazon-pay); }
|
||||
.#{$fa-css-prefix}-cc-amex:before { content: fa-content($fa-var-cc-amex); }
|
||||
.#{$fa-css-prefix}-cc-apple-pay:before { content: fa-content($fa-var-cc-apple-pay); }
|
||||
.#{$fa-css-prefix}-cc-diners-club:before { content: fa-content($fa-var-cc-diners-club); }
|
||||
.#{$fa-css-prefix}-cc-discover:before { content: fa-content($fa-var-cc-discover); }
|
||||
.#{$fa-css-prefix}-cc-jcb:before { content: fa-content($fa-var-cc-jcb); }
|
||||
.#{$fa-css-prefix}-cc-mastercard:before { content: fa-content($fa-var-cc-mastercard); }
|
||||
.#{$fa-css-prefix}-cc-paypal:before { content: fa-content($fa-var-cc-paypal); }
|
||||
.#{$fa-css-prefix}-cc-stripe:before { content: fa-content($fa-var-cc-stripe); }
|
||||
.#{$fa-css-prefix}-cc-visa:before { content: fa-content($fa-var-cc-visa); }
|
||||
.#{$fa-css-prefix}-centercode:before { content: fa-content($fa-var-centercode); }
|
||||
.#{$fa-css-prefix}-certificate:before { content: fa-content($fa-var-certificate); }
|
||||
.#{$fa-css-prefix}-chart-area:before { content: fa-content($fa-var-chart-area); }
|
||||
.#{$fa-css-prefix}-chart-bar:before { content: fa-content($fa-var-chart-bar); }
|
||||
.#{$fa-css-prefix}-chart-line:before { content: fa-content($fa-var-chart-line); }
|
||||
.#{$fa-css-prefix}-chart-pie:before { content: fa-content($fa-var-chart-pie); }
|
||||
.#{$fa-css-prefix}-check:before { content: fa-content($fa-var-check); }
|
||||
.#{$fa-css-prefix}-check-circle:before { content: fa-content($fa-var-check-circle); }
|
||||
.#{$fa-css-prefix}-check-square:before { content: fa-content($fa-var-check-square); }
|
||||
.#{$fa-css-prefix}-chevron-circle-down:before { content: fa-content($fa-var-chevron-circle-down); }
|
||||
.#{$fa-css-prefix}-chevron-circle-left:before { content: fa-content($fa-var-chevron-circle-left); }
|
||||
.#{$fa-css-prefix}-chevron-circle-right:before { content: fa-content($fa-var-chevron-circle-right); }
|
||||
.#{$fa-css-prefix}-chevron-circle-up:before { content: fa-content($fa-var-chevron-circle-up); }
|
||||
.#{$fa-css-prefix}-chevron-double-down:before { content: fa-content($fa-var-chevron-double-down); }
|
||||
.#{$fa-css-prefix}-chevron-double-left:before { content: fa-content($fa-var-chevron-double-left); }
|
||||
.#{$fa-css-prefix}-chevron-double-right:before { content: fa-content($fa-var-chevron-double-right); }
|
||||
.#{$fa-css-prefix}-chevron-double-up:before { content: fa-content($fa-var-chevron-double-up); }
|
||||
.#{$fa-css-prefix}-chevron-down:before { content: fa-content($fa-var-chevron-down); }
|
||||
.#{$fa-css-prefix}-chevron-left:before { content: fa-content($fa-var-chevron-left); }
|
||||
.#{$fa-css-prefix}-chevron-right:before { content: fa-content($fa-var-chevron-right); }
|
||||
.#{$fa-css-prefix}-chevron-square-down:before { content: fa-content($fa-var-chevron-square-down); }
|
||||
.#{$fa-css-prefix}-chevron-square-left:before { content: fa-content($fa-var-chevron-square-left); }
|
||||
.#{$fa-css-prefix}-chevron-square-right:before { content: fa-content($fa-var-chevron-square-right); }
|
||||
.#{$fa-css-prefix}-chevron-square-up:before { content: fa-content($fa-var-chevron-square-up); }
|
||||
.#{$fa-css-prefix}-chevron-up:before { content: fa-content($fa-var-chevron-up); }
|
||||
.#{$fa-css-prefix}-child:before { content: fa-content($fa-var-child); }
|
||||
.#{$fa-css-prefix}-chrome:before { content: fa-content($fa-var-chrome); }
|
||||
.#{$fa-css-prefix}-circle:before { content: fa-content($fa-var-circle); }
|
||||
.#{$fa-css-prefix}-circle-notch:before { content: fa-content($fa-var-circle-notch); }
|
||||
.#{$fa-css-prefix}-clipboard:before { content: fa-content($fa-var-clipboard); }
|
||||
.#{$fa-css-prefix}-clock:before { content: fa-content($fa-var-clock); }
|
||||
.#{$fa-css-prefix}-clone:before { content: fa-content($fa-var-clone); }
|
||||
.#{$fa-css-prefix}-closed-captioning:before { content: fa-content($fa-var-closed-captioning); }
|
||||
.#{$fa-css-prefix}-cloud:before { content: fa-content($fa-var-cloud); }
|
||||
.#{$fa-css-prefix}-cloud-download:before { content: fa-content($fa-var-cloud-download); }
|
||||
.#{$fa-css-prefix}-cloud-download-alt:before { content: fa-content($fa-var-cloud-download-alt); }
|
||||
.#{$fa-css-prefix}-cloud-upload:before { content: fa-content($fa-var-cloud-upload); }
|
||||
.#{$fa-css-prefix}-cloud-upload-alt:before { content: fa-content($fa-var-cloud-upload-alt); }
|
||||
.#{$fa-css-prefix}-cloudscale:before { content: fa-content($fa-var-cloudscale); }
|
||||
.#{$fa-css-prefix}-cloudsmith:before { content: fa-content($fa-var-cloudsmith); }
|
||||
.#{$fa-css-prefix}-cloudversify:before { content: fa-content($fa-var-cloudversify); }
|
||||
.#{$fa-css-prefix}-club:before { content: fa-content($fa-var-club); }
|
||||
.#{$fa-css-prefix}-code:before { content: fa-content($fa-var-code); }
|
||||
.#{$fa-css-prefix}-code-branch:before { content: fa-content($fa-var-code-branch); }
|
||||
.#{$fa-css-prefix}-code-commit:before { content: fa-content($fa-var-code-commit); }
|
||||
.#{$fa-css-prefix}-code-merge:before { content: fa-content($fa-var-code-merge); }
|
||||
.#{$fa-css-prefix}-codepen:before { content: fa-content($fa-var-codepen); }
|
||||
.#{$fa-css-prefix}-codiepie:before { content: fa-content($fa-var-codiepie); }
|
||||
.#{$fa-css-prefix}-coffee:before { content: fa-content($fa-var-coffee); }
|
||||
.#{$fa-css-prefix}-cog:before { content: fa-content($fa-var-cog); }
|
||||
.#{$fa-css-prefix}-cogs:before { content: fa-content($fa-var-cogs); }
|
||||
.#{$fa-css-prefix}-columns:before { content: fa-content($fa-var-columns); }
|
||||
.#{$fa-css-prefix}-comment:before { content: fa-content($fa-var-comment); }
|
||||
.#{$fa-css-prefix}-comment-alt:before { content: fa-content($fa-var-comment-alt); }
|
||||
.#{$fa-css-prefix}-comments:before { content: fa-content($fa-var-comments); }
|
||||
.#{$fa-css-prefix}-compass:before { content: fa-content($fa-var-compass); }
|
||||
.#{$fa-css-prefix}-compress:before { content: fa-content($fa-var-compress); }
|
||||
.#{$fa-css-prefix}-compress-alt:before { content: fa-content($fa-var-compress-alt); }
|
||||
.#{$fa-css-prefix}-compress-wide:before { content: fa-content($fa-var-compress-wide); }
|
||||
.#{$fa-css-prefix}-connectdevelop:before { content: fa-content($fa-var-connectdevelop); }
|
||||
.#{$fa-css-prefix}-contao:before { content: fa-content($fa-var-contao); }
|
||||
.#{$fa-css-prefix}-copy:before { content: fa-content($fa-var-copy); }
|
||||
.#{$fa-css-prefix}-copyright:before { content: fa-content($fa-var-copyright); }
|
||||
.#{$fa-css-prefix}-cpanel:before { content: fa-content($fa-var-cpanel); }
|
||||
.#{$fa-css-prefix}-creative-commons:before { content: fa-content($fa-var-creative-commons); }
|
||||
.#{$fa-css-prefix}-credit-card:before { content: fa-content($fa-var-credit-card); }
|
||||
.#{$fa-css-prefix}-credit-card-blank:before { content: fa-content($fa-var-credit-card-blank); }
|
||||
.#{$fa-css-prefix}-credit-card-front:before { content: fa-content($fa-var-credit-card-front); }
|
||||
.#{$fa-css-prefix}-crop:before { content: fa-content($fa-var-crop); }
|
||||
.#{$fa-css-prefix}-crosshairs:before { content: fa-content($fa-var-crosshairs); }
|
||||
.#{$fa-css-prefix}-css3:before { content: fa-content($fa-var-css3); }
|
||||
.#{$fa-css-prefix}-css3-alt:before { content: fa-content($fa-var-css3-alt); }
|
||||
.#{$fa-css-prefix}-cube:before { content: fa-content($fa-var-cube); }
|
||||
.#{$fa-css-prefix}-cubes:before { content: fa-content($fa-var-cubes); }
|
||||
.#{$fa-css-prefix}-cut:before { content: fa-content($fa-var-cut); }
|
||||
.#{$fa-css-prefix}-cuttlefish:before { content: fa-content($fa-var-cuttlefish); }
|
||||
.#{$fa-css-prefix}-d-and-d:before { content: fa-content($fa-var-d-and-d); }
|
||||
.#{$fa-css-prefix}-dashcube:before { content: fa-content($fa-var-dashcube); }
|
||||
.#{$fa-css-prefix}-database:before { content: fa-content($fa-var-database); }
|
||||
.#{$fa-css-prefix}-deaf:before { content: fa-content($fa-var-deaf); }
|
||||
.#{$fa-css-prefix}-delicious:before { content: fa-content($fa-var-delicious); }
|
||||
.#{$fa-css-prefix}-deploydog:before { content: fa-content($fa-var-deploydog); }
|
||||
.#{$fa-css-prefix}-deskpro:before { content: fa-content($fa-var-deskpro); }
|
||||
.#{$fa-css-prefix}-desktop:before { content: fa-content($fa-var-desktop); }
|
||||
.#{$fa-css-prefix}-desktop-alt:before { content: fa-content($fa-var-desktop-alt); }
|
||||
.#{$fa-css-prefix}-deviantart:before { content: fa-content($fa-var-deviantart); }
|
||||
.#{$fa-css-prefix}-diamond:before { content: fa-content($fa-var-diamond); }
|
||||
.#{$fa-css-prefix}-digg:before { content: fa-content($fa-var-digg); }
|
||||
.#{$fa-css-prefix}-digital-ocean:before { content: fa-content($fa-var-digital-ocean); }
|
||||
.#{$fa-css-prefix}-discord:before { content: fa-content($fa-var-discord); }
|
||||
.#{$fa-css-prefix}-discourse:before { content: fa-content($fa-var-discourse); }
|
||||
.#{$fa-css-prefix}-dochub:before { content: fa-content($fa-var-dochub); }
|
||||
.#{$fa-css-prefix}-docker:before { content: fa-content($fa-var-docker); }
|
||||
.#{$fa-css-prefix}-dollar-sign:before { content: fa-content($fa-var-dollar-sign); }
|
||||
.#{$fa-css-prefix}-dot-circle:before { content: fa-content($fa-var-dot-circle); }
|
||||
.#{$fa-css-prefix}-download:before { content: fa-content($fa-var-download); }
|
||||
.#{$fa-css-prefix}-draft2digital:before { content: fa-content($fa-var-draft2digital); }
|
||||
.#{$fa-css-prefix}-dribbble:before { content: fa-content($fa-var-dribbble); }
|
||||
.#{$fa-css-prefix}-dribbble-square:before { content: fa-content($fa-var-dribbble-square); }
|
||||
.#{$fa-css-prefix}-dropbox:before { content: fa-content($fa-var-dropbox); }
|
||||
.#{$fa-css-prefix}-drupal:before { content: fa-content($fa-var-drupal); }
|
||||
.#{$fa-css-prefix}-dyalog:before { content: fa-content($fa-var-dyalog); }
|
||||
.#{$fa-css-prefix}-earlybirds:before { content: fa-content($fa-var-earlybirds); }
|
||||
.#{$fa-css-prefix}-edge:before { content: fa-content($fa-var-edge); }
|
||||
.#{$fa-css-prefix}-edit:before { content: fa-content($fa-var-edit); }
|
||||
.#{$fa-css-prefix}-eject:before { content: fa-content($fa-var-eject); }
|
||||
.#{$fa-css-prefix}-ellipsis-h:before { content: fa-content($fa-var-ellipsis-h); }
|
||||
.#{$fa-css-prefix}-ellipsis-h-alt:before { content: fa-content($fa-var-ellipsis-h-alt); }
|
||||
.#{$fa-css-prefix}-ellipsis-v:before { content: fa-content($fa-var-ellipsis-v); }
|
||||
.#{$fa-css-prefix}-ellipsis-v-alt:before { content: fa-content($fa-var-ellipsis-v-alt); }
|
||||
.#{$fa-css-prefix}-ember:before { content: fa-content($fa-var-ember); }
|
||||
.#{$fa-css-prefix}-empire:before { content: fa-content($fa-var-empire); }
|
||||
.#{$fa-css-prefix}-envelope:before { content: fa-content($fa-var-envelope); }
|
||||
.#{$fa-css-prefix}-envelope-open:before { content: fa-content($fa-var-envelope-open); }
|
||||
.#{$fa-css-prefix}-envelope-square:before { content: fa-content($fa-var-envelope-square); }
|
||||
.#{$fa-css-prefix}-envira:before { content: fa-content($fa-var-envira); }
|
||||
.#{$fa-css-prefix}-eraser:before { content: fa-content($fa-var-eraser); }
|
||||
.#{$fa-css-prefix}-erlang:before { content: fa-content($fa-var-erlang); }
|
||||
.#{$fa-css-prefix}-ethereum:before { content: fa-content($fa-var-ethereum); }
|
||||
.#{$fa-css-prefix}-etsy:before { content: fa-content($fa-var-etsy); }
|
||||
.#{$fa-css-prefix}-euro-sign:before { content: fa-content($fa-var-euro-sign); }
|
||||
.#{$fa-css-prefix}-exchange:before { content: fa-content($fa-var-exchange); }
|
||||
.#{$fa-css-prefix}-exchange-alt:before { content: fa-content($fa-var-exchange-alt); }
|
||||
.#{$fa-css-prefix}-exclamation:before { content: fa-content($fa-var-exclamation); }
|
||||
.#{$fa-css-prefix}-exclamation-circle:before { content: fa-content($fa-var-exclamation-circle); }
|
||||
.#{$fa-css-prefix}-exclamation-square:before { content: fa-content($fa-var-exclamation-square); }
|
||||
.#{$fa-css-prefix}-exclamation-triangle:before { content: fa-content($fa-var-exclamation-triangle); }
|
||||
.#{$fa-css-prefix}-expand:before { content: fa-content($fa-var-expand); }
|
||||
.#{$fa-css-prefix}-expand-alt:before { content: fa-content($fa-var-expand-alt); }
|
||||
.#{$fa-css-prefix}-expand-arrows:before { content: fa-content($fa-var-expand-arrows); }
|
||||
.#{$fa-css-prefix}-expand-arrows-alt:before { content: fa-content($fa-var-expand-arrows-alt); }
|
||||
.#{$fa-css-prefix}-expand-wide:before { content: fa-content($fa-var-expand-wide); }
|
||||
.#{$fa-css-prefix}-expeditedssl:before { content: fa-content($fa-var-expeditedssl); }
|
||||
.#{$fa-css-prefix}-external-link:before { content: fa-content($fa-var-external-link); }
|
||||
.#{$fa-css-prefix}-external-link-alt:before { content: fa-content($fa-var-external-link-alt); }
|
||||
.#{$fa-css-prefix}-external-link-square:before { content: fa-content($fa-var-external-link-square); }
|
||||
.#{$fa-css-prefix}-external-link-square-alt:before { content: fa-content($fa-var-external-link-square-alt); }
|
||||
.#{$fa-css-prefix}-eye:before { content: fa-content($fa-var-eye); }
|
||||
.#{$fa-css-prefix}-eye-dropper:before { content: fa-content($fa-var-eye-dropper); }
|
||||
.#{$fa-css-prefix}-eye-slash:before { content: fa-content($fa-var-eye-slash); }
|
||||
.#{$fa-css-prefix}-facebook:before { content: fa-content($fa-var-facebook); }
|
||||
.#{$fa-css-prefix}-facebook-f:before { content: fa-content($fa-var-facebook-f); }
|
||||
.#{$fa-css-prefix}-facebook-messenger:before { content: fa-content($fa-var-facebook-messenger); }
|
||||
.#{$fa-css-prefix}-facebook-square:before { content: fa-content($fa-var-facebook-square); }
|
||||
.#{$fa-css-prefix}-fast-backward:before { content: fa-content($fa-var-fast-backward); }
|
||||
.#{$fa-css-prefix}-fast-forward:before { content: fa-content($fa-var-fast-forward); }
|
||||
.#{$fa-css-prefix}-fax:before { content: fa-content($fa-var-fax); }
|
||||
.#{$fa-css-prefix}-female:before { content: fa-content($fa-var-female); }
|
||||
.#{$fa-css-prefix}-fighter-jet:before { content: fa-content($fa-var-fighter-jet); }
|
||||
.#{$fa-css-prefix}-file:before { content: fa-content($fa-var-file); }
|
||||
.#{$fa-css-prefix}-file-alt:before { content: fa-content($fa-var-file-alt); }
|
||||
.#{$fa-css-prefix}-file-archive:before { content: fa-content($fa-var-file-archive); }
|
||||
.#{$fa-css-prefix}-file-audio:before { content: fa-content($fa-var-file-audio); }
|
||||
.#{$fa-css-prefix}-file-check:before { content: fa-content($fa-var-file-check); }
|
||||
.#{$fa-css-prefix}-file-code:before { content: fa-content($fa-var-file-code); }
|
||||
.#{$fa-css-prefix}-file-edit:before { content: fa-content($fa-var-file-edit); }
|
||||
.#{$fa-css-prefix}-file-excel:before { content: fa-content($fa-var-file-excel); }
|
||||
.#{$fa-css-prefix}-file-exclamation:before { content: fa-content($fa-var-file-exclamation); }
|
||||
.#{$fa-css-prefix}-file-image:before { content: fa-content($fa-var-file-image); }
|
||||
.#{$fa-css-prefix}-file-minus:before { content: fa-content($fa-var-file-minus); }
|
||||
.#{$fa-css-prefix}-file-pdf:before { content: fa-content($fa-var-file-pdf); }
|
||||
.#{$fa-css-prefix}-file-plus:before { content: fa-content($fa-var-file-plus); }
|
||||
.#{$fa-css-prefix}-file-powerpoint:before { content: fa-content($fa-var-file-powerpoint); }
|
||||
.#{$fa-css-prefix}-file-times:before { content: fa-content($fa-var-file-times); }
|
||||
.#{$fa-css-prefix}-file-video:before { content: fa-content($fa-var-file-video); }
|
||||
.#{$fa-css-prefix}-file-word:before { content: fa-content($fa-var-file-word); }
|
||||
.#{$fa-css-prefix}-film:before { content: fa-content($fa-var-film); }
|
||||
.#{$fa-css-prefix}-film-alt:before { content: fa-content($fa-var-film-alt); }
|
||||
.#{$fa-css-prefix}-filter:before { content: fa-content($fa-var-filter); }
|
||||
.#{$fa-css-prefix}-fire:before { content: fa-content($fa-var-fire); }
|
||||
.#{$fa-css-prefix}-fire-extinguisher:before { content: fa-content($fa-var-fire-extinguisher); }
|
||||
.#{$fa-css-prefix}-firefox:before { content: fa-content($fa-var-firefox); }
|
||||
.#{$fa-css-prefix}-first-order:before { content: fa-content($fa-var-first-order); }
|
||||
.#{$fa-css-prefix}-firstdraft:before { content: fa-content($fa-var-firstdraft); }
|
||||
.#{$fa-css-prefix}-flag:before { content: fa-content($fa-var-flag); }
|
||||
.#{$fa-css-prefix}-flag-checkered:before { content: fa-content($fa-var-flag-checkered); }
|
||||
.#{$fa-css-prefix}-flask:before { content: fa-content($fa-var-flask); }
|
||||
.#{$fa-css-prefix}-flickr:before { content: fa-content($fa-var-flickr); }
|
||||
.#{$fa-css-prefix}-fly:before { content: fa-content($fa-var-fly); }
|
||||
.#{$fa-css-prefix}-folder:before { content: fa-content($fa-var-folder); }
|
||||
.#{$fa-css-prefix}-folder-open:before { content: fa-content($fa-var-folder-open); }
|
||||
.#{$fa-css-prefix}-font:before { content: fa-content($fa-var-font); }
|
||||
.#{$fa-css-prefix}-font-awesome:before { content: fa-content($fa-var-font-awesome); }
|
||||
.#{$fa-css-prefix}-font-awesome-alt:before { content: fa-content($fa-var-font-awesome-alt); }
|
||||
.#{$fa-css-prefix}-font-awesome-flag:before { content: fa-content($fa-var-font-awesome-flag); }
|
||||
.#{$fa-css-prefix}-fonticons:before { content: fa-content($fa-var-fonticons); }
|
||||
.#{$fa-css-prefix}-fonticons-fi:before { content: fa-content($fa-var-fonticons-fi); }
|
||||
.#{$fa-css-prefix}-fort-awesome:before { content: fa-content($fa-var-fort-awesome); }
|
||||
.#{$fa-css-prefix}-fort-awesome-alt:before { content: fa-content($fa-var-fort-awesome-alt); }
|
||||
.#{$fa-css-prefix}-forumbee:before { content: fa-content($fa-var-forumbee); }
|
||||
.#{$fa-css-prefix}-forward:before { content: fa-content($fa-var-forward); }
|
||||
.#{$fa-css-prefix}-foursquare:before { content: fa-content($fa-var-foursquare); }
|
||||
.#{$fa-css-prefix}-free-code-camp:before { content: fa-content($fa-var-free-code-camp); }
|
||||
.#{$fa-css-prefix}-freebsd:before { content: fa-content($fa-var-freebsd); }
|
||||
.#{$fa-css-prefix}-frown:before { content: fa-content($fa-var-frown); }
|
||||
.#{$fa-css-prefix}-futbol:before { content: fa-content($fa-var-futbol); }
|
||||
.#{$fa-css-prefix}-gamepad:before { content: fa-content($fa-var-gamepad); }
|
||||
.#{$fa-css-prefix}-gavel:before { content: fa-content($fa-var-gavel); }
|
||||
.#{$fa-css-prefix}-gem:before { content: fa-content($fa-var-gem); }
|
||||
.#{$fa-css-prefix}-genderless:before { content: fa-content($fa-var-genderless); }
|
||||
.#{$fa-css-prefix}-get-pocket:before { content: fa-content($fa-var-get-pocket); }
|
||||
.#{$fa-css-prefix}-gg:before { content: fa-content($fa-var-gg); }
|
||||
.#{$fa-css-prefix}-gg-circle:before { content: fa-content($fa-var-gg-circle); }
|
||||
.#{$fa-css-prefix}-gift:before { content: fa-content($fa-var-gift); }
|
||||
.#{$fa-css-prefix}-git:before { content: fa-content($fa-var-git); }
|
||||
.#{$fa-css-prefix}-git-square:before { content: fa-content($fa-var-git-square); }
|
||||
.#{$fa-css-prefix}-github:before { content: fa-content($fa-var-github); }
|
||||
.#{$fa-css-prefix}-github-alt:before { content: fa-content($fa-var-github-alt); }
|
||||
.#{$fa-css-prefix}-github-square:before { content: fa-content($fa-var-github-square); }
|
||||
.#{$fa-css-prefix}-gitkraken:before { content: fa-content($fa-var-gitkraken); }
|
||||
.#{$fa-css-prefix}-gitlab:before { content: fa-content($fa-var-gitlab); }
|
||||
.#{$fa-css-prefix}-gitter:before { content: fa-content($fa-var-gitter); }
|
||||
.#{$fa-css-prefix}-glass-martini:before { content: fa-content($fa-var-glass-martini); }
|
||||
.#{$fa-css-prefix}-glide:before { content: fa-content($fa-var-glide); }
|
||||
.#{$fa-css-prefix}-glide-g:before { content: fa-content($fa-var-glide-g); }
|
||||
.#{$fa-css-prefix}-globe:before { content: fa-content($fa-var-globe); }
|
||||
.#{$fa-css-prefix}-gofore:before { content: fa-content($fa-var-gofore); }
|
||||
.#{$fa-css-prefix}-goodreads:before { content: fa-content($fa-var-goodreads); }
|
||||
.#{$fa-css-prefix}-goodreads-g:before { content: fa-content($fa-var-goodreads-g); }
|
||||
.#{$fa-css-prefix}-google:before { content: fa-content($fa-var-google); }
|
||||
.#{$fa-css-prefix}-google-drive:before { content: fa-content($fa-var-google-drive); }
|
||||
.#{$fa-css-prefix}-google-play:before { content: fa-content($fa-var-google-play); }
|
||||
.#{$fa-css-prefix}-google-plus:before { content: fa-content($fa-var-google-plus); }
|
||||
.#{$fa-css-prefix}-google-plus-g:before { content: fa-content($fa-var-google-plus-g); }
|
||||
.#{$fa-css-prefix}-google-plus-square:before { content: fa-content($fa-var-google-plus-square); }
|
||||
.#{$fa-css-prefix}-google-wallet:before { content: fa-content($fa-var-google-wallet); }
|
||||
.#{$fa-css-prefix}-graduation-cap:before { content: fa-content($fa-var-graduation-cap); }
|
||||
.#{$fa-css-prefix}-gratipay:before { content: fa-content($fa-var-gratipay); }
|
||||
.#{$fa-css-prefix}-grav:before { content: fa-content($fa-var-grav); }
|
||||
.#{$fa-css-prefix}-gripfire:before { content: fa-content($fa-var-gripfire); }
|
||||
.#{$fa-css-prefix}-grunt:before { content: fa-content($fa-var-grunt); }
|
||||
.#{$fa-css-prefix}-gulp:before { content: fa-content($fa-var-gulp); }
|
||||
.#{$fa-css-prefix}-h-square:before { content: fa-content($fa-var-h-square); }
|
||||
.#{$fa-css-prefix}-h1:before { content: fa-content($fa-var-h1); }
|
||||
.#{$fa-css-prefix}-h2:before { content: fa-content($fa-var-h2); }
|
||||
.#{$fa-css-prefix}-h3:before { content: fa-content($fa-var-h3); }
|
||||
.#{$fa-css-prefix}-hacker-news:before { content: fa-content($fa-var-hacker-news); }
|
||||
.#{$fa-css-prefix}-hacker-news-square:before { content: fa-content($fa-var-hacker-news-square); }
|
||||
.#{$fa-css-prefix}-hand-lizard:before { content: fa-content($fa-var-hand-lizard); }
|
||||
.#{$fa-css-prefix}-hand-paper:before { content: fa-content($fa-var-hand-paper); }
|
||||
.#{$fa-css-prefix}-hand-peace:before { content: fa-content($fa-var-hand-peace); }
|
||||
.#{$fa-css-prefix}-hand-point-down:before { content: fa-content($fa-var-hand-point-down); }
|
||||
.#{$fa-css-prefix}-hand-point-left:before { content: fa-content($fa-var-hand-point-left); }
|
||||
.#{$fa-css-prefix}-hand-point-right:before { content: fa-content($fa-var-hand-point-right); }
|
||||
.#{$fa-css-prefix}-hand-point-up:before { content: fa-content($fa-var-hand-point-up); }
|
||||
.#{$fa-css-prefix}-hand-pointer:before { content: fa-content($fa-var-hand-pointer); }
|
||||
.#{$fa-css-prefix}-hand-rock:before { content: fa-content($fa-var-hand-rock); }
|
||||
.#{$fa-css-prefix}-hand-scissors:before { content: fa-content($fa-var-hand-scissors); }
|
||||
.#{$fa-css-prefix}-hand-spock:before { content: fa-content($fa-var-hand-spock); }
|
||||
.#{$fa-css-prefix}-handshake:before { content: fa-content($fa-var-handshake); }
|
||||
.#{$fa-css-prefix}-hashtag:before { content: fa-content($fa-var-hashtag); }
|
||||
.#{$fa-css-prefix}-hdd:before { content: fa-content($fa-var-hdd); }
|
||||
.#{$fa-css-prefix}-heading:before { content: fa-content($fa-var-heading); }
|
||||
.#{$fa-css-prefix}-headphones:before { content: fa-content($fa-var-headphones); }
|
||||
.#{$fa-css-prefix}-heart:before { content: fa-content($fa-var-heart); }
|
||||
.#{$fa-css-prefix}-heartbeat:before { content: fa-content($fa-var-heartbeat); }
|
||||
.#{$fa-css-prefix}-hexagon:before { content: fa-content($fa-var-hexagon); }
|
||||
.#{$fa-css-prefix}-hire-a-helper:before { content: fa-content($fa-var-hire-a-helper); }
|
||||
.#{$fa-css-prefix}-history:before { content: fa-content($fa-var-history); }
|
||||
.#{$fa-css-prefix}-home:before { content: fa-content($fa-var-home); }
|
||||
.#{$fa-css-prefix}-hooli:before { content: fa-content($fa-var-hooli); }
|
||||
.#{$fa-css-prefix}-hospital:before { content: fa-content($fa-var-hospital); }
|
||||
.#{$fa-css-prefix}-hotjar:before { content: fa-content($fa-var-hotjar); }
|
||||
.#{$fa-css-prefix}-hourglass:before { content: fa-content($fa-var-hourglass); }
|
||||
.#{$fa-css-prefix}-hourglass-end:before { content: fa-content($fa-var-hourglass-end); }
|
||||
.#{$fa-css-prefix}-hourglass-half:before { content: fa-content($fa-var-hourglass-half); }
|
||||
.#{$fa-css-prefix}-hourglass-start:before { content: fa-content($fa-var-hourglass-start); }
|
||||
.#{$fa-css-prefix}-houzz:before { content: fa-content($fa-var-houzz); }
|
||||
.#{$fa-css-prefix}-html5:before { content: fa-content($fa-var-html5); }
|
||||
.#{$fa-css-prefix}-hubspot:before { content: fa-content($fa-var-hubspot); }
|
||||
.#{$fa-css-prefix}-i-cursor:before { content: fa-content($fa-var-i-cursor); }
|
||||
.#{$fa-css-prefix}-id-badge:before { content: fa-content($fa-var-id-badge); }
|
||||
.#{$fa-css-prefix}-id-card:before { content: fa-content($fa-var-id-card); }
|
||||
.#{$fa-css-prefix}-image:before { content: fa-content($fa-var-image); }
|
||||
.#{$fa-css-prefix}-images:before { content: fa-content($fa-var-images); }
|
||||
.#{$fa-css-prefix}-imdb:before { content: fa-content($fa-var-imdb); }
|
||||
.#{$fa-css-prefix}-inbox:before { content: fa-content($fa-var-inbox); }
|
||||
.#{$fa-css-prefix}-inbox-in:before { content: fa-content($fa-var-inbox-in); }
|
||||
.#{$fa-css-prefix}-inbox-out:before { content: fa-content($fa-var-inbox-out); }
|
||||
.#{$fa-css-prefix}-indent:before { content: fa-content($fa-var-indent); }
|
||||
.#{$fa-css-prefix}-industry:before { content: fa-content($fa-var-industry); }
|
||||
.#{$fa-css-prefix}-industry-alt:before { content: fa-content($fa-var-industry-alt); }
|
||||
.#{$fa-css-prefix}-info:before { content: fa-content($fa-var-info); }
|
||||
.#{$fa-css-prefix}-info-circle:before { content: fa-content($fa-var-info-circle); }
|
||||
.#{$fa-css-prefix}-info-square:before { content: fa-content($fa-var-info-square); }
|
||||
.#{$fa-css-prefix}-instagram:before { content: fa-content($fa-var-instagram); }
|
||||
.#{$fa-css-prefix}-internet-explorer:before { content: fa-content($fa-var-internet-explorer); }
|
||||
.#{$fa-css-prefix}-ioxhost:before { content: fa-content($fa-var-ioxhost); }
|
||||
.#{$fa-css-prefix}-italic:before { content: fa-content($fa-var-italic); }
|
||||
.#{$fa-css-prefix}-itunes:before { content: fa-content($fa-var-itunes); }
|
||||
.#{$fa-css-prefix}-itunes-note:before { content: fa-content($fa-var-itunes-note); }
|
||||
.#{$fa-css-prefix}-jack-o-lantern:before { content: fa-content($fa-var-jack-o-lantern); }
|
||||
.#{$fa-css-prefix}-jenkins:before { content: fa-content($fa-var-jenkins); }
|
||||
.#{$fa-css-prefix}-joget:before { content: fa-content($fa-var-joget); }
|
||||
.#{$fa-css-prefix}-joomla:before { content: fa-content($fa-var-joomla); }
|
||||
.#{$fa-css-prefix}-js:before { content: fa-content($fa-var-js); }
|
||||
.#{$fa-css-prefix}-js-square:before { content: fa-content($fa-var-js-square); }
|
||||
.#{$fa-css-prefix}-jsfiddle:before { content: fa-content($fa-var-jsfiddle); }
|
||||
.#{$fa-css-prefix}-key:before { content: fa-content($fa-var-key); }
|
||||
.#{$fa-css-prefix}-keyboard:before { content: fa-content($fa-var-keyboard); }
|
||||
.#{$fa-css-prefix}-keycdn:before { content: fa-content($fa-var-keycdn); }
|
||||
.#{$fa-css-prefix}-kickstarter:before { content: fa-content($fa-var-kickstarter); }
|
||||
.#{$fa-css-prefix}-kickstarter-k:before { content: fa-content($fa-var-kickstarter-k); }
|
||||
.#{$fa-css-prefix}-korvue:before { content: fa-content($fa-var-korvue); }
|
||||
.#{$fa-css-prefix}-language:before { content: fa-content($fa-var-language); }
|
||||
.#{$fa-css-prefix}-laptop:before { content: fa-content($fa-var-laptop); }
|
||||
.#{$fa-css-prefix}-laravel:before { content: fa-content($fa-var-laravel); }
|
||||
.#{$fa-css-prefix}-lastfm:before { content: fa-content($fa-var-lastfm); }
|
||||
.#{$fa-css-prefix}-lastfm-square:before { content: fa-content($fa-var-lastfm-square); }
|
||||
.#{$fa-css-prefix}-leaf:before { content: fa-content($fa-var-leaf); }
|
||||
.#{$fa-css-prefix}-leanpub:before { content: fa-content($fa-var-leanpub); }
|
||||
.#{$fa-css-prefix}-lemon:before { content: fa-content($fa-var-lemon); }
|
||||
.#{$fa-css-prefix}-less:before { content: fa-content($fa-var-less); }
|
||||
.#{$fa-css-prefix}-level-down:before { content: fa-content($fa-var-level-down); }
|
||||
.#{$fa-css-prefix}-level-down-alt:before { content: fa-content($fa-var-level-down-alt); }
|
||||
.#{$fa-css-prefix}-level-up:before { content: fa-content($fa-var-level-up); }
|
||||
.#{$fa-css-prefix}-level-up-alt:before { content: fa-content($fa-var-level-up-alt); }
|
||||
.#{$fa-css-prefix}-life-ring:before { content: fa-content($fa-var-life-ring); }
|
||||
.#{$fa-css-prefix}-lightbulb:before { content: fa-content($fa-var-lightbulb); }
|
||||
.#{$fa-css-prefix}-line:before { content: fa-content($fa-var-line); }
|
||||
.#{$fa-css-prefix}-link:before { content: fa-content($fa-var-link); }
|
||||
.#{$fa-css-prefix}-linkedin:before { content: fa-content($fa-var-linkedin); }
|
||||
.#{$fa-css-prefix}-linkedin-in:before { content: fa-content($fa-var-linkedin-in); }
|
||||
.#{$fa-css-prefix}-linode:before { content: fa-content($fa-var-linode); }
|
||||
.#{$fa-css-prefix}-linux:before { content: fa-content($fa-var-linux); }
|
||||
.#{$fa-css-prefix}-lira-sign:before { content: fa-content($fa-var-lira-sign); }
|
||||
.#{$fa-css-prefix}-list:before { content: fa-content($fa-var-list); }
|
||||
.#{$fa-css-prefix}-list-alt:before { content: fa-content($fa-var-list-alt); }
|
||||
.#{$fa-css-prefix}-list-ol:before { content: fa-content($fa-var-list-ol); }
|
||||
.#{$fa-css-prefix}-list-ul:before { content: fa-content($fa-var-list-ul); }
|
||||
.#{$fa-css-prefix}-location-arrow:before { content: fa-content($fa-var-location-arrow); }
|
||||
.#{$fa-css-prefix}-lock:before { content: fa-content($fa-var-lock); }
|
||||
.#{$fa-css-prefix}-lock-alt:before { content: fa-content($fa-var-lock-alt); }
|
||||
.#{$fa-css-prefix}-lock-open:before { content: fa-content($fa-var-lock-open); }
|
||||
.#{$fa-css-prefix}-lock-open-alt:before { content: fa-content($fa-var-lock-open-alt); }
|
||||
.#{$fa-css-prefix}-long-arrow-alt-down:before { content: fa-content($fa-var-long-arrow-alt-down); }
|
||||
.#{$fa-css-prefix}-long-arrow-alt-left:before { content: fa-content($fa-var-long-arrow-alt-left); }
|
||||
.#{$fa-css-prefix}-long-arrow-alt-right:before { content: fa-content($fa-var-long-arrow-alt-right); }
|
||||
.#{$fa-css-prefix}-long-arrow-alt-up:before { content: fa-content($fa-var-long-arrow-alt-up); }
|
||||
.#{$fa-css-prefix}-long-arrow-down:before { content: fa-content($fa-var-long-arrow-down); }
|
||||
.#{$fa-css-prefix}-long-arrow-left:before { content: fa-content($fa-var-long-arrow-left); }
|
||||
.#{$fa-css-prefix}-long-arrow-right:before { content: fa-content($fa-var-long-arrow-right); }
|
||||
.#{$fa-css-prefix}-long-arrow-up:before { content: fa-content($fa-var-long-arrow-up); }
|
||||
.#{$fa-css-prefix}-low-vision:before { content: fa-content($fa-var-low-vision); }
|
||||
.#{$fa-css-prefix}-lyft:before { content: fa-content($fa-var-lyft); }
|
||||
.#{$fa-css-prefix}-magento:before { content: fa-content($fa-var-magento); }
|
||||
.#{$fa-css-prefix}-magic:before { content: fa-content($fa-var-magic); }
|
||||
.#{$fa-css-prefix}-magnet:before { content: fa-content($fa-var-magnet); }
|
||||
.#{$fa-css-prefix}-male:before { content: fa-content($fa-var-male); }
|
||||
.#{$fa-css-prefix}-map:before { content: fa-content($fa-var-map); }
|
||||
.#{$fa-css-prefix}-map-marker:before { content: fa-content($fa-var-map-marker); }
|
||||
.#{$fa-css-prefix}-map-marker-alt:before { content: fa-content($fa-var-map-marker-alt); }
|
||||
.#{$fa-css-prefix}-map-pin:before { content: fa-content($fa-var-map-pin); }
|
||||
.#{$fa-css-prefix}-map-signs:before { content: fa-content($fa-var-map-signs); }
|
||||
.#{$fa-css-prefix}-mars:before { content: fa-content($fa-var-mars); }
|
||||
.#{$fa-css-prefix}-mars-double:before { content: fa-content($fa-var-mars-double); }
|
||||
.#{$fa-css-prefix}-mars-stroke:before { content: fa-content($fa-var-mars-stroke); }
|
||||
.#{$fa-css-prefix}-mars-stroke-h:before { content: fa-content($fa-var-mars-stroke-h); }
|
||||
.#{$fa-css-prefix}-mars-stroke-v:before { content: fa-content($fa-var-mars-stroke-v); }
|
||||
.#{$fa-css-prefix}-maxcdn:before { content: fa-content($fa-var-maxcdn); }
|
||||
.#{$fa-css-prefix}-medapps:before { content: fa-content($fa-var-medapps); }
|
||||
.#{$fa-css-prefix}-medium:before { content: fa-content($fa-var-medium); }
|
||||
.#{$fa-css-prefix}-medium-m:before { content: fa-content($fa-var-medium-m); }
|
||||
.#{$fa-css-prefix}-medkit:before { content: fa-content($fa-var-medkit); }
|
||||
.#{$fa-css-prefix}-medrt:before { content: fa-content($fa-var-medrt); }
|
||||
.#{$fa-css-prefix}-meetup:before { content: fa-content($fa-var-meetup); }
|
||||
.#{$fa-css-prefix}-meh:before { content: fa-content($fa-var-meh); }
|
||||
.#{$fa-css-prefix}-mercury:before { content: fa-content($fa-var-mercury); }
|
||||
.#{$fa-css-prefix}-microchip:before { content: fa-content($fa-var-microchip); }
|
||||
.#{$fa-css-prefix}-microphone:before { content: fa-content($fa-var-microphone); }
|
||||
.#{$fa-css-prefix}-microphone-alt:before { content: fa-content($fa-var-microphone-alt); }
|
||||
.#{$fa-css-prefix}-microphone-slash:before { content: fa-content($fa-var-microphone-slash); }
|
||||
.#{$fa-css-prefix}-microsoft:before { content: fa-content($fa-var-microsoft); }
|
||||
.#{$fa-css-prefix}-minus:before { content: fa-content($fa-var-minus); }
|
||||
.#{$fa-css-prefix}-minus-circle:before { content: fa-content($fa-var-minus-circle); }
|
||||
.#{$fa-css-prefix}-minus-hexagon:before { content: fa-content($fa-var-minus-hexagon); }
|
||||
.#{$fa-css-prefix}-minus-octagon:before { content: fa-content($fa-var-minus-octagon); }
|
||||
.#{$fa-css-prefix}-minus-square:before { content: fa-content($fa-var-minus-square); }
|
||||
.#{$fa-css-prefix}-mix:before { content: fa-content($fa-var-mix); }
|
||||
.#{$fa-css-prefix}-mixcloud:before { content: fa-content($fa-var-mixcloud); }
|
||||
.#{$fa-css-prefix}-mizuni:before { content: fa-content($fa-var-mizuni); }
|
||||
.#{$fa-css-prefix}-mobile:before { content: fa-content($fa-var-mobile); }
|
||||
.#{$fa-css-prefix}-mobile-alt:before { content: fa-content($fa-var-mobile-alt); }
|
||||
.#{$fa-css-prefix}-mobile-android:before { content: fa-content($fa-var-mobile-android); }
|
||||
.#{$fa-css-prefix}-mobile-android-alt:before { content: fa-content($fa-var-mobile-android-alt); }
|
||||
.#{$fa-css-prefix}-modx:before { content: fa-content($fa-var-modx); }
|
||||
.#{$fa-css-prefix}-monero:before { content: fa-content($fa-var-monero); }
|
||||
.#{$fa-css-prefix}-money-bill:before { content: fa-content($fa-var-money-bill); }
|
||||
.#{$fa-css-prefix}-money-bill-alt:before { content: fa-content($fa-var-money-bill-alt); }
|
||||
.#{$fa-css-prefix}-moon:before { content: fa-content($fa-var-moon); }
|
||||
.#{$fa-css-prefix}-motorcycle:before { content: fa-content($fa-var-motorcycle); }
|
||||
.#{$fa-css-prefix}-mouse-pointer:before { content: fa-content($fa-var-mouse-pointer); }
|
||||
.#{$fa-css-prefix}-music:before { content: fa-content($fa-var-music); }
|
||||
.#{$fa-css-prefix}-napster:before { content: fa-content($fa-var-napster); }
|
||||
.#{$fa-css-prefix}-neuter:before { content: fa-content($fa-var-neuter); }
|
||||
.#{$fa-css-prefix}-newspaper:before { content: fa-content($fa-var-newspaper); }
|
||||
.#{$fa-css-prefix}-nintendo-switch:before { content: fa-content($fa-var-nintendo-switch); }
|
||||
.#{$fa-css-prefix}-node:before { content: fa-content($fa-var-node); }
|
||||
.#{$fa-css-prefix}-node-js:before { content: fa-content($fa-var-node-js); }
|
||||
.#{$fa-css-prefix}-npm:before { content: fa-content($fa-var-npm); }
|
||||
.#{$fa-css-prefix}-ns8:before { content: fa-content($fa-var-ns8); }
|
||||
.#{$fa-css-prefix}-nutritionix:before { content: fa-content($fa-var-nutritionix); }
|
||||
.#{$fa-css-prefix}-object-group:before { content: fa-content($fa-var-object-group); }
|
||||
.#{$fa-css-prefix}-object-ungroup:before { content: fa-content($fa-var-object-ungroup); }
|
||||
.#{$fa-css-prefix}-octagon:before { content: fa-content($fa-var-octagon); }
|
||||
.#{$fa-css-prefix}-odnoklassniki:before { content: fa-content($fa-var-odnoklassniki); }
|
||||
.#{$fa-css-prefix}-odnoklassniki-square:before { content: fa-content($fa-var-odnoklassniki-square); }
|
||||
.#{$fa-css-prefix}-opencart:before { content: fa-content($fa-var-opencart); }
|
||||
.#{$fa-css-prefix}-openid:before { content: fa-content($fa-var-openid); }
|
||||
.#{$fa-css-prefix}-opera:before { content: fa-content($fa-var-opera); }
|
||||
.#{$fa-css-prefix}-optin-monster:before { content: fa-content($fa-var-optin-monster); }
|
||||
.#{$fa-css-prefix}-osi:before { content: fa-content($fa-var-osi); }
|
||||
.#{$fa-css-prefix}-outdent:before { content: fa-content($fa-var-outdent); }
|
||||
.#{$fa-css-prefix}-page4:before { content: fa-content($fa-var-page4); }
|
||||
.#{$fa-css-prefix}-pagelines:before { content: fa-content($fa-var-pagelines); }
|
||||
.#{$fa-css-prefix}-paint-brush:before { content: fa-content($fa-var-paint-brush); }
|
||||
.#{$fa-css-prefix}-palfed:before { content: fa-content($fa-var-palfed); }
|
||||
.#{$fa-css-prefix}-paper-plane:before { content: fa-content($fa-var-paper-plane); }
|
||||
.#{$fa-css-prefix}-paperclip:before { content: fa-content($fa-var-paperclip); }
|
||||
.#{$fa-css-prefix}-paragraph:before { content: fa-content($fa-var-paragraph); }
|
||||
.#{$fa-css-prefix}-paste:before { content: fa-content($fa-var-paste); }
|
||||
.#{$fa-css-prefix}-patreon:before { content: fa-content($fa-var-patreon); }
|
||||
.#{$fa-css-prefix}-pause:before { content: fa-content($fa-var-pause); }
|
||||
.#{$fa-css-prefix}-pause-circle:before { content: fa-content($fa-var-pause-circle); }
|
||||
.#{$fa-css-prefix}-paw:before { content: fa-content($fa-var-paw); }
|
||||
.#{$fa-css-prefix}-paypal:before { content: fa-content($fa-var-paypal); }
|
||||
.#{$fa-css-prefix}-pen:before { content: fa-content($fa-var-pen); }
|
||||
.#{$fa-css-prefix}-pen-alt:before { content: fa-content($fa-var-pen-alt); }
|
||||
.#{$fa-css-prefix}-pen-square:before { content: fa-content($fa-var-pen-square); }
|
||||
.#{$fa-css-prefix}-pencil:before { content: fa-content($fa-var-pencil); }
|
||||
.#{$fa-css-prefix}-pencil-alt:before { content: fa-content($fa-var-pencil-alt); }
|
||||
.#{$fa-css-prefix}-percent:before { content: fa-content($fa-var-percent); }
|
||||
.#{$fa-css-prefix}-periscope:before { content: fa-content($fa-var-periscope); }
|
||||
.#{$fa-css-prefix}-phabricator:before { content: fa-content($fa-var-phabricator); }
|
||||
.#{$fa-css-prefix}-phoenix-framework:before { content: fa-content($fa-var-phoenix-framework); }
|
||||
.#{$fa-css-prefix}-phone:before { content: fa-content($fa-var-phone); }
|
||||
.#{$fa-css-prefix}-phone-slash:before { content: fa-content($fa-var-phone-slash); }
|
||||
.#{$fa-css-prefix}-phone-square:before { content: fa-content($fa-var-phone-square); }
|
||||
.#{$fa-css-prefix}-phone-volume:before { content: fa-content($fa-var-phone-volume); }
|
||||
.#{$fa-css-prefix}-pied-piper:before { content: fa-content($fa-var-pied-piper); }
|
||||
.#{$fa-css-prefix}-pied-piper-alt:before { content: fa-content($fa-var-pied-piper-alt); }
|
||||
.#{$fa-css-prefix}-pied-piper-pp:before { content: fa-content($fa-var-pied-piper-pp); }
|
||||
.#{$fa-css-prefix}-pinterest:before { content: fa-content($fa-var-pinterest); }
|
||||
.#{$fa-css-prefix}-pinterest-p:before { content: fa-content($fa-var-pinterest-p); }
|
||||
.#{$fa-css-prefix}-pinterest-square:before { content: fa-content($fa-var-pinterest-square); }
|
||||
.#{$fa-css-prefix}-plane:before { content: fa-content($fa-var-plane); }
|
||||
.#{$fa-css-prefix}-plane-alt:before { content: fa-content($fa-var-plane-alt); }
|
||||
.#{$fa-css-prefix}-play:before { content: fa-content($fa-var-play); }
|
||||
.#{$fa-css-prefix}-play-circle:before { content: fa-content($fa-var-play-circle); }
|
||||
.#{$fa-css-prefix}-playstation:before { content: fa-content($fa-var-playstation); }
|
||||
.#{$fa-css-prefix}-plug:before { content: fa-content($fa-var-plug); }
|
||||
.#{$fa-css-prefix}-plus:before { content: fa-content($fa-var-plus); }
|
||||
.#{$fa-css-prefix}-plus-circle:before { content: fa-content($fa-var-plus-circle); }
|
||||
.#{$fa-css-prefix}-plus-hexagon:before { content: fa-content($fa-var-plus-hexagon); }
|
||||
.#{$fa-css-prefix}-plus-octagon:before { content: fa-content($fa-var-plus-octagon); }
|
||||
.#{$fa-css-prefix}-plus-square:before { content: fa-content($fa-var-plus-square); }
|
||||
.#{$fa-css-prefix}-podcast:before { content: fa-content($fa-var-podcast); }
|
||||
.#{$fa-css-prefix}-poo:before { content: fa-content($fa-var-poo); }
|
||||
.#{$fa-css-prefix}-portrait:before { content: fa-content($fa-var-portrait); }
|
||||
.#{$fa-css-prefix}-pound-sign:before { content: fa-content($fa-var-pound-sign); }
|
||||
.#{$fa-css-prefix}-power-off:before { content: fa-content($fa-var-power-off); }
|
||||
.#{$fa-css-prefix}-print:before { content: fa-content($fa-var-print); }
|
||||
.#{$fa-css-prefix}-product-hunt:before { content: fa-content($fa-var-product-hunt); }
|
||||
.#{$fa-css-prefix}-pushed:before { content: fa-content($fa-var-pushed); }
|
||||
.#{$fa-css-prefix}-puzzle-piece:before { content: fa-content($fa-var-puzzle-piece); }
|
||||
.#{$fa-css-prefix}-python:before { content: fa-content($fa-var-python); }
|
||||
.#{$fa-css-prefix}-qq:before { content: fa-content($fa-var-qq); }
|
||||
.#{$fa-css-prefix}-qrcode:before { content: fa-content($fa-var-qrcode); }
|
||||
.#{$fa-css-prefix}-question:before { content: fa-content($fa-var-question); }
|
||||
.#{$fa-css-prefix}-question-circle:before { content: fa-content($fa-var-question-circle); }
|
||||
.#{$fa-css-prefix}-question-square:before { content: fa-content($fa-var-question-square); }
|
||||
.#{$fa-css-prefix}-quora:before { content: fa-content($fa-var-quora); }
|
||||
.#{$fa-css-prefix}-quote-left:before { content: fa-content($fa-var-quote-left); }
|
||||
.#{$fa-css-prefix}-quote-right:before { content: fa-content($fa-var-quote-right); }
|
||||
.#{$fa-css-prefix}-random:before { content: fa-content($fa-var-random); }
|
||||
.#{$fa-css-prefix}-ravelry:before { content: fa-content($fa-var-ravelry); }
|
||||
.#{$fa-css-prefix}-react:before { content: fa-content($fa-var-react); }
|
||||
.#{$fa-css-prefix}-rebel:before { content: fa-content($fa-var-rebel); }
|
||||
.#{$fa-css-prefix}-rectangle-landscape:before { content: fa-content($fa-var-rectangle-landscape); }
|
||||
.#{$fa-css-prefix}-rectangle-portrait:before { content: fa-content($fa-var-rectangle-portrait); }
|
||||
.#{$fa-css-prefix}-rectangle-wide:before { content: fa-content($fa-var-rectangle-wide); }
|
||||
.#{$fa-css-prefix}-recycle:before { content: fa-content($fa-var-recycle); }
|
||||
.#{$fa-css-prefix}-red-river:before { content: fa-content($fa-var-red-river); }
|
||||
.#{$fa-css-prefix}-reddit:before { content: fa-content($fa-var-reddit); }
|
||||
.#{$fa-css-prefix}-reddit-alien:before { content: fa-content($fa-var-reddit-alien); }
|
||||
.#{$fa-css-prefix}-reddit-square:before { content: fa-content($fa-var-reddit-square); }
|
||||
.#{$fa-css-prefix}-redo:before { content: fa-content($fa-var-redo); }
|
||||
.#{$fa-css-prefix}-redo-alt:before { content: fa-content($fa-var-redo-alt); }
|
||||
.#{$fa-css-prefix}-registered:before { content: fa-content($fa-var-registered); }
|
||||
.#{$fa-css-prefix}-rendact:before { content: fa-content($fa-var-rendact); }
|
||||
.#{$fa-css-prefix}-renren:before { content: fa-content($fa-var-renren); }
|
||||
.#{$fa-css-prefix}-repeat:before { content: fa-content($fa-var-repeat); }
|
||||
.#{$fa-css-prefix}-repeat-1:before { content: fa-content($fa-var-repeat-1); }
|
||||
.#{$fa-css-prefix}-repeat-1-alt:before { content: fa-content($fa-var-repeat-1-alt); }
|
||||
.#{$fa-css-prefix}-repeat-alt:before { content: fa-content($fa-var-repeat-alt); }
|
||||
.#{$fa-css-prefix}-reply:before { content: fa-content($fa-var-reply); }
|
||||
.#{$fa-css-prefix}-reply-all:before { content: fa-content($fa-var-reply-all); }
|
||||
.#{$fa-css-prefix}-replyd:before { content: fa-content($fa-var-replyd); }
|
||||
.#{$fa-css-prefix}-resolving:before { content: fa-content($fa-var-resolving); }
|
||||
.#{$fa-css-prefix}-retweet:before { content: fa-content($fa-var-retweet); }
|
||||
.#{$fa-css-prefix}-retweet-alt:before { content: fa-content($fa-var-retweet-alt); }
|
||||
.#{$fa-css-prefix}-road:before { content: fa-content($fa-var-road); }
|
||||
.#{$fa-css-prefix}-rocket:before { content: fa-content($fa-var-rocket); }
|
||||
.#{$fa-css-prefix}-rocketchat:before { content: fa-content($fa-var-rocketchat); }
|
||||
.#{$fa-css-prefix}-rockrms:before { content: fa-content($fa-var-rockrms); }
|
||||
.#{$fa-css-prefix}-rss:before { content: fa-content($fa-var-rss); }
|
||||
.#{$fa-css-prefix}-rss-square:before { content: fa-content($fa-var-rss-square); }
|
||||
.#{$fa-css-prefix}-ruble-sign:before { content: fa-content($fa-var-ruble-sign); }
|
||||
.#{$fa-css-prefix}-rupee-sign:before { content: fa-content($fa-var-rupee-sign); }
|
||||
.#{$fa-css-prefix}-safari:before { content: fa-content($fa-var-safari); }
|
||||
.#{$fa-css-prefix}-sass:before { content: fa-content($fa-var-sass); }
|
||||
.#{$fa-css-prefix}-save:before { content: fa-content($fa-var-save); }
|
||||
.#{$fa-css-prefix}-schlix:before { content: fa-content($fa-var-schlix); }
|
||||
.#{$fa-css-prefix}-scribd:before { content: fa-content($fa-var-scribd); }
|
||||
.#{$fa-css-prefix}-scrubber:before { content: fa-content($fa-var-scrubber); }
|
||||
.#{$fa-css-prefix}-search:before { content: fa-content($fa-var-search); }
|
||||
.#{$fa-css-prefix}-search-minus:before { content: fa-content($fa-var-search-minus); }
|
||||
.#{$fa-css-prefix}-search-plus:before { content: fa-content($fa-var-search-plus); }
|
||||
.#{$fa-css-prefix}-searchengin:before { content: fa-content($fa-var-searchengin); }
|
||||
.#{$fa-css-prefix}-sellcast:before { content: fa-content($fa-var-sellcast); }
|
||||
.#{$fa-css-prefix}-sellsy:before { content: fa-content($fa-var-sellsy); }
|
||||
.#{$fa-css-prefix}-server:before { content: fa-content($fa-var-server); }
|
||||
.#{$fa-css-prefix}-servicestack:before { content: fa-content($fa-var-servicestack); }
|
||||
.#{$fa-css-prefix}-share:before { content: fa-content($fa-var-share); }
|
||||
.#{$fa-css-prefix}-share-all:before { content: fa-content($fa-var-share-all); }
|
||||
.#{$fa-css-prefix}-share-alt:before { content: fa-content($fa-var-share-alt); }
|
||||
.#{$fa-css-prefix}-share-alt-square:before { content: fa-content($fa-var-share-alt-square); }
|
||||
.#{$fa-css-prefix}-share-square:before { content: fa-content($fa-var-share-square); }
|
||||
.#{$fa-css-prefix}-shekel-sign:before { content: fa-content($fa-var-shekel-sign); }
|
||||
.#{$fa-css-prefix}-shield:before { content: fa-content($fa-var-shield); }
|
||||
.#{$fa-css-prefix}-shield-alt:before { content: fa-content($fa-var-shield-alt); }
|
||||
.#{$fa-css-prefix}-shield-check:before { content: fa-content($fa-var-shield-check); }
|
||||
.#{$fa-css-prefix}-ship:before { content: fa-content($fa-var-ship); }
|
||||
.#{$fa-css-prefix}-shirtsinbulk:before { content: fa-content($fa-var-shirtsinbulk); }
|
||||
.#{$fa-css-prefix}-shopping-bag:before { content: fa-content($fa-var-shopping-bag); }
|
||||
.#{$fa-css-prefix}-shopping-basket:before { content: fa-content($fa-var-shopping-basket); }
|
||||
.#{$fa-css-prefix}-shopping-cart:before { content: fa-content($fa-var-shopping-cart); }
|
||||
.#{$fa-css-prefix}-shower:before { content: fa-content($fa-var-shower); }
|
||||
.#{$fa-css-prefix}-sign-in:before { content: fa-content($fa-var-sign-in); }
|
||||
.#{$fa-css-prefix}-sign-in-alt:before { content: fa-content($fa-var-sign-in-alt); }
|
||||
.#{$fa-css-prefix}-sign-language:before { content: fa-content($fa-var-sign-language); }
|
||||
.#{$fa-css-prefix}-sign-out:before { content: fa-content($fa-var-sign-out); }
|
||||
.#{$fa-css-prefix}-sign-out-alt:before { content: fa-content($fa-var-sign-out-alt); }
|
||||
.#{$fa-css-prefix}-signal:before { content: fa-content($fa-var-signal); }
|
||||
.#{$fa-css-prefix}-simplybuilt:before { content: fa-content($fa-var-simplybuilt); }
|
||||
.#{$fa-css-prefix}-sistrix:before { content: fa-content($fa-var-sistrix); }
|
||||
.#{$fa-css-prefix}-sitemap:before { content: fa-content($fa-var-sitemap); }
|
||||
.#{$fa-css-prefix}-skyatlas:before { content: fa-content($fa-var-skyatlas); }
|
||||
.#{$fa-css-prefix}-skype:before { content: fa-content($fa-var-skype); }
|
||||
.#{$fa-css-prefix}-slack:before { content: fa-content($fa-var-slack); }
|
||||
.#{$fa-css-prefix}-slack-hash:before { content: fa-content($fa-var-slack-hash); }
|
||||
.#{$fa-css-prefix}-sliders-h:before { content: fa-content($fa-var-sliders-h); }
|
||||
.#{$fa-css-prefix}-sliders-h-square:before { content: fa-content($fa-var-sliders-h-square); }
|
||||
.#{$fa-css-prefix}-sliders-v:before { content: fa-content($fa-var-sliders-v); }
|
||||
.#{$fa-css-prefix}-sliders-v-square:before { content: fa-content($fa-var-sliders-v-square); }
|
||||
.#{$fa-css-prefix}-slideshare:before { content: fa-content($fa-var-slideshare); }
|
||||
.#{$fa-css-prefix}-smile:before { content: fa-content($fa-var-smile); }
|
||||
.#{$fa-css-prefix}-snapchat:before { content: fa-content($fa-var-snapchat); }
|
||||
.#{$fa-css-prefix}-snapchat-ghost:before { content: fa-content($fa-var-snapchat-ghost); }
|
||||
.#{$fa-css-prefix}-snapchat-square:before { content: fa-content($fa-var-snapchat-square); }
|
||||
.#{$fa-css-prefix}-snowflake:before { content: fa-content($fa-var-snowflake); }
|
||||
.#{$fa-css-prefix}-sort:before { content: fa-content($fa-var-sort); }
|
||||
.#{$fa-css-prefix}-sort-alpha-down:before { content: fa-content($fa-var-sort-alpha-down); }
|
||||
.#{$fa-css-prefix}-sort-alpha-up:before { content: fa-content($fa-var-sort-alpha-up); }
|
||||
.#{$fa-css-prefix}-sort-amount-down:before { content: fa-content($fa-var-sort-amount-down); }
|
||||
.#{$fa-css-prefix}-sort-amount-up:before { content: fa-content($fa-var-sort-amount-up); }
|
||||
.#{$fa-css-prefix}-sort-down:before { content: fa-content($fa-var-sort-down); }
|
||||
.#{$fa-css-prefix}-sort-numeric-down:before { content: fa-content($fa-var-sort-numeric-down); }
|
||||
.#{$fa-css-prefix}-sort-numeric-up:before { content: fa-content($fa-var-sort-numeric-up); }
|
||||
.#{$fa-css-prefix}-sort-up:before { content: fa-content($fa-var-sort-up); }
|
||||
.#{$fa-css-prefix}-soundcloud:before { content: fa-content($fa-var-soundcloud); }
|
||||
.#{$fa-css-prefix}-space-shuttle:before { content: fa-content($fa-var-space-shuttle); }
|
||||
.#{$fa-css-prefix}-spade:before { content: fa-content($fa-var-spade); }
|
||||
.#{$fa-css-prefix}-speakap:before { content: fa-content($fa-var-speakap); }
|
||||
.#{$fa-css-prefix}-spinner:before { content: fa-content($fa-var-spinner); }
|
||||
.#{$fa-css-prefix}-spinner-third:before { content: fa-content($fa-var-spinner-third); }
|
||||
.#{$fa-css-prefix}-spotify:before { content: fa-content($fa-var-spotify); }
|
||||
.#{$fa-css-prefix}-square:before { content: fa-content($fa-var-square); }
|
||||
.#{$fa-css-prefix}-stack-exchange:before { content: fa-content($fa-var-stack-exchange); }
|
||||
.#{$fa-css-prefix}-stack-overflow:before { content: fa-content($fa-var-stack-overflow); }
|
||||
.#{$fa-css-prefix}-star:before { content: fa-content($fa-var-star); }
|
||||
.#{$fa-css-prefix}-star-exclamation:before { content: fa-content($fa-var-star-exclamation); }
|
||||
.#{$fa-css-prefix}-star-half:before { content: fa-content($fa-var-star-half); }
|
||||
.#{$fa-css-prefix}-staylinked:before { content: fa-content($fa-var-staylinked); }
|
||||
.#{$fa-css-prefix}-steam:before { content: fa-content($fa-var-steam); }
|
||||
.#{$fa-css-prefix}-steam-square:before { content: fa-content($fa-var-steam-square); }
|
||||
.#{$fa-css-prefix}-steam-symbol:before { content: fa-content($fa-var-steam-symbol); }
|
||||
.#{$fa-css-prefix}-step-backward:before { content: fa-content($fa-var-step-backward); }
|
||||
.#{$fa-css-prefix}-step-forward:before { content: fa-content($fa-var-step-forward); }
|
||||
.#{$fa-css-prefix}-stethoscope:before { content: fa-content($fa-var-stethoscope); }
|
||||
.#{$fa-css-prefix}-sticker-mule:before { content: fa-content($fa-var-sticker-mule); }
|
||||
.#{$fa-css-prefix}-sticky-note:before { content: fa-content($fa-var-sticky-note); }
|
||||
.#{$fa-css-prefix}-stop:before { content: fa-content($fa-var-stop); }
|
||||
.#{$fa-css-prefix}-stop-circle:before { content: fa-content($fa-var-stop-circle); }
|
||||
.#{$fa-css-prefix}-stopwatch:before { content: fa-content($fa-var-stopwatch); }
|
||||
.#{$fa-css-prefix}-strava:before { content: fa-content($fa-var-strava); }
|
||||
.#{$fa-css-prefix}-street-view:before { content: fa-content($fa-var-street-view); }
|
||||
.#{$fa-css-prefix}-strikethrough:before { content: fa-content($fa-var-strikethrough); }
|
||||
.#{$fa-css-prefix}-stripe:before { content: fa-content($fa-var-stripe); }
|
||||
.#{$fa-css-prefix}-stripe-s:before { content: fa-content($fa-var-stripe-s); }
|
||||
.#{$fa-css-prefix}-studiovinari:before { content: fa-content($fa-var-studiovinari); }
|
||||
.#{$fa-css-prefix}-stumbleupon:before { content: fa-content($fa-var-stumbleupon); }
|
||||
.#{$fa-css-prefix}-stumbleupon-circle:before { content: fa-content($fa-var-stumbleupon-circle); }
|
||||
.#{$fa-css-prefix}-subscript:before { content: fa-content($fa-var-subscript); }
|
||||
.#{$fa-css-prefix}-subway:before { content: fa-content($fa-var-subway); }
|
||||
.#{$fa-css-prefix}-suitcase:before { content: fa-content($fa-var-suitcase); }
|
||||
.#{$fa-css-prefix}-sun:before { content: fa-content($fa-var-sun); }
|
||||
.#{$fa-css-prefix}-superpowers:before { content: fa-content($fa-var-superpowers); }
|
||||
.#{$fa-css-prefix}-superscript:before { content: fa-content($fa-var-superscript); }
|
||||
.#{$fa-css-prefix}-supple:before { content: fa-content($fa-var-supple); }
|
||||
.#{$fa-css-prefix}-sync:before { content: fa-content($fa-var-sync); }
|
||||
.#{$fa-css-prefix}-sync-alt:before { content: fa-content($fa-var-sync-alt); }
|
||||
.#{$fa-css-prefix}-table:before { content: fa-content($fa-var-table); }
|
||||
.#{$fa-css-prefix}-tablet:before { content: fa-content($fa-var-tablet); }
|
||||
.#{$fa-css-prefix}-tablet-alt:before { content: fa-content($fa-var-tablet-alt); }
|
||||
.#{$fa-css-prefix}-tablet-android:before { content: fa-content($fa-var-tablet-android); }
|
||||
.#{$fa-css-prefix}-tablet-android-alt:before { content: fa-content($fa-var-tablet-android-alt); }
|
||||
.#{$fa-css-prefix}-tachometer:before { content: fa-content($fa-var-tachometer); }
|
||||
.#{$fa-css-prefix}-tachometer-alt:before { content: fa-content($fa-var-tachometer-alt); }
|
||||
.#{$fa-css-prefix}-tag:before { content: fa-content($fa-var-tag); }
|
||||
.#{$fa-css-prefix}-tags:before { content: fa-content($fa-var-tags); }
|
||||
.#{$fa-css-prefix}-tasks:before { content: fa-content($fa-var-tasks); }
|
||||
.#{$fa-css-prefix}-taxi:before { content: fa-content($fa-var-taxi); }
|
||||
.#{$fa-css-prefix}-telegram:before { content: fa-content($fa-var-telegram); }
|
||||
.#{$fa-css-prefix}-telegram-plane:before { content: fa-content($fa-var-telegram-plane); }
|
||||
.#{$fa-css-prefix}-tencent-weibo:before { content: fa-content($fa-var-tencent-weibo); }
|
||||
.#{$fa-css-prefix}-terminal:before { content: fa-content($fa-var-terminal); }
|
||||
.#{$fa-css-prefix}-text-height:before { content: fa-content($fa-var-text-height); }
|
||||
.#{$fa-css-prefix}-text-width:before { content: fa-content($fa-var-text-width); }
|
||||
.#{$fa-css-prefix}-th:before { content: fa-content($fa-var-th); }
|
||||
.#{$fa-css-prefix}-th-large:before { content: fa-content($fa-var-th-large); }
|
||||
.#{$fa-css-prefix}-th-list:before { content: fa-content($fa-var-th-list); }
|
||||
.#{$fa-css-prefix}-themeisle:before { content: fa-content($fa-var-themeisle); }
|
||||
.#{$fa-css-prefix}-thermometer-empty:before { content: fa-content($fa-var-thermometer-empty); }
|
||||
.#{$fa-css-prefix}-thermometer-full:before { content: fa-content($fa-var-thermometer-full); }
|
||||
.#{$fa-css-prefix}-thermometer-half:before { content: fa-content($fa-var-thermometer-half); }
|
||||
.#{$fa-css-prefix}-thermometer-quarter:before { content: fa-content($fa-var-thermometer-quarter); }
|
||||
.#{$fa-css-prefix}-thermometer-three-quarters:before { content: fa-content($fa-var-thermometer-three-quarters); }
|
||||
.#{$fa-css-prefix}-thumbs-down:before { content: fa-content($fa-var-thumbs-down); }
|
||||
.#{$fa-css-prefix}-thumbs-up:before { content: fa-content($fa-var-thumbs-up); }
|
||||
.#{$fa-css-prefix}-thumbtack:before { content: fa-content($fa-var-thumbtack); }
|
||||
.#{$fa-css-prefix}-ticket:before { content: fa-content($fa-var-ticket); }
|
||||
.#{$fa-css-prefix}-ticket-alt:before { content: fa-content($fa-var-ticket-alt); }
|
||||
.#{$fa-css-prefix}-times:before { content: fa-content($fa-var-times); }
|
||||
.#{$fa-css-prefix}-times-circle:before { content: fa-content($fa-var-times-circle); }
|
||||
.#{$fa-css-prefix}-times-hexagon:before { content: fa-content($fa-var-times-hexagon); }
|
||||
.#{$fa-css-prefix}-times-octagon:before { content: fa-content($fa-var-times-octagon); }
|
||||
.#{$fa-css-prefix}-times-square:before { content: fa-content($fa-var-times-square); }
|
||||
.#{$fa-css-prefix}-tint:before { content: fa-content($fa-var-tint); }
|
||||
.#{$fa-css-prefix}-toggle-off:before { content: fa-content($fa-var-toggle-off); }
|
||||
.#{$fa-css-prefix}-toggle-on:before { content: fa-content($fa-var-toggle-on); }
|
||||
.#{$fa-css-prefix}-trademark:before { content: fa-content($fa-var-trademark); }
|
||||
.#{$fa-css-prefix}-train:before { content: fa-content($fa-var-train); }
|
||||
.#{$fa-css-prefix}-transgender:before { content: fa-content($fa-var-transgender); }
|
||||
.#{$fa-css-prefix}-transgender-alt:before { content: fa-content($fa-var-transgender-alt); }
|
||||
.#{$fa-css-prefix}-trash:before { content: fa-content($fa-var-trash); }
|
||||
.#{$fa-css-prefix}-trash-alt:before { content: fa-content($fa-var-trash-alt); }
|
||||
.#{$fa-css-prefix}-tree:before { content: fa-content($fa-var-tree); }
|
||||
.#{$fa-css-prefix}-tree-alt:before { content: fa-content($fa-var-tree-alt); }
|
||||
.#{$fa-css-prefix}-trello:before { content: fa-content($fa-var-trello); }
|
||||
.#{$fa-css-prefix}-triangle:before { content: fa-content($fa-var-triangle); }
|
||||
.#{$fa-css-prefix}-tripadvisor:before { content: fa-content($fa-var-tripadvisor); }
|
||||
.#{$fa-css-prefix}-trophy:before { content: fa-content($fa-var-trophy); }
|
||||
.#{$fa-css-prefix}-trophy-alt:before { content: fa-content($fa-var-trophy-alt); }
|
||||
.#{$fa-css-prefix}-truck:before { content: fa-content($fa-var-truck); }
|
||||
.#{$fa-css-prefix}-tty:before { content: fa-content($fa-var-tty); }
|
||||
.#{$fa-css-prefix}-tumblr:before { content: fa-content($fa-var-tumblr); }
|
||||
.#{$fa-css-prefix}-tumblr-square:before { content: fa-content($fa-var-tumblr-square); }
|
||||
.#{$fa-css-prefix}-tv:before { content: fa-content($fa-var-tv); }
|
||||
.#{$fa-css-prefix}-tv-retro:before { content: fa-content($fa-var-tv-retro); }
|
||||
.#{$fa-css-prefix}-twitch:before { content: fa-content($fa-var-twitch); }
|
||||
.#{$fa-css-prefix}-twitter:before { content: fa-content($fa-var-twitter); }
|
||||
.#{$fa-css-prefix}-twitter-square:before { content: fa-content($fa-var-twitter-square); }
|
||||
.#{$fa-css-prefix}-typo3:before { content: fa-content($fa-var-typo3); }
|
||||
.#{$fa-css-prefix}-uber:before { content: fa-content($fa-var-uber); }
|
||||
.#{$fa-css-prefix}-uikit:before { content: fa-content($fa-var-uikit); }
|
||||
.#{$fa-css-prefix}-umbrella:before { content: fa-content($fa-var-umbrella); }
|
||||
.#{$fa-css-prefix}-underline:before { content: fa-content($fa-var-underline); }
|
||||
.#{$fa-css-prefix}-undo:before { content: fa-content($fa-var-undo); }
|
||||
.#{$fa-css-prefix}-undo-alt:before { content: fa-content($fa-var-undo-alt); }
|
||||
.#{$fa-css-prefix}-uniregistry:before { content: fa-content($fa-var-uniregistry); }
|
||||
.#{$fa-css-prefix}-universal-access:before { content: fa-content($fa-var-universal-access); }
|
||||
.#{$fa-css-prefix}-university:before { content: fa-content($fa-var-university); }
|
||||
.#{$fa-css-prefix}-unlink:before { content: fa-content($fa-var-unlink); }
|
||||
.#{$fa-css-prefix}-unlock:before { content: fa-content($fa-var-unlock); }
|
||||
.#{$fa-css-prefix}-unlock-alt:before { content: fa-content($fa-var-unlock-alt); }
|
||||
.#{$fa-css-prefix}-untappd:before { content: fa-content($fa-var-untappd); }
|
||||
.#{$fa-css-prefix}-upload:before { content: fa-content($fa-var-upload); }
|
||||
.#{$fa-css-prefix}-usb:before { content: fa-content($fa-var-usb); }
|
||||
.#{$fa-css-prefix}-usd-circle:before { content: fa-content($fa-var-usd-circle); }
|
||||
.#{$fa-css-prefix}-usd-square:before { content: fa-content($fa-var-usd-square); }
|
||||
.#{$fa-css-prefix}-user:before { content: fa-content($fa-var-user); }
|
||||
.#{$fa-css-prefix}-user-alt:before { content: fa-content($fa-var-user-alt); }
|
||||
.#{$fa-css-prefix}-user-circle:before { content: fa-content($fa-var-user-circle); }
|
||||
.#{$fa-css-prefix}-user-md:before { content: fa-content($fa-var-user-md); }
|
||||
.#{$fa-css-prefix}-user-plus:before { content: fa-content($fa-var-user-plus); }
|
||||
.#{$fa-css-prefix}-user-secret:before { content: fa-content($fa-var-user-secret); }
|
||||
.#{$fa-css-prefix}-user-times:before { content: fa-content($fa-var-user-times); }
|
||||
.#{$fa-css-prefix}-users:before { content: fa-content($fa-var-users); }
|
||||
.#{$fa-css-prefix}-ussunnah:before { content: fa-content($fa-var-ussunnah); }
|
||||
.#{$fa-css-prefix}-utensil-fork:before { content: fa-content($fa-var-utensil-fork); }
|
||||
.#{$fa-css-prefix}-utensil-knife:before { content: fa-content($fa-var-utensil-knife); }
|
||||
.#{$fa-css-prefix}-utensil-spoon:before { content: fa-content($fa-var-utensil-spoon); }
|
||||
.#{$fa-css-prefix}-utensils:before { content: fa-content($fa-var-utensils); }
|
||||
.#{$fa-css-prefix}-utensils-alt:before { content: fa-content($fa-var-utensils-alt); }
|
||||
.#{$fa-css-prefix}-vaadin:before { content: fa-content($fa-var-vaadin); }
|
||||
.#{$fa-css-prefix}-venus:before { content: fa-content($fa-var-venus); }
|
||||
.#{$fa-css-prefix}-venus-double:before { content: fa-content($fa-var-venus-double); }
|
||||
.#{$fa-css-prefix}-venus-mars:before { content: fa-content($fa-var-venus-mars); }
|
||||
.#{$fa-css-prefix}-viacoin:before { content: fa-content($fa-var-viacoin); }
|
||||
.#{$fa-css-prefix}-viadeo:before { content: fa-content($fa-var-viadeo); }
|
||||
.#{$fa-css-prefix}-viadeo-square:before { content: fa-content($fa-var-viadeo-square); }
|
||||
.#{$fa-css-prefix}-viber:before { content: fa-content($fa-var-viber); }
|
||||
.#{$fa-css-prefix}-video:before { content: fa-content($fa-var-video); }
|
||||
.#{$fa-css-prefix}-vimeo:before { content: fa-content($fa-var-vimeo); }
|
||||
.#{$fa-css-prefix}-vimeo-square:before { content: fa-content($fa-var-vimeo-square); }
|
||||
.#{$fa-css-prefix}-vimeo-v:before { content: fa-content($fa-var-vimeo-v); }
|
||||
.#{$fa-css-prefix}-vine:before { content: fa-content($fa-var-vine); }
|
||||
.#{$fa-css-prefix}-vk:before { content: fa-content($fa-var-vk); }
|
||||
.#{$fa-css-prefix}-vnv:before { content: fa-content($fa-var-vnv); }
|
||||
.#{$fa-css-prefix}-volume-down:before { content: fa-content($fa-var-volume-down); }
|
||||
.#{$fa-css-prefix}-volume-mute:before { content: fa-content($fa-var-volume-mute); }
|
||||
.#{$fa-css-prefix}-volume-off:before { content: fa-content($fa-var-volume-off); }
|
||||
.#{$fa-css-prefix}-volume-up:before { content: fa-content($fa-var-volume-up); }
|
||||
.#{$fa-css-prefix}-vuejs:before { content: fa-content($fa-var-vuejs); }
|
||||
.#{$fa-css-prefix}-watch:before { content: fa-content($fa-var-watch); }
|
||||
.#{$fa-css-prefix}-weibo:before { content: fa-content($fa-var-weibo); }
|
||||
.#{$fa-css-prefix}-weixin:before { content: fa-content($fa-var-weixin); }
|
||||
.#{$fa-css-prefix}-whatsapp:before { content: fa-content($fa-var-whatsapp); }
|
||||
.#{$fa-css-prefix}-whatsapp-square:before { content: fa-content($fa-var-whatsapp-square); }
|
||||
.#{$fa-css-prefix}-wheelchair:before { content: fa-content($fa-var-wheelchair); }
|
||||
.#{$fa-css-prefix}-whmcs:before { content: fa-content($fa-var-whmcs); }
|
||||
.#{$fa-css-prefix}-wifi:before { content: fa-content($fa-var-wifi); }
|
||||
.#{$fa-css-prefix}-wikipedia-w:before { content: fa-content($fa-var-wikipedia-w); }
|
||||
.#{$fa-css-prefix}-window:before { content: fa-content($fa-var-window); }
|
||||
.#{$fa-css-prefix}-window-alt:before { content: fa-content($fa-var-window-alt); }
|
||||
.#{$fa-css-prefix}-window-close:before { content: fa-content($fa-var-window-close); }
|
||||
.#{$fa-css-prefix}-window-maximize:before { content: fa-content($fa-var-window-maximize); }
|
||||
.#{$fa-css-prefix}-window-minimize:before { content: fa-content($fa-var-window-minimize); }
|
||||
.#{$fa-css-prefix}-window-restore:before { content: fa-content($fa-var-window-restore); }
|
||||
.#{$fa-css-prefix}-windows:before { content: fa-content($fa-var-windows); }
|
||||
.#{$fa-css-prefix}-won-sign:before { content: fa-content($fa-var-won-sign); }
|
||||
.#{$fa-css-prefix}-wordpress:before { content: fa-content($fa-var-wordpress); }
|
||||
.#{$fa-css-prefix}-wordpress-simple:before { content: fa-content($fa-var-wordpress-simple); }
|
||||
.#{$fa-css-prefix}-wpbeginner:before { content: fa-content($fa-var-wpbeginner); }
|
||||
.#{$fa-css-prefix}-wpexplorer:before { content: fa-content($fa-var-wpexplorer); }
|
||||
.#{$fa-css-prefix}-wpforms:before { content: fa-content($fa-var-wpforms); }
|
||||
.#{$fa-css-prefix}-wrench:before { content: fa-content($fa-var-wrench); }
|
||||
.#{$fa-css-prefix}-xbox:before { content: fa-content($fa-var-xbox); }
|
||||
.#{$fa-css-prefix}-xing:before { content: fa-content($fa-var-xing); }
|
||||
.#{$fa-css-prefix}-xing-square:before { content: fa-content($fa-var-xing-square); }
|
||||
.#{$fa-css-prefix}-y-combinator:before { content: fa-content($fa-var-y-combinator); }
|
||||
.#{$fa-css-prefix}-yahoo:before { content: fa-content($fa-var-yahoo); }
|
||||
.#{$fa-css-prefix}-yandex:before { content: fa-content($fa-var-yandex); }
|
||||
.#{$fa-css-prefix}-yandex-international:before { content: fa-content($fa-var-yandex-international); }
|
||||
.#{$fa-css-prefix}-yelp:before { content: fa-content($fa-var-yelp); }
|
||||
.#{$fa-css-prefix}-yen-sign:before { content: fa-content($fa-var-yen-sign); }
|
||||
.#{$fa-css-prefix}-yoast:before { content: fa-content($fa-var-yoast); }
|
||||
.#{$fa-css-prefix}-youtube:before { content: fa-content($fa-var-youtube); }
|
||||
23
resources/assets/sass/fontawesome/_larger.scss
vendored
@@ -1,23 +0,0 @@
|
||||
// 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: -.0667em;
|
||||
}
|
||||
|
||||
.#{$fa-css-prefix}-xs {
|
||||
font-size: .75em;
|
||||
}
|
||||
|
||||
.#{$fa-css-prefix}-sm {
|
||||
font-size: .875em;
|
||||
}
|
||||
|
||||
@for $i from 1 through 10 {
|
||||
.#{$fa-css-prefix}-#{$i}x {
|
||||
font-size: $i * 1em;
|
||||
}
|
||||
}
|
||||
18
resources/assets/sass/fontawesome/_list.scss
vendored
@@ -1,18 +0,0 @@
|
||||
// List Icons
|
||||
// -------------------------
|
||||
|
||||
.#{$fa-css-prefix}-ul {
|
||||
list-style-type: none;
|
||||
margin-left: $fa-li-width * 5/4;
|
||||
padding-left: 0;
|
||||
|
||||
> li { position: relative; }
|
||||
}
|
||||
|
||||
.#{$fa-css-prefix}-li {
|
||||
left: -$fa-li-width;
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
width: $fa-li-width;
|
||||
line-height: inherit;
|
||||
}
|
||||
57
resources/assets/sass/fontawesome/_mixins.scss
vendored
@@ -1,57 +0,0 @@
|
||||
// Mixins
|
||||
// --------------------------
|
||||
|
||||
@mixin fa-icon {
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
display: inline-block;
|
||||
font-style: normal;
|
||||
font-variant: normal;
|
||||
font-weight: normal;
|
||||
line-height: 1;
|
||||
vertical-align: -15%;
|
||||
}
|
||||
|
||||
@mixin fa-icon-rotate($degrees, $rotation) {
|
||||
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})";
|
||||
transform: rotate($degrees);
|
||||
}
|
||||
|
||||
@mixin fa-icon-flip($horiz, $vert, $rotation) {
|
||||
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)";
|
||||
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 {
|
||||
border: 0;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
height: 1px;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
}
|
||||
|
||||
// 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 {
|
||||
clip: auto;
|
||||
height: auto;
|
||||
margin: 0;
|
||||
overflow: visible;
|
||||
position: static;
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||