Merge pull request #108 from GameServerPanel/copilot/create-new-gsp-baseline

GSP 1.0 baseline: module version reset, FAQ refresh, XML editor validation, Obsidian theme
This commit is contained in:
Frank Harris 2026-05-03 16:36:18 -07:00 committed by GitHub
commit 6dbac841e3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
179 changed files with 3328 additions and 44 deletions

View file

@ -1,6 +1,12 @@
# Changelog
## 2026-05-02 (latest)
## 2026-05-03 (latest)
- **GSP 1.0 baseline:** Reset all bundled/core module versions to `1.0`. DB schema versions (`$db_version`) are unchanged.
- **FAQ module refresh:** Restored online RSS update code from upstream (opengamepanel.org), fixed `$local = false` initialization bug, switched local cache to `ogpfaq.rss`, added PHP 8.3-compatible `(array)` casts, restored upstream credits footer, and opened `navigation.xml` access to `user,admin,subuser`.
- **Config XML editor improvements:** Added schema validation before save (both structured editor and raw XML path); invalid XML is rejected with line-level error messages instead of being written to disk. Added auto-restore from backup on validation failure. Fields are now displayed in schema-defined order with required/optional badges. Added a raw XML editing panel with validation warning. Unknown/custom XML fields are preserved when only specific nodes are modified.
- **Obsidian theme:** Added `themes/Obsidian/` from `hmrserver/Obsidian`. The theme is immediately selectable in the panel theme settings.
- Removed 22 stray backup/duplicate files left by manual editing (`.bak`, `.BAK`, `.orig`, `.backup` extensions). Files inside `modules/config_games/server_configs/backup/` (intentional runtime backup folder) were left untouched.
## 2026-05-01

View file

@ -24,7 +24,7 @@
// Module general information
$module_title = "Addons Manager";
$module_version = "1.2";
$module_version = "1.0";
$db_version = 1;
$module_required = TRUE;
$module_menus = array( array( 'subpage' => 'addons_manager', 'name'=>'Addons Manager', 'group'=>'admin' ) );

View file

@ -24,7 +24,7 @@
// Module general information
$module_title = "Administration";
$module_version = "1.1";
$module_version = "1.0";
$db_version = 1;
$module_required = TRUE;
$module_menus = array( array( 'subpage' => 'watch_logger', 'name'=>'Watch Logger', 'group'=>'admin' ) );

View file

@ -8,7 +8,7 @@
//* navigation.xml (OPTIONAL):
$module_title = "Backup/Restore";
$module_version = "0.2";
$module_version = "1.0";
$db_version = 0;
$module_required = false;
?>

View file

@ -98,6 +98,77 @@ function config_games_next_form_key(): string
return 'node_' . $counter;
}
// Schema-defined element order and required/optional flags for game_config root.
// Source: modules/config_games/schema_server_config.xml (server_config_type sequence).
function config_games_schema_order(): array
{
return [
'game_key' => true,
'protocol' => false,
'lgsl_query_name' => false,
'gameq_query_name' => false,
'installer' => false,
'game_name' => true,
'server_exec_name' => true,
'query_port' => false,
'cli_template' => false,
'cli_params' => false,
'reserve_ports' => false,
'cli_allow_chars' => false,
'maps_location' => false,
'map_list' => false,
'console_log' => false,
'exe_location' => false,
'max_user_amount' => false,
'control_protocol' => false,
'control_protocol_type' => false,
'mods' => true,
'replace_texts' => false,
'server_params' => false,
'custom_fields' => false,
'list_players_command' => false,
'player_info_regex' => false,
'player_info' => false,
'player_commands' => false,
'pre_install' => false,
'post_install' => false,
'pre_start' => false,
'post_start' => false,
'environment_variables' => false,
'lock_files' => false,
'configuration_files' => false,
];
}
/**
* Validate an XML file against the game config schema.
* Returns an empty array on success, or an array of error strings on failure.
*/
function config_games_validate_xml_file(string $config_file): array
{
if (!file_exists($config_file) || !is_readable($config_file)) {
return ['Configuration file not found or unreadable: ' . htmlspecialchars($config_file, ENT_QUOTES, 'UTF-8')];
}
$prev = libxml_use_internal_errors(true);
libxml_clear_errors();
$dom = new DOMDocument();
if ($dom->load($config_file) === false) {
$errors = array_map(function ($e) { return trim($e->message) . ' (line ' . $e->line . ')'; }, libxml_get_errors());
libxml_clear_errors();
libxml_use_internal_errors($prev);
return $errors ?: ['XML is not well-formed.'];
}
if ($dom->schemaValidate(XML_SCHEMA) !== true) {
$errors = array_map(function ($e) { return trim($e->message) . ' (line ' . $e->line . ')'; }, libxml_get_errors());
libxml_clear_errors();
libxml_use_internal_errors($prev);
return $errors ?: ['XML failed schema validation.'];
}
libxml_clear_errors();
libxml_use_internal_errors($prev);
return [];
}
function config_games_print_editor_css()
{
static $printed = false;
@ -109,9 +180,14 @@ function config_games_print_editor_css()
<style>
.xml-editor-wrapper{margin:20px 0;padding:12px;background:#111;border:1px solid #222;border-radius:8px}
.xml-node{border:1px solid #333;border-radius:6px;padding:12px;margin-bottom:10px;background:#181818}
.xml-node--required{border-left:3px solid #1c6dd0}
.xml-node__header{display:flex;justify-content:space-between;align-items:center;gap:12px;border-bottom:1px solid #2a2a2a;padding-bottom:6px;margin-bottom:8px}
.xml-node__title{font-weight:600;color:#f5f5f5}
.xml-node__title--required::after{content:" *";color:#e06c75;font-size:0.8rem}
.xml-node__path{font-size:0.85rem;color:#989898}
.xml-node__badge{font-size:0.72rem;padding:2px 6px;border-radius:3px;text-transform:uppercase;letter-spacing:0.05em;margin-left:6px}
.xml-node__badge--required{background:#1c3a6d;color:#7eb3f0}
.xml-node__badge--optional{background:#2a2a2a;color:#888}
.xml-node__body label{font-size:0.85rem;color:#bbb;display:block;margin-bottom:4px}
.xml-node__body input[type="text"], .xml-node__body textarea, .xml-node__body select{width:100%;padding:8px;border:1px solid #3a3a3a;border-radius:4px;background:#101010;color:#fff;font-family:monospace}
.xml-node__body textarea{min-height:120px}
@ -127,12 +203,20 @@ function config_games_print_editor_css()
.xml-global-save:hover{background:#1f7aec;transform:translateY(-1px)}
.xml-global-save--top{float:right;margin:0 18px 12px 0}
.xml-hint{font-size:0.85rem;color:#999;margin-top:4px}
.xml-validation-errors{background:#2d0f0f;border:1px solid #8b1c1c;border-radius:6px;padding:12px 16px;margin-bottom:14px;color:#f88}
.xml-validation-errors ul{margin:6px 0 0 16px;padding:0}
.xml-raw-toggle{margin:8px 0 4px;color:#7eb3f0;cursor:pointer;font-size:0.9rem;text-decoration:underline;background:none;border:none;padding:0}
.xml-raw-section{margin-top:10px;display:none}
.xml-raw-section textarea{width:100%;min-height:300px;font-family:monospace;font-size:0.85rem;background:#0c0c0c;color:#eee;border:1px solid #3a3a3a;border-radius:4px;padding:8px}
.xml-raw-warning{background:#2d2200;border:1px solid #7a5a00;border-radius:4px;padding:8px 12px;color:#f0c050;font-size:0.85rem;margin-bottom:6px}
.xml-section-header{margin:20px 0 4px;font-size:0.8rem;color:#888;text-transform:uppercase;letter-spacing:0.1em;border-bottom:1px solid #2a2a2a;padding-bottom:4px}
</style>
CSS;
}
function config_games_render_node(SimpleXMLElement $node, array $ancestors, array &$counters, int $depth = 0)
function config_games_render_node(SimpleXMLElement $node, array $ancestors, array &$counters, int $depth = 0, ?bool $isRequired = null)
{
$schemaOrder = config_games_schema_order();
$name = $node->getName();
$pathKey = implode('/', $ancestors) === '' ? $name : implode('/', $ancestors) . '/' . $name;
$counters[$pathKey] = ($counters[$pathKey] ?? 0) + 1;
@ -149,9 +233,18 @@ function config_games_render_node(SimpleXMLElement $node, array $ancestors, arra
$displayPath = htmlspecialchars(str_replace('[', '[', $rawPath), ENT_QUOTES, 'UTF-8');
$isScript = in_array(strtolower($name), ['pre_install','post_install','precmd','postcmd','cli_template']);
$html = "<div class='xml-node depth-{$depth}'>";
// Determine required status: use passed value, fall back to schema lookup for top-level nodes
if ($isRequired === null) {
$isRequired = $depth === 1 && array_key_exists($name, $schemaOrder) ? $schemaOrder[$name] : false;
}
$nodeClass = 'xml-node depth-' . $depth . ($isRequired ? ' xml-node--required' : '');
$badge = $isRequired
? "<span class='xml-node__badge xml-node__badge--required'>required</span>"
: "<span class='xml-node__badge xml-node__badge--optional'>optional</span>";
$html = "<div class='{$nodeClass}'>";
$actionId = 'node_action_' . substr(md5($safePath . $index), 0, 8);
$html .= "<div class='xml-node__header'><div><div class='xml-node__title'>{$safeLabel}</div><div class='xml-node__path'>{$displayPath}</div></div>";
$html .= "<div class='xml-node__header'><div><div class='xml-node__title'>{$safeLabel}{$badge}</div><div class='xml-node__path'>{$displayPath}</div></div>";
$html .= "<div class='xml-node__actions'><label for=\"{$actionId}\">Action</label>";
$html .= "<select id=\"{$actionId}\" name=\"nodes[{$safeNodeKey}][action]\"><option value='keep'>Save Changes</option><option value='remove'>Remove Node</option></select>";
$html .= "<button type='submit' name='save_xml' value='1' class='xml-node__apply'>Apply</button></div></div>";
@ -201,25 +294,59 @@ function config_games_render_node(SimpleXMLElement $node, array $ancestors, arra
function config_games_render_editor(SimpleXMLElement $xml)
{
config_games_print_editor_css();
$schemaOrder = config_games_schema_order();
$rootName = $xml->getName();
$html = "<div class='xml-editor-wrapper'>";
$counters = [];
foreach ($xml->children() as $child) {
$html .= config_games_render_node($child, [$rootName], $counters);
// Sort top-level children by schema order; unknown elements follow at the end.
$children = iterator_to_array($xml->children(), false);
usort($children, function ($a, $b) use ($schemaOrder) {
$nameA = $a->getName();
$nameB = $b->getName();
$orderKeys = array_keys($schemaOrder);
$posA = ($idx = array_search($nameA, $orderKeys)) !== false ? $idx : PHP_INT_MAX;
$posB = ($idx = array_search($nameB, $orderKeys)) !== false ? $idx : PHP_INT_MAX;
return $posA <=> $posB;
});
$lastSection = null;
foreach ($children as $child) {
$cName = $child->getName();
$isRequired = $schemaOrder[$cName] ?? null;
// Print section dividers between required and optional groups
$section = ($isRequired === true) ? 'required' : (($isRequired === false) ? 'optional' : 'custom');
if ($section !== $lastSection) {
if ($section === 'required') {
$html .= "<div class='xml-section-header'>&#x2605; Required Fields</div>";
} elseif ($section === 'optional') {
$html .= "<div class='xml-section-header'>Optional Fields</div>";
} else {
$html .= "<div class='xml-section-header'>Custom / Unknown Fields</div>";
}
$lastSection = $section;
}
$html .= config_games_render_node($child, [$rootName], $counters, 0, $isRequired);
}
$html .= "</div>";
return $html;
}
/**
* Save XML from structured form nodes payload.
* Validates against the schema before writing.
* Returns true on success, or an array of error strings on failure.
*/
function config_games_save_xml($db, $home_cfg_id, array $nodesPayload)
{
$cfg_info = $db->getGameCfg($home_cfg_id);
if ($cfg_info === FALSE) {
return false;
return ['Configuration record not found in database.'];
}
$config_file = SERVER_CONFIG_LOCATION . $cfg_info['home_cfg_file'];
if (!file_exists($config_file) || !is_readable($config_file)) {
return false;
return ['Configuration file not found or not readable: ' . htmlspecialchars($config_file, ENT_QUOTES, 'UTF-8')];
}
$nodes = [];
foreach ((array)$nodesPayload as $key => $data) {
@ -232,14 +359,16 @@ function config_games_save_xml($db, $home_cfg_id, array $nodesPayload)
$nodes[$cleanPath] = $data;
}
if (empty($nodes)) {
return false;
return ['No node data was submitted.'];
}
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
if (@$dom->load($config_file) === false) {
return false;
return ['The configuration file could not be parsed as XML. It may be malformed.'];
}
// Keep a backup of the original content so we can restore on validation failure.
$backup = file_get_contents($config_file);
$xpath = new DOMXPath($dom);
uksort($nodes, function ($a, $b) {
return substr_count($b, '/') <=> substr_count($a, '/');
@ -295,7 +424,20 @@ function config_games_save_xml($db, $home_cfg_id, array $nodesPayload)
}
}
if ($dom->save($config_file) === false) {
return false;
// Restore backup on write failure
if (isset($backup)) {
file_put_contents($config_file, $backup);
}
return ['Failed to write the configuration file. Check file permissions.'];
}
// Validate the saved file against the schema.
$errors = config_games_validate_xml_file($config_file);
if (!empty($errors)) {
// Restore original on schema failure
if (isset($backup)) {
file_put_contents($config_file, $backup);
}
return $errors;
}
$savedContents = @file_get_contents($config_file);
if ($savedContents !== false) {
@ -381,11 +523,51 @@ function exec_ogp_module() {
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_xml']) && isset($_POST['home_cfg_id'])) {
$edit_id = (int)$_POST['home_cfg_id'];
$nodesPayload = isset($_POST['nodes']) && is_array($_POST['nodes']) ? $_POST['nodes'] : [];
if (config_games_save_xml($db, $edit_id, $nodesPayload)) {
print_success(get_lang('configs_updated_ok'));
// Raw XML save path
if (isset($_POST['raw_xml_content'])) {
$cfg_info = $db->getGameCfg($edit_id);
if ($cfg_info !== FALSE) {
$config_file = SERVER_CONFIG_LOCATION . $cfg_info['home_cfg_file'];
$raw_content = $_POST['raw_xml_content'];
// Write to a temp file for validation
$tmp = tempnam(sys_get_temp_dir(), 'gsp_xml_');
file_put_contents($tmp, $raw_content);
$xmlErrors = config_games_validate_xml_file($tmp);
@unlink($tmp);
if (!empty($xmlErrors)) {
echo "<div class='xml-validation-errors'><strong>&#x26A0; XML validation failed &mdash; file was NOT saved:</strong><ul>";
foreach ($xmlErrors as $err) {
echo "<li>" . htmlspecialchars($err, ENT_QUOTES, 'UTF-8') . "</li>";
}
echo "</ul></div>";
} else {
if (file_put_contents($config_file, $raw_content) !== false) {
print_success(get_lang('configs_updated_ok'));
$config = read_server_config($config_file);
if ($config !== FALSE) {
$db->addGameCfg($config);
}
} else {
print_failure('Failed to write configuration file. Check permissions.');
}
}
} else {
print_failure('Configuration record not found.');
}
} else {
print_failure('Failed to save XML configuration.');
$nodesPayload = isset($_POST['nodes']) && is_array($_POST['nodes']) ? $_POST['nodes'] : [];
$result = config_games_save_xml($db, $edit_id, $nodesPayload);
if ($result === true) {
print_success(get_lang('configs_updated_ok'));
} else {
$errors = is_array($result) ? $result : ['Failed to save XML configuration.'];
echo "<div class='xml-validation-errors'><strong>&#x26A0; XML validation failed &mdash; file was NOT saved:</strong><ul>";
foreach ($errors as $err) {
echo "<li>" . htmlspecialchars($err, ENT_QUOTES, 'UTF-8') . "</li>";
}
echo "</ul></div>";
}
}
$_GET['home_cfg_id'] = $edit_id;
}
@ -464,17 +646,36 @@ function exec_ogp_module() {
echo "<a href='?m=config_games&home_cfg_id=".$home_cfg_id."&delete'>".get_lang_f('delete_game_config_for',$cfg_info['game_name']." $os $arch")."</a><br>";
$xml = @simplexml_load_file($config_file);
// Also show any schema validation errors on the current file (informational, before editing)
$existingErrors = config_games_validate_xml_file($config_file);
if (!empty($existingErrors)) {
echo "<div class='xml-validation-errors'><strong>&#x26A0; This file currently fails schema validation:</strong><ul>";
foreach ($existingErrors as $err) {
echo "<li>" . htmlspecialchars($err, ENT_QUOTES, 'UTF-8') . "</li>";
}
echo "</ul></div>";
}
if ($xml === false) {
print_failure(get_lang_f("error_when_handling_file",$config_file));
} else {
$raw_xml_content = htmlspecialchars(file_get_contents($config_file), ENT_QUOTES, 'UTF-8');
echo "<form action='?m=config_games&amp;home_cfg_id=".$home_cfg_id."' method='post'>";
echo "<input type='hidden' name='home_cfg_id' value='".(int)$home_cfg_id."'>";
echo "<button type='submit' name='save_xml' value='1' class='xml-global-save xml-global-save--top'>".get_lang('save')."</button>";
echo "<div style='clear:both'></div>";
echo config_games_render_editor($xml);
echo "<div class='xml-actions'><button type='submit' name='save_xml' value='1' class='xml-global-save'>".get_lang('save')."</button></div>";
echo "<p class='note'>&#x2605; = required field. Use the action dropdown to remove entire sections. Attribute values left blank will be removed. Script sections such as post_install are fully editable. Changes are validated against the schema before saving.</p>";
// Raw XML editor
echo "<hr style='margin:24px 0;border-color:#333'>";
echo "<h3 style='margin-bottom:8px'>Raw XML Editor</h3>";
echo "<div class='xml-raw-warning'>&#x26A0; <strong>Warning:</strong> Saving raw XML bypasses the guided editor. The file will be validated against the schema before saving. Invalid XML will be rejected.</div>";
echo "<button type='button' class='xml-raw-toggle' onclick=\"var s=document.getElementById('raw_xml_section');s.style.display=s.style.display==='none'?'block':'none'\">Toggle Raw XML Editor</button>";
echo "<div id='raw_xml_section' class='xml-raw-section'>";
echo "<textarea name='raw_xml_content'>{$raw_xml_content}</textarea>";
echo "<div class='xml-actions' style='margin-top:8px'><button type='submit' name='save_xml' value='1' class='xml-global-save'>Save Raw XML</button></div>";
echo "</div>";
echo "</form>";
echo "<p class='note'>Use the action dropdown to remove entire sections. Attribute values left blank will be removed. Script sections such as post_install are fully editable.</p>";
}
}
}

View file

@ -24,6 +24,6 @@
// Module general information
$module_title = "Edit Config Files";
$module_version = "0.2";
$module_version = "1.0";
$db_version = 0;
$module_required = false;

View file

@ -36,11 +36,11 @@ function exec_ogp_module()
require 'modules/faq/rss_php.php';
$url = 'https://opengamepanel.org/faq/rss.php';
$local_copy = 'modules/faq/faq.rss'; ## Relative path
$save_as = realpath('modules' . DIRECTORY_SEPARATOR . 'faq') . DIRECTORY_SEPARATOR . 'faq.rss';
$local_copy = 'modules/faq/ogpfaq.rss'; ## Relative path
$save_as = realpath('modules' . DIRECTORY_SEPARATOR . 'faq') . DIRECTORY_SEPARATOR . 'ogpfaq.rss';
## Full path (adding the filename to realpath would fail if the file does not exists yet)
$online = false;
$local = true;
$local = false;
$updated = false;
$s = (isset($_SERVER['HTTPS'])) ? "s" : "";
$p = (isset($_SERVER['SERVER_PORT']) and $_SERVER['SERVER_PORT'] != "80") ? ":".$_SERVER['SERVER_PORT'] : "";
@ -57,8 +57,7 @@ function exec_ogp_module()
$items = $rss->getItems(); #returns all rss items
$local = true;
}
/*
echo "<script>console.log('Last Update : ".date("r", filemtime($save_as))."\\nCurrent Time: ".date('r',time())."\\nNext Update : ".date('r', strtotime("+1 day", filemtime($save_as)))."');</script>";
echo "<script>console.log('Last Update : ".(file_exists($save_as) ? date("r", filemtime($save_as)) : 'N/A')."\\nCurrent Time: ".date('r',time())."\\nNext Update : ".(file_exists($save_as) ? date('r', strtotime("+1 day", filemtime($save_as))) : 'N/A')."');</script>";
if( ($local AND ( strtotime("+1 day", filemtime($save_as)) <= strtotime("now") )) OR !$local) # Check the file is older than 1 day to avoid spamming the server
{
stream_context_set_default(array('ssl' => array(
@ -66,13 +65,13 @@ function exec_ogp_module()
'verify_peer_name' => false
)
));
$headers = get_headers( $url, 1 );
$headers = @get_headers( $url, 1 );
touch( $save_as ); # Connection done, so we reset the file modification time even if the server is down (avoid server spamming)
echo "<script>console.log('Trying to connect to ".$url."');</script>";
if( $headers[0] == 'HTTP/1.1 200 OK')
if( is_array($headers) && isset($headers[0]) && $headers[0] == 'HTTP/1.1 200 OK')
{
$online = false;
$online = true;
$rss_online = new rss_php;
$rss_online->load($url); # SERVER USAGE WARNING : using 32kb of server bandwidth each time each person loads this function
$items_online = $rss_online->getItems();
@ -111,7 +110,6 @@ function exec_ogp_module()
$rss->load($local_url);
$items = $rss->getItems(); #returns all rss items
}
*/
if(!file_exists($save_as))
{
@ -147,11 +145,15 @@ function exec_ogp_module()
echo "<div class='footer' >".
"<div style='display:block;float:left' >".
"<b class='imagetext'></b><br>".
"<b class='imagetext'>Powered by:</b><br>".
"<a href='http://docs.s9y.org/index.html' target='_blank' ><img class='footerimg' style='height:50px;' src='http://docs.s9y.org/img/logos/s9y.png'></a>".
"</div>".
"<div class='credits' style='display:block;float:right' >".
"<b>Credits:</b><br>".
"<div class='credittext'><br>".
"<div class='credittext'>Original Idea | Chief Content Maintainer : <b>omano</b> at opengamepanel.org<br>".
"Front End Developer | <b>james30263</b> at opengamepanel.org<br>".
"Back End Developer | <b>DieFeM</b> at opengamepanel.org<br>".
"Beta Tester | Content Maintainer : <b>rocco</b> at opengamepanel.org</div>".
"</div>".
"</div>";
}

View file

@ -1,3 +1,3 @@
<navigation>
<page key="default" file="faq.php" access="user,admin" />
<page key="default" file="faq.php" access="user,admin,subuser" />
</navigation>

View file

@ -24,7 +24,7 @@
// Module general information
$module_title = "ftp";
$module_version = "1.41";
$module_version = "1.0";
$db_version = 1;
$module_required = TRUE;
$module_menus = array( array( 'subpage' => 'ftp_admin', 'name'=>'FTP Admin', 'group'=>'admin' ) );

View file

@ -24,7 +24,7 @@
// Module general information
$module_title = "Lite File Manager";
$module_version = "1.11";
$module_version = "1.0";
$db_version = 1;
$module_required = TRUE;
$module_menus = array( array( 'subpage' => 'litefm_settings', 'name'=>'LiteFM Settings', 'group'=>'admin' ) );

View file

@ -24,7 +24,7 @@
// Module general information
$module_title = "Module manager";
$module_version = "1.1";
$module_version = "1.0";
$db_version = 1;
$module_required = TRUE;
$module_menus = array(

View file

@ -24,7 +24,7 @@
// Module general information
$module_title = "NewsLister";
$module_version = "0.9";
$module_version = "1.0";
$db_version = 0;
$module_required = FALSE;
$module_menus = array( array( 'subpage' => 'news', 'name'=>'News', 'group'=>'user' ),

View file

@ -24,7 +24,7 @@
// Module general information
$module_title = "register";
$module_version = "1.2";
$module_version = "1.0";
$db_version = 0;
$module_required = TRUE;
$module_menus = array( array( 'subpage' => 'form', 'name'=>'Register', 'group'=>'guest' ) );

View file

@ -24,7 +24,7 @@
// Module general information
$module_title = "Server manager";
$module_version = "1.6.1";
$module_version = "1.0";
$db_version = 1;
$module_required = TRUE;
$module_menus = array(

View file

@ -24,7 +24,7 @@
// Module general information
$module_title = "Settings";
$module_version = "1.1";
$module_version = "1.0";
$db_version = 1;
$module_required = TRUE;
$module_menus = array(

View file

@ -24,7 +24,7 @@
// Module general information
$module_title = "Update";
$module_version = "1.2";
$module_version = "1.0";
$db_version = 3; // avoid 'duplicate table' error message.
$module_required = TRUE;
$module_menus = array(

View file

@ -24,7 +24,7 @@
// Module general information
$module_title = "User admin";
$module_version = "1.1";
$module_version = "1.0";
$db_version = 7;
$module_required = TRUE;
$module_menus = array(

View file

@ -24,7 +24,7 @@
// Module general information
$module_title = "User games";
$module_version = "1.3";
$module_version = "1.0";
$db_version = 3;
$module_required = TRUE;
$module_menus = array(

View file

@ -24,7 +24,7 @@
// Module general information
$module_title = "Utilities";
$module_version = "2.0";
$module_version = "1.0";
$db_version = 0;
$module_required = TRUE;
$module_menus = array( array( 'subpage' => '', 'name'=>'Utilities', 'group'=>'user' ) );

1
obsidian-upstream Submodule

@ -0,0 +1 @@
Subproject commit 471c3829b9d252703bca603620e8318d9f28b24a

View file

@ -0,0 +1,4 @@
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,19 @@
<script>
(function() {
var nodes = document.getElementById('submenu_0').getElementsByTagName('span');
for(var i=0; i<nodes.length; i++) {
iconPath = nodes[i].getAttribute("data-icon_path");
if(typeof iconPath != "undefined" && iconPath != "")
{
nodes[i].style.background = "url("+iconPath+") 0% 50% / 16px 16px no-repeat scroll transparent";
nodes[i].style.padding = "5px 0 5px 25px";
}
}
})();
</script>
<div id="bottomWrapper">
<div class="image" style="padding-top:20px"> Crafted with <i class="fa fa-heart pulse_heart" original-title="Love"></i> by <a href="https://github.com/hmrserver/" style="color: rgb(23, 108, 235);">HMR</a>
%footer%
</div>
</div>
</div>

View file

@ -0,0 +1,82 @@
<?php
if(!isset($_SESSION)){
session_name("opengamepanel_web");
session_start();
}
if ($_POST && ($_SESSION['users_group'] == 'admin')) {
if(isset($_POST['favicon'])) {
ConfigWrite('favicon', $_POST['favicon']);
}
if(isset($_POST['loginbg'])) {
ConfigWrite('loginbg', $_POST['loginbg']);
}
if(isset($_POST['bgblur'])) {
ConfigWrite('bgblur', $_POST['bgblur']);
}
if(isset($_POST['logo'])) {
ConfigWrite('logo', $_POST['logo']);
}
if(isset($_POST['pace']) && file_get_contents("../css/pace/".$_POST['pace'].".css")) {
ConfigWrite('pace', $_POST['pace']);
copyemz("../css/pace/".$_POST['pace'].".css","../css/pace/pace.css");
}
if(isset($_POST['responsive'])) {
ConfigWrite('responsive', $_POST['responsive']);
}
}
function copyemz($file1,$file2){
$error = null;
$contentx = '';
$econtex = '';
if(!file_get_contents($file1)) {
$error[1]=error_get_last();
} else {
$contentx =@file_get_contents($file1);
}
if(!fopen($file2, "w")) {
$error[2]=error_get_last();
} else {
$openedfile = fopen($file2, "w");
}
if(!@fwrite($openedfile, $contentx)) {
$error[3]=error_get_last();
}
if(!@fclose($openedfile)) {
$error[4]=error_get_last();
}
if($error) {
$errorlog = fopen("error.log", "w");
foreach($error as $element) {
if($element) {
$econtex = $element['message'];
break;
}
}
fwrite($errorlog, $econtex);
fclose($errorlog);
}
}
function ConfigWrite( $type, $data) {
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->formatOutput = true;
$xml->preserveWhiteSpace = false;
$xml->load('config.xml');
$theme = $xml->getElementsByTagName('theme')->item(0);
$type = $theme->getElementsByTagName($type)->item(0);
$type->nodeValue = $data;
htmlentities($xml->save('config.xml'));
}
function ConfigRead($type) {
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->formatOutput = true;
$xml->preserveWhiteSpace = false;
$xml->load('config.xml');
$theme = $xml->getElementsByTagName('theme')->item(0);
$type = $theme->getElementsByTagName($type)->item(0);
return $type->nodeValue;
}
?>

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<theme>
<favicon>themes/Obsidian/images/favicon.ico</favicon>
<loginbg>themes/Obsidian/images/bg.jpg</loginbg>
<bgblur>0</bgblur>
<logo>themes/Obsidian/images/logo.png</logo>
<pace>default</pace>
<responsive>0</responsive>
</theme>

View file

@ -0,0 +1 @@
.login_header{font-size:20px!important;text-transform:uppercase;font-weight:400;padding:10px 25px 2px 25px;background-color:rgba(25,48,65,0.301)}.register_header{font-size:20px!important;text-transform:uppercase;font-weight:400;padding:10px 25px 2px 25px;background-color:#1930414d}#ulogin,input[name="upassword"],#ulogin:hover,input[name="upassword"]:hover{width:320px;height:25px;padding:3px;border-bottom:1px solid #b1b0b0!important;background:transparent;color:#eee;border:1px solid transparent}#ulogin::-webkit-input-placeholder,input[name="upassword"]::-webkit-input-placeholder{color:#eee}#ulogin:focus,input[name="upassword"]:focus{border-bottom:2px solid #fff!important;border:1px solid transparent;color:#37b799;outline:-webkit-focus-ring-color auto 0}.uregister,.uregister:hover{width:320px;height:25px;padding:3px!important;border-color:none!important;border-radius:0;background:transparent!Important;color:#eee!important;border:1px solid transparent!important;border-bottom:1px solid #b1b0b0!important}.uregister:focus{border-bottom:2px solid #fff!important;border:1px solid transparent}.login_button:hover{color:#398bba;transition:all 300ms linear}.login_button{width:320px;background-color:#378cd5;padding:8px!important;color:#fff;text-transform:uppercase;font-size:14px;cursor:pointer;transition:all 300ms linear;border-radius:2px}.register_button:hover{color:#398bba;transition:all 300ms linear}.register_button{width:320px;background-color:#378cd5;padding:8px!important;color:#fff;text-transform:uppercase;font-size:14px;cursor:pointer;transition:all 300ms linear;border-radius:2px}#login-bg:before{content:"";position:fixed;left:-5%;top:-5%;right:0;z-index:-1;display:block;background-size:cover;background-repeat:no-repeat;width:110%;height:110%}@media(max-width:600px){.menu-bg {float: none !important;}}

View file

@ -0,0 +1 @@
.pace{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pace.pace-inactive .pace-progress{display:none}.pace .pace-progress{position:fixed;z-index:2000;top:0;right:0;height:5rem;width:5rem;-webkit-transform:translate3d(0,0,0)!important;-ms-transform:translate3d(0,0,0)!important;transform:translate3d(0,0,0)!important}.pace .pace-progress:after{display:block;position:absolute;top:0;right:.5rem;content:attr(data-progress-text);font-family:"Helvetica Neue",sans-serif;font-weight:100;font-size:5rem;line-height:1;text-align:right;color:rgba(0,255,255,0.19999999999999996)}

View file

@ -0,0 +1 @@
.pace{width:140px;height:300px;position:fixed;top:-90px;right:-20px;z-index:2000;-webkit-transform:scale(0);-moz-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0);transform:scale(0);opacity:0;-webkit-transition:all 2s linear 0s;-moz-transition:all 2s linear 0s;transition:all 2s linear 0s}.pace.pace-active{-webkit-transform:scale(.25);-moz-transform:scale(.25);-ms-transform:scale(.25);-o-transform:scale(.25);transform:scale(.25);opacity:1}.pace .pace-activity{width:140px;height:140px;border-radius:70px;background:cyan;position:absolute;top:0;z-index:1911;-webkit-animation:pace-bounce 1s infinite;-moz-animation:pace-bounce 1s infinite;-o-animation:pace-bounce 1s infinite;-ms-animation:pace-bounce 1s infinite;animation:pace-bounce 1s infinite}.pace .pace-progress{position:absolute;display:block;left:50%;bottom:0;z-index:1910;margin-left:-30px;width:60px;height:75px;background:rgba(20,20,20,.1);box-shadow:0 0 20px 35px rgba(20,20,20,.1);border-radius:30px / 40px;-webkit-transform:scaleY(.3)!important;-moz-transform:scaleY(.3)!important;-ms-transform:scaleY(.3)!important;-o-transform:scaleY(.3)!important;transform:scaleY(.3)!important;-webkit-animation:pace-compress .5s infinite alternate;-moz-animation:pace-compress .5s infinite alternate;-o-animation:pace-compress .5s infinite alternate;-ms-animation:pace-compress .5s infinite alternate;animation:pace-compress .5s infinite alternate}@-webkit-keyframes pace-bounce{0%{top:0;-webkit-animation-timing-function:ease-in}50%{top:140px;height:140px;-webkit-animation-timing-function:ease-out}55%{top:160px;height:120px;border-radius:70px / 60px;-webkit-animation-timing-function:ease-in}65%{top:120px;height:140px;border-radius:70px;-webkit-animation-timing-function:ease-out}95%{top:0;-webkit-animation-timing-function:ease-in}100%{top:0;-webkit-animation-timing-function:ease-in}}@-moz-keyframes pace-bounce{0%{top:0;-moz-animation-timing-function:ease-in}50%{top:140px;height:140px;-moz-animation-timing-function:ease-out}55%{top:160px;height:120px;border-radius:70px / 60px;-moz-animation-timing-function:ease-in}65%{top:120px;height:140px;border-radius:70px;-moz-animation-timing-function:ease-out}95%{top:0;-moz-animation-timing-function:ease-in}100%{top:0;-moz-animation-timing-function:ease-in}}@keyframes pace-bounce{0%{top:0;animation-timing-function:ease-in}50%{top:140px;height:140px;animation-timing-function:ease-out}55%{top:160px;height:120px;border-radius:70px / 60px;animation-timing-function:ease-in}65%{top:120px;height:140px;border-radius:70px;animation-timing-function:ease-out}95%{top:0;animation-timing-function:ease-in}100%{top:0;animation-timing-function:ease-in}}@-webkit-keyframes pace-compress{0%{bottom:0;margin-left:-30px;width:60px;height:75px;background:rgba(20,20,20,.1);box-shadow:0 0 20px 35px rgba(20,20,20,.1);border-radius:30px / 40px;-webkit-animation-timing-function:ease-in}100%{bottom:30px;margin-left:-10px;width:20px;height:5px;background:rgba(20,20,20,.3);box-shadow:0 0 20px 35px rgba(20,20,20,.3);border-radius:20px / 20px;-webkit-animation-timing-function:ease-out}}@-moz-keyframes pace-compress{0%{bottom:0;margin-left:-30px;width:60px;height:75px;background:rgba(20,20,20,.1);box-shadow:0 0 20px 35px rgba(20,20,20,.1);border-radius:30px / 40px;-moz-animation-timing-function:ease-in}100%{bottom:30px;margin-left:-10px;width:20px;height:5px;background:rgba(20,20,20,.3);box-shadow:0 0 20px 35px rgba(20,20,20,.3);border-radius:20px / 20px;-moz-animation-timing-function:ease-out}}@keyframes pace-compress{0%{bottom:0;margin-left:-30px;width:60px;height:75px;background:rgba(20,20,20,.1);box-shadow:0 0 20px 35px rgba(20,20,20,.1);border-radius:30px / 40px;animation-timing-function:ease-in}100%{bottom:30px;margin-left:-10px;width:20px;height:5px;background:rgba(20,20,20,.3);box-shadow:0 0 20px 35px rgba(20,20,20,.3);border-radius:20px / 20px;animation-timing-function:ease-out}}

View file

@ -0,0 +1 @@
.pace.pace-inactive{display:none}.pace{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2000;position:fixed;height:60px;width:100px;margin:auto;top:0;left:0;right:0;bottom:0}.pace .pace-progress{z-index:2000;position:absolute;height:60px;width:100px;-webkit-transform:translate3d(0,0,0)!important;-ms-transform:translate3d(0,0,0)!important;transform:translate3d(0,0,0)!important}.pace .pace-progress:before{content:attr(data-progress-text);text-align:center;color:#fff;background:cyan;border-radius:50%;font-family:"Helvetica Neue",sans-serif;font-size:14px;font-weight:100;line-height:1;padding:20% 0 7px;width:50%;height:40%;margin:10px 0 0 30px;display:block;z-index:999;position:absolute}.pace .pace-activity{font-size:15px;line-height:1;z-index:2000;position:absolute;height:60px;width:100px;display:block;-webkit-animation:pace-theme-center-atom-spin 2s linear infinite;-moz-animation:pace-theme-center-atom-spin 2s linear infinite;-o-animation:pace-theme-center-atom-spin 2s linear infinite;animation:pace-theme-center-atom-spin 2s linear infinite}.pace .pace-activity{border-radius:50%;border:5px solid cyan;content:' ';display:block;position:absolute;top:0;left:0;height:60px;width:100px}.pace .pace-activity:after{border-radius:50%;border:5px solid cyan;content:' ';display:block;position:absolute;top:-5px;left:-5px;height:60px;width:100px;-webkit-transform:rotate(60deg);-moz-transform:rotate(60deg);-o-transform:rotate(60deg);transform:rotate(60deg)}.pace .pace-activity:before{border-radius:50%;border:5px solid cyan;content:' ';display:block;position:absolute;top:-5px;left:-5px;height:60px;width:100px;-webkit-transform:rotate(120deg);-moz-transform:rotate(120deg);-o-transform:rotate(120deg);transform:rotate(120deg)}@-webkit-keyframes pace-theme-center-atom-spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-moz-keyframes pace-theme-center-atom-spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-o-keyframes pace-theme-center-atom-spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@keyframes pace-theme-center-atom-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}

View file

@ -0,0 +1 @@
.pace{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-perspective:12rem;-moz-perspective:12rem;-ms-perspective:12rem;-o-perspective:12rem;perspective:12rem;z-index:2000;position:fixed;height:6rem;width:6rem;margin:auto;top:0;left:0;right:0;bottom:0}.pace.pace-inactive .pace-progress{display:none}.pace .pace-progress{position:fixed;z-index:2000;display:block;position:absolute;left:0;top:0;height:6rem;width:6rem!important;line-height:6rem;font-size:2rem;border-radius:50%;background:rgba(0,255,255,0.8);color:#fff;font-family:"Helvetica Neue",sans-serif;font-weight:100;text-align:center;-webkit-animation:pace-theme-center-circle-spin linear infinite 2s;-moz-animation:pace-theme-center-circle-spin linear infinite 2s;-ms-animation:pace-theme-center-circle-spin linear infinite 2s;-o-animation:pace-theme-center-circle-spin linear infinite 2s;animation:pace-theme-center-circle-spin linear infinite 2s;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;-o-transform-style:preserve-3d;transform-style:preserve-3d}.pace .pace-progress:after{content:attr(data-progress-text);display:block}@-webkit-keyframes pace-theme-center-circle-spin{from{-webkit-transform:rotateY(0deg)}to{-webkit-transform:rotateY(360deg)}}@-moz-keyframes pace-theme-center-circle-spin{from{-moz-transform:rotateY(0deg)}to{-moz-transform:rotateY(360deg)}}@-ms-keyframes pace-theme-center-circle-spin{from{-ms-transform:rotateY(0deg)}to{-ms-transform:rotateY(360deg)}}@-o-keyframes pace-theme-center-circle-spin{from{-o-transform:rotateY(0deg)}to{-o-transform:rotateY(360deg)}}@keyframes pace-theme-center-circle-spin{from{transform:rotateY(0deg)}to{transform:rotateY(360deg)}}

View file

@ -0,0 +1 @@
.pace{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2000;position:fixed;height:90px;width:90px;margin:auto;top:0;left:0;right:0;bottom:0}.pace.pace-inactive .pace-activity{display:none}.pace .pace-activity{position:fixed;z-index:2000;display:block;position:absolute;left:-30px;top:-30px;height:90px;width:90px;display:block;border-width:30px;border-style:double;border-color:cyan transparent transparent;border-radius:50%;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-animation:spin 1s linear infinite;-moz-animation:spin 1s linear infinite;-o-animation:spin 1s linear infinite;animation:spin 1s linear infinite}.pace .pace-activity:before{content:' ';position:absolute;top:10px;left:10px;height:50px;width:50px;display:block;border-width:10px;border-style:solid;border-color:cyan transparent transparent;border-radius:50%;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}@-webkit-keyframes spin{100%{-webkit-transform:rotate(359deg)}}@-moz-keyframes spin{100%{-moz-transform:rotate(359deg)}}@-o-keyframes spin{100%{-moz-transform:rotate(359deg)}}@keyframes spin{100%{transform:rotate(359deg)}}

View file

@ -0,0 +1 @@
.pace,.pace .pace-progress{z-index:2000;height:60px;width:100px}.pace.pace-inactive{display:none}.pace{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;position:fixed;margin:auto;top:0;left:0;right:0;bottom:0}.pace .pace-progress{position:absolute;-webkit-transform:translate3d(0,0,0)!important;-ms-transform:translate3d(0,0,0)!important;transform:translate3d(0,0,0)!important}.pace .pace-progress:before{content:attr(data-progress-text);text-align:center;color:#fff;background:cyan;border-radius:50%;font-family:"Helvetica Neue",sans-serif;font-size:14px;font-weight:100;line-height:1;padding:20% 0 7px;width:50%;height:40%;margin:10px 0 0 30px;display:block;z-index:999;position:absolute}.pace .pace-activity{font-size:9px;margin:0 19px auto;text-indent:-9999em;width:8em;height:8em;border-radius:50%;background:rgba(0,255,255,0.501);background:-moz-linear-gradient(left,rgba(0,255,255,0.501) 10%,rgba(255,255,255,0) 42%);background:-webkit-linear-gradient(left,rgba(0,255,255,0.501) 10%,rgba(255,255,255,0) 42%);background:-o-linear-gradient(left,rgba(0,255,255,0.501) 10%,rgba(255,255,255,0) 42%);background:-ms-linear-gradient(to right,rgba(0,255,255,0.501) 10%,rgba(255,255,255,0) 42%);background:linear-gradient(to right,rgba(0,255,255,0.501) 10%,rgba(255,255,255,0) 42%);position:relative;-webkit-animation:load3 1.4s infinite linear;animation:load3 1.4s infinite linear;-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}.pace .pace-activity:after,.pace .pace-activity:before{content:'';position:absolute;top:0;left:0}.pace .pace-activity:before{width:50%;height:50%;border-radius:100% 0 0}.pace .pace-activity:after{background:cyan;width:75%;height:75%;border-radius:50%;margin:auto;bottom:0;right:0}@-webkit-keyframes load3{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load3{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}

View file

@ -0,0 +1 @@
.pace{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2000;position:fixed;margin:auto;top:0;left:0;right:0;bottom:0;height:5px;width:200px;background:#fff;border:1px solid cyan;overflow:hidden}.pace .pace-progress{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0);max-width:200px;position:fixed;z-index:2000;display:block;position:absolute;top:0;right:100%;height:100%;width:100%;background:cyan}.pace.pace-inactive{display:none}

View file

@ -0,0 +1 @@
.pace{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pace .pace-activity{display:block;position:fixed;z-index:2000;top:0;right:0;width:300px;height:300px;background:cyan;-webkit-transition:-webkit-transform .3s;transition:transform .3s;-webkit-transform:translateX(100%) translateY(-100%) rotate(45deg);transform:translateX(100%) translateY(-100%) rotate(45deg);pointer-events:none;opacity:0.9;}.pace.pace-active .pace-activity{-webkit-transform:translateX(50%) translateY(-50%) rotate(45deg);transform:translateX(50%) translateY(-50%) rotate(45deg)}.pace .pace-activity::before,.pace .pace-activity::after{-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;bottom:30px;left:50%;display:block;border:5px solid #fff;border-radius:50%;content:''}.pace .pace-activity::before{margin-left:-40px;width:80px;height:80px;border-right-color:rgba(0,0,0,.2);border-left-color:rgba(0,0,0,.2);-webkit-animation:pace-theme-corner-indicator-spin 3s linear infinite;animation:pace-theme-corner-indicator-spin 3s linear infinite}.pace .pace-activity::after{bottom:50px;margin-left:-20px;width:40px;height:40px;border-top-color:rgba(0,0,0,.2);border-bottom-color:rgba(0,0,0,.2);-webkit-animation:pace-theme-corner-indicator-spin 1s linear infinite;animation:pace-theme-corner-indicator-spin 1s linear infinite}@-webkit-keyframes pace-theme-corner-indicator-spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@keyframes pace-theme-corner-indicator-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}

View file

@ -0,0 +1 @@
.pace {-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none } .pace-inactive {display:none } .pace .pace-progress {background:aqua;position:fixed;z-index:2000;top:0;right:100%;width:100%;height:2px } .pace .pace-progress-inner {display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px aqua,0 0 5px aqua;opacity:1.0;-webkit-transform:rotate(3deg) translate(0px,-4px);-moz-transform:rotate(3deg) translate(0px,-4px);-ms-transform:rotate(3deg) translate(0px,-4px);-o-transform:rotate(3deg) translate(0px,-4px);transform:rotate(3deg) translate(0px,-4px) } .pace .pace-activity {display:block;position:fixed;z-index:2000;top:15px;right:15px;width:14px;height:14px;border:solid 2px transparent;border-top-color:aqua;border-left-color:aqua;border-radius:10px;-webkit-animation:pace-spinner 400ms linear infinite;-moz-animation:pace-spinner 400ms linear infinite;-ms-animation:pace-spinner 400ms linear infinite;-o-animation:pace-spinner 400ms linear infinite;animation:pace-spinner 400ms linear infinite } @-webkit-keyframes pace-spinner {0% {-webkit-transform:rotate(0deg);transform:rotate(0deg) } 100% {-webkit-transform:rotate(360deg);transform:rotate(360deg) }} @-moz-keyframes pace-spinner {0% {-moz-transform:rotate(0deg);transform:rotate(0deg) } 100% {-moz-transform:rotate(360deg);transform:rotate(360deg) }} @-o-keyframes pace-spinner {0% {-o-transform:rotate(0deg);transform:rotate(0deg) } 100% {-o-transform:rotate(360deg);transform:rotate(360deg) }} @-ms-keyframes pace-spinner {0% {-ms-transform:rotate(0deg);transform:rotate(0deg) } 100% {-ms-transform:rotate(360deg);transform:rotate(360deg) }} @keyframes pace-spinner {0% {transform:rotate(0deg);transform:rotate(0deg) } 100% {transform:rotate(360deg);transform:rotate(360deg) }}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
.pace {-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none } .pace-inactive {display:none } .pace .pace-progress {background:aqua;position:fixed;z-index:2000;top:0;right:100%;width:100%;height:2px } .pace .pace-progress-inner {display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px aqua,0 0 5px aqua;opacity:1.0;-webkit-transform:rotate(3deg) translate(0px,-4px);-moz-transform:rotate(3deg) translate(0px,-4px);-ms-transform:rotate(3deg) translate(0px,-4px);-o-transform:rotate(3deg) translate(0px,-4px);transform:rotate(3deg) translate(0px,-4px) } .pace .pace-activity {display:block;position:fixed;z-index:2000;top:15px;right:15px;width:14px;height:14px;border:solid 2px transparent;border-top-color:aqua;border-left-color:aqua;border-radius:10px;-webkit-animation:pace-spinner 400ms linear infinite;-moz-animation:pace-spinner 400ms linear infinite;-ms-animation:pace-spinner 400ms linear infinite;-o-animation:pace-spinner 400ms linear infinite;animation:pace-spinner 400ms linear infinite } @-webkit-keyframes pace-spinner {0% {-webkit-transform:rotate(0deg);transform:rotate(0deg) } 100% {-webkit-transform:rotate(360deg);transform:rotate(360deg) }} @-moz-keyframes pace-spinner {0% {-moz-transform:rotate(0deg);transform:rotate(0deg) } 100% {-moz-transform:rotate(360deg);transform:rotate(360deg) }} @-o-keyframes pace-spinner {0% {-o-transform:rotate(0deg);transform:rotate(0deg) } 100% {-o-transform:rotate(360deg);transform:rotate(360deg) }} @-ms-keyframes pace-spinner {0% {-ms-transform:rotate(0deg);transform:rotate(0deg) } 100% {-ms-transform:rotate(360deg);transform:rotate(360deg) }} @keyframes pace-spinner {0% {transform:rotate(0deg);transform:rotate(0deg) } 100% {transform:rotate(360deg);transform:rotate(360deg) }}

View file

@ -0,0 +1 @@
@media(max-width:600px){#wrapper{border-left:0!important}.menu-bg,.menu>ul{width:100%;margin-bottom:10px}}@media(max-width:512px){.datetime{display:none!important}.slider{float:right;top:0;padding:17px;right:0;left:0}}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,2 @@
/* TipTip CSS - Version 1.2 */
.tipsy{position:absolute;padding:5px;z-index:100000}.tipsy-inner{font-size:12px;background:#37b799;color:#fff;max-width:200px;padding:5px 8px;text-align:center;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px}.tipsy-arrow{position:absolute;width:0;height:0;line-height:0;border:5px dashed #37b799}.tipsy-arrow-n{border-bottom-color:#37b799}.tipsy-arrow-s{border-top-color:#37b799}.tipsy-arrow-e{border-left-color:#161616}.tipsy-arrow-w{border-right-color:#161616}.tipsy-n .tipsy-arrow{top:0;left:50%;margin-left:-5px;border-bottom-style:solid;border-top:0;border-left-color:transparent;border-right-color:transparent}.tipsy-nw .tipsy-arrow{top:0;left:10px;border-bottom-style:solid;border-top:0;border-left-color:transparent;border-right-color:transparent}.tipsy-ne .tipsy-arrow{top:0;right:10px;border-bottom-style:solid;border-top:0;border-left-color:transparent;border-right-color:transparent}.tipsy-s .tipsy-arrow{bottom:0;left:50%;margin-left:-5px;border-top-style:solid;border-bottom:0;border-left-color:transparent;border-right-color:transparent}.tipsy-sw .tipsy-arrow{bottom:0;left:10px;border-top-style:solid;border-bottom:0;border-left-color:transparent;border-right-color:transparent}.tipsy-se .tipsy-arrow{bottom:0;right:10px;border-top-style:solid;border-bottom:0;border-left-color:transparent;border-right-color:transparent}.tipsy-e .tipsy-arrow{right:0;top:50%;margin-top:-5px;border-left-style:solid;border-right:0;border-top-color:transparent;border-bottom-color:transparent}.tipsy-w .tipsy-arrow{left:0;top:50%;margin-top:-5px;border-right-style:solid;border-left:none;border-top-color:transparent;border-bottom-color:transparent}

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 682 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 909 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 547 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 654 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 654 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 902 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 547 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 496 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 684 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

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