big commit
This commit is contained in:
parent
ef45c2668d
commit
6bb9643df1
36 changed files with 1882 additions and 1612 deletions
6
.gitignore
vendored
6
.gitignore
vendored
|
@ -42,10 +42,8 @@ local.properties
|
|||
|
||||
errors.log
|
||||
_sakura/config/config.ini
|
||||
content/images/avatars/*
|
||||
!content/images/avatars/.htaccess
|
||||
content/images/backgrounds/*
|
||||
!content/images/backgrounds/.htaccess
|
||||
content/images/user/*
|
||||
!content/images/user/.htaccess
|
||||
BingSiteAuth.xml
|
||||
google*.html
|
||||
main/logs/*
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
# Disallow external connections
|
||||
|
||||
# Apache <= 2.2
|
||||
<IfModule !mod_authz_core.c>
|
||||
Order deny,allow
|
||||
deny from all
|
||||
</IfModule>
|
||||
|
||||
# Apache 2.4 =>
|
||||
<IfModule mod_authz_core.c>
|
||||
Require all denied
|
||||
</IfModule>
|
13
_sakura/cache/.htaccess
vendored
Normal file → Executable file
13
_sakura/cache/.htaccess
vendored
Normal file → Executable file
|
@ -1,12 +1 @@
|
|||
# Disallow external connections
|
||||
|
||||
# Apache <= 2.2
|
||||
<IfModule !mod_authz_core.c>
|
||||
Order deny,allow
|
||||
deny from all
|
||||
</IfModule>
|
||||
|
||||
# Apache 2.4 =>
|
||||
<IfModule mod_authz_core.c>
|
||||
Require all denied
|
||||
</IfModule>
|
||||
#
|
||||
|
|
|
@ -16,7 +16,10 @@
|
|||
"20150524",
|
||||
"20150525",
|
||||
"20150526",
|
||||
"20150529"
|
||||
"20150529",
|
||||
"20150530",
|
||||
"20150602",
|
||||
"20150604"
|
||||
|
||||
]
|
||||
|
||||
|
@ -1205,6 +1208,49 @@
|
|||
"change": "Added permission checking functions."
|
||||
}
|
||||
|
||||
],
|
||||
|
||||
"20150530": [
|
||||
|
||||
{
|
||||
"type": "ADD",
|
||||
"change": "Compress Yuuno back to one CSS file again."
|
||||
},
|
||||
{
|
||||
"type": "UPD",
|
||||
"change": "Added configuration option to enable template caching."
|
||||
},
|
||||
{
|
||||
"type": "FIX",
|
||||
"change": "Fixed logged out users inherit permission strings from random user groups."
|
||||
},
|
||||
{
|
||||
"type": "FIX",
|
||||
"change": "Removed old deactivation checking method."
|
||||
}
|
||||
|
||||
],
|
||||
|
||||
"20150602": [
|
||||
|
||||
{
|
||||
"type": "ADD",
|
||||
"change": "Added JSON indentation/pretty printing function."
|
||||
}
|
||||
|
||||
],
|
||||
|
||||
"20150604": [
|
||||
|
||||
{
|
||||
"type": "UPD",
|
||||
"change": "Redid some of the users table structure."
|
||||
},
|
||||
{
|
||||
"type": "ADD",
|
||||
"change": "Add /header to profile for spooky things."
|
||||
}
|
||||
|
||||
]
|
||||
|
||||
}
|
||||
|
|
|
@ -5,6 +5,9 @@
|
|||
|
||||
namespace Sakura;
|
||||
|
||||
use Parsedown;
|
||||
use PHPMailer;
|
||||
|
||||
class Main {
|
||||
|
||||
public static $_MD; // Markdown class container
|
||||
|
@ -46,7 +49,7 @@ class Main {
|
|||
// Initialise Parsedown
|
||||
private static function initMD() {
|
||||
|
||||
self::$_MD = new \Parsedown();
|
||||
self::$_MD = new Parsedown();
|
||||
|
||||
}
|
||||
|
||||
|
@ -65,7 +68,7 @@ class Main {
|
|||
|
||||
// In the highly unlikely case that it failed to get anything forge a false
|
||||
if(!$resp)
|
||||
return array('success' => false, 'error-codes' => array('Could not connect to the ReCAPTCHA server.'));
|
||||
return false;
|
||||
|
||||
// Decode the response JSON from the servers
|
||||
$resp = json_decode($resp, true);
|
||||
|
@ -124,7 +127,7 @@ class Main {
|
|||
public static function sendMail($to, $subject, $body) {
|
||||
|
||||
// Initialise PHPMailer
|
||||
$mail = new \PHPMailer();
|
||||
$mail = new PHPMailer();
|
||||
|
||||
// Set to SMTP
|
||||
$mail->IsSMTP();
|
||||
|
@ -556,17 +559,94 @@ class Main {
|
|||
|
||||
}
|
||||
|
||||
// Convert a number to a hexadecimal value
|
||||
public static function toHex($num) {
|
||||
// Indent JSON
|
||||
public static function jsonIndent($json) {
|
||||
|
||||
// Convert $num to an int if not yet
|
||||
$num = intval($num);
|
||||
// Defines
|
||||
$tab = ' ';
|
||||
$out = '';
|
||||
$lvl = 0;
|
||||
$str = false;
|
||||
$obj = json_decode($json);
|
||||
|
||||
// Check if it's within the proper range
|
||||
if($num < 0 || $num > 255)
|
||||
return 00;
|
||||
// Validate the object
|
||||
if($obj === false)
|
||||
return false;
|
||||
|
||||
|
||||
// Re-encode the json and get the length
|
||||
$json = json_encode($obj);
|
||||
$len = strlen($json);
|
||||
|
||||
// Go over the entries
|
||||
for($c = 0; $c < $len; $c++) {
|
||||
|
||||
// Get the current character
|
||||
$char = $json[$c];
|
||||
|
||||
switch($char) {
|
||||
|
||||
case '[':
|
||||
case '{':
|
||||
if($str) {
|
||||
|
||||
$out .= $char;
|
||||
|
||||
} else {
|
||||
|
||||
$out .= $char ."\r\n". str_repeat($tab, $lvl + 1);
|
||||
$lvl++;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case ']':
|
||||
case '}':
|
||||
if($str) {
|
||||
|
||||
$out .= $char;
|
||||
|
||||
} else {
|
||||
|
||||
$lvl--;
|
||||
$out .= "\r\n". str_repeat($tab, $lvl) . $char;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case ',':
|
||||
if($str) {
|
||||
|
||||
$out .= $char;
|
||||
|
||||
} else {
|
||||
|
||||
$out .= ",\r\n". str_repeat($tab, $lvl);
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case ':':
|
||||
if($str) {
|
||||
|
||||
$out .= $char;
|
||||
|
||||
} else {
|
||||
|
||||
$out .= ": ";
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
$out .= $char;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Return the indented JSON
|
||||
return $out;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -7,6 +7,18 @@ namespace Sakura;
|
|||
|
||||
class Permissions {
|
||||
|
||||
// Fallback permission data
|
||||
private static $fallback = [
|
||||
|
||||
'rid' => 0,
|
||||
'uid' => 0,
|
||||
'siteperms' => '000000000000000000000000001',
|
||||
'manageperms' => '0',
|
||||
'forumperms' => '0',
|
||||
'rankinherit' => '111'
|
||||
|
||||
];
|
||||
|
||||
// Global permissions table
|
||||
protected static $permissions = [
|
||||
|
||||
|
@ -60,14 +72,20 @@ class Permissions {
|
|||
];
|
||||
|
||||
// Checking if a user has the permissions to do a thing
|
||||
public static function check($layer, $action, $perm) {
|
||||
public static function check($layer, $action, $operator, $mode = 0) {
|
||||
|
||||
// Check if the permission layer and the permission itself exists
|
||||
if(!array_key_exists($layer, self::$permissions) || !array_key_exists($action, self::$permission[$layer]))
|
||||
if(!array_key_exists($layer, self::$permissions) || !array_key_exists($action, self::$permissions[$layer]))
|
||||
return false;
|
||||
|
||||
// Convert to the appropiate mode
|
||||
if($mode === 2)
|
||||
$operator = self::getRankPermissions($operator)[$layer];
|
||||
elseif($mode === 1)
|
||||
$operator = self::getUserPermissions($operator)[$layer];
|
||||
|
||||
// Perform the bitwise AND
|
||||
if((bindec($perm) & self::$permission[$layer][$action]) != 0)
|
||||
if(bindec($operator) & self::$permissions[$layer][$action])
|
||||
return true;
|
||||
|
||||
// Else just return false
|
||||
|
@ -86,6 +104,10 @@ class Permissions {
|
|||
foreach($ranks as $rank)
|
||||
$getRanks[] = Database::fetch('permissions', false, ['rid' => [$rank, '='], 'uid' => [0 ,'=']]);
|
||||
|
||||
// Check if getRanks is empty or if the rank id is 0 return the fallback
|
||||
if(empty($getRanks) || in_array(0, $ranks))
|
||||
$getRanks = [self::$fallback];
|
||||
|
||||
// Go over the permission data
|
||||
foreach($getRanks as $rank) {
|
||||
|
||||
|
|
|
@ -5,6 +5,10 @@
|
|||
|
||||
namespace Sakura;
|
||||
|
||||
use Twig_Loader_Filesystem;
|
||||
use Twig_Environment;
|
||||
use Twig_Extension_StringLoader;
|
||||
|
||||
class Templates {
|
||||
|
||||
// Engine container, template folder name and options
|
||||
|
@ -41,17 +45,20 @@ class Templates {
|
|||
private static function twigLoader() {
|
||||
|
||||
// Initialise Twig Filesystem Loader
|
||||
$twigLoader = new \Twig_Loader_Filesystem(ROOT .'_sakura/templates/'. self::$_TPL);
|
||||
$twigLoader = new Twig_Loader_Filesystem(ROOT .'_sakura/templates/'. self::$_TPL);
|
||||
|
||||
// Environment variable
|
||||
$twigEnv = [];
|
||||
|
||||
// Enable caching
|
||||
if(Configuration::getConfig('enable_tpl_cache'))
|
||||
$twigEnv['cache'] = ROOT .'_sakura/cache';
|
||||
|
||||
// And now actually initialise the templating engine
|
||||
self::$_ENG = new \Twig_Environment($twigLoader, array(
|
||||
|
||||
// 'cache' => SATOKO_ROOT_DIRECTORY. self::getConfig('path', 'cache') // Set cache directory
|
||||
|
||||
));
|
||||
self::$_ENG = new Twig_Environment($twigLoader, $twigEnv);
|
||||
|
||||
// Load String template loader
|
||||
self::$_ENG->addExtension(new \Twig_Extension_StringLoader());
|
||||
self::$_ENG->addExtension(new Twig_Extension_StringLoader());
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -25,16 +25,13 @@ class Users {
|
|||
'register_ip' => '127.0.0.1',
|
||||
'last_ip' => '127.0.0.1',
|
||||
'usertitle' => 'Internal fallback account',
|
||||
'profile_md' => '',
|
||||
'avatar_url' => '',
|
||||
'background_url' => '',
|
||||
'regdate' => 0,
|
||||
'lastdate' => 0,
|
||||
'lastunamechange' => 0,
|
||||
'birthday' => '',
|
||||
'posts' => 0,
|
||||
'country' => 'EU',
|
||||
'profile_data' => '[]'
|
||||
'userData' => '[]'
|
||||
];
|
||||
|
||||
// Empty rank template
|
||||
|
@ -71,6 +68,10 @@ class Users {
|
|||
if(!$session = Session::checkSession($uid, $sid))
|
||||
return false;
|
||||
|
||||
// Check if the user is activated
|
||||
if(Permissions::check('SITE', 'DEACTIVATED', $uid, 1))
|
||||
return false;
|
||||
|
||||
// Extend the cookie times if the remember flag is set
|
||||
if($session == 2 && !$bypassCookies) {
|
||||
|
||||
|
@ -135,7 +136,7 @@ class Users {
|
|||
}
|
||||
|
||||
// Check if the user has the required privs to log in
|
||||
if(self::checkIfUserHasRanks([0, 1], $user, true))
|
||||
if(Permissions::check('SITE', 'DEACTIVATED', $user['id'], 1))
|
||||
return [0, 'NOT_ALLOWED'];
|
||||
|
||||
// Create a new session
|
||||
|
@ -259,7 +260,7 @@ class Users {
|
|||
'lastdate' => 0,
|
||||
'lastunamechange' => time(),
|
||||
'country' => Main::getCountryCode(),
|
||||
'profile_data' => '[]'
|
||||
'userData' => '[]'
|
||||
]);
|
||||
|
||||
// Get userid of the new user
|
||||
|
@ -307,9 +308,9 @@ class Users {
|
|||
if(count($user) < 2)
|
||||
return [0, 'USER_NOT_EXIST'];
|
||||
|
||||
// Check if the user is deactivated
|
||||
if(self::checkIfUserHasRanks([0, 1], $user, true))
|
||||
return [0, 'DEACTIVATED'];
|
||||
// Check if the user has the required privs to log in
|
||||
if(Permissions::check('SITE', 'DEACTIVATED', $user['id'], 1))
|
||||
return [0, 'NOT_ALLOWED'];
|
||||
|
||||
// Generate the verification key
|
||||
$verk = Main::newActionCode('LOST_PASS', $user['id'], [
|
||||
|
@ -349,9 +350,9 @@ class Users {
|
|||
// Get user data
|
||||
$user = Users::getUser(Session::$userId);
|
||||
|
||||
// Check if the user is deactivated
|
||||
if(self::checkIfUserHasRanks([0, 1], $user, true))
|
||||
return [0, 'DEACTIVATED'];
|
||||
// Check if the user has the required privs to log in
|
||||
if(Permissions::check('SITE', 'DEACTIVATED', $user['id'], 1))
|
||||
return [0, 'NOT_ALLOWED'];
|
||||
|
||||
// Check if the account is disabled
|
||||
if('nologin' == $user['password_algo'])
|
||||
|
@ -459,7 +460,7 @@ class Users {
|
|||
return [0, 'USER_NOT_EXIST'];
|
||||
|
||||
// Check if a user is activated
|
||||
if(!self::checkIfUserHasRanks([0, 1], $user, true))
|
||||
if(!Permissions::check('SITE', 'DEACTIVATED', $user['id'], 1))
|
||||
return [0, 'USER_ALREADY_ACTIVE'];
|
||||
|
||||
// Send activation e-mail
|
||||
|
@ -477,7 +478,7 @@ class Users {
|
|||
$user = Database::fetch('users', false, ['id' => [$uid, '=']]);
|
||||
|
||||
// User is already activated or doesn't even exist
|
||||
if(count($user) < 2 || !self::checkIfUserHasRanks([0, 1], $user, true))
|
||||
if(count($user) < 2 || !Permissions::check('SITE', 'DEACTIVATED', $user['id'], 1))
|
||||
return false;
|
||||
|
||||
// Generate activation key
|
||||
|
@ -521,7 +522,7 @@ class Users {
|
|||
return [0, 'USER_NOT_EXIST'];
|
||||
|
||||
// Check if user is already activated
|
||||
if(!self::checkIfUserHasRanks([0, 1], $user, true))
|
||||
if(!Permissions::check('SITE', 'DEACTIVATED', $user['id'], 1))
|
||||
return [0, 'USER_ALREADY_ACTIVE'];
|
||||
|
||||
// Set default values for activation
|
||||
|
@ -572,7 +573,7 @@ class Users {
|
|||
return [0, 'USER_NOT_EXIST'];
|
||||
|
||||
// Check if user is already deactivated
|
||||
if(self::checkIfUserHasRanks([0, 1], $user, true))
|
||||
if(Permissions::check('SITE', 'DEACTIVATED', $user['id'], 1))
|
||||
return [0, 'USER_ALREADY_DEACTIVE'];
|
||||
|
||||
// Deactivate the account
|
||||
|
@ -693,8 +694,22 @@ class Users {
|
|||
|
||||
}
|
||||
|
||||
// Getting the profile data array of a user
|
||||
public static function getUserProfileData($id, $inputIsUser = false) {
|
||||
|
||||
// Get user data
|
||||
$user = ($inputIsUser ? $id : self::getUser($id));
|
||||
|
||||
// Decode the userData json
|
||||
$data = json_decode($user['userData'], true);
|
||||
|
||||
// Return the profile data
|
||||
return $data;
|
||||
|
||||
}
|
||||
|
||||
// Get user's profile fields
|
||||
public static function getUserProfileData($id) {
|
||||
public static function getUserProfileFields($id, $inputIsData = false) {
|
||||
|
||||
// Get profile fields
|
||||
$profileFields = Database::fetch('profilefields');
|
||||
|
@ -703,15 +718,15 @@ class Users {
|
|||
if(!count($profileFields))
|
||||
return null;
|
||||
|
||||
// Get the profile data JSON from the specified user's profile
|
||||
$profileData = Database::fetch('users', false, ['id' => [$id, '=']]);
|
||||
// Assign the profileData variable
|
||||
$profileData = ($inputIsData ? $id : self::getUserProfileData($id));
|
||||
|
||||
// Once again if nothing was returned just return null
|
||||
if(count($profileData) < 2 || $profileData['profile_data'] == null || !count(json_decode($profileData['profile_data'], true)))
|
||||
if(count($profileData) < 1 || $profileData == null || empty($profileData['profileFields']))
|
||||
return null;
|
||||
|
||||
// Decode the profile_data json
|
||||
$profileData = json_decode($profileData['profile_data'], true);
|
||||
// Redeclare profileData
|
||||
$profileData = $profileData['profileFields'];
|
||||
|
||||
// Create output array
|
||||
$profile = [];
|
||||
|
@ -763,6 +778,39 @@ class Users {
|
|||
|
||||
}
|
||||
|
||||
// Getting the profile page of a user
|
||||
public static function getProfilePage($id, $inputIsData = false) {
|
||||
|
||||
// Check if the input is the data
|
||||
if($inputIsData) {
|
||||
|
||||
// Reassign data
|
||||
$data = $id;
|
||||
|
||||
} else {
|
||||
|
||||
// Get user data
|
||||
$user = self::getUser($id);
|
||||
|
||||
// Decode the userData json
|
||||
$data = json_decode($user['userData'], true);
|
||||
|
||||
}
|
||||
|
||||
// Check if the profilePage key exists
|
||||
if(!array_key_exists('profilePage', $data))
|
||||
return false;
|
||||
|
||||
// TODO: implement BBcodes
|
||||
|
||||
// Parse the markdown
|
||||
$profilePage = Main::mdParse(base64_decode($data['profilePage'][0]));
|
||||
|
||||
// Return the parsed profile page
|
||||
return $profilePage;
|
||||
|
||||
}
|
||||
|
||||
// Check if a user is online
|
||||
public static function checkUserOnline($id) {
|
||||
|
||||
|
@ -860,7 +908,7 @@ class Users {
|
|||
}
|
||||
|
||||
// Get users in rank
|
||||
public static function getUsersInRank($rankId, $users = null) {
|
||||
public static function getUsersInRank($rankId, $users = null, $excludeAbyss = true) {
|
||||
|
||||
// Get all users (or use the supplied user list to keep server load down)
|
||||
if(!$users)
|
||||
|
@ -873,7 +921,7 @@ class Users {
|
|||
foreach($users as $user) {
|
||||
|
||||
// If so store the user's row in the array
|
||||
if(self::checkIfUserHasRanks([$rankId], $user, true) && $user['password_algo'] != 'nologin')
|
||||
if(self::checkIfUserHasRanks([$rankId], $user, true) && ($excludeAbyss ? $user['password_algo'] != 'nologin' : true))
|
||||
$rank[] = $user;
|
||||
|
||||
}
|
||||
|
@ -900,7 +948,7 @@ class Users {
|
|||
continue;
|
||||
|
||||
// Skip if inactive and not include deactivated users
|
||||
if(!$includeInactive && self::checkIfUserHasRanks([0, 1], $user, true))
|
||||
if(!$includeInactive && Permissions::check('SITE', 'DEACTIVATED', $user['id'], 1))
|
||||
continue;
|
||||
|
||||
$users[$user['id']] = $user;
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
namespace Sakura;
|
||||
|
||||
// Define Sakura version
|
||||
define('SAKURA_VERSION', '20150529');
|
||||
define('SAKURA_VERSION', '20150604');
|
||||
define('SAKURA_VLABEL', 'Eminence');
|
||||
define('SAKURA_VTYPE', 'Development');
|
||||
define('SAKURA_COLOUR', '#6C3082');
|
||||
|
@ -51,6 +51,7 @@ ob_start(Configuration::getConfig('use_gzip') ? 'ob_gzhandler' : null);
|
|||
$renderData = [
|
||||
|
||||
'sakura' => [
|
||||
|
||||
'version' => SAKURA_VERSION,
|
||||
'vlabel' => SAKURA_VLABEL,
|
||||
'vtype' => SAKURA_VTYPE,
|
||||
|
@ -76,15 +77,26 @@ $renderData = [
|
|||
'minpwdentropy' => Configuration::getConfig('min_entropy'),
|
||||
'minusernamelength' => Configuration::getConfig('username_min_length'),
|
||||
'maxusernamelength' => Configuration::getConfig('username_max_length')
|
||||
|
||||
],
|
||||
|
||||
'perms' => [
|
||||
|
||||
'canUseChat' => Permissions::check('SITE', 'USE_CHAT', Session::$userId, 1),
|
||||
'canUseForums' => Permissions::check('FORUM', 'USE_FORUM', Session::$userId, 1)
|
||||
|
||||
],
|
||||
|
||||
'php' => [
|
||||
|
||||
'sessionid' => \session_id(),
|
||||
'time' => \time(),
|
||||
'self' => $_SERVER['PHP_SELF']
|
||||
|
||||
],
|
||||
|
||||
'user' => [
|
||||
|
||||
'checklogin' => Users::checkLogin(),
|
||||
'session' => Session::$sessionId,
|
||||
'data' => ($_init_udata = Users::getUser(Session::$userId)),
|
||||
|
|
|
@ -178,7 +178,9 @@
|
|||
<!-- Navigation menu, displayed on left side of the bar. -->
|
||||
<a class="menu-item" href="//{{ sakura.urls.main }}/" title="Return to the front page of Flashii">Home</a>
|
||||
<a class="menu-item" href="//{{ sakura.urls.main }}/news" title="Here you can read updates on Flashii">News</a>
|
||||
{% if perms.canUseChat %}
|
||||
<a class="menu-item" href="//{{ sakura.urls.chat }}/" title="Chat with other Flashii members">Chat</a>
|
||||
{% endif %}
|
||||
<a class="menu-item" href="//{{ sakura.urls.main }}/forum" title="Discuss things with other members but static">Forums</a>
|
||||
<a class="menu-item" href="//{{ sakura.urls.main }}/search" title="Search on Flashii">Search</a>
|
||||
{% if user.checklogin %}
|
||||
|
@ -240,3 +242,4 @@
|
|||
<p>A lot of things on this site require JavaScript to be enabled (e.g. the chat), we try to keep both sides happy but it is highly recommended that you enable it (you'll also have to deal with this message being here if you don't enable it).</p>
|
||||
</div>
|
||||
</noscript>
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
{% else %}
|
||||
<div id="userBackground"></div>
|
||||
<div class="content profile">
|
||||
<div class="{% if profile.profpage|length > 1 %}content-right {% endif %}content-column">
|
||||
<div class="{% if profile.profilePage|length > 1 %}content-right {% endif %}content-column">
|
||||
<div style="text-align: center;">
|
||||
<img src="/a/{{ profile.user.id }}" alt="{{ profile.user.username }}'s Avatar" class="default-avatar-setting" style="box-shadow: 0 3px 7px #{% if profile.online %}484{% else %}844{% endif %};" />
|
||||
<br /><span style="font-size: .8em;">{{ profile.ranktitle }}</span>
|
||||
|
@ -38,11 +38,11 @@
|
|||
<b>Last Seen on</b> {{ profile.user.lastdate|date("l Y-m-d H:i T") }}
|
||||
{% endif %}<br />
|
||||
<b>User has {% if not profile.user.posts %}no{% else %}{{ profile.user.posts }}{% endif %} forum post{% if profile.user.posts != 1 %}s{% endif %}.</b>
|
||||
{% if profile.data is not null %}
|
||||
{% if profile.fields is not null %}
|
||||
<hr class="default" />
|
||||
{% if user.checklogin %}
|
||||
<table style="width: 100%;">
|
||||
{% for name,field in profile.data %}
|
||||
{% for name,field in profile.fields %}
|
||||
<tr>
|
||||
<td style="text-align: left; font-weight: bold;">
|
||||
{{ field.name }}
|
||||
|
@ -82,12 +82,12 @@
|
|||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="content-left content-column markdown{% if profile.profpage|length < 1 %} hidden{% endif %}">
|
||||
{{ profile.profpage|raw }}
|
||||
<div class="content-left content-column markdown{% if profile.profilePage|length < 1 %} hidden{% endif %}">
|
||||
{{ profile.profilePage|raw }}
|
||||
</div>
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
{% if profile.user.background_url %}
|
||||
{% if profile.data.profileBackground %}
|
||||
<script type="text/javascript">
|
||||
initialiseParallax('userBackground');
|
||||
</script>
|
||||
|
|
|
@ -1,77 +0,0 @@
|
|||
/*
|
||||
* Authentication page Styling
|
||||
*/
|
||||
@charset "utf-8";
|
||||
|
||||
.loginPage {
|
||||
margin: 0 auto;
|
||||
max-width: 825px;
|
||||
}
|
||||
|
||||
.loginPage > .registerCont > *,
|
||||
.loginPage > .loginCont > * {
|
||||
text-align: center;
|
||||
border: 1px solid #9475B2;
|
||||
margin: 10px auto;
|
||||
padding: 2px 3px;
|
||||
width: 400px;
|
||||
border: 1px solid #9475B2;
|
||||
box-shadow: 0 0 3px #9475B2;
|
||||
border-radius: 3px;
|
||||
background: #D3BFFF;
|
||||
}
|
||||
|
||||
@media (max-width: 430px) {
|
||||
|
||||
.loginPage > .registerCont > *,
|
||||
.loginPage > .loginCont > * {
|
||||
width: 300px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.loginPage > .loginCont {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.loginPage > .registerCont {
|
||||
float: right;
|
||||
}
|
||||
|
||||
@media (max-width: 820px) {
|
||||
|
||||
.loginPage > .loginCont {
|
||||
float: none;
|
||||
}
|
||||
|
||||
.loginPage > .registerCont {
|
||||
float: none;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.loginPage .head {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.loginPage > div > form > div > input {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.loginPage input[type="text"],
|
||||
.loginPage input[type="password"] {
|
||||
width: calc(100% - 16px);
|
||||
}
|
||||
|
||||
.loginPage form > div > label {
|
||||
font-size: 20px;
|
||||
font-weight: 100;
|
||||
padding: 0 5px;
|
||||
line-height: 32px;
|
||||
color: #222;
|
||||
text-shadow: #888 0 0 3px;
|
||||
}
|
||||
|
||||
.loginPage .subLinks {
|
||||
font-size: 10px;
|
||||
}
|
|
@ -1,416 +0,0 @@
|
|||
/*
|
||||
* Standard Elements
|
||||
*/
|
||||
@charset "utf-8";
|
||||
|
||||
* {
|
||||
/* Reset margin and padding */
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
html {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
font: 12px/20px Verdana, sans-serif;
|
||||
background: linear-gradient(180deg, #C2AFFE, #FBEEFF) no-repeat scroll left top #FBEEFF;
|
||||
background-size: cover;
|
||||
color: #000;
|
||||
height: 100%;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#container {
|
||||
min-height: 100%;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#contentwrapper {
|
||||
padding-bottom: 220px;
|
||||
}
|
||||
|
||||
@media (max-width: 642px) {
|
||||
|
||||
#contentwrapper {
|
||||
padding-bottom: 335px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@media (max-width: 426px) {
|
||||
|
||||
#contentwrapper {
|
||||
padding-bottom: 450px;
|
||||
}
|
||||
|
||||
}
|
||||
@media (max-width: 400px) {
|
||||
|
||||
#contentwrapper {
|
||||
padding-bottom: 450px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@media (max-width: 300px) {
|
||||
|
||||
.footer {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#contentwrapper {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.clear {
|
||||
clear: both !important;
|
||||
float: none !important;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none !important;
|
||||
visibility: hidden !important;
|
||||
}
|
||||
|
||||
.centreAlign {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.leftAlign {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.rightAlign {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
font-family: "SegoeUI-Light", "Segoe UI", sans-serif;
|
||||
font-weight: 100;
|
||||
margin: 5px 0;
|
||||
}
|
||||
|
||||
h1.stylised {
|
||||
text-shadow: 0 0 5px #8364A1;
|
||||
color: #614390;
|
||||
}
|
||||
|
||||
hr.default {
|
||||
border: 0;
|
||||
height: 1px;
|
||||
color: #9475B2;
|
||||
background: #9475B2;
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
|
||||
img.default-avatar-setting {
|
||||
max-width: 200px;
|
||||
max-height: 200px;
|
||||
border: 3px solid #EEE;
|
||||
background: #EEE;
|
||||
box-shadow: 0 3px 7px #888;
|
||||
border-radius: 3px;
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
img.homepage-menu-avatar {
|
||||
float: right;
|
||||
max-width: 100px;
|
||||
max-width: 100px;
|
||||
margin-top: -25px;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
@media (max-width: 400px) {
|
||||
|
||||
img.homepage-menu-avatar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.standalone img:not(:hover) {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
a.clean,
|
||||
a.underline,
|
||||
a.no-underline {
|
||||
color: inherit !important;
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
a.underline:hover {
|
||||
text-decoration: underline !important;
|
||||
}
|
||||
|
||||
a.default {
|
||||
color: #22E;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a.default:hover {
|
||||
color: #22E;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
a.default:active {
|
||||
color: #E22;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
a.gotop {
|
||||
display: inline-block;
|
||||
background: #111;
|
||||
color: #FFF;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
border-radius: 5px;
|
||||
text-decoration: none;
|
||||
opacity: .3;
|
||||
transition: opacity .5s, box-shadow .5s;
|
||||
margin: 10px 5px;
|
||||
float: right;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
right: 5px;
|
||||
z-index: 2;
|
||||
line-height: 60px;
|
||||
text-align: center;
|
||||
font-size: 5em;
|
||||
text-shadow: 0 0 5px #FFF;
|
||||
}
|
||||
|
||||
a.gotop:hover {
|
||||
opacity: .8;
|
||||
box-shadow: 0 0 7px #FFF inset;
|
||||
text-shadow: 0 0 7px #FFF;
|
||||
}
|
||||
|
||||
a.gotop:active {
|
||||
box-shadow: 0 0 15px #FFF inset;
|
||||
text-shadow: 0 0 10px #FFF;
|
||||
opacity: .9;
|
||||
}
|
||||
|
||||
a.gotop.enter {
|
||||
animation: slideInFromRight 1 .6s;
|
||||
}
|
||||
|
||||
a.gotop.exit {
|
||||
animation: slideOutToBottom 1 .6s;
|
||||
}
|
||||
|
||||
.content {
|
||||
margin: 10px auto;
|
||||
padding: 2px 3px;
|
||||
width: 1024px;
|
||||
border: 1px solid #9475B2;
|
||||
box-shadow: 0 0 3px #9475B2;
|
||||
border-radius: 3px;
|
||||
background: #D3BFFF;
|
||||
}
|
||||
|
||||
.content-column {
|
||||
position: relative;
|
||||
min-height: 600px;
|
||||
}
|
||||
|
||||
.content-left {
|
||||
float: left;
|
||||
width: 688px;
|
||||
}
|
||||
|
||||
.content-right {
|
||||
float: right;
|
||||
width: 334px;
|
||||
}
|
||||
|
||||
.content-left .head,
|
||||
.news .head,
|
||||
.donate .head,
|
||||
.loginPage > .loginCont .head,
|
||||
.messages .head {
|
||||
margin: -1px -2px;
|
||||
padding: 4px 5px 5px;
|
||||
font-weight: 700;
|
||||
font-size: 20px;
|
||||
color: #306;
|
||||
background: linear-gradient(90deg, rgba(148,117,178,.7), rgba(148,117,178,0)) #C2AFFE;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.content-right .head,
|
||||
.loginPage > .registerCont .head {
|
||||
margin: -1px -2px -1px;
|
||||
padding: 4px 5px 5px;
|
||||
font-weight: 700;
|
||||
font-size: 20px;
|
||||
color: #306;
|
||||
background: linear-gradient(270deg, rgba(148,117,178,.7), rgba(148,117,178,0)) #C2AFFE;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.standalone {
|
||||
background: #C2AEEE;
|
||||
padding: 10px;
|
||||
width: auto;
|
||||
max-width: 1024px;
|
||||
}
|
||||
|
||||
.private-message {
|
||||
border-top: 1px solid #C2AEEE;
|
||||
}
|
||||
|
||||
.ajax-busy {
|
||||
background: rgba(0, 0, 0, .4);
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
z-index: 5;
|
||||
text-align: center;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.ajax-busy .ajax-inner {
|
||||
line-height: 2em;
|
||||
color: #FFF;
|
||||
background: #222;
|
||||
background: linear-gradient(0deg, rgba(0, 0, 0, .4) 20%, transparent) rgba(0, 0, 0, .8);
|
||||
display: inline-block;
|
||||
margin: 10% auto 0;
|
||||
padding: 10px 20px 15px;
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 5px 1em #111;
|
||||
}
|
||||
|
||||
.ajax-busy .ajax-inner h2 {
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.homepage .content-right ul {
|
||||
margin: 10px 0;
|
||||
margin-left: 30px;
|
||||
}
|
||||
|
||||
.dropDown {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.dropDown .dropDownInner {
|
||||
display: inline-block;
|
||||
background: rgba(12, 12, 12, .7);
|
||||
min-width: 200px;
|
||||
border: 2px solid #9475B2;
|
||||
float: left;
|
||||
font-family: "Segoe UI", sans-serif;
|
||||
text-align: left;
|
||||
margin: 0 2px;
|
||||
transition: background .5s;
|
||||
}
|
||||
|
||||
.dropDown .dropDownInner:hover {
|
||||
background: rgba(21, 21, 21, .8);
|
||||
}
|
||||
|
||||
.dropDown .dropDownInner a {
|
||||
padding: 0 1px 0 4px;
|
||||
display: none;
|
||||
color: #FFF;
|
||||
text-decoration: none;
|
||||
clear: both;
|
||||
transition: background .2s;
|
||||
}
|
||||
|
||||
.dropDown .dropDownInner a:hover {
|
||||
background: rgba(21, 21, 21, .5);
|
||||
}
|
||||
|
||||
.dropDown .dropDownInner a:active {
|
||||
background: rgba(21, 21, 21, .7);
|
||||
}
|
||||
|
||||
.dropDown .dropDownInner a.dropDownSelected {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.dropDown .dropDownInner:hover a {
|
||||
display: block;
|
||||
float: none;
|
||||
}
|
||||
|
||||
.dropDown .dropDownInner a.dropDownDesc {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.dropDown .dropDownInner:hover a.dropDownDesc {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#headerLoginForm {
|
||||
background: #9475B2;
|
||||
border-bottom: 2px solid #9475B2;
|
||||
box-shadow: 0 0 5px #8364A1;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#headerLoginForm > div {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
|
||||
#headerLoginForm > div {
|
||||
display: block;
|
||||
text-align: right;
|
||||
padding-right: 2px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#headerLoginForm label {
|
||||
font-family: "Segoe UI", sans-serif;
|
||||
font-weight: 100;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.indexSidePanelLinks {
|
||||
font-size: 4em;
|
||||
text-align: center;
|
||||
line-height: 1.3em;
|
||||
}
|
||||
|
||||
.indexSidePanelLinks > a {
|
||||
color: #8364A1;
|
||||
text-decoration: none;
|
||||
text-shadow: 0 0 2px #9475B2;
|
||||
transition: all .2s;
|
||||
}
|
||||
|
||||
.indexSidePanelLinks > a:hover {
|
||||
text-shadow: 0 0 6px #9475B2;
|
||||
}
|
||||
|
||||
.indexSidePanelLinks > a:active {
|
||||
color: #725390;
|
||||
text-shadow: 0 0 8px #8364A1;
|
||||
}
|
|
@ -1,65 +0,0 @@
|
|||
/*
|
||||
* Donation page Styling
|
||||
*/
|
||||
@charset "utf-8";
|
||||
|
||||
.donate .sectionHeader {
|
||||
margin: -1px -2px;
|
||||
background: linear-gradient(270deg, rgba(148, 117, 178, .7), rgba(148, 117, 178, 0), rgba(148, 117, 178, .7)) #C2AFFE;
|
||||
padding: 2px;
|
||||
font-weight: 700;
|
||||
font-size: 15px;
|
||||
color: #306;
|
||||
}
|
||||
|
||||
.donate .featureParent {
|
||||
width: 100%;
|
||||
padding: 10px 0;
|
||||
overflow: hidden;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.donate .featureBox {
|
||||
background: linear-gradient(180deg, #C2AFFE, #B19EED) no-repeat scroll left top / cover #C2AFFE;
|
||||
margin: 7px;
|
||||
border-radius: 5px;
|
||||
text-align: center;
|
||||
box-shadow: 0 0 .5em #000;
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
transition: box-shadow .2s;
|
||||
width: 320px;
|
||||
padding: 5px 0;
|
||||
}
|
||||
|
||||
.donate .featureBox:hover {
|
||||
box-shadow: 0 0 1em #000;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.donate .featureBox:active {
|
||||
box-shadow: 0 0 1.5em #609;
|
||||
}
|
||||
|
||||
.donate .featureBoxHeader {
|
||||
font-weight: 700;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.donate .featureBoxDesc {
|
||||
padding: 1px 2px;
|
||||
}
|
||||
|
||||
.donate .featureBoxDesc.donateClosed {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.donate .featureBoxDesc.donateOpened {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.donate .paypal-donate-form {
|
||||
margin: 10px auto;
|
||||
display: block;
|
||||
text-align: center;
|
||||
}
|
|
@ -1,63 +1,83 @@
|
|||
html {
|
||||
background: url('/images/satori-error.png') top right no-repeat #FFF;
|
||||
font-family: 'verdana', sans-serif;
|
||||
font-size: 0.8em;
|
||||
}
|
||||
html,
|
||||
body {
|
||||
margin: 0px 2em;
|
||||
}
|
||||
html, body {
|
||||
min-height: 100%;
|
||||
width: 90;
|
||||
}
|
||||
|
||||
html {
|
||||
background: url('/images/satori-error.png') top right no-repeat #FFF;
|
||||
font-family: 'verdana', sans-serif;
|
||||
font-size: .8em;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0 2em;
|
||||
}
|
||||
|
||||
#wrap {
|
||||
max-width: 34em;
|
||||
}
|
||||
h1, h2, h3, p {
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
p {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-size: 1em;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 1.5em;
|
||||
margin: 1.33em 0;
|
||||
}
|
||||
|
||||
h1 img {
|
||||
margin: 0px 0.5em -0.75em 0px;
|
||||
margin: 0 .5em -.75em 0;
|
||||
}
|
||||
|
||||
p {
|
||||
padding: 0px;
|
||||
margin: 2em 0px;
|
||||
padding: 0;
|
||||
margin: 2em 0;
|
||||
line-height: 1.33em;
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 1.9em 0px;
|
||||
margin: 1.9em 0;
|
||||
background: #BBB;
|
||||
border: none;
|
||||
}
|
||||
|
||||
ul {
|
||||
padding: 0.75em 0px 0px 0px;
|
||||
padding: .75em 0 0 0;
|
||||
}
|
||||
|
||||
li {
|
||||
margin: 0px 0px 0.8em 3.46em;
|
||||
line-height: 1.32em;
|
||||
}
|
||||
|
||||
a {
|
||||
color: red;
|
||||
}
|
||||
|
||||
img+a:before {
|
||||
content: ' ';
|
||||
content: " ";
|
||||
}
|
||||
|
||||
h3 {
|
||||
margin: 2.5em 0px;
|
||||
margin: 2.5em 0;
|
||||
}
|
||||
|
||||
li:nth-child(3) img {
|
||||
margin: -0.2em 0px
|
||||
margin: -0.2em 0;
|
||||
}
|
||||
|
||||
li:nth-child(4) img {
|
||||
margin: -0.5em 0px
|
||||
margin: -0.5em 0;
|
||||
}
|
||||
|
||||
table {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
|
@ -67,13 +87,17 @@ table {
|
|||
opacity: 0;
|
||||
display: none;
|
||||
}
|
||||
table, tr, td {
|
||||
background: rgba(0,0,0,0.2);
|
||||
|
||||
table,
|
||||
tr,
|
||||
td {
|
||||
background: rgba(0, 0, 0, .2);
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
table img {
|
||||
border-radius: 32px;
|
||||
box-shadow: 0 4px 32px #888;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,53 +0,0 @@
|
|||
/*
|
||||
* Site footer styling
|
||||
*/
|
||||
@charset "utf-8";
|
||||
|
||||
.footer {
|
||||
box-shadow: 0 0 1em #9475B2;
|
||||
font-size: small;
|
||||
width: 100%;
|
||||
padding-top: 10px;
|
||||
padding-bottom: 30px;
|
||||
background: linear-gradient(180deg, #9475B2 0%, #FBEEFF 20%, #C2AFFE 100%) #C2AFFE;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
.footer .ftsections a {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.footer .ftsections a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.footer .ftsections {
|
||||
margin: auto;
|
||||
text-align: center;
|
||||
width: 95%;
|
||||
min-height: 150px;
|
||||
}
|
||||
|
||||
.footer .ftsections .ftsection {
|
||||
vertical-align: top;
|
||||
text-align: left;
|
||||
display: inline-block;
|
||||
width: 200px;
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
.footer .ftsections .ftsection li {
|
||||
margin: 2px;
|
||||
}
|
||||
|
||||
.footer .ftsections .ftsection li.fthead {
|
||||
margin-bottom: 5px;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.footer .sections .copycentre {
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
}
|
|
@ -1,78 +0,0 @@
|
|||
/*
|
||||
* Forum Styling
|
||||
*/
|
||||
@charset "utf-8";
|
||||
|
||||
.forum .forumList {
|
||||
width: 100%;
|
||||
border-spacing: 0;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
.forum .forumList .forumCategory {
|
||||
background: #C2AFFE;
|
||||
font-weight: 700;
|
||||
font-size: 17px;
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.forum .forumList .forumCategory .forumCategoryTitleColumn {
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
.forum .forumList .forumForum {
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
.forum .forumList .forumForum .forumIconColumn {
|
||||
text-align: center;
|
||||
width: 50px;
|
||||
}
|
||||
|
||||
.forum .forumList .forumForum .forumIconColumn .forumIcon.read {
|
||||
color: #444;
|
||||
text-shadow: 0 0 5px #444;
|
||||
}
|
||||
|
||||
.forum .forumList .forumForum .forumIconColumn .forumIcon.unread {
|
||||
color: #6C5D7B;
|
||||
text-shadow: 0 0 5px #9475B2;
|
||||
}
|
||||
|
||||
.forum .forumList .forumForum .forumTitleColumn .name {
|
||||
font-size: 1.2em;
|
||||
line-height: 1.7em;
|
||||
}
|
||||
|
||||
.forum .forumList .forumForum .forumTitleColumn .desc {
|
||||
font-size: .8em;
|
||||
line-height: 1em;
|
||||
}
|
||||
|
||||
.forum .forumList .forumForum .forumCountColumn {
|
||||
width: 70px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.forum .forumList .forumForum .forumCountColumn .topics {
|
||||
font-size: 1.5em;
|
||||
color: #111;
|
||||
}
|
||||
|
||||
.forum .forumList .forumForum .forumCountColumn .posts {
|
||||
font-size: .8em;
|
||||
line-height: 1.2em;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.forum .forumList .forumForum .forumLastColumn {
|
||||
width: 250px;
|
||||
font-size: .9em;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
|
||||
.forum .forumList .forumForum .forumLastColumn div,
|
||||
.forum .forumList .forumForum .forumTitleColumn div {
|
||||
padding-left: 5px;
|
||||
}
|
|
@ -1,185 +0,0 @@
|
|||
/*
|
||||
* Site header styling
|
||||
*/
|
||||
@charset "utf-8";
|
||||
|
||||
.header {
|
||||
text-align: center;
|
||||
background: linear-gradient(180deg, #C2AFFE, #CCBAFE);
|
||||
box-shadow: 0 0 5px #8364A1;
|
||||
}
|
||||
|
||||
.header .logo {
|
||||
background: none;
|
||||
height: auto;
|
||||
width: auto;
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
font: 100 70px/80px "SegoeUI-Light", "Segoe UI", sans-serif;
|
||||
color: #B06AC4;
|
||||
transition: color .2s, text-shadow .2s;
|
||||
}
|
||||
|
||||
.header .logo:hover {
|
||||
color: #C17BD5;
|
||||
text-shadow: 0 0 .1em #C17BD5;
|
||||
}
|
||||
|
||||
.header .logo:active {
|
||||
color: #A059B3;
|
||||
text-shadow: 0 0 .1em #A059B3;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.header .logo {
|
||||
font: 100 50px/60px "SegoeUI-Light", "Segoe UI", sans-serif;
|
||||
}
|
||||
}
|
||||
|
||||
.header .menu {
|
||||
border-bottom: 2px solid #9475B2;
|
||||
}
|
||||
|
||||
.header .menu .menu-nav {
|
||||
text-align: left;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.header .menu .menu-ucp {
|
||||
text-align: right;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.header .menu .menu-mob {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.header .menu .menu-item {
|
||||
margin: 0 8px -2px;
|
||||
display: inline-block;
|
||||
min-width: 75px;
|
||||
padding: 5px;
|
||||
border-bottom: 2px solid #8364A1;
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
text-align: center;
|
||||
transition: border-color .5s, background .3s;
|
||||
}
|
||||
|
||||
.header .menu .menu-item.avatar {
|
||||
width: auto;
|
||||
padding-left: 36px;
|
||||
background: url('/pixel.png') no-repeat scroll left center / contain transparent;
|
||||
}
|
||||
|
||||
.header .menu .menu-item:hover {
|
||||
border-color: #503180 !important;
|
||||
}
|
||||
|
||||
.header .menu .menu-item:active {
|
||||
border-color: #503180 !important;
|
||||
background-color: #503180 !important;
|
||||
}
|
||||
|
||||
.header .menu .menu-donate:hover {
|
||||
border-color: #EE9400 !important;
|
||||
}
|
||||
|
||||
.header .menu .menu-donate:active {
|
||||
border-color: #EE9400 !important;
|
||||
background-color: #EE9400 !important;
|
||||
}
|
||||
|
||||
@media (max-width: 1283px) and (min-width: 930px) {
|
||||
|
||||
.header .menu {
|
||||
border: 0;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.header .menu .menu-nav {
|
||||
margin-left: 32px;
|
||||
}
|
||||
|
||||
.header .menu .menu-nav,
|
||||
.header .menu .menu-ucp {
|
||||
display: block;
|
||||
float: none;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.header .menu .menu-item {
|
||||
min-width: 120px;
|
||||
border: 0;
|
||||
margin: 0 8px;
|
||||
}
|
||||
|
||||
.header .menu .menu-nav .menu-item {
|
||||
min-width: 120px;
|
||||
border-bottom: 1px solid #8364A1;
|
||||
}
|
||||
|
||||
.header .menu .menu-ucp .menu-item {
|
||||
min-width: 120px;
|
||||
border-top: 1px solid #8364A1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@media (max-width: 930px) {
|
||||
|
||||
.header .menu .menu-nav, .header .menu .menu-ucp {
|
||||
float: none;
|
||||
text-align: center;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.header .menu .menu-hid {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.header .menu .menu-mob {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.header .menu .menu-item.avatar {
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
.header .menu .menu-mob .menu-item {
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
.header .menu .menu-nav .menu-item, .header .menu .menu-ucp .menu-item {
|
||||
display: block;
|
||||
border-top: 0;
|
||||
border-bottom: 1px solid #8364A1;
|
||||
margin: 0 8px;
|
||||
}
|
||||
|
||||
.header .menu .menu-nav:before {
|
||||
content: "Navigation";
|
||||
font-size: 20px;
|
||||
line-height: 40px;
|
||||
}
|
||||
|
||||
.header .menu .menu-ucp:before {
|
||||
content: "User Settings";
|
||||
font-size: 20px;
|
||||
line-height: 40px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.headerNotify {
|
||||
margin: 10px auto;
|
||||
padding: 10px;
|
||||
width: auto;
|
||||
max-width: 1024px;
|
||||
border: 1px solid #9475B2;
|
||||
box-shadow: 0 0 3px #9475B2;
|
||||
border-radius: 3px;
|
||||
background: #D3BFFF;
|
||||
display: block;
|
||||
text-align: center;
|
||||
}
|
|
@ -1,74 +0,0 @@
|
|||
/*
|
||||
* Input box Styling
|
||||
*/
|
||||
@charset "utf-8";
|
||||
|
||||
input[type="submit"].inputStyling,
|
||||
input[type="button"].inputStyling,
|
||||
input[type="reset"].inputStyling {
|
||||
padding: 3px 10px;
|
||||
cursor: pointer;
|
||||
border: 0;
|
||||
border-radius: 3px;
|
||||
background: linear-gradient(180deg, #9475B2 0%, #9475B2 50%, #86A 50%) #9475B2;
|
||||
margin: 4px 1px;
|
||||
color: #FFF;
|
||||
box-shadow: inset #222 0 0 1px;
|
||||
text-shadow: #888 0 0 2px;
|
||||
transition: text-shadow .5s, box-shadow .5s;
|
||||
font-size: 22px;
|
||||
min-width: 120px;
|
||||
}
|
||||
|
||||
input[type="submit"].inputStyling.small,
|
||||
input[type="button"].inputStyling.small,
|
||||
input[type="reset"].inputStyling.small {
|
||||
padding: 0 4px 1px;
|
||||
margin: -2px 0 0;
|
||||
font-size: 16px;
|
||||
border-radius: 0;
|
||||
min-width: 80px !important;
|
||||
}
|
||||
|
||||
input[type="submit"].inputStyling:hover,
|
||||
input[type="button"].inputStyling:hover,
|
||||
input[type="reset"].inputStyling:hover {
|
||||
box-shadow: inset #222 0 0 3px;
|
||||
text-shadow: #F1F1F1 0 0 5px;
|
||||
}
|
||||
|
||||
input[type="submit"].inputStyling:active,
|
||||
input[type="button"].inputStyling:active,
|
||||
input[type="reset"].inputStyling:active {
|
||||
box-shadow: inset #222 0 0 5px;
|
||||
text-shadow: #F1F1F1 0 0 3px;
|
||||
transition: text-shadow .2s, box-shadow .2s;
|
||||
}
|
||||
|
||||
input[type="text"].inputStyling,
|
||||
input[type="password"].inputStyling ,
|
||||
input[type="date"].inputStyling {
|
||||
padding: 3px 4px;
|
||||
border: 1px solid #CCC;
|
||||
box-shadow: inset #DDD 0 0 5px;
|
||||
background: linear-gradient(180deg, #FFF 0%, #EEE 50%, #E5E5E5 50%) #FFF;
|
||||
}
|
||||
|
||||
input[type="text"].inputStyling.red,
|
||||
input[type="password"].inputStyling.red,
|
||||
input[type="date"].inputStyling.red {
|
||||
box-shadow: inset 0px 0px 7px #EB5959;
|
||||
}
|
||||
|
||||
input[type="text"].inputStyling.green,
|
||||
input[type="password"].inputStyling.green,
|
||||
input[type="date"].inputStyling.green {
|
||||
box-shadow: inset 0px 0px 7px #A9EC8B;
|
||||
}
|
||||
|
||||
textarea.inputStyling {
|
||||
padding: 3px 4px;
|
||||
border: 1px solid #CCC;
|
||||
box-shadow: inset #DDD 0 0 5px;
|
||||
background: linear-gradient(180deg, #FFF 0%, #EEE 50%, #E5E5E5 50%) #FFF;
|
||||
}
|
|
@ -1,71 +0,0 @@
|
|||
/*
|
||||
* Animation Keyframes
|
||||
*/
|
||||
@charset "utf-8";
|
||||
|
||||
/* Spin */
|
||||
@keyframes spin {
|
||||
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Fade out */
|
||||
@keyframes fadeOut {
|
||||
|
||||
0% {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 0;
|
||||
display: none;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Fade in */
|
||||
@keyframes fadeIn {
|
||||
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
display: block;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Slide in from right */
|
||||
@keyframes slideInFromRight { /* Requires position: relative to be set on the element */
|
||||
|
||||
0% {
|
||||
right: -100%;
|
||||
}
|
||||
|
||||
100% {
|
||||
right: 0%;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Slide out to bottom */
|
||||
@keyframes slideOutToBottom { /* Read comment above */
|
||||
|
||||
0% {
|
||||
bottom: 0%;
|
||||
}
|
||||
|
||||
100% {
|
||||
bottom: -100%;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,103 +0,0 @@
|
|||
/*
|
||||
* Members page Styling
|
||||
*/
|
||||
@charset "utf-8";
|
||||
|
||||
.membersPage {
|
||||
width: 100%;
|
||||
padding: 10px 0;
|
||||
overflow: hidden;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.membersPage a {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.membersPage .userBox {
|
||||
background: linear-gradient(180deg, #C2AFFE, #B19EED) no-repeat scroll left top / cover #C2AFFE;
|
||||
margin: 7px;
|
||||
border-radius: 5px;
|
||||
text-align: center;
|
||||
box-shadow: 0 0 .5em #000;
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
transition: box-shadow .2s;
|
||||
}
|
||||
|
||||
.membersPage .userBox {
|
||||
padding: 10px;
|
||||
line-height: 330%;
|
||||
}
|
||||
|
||||
.membersPage .userBox:hover {
|
||||
box-shadow: 0 0 1em #000;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.membersPage .userBox:active {
|
||||
box-shadow: 0 0 1.5em #609;
|
||||
}
|
||||
|
||||
.membersPage .userBox img {
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.membersPage .userBox .userBoxUserName {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.membersPage .boxes .userBox {
|
||||
width: 200px;
|
||||
height: 230px;
|
||||
}
|
||||
|
||||
.membersPage .boxes .userBox img {
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.membersPage .rectangles .userBox {
|
||||
width: 300px;
|
||||
height: 100px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.membersPage .rectangles .userBox img {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.membersPage .rectangles .userBox .userBoxUserName {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
padding: 30px 10px;
|
||||
}
|
||||
|
||||
.membersPage .list table {
|
||||
margin: 10px auto;
|
||||
background: #C2AFFE;
|
||||
box-shadow: 0 0 3px #9475B2;
|
||||
border: 1px solid #9475B2;
|
||||
max-width: 1024px;
|
||||
width: auto;
|
||||
border-radius: 3px;
|
||||
border-spacing: 0;
|
||||
}
|
||||
|
||||
.membersPage .list table td,
|
||||
.membersPage .list table th {
|
||||
padding: 4px 8px;
|
||||
}
|
||||
|
||||
.membersPage .list thead th {
|
||||
border-bottom: 1px solid #9475B2;
|
||||
background: #A586C4;
|
||||
}
|
||||
|
||||
.membersPage .list tfoot th {
|
||||
border-top: 1px solid #9475B2;
|
||||
background: #A586C4;
|
||||
}
|
|
@ -1,41 +0,0 @@
|
|||
/*
|
||||
* Private Messages Styling
|
||||
*/
|
||||
@charset "utf-8";
|
||||
|
||||
.messages table {
|
||||
width: 100%;
|
||||
border-spacing: 0;
|
||||
}
|
||||
|
||||
.messages table > tbody > tr.unread {
|
||||
background: #C2AFFE;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.messages table > tbody > tr > td {
|
||||
border-bottom: 1px solid #B19EED;
|
||||
border-top: 1px solid #B19EED;
|
||||
}
|
||||
|
||||
.messages table > * > tr > td {
|
||||
padding: 0 4px;
|
||||
}
|
||||
|
||||
.messages table > * > tr > td:first-child {
|
||||
width: 150px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.messages table > tbody > tr > td:first-child {
|
||||
border-left: 1px solid #B19EED;
|
||||
}
|
||||
|
||||
.messages table > * > tr > td:last-child {
|
||||
width: 220px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.messages table > tbody > tr > td:last-child {
|
||||
border-right: 1px solid #B19EED;
|
||||
}
|
|
@ -1,74 +0,0 @@
|
|||
/*
|
||||
* News page styling
|
||||
*/
|
||||
@charset "utf-8";
|
||||
|
||||
.news {
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
.news-head {
|
||||
margin: -1px -2px;
|
||||
padding: 4px;
|
||||
background: #C2AFFE;
|
||||
font-weight: 700;
|
||||
display: block;
|
||||
font-size: 17px;
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.news-rss {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.news-body {
|
||||
font-size: 10pt;
|
||||
padding: 2px 0 0 3px;
|
||||
}
|
||||
|
||||
.news-post-time {
|
||||
font-size: 8pt;
|
||||
padding: 6px 15px;
|
||||
text-align: right;
|
||||
font-weight: 700;
|
||||
}
|
||||
.news-poster {
|
||||
margin-top: -20px;
|
||||
float: right;
|
||||
text-align: center;
|
||||
width: 140px;
|
||||
}
|
||||
|
||||
.news-poster img {
|
||||
max-width: 120px;
|
||||
max-height: 120px;
|
||||
}
|
||||
|
||||
.news-poster h1 {
|
||||
line-height: 100%;
|
||||
margin: 0;
|
||||
margin-top: -5px;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
|
||||
.news-poster {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@media (max-width: 400px) {
|
||||
|
||||
.news-poster {
|
||||
margin-top: 10px;
|
||||
width: auto;
|
||||
padding: 0 10px 0 0;
|
||||
}
|
||||
|
||||
.news-poster img {
|
||||
display: none;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,99 +0,0 @@
|
|||
/*
|
||||
* Notification styling
|
||||
*/
|
||||
@charset "utf-8";
|
||||
|
||||
#notifications {
|
||||
position: fixed;
|
||||
bottom: 5px;
|
||||
right: 5px;
|
||||
z-index: 3;
|
||||
font-family: "Segoe UI", sans-serif;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
max-height: 510px;
|
||||
max-width: 600px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
#notifications > div {
|
||||
cursor: pointer;
|
||||
text-align: left;
|
||||
display: inline-block;
|
||||
height: 80px;
|
||||
background: rgba(113, 74, 150, .9);
|
||||
border: 1px solid #507;
|
||||
border-right-width: 5px;
|
||||
color: #FFF;
|
||||
padding: 2px 0 2px 2px;
|
||||
margin: 5px;
|
||||
position: relative;
|
||||
box-shadow: 0 0 4px rgba(0, 0, 0, .9);
|
||||
}
|
||||
|
||||
#notifications > .notification-enter {
|
||||
animation: slideInFromRight 1 .4s, fadeIn 1 .4s;
|
||||
}
|
||||
|
||||
#notifications > .notification-exit {
|
||||
animation: slideOutToBottom 1 .4s, fadeOut 1 .4s;
|
||||
}
|
||||
|
||||
#notifications > div > .notification-icon {
|
||||
float: left;
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
text-align: center;
|
||||
background: rgba(0, 0, 0, .5);
|
||||
display: block;
|
||||
}
|
||||
|
||||
#notifications > div > .notification-icon > img {
|
||||
max-height: 80px;
|
||||
max-width: 80px;
|
||||
}
|
||||
|
||||
#notifications > div > .notification-icon > .font-icon {
|
||||
margin: .34em 0;
|
||||
}
|
||||
|
||||
#notifications > div > .notification-content {
|
||||
float: left;
|
||||
min-width: 350px;
|
||||
max-width: 450px;
|
||||
padding-right: 6px;
|
||||
border-left: 1px solid rgb(85, 0, 119);
|
||||
height: 80px;
|
||||
margin-left: 2px;
|
||||
padding-left: 8px;
|
||||
}
|
||||
|
||||
#notifications > div > .notification-content > .notification-title {
|
||||
font-weight: 300;
|
||||
font-size: 1.7em;
|
||||
margin-top: 1em;
|
||||
}
|
||||
|
||||
#notifications > div > .notification-close:before {
|
||||
font-family: FontAwesome;
|
||||
content: "\f00d";
|
||||
}
|
||||
|
||||
#notifications > div > .notification-close {
|
||||
font-size: 2em;
|
||||
float: right;
|
||||
height: 80px;
|
||||
width: 20px;
|
||||
background: #507;
|
||||
margin-top: -3px;
|
||||
padding-bottom: 6px;
|
||||
padding-left: 2px;
|
||||
border-left: 3px solid #507;
|
||||
line-height: 3.4em;
|
||||
text-align: center;
|
||||
display: none;
|
||||
}
|
||||
|
||||
#notifications > div:hover > .notification-close {
|
||||
display: block;
|
||||
}
|
|
@ -1,49 +0,0 @@
|
|||
/*
|
||||
* Profile page Styling
|
||||
*/
|
||||
@charset "utf-8";
|
||||
|
||||
.profile .content-left {
|
||||
max-height: 800px;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.profile .user-actions {
|
||||
font-size: 3em;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
|
||||
.profile .user-actions a {
|
||||
color: #8364A1;
|
||||
text-decoration: none;
|
||||
text-shadow: 0 0 2px #9475B2;
|
||||
transition: all .2s;
|
||||
}
|
||||
|
||||
.profile .user-actions a:hover {
|
||||
text-shadow: 0 0 6px #9475B2;
|
||||
}
|
||||
|
||||
.profile .user-actions a:active {
|
||||
color: #725390;
|
||||
text-shadow: 0 0 8px #8364A1;
|
||||
}
|
||||
|
||||
@media (max-width: 1024px) {
|
||||
|
||||
.content {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.content .content-right {
|
||||
width: 100%;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
.content .content-left {
|
||||
width: 100%;
|
||||
min-height: 0;
|
||||
border-top: 1px solid #9475B2;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,91 +0,0 @@
|
|||
/*
|
||||
* Settings page styling
|
||||
*/
|
||||
@charset "utf-8";
|
||||
|
||||
.settings .right-menu-nav > div {
|
||||
background: #C2AFFE;
|
||||
padding: 4px;
|
||||
margin: -1px -2px;
|
||||
font-weight: 700;
|
||||
display: block;
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
.settings .right-menu-nav > a {
|
||||
display: block;
|
||||
font-size: 14px;
|
||||
line-height: 25px;
|
||||
color: #22E;
|
||||
text-decoration: none;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.settings .right-menu-nav > a:hover {
|
||||
color: #22E;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.settings .right-menu-nav > a:active {
|
||||
color: #E22;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.settings .settings-explanation {
|
||||
font-size: 11px;
|
||||
line-height: 18px;
|
||||
padding: 7px;
|
||||
border-bottom: 1px solid #C2AFFE;
|
||||
margin-bottom: 7px;
|
||||
}
|
||||
|
||||
.settings .settings-table {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.settings .settings-table tr > th {
|
||||
font-size: 17px;
|
||||
background: #C2AFFE;
|
||||
padding: 4px;
|
||||
margin: -1px -2px;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.settings .settings-table tr > td {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.settings .settings-table > tbody > tr:not(:last-child) > td {
|
||||
border-bottom: 1px solid #C2AFFE;
|
||||
}
|
||||
|
||||
.settings .settings-table tr.current-session > td {
|
||||
background: #B39EED;
|
||||
}
|
||||
|
||||
.settings .profile-field {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.settings .profile-field > div:nth-child(2) > input {
|
||||
width: calc(100% - 16px);
|
||||
}
|
||||
|
||||
.settings .profile-save {
|
||||
text-align: center;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.settings .background-frame {
|
||||
max-width: 600px;
|
||||
max-height: 400px;
|
||||
border: 3px solid #EEE;
|
||||
background: #EEE;
|
||||
box-shadow: 0 3px 7px #888;
|
||||
border-radius: 3px;
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
.settings form {
|
||||
overflow: auto;
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -1 +0,0 @@
|
|||
# Profile background directory
|
BIN
content/images/triangles.png
Normal file
BIN
content/images/triangles.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 252 KiB |
|
@ -54,6 +54,11 @@ RewriteRule ^members/([a-z]+)/([0-9]+)/p([0-9]+)/?$ members.php?sort=$1&rank=$2&
|
|||
RewriteRule ^u/?$ profile.php
|
||||
RewriteRule ^u/([A-Za-z0-9_-\s\.]+)/?$ profile.php?u=$1
|
||||
RewriteRule ^u/([A-Za-z0-9_-\s\.]+)/api/?$ profile.php?data
|
||||
RewriteRule ^u/([A-Za-z0-9_-\s\.]+)/header/?$ imageserve.php?m=header&u=$1
|
||||
RewriteRule ^u/([A-Za-z0-9_-\s\.]+)/groups/?$ profile.php?u=$1&view=groups
|
||||
RewriteRule ^u/([A-Za-z0-9_-\s\.]+)/friends/?$ profile.php?u=$1$view=friends
|
||||
RewriteRule ^u/([A-Za-z0-9_-\s\.]+)/threads/?$ profile.php?u=$1$view=threads
|
||||
RewriteRule ^u/([A-Za-z0-9_-\s\.]+)/posts/?$ profile.php?u=$1$view=posts
|
||||
|
||||
# Serving Images
|
||||
RewriteRule ^a/([0-9]+)$|a/([0-9]+).png$ imageserve.php?m=avatar&u=$1
|
||||
|
|
|
@ -95,7 +95,7 @@ if(isset($_REQUEST['mode'])) {
|
|||
$messages = [
|
||||
'USER_NOT_LOGIN' => 'What are you doing, you\'re not even logged in. GO AWAY!',
|
||||
'INCORRECT_PASSWORD' => 'The password you entered was invalid.',
|
||||
'NOT_ALLOWED' => 'Your account does not have the required permissions to log in.',
|
||||
'NOT_ALLOWED' => 'Your account does not have the required permissions to change your password.',
|
||||
'NO_LOGIN' => 'Logging into this account is disabled.',
|
||||
'PASS_TOO_SHIT' => 'Your password is too weak, try adding some special characters.',
|
||||
'PASS_NOT_MATCH' => 'Passwords do not match.',
|
||||
|
@ -198,7 +198,7 @@ if(isset($_REQUEST['mode'])) {
|
|||
'AUTH_LOCKED' => 'Authentication is currently not allowed, try again later.',
|
||||
'USER_NOT_EXIST' => 'The user you tried to log into does not exist.',
|
||||
'INCORRECT_PASSWORD' => 'The password you entered was invalid.',
|
||||
'DEACTIVATED' => 'Your account is deactivated.',
|
||||
'NOT_ALLOWED' => 'Your account does not have the required permissions to log in.',
|
||||
'NO_LOGIN' => 'Logging into this account is disabled.',
|
||||
'LEGACY_SUCCESS' => 'Login successful! Taking you to the password changing page...',
|
||||
'LOGIN_SUCESS' => 'Login successful!'
|
||||
|
@ -274,7 +274,7 @@ if(isset($_REQUEST['mode'])) {
|
|||
$messages = [
|
||||
'AUTH_LOCKED' => 'Authentication is currently not allowed, try again later.',
|
||||
'USER_NOT_EXIST' => 'The requested user does not exist (confirm the username/email combination).',
|
||||
'DEACTIVATED' => 'Your account is deactivated.',
|
||||
'NOT_ALLOWED' => 'Your account does not have the required permissions to change your password.',
|
||||
'SUCCESS' => 'The password reset e-mail has been sent to the address associated with your account.'
|
||||
];
|
||||
|
||||
|
|
|
@ -12,6 +12,9 @@ require_once str_replace(basename(__DIR__), '', dirname(__FILE__)) .'_sakura/sak
|
|||
// Set Content type
|
||||
header('Content-Type: application/octet-stream');
|
||||
|
||||
// Path to user uploads
|
||||
$userDirPath = ROOT .'content/images/user/';
|
||||
|
||||
// Check if the m(ode) GET request is set
|
||||
if(isset($_GET['m'])) {
|
||||
|
||||
|
@ -22,7 +25,6 @@ if(isset($_GET['m'])) {
|
|||
$noAvatar = ROOT .'content/images/no-av.png';
|
||||
$deactiveAvatar = ROOT .'content/images/deactivated-av.png';
|
||||
$bannedAvatar = ROOT .'content/images/banned-av.png';
|
||||
$avatarDirPath = ROOT .'content/images/avatars/';
|
||||
|
||||
// If ?u= isn't set or if it isn't numeric
|
||||
if(!isset($_GET['u']) || !is_numeric($_GET['u'])) {
|
||||
|
@ -32,6 +34,7 @@ if(isset($_GET['m'])) {
|
|||
|
||||
// Get user data
|
||||
$user = Users::getUser($_GET['u']);
|
||||
$data = Users::getUserProfileData($user, true);
|
||||
|
||||
// If user is deactivated use deactive avatar
|
||||
if(Users::checkIfUserHasRanks([0, 1], $user, true)) {
|
||||
|
@ -46,19 +49,18 @@ if(isset($_GET['m'])) {
|
|||
}
|
||||
|
||||
// Check if user has an avatar set
|
||||
if(empty($user['avatar_url']) || !file_exists($avatarDirPath . $user['avatar_url'])) {
|
||||
if(empty($data['userAvatar']) || !file_exists($userDirPath . $data['userAvatar'])) {
|
||||
$serveImage = $noAvatar;
|
||||
break;
|
||||
}
|
||||
|
||||
// Check if the avatar exist and assign it to a value
|
||||
$serveImage = $avatarDirPath . $user['avatar_url'];
|
||||
$serveImage = $userDirPath . $data['userAvatar'];
|
||||
break;
|
||||
|
||||
case 'background':
|
||||
// Set paths
|
||||
$noBackground = ROOT .'content/pixel.png';
|
||||
$bgDirPath = ROOT .'content/images/backgrounds/';
|
||||
$noBackground = ROOT .'content/pixel.png';
|
||||
|
||||
// If ?u= isn't set or if it isn't numeric
|
||||
if(!isset($_GET['u']) || !is_numeric($_GET['u'])) {
|
||||
|
@ -68,15 +70,64 @@ if(isset($_GET['m'])) {
|
|||
|
||||
// Get user data
|
||||
$user = Users::getUser($_GET['u']);
|
||||
$data = Users::getUserProfileData($user, true);
|
||||
|
||||
// Check if user has an avatar set
|
||||
if(empty($user['background_url']) || !file_exists($bgDirPath . $user['background_url'])) {
|
||||
$serveImage = $noAvatar;
|
||||
// If user is deactivated use deactive avatar
|
||||
if(Users::checkIfUserHasRanks([0, 1], $user, true)) {
|
||||
$serveImage = $noBackground;
|
||||
break;
|
||||
}
|
||||
|
||||
// Check if user is banned
|
||||
if(false) { // [Flashwave 2015-04-27] Banning isn't implemented yet
|
||||
$serveImage = $noBackground;
|
||||
break;
|
||||
}
|
||||
|
||||
// Check if user has a background set
|
||||
if(empty($data['profileBackground']) || !file_exists($userDirPath . $data['profileBackground'])) {
|
||||
$serveImage = $noBackground;
|
||||
break;
|
||||
}
|
||||
|
||||
// Check if the avatar exist and assign it to a value
|
||||
$serveImage = $bgDirPath . $user['background_url'];
|
||||
$serveImage = $userDirPath . $data['profileBackground'];
|
||||
break;
|
||||
|
||||
case 'header':
|
||||
// Set paths
|
||||
$noHeader = ROOT .'content/images/triangles.png';
|
||||
|
||||
// If ?u= isn't set or if it isn't numeric
|
||||
if(!isset($_GET['u']) || !is_numeric($_GET['u'])) {
|
||||
$serveImage = $noHeader;
|
||||
break;
|
||||
}
|
||||
|
||||
// Get user data
|
||||
$user = Users::getUser($_GET['u']);
|
||||
$data = Users::getUserProfileData($user, true);
|
||||
|
||||
// If user is deactivated use deactive avatar
|
||||
if(Users::checkIfUserHasRanks([0, 1], $user, true)) {
|
||||
$serveImage = $noHeader;
|
||||
break;
|
||||
}
|
||||
|
||||
// Check if user is banned
|
||||
if(false) { // [Flashwave 2015-04-27] Banning isn't implemented yet
|
||||
$serveImage = $noHeader;
|
||||
break;
|
||||
}
|
||||
|
||||
// Check if user has a background set
|
||||
if(empty($data['profileHeader']) || !file_exists($userDirPath . $data['profileHeader'])) {
|
||||
$serveImage = $noHeader;
|
||||
break;
|
||||
}
|
||||
|
||||
// Check if the avatar exist and assign it to a value
|
||||
$serveImage = $userDirPath . $data['profileHeader'];
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -8,7 +8,7 @@ namespace Sakura;
|
|||
|
||||
// Include components
|
||||
require_once str_replace(basename(__DIR__), '', dirname(__FILE__)) .'_sakura/sakura.php';
|
||||
|
||||
//print Permissions::check('SITE', 'USE_CHAT', Session::$userId, 1);
|
||||
// Add page specific things
|
||||
$renderData['newsPosts'] = Main::getNewsPosts(3);
|
||||
$renderData['page'] = [
|
||||
|
|
|
@ -19,7 +19,7 @@ $renderData['page'] = [
|
|||
'sort' => isset($_GET['sort']) && $_GET['sort'] && in_array($_GET['sort'], $_MEMBERLIST_SORTS) ? $_GET['sort'] : $_MEMBERLIST_SORTS[0],
|
||||
'title' => isset($_GET['rank']) && $_GET['rank'] && !$_MEMBERLIST_NFOUND ? 'Viewing '. $_MEMBERLIST_RANKS[$_GET['rank']]['name'] . ($_MEMBERLIST_RANKS[$_GET['rank']]['multi'] ? 's' : '') : 'Member List',
|
||||
'page' => isset($_GET['page']) && ($_GET['page'] - 1) >= 0 ? $_GET['page'] - 1 : 0,
|
||||
'users' => array_chunk($_MEMBERLIST_ACTIVE && !$_MEMBERLIST_NFOUND ? Users::getUsersInRank($_MEMBERLIST_ACTIVE) : Users::getAllUsers(), 30, true)
|
||||
'users' => array_chunk($_MEMBERLIST_ACTIVE && !$_MEMBERLIST_NFOUND ? Users::getUsersInRank($_MEMBERLIST_ACTIVE, null, true, true) : Users::getAllUsers(), 30, true)
|
||||
|
||||
];
|
||||
|
||||
|
|
|
@ -25,22 +25,23 @@ if(isset($_REQUEST['data'])) {
|
|||
if(isset($_GET['u'])) {
|
||||
|
||||
$renderData['profile'] = [
|
||||
'notset' => false,
|
||||
'user' => ($_PROFILE_USER_DATA = Users::getUser(($_USER_USERNAME_ID = Users::userExists($_GET['u'], false)) ? $_USER_USERNAME_ID : $_GET['u'])),
|
||||
'rank' => ($_PROFILE_RANK_DATA = Users::getRank($_PROFILE_USER_DATA['rank_main'])),
|
||||
'colour' => ($_PROFILE_USER_DATA['name_colour'] == null ? $_PROFILE_RANK_DATA['colour'] : $_PROFILE_USER_DATA['name_colour']),
|
||||
'ranktitle' => ($_PROFILE_USER_DATA['usertitle'] == null ? $_PROFILE_RANK_DATA['title'] : $_PROFILE_USER_DATA['usertitle']),
|
||||
'country' => Main::getCountryName($_PROFILE_USER_DATA['country']),
|
||||
'istenshi' => Users::checkUserTenshi($_PROFILE_USER_DATA['id']),
|
||||
'online' => Users::checkUserOnline($_PROFILE_USER_DATA['id']),
|
||||
'profpage' => Main::mdParse(base64_decode($_PROFILE_USER_DATA['profile_md'])),
|
||||
'data' => Users::getUserProfileData($_PROFILE_USER_DATA['id']),
|
||||
'warnings' => Users::getWarnings($_PROFILE_USER_DATA['id'])
|
||||
'notset' => false,
|
||||
'user' => ($_PROFILE_USER_DATA = Users::getUser(($_USER_USERNAME_ID = Users::userExists($_GET['u'], false)) ? $_USER_USERNAME_ID : $_GET['u'])),
|
||||
'rank' => ($_PROFILE_RANK_DATA = Users::getRank($_PROFILE_USER_DATA['rank_main'])),
|
||||
'colour' => ($_PROFILE_USER_DATA['name_colour'] == null ? $_PROFILE_RANK_DATA['colour'] : $_PROFILE_USER_DATA['name_colour']),
|
||||
'ranktitle' => ($_PROFILE_USER_DATA['usertitle'] == null ? $_PROFILE_RANK_DATA['title'] : $_PROFILE_USER_DATA['usertitle']),
|
||||
'data' => ($_PROFILE_PROFILE_DATA = Users::getUserProfileData($_PROFILE_USER_DATA, true)),
|
||||
'country' => Main::getCountryName($_PROFILE_USER_DATA['country']),
|
||||
'istenshi' => Users::checkUserTenshi($_PROFILE_USER_DATA['id']),
|
||||
'online' => Users::checkUserOnline($_PROFILE_USER_DATA['id']),
|
||||
'profilePage' => Users::getProfilePage($_PROFILE_PROFILE_DATA, true),
|
||||
'fields' => Users::getUserProfileFields($_PROFILE_PROFILE_DATA, true),
|
||||
'warnings' => Users::getWarnings($_PROFILE_USER_DATA['id'])
|
||||
];
|
||||
|
||||
$renderData['page'] = [
|
||||
'title' => ($_PROFILE_USER_DATA['id'] < 1 || $_PROFILE_USER_DATA['password_algo'] == 'nologin' ? 'User not found!' : 'Profile of '. $_PROFILE_USER_DATA['username']),
|
||||
'style' => ($_PROFILE_USER_DATA['background_url'] ? [
|
||||
'style' => (!empty($_PROFILE_PROFILE_DATA['profileBackground']) ? [
|
||||
'#userBackground' => [
|
||||
'background' => 'url("/bg/'. $_PROFILE_USER_DATA['id'] .'") no-repeat center center / cover transparent !important',
|
||||
'position' => 'fixed',
|
||||
|
@ -49,9 +50,6 @@ if(isset($_GET['u'])) {
|
|||
'right' => '0',
|
||||
'left' => '0',
|
||||
'z-index' => '-1'
|
||||
],
|
||||
'.profile' => [
|
||||
'background' => 'rgba(211, 191, 255, .8) !important'
|
||||
]
|
||||
] : null)
|
||||
];
|
||||
|
|
Reference in a new issue