update
16
.htaccess
@@ -11,6 +11,8 @@ RewriteRule .* - [E=Cache-Vary:cookiesplus]
|
|||||||
|
|
||||||
RewriteEngine On
|
RewriteEngine On
|
||||||
|
|
||||||
|
RewriteRule ^162\-materace\-75x200$ /s/100/materace\-75x200\-cm? [L,R=301]
|
||||||
|
|
||||||
RewriteRule ^276\-materace\-90x200\-outlet$ /s/2/materace\-outlet\-90x200\-cm? [L,R=301]
|
RewriteRule ^276\-materace\-90x200\-outlet$ /s/2/materace\-outlet\-90x200\-cm? [L,R=301]
|
||||||
|
|
||||||
RewriteRule ^277\-materace\-120x200\-outlet$ /s/3/materace\-120x200\-outlet? [L,R=301]
|
RewriteRule ^277\-materace\-120x200\-outlet$ /s/3/materace\-120x200\-outlet? [L,R=301]
|
||||||
@@ -197,6 +199,20 @@ RewriteRule ^189\-posciel\-200x220$ /s/91/posciel\-200x220? [L,R=301]
|
|||||||
|
|
||||||
RewriteRule ^content/168\-dr\-materac\-tarnobrzeg$ /content/152\-dr\-materac\-tarnobrzeg? [L,R=301]
|
RewriteRule ^content/168\-dr\-materac\-tarnobrzeg$ /content/152\-dr\-materac\-tarnobrzeg? [L,R=301]
|
||||||
|
|
||||||
|
RewriteRule ^214\-materace\-dla\-dzieci\-80x190$ /s/94/materace\-dla\-dzieci\-80x190? [L,R=301]
|
||||||
|
|
||||||
|
RewriteRule ^215\-materace\-dla\-dzieci\-90x190$ /s/95/materace\-dla\-dzieci\-90x190? [L,R=301]
|
||||||
|
|
||||||
|
RewriteRule ^209\-materace\-dla\-dzieci\-80x180$ /s/92/materace\-dla\-dzieci\-80x180? [L,R=301]
|
||||||
|
|
||||||
|
RewriteRule ^177\-koldry\-220x200$ /s/96/koldry\-220x200? [L,R=301]
|
||||||
|
|
||||||
|
RewriteRule ^322\-poduszki\-40x40\-cm$ /s/97/poduszki\-40x40\-cm? [L,R=301]
|
||||||
|
|
||||||
|
RewriteRule ^326\-poduszki\-50x60\-cm$ /s/98/poduszki\-50x60\-cm? [L,R=301]
|
||||||
|
|
||||||
|
RewriteRule ^330\-posciel\-200x220$ /s/99/posciel\-200x220? [L,R=301]
|
||||||
|
|
||||||
|
|
||||||
#x13webp module start
|
#x13webp module start
|
||||||
#Domain: drmaterac.pl
|
#Domain: drmaterac.pl
|
||||||
|
|||||||
133
.vscode/ftp-kr.sync.cache.json
vendored
@@ -187,7 +187,14 @@
|
|||||||
"lmtime": 0,
|
"lmtime": 0,
|
||||||
"modified": false
|
"modified": false
|
||||||
},
|
},
|
||||||
"changelog": {},
|
"changelog": {
|
||||||
|
"2026-04-01.md": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 2425,
|
||||||
|
"lmtime": 1775040474854,
|
||||||
|
"modified": false
|
||||||
|
}
|
||||||
|
},
|
||||||
"classes": {},
|
"classes": {},
|
||||||
"composer.lock": {
|
"composer.lock": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
@@ -688,6 +695,130 @@
|
|||||||
},
|
},
|
||||||
"upgrade": {},
|
"upgrade": {},
|
||||||
"views": {}
|
"views": {}
|
||||||
|
},
|
||||||
|
"crosssellpro": {
|
||||||
|
"crosssellpro.php": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 10887,
|
||||||
|
"lmtime": 1775038406865,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"views": {
|
||||||
|
"templates": {
|
||||||
|
"hook": {
|
||||||
|
"cartCrossSell.tpl": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 3580,
|
||||||
|
"lmtime": 1775041268532,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"checkoutCrossSell.tpl": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 76,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pm_advancedsearch4": {
|
||||||
|
"views": {
|
||||||
|
"js": {
|
||||||
|
"admin-categories-tree.js": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 10508,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"adminCore.js": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 15791,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"admin.js": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 39544,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"as4_plugin-17.js": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 54522,
|
||||||
|
"lmtime": 1775038425895,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"as4_plugin.js": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 58714,
|
||||||
|
"lmtime": 1775038437021,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"codemirror": {},
|
||||||
|
"colorpicker": {},
|
||||||
|
"datatables": {},
|
||||||
|
"index.php": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 295,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"jGrowl": {},
|
||||||
|
"jquery.actual.min.js": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 1238,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"jquery.form.js": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 24062,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"jquery.tipTip.js": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 6860,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"jquery.ui.touch-punch.min.js": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 1190,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"multiselect": {},
|
||||||
|
"plupload.full.min.js": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 112589,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"pm_advancedsearch.js": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 14860,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"pm_tinymce.inc.js": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 1948,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"scrollToFixed": {},
|
||||||
|
"scrollTo.js": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 3587,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"selectize": {},
|
||||||
|
"treeview": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nov": {},
|
"nov": {},
|
||||||
|
|||||||
22
modules/securitywatcher/cron_check.php
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Security Watcher - Cron file check
|
||||||
|
* Run via cron every 15 minutes:
|
||||||
|
* *\/15 * * * * php /path/to/prestashop/modules/securitywatcher/cron_check.php
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Bootstrap PrestaShop
|
||||||
|
$dir = dirname(__FILE__);
|
||||||
|
$psRoot = realpath($dir . '/../../');
|
||||||
|
|
||||||
|
require_once $psRoot . '/config/config.inc.php';
|
||||||
|
|
||||||
|
$module = Module::getInstanceByName('securitywatcher');
|
||||||
|
|
||||||
|
if ($module && $module->active) {
|
||||||
|
$changes = $module->cronCheckFiles();
|
||||||
|
$total = count($changes['new']) + count($changes['modified']) + count($changes['deleted']);
|
||||||
|
echo date('Y-m-d H:i:s') . " - Check complete. Changes: {$total}\n";
|
||||||
|
} else {
|
||||||
|
echo "SecurityWatcher module not active.\n";
|
||||||
|
}
|
||||||
1
modules/securitywatcher/mails/en/securitywatcher.html
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{content}
|
||||||
1
modules/securitywatcher/mails/en/securitywatcher.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{content}
|
||||||
1
modules/securitywatcher/mails/pl/securitywatcher.html
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{content}
|
||||||
1
modules/securitywatcher/mails/pl/securitywatcher.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{content}
|
||||||
1
modules/securitywatcher/security.log
Normal file
@@ -0,0 +1 @@
|
|||||||
|
2026-04-02 09:50:44 | MODULE UNINSTALLED | pagecache | Jacek Pyziak (ID: 13) | biuro@project-pro.pl | 91.189.216.43
|
||||||
298
modules/securitywatcher/securitywatcher.php
Normal file
@@ -0,0 +1,298 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (!defined('_PS_VERSION_')) {
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
class SecurityWatcher extends Module
|
||||||
|
{
|
||||||
|
private $alertEmail = 'biuro@project-pro.pl';
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->name = 'securitywatcher';
|
||||||
|
$this->tab = 'administration';
|
||||||
|
$this->version = '1.0.0';
|
||||||
|
$this->author = 'Project-Pro';
|
||||||
|
$this->need_instance = 0;
|
||||||
|
$this->bootstrap = true;
|
||||||
|
|
||||||
|
parent::__construct();
|
||||||
|
|
||||||
|
$this->displayName = $this->l('Security Watcher');
|
||||||
|
$this->description = $this->l('Monitors module installations and file changes, sends email alerts.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function install()
|
||||||
|
{
|
||||||
|
return parent::install()
|
||||||
|
&& $this->registerHook('actionModuleInstallAfter')
|
||||||
|
&& $this->registerHook('actionModuleUninstallAfter')
|
||||||
|
&& $this->registerHook('actionModuleInstallBefore')
|
||||||
|
&& $this->registerHook('actionObjectModuleAddAfter')
|
||||||
|
&& $this->createSnapshotTable()
|
||||||
|
&& $this->takeSnapshot();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function uninstall()
|
||||||
|
{
|
||||||
|
return parent::uninstall();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function createSnapshotTable()
|
||||||
|
{
|
||||||
|
$sql = 'CREATE TABLE IF NOT EXISTS `' . _DB_PREFIX_ . 'securitywatcher_snapshot` (
|
||||||
|
`id` INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
`path` VARCHAR(512) NOT NULL,
|
||||||
|
`hash` VARCHAR(64) NOT NULL,
|
||||||
|
`size` INT NOT NULL,
|
||||||
|
`mtime` INT NOT NULL,
|
||||||
|
`snapshot_date` DATETIME NOT NULL,
|
||||||
|
INDEX (`path`)
|
||||||
|
) ENGINE=' . _MYSQL_ENGINE_ . ' DEFAULT CHARSET=utf8';
|
||||||
|
|
||||||
|
return Db::getInstance()->execute($sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function takeSnapshot()
|
||||||
|
{
|
||||||
|
Db::getInstance()->execute('TRUNCATE TABLE `' . _DB_PREFIX_ . 'securitywatcher_snapshot`');
|
||||||
|
|
||||||
|
$dirs = [
|
||||||
|
_PS_MODULE_DIR_,
|
||||||
|
_PS_ROOT_DIR_ . '/themes/',
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($dirs as $dir) {
|
||||||
|
$this->scanDir($dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function scanDir($dir)
|
||||||
|
{
|
||||||
|
$iterator = new RecursiveIteratorIterator(
|
||||||
|
new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
|
||||||
|
RecursiveIteratorIterator::SELF_FIRST
|
||||||
|
);
|
||||||
|
|
||||||
|
$batch = [];
|
||||||
|
$count = 0;
|
||||||
|
|
||||||
|
foreach ($iterator as $file) {
|
||||||
|
if ($file->isFile() && preg_match('/\.(php|js|tpl|html|css)$/i', $file->getFilename())) {
|
||||||
|
$path = str_replace(_PS_ROOT_DIR_, '', $file->getPathname());
|
||||||
|
$batch[] = '('
|
||||||
|
. "'" . pSQL($path) . "',"
|
||||||
|
. "'" . pSQL(md5_file($file->getPathname())) . "',"
|
||||||
|
. (int)$file->getSize() . ','
|
||||||
|
. (int)$file->getMTime() . ','
|
||||||
|
. "NOW()"
|
||||||
|
. ')';
|
||||||
|
$count++;
|
||||||
|
|
||||||
|
if ($count % 500 === 0) {
|
||||||
|
$this->insertBatch($batch);
|
||||||
|
$batch = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($batch)) {
|
||||||
|
$this->insertBatch($batch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function insertBatch($batch)
|
||||||
|
{
|
||||||
|
$sql = 'INSERT INTO `' . _DB_PREFIX_ . 'securitywatcher_snapshot` (path, hash, size, mtime, snapshot_date) VALUES ' . implode(',', $batch);
|
||||||
|
Db::getInstance()->execute($sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hookActionModuleInstallBefore($params)
|
||||||
|
{
|
||||||
|
$this->sendModuleAlert('INSTALLATION ATTEMPT', $params);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hookActionModuleInstallAfter($params)
|
||||||
|
{
|
||||||
|
$this->sendModuleAlert('MODULE INSTALLED', $params);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hookActionModuleUninstallAfter($params)
|
||||||
|
{
|
||||||
|
$this->sendModuleAlert('MODULE UNINSTALLED', $params);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hookActionObjectModuleAddAfter($params)
|
||||||
|
{
|
||||||
|
if (isset($params['object'])) {
|
||||||
|
$this->sendModuleAlert('MODULE ADDED TO DB', $params);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function sendModuleAlert($action, $params)
|
||||||
|
{
|
||||||
|
$moduleName = 'unknown';
|
||||||
|
if (isset($params['module']) && is_object($params['module'])) {
|
||||||
|
$moduleName = $params['module']->name;
|
||||||
|
} elseif (isset($params['object']) && is_object($params['object'])) {
|
||||||
|
$moduleName = $params['object']->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
$employee = Context::getContext()->employee;
|
||||||
|
$employeeInfo = 'Not logged in / CLI';
|
||||||
|
$employeeEmail = 'N/A';
|
||||||
|
if ($employee && $employee->id) {
|
||||||
|
$employeeInfo = $employee->firstname . ' ' . $employee->lastname . ' (ID: ' . $employee->id . ')';
|
||||||
|
$employeeEmail = $employee->email;
|
||||||
|
}
|
||||||
|
|
||||||
|
$ip = Tools::getRemoteAddr();
|
||||||
|
$userAgent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'N/A';
|
||||||
|
$shopUrl = Tools::getShopDomainSsl(true);
|
||||||
|
|
||||||
|
$subject = "[SECURITY] {$action}: {$moduleName} @ " . Configuration::get('PS_SHOP_NAME');
|
||||||
|
|
||||||
|
$body = "
|
||||||
|
<html><body style='font-family: Arial, sans-serif;'>
|
||||||
|
<h2 style='color: #cc0000;'>⚠ {$action}</h2>
|
||||||
|
<table style='border-collapse:collapse; width:100%;'>
|
||||||
|
<tr><td style='padding:8px; border:1px solid #ddd; font-weight:bold;'>Module</td><td style='padding:8px; border:1px solid #ddd;'>{$moduleName}</td></tr>
|
||||||
|
<tr><td style='padding:8px; border:1px solid #ddd; font-weight:bold;'>Action</td><td style='padding:8px; border:1px solid #ddd;'>{$action}</td></tr>
|
||||||
|
<tr><td style='padding:8px; border:1px solid #ddd; font-weight:bold;'>Employee</td><td style='padding:8px; border:1px solid #ddd;'>{$employeeInfo}</td></tr>
|
||||||
|
<tr><td style='padding:8px; border:1px solid #ddd; font-weight:bold;'>Employee Email</td><td style='padding:8px; border:1px solid #ddd;'>{$employeeEmail}</td></tr>
|
||||||
|
<tr><td style='padding:8px; border:1px solid #ddd; font-weight:bold;'>IP Address</td><td style='padding:8px; border:1px solid #ddd;'>{$ip}</td></tr>
|
||||||
|
<tr><td style='padding:8px; border:1px solid #ddd; font-weight:bold;'>User Agent</td><td style='padding:8px; border:1px solid #ddd;'>{$userAgent}</td></tr>
|
||||||
|
<tr><td style='padding:8px; border:1px solid #ddd; font-weight:bold;'>Date</td><td style='padding:8px; border:1px solid #ddd;'>" . date('Y-m-d H:i:s') . "</td></tr>
|
||||||
|
<tr><td style='padding:8px; border:1px solid #ddd; font-weight:bold;'>Shop</td><td style='padding:8px; border:1px solid #ddd;'>{$shopUrl}</td></tr>
|
||||||
|
</table>
|
||||||
|
</body></html>";
|
||||||
|
|
||||||
|
$this->sendAlert($subject, $body);
|
||||||
|
|
||||||
|
$logFile = _PS_MODULE_DIR_ . 'securitywatcher/security.log';
|
||||||
|
$logLine = date('Y-m-d H:i:s') . " | {$action} | {$moduleName} | {$employeeInfo} | {$employeeEmail} | {$ip}\n";
|
||||||
|
file_put_contents($logFile, $logLine, FILE_APPEND | LOCK_EX);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function cronCheckFiles()
|
||||||
|
{
|
||||||
|
$dirs = [
|
||||||
|
_PS_MODULE_DIR_,
|
||||||
|
_PS_ROOT_DIR_ . '/themes/',
|
||||||
|
];
|
||||||
|
|
||||||
|
$changes = ['new' => [], 'modified' => [], 'deleted' => []];
|
||||||
|
|
||||||
|
foreach ($dirs as $dir) {
|
||||||
|
$iterator = new RecursiveIteratorIterator(
|
||||||
|
new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS)
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($iterator as $file) {
|
||||||
|
if ($file->isFile() && preg_match('/\.(php|js|tpl|html|css)$/i', $file->getFilename())) {
|
||||||
|
$path = str_replace(_PS_ROOT_DIR_, '', $file->getPathname());
|
||||||
|
$hash = md5_file($file->getPathname());
|
||||||
|
|
||||||
|
$existing = Db::getInstance()->getRow(
|
||||||
|
'SELECT hash FROM `' . _DB_PREFIX_ . 'securitywatcher_snapshot` WHERE path = "' . pSQL($path) . '"'
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!$existing) {
|
||||||
|
$changes['new'][] = $path;
|
||||||
|
} elseif ($existing['hash'] !== $hash) {
|
||||||
|
$changes['modified'][] = $path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$snapshotFiles = Db::getInstance()->executeS(
|
||||||
|
'SELECT path FROM `' . _DB_PREFIX_ . 'securitywatcher_snapshot`'
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($snapshotFiles as $row) {
|
||||||
|
if (!file_exists(_PS_ROOT_DIR_ . $row['path'])) {
|
||||||
|
$changes['deleted'][] = $row['path'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$totalChanges = count($changes['new']) + count($changes['modified']) + count($changes['deleted']);
|
||||||
|
|
||||||
|
if ($totalChanges > 0) {
|
||||||
|
$subject = "[SECURITY] {$totalChanges} file change(s) detected @ " . Configuration::get('PS_SHOP_NAME');
|
||||||
|
|
||||||
|
$body = "<html><body style='font-family: Arial, sans-serif;'>";
|
||||||
|
$body .= "<h2 style='color: #cc0000;'>⚠ File Changes Detected</h2>";
|
||||||
|
$body .= "<p>Date: " . date('Y-m-d H:i:s') . "</p>";
|
||||||
|
|
||||||
|
if (!empty($changes['new'])) {
|
||||||
|
$body .= "<h3 style='color: #cc6600;'>New files (" . count($changes['new']) . ")</h3><ul>";
|
||||||
|
foreach (array_slice($changes['new'], 0, 50) as $f) {
|
||||||
|
$body .= "<li>" . htmlspecialchars($f) . "</li>";
|
||||||
|
}
|
||||||
|
if (count($changes['new']) > 50) {
|
||||||
|
$body .= "<li>... and " . (count($changes['new']) - 50) . " more</li>";
|
||||||
|
}
|
||||||
|
$body .= "</ul>";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($changes['modified'])) {
|
||||||
|
$body .= "<h3 style='color: #cc0000;'>Modified files (" . count($changes['modified']) . ")</h3><ul>";
|
||||||
|
foreach (array_slice($changes['modified'], 0, 50) as $f) {
|
||||||
|
$body .= "<li>" . htmlspecialchars($f) . "</li>";
|
||||||
|
}
|
||||||
|
if (count($changes['modified']) > 50) {
|
||||||
|
$body .= "<li>... and " . (count($changes['modified']) - 50) . " more</li>";
|
||||||
|
}
|
||||||
|
$body .= "</ul>";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($changes['deleted'])) {
|
||||||
|
$body .= "<h3 style='color: #999;'>Deleted files (" . count($changes['deleted']) . ")</h3><ul>";
|
||||||
|
foreach (array_slice($changes['deleted'], 0, 50) as $f) {
|
||||||
|
$body .= "<li>" . htmlspecialchars($f) . "</li>";
|
||||||
|
}
|
||||||
|
if (count($changes['deleted']) > 50) {
|
||||||
|
$body .= "<li>... and " . (count($changes['deleted']) - 50) . " more</li>";
|
||||||
|
}
|
||||||
|
$body .= "</ul>";
|
||||||
|
}
|
||||||
|
|
||||||
|
$body .= "</body></html>";
|
||||||
|
|
||||||
|
$this->sendAlert($subject, $body);
|
||||||
|
|
||||||
|
$logFile = _PS_MODULE_DIR_ . 'securitywatcher/security.log';
|
||||||
|
$logLine = date('Y-m-d H:i:s') . " | FILE CHANGES | new:" . count($changes['new']) . " mod:" . count($changes['modified']) . " del:" . count($changes['deleted']) . "\n";
|
||||||
|
file_put_contents($logFile, $logLine, FILE_APPEND | LOCK_EX);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->takeSnapshot();
|
||||||
|
|
||||||
|
return $changes;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function sendAlert($subject, $body)
|
||||||
|
{
|
||||||
|
$emails = array_map('trim', explode(',', $this->alertEmail));
|
||||||
|
|
||||||
|
foreach ($emails as $email) {
|
||||||
|
@Mail::Send(
|
||||||
|
(int)Configuration::get('PS_LANG_DEFAULT'),
|
||||||
|
'securitywatcher',
|
||||||
|
$subject,
|
||||||
|
['{content}' => $body],
|
||||||
|
$email,
|
||||||
|
null,
|
||||||
|
Configuration::get('PS_SHOP_EMAIL'),
|
||||||
|
Configuration::get('PS_SHOP_NAME'),
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
_PS_MODULE_DIR_ . 'securitywatcher/mails/'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -103,4 +103,666 @@
|
|||||||
}
|
}
|
||||||
#products #category-description.text-muted {
|
#products #category-description.text-muted {
|
||||||
color: #000 !important;
|
color: #000 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#cms #main .page-content .opt-lp-list {
|
||||||
|
list-style: square !important;
|
||||||
|
}
|
||||||
|
#schemafaq h3 {margin: 0 !important;}
|
||||||
|
#schemafaq p {margin:0 !important;padding:10px 0;}
|
||||||
|
#schemafaq label {margin:0 !important;}
|
||||||
|
#schemafaq {max-width: 100%;width: 100%;margin: 0 auto;clear: both;padding: 0;margin-top:40px;}
|
||||||
|
#schemafaq input {position: absolute;opacity: 0;z-index: -1}
|
||||||
|
#schemafaq .tabs {border-radius: 0px;overflow: hidden;border: 1px solid #eee}
|
||||||
|
#schemafaq .tab {width: 100%;color: white;overflow: hidden}
|
||||||
|
#schemafaq .tab-label {display: -webkit-box;display: flex;-webkit-box-pack: justify;justify-content: space-between;padding: 1em;background: #f9f9f9;font-weight: bold;cursor: pointer;color: #111;transition: all .3s;border-top: 1px solid #eee}
|
||||||
|
#schemafaq .tab:first-child .tab-label {border-top: none}
|
||||||
|
#schemafaq .tab-label:hover {background: #eee}
|
||||||
|
#schemafaq .tab-label::after {content: "\276F";width: 1em;height: 1em;text-align: center;-webkit-transition: all .3s;transition: all .3s;display: flex;justify-content: center;align-items: center;-webkit-transform: rotateZ(90deg);transform: rotateZ(90deg)}
|
||||||
|
#schemafaq .tab-content {max-height: 0;padding: 0 1em;color: #111;background: white;-webkit-transition: all .3s;transition: all .3s}
|
||||||
|
#schemafaq .tab-close {display: -webkit-box;display: flex;-webkit-box-pack: end;justify-content: flex-end;padding: 1em;font-size: 0.75em;background: #29abe2;cursor: pointer}
|
||||||
|
#schemafaq .tab-close:hover {background: #29abe2}
|
||||||
|
#schemafaq input:checked+.tab-label,#schemafaq input:checked+h3>.tab-label {background: #eee;color: #111}
|
||||||
|
#schemafaq input:checked+.tab-label::after,#schemafaq input:checked+h3>.tab-label::after {-webkit-transform: rotateZ(180deg);transform: rotateZ(180deg)}
|
||||||
|
#schemafaq input:checked~.tab-content {max-height: 100vh;padding: 1em}
|
||||||
|
|
||||||
|
.comment-box {
|
||||||
|
display: flex;
|
||||||
|
border: 1px solid #34d6ad;
|
||||||
|
border-collapse: collapse;
|
||||||
|
padding: 10px;
|
||||||
|
margin: 10px 0 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment-box-text {
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 1.4;
|
||||||
|
border-left: 2px solid #333;
|
||||||
|
padding: 10px 0;
|
||||||
|
padding-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment-box-text p {
|
||||||
|
margin: 0 0 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper #page_hero {
|
||||||
|
position: relative
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper #page_hero .page_hero {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
height: 580px
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper #page_hero .page_hero .hero_bg {
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
top: 0;
|
||||||
|
transform: translateX(-50%)
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper #page_hero .page_hero .hero_data {
|
||||||
|
position: relative
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper #page_hero .page_hero .hero_data h1 {
|
||||||
|
color: #fff;
|
||||||
|
text-align: center;
|
||||||
|
text-shadow: 0 4px 4px rgba(0,0,0,.25);
|
||||||
|
font-size: 60px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: normal
|
||||||
|
}
|
||||||
|
|
||||||
|
@media(max-width: 991px) {
|
||||||
|
#cms.cms-id-176 #content-wrapper #page_hero .page_hero .hero_data h1 {
|
||||||
|
font-size:48px
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media(max-width: 576px) {
|
||||||
|
#cms.cms-id-176 #content-wrapper #page_hero .page_hero .hero_data h1 {
|
||||||
|
font-size:36px
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper #page_hero .page_hero .hero_info {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 30px;
|
||||||
|
text-align: center
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper #page_hero .page_hero .hero_info p {
|
||||||
|
color: #fff;
|
||||||
|
text-align: center;
|
||||||
|
text-shadow: 0 4px 4px rgba(0,0,0,.25);
|
||||||
|
font-size: 28px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: normal
|
||||||
|
}
|
||||||
|
|
||||||
|
@media(max-width: 991px) {
|
||||||
|
#cms.cms-id-176 #content-wrapper #page_hero .page_hero .hero_info p {
|
||||||
|
font-size:24px
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media(max-width: 576px) {
|
||||||
|
#cms.cms-id-176 #content-wrapper #page_hero .page_hero .hero_info p {
|
||||||
|
font-size:20px
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper #page_hero .page_hero .hero_info a {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
color: #000;
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: 1;
|
||||||
|
padding: 10px 50px 10px 20px;
|
||||||
|
background: #fff;
|
||||||
|
border-radius: 100px
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper #page_hero .page_hero .hero_info a::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
width: 40px;
|
||||||
|
background: #34d6ad;
|
||||||
|
border-top-right-radius: 30px;
|
||||||
|
border-bottom-right-radius: 30px
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper #page_hero .page_hero .hero_info a::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
right: 15px;
|
||||||
|
top: 10px;
|
||||||
|
bottom: 0;
|
||||||
|
background-image: url(/img/Play-solid.svg);
|
||||||
|
background-position: center;
|
||||||
|
background-size: cover;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
width: 11px;
|
||||||
|
height: 13px;
|
||||||
|
z-index: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 {
|
||||||
|
margin-top: 75px;
|
||||||
|
margin-bottom: 15px
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-left h2 {
|
||||||
|
color: #33d5ad;
|
||||||
|
font-size: 30px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: normal
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-left ul {
|
||||||
|
margin-top: 30px;
|
||||||
|
margin-bottom: 30px
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-left ul li {
|
||||||
|
position: relative;
|
||||||
|
color: #000;
|
||||||
|
font-size: 22px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: normal;
|
||||||
|
padding-left: 30px
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-left ul li::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 16px;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
background: url(/img/cms/franczyza/el_check.svg) no-repeat center center;
|
||||||
|
background-size: cover
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-left p {
|
||||||
|
color: #000;
|
||||||
|
font-size: 26px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: normal
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right p {
|
||||||
|
color: #000;
|
||||||
|
font-size: 21px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: normal
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right p strong {
|
||||||
|
font-weight: 700
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form {
|
||||||
|
margin-top: 40px
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form .form-inputs {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 17px;
|
||||||
|
margin-bottom: 11px
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form .form-inputs input {
|
||||||
|
padding: 15px 18px;
|
||||||
|
border: 1px solid #bcbcbc
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form .form-inputs input:focus {
|
||||||
|
outline: none
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form p {
|
||||||
|
color: #cd1f27;
|
||||||
|
font-family: "Poppins",sans-serif;
|
||||||
|
font-size: 12px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: normal
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form .form-confirmation {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
gap: 15px;
|
||||||
|
margin-top: 13px;
|
||||||
|
margin-bottom: 35px
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form .form-confirmation input[type=checkbox] {
|
||||||
|
position: relative;
|
||||||
|
width: 25px;
|
||||||
|
min-width: 25px;
|
||||||
|
height: 25px;
|
||||||
|
border: 1px solid #bcbcbc;
|
||||||
|
border-radius: 0;
|
||||||
|
-webkit-appearance: none;
|
||||||
|
-moz-appearance: none;
|
||||||
|
appearance: none;
|
||||||
|
outline: none;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 250ms ease-in-out;
|
||||||
|
overflow: hidden
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form .form-confirmation input[type=checkbox]::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
left: 32px;
|
||||||
|
top: -14px;
|
||||||
|
width: 2px;
|
||||||
|
height: 12px;
|
||||||
|
background-color: #33d5ad;
|
||||||
|
transform: rotate(40deg);
|
||||||
|
transition: all 250ms ease-in-out
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form .form-confirmation input[type=checkbox]::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
left: -13px;
|
||||||
|
top: -8px;
|
||||||
|
width: 2px;
|
||||||
|
height: 6px;
|
||||||
|
background-color: #33d5ad;
|
||||||
|
transform: rotate(-40deg);
|
||||||
|
transition: all 250ms ease-in-out
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form .form-confirmation input[type=checkbox]:checked::before {
|
||||||
|
left: 12px;
|
||||||
|
top: 6px
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form .form-confirmation input[type=checkbox]:checked::after {
|
||||||
|
left: 7px;
|
||||||
|
top: 12px
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form .form-confirmation label {
|
||||||
|
color: #000;
|
||||||
|
font-family: "Poppins",sans-serif;
|
||||||
|
font-size: 10px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: normal;
|
||||||
|
cursor: pointer;
|
||||||
|
text-align: left
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form .form-btn {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: flex-end;
|
||||||
|
align-items: center
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form .form-btn button {
|
||||||
|
color: #fff;
|
||||||
|
text-align: center;
|
||||||
|
font-family: "Poppins",sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: normal;
|
||||||
|
background: #33d5ad;
|
||||||
|
padding: 15px 20px;
|
||||||
|
border: none;
|
||||||
|
cursor: pointer
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form .form-btn .loader {
|
||||||
|
display: none;
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
border: 5px solid #33d5ad;
|
||||||
|
border-bottom-color: #fff;
|
||||||
|
border-radius: 50%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
animation: rotation 1s linear infinite
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rotation {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg)
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form .form-info {
|
||||||
|
margin-top: -20px
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form .form-info p {
|
||||||
|
font-size: 14px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: normal
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form .form-info p.ok {
|
||||||
|
color: #33d5ad
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1 .col-right form .form-info p.error {
|
||||||
|
color: #cd1f27
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-2 .gallery-box {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 255px 253px 229px 218px 194px;
|
||||||
|
grid-template-rows: 222px 258px;
|
||||||
|
gap: 4px;
|
||||||
|
grid-template-areas: "img1 img1 img2 img3 img3" "img4 img5 img6 img7 img8"
|
||||||
|
}
|
||||||
|
|
||||||
|
@media(max-width: 1199px) {
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-2 .gallery-box {
|
||||||
|
grid-template-columns:1fr 1fr 1fr 1fr;
|
||||||
|
grid-template-rows: auto;
|
||||||
|
grid-template-areas: "img1 img1 img2 img4" "img5 img6 img3 img3" ". img7 img8 ."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media(max-width: 767px) {
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-2 .gallery-box {
|
||||||
|
grid-template-columns:1fr 1fr 1fr;
|
||||||
|
grid-template-areas: "img1 img1 img2" "img4 img3 img3" "img5 img6 img7" ". img8 ."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media(max-width: 575px) {
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-2 .gallery-box {
|
||||||
|
grid-template-columns:1fr 1fr;
|
||||||
|
grid-template-areas: "img1 img1" "img2 img4" "img5 img6" "img3 img3" "img7 img8"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-2 .gallery-box .gallery-item:nth-child(1) {
|
||||||
|
grid-area: img1
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-2 .gallery-box .gallery-item:nth-child(2) {
|
||||||
|
grid-area: img2
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-2 .gallery-box .gallery-item:nth-child(3) {
|
||||||
|
grid-area: img3
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-2 .gallery-box .gallery-item:nth-child(4) {
|
||||||
|
grid-area: img4
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-2 .gallery-box .gallery-item:nth-child(5) {
|
||||||
|
grid-area: img5
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-2 .gallery-box .gallery-item:nth-child(6) {
|
||||||
|
grid-area: img6
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-2 .gallery-box .gallery-item:nth-child(7) {
|
||||||
|
grid-area: img7
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-2 .gallery-box .gallery-item:nth-child(8) {
|
||||||
|
grid-area: img8
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-2 .gallery-box .gallery-item img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
-o-object-fit: cover;
|
||||||
|
object-fit: cover
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-4 {
|
||||||
|
margin-top: 75px;
|
||||||
|
margin-bottom: 75px
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-4 h2 {
|
||||||
|
color: #000;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 40px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: normal
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-4 .acc_component {
|
||||||
|
box-shadow: 0 1px 3px 0 rgba(0,0,0,.1),0 0 2px 0 rgba(0,0,0,.2)
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-4 .acc_component>li:not(:last-child) {
|
||||||
|
border-bottom: 1px solid rgba(0,0,0,.12)
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-4 .acc_component li.active .acc_head .arrow img {
|
||||||
|
transform: scale(-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-4 .acc_component li .acc_head {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 12px 20px;
|
||||||
|
cursor: pointer
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-4 .acc_component li .acc_head p {
|
||||||
|
color: rgba(0,0,0,.87);
|
||||||
|
font-family: "Roboto",sans-serif;
|
||||||
|
font-size: 15px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: normal;
|
||||||
|
margin-bottom: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-4 .acc_component li .acc_head .arrow {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
background: #33d5ad
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-4 .acc_component li .acc_head .arrow img {
|
||||||
|
width: 100%;
|
||||||
|
max-width: -moz-fit-content;
|
||||||
|
max-width: fit-content;
|
||||||
|
transition: all 250ms ease-in-out
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-4 .acc_component li .acc_body {
|
||||||
|
display: none;
|
||||||
|
color: rgba(0,0,0,.54);
|
||||||
|
font-family: "Roboto",sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: normal;
|
||||||
|
padding: 25px 20px
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #footer .footer-top {
|
||||||
|
display: none
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper h2{
|
||||||
|
margin: 20px 0;
|
||||||
|
color: #000;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 25px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper p{
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 #content-wrapper .box-1, #cms.cms-id-176 #content-wrapper .box-2, #cms.cms-id-176 #content-wrapper .box-3{
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 .link-list__container{
|
||||||
|
list-style: none;
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit,minmax(250px,1fr));
|
||||||
|
gap: 10px;
|
||||||
|
list-style: none;
|
||||||
|
padding: 0 !important;
|
||||||
|
margin: 20px 0 10px !important;
|
||||||
|
}
|
||||||
|
#cms.cms-id-176 .link-list__container li{
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
-webkit-box-pack: center;
|
||||||
|
-ms-flex-pack: center;
|
||||||
|
justify-content: center;
|
||||||
|
-ms-flex-line-pack: center;
|
||||||
|
align-content: center;
|
||||||
|
height: 100%;
|
||||||
|
min-height: 50px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 .link-list__container li a {
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
-webkit-box-align: center;
|
||||||
|
-ms-flex-align: center;
|
||||||
|
align-items: center;
|
||||||
|
color: #000;
|
||||||
|
font-weight: 600;
|
||||||
|
width: 100%;
|
||||||
|
margin: 0 auto;
|
||||||
|
-webkit-box-pack: center;
|
||||||
|
-ms-flex-pack: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 13px 10px;
|
||||||
|
border-radius: 5px;
|
||||||
|
transition: 0.5s;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
#cms.cms-id-176 .link-list__container li a:hover {
|
||||||
|
scale: 1.05;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 .about-prons{
|
||||||
|
text-align: center;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 .about-prons .about-prons-wrapper{
|
||||||
|
margin-top: 50px;
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(3, 1fr);
|
||||||
|
gap: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 .about-prons .about-prons-wrapper .about-prons-item{
|
||||||
|
padding: 20px 20px 10px;
|
||||||
|
border: 1px solid #34d6ad;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 .about-prons .about-prons-wrapper .about-prons-item .about-prons-item-header{
|
||||||
|
color: #34d6ad;
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 1.3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 1300px) {
|
||||||
|
|
||||||
|
#cms.cms-id-176 .about-prons .about-prons-wrapper {
|
||||||
|
grid-template-columns: repeat(2, 1fr);
|
||||||
|
gap: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cms.cms-id-176 .about-prons .about-prons-wrapper .about-prons-item {
|
||||||
|
padding: 20px 10px 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
|
||||||
|
#cms.cms-id-176 .about-prons .about-prons-wrapper {
|
||||||
|
grid-template-columns: repeat(1, 1fr);
|
||||||
|
gap: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#category-description2 p{
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
.page-cms .page-cms h2{
|
||||||
|
line-height: 1.8;
|
||||||
|
background-color: transparent;
|
||||||
|
margin-top: 0pt;
|
||||||
|
margin-bottom: 0pt;
|
||||||
|
font-size: 16pt;
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
color: #000000;
|
||||||
|
font-weight: 400;
|
||||||
|
font-style: normal;
|
||||||
|
font-variant: normal;
|
||||||
|
text-decoration: none;
|
||||||
|
vertical-align: baseline;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.page-cms .page-cms p{
|
||||||
|
line-height: 1.8 !important;
|
||||||
|
background-color: transparent;
|
||||||
|
margin-top: 0pt;
|
||||||
|
margin-bottom: 0pt;
|
||||||
|
text-align: left;
|
||||||
|
font-size: 12pt !important;
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
color: #0d0d0d;
|
||||||
|
font-weight: 400;
|
||||||
|
font-style: normal;
|
||||||
|
font-variant: normal;
|
||||||
|
text-decoration: none;
|
||||||
|
vertical-align: baseline;
|
||||||
|
white-space: pre-wrap;
|
||||||
}
|
}
|
||||||
BIN
themes/leo_gstore/assets/img/modules/.DS_Store
vendored
Normal file
|
After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/b-2.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 69 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/b-blog1.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/b-blog2.png
Normal file
|
After Width: | Height: | Size: 63 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/b-blog3.png
Normal file
|
After Width: | Height: | Size: 72 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/b-blog4.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/b-blogn-1.png
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/b-blogn-10.png
Normal file
|
After Width: | Height: | Size: 65 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/b-blogn-2.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/b-blogn-3.png
Normal file
|
After Width: | Height: | Size: 59 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/b-blogn-4.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/b-blogn-5.png
Normal file
|
After Width: | Height: | Size: 76 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/b-blogn-6.png
Normal file
|
After Width: | Height: | Size: 63 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/b-blogn-7.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/b-blogn-8.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/b-blogn-9.png
Normal file
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 86 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 75 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 128 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 69 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 117 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 37 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/t-2.jpg
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/t-2.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/t-blog1.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
themes/leo_gstore/assets/img/modules/leoblog/1/b/t-blog2.png
Normal file
|
After Width: | Height: | Size: 63 KiB |