diff --git a/_sakura/components/BBcode.php b/_sakura/components/BBcode.php
new file mode 100644
index 0000000..22f5a9d
--- /dev/null
+++ b/_sakura/components/BBcode.php
@@ -0,0 +1,14 @@
+setTemplate(Configuration::getConfig('site_style'));
+
+ // Set a fallback
+ $this->setFallback(Configuration::getConfig('site_style'));
+ }
+
+ // Set a template name
+ public function setTemplate($name) {
+ // Assign config path to a variable so we don't have to type it out twice
+ $confPath = ROOT . '_sakura/templates/' . $name . '/template.ini';
+
+ // Check if the configuration file exists
+ if (!file_exists($confPath)) {
+ trigger_error('Template configuration does not exist', E_USER_ERROR);
+ }
+
+ // Parse and store the configuration
+ $this->templateOptions = parse_ini_file($confPath, true);
+
+ // Make sure we're not using a manage template for the main site or the other way around
+ if (defined('SAKURA_MANAGE') && (bool) $this->templateOptions['manage']['mode'] != (bool) SAKURA_MANAGE) {
+ trigger_error('Incorrect template type', E_USER_ERROR);
+ }
+
+ // Set variables
+ $this->templateName = $name;
+
+ // Reinitialise
+ $this->initTemplate();
+ }
+
+ // Initialise main template engine
+ public function initTemplate() {
+ // Initialise Twig Filesystem Loader
+ $twigLoader = new Twig_Loader_Filesystem(ROOT . '_sakura/templates/' . $this->templateName);
+
+ // Environment variable
+ $twigEnv = [];
+
+ // Enable caching
+ if (Configuration::getConfig('enable_tpl_cache')) {
+ $twigEnv['cache'] = ROOT . 'cache';
+ }
+
+ // And now actually initialise the templating engine
+ $this->template = new Twig_Environment($twigLoader, $twigEnv);
+
+ // Load String template loader
+ $this->template->addExtension(new Twig_Extension_StringLoader());
+ }
+
+ // Set a fallback
+ private function setFallback($name) {
+ // Assign config path to a variable so we don't have to type it out twice
+ $confPath = ROOT . '_sakura/templates/' . $name . '/template.ini';
+
+ // Check if the configuration file exists
+ if (!file_exists($confPath)) {
+ trigger_error('Template configuration does not exist', E_USER_ERROR);
+ }
+
+ // Parse and store the configuration
+ $this->fallbackOptions = parse_ini_file($confPath, true);
+
+ // Make sure we're not using a manage template for the main site or the other way around
+ if (defined('SAKURA_MANAGE') && (bool) $this->fallbackOptions['manage']['mode'] != (bool) SAKURA_MANAGE) {
+ trigger_error('Incorrect template type', E_USER_ERROR);
+ }
+
+ // Set variables
+ $this->fallbackName = $name;
+
+ // Reinitialise
+ $this->initFallback();
+ }
+
+ // Initialise main fallback engine
+ public function initFallback() {
+ // Initialise Twig Filesystem Loader
+ $twigLoader = new Twig_Loader_Filesystem(ROOT . '_sakura/templates/' . $this->fallbackName);
+
+ // Environment variable
+ $twigEnv = [];
+
+ // Enable caching
+ if (Configuration::getConfig('enable_tpl_cache')) {
+ $twigEnv['cache'] = ROOT . 'cache';
+ }
+
+ // And now actually initialise the templating engine
+ $this->fallback = new Twig_Environment($twigLoader, $twigEnv);
+
+ // Load String template loader
+ $this->fallback->addExtension(new Twig_Extension_StringLoader());
+ }
+
+ // Set variables
+ public function setVariables($vars) {
+ $this->vars = array_merge($this->vars, $vars);
+ }
+
+ // Render a template
+ public function render($file)
+ {
+ try {
+ return $this->template->render($file, $this->vars);
+ } catch (\Exception $e) {
+ try {
+ return $this->fallback->render($file, $this->vars);
+ } catch (\Exception $e) {
+ trigger_error($e->getMessage(), E_USER_ERROR);
+ }
+ }
+ }
}
diff --git a/_sakura/sakura.php b/_sakura/sakura.php
index c4b97aa..5719c21 100755
--- a/_sakura/sakura.php
+++ b/_sakura/sakura.php
@@ -8,7 +8,7 @@
namespace Sakura;
// Define Sakura version
-define('SAKURA_VERSION', '20151024');
+define('SAKURA_VERSION', '20151031');
define('SAKURA_VLABEL', 'Eminence');
define('SAKURA_COLOUR', '#6C3082');
define('SAKURA_STABLE', false);
@@ -34,6 +34,7 @@ require_once ROOT . '_sakura/components/Hashing.php';
require_once ROOT . '_sakura/components/Configuration.php';
require_once ROOT . '_sakura/components/Database.php';
require_once ROOT . '_sakura/components/Urls.php';
+require_once ROOT . '_sakura/components/Template.php';
require_once ROOT . '_sakura/components/Templates.php';
require_once ROOT . '_sakura/components/Permissions.php';
require_once ROOT . '_sakura/components/Session.php';
diff --git a/_sakura/templates/misaki/main/profile.tpl b/_sakura/templates/misaki/main/profile.tpl
index 38383f4..e5cf687 100755
--- a/_sakura/templates/misaki/main/profile.tpl
+++ b/_sakura/templates/misaki/main/profile.tpl
@@ -14,44 +14,34 @@
background-image: linear-gradient(0deg, transparent 0%, transparent 12%, rgba(0, 0, 0, .7) 30%,
transparent 76%, transparent 100%), url('{{ urls.format('IMAGE_HEADER', [profile.data.user_id]) }}');
}
+
+ #profileHeader.floating {
+ background-image: linear-gradient(90deg, transparent 0%, transparent 40%, #3A2E44 45%), url('{{ urls.format('IMAGE_HEADER', [profile.data.user_id]) }}');
+ background-size: auto 130px;
+ background-repeat: no-repeat;
+ background-position: left top;
+ }
{% endblock %}
-{# block js %}
+{% block js %}
-{% endblock #}
+{% endblock %}
{% block content %}
diff --git a/public/content/data/misaki/css/misaki.css b/public/content/data/misaki/css/misaki.css
index 92a6f83..bb7068b 100755
--- a/public/content/data/misaki/css/misaki.css
+++ b/public/content/data/misaki/css/misaki.css
@@ -265,7 +265,7 @@ a:active {
padding-bottom: 100px;
}
-#wrapper > #content {
+#content {
position: relative;
max-width: 1018px;
margin: 0 auto;
@@ -276,16 +276,20 @@ a:active {
border: 1px solid rgba(148, 117, 178, .6);
}
+#content.floatingNavigation {
+ padding-top: 37px;
+}
+
/*
* Header navigation
*/
-#content > #navigation {
+#navigation {
width: 100%;
- height: 30px;
+ height: 25px;
background: linear-gradient(0deg, transparent, #453851 50%, #342740) transparent;
font-family: "Exo2-0-LightItalic", sans-serif;
- font-size: 2em;
- line-height: 30px;
+ font-size: 1.5em;
+ line-height: 25px;
letter-spacing: 0;
text-shadow: 1px 1px 3px #111;
margin-bottom: 5px;
@@ -294,14 +298,19 @@ a:active {
max-width: 1018px;
}
-#content > #navigation > ul > li {
+#content.floatingNavigation #navigation {
+ position: fixed;
+ top: 0;
+}
+
+#navigation > ul > li {
list-style: none;
float: left;
}
-#content > #navigation > ul > li > a:not(.ignore) {
- height: 30px;
- line-height: 30px;
+#navigation > ul > li > a:not(.ignore) {
+ height: 25px;
+ line-height: 25px;
display: inline-block;
text-align: center;
color: inherit;
@@ -310,56 +319,57 @@ a:active {
transition: .2s;
}
-#content > #navigation > ul > li > a {
+#navigation > ul > li > a {
z-index: 901;
position: relative;
}
-#content > #navigation > .nav-left > li > a:not(.ignore):hover {
+#navigation > .nav-left > li > a:not(.ignore):hover {
background: rgba(0, 0, 0, .2);
}
-#content > #navigation > .nav-left > li > a:not(.ignore):active {
+#navigation > .nav-left > li > a:not(.ignore):active {
background: rgba(0, 0, 0, .3);
}
-#content > #navigation .nav-usermenu > a {
+#navigation .nav-usermenu > a {
display: block !important;
text-align: right !important;
}
-#content > #navigation .nav-usermenu > a:after {
+#navigation .nav-usermenu > a:after {
font-family: FontAwesome;
content: " \f0d7";
}
-#content > #navigation .nav-usermenu:hover > a:after {
+#navigation .nav-usermenu:hover > a:after {
font-family: FontAwesome;
content: " \f0d8";
}
-#content > #navigation .nav-avatar {
- height: 30px;
- width: 30px;
+#navigation .nav-avatar {
+ height: 25px;
+ width: 25px;
background: url('/pixel.png') no-repeat scroll left center / cover transparent;
}
-#content > #navigation > ul > li > ul {
+#navigation > ul > li > ul {
display: none;
}
-#content > #navigation > ul > li:hover > ul {
+#navigation > ul > li:hover > ul {
display: block;
z-index: 900;
- background: rgba(69, 56, 81, .5);
+ background: rgba(69, 56, 81, .8);
position: absolute;
top: 0;
right: 0;
list-style: none;
- padding: 35px 4px 5px;
+ padding: 30px 4px 5px;
+ box-shadow: 0 2px 6px rgba(0, 0, 0, .75);
}
-#content > #navigation > ul > li > ul > li > a {
+#navigation > ul > li > ul > li > a {
color: inherit;
text-decoration: none;
display: block;
@@ -367,15 +377,15 @@ a:active {
padding: 2px 7px;
}
-#content > #navigation > ul > li > ul > li > a:hover {
- background: rgba(0, 0, 0, .1);
-}
-
-#content > #navigation > ul > li > ul > li > a:active {
+#navigation > ul > li > ul > li > a:hover {
background: rgba(0, 0, 0, .2);
}
-#content > #navigation .nav-usermenu ul {
+#navigation > ul > li > ul > li > a:active {
+ background: rgba(0, 0, 0, .3);
+}
+
+#navigation .nav-usermenu ul {
right: -30px;
text-align: right;
min-width: 150px;
@@ -404,8 +414,8 @@ a:active {
align-content: stretch;
width: 100%;
position: relative;
- top: -35px;
- margin-bottom: -35px;
+ top: -31px;
+ margin-bottom: -31px;
}
.profile .profileContainer {
@@ -436,6 +446,15 @@ a:active {
align-items: flex-end;
}
+#profileHeader.floating {
+ position: fixed;
+ top: 0;
+ padding-top: 30px;
+ max-width: 1018px;
+ height: 95px;
+ box-shadow: 0 2px 6px rgba(0, 0, 0, .75);
+}
+
#userAvatar {
font-size: 0;
background: transparent no-repeat scroll left center / cover;
@@ -446,6 +465,13 @@ a:active {
margin: 10px;
margin-bottom: -10px;
flex-shrink: 0;
+ transition: .2s;
+}
+
+#profileHeader.floating #userAvatar {
+ height: 100px;
+ width: 100px;
+ margin: 5px 5px -5px;
}
#profileHeader > .userData {
@@ -456,6 +482,14 @@ a:active {
width: 100%;
}
+#profileHeader.floating > .userData {
+ position: initial;
+ top: 0;
+ height: 100%;
+ font-size: .8em;
+ line-height: 1.5em;
+}
+
#profileHeader > .userData > .headerLeft {
flex-grow: 1;
}
@@ -478,6 +512,10 @@ a:active {
margin: 10px 10px 0 0;
}
+#profileContent.headerFloating {
+ margin-top: 264px;
+}
+
#profileContent > .userDataBar {
width: 210px;
margin-top: 10px;
diff --git a/public/content/data/misaki/js/misaki.js b/public/content/data/misaki/js/misaki.js
index 606db58..eec4e0e 100755
--- a/public/content/data/misaki/js/misaki.js
+++ b/public/content/data/misaki/js/misaki.js
@@ -84,15 +84,9 @@ function convertParallaxPositionValue(pos, dir, neg) {
window.addEventListener("scroll", function(e) {
if(e.pageY > 123) {
var content = document.getElementById('content');
- var navigation = document.getElementById('navigation');
- navigation.style.position = 'fixed';
- navigation.style.top = '0';
- content.style.paddingTop = '37px';
+ content.className = 'floatingNavigation';
} else {
var content = document.getElementById('content');
- var navigation = document.getElementById('navigation');
- navigation.style.position = null;
- navigation.style.top = null;
- content.style.paddingTop = null;
+ content.className = null;
}
});
diff --git a/public/index.php b/public/index.php
index 7bb31ee..d6345c6 100755
--- a/public/index.php
+++ b/public/index.php
@@ -74,5 +74,14 @@ $renderData['stats'] = [
'onlineUsers' => Users::checkAllOnline(),
];
+// Initialise templating engine
+$template = new Template();
+
+// Change templating engine
+$template->setTemplate($templateName);
+
+// Set parse variables
+$template->setVariables($renderData);
+
// Print page contents
-print Templates::render(($forumMode ? 'forum' : 'main') . '/index.tpl', $renderData);
+echo $template->render(($forumMode ? 'forum' : 'main') . '/index.tpl');