diff --git a/.gitignore b/.gitignore index ee7ad88..43cd351 100644 --- a/.gitignore +++ b/.gitignore @@ -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/* diff --git a/_sakura/.htaccess b/_sakura/.htaccess index e69de29..642aa21 100644 --- a/_sakura/.htaccess +++ b/_sakura/.htaccess @@ -0,0 +1,12 @@ +# Disallow external connections + +# Apache <= 2.2 + + Order deny,allow + deny from all + + +# Apache 2.4 => + + Require all denied + diff --git a/_sakura/cache/.htaccess b/_sakura/cache/.htaccess old mode 100644 new mode 100755 index 642aa21..792d600 --- a/_sakura/cache/.htaccess +++ b/_sakura/cache/.htaccess @@ -1,12 +1 @@ -# Disallow external connections - -# Apache <= 2.2 - - Order deny,allow - deny from all - - -# Apache 2.4 => - - Require all denied - +# diff --git a/_sakura/changelog.json b/_sakura/changelog.json index 96f9d61..8889914 100644 --- a/_sakura/changelog.json +++ b/_sakura/changelog.json @@ -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." + } + ] } diff --git a/_sakura/components/Main.php b/_sakura/components/Main.php index 7b8a6d2..a7a76f8 100644 --- a/_sakura/components/Main.php +++ b/_sakura/components/Main.php @@ -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; } diff --git a/_sakura/components/Permissions.php b/_sakura/components/Permissions.php index 6f16c2e..974d7b5 100644 --- a/_sakura/components/Permissions.php +++ b/_sakura/components/Permissions.php @@ -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) { diff --git a/_sakura/components/Templates.php b/_sakura/components/Templates.php index 61456b7..53d0864 100644 --- a/_sakura/components/Templates.php +++ b/_sakura/components/Templates.php @@ -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()); } diff --git a/_sakura/components/Users.php b/_sakura/components/Users.php index 03bfd9f..853ba9b 100644 --- a/_sakura/components/Users.php +++ b/_sakura/components/Users.php @@ -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; diff --git a/_sakura/sakura.php b/_sakura/sakura.php index 10cfae0..e308d84 100644 --- a/_sakura/sakura.php +++ b/_sakura/sakura.php @@ -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)), diff --git a/_sakura/templates/yuuno/global/header.tpl b/_sakura/templates/yuuno/global/header.tpl index a870641..6800f0d 100644 --- a/_sakura/templates/yuuno/global/header.tpl +++ b/_sakura/templates/yuuno/global/header.tpl @@ -178,7 +178,9 @@ Home News + {% if perms.canUseChat %} Chat + {% endif %} Forums Search {% if user.checklogin %} @@ -240,3 +242,4 @@

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).

+ diff --git a/_sakura/templates/yuuno/main/profile.tpl b/_sakura/templates/yuuno/main/profile.tpl index a11811c..c4f152a 100644 --- a/_sakura/templates/yuuno/main/profile.tpl +++ b/_sakura/templates/yuuno/main/profile.tpl @@ -13,7 +13,7 @@ {% else %}
-
+
{{ profile.user.username }}'s Avatar
{{ profile.ranktitle }} @@ -38,11 +38,11 @@ Last Seen on {{ profile.user.lastdate|date("l Y-m-d H:i T") }} {% endif %}
User has {% if not profile.user.posts %}no{% else %}{{ profile.user.posts }}{% endif %} forum post{% if profile.user.posts != 1 %}s{% endif %}. - {% if profile.data is not null %} + {% if profile.fields is not null %}
{% if user.checklogin %} - {% for name,field in profile.data %} + {% for name,field in profile.fields %}
{{ field.name }} @@ -82,12 +82,12 @@ {% endif %} -
- {{ profile.profpage|raw }} +
+ {{ profile.profilePage|raw }}
- {% if profile.user.background_url %} + {% if profile.data.profileBackground %} diff --git a/content/data/yuuno/css/authpage.css b/content/data/yuuno/css/authpage.css deleted file mode 100644 index cff93df..0000000 --- a/content/data/yuuno/css/authpage.css +++ /dev/null @@ -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; -} diff --git a/content/data/yuuno/css/base.css b/content/data/yuuno/css/base.css deleted file mode 100644 index 97c2961..0000000 --- a/content/data/yuuno/css/base.css +++ /dev/null @@ -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; -} diff --git a/content/data/yuuno/css/donate.css b/content/data/yuuno/css/donate.css deleted file mode 100644 index 5d6ae16..0000000 --- a/content/data/yuuno/css/donate.css +++ /dev/null @@ -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; -} diff --git a/content/data/yuuno/css/error.css b/content/data/yuuno/css/error.css index 14918b7..f975638 100644 --- a/content/data/yuuno/css/error.css +++ b/content/data/yuuno/css/error.css @@ -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; -} \ No newline at end of file +} diff --git a/content/data/yuuno/css/footer.css b/content/data/yuuno/css/footer.css deleted file mode 100644 index ac47464..0000000 --- a/content/data/yuuno/css/footer.css +++ /dev/null @@ -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%; -} diff --git a/content/data/yuuno/css/forums.css b/content/data/yuuno/css/forums.css deleted file mode 100644 index ec97c1d..0000000 --- a/content/data/yuuno/css/forums.css +++ /dev/null @@ -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; -} diff --git a/content/data/yuuno/css/header.css b/content/data/yuuno/css/header.css deleted file mode 100644 index beb2f41..0000000 --- a/content/data/yuuno/css/header.css +++ /dev/null @@ -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; -} diff --git a/content/data/yuuno/css/inputstyling.css b/content/data/yuuno/css/inputstyling.css deleted file mode 100644 index e4f23da..0000000 --- a/content/data/yuuno/css/inputstyling.css +++ /dev/null @@ -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; -} diff --git a/content/data/yuuno/css/keyframes.css b/content/data/yuuno/css/keyframes.css deleted file mode 100644 index e56fdac..0000000 --- a/content/data/yuuno/css/keyframes.css +++ /dev/null @@ -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%; - } - -} diff --git a/content/data/yuuno/css/members.css b/content/data/yuuno/css/members.css deleted file mode 100644 index 3d7d8af..0000000 --- a/content/data/yuuno/css/members.css +++ /dev/null @@ -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; -} diff --git a/content/data/yuuno/css/messages.css b/content/data/yuuno/css/messages.css deleted file mode 100644 index ad19e5b..0000000 --- a/content/data/yuuno/css/messages.css +++ /dev/null @@ -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; -} diff --git a/content/data/yuuno/css/news.css b/content/data/yuuno/css/news.css deleted file mode 100644 index 2f16a89..0000000 --- a/content/data/yuuno/css/news.css +++ /dev/null @@ -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; - } - -} diff --git a/content/data/yuuno/css/notifications.css b/content/data/yuuno/css/notifications.css deleted file mode 100644 index 645a608..0000000 --- a/content/data/yuuno/css/notifications.css +++ /dev/null @@ -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; -} diff --git a/content/data/yuuno/css/profile.css b/content/data/yuuno/css/profile.css deleted file mode 100644 index 1b56b5d..0000000 --- a/content/data/yuuno/css/profile.css +++ /dev/null @@ -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; - } - -} diff --git a/content/data/yuuno/css/settings.css b/content/data/yuuno/css/settings.css deleted file mode 100644 index cc4f8fc..0000000 --- a/content/data/yuuno/css/settings.css +++ /dev/null @@ -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; -} diff --git a/content/data/yuuno/css/yuuno.css b/content/data/yuuno/css/yuuno.css index e9cc507..19f127a 100644 --- a/content/data/yuuno/css/yuuno.css +++ b/content/data/yuuno/css/yuuno.css @@ -12,19 +12,1471 @@ /* Import Segoe UI */ @import url('/fonts/segoeui-light/font.css'); -/* Import style parts */ -@import url('base.css'); -@import url('keyframes.css'); -@import url('notifications.css'); -@import url('header.css'); -@import url('footer.css'); +/* Import markdown specific style */ @import url('markdown.css'); -@import url('news.css'); -@import url('profile.css'); -@import url('settings.css'); -@import url('members.css'); -@import url('donate.css'); -@import url('inputstyling.css'); -@import url('authpage.css'); -@import url('forums.css'); -@import url('messages.css'); + +/* + * Animation Keyframes + */ +/* 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%; + } + +} + +/* + * Standard Elements + */ +* { + /* 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; +} + +/* + * Site header styling + */ +.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; +} + +/* + * Site footer styling + */ +.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%; +} + +/* + * Authentication page Styling + */ +.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; +} + +/* + * Members page Styling + */ +.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; +} + +/* + * Notification styling + */ +#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; +} + +/* + * Private Messages Styling + */ +.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; +} + +/* + * News page styling + */ +.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; + } + +} + +/* + * Profile page Styling + */ +.profile { + background: rgba(211, 191, 255, .8) !important; +} + +.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; + } + +} + +/* + * Settings page styling + */ +.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; +} + +/* + * Donation page Styling + */ +.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; +} + +/* + * Input box Styling + */ +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; +} + +/* + * Forum Styling + */ +.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; +} diff --git a/content/images/backgrounds/.htaccess b/content/images/backgrounds/.htaccess deleted file mode 100644 index 233bcf4..0000000 --- a/content/images/backgrounds/.htaccess +++ /dev/null @@ -1 +0,0 @@ -# Profile background directory diff --git a/content/images/triangles.png b/content/images/triangles.png new file mode 100644 index 0000000..8bbf76d Binary files /dev/null and b/content/images/triangles.png differ diff --git a/content/images/avatars/.htaccess b/content/images/user/.htaccess similarity index 100% rename from content/images/avatars/.htaccess rename to content/images/user/.htaccess diff --git a/main/.htaccess b/main/.htaccess index 09d7a92..4aa4dd7 100644 --- a/main/.htaccess +++ b/main/.htaccess @@ -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 diff --git a/main/authenticate.php b/main/authenticate.php index 71f45f9..924f3d1 100644 --- a/main/authenticate.php +++ b/main/authenticate.php @@ -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.' ]; diff --git a/main/imageserve.php b/main/imageserve.php index 0b4828f..47bc28a 100644 --- a/main/imageserve.php +++ b/main/imageserve.php @@ -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: diff --git a/main/index.php b/main/index.php index feeff1a..2daac7e 100644 --- a/main/index.php +++ b/main/index.php @@ -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'] = [ diff --git a/main/members.php b/main/members.php index cd3a4c5..d7c2a5e 100644 --- a/main/members.php +++ b/main/members.php @@ -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) ]; diff --git a/main/profile.php b/main/profile.php index 647e58f..23eb9bd 100644 --- a/main/profile.php +++ b/main/profile.php @@ -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) ];