Reorganization
This commit is contained in:
@@ -1,296 +0,0 @@
|
||||
<?php
|
||||
/* Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
|
||||
This file is part of a Moko Consulting project.
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
||||
|
||||
# FILE INFORMATION
|
||||
DEFGROUP: Joomla.Template.Site
|
||||
INGROUP: MokoCassiopeia
|
||||
REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia
|
||||
PATH: ./templates/mokocassiopeia/component.php
|
||||
VERSION: 03.06.02
|
||||
BRIEF: Main template index file for MokoCassiopeia rendering site layout
|
||||
*/
|
||||
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Uri\Uri;
|
||||
use Joomla\CMS\Component\ComponentHelper;
|
||||
|
||||
/** @var Joomla\CMS\Document\HtmlDocument $this */
|
||||
|
||||
$app = Factory::getApplication();
|
||||
$input = $app->getInput();
|
||||
$document = $app->getDocument();
|
||||
$wa = $document->getWebAssetManager();
|
||||
|
||||
// Template params
|
||||
$params_LightColorName = (string) $this->params->get('colorLightName', 'colors_standard'); // colors_standard|colors_alternative|colors_custom
|
||||
|
||||
$params_DarkColorName = (string) $this->params->get('colorDarkName', 'colors_standard'); // colors_standard|colors_alternative|colors_custom
|
||||
|
||||
$params_googletagmanager = $this->params->get('googletagmanager', false);
|
||||
$params_googletagmanagerid = $this->params->get('googletagmanagerid', null);
|
||||
$params_googleanalytics = $this->params->get('googleanalytics', false);
|
||||
$params_googleanalyticsid = $this->params->get('googleanalyticsid', null);
|
||||
$params_custom_head_start = $this->params->get('custom_head_start', null);
|
||||
$params_custom_head_end = $this->params->get('custom_head_end', null);
|
||||
$params_developmentmode = $this->params->get('developmentmode', false);
|
||||
|
||||
// Detecting Active Variables
|
||||
$option = $input->getCmd('option', '');
|
||||
$view = $input->getCmd('view', '');
|
||||
$layout = $input->getCmd('layout', '');
|
||||
$task = $input->getCmd('task', '');
|
||||
$itemid = $input->getCmd('Itemid', '');
|
||||
$sitenameR = $app->get('sitename'); // raw for title composition
|
||||
$sitename = htmlspecialchars($sitenameR, ENT_QUOTES, 'UTF-8');
|
||||
$menu = $app->getMenu()->getActive();
|
||||
$pageclass = $menu !== null ? $menu->getParams()->get('pageclass_sfx', '') : '';
|
||||
|
||||
// Respect “Site Name in Page Titles” (0:none, 1:before, 2:after)
|
||||
$mode = (int) $app->get('sitename_pagetitles', 0);
|
||||
$pageTitle = trim($this->getTitle());
|
||||
$final = $pageTitle !== ''
|
||||
? ($mode === 1 ? $sitenameR . ' - ' . $pageTitle
|
||||
: ($mode === 2 ? $pageTitle . ' - ' . $sitenameR : $pageTitle))
|
||||
: $sitenameR;
|
||||
$this->setTitle($final);
|
||||
|
||||
// Template/Media path
|
||||
$templatePath = 'media/templates/site/mokocassiopeia';
|
||||
|
||||
// Core template CSS
|
||||
$wa->useStyle('template.base'); // css/template.css
|
||||
|
||||
// Color theme (light + optional dark)
|
||||
$colorLightKey = strtolower(preg_replace('/[^a-z0-9_.-]/i', '', $params_LightColorName));
|
||||
$colorDarkKey = strtolower(preg_replace('/[^a-z0-9_.-]/i', '', $params_DarkColorName));
|
||||
$lightKey = 'template.light.' . $colorLightKey;
|
||||
$darkKey = 'template.dark.' . $colorDarkKey;
|
||||
try {
|
||||
$wa->useStyle('template.light.colors_standard');
|
||||
} catch (\Throwable $e) {
|
||||
$wa->registerAndUseStyle('template.light.colors_standard', $templatePath . '/css/colors/light/colors_standard.css');
|
||||
}
|
||||
try {
|
||||
$wa->useStyle('template.dark.colors_standard');
|
||||
} catch (\Throwable $e) {
|
||||
$wa->registerAndUseStyle('template.dark.colors_standard', $templatePath . '/css/colors/dark/colors_standard.css');
|
||||
}
|
||||
try {
|
||||
$wa->useStyle($lightKey);
|
||||
} catch (\Throwable $e) {
|
||||
$wa->registerAndUseStyle('template.light.dynamic', $templatePath . '/css/colors/light/' . $colorLightKey . '.css');
|
||||
}
|
||||
try {
|
||||
$wa->useStyle($darkKey);
|
||||
} catch (\Throwable $e) {
|
||||
$wa->registerAndUseStyle('template.dark.dynamic', $templatePath . '/css/colors/dark/' . $colorDarkKey . '.css');
|
||||
}
|
||||
|
||||
// Scripts
|
||||
$wa->useScript('template.js');
|
||||
|
||||
// Load Osaka font for site title
|
||||
$wa->useStyle('template.font.osaka');
|
||||
|
||||
/**
|
||||
* VirtueMart detection:
|
||||
* - Component must exist and be enabled
|
||||
*/
|
||||
$isVirtueMartActive = ComponentHelper::isEnabled('com_virtuemart', true);
|
||||
|
||||
if ($isVirtueMartActive) {
|
||||
/**
|
||||
* Load a VirtueMart-specific stylesheet defined in your template manifest.
|
||||
* This assumes you defined an asset named "template.virtuemart".
|
||||
*/
|
||||
$wa->useStyle('vendor.vm');
|
||||
}
|
||||
|
||||
// Font scheme (external or local) + CSS custom properties
|
||||
$params_FontScheme = $this->params->get('useFontScheme', false);
|
||||
$fontStyles = '';
|
||||
|
||||
if ($params_FontScheme) {
|
||||
if (stripos($params_FontScheme, 'https://') === 0) {
|
||||
$this->getPreloadManager()->preconnect('https://fonts.googleapis.com/', ['crossorigin' => 'anonymous']);
|
||||
$this->getPreloadManager()->preconnect('https://fonts.gstatic.com/', ['crossorigin' => 'anonymous']);
|
||||
$this->getPreloadManager()->preload($params_FontScheme, ['as' => 'style', 'crossorigin' => 'anonymous']);
|
||||
$wa->registerAndUseStyle('fontscheme.current', $params_FontScheme, [], [
|
||||
'media' => 'print',
|
||||
'rel' => 'lazy-stylesheet',
|
||||
'onload' => 'this.media=\'all\'',
|
||||
'crossorigin' => 'anonymous'
|
||||
]);
|
||||
|
||||
if (preg_match_all('/family=([^?:]*):/i', $params_FontScheme, $matches) > 0) {
|
||||
$fontStyles = '--font-family-body: "' . str_replace('+', ' ', $matches[1][0]) . '", sans-serif;' . "\n";
|
||||
$fontStyles .= '--font-family-headings: "' . str_replace('+', ' ', isset($matches[1][1]) ? $matches[1][1] : $matches[1][0]) . '", sans-serif;' . "\n";
|
||||
$fontStyles .= '--font-weight-normal: 400;' . "\n";
|
||||
$fontStyles .= '--font-weight-headings: 700;';
|
||||
}
|
||||
} else {
|
||||
$wa->registerAndUseStyle('fontscheme.current', $params_FontScheme, ['version' => 'auto'], [
|
||||
'media' => 'print',
|
||||
'rel' => 'lazy-stylesheet',
|
||||
'onload' => 'this.media=\'all\''
|
||||
]);
|
||||
$this->getPreloadManager()->preload(
|
||||
$wa->getAsset('style', 'fontscheme.current')->getUri() . '?' . $this->getMediaVersion(),
|
||||
['as' => 'style']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Meta
|
||||
$this->setMetaData('viewport', 'width=device-width, initial-scale=1');
|
||||
|
||||
if ($this->params->get('faKitCode')) {
|
||||
$faKit = "https://kit.fontawesome.com/" . $this->params->get('faKitCode') . ".js";
|
||||
HTMLHelper::_('script', $faKit, ['crossorigin' => 'anonymous']);
|
||||
} else {
|
||||
try {
|
||||
if($params_developmentmode){
|
||||
$wa->useStyle('vendor.fa7free.all');
|
||||
$wa->useStyle('vendor.fa7free.brands');
|
||||
$wa->useStyle('vendor.fa7free.fontawesome');
|
||||
$wa->useStyle('vendor.fa7free.regular');
|
||||
$wa->useStyle('vendor.fa7free.solid');
|
||||
} else {
|
||||
$wa->useStyle('vendor.fa7free.all.min');
|
||||
$wa->useStyle('vendor.fa7free.brands.min');
|
||||
$wa->useStyle('vendor.fa7free.fontawesome.min');
|
||||
$wa->useStyle('vendor.fa7free.regular.min');
|
||||
$wa->useStyle('vendor.fa7free.solid.min');
|
||||
}
|
||||
} catch (\Throwable $e) {
|
||||
if($params_developmentmode){
|
||||
$wa->registerAndUseStyle('vendor.fa7free.all.dynamic', $templatePath . '/vendor/fa7free/css/all.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.brands.dynamic', $templatePath . '/vendor/fa7free/css/brands.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.fontawesome.dynamic', $templatePath . '/vendor/fa7free/css/fontawesome.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.regular.dynamic', $templatePath . '/vendor/fa7free/css/regular.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.solid.dynamic', $templatePath . '/vendor/fa7free/css/solid.css');
|
||||
} else {
|
||||
$wa->registerAndUseStyle('vendor.fa7free.all.min.dynamic', $templatePath . '/vendor/fa7free/css/all.min.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.brands.min.dynamic', $templatePath . '/vendor/fa7free/css/brands.min.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.fontawesome.min.dynamic', $templatePath . '/vendor/fa7free/css/fontawesome.min.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.regular.min.dynamic', $templatePath . '/vendor/fa7free/css/regular.min.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.solid.min.dynamic', $templatePath . '/vendor/fa7free/css/solid.min.css');
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
$params_leftIcon = htmlspecialchars($this->params->get('drawerLeftIcon', 'fa-solid fa-chevron-left'), ENT_COMPAT, 'UTF-8');
|
||||
$params_rightIcon = htmlspecialchars($this->params->get('drawerRightIcon', 'fa-solid fa-chevron-right'), ENT_COMPAT, 'UTF-8');
|
||||
|
||||
// Theme params
|
||||
$params_theme_enabled = $this->params->get('theme_enabled', 1);
|
||||
|
||||
$wa->useStyle('template.user'); // css/user.css
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html class="component" lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
|
||||
<head>
|
||||
<jdoc:include type="metas" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<jdoc:include type="styles" />
|
||||
<jdoc:include type="scripts" />
|
||||
|
||||
<?php if ($params_theme_enabled) : ?>
|
||||
<script>
|
||||
// Early theme application to avoid FOUC
|
||||
(function () {
|
||||
try {
|
||||
var stored = localStorage.getItem('theme');
|
||||
var prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
||||
var theme = stored ? stored : (prefersDark ? 'dark' : 'light');
|
||||
document.documentElement.setAttribute('data-bs-theme', theme);
|
||||
document.documentElement.setAttribute('data-aria-theme', theme);
|
||||
} catch (e) {}
|
||||
})();
|
||||
</script>
|
||||
<?php endif; ?>
|
||||
</head>
|
||||
<body class="<?php echo $this->direction === 'rtl' ? 'rtl' : ''; ?>">
|
||||
<?php if (!empty($params_googletagmanager) && !empty($params_googletagmanagerid)) :
|
||||
$gtmID = htmlspecialchars($params_googletagmanagerid, ENT_QUOTES, 'UTF-8'); ?>
|
||||
<!-- Google Tag Manager -->
|
||||
<script>
|
||||
(function(w,d,s,l,i){
|
||||
w[l]=w[l]||[];
|
||||
w[l].push({'gtm.start': new Date().getTime(), event:'gtm.js'});
|
||||
var f=d.getElementsByTagName(s)[0],
|
||||
j=d.createElement(s),
|
||||
dl=l!='dataLayer'?'&l='+l:'';
|
||||
j.async=true;
|
||||
j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;
|
||||
f.parentNode.insertBefore(j,f);
|
||||
})(window,document,'script','dataLayer','<?php echo $gtmID; ?>');
|
||||
</script>
|
||||
<!-- End Google Tag Manager -->
|
||||
|
||||
<!-- Google Tag Manager (noscript) -->
|
||||
<noscript>
|
||||
<iframe src="https://www.googletagmanager.com/ns.html?id=<?php echo $gtmID; ?>"
|
||||
height="0" width="0" style="display:none;visibility:hidden"></iframe>
|
||||
</noscript>
|
||||
<!-- End Google Tag Manager (noscript) -->
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($params_googleanalytics) && !empty($params_googleanalyticsid)) :
|
||||
$gaId = htmlspecialchars($params_googleanalyticsid, ENT_QUOTES, 'UTF-8'); ?>
|
||||
<!-- Google Analytics (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=<?php echo $gaId; ?>"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
gtag('consent', 'default', {
|
||||
'ad_storage': 'denied',
|
||||
'analytics_storage': 'granted',
|
||||
'ad_user_data': 'denied',
|
||||
'ad_personalization': 'denied'
|
||||
});
|
||||
(function(id){
|
||||
if (/^G-/.test(id)) {
|
||||
gtag('config', id, { 'anonymize_ip': true });
|
||||
} else if (/^UA-/.test(id)) {
|
||||
gtag('config', id, { 'anonymize_ip': true });
|
||||
console.warn('Using a UA- ID. Universal Analytics is sunset; consider migrating to GA4.');
|
||||
} else {
|
||||
console.warn('Unrecognized Google Analytics ID format:', id);
|
||||
}
|
||||
})('<?php echo $gaId; ?>');
|
||||
</script>
|
||||
<!-- End Google Analytics -->
|
||||
<?php endif; ?>
|
||||
|
||||
<jdoc:include type="message" />
|
||||
<jdoc:include type="component" />
|
||||
|
||||
<footer class="container-footer footer full-width">
|
||||
<?php if ($this->countModules('footer-menu', true)) : ?>
|
||||
<div class="grid-child footer-menu">
|
||||
<jdoc:include type="modules" name="footer-menu" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->countModules('footer', true)) : ?>
|
||||
<div class="grid-child">
|
||||
<jdoc:include type="modules" name="footer" style="none" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</footer>
|
||||
|
||||
<jdoc:include type="modules" name="debug" style="none" />
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,30 +0,0 @@
|
||||
<?php
|
||||
/* Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
|
||||
This file is part of a Moko Consulting project.
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
||||
|
||||
# FILE INFORMATION
|
||||
DEFGROUP: Joomla.Template.Site
|
||||
INGROUP: MokoCassiopeia
|
||||
REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia
|
||||
PATH: ./templates/mokocassiopeia/custom.php
|
||||
VERSION: 03.06.02
|
||||
BRIEF: MokoCassiopeia with user-defined overrides
|
||||
*/
|
||||
|
||||
function console_log($output, $with_script_tags = true) {
|
||||
$js_code = 'console.log(' . json_encode($output, JSON_HEX_TAG) .
|
||||
');';
|
||||
if ($with_script_tags) {
|
||||
$js_code = '<script>' . $js_code . '</script>';
|
||||
}
|
||||
echo $js_code;
|
||||
}
|
||||
?>
|
||||
<!--
|
||||
Custom code included here
|
||||
-->
|
||||
@@ -1,472 +0,0 @@
|
||||
<?php
|
||||
/* Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
|
||||
This file is part of a Moko Consulting project.
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
||||
|
||||
# FILE INFORMATION
|
||||
DEFGROUP: Joomla.Template.Site
|
||||
INGROUP: MokoCassiopeia
|
||||
REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia
|
||||
PATH: ./templates/mokocassiopeia/error.php
|
||||
VERSION: 03.06.02
|
||||
BRIEF: Error page template file for MokoCassiopeia
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Uri\Uri;
|
||||
|
||||
/** @var Joomla\CMS\Document\ErrorDocument|Joomla\CMS\Document\HtmlDocument $this */
|
||||
$app = Factory::getApplication();
|
||||
$params = $this->params;
|
||||
$wa = $this->getWebAssetManager();
|
||||
|
||||
// Template params
|
||||
$params_LightColorName = (string) $params->get('colorLightName', 'colors_standard'); // colors_standard|colors_alternative|colors_custom
|
||||
|
||||
$params_DarkColorName = (string) $params->get('colorDarkName', 'colors_standard'); // colors_standard|colors_alternative|colors_custom
|
||||
|
||||
$params_googletagmanager = $params->get('googletagmanager', false);
|
||||
$params_googletagmanagerid = $params->get('googletagmanagerid', '');
|
||||
$params_googleanalytics = $params->get('googleanalytics', false);
|
||||
$params_googleanalyticsid = $params->get('googleanalyticsid', '');
|
||||
$params_custom_head_start = $params->get('custom_head_start', '');
|
||||
$params_custom_head_end = $params->get('custom_head_end', '');
|
||||
$params_developmentmode = $params->get('developmentmode', false);
|
||||
|
||||
// ------------------ Params ------------------
|
||||
$fluidContainer = (bool) $params->get('fluidContainer', 0);
|
||||
$wrapper = $fluidContainer ? 'wrapper-fluid' : 'wrapper-static';
|
||||
$stickyHeader = (bool) $params->get('stickyHeader', 0);
|
||||
|
||||
// Drawer icon params (escaped)
|
||||
$params_leftIcon = htmlspecialchars($params->get('drawerLeftIcon', 'fa-solid fa-chevron-left'), ENT_QUOTES, 'UTF-8');
|
||||
$params_rightIcon = htmlspecialchars($params->get('drawerRightIcon', 'fa-solid fa-chevron-right'), ENT_QUOTES, 'UTF-8');
|
||||
|
||||
// Template/Media path
|
||||
$templatePath = 'media/templates/site/mokocassiopeia';
|
||||
|
||||
// ===========================
|
||||
// Web Asset Manager (WAM) — matches your joomla.asset.json
|
||||
// ===========================
|
||||
|
||||
// Core template CSS
|
||||
$wa->useStyle('template.base'); // css/template.css
|
||||
|
||||
// Color theme (light + optional dark)
|
||||
$colorLightKey = strtolower(preg_replace('/[^a-z0-9_.-]/i', '', $params_LightColorName));
|
||||
$colorDarkKey = strtolower(preg_replace('/[^a-z0-9_.-]/i', '', $params_DarkColorName));
|
||||
$lightKey = 'template.light.' . $colorLightKey;
|
||||
$darkKey = 'template.dark.' . $colorDarkKey;
|
||||
try {
|
||||
$wa->useStyle('template.light.colors_standard');
|
||||
} catch (\Throwable $e) {
|
||||
$wa->registerAndUseStyle('template.light.colors_standard', $templatePath . '/css/colors/light/colors_standard.css');
|
||||
}
|
||||
try {
|
||||
$wa->useStyle('template.dark.colors_standard');
|
||||
} catch (\Throwable $e) {
|
||||
$wa->registerAndUseStyle('template.dark.colors_standard', $templatePath . '/css/colors/dark/colors_standard.css');
|
||||
}
|
||||
try {
|
||||
$wa->useStyle($lightKey);
|
||||
} catch (\Throwable $e) {
|
||||
$wa->registerAndUseStyle('template.light.dynamic', $templatePath . '/css/colors/light/' . $colorLightKey . '.css');
|
||||
}
|
||||
try {
|
||||
$wa->useStyle($darkKey);
|
||||
} catch (\Throwable $e) {
|
||||
$wa->registerAndUseStyle('template.dark.dynamic', $templatePath . '/css/colors/dark/' . $colorDarkKey . '.css');
|
||||
}
|
||||
|
||||
// Scripts
|
||||
$wa->useScript('template.js');
|
||||
|
||||
// Load Osaka font for site title
|
||||
$wa->useStyle('template.font.osaka');
|
||||
|
||||
// Smart Bootstrap component loading - only load what's needed
|
||||
if ($this->countModules('drawer-left', true) || $this->countModules('drawer-right', true)) {
|
||||
// Load Bootstrap Offcanvas component for drawers
|
||||
HTMLHelper::_('bootstrap.offcanvas');
|
||||
}
|
||||
|
||||
// Meta
|
||||
$this->setMetaData('viewport', 'width=device-width, initial-scale=1');
|
||||
|
||||
if ($this->params->get('faKitCode')) {
|
||||
$faKit = "https://kit.fontawesome.com/" . $this->params->get('faKitCode') . ".js";
|
||||
HTMLHelper::_('script', $faKit, ['crossorigin' => 'anonymous']);
|
||||
} else {
|
||||
try {
|
||||
if ($params_developmentmode){
|
||||
$wa->useStyle('vendor.fa7free.all');
|
||||
$wa->useStyle('vendor.fa7free.brands');
|
||||
$wa->useStyle('vendor.fa7free.fontawesome');
|
||||
$wa->useStyle('vendor.fa7free.regular');
|
||||
$wa->useStyle('vendor.fa7free.solid');
|
||||
} else {
|
||||
$wa->useStyle('vendor.fa7free.all.min');
|
||||
$wa->useStyle('vendor.fa7free.brands.min');
|
||||
$wa->useStyle('vendor.fa7free.fontawesome.min');
|
||||
$wa->useStyle('vendor.fa7free.regular.min');
|
||||
$wa->useStyle('vendor.fa7free.solid.min');
|
||||
}
|
||||
} catch (\Throwable $e) {
|
||||
if ($params_developmentmode){
|
||||
$wa->registerAndUseStyle('vendor.fa7free.all.dynamic', $templatePath . '/vendor/fa7free/css/all.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.brands.dynamic', $templatePath . '/vendor/fa7free/css/brands.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.fontawesome.dynamic', $templatePath . '/vendor/fa7free/css/fontawesome.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.regular.dynamic', $templatePath . '/vendor/fa7free/css/regular.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.solid.dynamic', $templatePath . '/vendor/fa7free/css/solid.css');
|
||||
} else {
|
||||
$wa->registerAndUseStyle('vendor.fa7free.all.min.dynamic', $templatePath . '/vendor/fa7free/css/all.min.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.brands.min.dynamic', $templatePath . '/vendor/fa7free/css/brands.min.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.fontawesome.min.dynamic', $templatePath . '/vendor/fa7free/css/fontawesome.min.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.regular.min.dynamic', $templatePath . '/vendor/fa7free/css/regular.min.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.solid.min.dynamic', $templatePath . '/vendor/fa7free/css/solid.min.css');
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
$wa->useStyle('template.user'); // css/user.css
|
||||
|
||||
// ------------------ Context (logo, bootstrap needs) ------------------
|
||||
$sitename = htmlspecialchars($app->get('sitename'), ENT_QUOTES, 'UTF-8');
|
||||
|
||||
// -------------------------------------
|
||||
// Brand: logo from params OR siteTitle
|
||||
// -------------------------------------
|
||||
$brandHtml = '';
|
||||
$logoFile = (string) $this->params->get('logoFile');
|
||||
|
||||
if ($logoFile !== '') {
|
||||
$brandHtml = HTMLHelper::_(
|
||||
'image',
|
||||
Uri::root(false) . htmlspecialchars($logoFile, ENT_QUOTES, 'UTF-8'),
|
||||
$sitename,
|
||||
['class' => 'logo d-inline-block', 'loading' => 'eager', 'decoding' => 'async'],
|
||||
false,
|
||||
0
|
||||
);
|
||||
} else {
|
||||
// If no logo file, show the title (defaults to "MokoCassiopeia" if not set)
|
||||
$siteTitle = $this->params->get('siteTitle', 'MokoCassiopeia');
|
||||
$brandHtml = '<span class="site-title" title="' . $sitename . '">'
|
||||
. htmlspecialchars($siteTitle, ENT_COMPAT, 'UTF-8')
|
||||
. '</span>';
|
||||
}
|
||||
|
||||
// ------------------ Error details ------------------
|
||||
$errorObj = isset($this->error) && is_object($this->error) ? $this->error : null;
|
||||
$errorCode = $errorObj ? (int) $errorObj->getCode() : 500;
|
||||
$errorMsg = $errorObj ? $errorObj->getMessage() : Text::_('JERROR_AN_ERROR_HAS_OCCURRED');
|
||||
$debugOn = defined('JDEBUG') && JDEBUG;
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
|
||||
<head>
|
||||
<?php if ($params_custom_head_start !== '') : ?><?php echo $params_custom_head_start; ?><?php endif; ?>
|
||||
<jdoc:include type="head" />
|
||||
|
||||
<script>
|
||||
// Early theme application to avoid FOUC
|
||||
(function () {
|
||||
try {
|
||||
var stored = localStorage.getItem('theme');
|
||||
var prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
||||
var theme = stored ? stored : (prefersDark ? 'dark' : 'light');
|
||||
document.documentElement.setAttribute('data-bs-theme', theme);
|
||||
} catch (e) {}
|
||||
})();
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Facebook in-app browser warning banner
|
||||
window.addEventListener('DOMContentLoaded', function () {
|
||||
var ua = navigator.userAgent || navigator.vendor || window.opera;
|
||||
var isFacebookBrowser = ua.indexOf('FBAN') > -1 || ua.indexOf('FBAV') > -1;
|
||||
if (isFacebookBrowser) {
|
||||
var warning = document.createElement('div');
|
||||
warning.textContent = '⚠️ KNOWN ISSUE: Images do not load in Facebook Web browser. Please open in external browser for full experience.';
|
||||
warning.style.position = 'fixed';
|
||||
warning.style.top = '0';
|
||||
warning.style.left = '0';
|
||||
warning.style.right = '0';
|
||||
warning.style.zIndex = '10000';
|
||||
warning.style.backgroundColor = '#007bff';
|
||||
warning.style.color = '#fff';
|
||||
warning.style.padding = '15px';
|
||||
warning.style.textAlign = 'center';
|
||||
warning.style.fontWeight = 'bold';
|
||||
warning.style.fontSize = '16px';
|
||||
warning.style.boxShadow = '0 2px 5px rgba(0,0,0,0.2)';
|
||||
document.body.appendChild(warning);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<?php if ($params_custom_head_end !== '') : ?><?php echo $params_custom_head_end; ?><?php endif; ?>
|
||||
</head>
|
||||
<body data-bs-spy="scroll" data-bs-target="#toc" class="site error-page<?php
|
||||
echo ($this->direction == 'rtl' ? ' rtl' : '');
|
||||
?>">
|
||||
<?php if (!empty($params_googletagmanager) && !empty($params_googletagmanagerid)) : ?>
|
||||
<!-- Google Tag Manager -->
|
||||
<script>
|
||||
(function(w,d,s,l,i){
|
||||
w[l]=w[l]||[];
|
||||
w[l].push({'gtm.start': new Date().getTime(), event:'gtm.js'});
|
||||
var f=d.getElementsByTagName(s)[0],
|
||||
j=d.createElement(s),
|
||||
dl=l!='dataLayer'?'&l='+l:'';
|
||||
j.async=true;
|
||||
j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;
|
||||
f.parentNode.insertBefore(j,f);
|
||||
})(window,document,'script','dataLayer',<?php echo json_encode($params_googletagmanagerid, JSON_HEX_TAG | JSON_HEX_AMP); ?>);
|
||||
</script>
|
||||
<!-- End Google Tag Manager -->
|
||||
|
||||
<!-- Google Tag Manager (noscript) -->
|
||||
<noscript>
|
||||
<iframe src="https://www.googletagmanager.com/ns.html?id=<?php echo htmlspecialchars($params_googletagmanagerid, ENT_QUOTES, 'UTF-8'); ?>"
|
||||
height="0" width="0" style="display:none;visibility:hidden"></iframe>
|
||||
</noscript>
|
||||
<!-- End Google Tag Manager (noscript) -->
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($params_googleanalytics) && !empty($params_googleanalyticsid)) : ?>
|
||||
<!-- Google Analytics (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=<?php echo htmlspecialchars($params_googleanalyticsid, ENT_QUOTES, 'UTF-8'); ?>"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
gtag('consent', 'default', {
|
||||
'ad_storage': 'denied',
|
||||
'analytics_storage': 'granted',
|
||||
'ad_user_data': 'denied',
|
||||
'ad_personalization': 'denied'
|
||||
});
|
||||
(function(id){
|
||||
if (/^G-/.test(id)) {
|
||||
gtag('config', id, { 'anonymize_ip': true });
|
||||
} else if (/^UA-/.test(id)) {
|
||||
gtag('config', id, { 'anonymize_ip': true });
|
||||
console.warn('Using a UA- ID. Universal Analytics is sunset; consider migrating to GA4.');
|
||||
} else {
|
||||
console.warn('Unrecognized Google Analytics ID format:', id);
|
||||
}
|
||||
})(<?php echo json_encode($params_googleanalyticsid, JSON_HEX_TAG | JSON_HEX_AMP); ?>);
|
||||
</script>
|
||||
<!-- End Google Analytics -->
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- ========== HEADER FROM INDEX ========== -->
|
||||
<header class="header container-header full-width<?php echo $stickyHeader ? ' position-sticky sticky-top' : ''; ?>" role="banner">
|
||||
|
||||
<?php if ($this->countModules('topbar')) : ?>
|
||||
<div class="container-topbar">
|
||||
<jdoc:include type="modules" name="topbar" style="none" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="header-top">
|
||||
<?php if ($this->countModules('below-topbar')) : ?>
|
||||
<div class="grid-child container-below-topbar">
|
||||
<jdoc:include type="modules" name="below-topbar" style="none" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->params->get('brand', 1)) : ?>
|
||||
<div class="grid-child">
|
||||
<div class="navbar-brand">
|
||||
<a class="brand-logo" href="<?php echo $this->baseurl; ?>/">
|
||||
<?php echo $brandHtml; ?>
|
||||
</a>
|
||||
<?php if ($this->params->get('siteDescription')) : ?>
|
||||
<div class="site-description">
|
||||
<?php echo htmlspecialchars($this->params->get('siteDescription'), ENT_QUOTES, 'UTF-8'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->countModules('below-logo')) : ?>
|
||||
<div class="grid container-below-logo">
|
||||
<jdoc:include type="modules" name="below-logo" style="none" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<!-- Drawer Toggle Buttons -->
|
||||
<?php if ($this->countModules('drawer-left')) : ?>
|
||||
<button class="drawer-toggle-left btn btn-outline-secondary me-2"
|
||||
type="button"
|
||||
data-bs-toggle="offcanvas"
|
||||
data-bs-target="#drawer-left"
|
||||
aria-controls="drawer-left">
|
||||
<span class="<?php echo $params_leftIcon; ?>"></span>
|
||||
</button>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->countModules('drawer-right')) : ?>
|
||||
<button class="drawer-toggle-right btn btn-outline-secondary"
|
||||
type="button"
|
||||
data-bs-toggle="offcanvas"
|
||||
data-bs-target="#drawer-right"
|
||||
aria-controls="drawer-right">
|
||||
<span class="<?php echo $params_rightIcon; ?>"></span>
|
||||
</button>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->countModules('menu', true) || $this->countModules('search', true)) : ?>
|
||||
<div class="grid-child container-nav">
|
||||
<?php if ($this->countModules('menu', true)) : ?>
|
||||
<nav role="navigation" aria-label="Primary">
|
||||
<jdoc:include type="modules" name="menu" style="none" />
|
||||
</nav>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->countModules('search', true)) : ?>
|
||||
<div class="container-search">
|
||||
<jdoc:include type="modules" name="search" style="none" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</header>
|
||||
<!-- ========== END HEADER ========== -->
|
||||
|
||||
<main class="container my-4">
|
||||
<div class="card border-0 shadow-sm mb-4">
|
||||
<div class="card-body">
|
||||
<h1 class="h3">
|
||||
<span class="text-muted"><?php echo Text::_('JERROR_LAYOUT_ERROR_HAS_OCCURRED'); ?>:</span>
|
||||
<strong><?php echo (int) $errorCode; ?></strong>
|
||||
</h1>
|
||||
<p class="lead mb-1">
|
||||
<?php echo htmlspecialchars($errorMsg, ENT_QUOTES, 'UTF-8'); ?>
|
||||
</p>
|
||||
<p class="text-muted mb-0">
|
||||
<?php echo Text::_('JERROR_LAYOUT_PLEASE_TRY_ONE_OF_THE_FOLLOWING_PAGES'); ?>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-flex gap-2 flex-wrap">
|
||||
<a class="btn btn-primary" href="<?php echo htmlspecialchars(Uri::base(), ENT_QUOTES, 'UTF-8'); ?>">
|
||||
<i class="fa-solid fa-home me-1" aria-hidden="true"></i>
|
||||
<?php echo Text::_('JERROR_LAYOUT_HOME_PAGE'); ?>
|
||||
</a>
|
||||
<button class="btn btn-outline-secondary" type="button" onclick="history.back();">
|
||||
<i class="fa-solid fa-arrow-left me-1" aria-hidden="true"></i>
|
||||
<?php echo Text::_('JPREV'); ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<?php if ($debugOn && $errorObj) : ?>
|
||||
<section class="mt-4" role="region" aria-label="Debug Details">
|
||||
<div class="alert alert-warning"><strong>Debug mode is ON</strong> — detailed error information is shown below.</div>
|
||||
|
||||
<div class="card mb-3">
|
||||
<div class="card-header fw-bold">Exception</div>
|
||||
<div class="card-body small">
|
||||
<dl class="row mb-0">
|
||||
<dt class="col-sm-3">Class</dt>
|
||||
<dd class="col-sm-9"><?php echo htmlspecialchars(get_class($errorObj), ENT_QUOTES, 'UTF-8'); ?></dd>
|
||||
|
||||
<dt class="col-sm-3">Code</dt>
|
||||
<dd class="col-sm-9"><?php echo (int) $errorObj->getCode(); ?></dd>
|
||||
|
||||
<dt class="col-sm-3">Message</dt>
|
||||
<dd class="col-sm-9 text-break"><?php echo htmlspecialchars($errorObj->getMessage(), ENT_QUOTES, 'UTF-8'); ?></dd>
|
||||
|
||||
<dt class="col-sm-3">File</dt>
|
||||
<dd class="col-sm-9 text-break"><?php echo htmlspecialchars($errorObj->getFile(), ENT_QUOTES, 'UTF-8'); ?> : <?php echo (int) $errorObj->getLine(); ?></dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php $trace = method_exists($errorObj, 'getTrace') ? $errorObj->getTrace() : []; ?>
|
||||
<div class="card mb-3">
|
||||
<div class="card-header fw-bold">Stack Trace (<?php echo count($trace); ?> frames)</div>
|
||||
<div class="card-body small">
|
||||
<?php if ($trace) : ?>
|
||||
<ol class="mb-0 ps-3">
|
||||
<?php foreach ($trace as $i => $frame) :
|
||||
$file = $frame['file'] ?? '[internal]';
|
||||
$line = isset($frame['line']) ? (int) $frame['line'] : 0;
|
||||
$func = $frame['function'] ?? '';
|
||||
$class= $frame['class'] ?? '';
|
||||
$type = $frame['type'] ?? '';
|
||||
?>
|
||||
<li class="mb-2">
|
||||
<div class="text-break"><code>#<?php echo $i; ?></code> <?php echo htmlspecialchars($class . $type . $func, ENT_QUOTES, 'UTF-8'); ?>()</div>
|
||||
<div class="text-muted"><?php echo htmlspecialchars($file, ENT_QUOTES, 'UTF-8'); ?><?php echo $line ? ':' . $line : ''; ?></div>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
</ol>
|
||||
<?php else : ?>
|
||||
<em>No stack trace available.</em>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<?php endif; ?>
|
||||
</main>
|
||||
<footer class="container-footer footer full-width">
|
||||
<?php if ($this->countModules('footer-menu', true)) : ?>
|
||||
<div class="grid-child footer-menu">
|
||||
<jdoc:include type="modules" name="footer-menu" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->countModules('footer', true)) : ?>
|
||||
<div class="grid-child">
|
||||
<jdoc:include type="modules" name="footer" style="none" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</footer>
|
||||
|
||||
<?php if ($this->params->get('backTop') == 1) : ?>
|
||||
<a href="#top" id="back-top" class="back-to-top-link" aria-label="<?php echo Text::_('TPL_MOKOCASSIOPEIA_BACKTOTOP'); ?>">
|
||||
<span class="icon-arrow-up icon-fw" aria-hidden="true"></span>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->countModules('drawer-left', true)) : ?>
|
||||
<!-- Left Offcanvas Drawer -->
|
||||
<aside class="offcanvas offcanvas-start" tabindex="-1" id="drawer-left">
|
||||
<div class="offcanvas-header">
|
||||
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="<?php echo Text::_('JLIB_HTML_BEHAVIOR_CLOSE'); ?>"></button>
|
||||
</div>
|
||||
<div class="offcanvas-body">
|
||||
<jdoc:include type="modules" name="drawer-left" style="none" />
|
||||
</div>
|
||||
</aside>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->countModules('drawer-right', true)) : ?>
|
||||
<!-- Right Offcanvas Drawer -->
|
||||
<aside class="offcanvas offcanvas-end" tabindex="-1" id="drawer-right">
|
||||
<div class="offcanvas-header">
|
||||
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="<?php echo Text::_('JLIB_HTML_BEHAVIOR_CLOSE'); ?>"></button>
|
||||
</div>
|
||||
<div class="offcanvas-body">
|
||||
<jdoc:include type="modules" name="drawer-right" style="none" />
|
||||
</div>
|
||||
</aside>
|
||||
<?php endif; ?>
|
||||
|
||||
<jdoc:include type="modules" name="debug" style="none" />
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><title></title>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><title></title>
|
||||
@@ -1,112 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Community Builder
|
||||
* @subpackage com_comprofiler
|
||||
*
|
||||
* @copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for Community Builder login view
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Router\Route;
|
||||
|
||||
$return = $this->return ?? '';
|
||||
$showRegisterLink = $this->showRegisterLink ?? true;
|
||||
$showLostPasswordLink = $this->showLostPasswordLink ?? true;
|
||||
?>
|
||||
|
||||
<div class="cb-login-responsive cb-component">
|
||||
<div class="cb-login__container">
|
||||
<div class="cb-login__header">
|
||||
<h1 class="cb-login__title">
|
||||
<?php echo Text::_('COM_COMPROFILER_LOGIN'); ?>
|
||||
</h1>
|
||||
</div>
|
||||
|
||||
<form action="<?php echo Route::_('index.php?option=com_comprofiler&view=login'); ?>"
|
||||
method="post"
|
||||
class="cb-login__form"
|
||||
aria-label="<?php echo Text::_('COM_COMPROFILER_LOGIN_FORM'); ?>">
|
||||
|
||||
<div class="cb-login__field">
|
||||
<label for="cb-username" class="cb-login__label">
|
||||
<?php echo Text::_('COM_COMPROFILER_USERNAME'); ?>
|
||||
<span class="cb-login__required" aria-label="<?php echo Text::_('COM_COMPROFILER_REQUIRED'); ?>">*</span>
|
||||
</label>
|
||||
<input type="text"
|
||||
id="cb-username"
|
||||
name="username"
|
||||
class="cb-login__input"
|
||||
required
|
||||
aria-required="true"
|
||||
autocomplete="username"
|
||||
placeholder="<?php echo Text::_('COM_COMPROFILER_USERNAME'); ?>">
|
||||
</div>
|
||||
|
||||
<div class="cb-login__field">
|
||||
<label for="cb-password" class="cb-login__label">
|
||||
<?php echo Text::_('COM_COMPROFILER_PASSWORD'); ?>
|
||||
<span class="cb-login__required" aria-label="<?php echo Text::_('COM_COMPROFILER_REQUIRED'); ?>">*</span>
|
||||
</label>
|
||||
<input type="password"
|
||||
id="cb-password"
|
||||
name="passwd"
|
||||
class="cb-login__input"
|
||||
required
|
||||
aria-required="true"
|
||||
autocomplete="current-password"
|
||||
placeholder="<?php echo Text::_('COM_COMPROFILER_PASSWORD'); ?>">
|
||||
</div>
|
||||
|
||||
<?php if ($this->showRememberMe ?? true) : ?>
|
||||
<div class="cb-login__remember">
|
||||
<div class="form-check">
|
||||
<input type="checkbox"
|
||||
id="cb-remember"
|
||||
name="remember"
|
||||
class="form-check-input cb-login__remember-checkbox"
|
||||
value="yes">
|
||||
<label for="cb-remember" class="form-check-label cb-login__remember-label">
|
||||
<?php echo Text::_('COM_COMPROFILER_REMEMBER_ME'); ?>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="cb-login__actions">
|
||||
<button type="submit" class="cb-login__btn cb-login__btn--submit btn btn-primary">
|
||||
<span class="icon-lock" aria-hidden="true"></span>
|
||||
<?php echo Text::_('COM_COMPROFILER_LOGIN'); ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<input type="hidden" name="task" value="login">
|
||||
<input type="hidden" name="return" value="<?php echo htmlspecialchars($return, ENT_QUOTES, 'UTF-8'); ?>">
|
||||
<?php echo $this->token ?? ''; ?>
|
||||
</form>
|
||||
|
||||
<div class="cb-login__links">
|
||||
<?php if ($showRegisterLink) : ?>
|
||||
<div class="cb-login__link">
|
||||
<a href="<?php echo Route::_('index.php?option=com_comprofiler&view=registers'); ?>" class="cb-login__link-item">
|
||||
<span class="icon-user-plus" aria-hidden="true"></span>
|
||||
<?php echo Text::_('COM_COMPROFILER_REGISTER_NEW_ACCOUNT'); ?>
|
||||
</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($showLostPasswordLink) : ?>
|
||||
<div class="cb-login__link">
|
||||
<a href="<?php echo Route::_('index.php?option=com_comprofiler&view=lostpassword'); ?>" class="cb-login__link-item">
|
||||
<span class="icon-question" aria-hidden="true"></span>
|
||||
<?php echo Text::_('COM_COMPROFILER_FORGOT_PASSWORD'); ?>
|
||||
</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><title></title>
|
||||
@@ -1,136 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Community Builder
|
||||
* @subpackage com_comprofiler
|
||||
*
|
||||
* @copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for Community Builder registration view
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
// Get form and fields
|
||||
$form = $this->form ?? null;
|
||||
$tabs = $this->tabs ?? null;
|
||||
?>
|
||||
|
||||
<div class="cb-register-responsive cb-component">
|
||||
<div class="cb-register__header">
|
||||
<h1 class="cb-register__title">
|
||||
<?php echo Text::_('COM_COMPROFILER_REGISTER'); ?>
|
||||
</h1>
|
||||
|
||||
<?php if ($this->introduction ?? null) : ?>
|
||||
<div class="cb-register__intro">
|
||||
<?php echo $this->introduction; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<?php if ($form) : ?>
|
||||
<form action="<?php echo $this->action ?? ''; ?>"
|
||||
method="post"
|
||||
class="cb-register__form"
|
||||
enctype="multipart/form-data"
|
||||
aria-label="<?php echo Text::_('COM_COMPROFILER_REGISTRATION_FORM'); ?>">
|
||||
|
||||
<?php if ($tabs) : ?>
|
||||
<?php foreach ($tabs as $tab) : ?>
|
||||
<?php if (isset($tab->fields) && !empty($tab->fields)) : ?>
|
||||
<fieldset class="cb-register__fieldset">
|
||||
<?php if ($tab->title) : ?>
|
||||
<legend class="cb-register__legend">
|
||||
<?php echo htmlspecialchars($tab->title, ENT_QUOTES, 'UTF-8'); ?>
|
||||
</legend>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($tab->description) : ?>
|
||||
<div class="cb-register__tab-description">
|
||||
<?php echo $tab->description; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="cb-register__fields">
|
||||
<?php foreach ($tab->fields as $field) : ?>
|
||||
<div class="cb-register__field<?php echo $field->required ? ' cb-register__field--required' : ''; ?>">
|
||||
<label for="<?php echo htmlspecialchars($field->name, ENT_QUOTES, 'UTF-8'); ?>"
|
||||
class="cb-register__label">
|
||||
<?php echo htmlspecialchars($field->title, ENT_QUOTES, 'UTF-8'); ?>
|
||||
<?php if ($field->required) : ?>
|
||||
<span class="cb-register__required" aria-label="<?php echo Text::_('COM_COMPROFILER_REQUIRED'); ?>">*</span>
|
||||
<?php endif; ?>
|
||||
</label>
|
||||
|
||||
<?php if ($field->description) : ?>
|
||||
<div class="cb-register__field-description" id="<?php echo htmlspecialchars($field->name, ENT_QUOTES, 'UTF-8'); ?>-desc">
|
||||
<?php echo $field->description; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="cb-register__input-wrapper">
|
||||
<?php echo $field->input; ?>
|
||||
</div>
|
||||
|
||||
<?php if (isset($field->error) && $field->error) : ?>
|
||||
<div class="cb-register__error" role="alert">
|
||||
<?php echo $field->error; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</fieldset>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->showCaptcha ?? false) : ?>
|
||||
<div class="cb-register__captcha">
|
||||
<?php echo $this->captcha; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->showTerms ?? false) : ?>
|
||||
<div class="cb-register__terms">
|
||||
<div class="form-check">
|
||||
<input type="checkbox"
|
||||
id="cb-terms"
|
||||
name="agreedToTerms"
|
||||
class="form-check-input cb-register__terms-checkbox"
|
||||
required
|
||||
aria-required="true"
|
||||
aria-describedby="cb-terms-text">
|
||||
<label for="cb-terms" class="form-check-label cb-register__terms-label" id="cb-terms-text">
|
||||
<?php echo Text::_('COM_COMPROFILER_AGREE_TO_TERMS'); ?>
|
||||
<a href="<?php echo $this->termsUrl ?? ''; ?>" target="_blank" rel="noopener noreferrer">
|
||||
<?php echo Text::_('COM_COMPROFILER_TERMS_CONDITIONS'); ?>
|
||||
</a>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="cb-register__actions">
|
||||
<button type="submit" class="cb-register__btn cb-register__btn--submit btn btn-primary">
|
||||
<span class="icon-check" aria-hidden="true"></span>
|
||||
<?php echo Text::_('COM_COMPROFILER_REGISTER_SUBMIT'); ?>
|
||||
</button>
|
||||
|
||||
<a href="<?php echo $this->loginUrl ?? ''; ?>" class="cb-register__btn cb-register__btn--cancel btn btn-secondary">
|
||||
<span class="icon-cancel" aria-hidden="true"></span>
|
||||
<?php echo Text::_('JCANCEL'); ?>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<?php echo $this->token ?? ''; ?>
|
||||
</form>
|
||||
<?php else : ?>
|
||||
<div class="alert alert-warning" role="alert">
|
||||
<?php echo Text::_('COM_COMPROFILER_REGISTRATION_NOT_AVAILABLE'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><title></title>
|
||||
@@ -1,100 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Community Builder
|
||||
* @subpackage com_comprofiler
|
||||
*
|
||||
* @copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for Community Builder user profile view
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
// Get user object
|
||||
$user = $this->user ?? null;
|
||||
$tabs = $this->tabs ?? null;
|
||||
?>
|
||||
|
||||
<div class="cb-profile-responsive cb-component">
|
||||
<?php if ($user) : ?>
|
||||
<div class="cb-profile__header">
|
||||
<?php if ($user->getField('avatar', null, 'html', 'none', 'profile')) : ?>
|
||||
<div class="cb-profile__avatar">
|
||||
<?php echo $user->getField('avatar', null, 'html', 'none', 'profile'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="cb-profile__header-info">
|
||||
<h1 class="cb-profile__name">
|
||||
<?php echo htmlspecialchars($user->getField('formatname', null, 'html', 'none', 'profile'), ENT_QUOTES, 'UTF-8'); ?>
|
||||
</h1>
|
||||
|
||||
<?php if ($user->getField('onlinestatus', null, 'html', 'none', 'profile')) : ?>
|
||||
<div class="cb-profile__status">
|
||||
<?php echo $user->getField('onlinestatus', null, 'html', 'none', 'profile'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php if ($tabs) : ?>
|
||||
<div class="cb-profile__tabs">
|
||||
<ul class="cb-profile__tabs-nav" role="tablist" aria-label="<?php echo Text::_('COM_COMPROFILER_PROFILE_TABS'); ?>">
|
||||
<?php foreach ($tabs as $tab) : ?>
|
||||
<?php if (isset($tab->fields) && !empty($tab->fields)) : ?>
|
||||
<li class="cb-profile__tab-item" role="presentation">
|
||||
<a href="#<?php echo htmlspecialchars($tab->id, ENT_QUOTES, 'UTF-8'); ?>"
|
||||
class="cb-profile__tab-link"
|
||||
role="tab"
|
||||
aria-controls="<?php echo htmlspecialchars($tab->id, ENT_QUOTES, 'UTF-8'); ?>"
|
||||
aria-selected="false">
|
||||
<?php echo htmlspecialchars($tab->title, ENT_QUOTES, 'UTF-8'); ?>
|
||||
</a>
|
||||
</li>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
|
||||
<div class="cb-profile__tabs-content">
|
||||
<?php foreach ($tabs as $tab) : ?>
|
||||
<?php if (isset($tab->fields) && !empty($tab->fields)) : ?>
|
||||
<div id="<?php echo htmlspecialchars($tab->id, ENT_QUOTES, 'UTF-8'); ?>"
|
||||
class="cb-profile__tab-pane"
|
||||
role="tabpanel"
|
||||
aria-labelledby="<?php echo htmlspecialchars($tab->id, ENT_QUOTES, 'UTF-8'); ?>-tab">
|
||||
|
||||
<?php if ($tab->description) : ?>
|
||||
<div class="cb-profile__tab-description">
|
||||
<?php echo $tab->description; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="cb-profile__fields">
|
||||
<?php foreach ($tab->fields as $field) : ?>
|
||||
<?php if ($field->value) : ?>
|
||||
<div class="cb-profile__field">
|
||||
<div class="cb-profile__field-label">
|
||||
<?php echo htmlspecialchars($field->title, ENT_QUOTES, 'UTF-8'); ?>
|
||||
</div>
|
||||
<div class="cb-profile__field-value">
|
||||
<?php echo $field->value; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php else : ?>
|
||||
<div class="alert alert-warning" role="alert">
|
||||
<?php echo Text::_('COM_COMPROFILER_USER_NOT_FOUND'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><title></title>
|
||||
@@ -1,123 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Community Builder
|
||||
* @subpackage com_comprofiler
|
||||
*
|
||||
* @copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for Community Builder users list view
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Router\Route;
|
||||
|
||||
// Get users list
|
||||
$users = $this->users ?? [];
|
||||
$pagination = $this->pagination ?? null;
|
||||
$search = $this->search ?? '';
|
||||
$listid = $this->listid ?? 0;
|
||||
?>
|
||||
|
||||
<div class="cb-userslist-responsive cb-component">
|
||||
<div class="cb-userslist__header">
|
||||
<h1 class="cb-userslist__title">
|
||||
<?php echo Text::_('COM_COMPROFILER_USERLIST'); ?>
|
||||
</h1>
|
||||
|
||||
<?php if ($this->showSearch ?? true) : ?>
|
||||
<div class="cb-userslist__search">
|
||||
<form action="<?php echo Route::_('index.php?option=com_comprofiler&view=userslist&listid=' . $listid); ?>"
|
||||
method="post"
|
||||
class="cb-userslist__search-form"
|
||||
role="search"
|
||||
aria-label="<?php echo Text::_('COM_COMPROFILER_SEARCH_USERS'); ?>">
|
||||
|
||||
<div class="cb-userslist__search-wrapper">
|
||||
<label for="cb-userslist-search" class="visually-hidden">
|
||||
<?php echo Text::_('COM_COMPROFILER_SEARCH'); ?>
|
||||
</label>
|
||||
<input type="search"
|
||||
id="cb-userslist-search"
|
||||
name="search"
|
||||
class="cb-userslist__search-input"
|
||||
placeholder="<?php echo Text::_('COM_COMPROFILER_SEARCH_USERS'); ?>"
|
||||
value="<?php echo htmlspecialchars($search, ENT_QUOTES, 'UTF-8'); ?>"
|
||||
aria-label="<?php echo Text::_('COM_COMPROFILER_SEARCH'); ?>">
|
||||
|
||||
<button type="submit"
|
||||
class="cb-userslist__search-btn btn btn-primary"
|
||||
aria-label="<?php echo Text::_('COM_COMPROFILER_SEARCH'); ?>">
|
||||
<span class="icon-search" aria-hidden="true"></span>
|
||||
<span class="cb-userslist__search-text"><?php echo Text::_('COM_COMPROFILER_SEARCH'); ?></span>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<?php if (!empty($users)) : ?>
|
||||
<div class="cb-userslist__grid">
|
||||
<?php foreach ($users as $user) : ?>
|
||||
<div class="cb-userslist__user-card">
|
||||
<?php if ($user->getField('avatar', null, 'html', 'none', 'list')) : ?>
|
||||
<div class="cb-userslist__avatar">
|
||||
<a href="<?php echo $user->getField('canvas', null, 'html', 'none', 'profile'); ?>"
|
||||
aria-label="<?php echo Text::sprintf('COM_COMPROFILER_VIEW_PROFILE', htmlspecialchars($user->getField('formatname', null, 'html', 'none', 'list'), ENT_QUOTES, 'UTF-8')); ?>">
|
||||
<?php echo $user->getField('avatar', null, 'html', 'none', 'list'); ?>
|
||||
</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="cb-userslist__user-info">
|
||||
<h3 class="cb-userslist__username">
|
||||
<a href="<?php echo $user->getField('canvas', null, 'html', 'none', 'profile'); ?>">
|
||||
<?php echo htmlspecialchars($user->getField('formatname', null, 'html', 'none', 'list'), ENT_QUOTES, 'UTF-8'); ?>
|
||||
</a>
|
||||
</h3>
|
||||
|
||||
<?php if ($user->getField('onlinestatus', null, 'html', 'none', 'list')) : ?>
|
||||
<div class="cb-userslist__status">
|
||||
<?php echo $user->getField('onlinestatus', null, 'html', 'none', 'list'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (isset($user->fields) && !empty($user->fields)) : ?>
|
||||
<div class="cb-userslist__fields">
|
||||
<?php foreach ($user->fields as $field) : ?>
|
||||
<?php if ($field->value) : ?>
|
||||
<div class="cb-userslist__field">
|
||||
<span class="cb-userslist__field-label"><?php echo htmlspecialchars($field->title, ENT_QUOTES, 'UTF-8'); ?>:</span>
|
||||
<span class="cb-userslist__field-value"><?php echo $field->value; ?></span>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="cb-userslist__actions">
|
||||
<a href="<?php echo $user->getField('canvas', null, 'html', 'none', 'profile'); ?>"
|
||||
class="cb-userslist__btn btn btn-primary btn-sm">
|
||||
<span class="icon-user" aria-hidden="true"></span>
|
||||
<?php echo Text::_('COM_COMPROFILER_VIEW_PROFILE'); ?>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
|
||||
<?php if ($pagination) : ?>
|
||||
<div class="cb-userslist__pagination">
|
||||
<?php echo $pagination->getPagesLinks(); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php else : ?>
|
||||
<div class="alert alert-info" role="alert">
|
||||
<?php echo Text::_('COM_COMPROFILER_NO_USERS_FOUND'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><title></title>
|
||||
@@ -1,141 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Site
|
||||
* @subpackage Templates.MokoCassiopeia
|
||||
*
|
||||
* @copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 3 or later; see LICENSE.txt
|
||||
*
|
||||
* FILE INFORMATION
|
||||
* DEFGROUP: Joomla.Template.Site
|
||||
* INGROUP: MokoCassiopeia
|
||||
* PATH: ./templates/mokocassiopeia/html/com_content/article/toc-left.php
|
||||
* VERSION: 03.06.02
|
||||
* BRIEF: Article layout with table of contents on the left side using Bootstrap TOC
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Language\Associations;
|
||||
use Joomla\CMS\Layout\LayoutHelper;
|
||||
|
||||
// Load Bootstrap TOC assets
|
||||
$wa = Factory::getApplication()->getDocument()->getWebAssetManager();
|
||||
$wa->useStyle('vendor.bootstrap-toc');
|
||||
$wa->useScript('vendor.bootstrap-toc.js');
|
||||
|
||||
// Get article params
|
||||
$params = $this->item->params;
|
||||
$images = json_decode($this->item->images);
|
||||
$urls = json_decode($this->item->urls);
|
||||
$canEdit = $params->get('access-edit');
|
||||
$info = $params->get('info_block_position', 0);
|
||||
|
||||
// Check if associations are implemented
|
||||
$assocParam = (Associations::isEnabled() && $params->get('show_associations'));
|
||||
?>
|
||||
|
||||
<div class="com-content-article item-page<?php echo $this->pageclass_sfx; ?>">
|
||||
<div class="row">
|
||||
<!-- Table of Contents - Left Side -->
|
||||
<div class="col-lg-3 col-md-4 order-md-1 mb-4">
|
||||
<div class="sticky-top toc-wrapper" style="top: 20px;">
|
||||
<nav id="toc" data-toggle="toc" class="toc-container">
|
||||
<h5 class="toc-title"><?php echo HTMLHelper::_('string.truncate', $this->item->title, 50); ?></h5>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Article Content -->
|
||||
<div class="col-lg-9 col-md-8 order-md-2" data-toc-scope>
|
||||
<meta itemprop="inLanguage" content="<?php echo ($this->item->language === '*') ? Factory::getApplication()->get('language') : $this->item->language; ?>" />
|
||||
|
||||
<?php if ($this->params->get('show_page_heading')) : ?>
|
||||
<div class="page-header">
|
||||
<h1><?php echo $this->escape($this->params->get('page_heading')); ?></h1>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!$this->print) : ?>
|
||||
<?php if ($canEdit || $params->get('show_print_icon') || $params->get('show_email_icon')) : ?>
|
||||
<?php echo LayoutHelper::render('joomla.content.icons', ['params' => $params, 'item' => $this->item, 'print' => false]); ?>
|
||||
<?php endif; ?>
|
||||
<?php else : ?>
|
||||
<?php if ($params->get('show_print_icon')) : ?>
|
||||
<?php echo LayoutHelper::render('joomla.content.icons', ['params' => $params, 'item' => $this->item, 'print' => true]); ?>
|
||||
<?php endif; ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php echo $this->item->event->afterDisplayTitle; ?>
|
||||
|
||||
<?php if ($params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
|
||||
<?php echo LayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php echo $this->item->event->beforeDisplayContent; ?>
|
||||
|
||||
<?php if (isset($urls) && ((!empty($urls->urls_position) && $urls->urls_position == '0') || ($params->get('urls_position') == '0' && empty($urls->urls_position))) || (empty($urls->urls_position) && (!$params->get('urls_position')))) : ?>
|
||||
<?php echo $this->loadTemplate('links'); ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('access-view')) : ?>
|
||||
<?php echo LayoutHelper::render('joomla.content.full_image', $this->item); ?>
|
||||
|
||||
<?php if (isset($info) && $info == 0 && $params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
|
||||
<?php echo LayoutHelper::render('joomla.content.info_block', ['item' => $this->item, 'params' => $params, 'position' => 'above']); ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($info == 0 && $params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
|
||||
<?php echo LayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="article-content" itemprop="articleBody">
|
||||
<?php echo $this->item->text; ?>
|
||||
</div>
|
||||
|
||||
<?php if (isset($urls) && ((!empty($urls->urls_position) && $urls->urls_position == '1') || ($params->get('urls_position') == '1'))) : ?>
|
||||
<?php echo $this->loadTemplate('links'); ?>
|
||||
<?php endif; ?>
|
||||
<?php elseif ($params->get('show_noauth') == true && $this->user->get('guest')) : ?>
|
||||
<?php echo LayoutHelper::render('joomla.content.intro_image', $this->item); ?>
|
||||
<?php echo HTMLHelper::_('content.prepare', $this->item->introtext); ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php echo $this->item->event->afterDisplayContent; ?>
|
||||
|
||||
<?php if (isset($info) && ($info == 1 || $info == 2)) : ?>
|
||||
<?php if ($params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
|
||||
<?php echo LayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?>
|
||||
<?php endif; ?>
|
||||
<?php echo LayoutHelper::render('joomla.content.info_block', ['item' => $this->item, 'params' => $params, 'position' => 'below']); ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.toc-container {
|
||||
background: var(--cassiopeia-color-bg, #fff);
|
||||
border: 1px solid var(--cassiopeia-color-border, #dee2e6);
|
||||
border-radius: 0.375rem;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.toc-title {
|
||||
margin-bottom: 0.75rem;
|
||||
font-size: 1rem;
|
||||
font-weight: 600;
|
||||
color: var(--cassiopeia-color-text, #212529);
|
||||
border-bottom: 1px solid var(--cassiopeia-color-border, #dee2e6);
|
||||
padding-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
@media (max-width: 767.98px) {
|
||||
.toc-wrapper {
|
||||
position: static !important;
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,141 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Site
|
||||
* @subpackage Templates.MokoCassiopeia
|
||||
*
|
||||
* @copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 3 or later; see LICENSE.txt
|
||||
*
|
||||
* FILE INFORMATION
|
||||
* DEFGROUP: Joomla.Template.Site
|
||||
* INGROUP: MokoCassiopeia
|
||||
* PATH: ./templates/mokocassiopeia/html/com_content/article/toc-right.php
|
||||
* VERSION: 03.06.02
|
||||
* BRIEF: Article layout with table of contents on the right side using Bootstrap TOC
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Language\Associations;
|
||||
use Joomla\CMS\Layout\LayoutHelper;
|
||||
|
||||
// Load Bootstrap TOC assets
|
||||
$wa = Factory::getApplication()->getDocument()->getWebAssetManager();
|
||||
$wa->useStyle('vendor.bootstrap-toc');
|
||||
$wa->useScript('vendor.bootstrap-toc.js');
|
||||
|
||||
// Get article params
|
||||
$params = $this->item->params;
|
||||
$images = json_decode($this->item->images);
|
||||
$urls = json_decode($this->item->urls);
|
||||
$canEdit = $params->get('access-edit');
|
||||
$info = $params->get('info_block_position', 0);
|
||||
|
||||
// Check if associations are implemented
|
||||
$assocParam = (Associations::isEnabled() && $params->get('show_associations'));
|
||||
?>
|
||||
|
||||
<div class="com-content-article item-page<?php echo $this->pageclass_sfx; ?>">
|
||||
<div class="row">
|
||||
<!-- Article Content -->
|
||||
<div class="col-lg-9 col-md-8 order-md-1" data-toc-scope>
|
||||
<meta itemprop="inLanguage" content="<?php echo ($this->item->language === '*') ? Factory::getApplication()->get('language') : $this->item->language; ?>" />
|
||||
|
||||
<?php if ($this->params->get('show_page_heading')) : ?>
|
||||
<div class="page-header">
|
||||
<h1><?php echo $this->escape($this->params->get('page_heading')); ?></h1>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!$this->print) : ?>
|
||||
<?php if ($canEdit || $params->get('show_print_icon') || $params->get('show_email_icon')) : ?>
|
||||
<?php echo LayoutHelper::render('joomla.content.icons', ['params' => $params, 'item' => $this->item, 'print' => false]); ?>
|
||||
<?php endif; ?>
|
||||
<?php else : ?>
|
||||
<?php if ($params->get('show_print_icon')) : ?>
|
||||
<?php echo LayoutHelper::render('joomla.content.icons', ['params' => $params, 'item' => $this->item, 'print' => true]); ?>
|
||||
<?php endif; ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php echo $this->item->event->afterDisplayTitle; ?>
|
||||
|
||||
<?php if ($params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
|
||||
<?php echo LayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php echo $this->item->event->beforeDisplayContent; ?>
|
||||
|
||||
<?php if (isset($urls) && ((!empty($urls->urls_position) && $urls->urls_position == '0') || ($params->get('urls_position') == '0' && empty($urls->urls_position))) || (empty($urls->urls_position) && (!$params->get('urls_position')))) : ?>
|
||||
<?php echo $this->loadTemplate('links'); ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('access-view')) : ?>
|
||||
<?php echo LayoutHelper::render('joomla.content.full_image', $this->item); ?>
|
||||
|
||||
<?php if (isset($info) && $info == 0 && $params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
|
||||
<?php echo LayoutHelper::render('joomla.content.info_block', ['item' => $this->item, 'params' => $params, 'position' => 'above']); ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($info == 0 && $params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
|
||||
<?php echo LayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="article-content" itemprop="articleBody">
|
||||
<?php echo $this->item->text; ?>
|
||||
</div>
|
||||
|
||||
<?php if (isset($urls) && ((!empty($urls->urls_position) && $urls->urls_position == '1') || ($params->get('urls_position') == '1'))) : ?>
|
||||
<?php echo $this->loadTemplate('links'); ?>
|
||||
<?php endif; ?>
|
||||
<?php elseif ($params->get('show_noauth') == true && $this->user->get('guest')) : ?>
|
||||
<?php echo LayoutHelper::render('joomla.content.intro_image', $this->item); ?>
|
||||
<?php echo HTMLHelper::_('content.prepare', $this->item->introtext); ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php echo $this->item->event->afterDisplayContent; ?>
|
||||
|
||||
<?php if (isset($info) && ($info == 1 || $info == 2)) : ?>
|
||||
<?php if ($params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
|
||||
<?php echo LayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?>
|
||||
<?php endif; ?>
|
||||
<?php echo LayoutHelper::render('joomla.content.info_block', ['item' => $this->item, 'params' => $params, 'position' => 'below']); ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<!-- Table of Contents - Right Side -->
|
||||
<div class="col-lg-3 col-md-4 order-md-2 mb-4">
|
||||
<div class="sticky-top toc-wrapper" style="top: 20px;">
|
||||
<nav id="toc" data-toggle="toc" class="toc-container">
|
||||
<h5 class="toc-title"><?php echo HTMLHelper::_('string.truncate', $this->item->title, 50); ?></h5>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.toc-container {
|
||||
background: var(--cassiopeia-color-bg, #fff);
|
||||
border: 1px solid var(--cassiopeia-color-border, #dee2e6);
|
||||
border-radius: 0.375rem;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.toc-title {
|
||||
margin-bottom: 0.75rem;
|
||||
font-size: 1rem;
|
||||
font-weight: 600;
|
||||
color: var(--cassiopeia-color-text, #212529);
|
||||
border-bottom: 1px solid var(--cassiopeia-color-border, #dee2e6);
|
||||
padding-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
@media (max-width: 767.98px) {
|
||||
.toc-wrapper {
|
||||
position: static !important;
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><title></title>
|
||||
@@ -1,167 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package JEM
|
||||
* @subpackage com_jem
|
||||
*
|
||||
* @copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for JEM calendar view
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Router\Route;
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
|
||||
$events = $this->rows ?? [];
|
||||
$date = $this->date ?? null;
|
||||
$year = $this->year ?? date('Y');
|
||||
$month = $this->month ?? date('m');
|
||||
?>
|
||||
|
||||
<div class="jem-calendar-responsive jem-component">
|
||||
<div class="jem-calendar__container">
|
||||
|
||||
<!-- Calendar Header -->
|
||||
<div class="jem-calendar__header">
|
||||
<h1 class="jem-calendar__title">
|
||||
<?php echo Text::_('COM_JEM_CALENDAR'); ?>
|
||||
</h1>
|
||||
</div>
|
||||
|
||||
<!-- Calendar Navigation -->
|
||||
<div class="jem-calendar__navigation">
|
||||
<a href="<?php echo Route::_('index.php?option=com_jem&view=calendar&year=' . ($month == 1 ? $year - 1 : $year) . '&month=' . ($month == 1 ? 12 : $month - 1)); ?>"
|
||||
class="jem-calendar__nav-button jem-calendar__nav-prev"
|
||||
aria-label="<?php echo Text::_('COM_JEM_PREVIOUS_MONTH'); ?>">
|
||||
<span aria-hidden="true">‹</span>
|
||||
</a>
|
||||
|
||||
<h2 class="jem-calendar__current-month">
|
||||
<?php echo HTMLHelper::_('date', $year . '-' . $month . '-01', 'F Y'); ?>
|
||||
</h2>
|
||||
|
||||
<a href="<?php echo Route::_('index.php?option=com_jem&view=calendar&year=' . ($month == 12 ? $year + 1 : $year) . '&month=' . ($month == 12 ? 1 : $month + 1)); ?>"
|
||||
class="jem-calendar__nav-button jem-calendar__nav-next"
|
||||
aria-label="<?php echo Text::_('COM_JEM_NEXT_MONTH'); ?>">
|
||||
<span aria-hidden="true">›</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- Calendar Grid -->
|
||||
<div class="jem-calendar__grid">
|
||||
<!-- Weekday Headers -->
|
||||
<div class="jem-calendar__weekdays">
|
||||
<?php
|
||||
$weekDays = [
|
||||
Text::_('SUN'),
|
||||
Text::_('MON'),
|
||||
Text::_('TUE'),
|
||||
Text::_('WED'),
|
||||
Text::_('THU'),
|
||||
Text::_('FRI'),
|
||||
Text::_('SAT')
|
||||
];
|
||||
foreach ($weekDays as $day) : ?>
|
||||
<div class="jem-calendar__weekday">
|
||||
<?php echo $day; ?>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
|
||||
<!-- Calendar Days -->
|
||||
<div class="jem-calendar__days">
|
||||
<?php
|
||||
// Generate calendar days
|
||||
$firstDay = mktime(0, 0, 0, $month, 1, $year);
|
||||
$daysInMonth = date('t', $firstDay);
|
||||
$dayOfWeek = date('w', $firstDay);
|
||||
|
||||
// Empty cells before first day
|
||||
for ($i = 0; $i < $dayOfWeek; $i++) : ?>
|
||||
<div class="jem-calendar__day jem-calendar__day--empty"></div>
|
||||
<?php endfor;
|
||||
|
||||
// Days with events
|
||||
for ($day = 1; $day <= $daysInMonth; $day++) :
|
||||
$currentDate = sprintf('%04d-%02d-%02d', $year, $month, $day);
|
||||
$hasEvents = false;
|
||||
$dayEvents = [];
|
||||
|
||||
// Check for events on this day
|
||||
if (!empty($events)) {
|
||||
foreach ($events as $event) {
|
||||
if (!empty($event->dates) && date('Y-m-d', strtotime($event->dates)) == $currentDate) {
|
||||
$hasEvents = true;
|
||||
$dayEvents[] = $event;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$isToday = ($currentDate == date('Y-m-d'));
|
||||
$classes = 'jem-calendar__day';
|
||||
if ($hasEvents) {
|
||||
$classes .= ' jem-calendar__day--has-events';
|
||||
}
|
||||
if ($isToday) {
|
||||
$classes .= ' jem-calendar__day--today';
|
||||
}
|
||||
?>
|
||||
<div class="<?php echo $classes; ?>" data-date="<?php echo $currentDate; ?>">
|
||||
<div class="jem-calendar__day-number">
|
||||
<?php echo $day; ?>
|
||||
</div>
|
||||
<?php if ($hasEvents) : ?>
|
||||
<div class="jem-calendar__day-events">
|
||||
<span class="jem-calendar__event-indicator"
|
||||
aria-label="<?php echo Text::sprintf('COM_JEM_EVENTS_COUNT', count($dayEvents)); ?>">
|
||||
<?php echo count($dayEvents); ?>
|
||||
</span>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endfor; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Events List for Selected/Current Day -->
|
||||
<?php if (!empty($events)) : ?>
|
||||
<div class="jem-calendar__events-list">
|
||||
<h3 class="jem-calendar__events-title">
|
||||
<?php echo Text::_('COM_JEM_UPCOMING_EVENTS'); ?>
|
||||
</h3>
|
||||
<div class="jem-calendar__events">
|
||||
<?php foreach ($events as $event) : ?>
|
||||
<div class="jem-calendar__event-item">
|
||||
<div class="jem-calendar__event-date">
|
||||
<?php if (!empty($event->dates)) : ?>
|
||||
<time datetime="<?php echo $this->escape($event->dates); ?>">
|
||||
<?php echo HTMLHelper::_('date', $event->dates, Text::_('DATE_FORMAT_LC4')); ?>
|
||||
</time>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<h4 class="jem-calendar__event-title">
|
||||
<?php if (!empty($event->slug)) : ?>
|
||||
<a href="<?php echo Route::_('index.php?option=com_jem&view=event&id=' . $event->slug); ?>"
|
||||
class="jem-calendar__event-link">
|
||||
<?php echo $this->escape($event->title); ?>
|
||||
</a>
|
||||
<?php else : ?>
|
||||
<?php echo $this->escape($event->title); ?>
|
||||
<?php endif; ?>
|
||||
</h4>
|
||||
<?php if (!empty($event->venue)) : ?>
|
||||
<div class="jem-calendar__event-venue">
|
||||
📍 <?php echo $this->escape($event->venue); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><title></title>
|
||||
@@ -1,111 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package JEM
|
||||
* @subpackage com_jem
|
||||
*
|
||||
* @copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for JEM categories view
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Router\Route;
|
||||
|
||||
$categories = $this->categories ?? [];
|
||||
?>
|
||||
|
||||
<div class="jem-categories-responsive jem-component">
|
||||
<div class="jem-categories__container">
|
||||
|
||||
<!-- Categories Header -->
|
||||
<div class="jem-categories__header">
|
||||
<h1 class="jem-categories__title">
|
||||
<?php echo Text::_('COM_JEM_CATEGORIES'); ?>
|
||||
</h1>
|
||||
</div>
|
||||
|
||||
<?php if (!empty($categories)) : ?>
|
||||
<div class="jem-categories__list">
|
||||
<?php foreach ($categories as $category) : ?>
|
||||
<div class="jem-categories__item">
|
||||
<div class="jem-categories__item-inner">
|
||||
|
||||
<!-- Category Image -->
|
||||
<?php if (!empty($category->image)) : ?>
|
||||
<div class="jem-categories__image-wrapper">
|
||||
<img src="<?php echo $this->escape($category->image); ?>"
|
||||
alt="<?php echo $this->escape($category->catname); ?>"
|
||||
class="jem-categories__image"
|
||||
loading="lazy">
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Category Content -->
|
||||
<div class="jem-categories__content">
|
||||
|
||||
<!-- Category Title -->
|
||||
<h2 class="jem-categories__category-title">
|
||||
<?php if (!empty($category->slug)) : ?>
|
||||
<a href="<?php echo Route::_('index.php?option=com_jem&view=category&id=' . $category->slug); ?>"
|
||||
class="jem-categories__link">
|
||||
<?php echo $this->escape($category->catname); ?>
|
||||
</a>
|
||||
<?php else : ?>
|
||||
<?php echo $this->escape($category->catname); ?>
|
||||
<?php endif; ?>
|
||||
</h2>
|
||||
|
||||
<!-- Category Description -->
|
||||
<?php if (!empty($category->catdescription)) : ?>
|
||||
<div class="jem-categories__description">
|
||||
<?php echo $category->catdescription; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Event Count -->
|
||||
<?php if (isset($category->eventcount)) : ?>
|
||||
<div class="jem-categories__meta">
|
||||
<span class="jem-categories__event-count">
|
||||
<?php echo Text::sprintf('COM_JEM_EVENTS_COUNT_FULL', (int) $category->eventcount); ?>
|
||||
</span>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- View Category Button -->
|
||||
<?php if (!empty($category->slug)) : ?>
|
||||
<div class="jem-categories__actions">
|
||||
<a href="<?php echo Route::_('index.php?option=com_jem&view=category&id=' . $category->slug); ?>"
|
||||
class="jem-categories__button btn btn-primary"
|
||||
aria-label="<?php echo Text::sprintf('COM_JEM_VIEW_CATEGORY', $this->escape($category->catname)); ?>">
|
||||
<?php echo Text::_('COM_JEM_VIEW_CATEGORY'); ?>
|
||||
</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
|
||||
<!-- Pagination -->
|
||||
<?php if (!empty($this->pagination)) : ?>
|
||||
<div class="jem-categories__pagination">
|
||||
<?php echo $this->pagination->getPagesLinks(); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php else : ?>
|
||||
<div class="jem-categories__empty">
|
||||
<p class="jem-categories__empty-message">
|
||||
<?php echo Text::_('COM_JEM_NO_CATEGORIES'); ?>
|
||||
</p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><title></title>
|
||||
@@ -1,212 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package JEM
|
||||
* @subpackage com_jem
|
||||
*
|
||||
* @copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for JEM event details view
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Router\Route;
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
|
||||
$item = $this->item ?? null;
|
||||
$params = $this->params ?? null;
|
||||
|
||||
if (!$item) {
|
||||
return;
|
||||
}
|
||||
?>
|
||||
|
||||
<div class="jem-event-responsive jem-component">
|
||||
<div class="jem-event__container">
|
||||
|
||||
<!-- Event Header -->
|
||||
<div class="jem-event__header">
|
||||
<h1 class="jem-event__title">
|
||||
<?php echo $this->escape($item->title); ?>
|
||||
</h1>
|
||||
</div>
|
||||
|
||||
<!-- Event Image -->
|
||||
<?php if (!empty($item->datimage)) : ?>
|
||||
<div class="jem-event__image-wrapper">
|
||||
<img src="<?php echo $this->escape($item->datimage); ?>"
|
||||
alt="<?php echo $this->escape($item->title); ?>"
|
||||
class="jem-event__image"
|
||||
loading="lazy">
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Event Meta Information -->
|
||||
<div class="jem-event__meta">
|
||||
|
||||
<!-- Date and Time -->
|
||||
<div class="jem-event__meta-item jem-event__date">
|
||||
<span class="jem-event__meta-icon" aria-hidden="true">📅</span>
|
||||
<div class="jem-event__meta-content">
|
||||
<strong class="jem-event__meta-label">
|
||||
<?php echo Text::_('COM_JEM_DATE'); ?>:
|
||||
</strong>
|
||||
<?php if (!empty($item->dates)) : ?>
|
||||
<time datetime="<?php echo $this->escape($item->dates); ?>"
|
||||
class="jem-event__datetime">
|
||||
<?php echo HTMLHelper::_('date', $item->dates, Text::_('DATE_FORMAT_LC3')); ?>
|
||||
</time>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($item->enddates) && $item->enddates != $item->dates) : ?>
|
||||
<span class="jem-event__date-separator"> - </span>
|
||||
<time datetime="<?php echo $this->escape($item->enddates); ?>"
|
||||
class="jem-event__datetime">
|
||||
<?php echo HTMLHelper::_('date', $item->enddates, Text::_('DATE_FORMAT_LC3')); ?>
|
||||
</time>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Time -->
|
||||
<?php if (!empty($item->times)) : ?>
|
||||
<div class="jem-event__meta-item jem-event__time">
|
||||
<span class="jem-event__meta-icon" aria-hidden="true">🕐</span>
|
||||
<div class="jem-event__meta-content">
|
||||
<strong class="jem-event__meta-label">
|
||||
<?php echo Text::_('COM_JEM_TIME'); ?>:
|
||||
</strong>
|
||||
<span class="jem-event__time-value">
|
||||
<?php echo $this->escape($item->times); ?>
|
||||
<?php if (!empty($item->endtimes)) : ?>
|
||||
- <?php echo $this->escape($item->endtimes); ?>
|
||||
<?php endif; ?>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Venue -->
|
||||
<?php if (!empty($item->venue)) : ?>
|
||||
<div class="jem-event__meta-item jem-event__venue">
|
||||
<span class="jem-event__meta-icon" aria-hidden="true">📍</span>
|
||||
<div class="jem-event__meta-content">
|
||||
<strong class="jem-event__meta-label">
|
||||
<?php echo Text::_('COM_JEM_VENUE'); ?>:
|
||||
</strong>
|
||||
<?php if (!empty($item->venueslug)) : ?>
|
||||
<a href="<?php echo Route::_('index.php?option=com_jem&view=venue&id=' . $item->venueslug); ?>"
|
||||
class="jem-event__venue-link">
|
||||
<?php echo $this->escape($item->venue); ?>
|
||||
</a>
|
||||
<?php else : ?>
|
||||
<span class="jem-event__venue-name">
|
||||
<?php echo $this->escape($item->venue); ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($item->street) || !empty($item->city)) : ?>
|
||||
<div class="jem-event__address">
|
||||
<?php if (!empty($item->street)) : ?>
|
||||
<span class="jem-event__street">
|
||||
<?php echo $this->escape($item->street); ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
<?php if (!empty($item->city)) : ?>
|
||||
<span class="jem-event__city">
|
||||
<?php echo $this->escape($item->city); ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Categories -->
|
||||
<?php if (!empty($item->categories)) : ?>
|
||||
<div class="jem-event__meta-item jem-event__categories">
|
||||
<span class="jem-event__meta-icon" aria-hidden="true">🏷️</span>
|
||||
<div class="jem-event__meta-content">
|
||||
<strong class="jem-event__meta-label">
|
||||
<?php echo Text::_('COM_JEM_CATEGORIES'); ?>:
|
||||
</strong>
|
||||
<div class="jem-event__category-list">
|
||||
<?php foreach ($item->categories as $category) : ?>
|
||||
<span class="jem-event__category-badge">
|
||||
<?php echo $this->escape($category->catname); ?>
|
||||
</span>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Event Description -->
|
||||
<?php if (!empty($item->fulltext)) : ?>
|
||||
<div class="jem-event__description">
|
||||
<h2 class="jem-event__description-title">
|
||||
<?php echo Text::_('COM_JEM_DESCRIPTION'); ?>
|
||||
</h2>
|
||||
<div class="jem-event__description-content">
|
||||
<?php echo $item->fulltext; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Event Registration -->
|
||||
<?php if (!empty($item->registra) && $item->registra == 1) : ?>
|
||||
<div class="jem-event__registration">
|
||||
<h2 class="jem-event__registration-title">
|
||||
<?php echo Text::_('COM_JEM_REGISTRATION'); ?>
|
||||
</h2>
|
||||
<?php if (!empty($item->maxplaces)) : ?>
|
||||
<p class="jem-event__capacity">
|
||||
<strong><?php echo Text::_('COM_JEM_MAX_PLACES'); ?>:</strong>
|
||||
<?php echo (int) $item->maxplaces; ?>
|
||||
</p>
|
||||
<?php endif; ?>
|
||||
<?php if (!empty($item->waitinglist)) : ?>
|
||||
<p class="jem-event__waitinglist">
|
||||
<?php echo Text::_('COM_JEM_WAITING_LIST_ENABLED'); ?>
|
||||
</p>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Event Contact -->
|
||||
<?php if (!empty($item->contactname)) : ?>
|
||||
<div class="jem-event__contact">
|
||||
<h2 class="jem-event__contact-title">
|
||||
<?php echo Text::_('COM_JEM_CONTACT'); ?>
|
||||
</h2>
|
||||
<p class="jem-event__contact-info">
|
||||
<strong><?php echo Text::_('COM_JEM_NAME'); ?>:</strong>
|
||||
<?php echo $this->escape($item->contactname); ?>
|
||||
</p>
|
||||
<?php if (!empty($item->contactemail)) : ?>
|
||||
<p class="jem-event__contact-info">
|
||||
<strong><?php echo Text::_('COM_JEM_EMAIL'); ?>:</strong>
|
||||
<a href="mailto:<?php echo $this->escape($item->contactemail); ?>"
|
||||
class="jem-event__contact-link">
|
||||
<?php echo $this->escape($item->contactemail); ?>
|
||||
</a>
|
||||
</p>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Back Button -->
|
||||
<div class="jem-event__actions">
|
||||
<a href="<?php echo Route::_('index.php?option=com_jem&view=eventslist'); ?>"
|
||||
class="jem-event__button btn btn-secondary">
|
||||
<?php echo Text::_('COM_JEM_BACK_TO_EVENTS'); ?>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><title></title>
|
||||
@@ -1,147 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package JEM
|
||||
* @subpackage com_jem
|
||||
*
|
||||
* @copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for JEM events list view
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Router\Route;
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
|
||||
// Load JEM helper if available
|
||||
if (file_exists(JPATH_SITE . '/components/com_jem/helpers/helper.php')) {
|
||||
require_once JPATH_SITE . '/components/com_jem/helpers/helper.php';
|
||||
}
|
||||
|
||||
$items = $this->items ?? [];
|
||||
$params = $this->params ?? null;
|
||||
?>
|
||||
|
||||
<div class="jem-eventslist-responsive jem-component">
|
||||
<div class="jem-eventslist__container">
|
||||
|
||||
<?php if (!empty($this->pageheading)) : ?>
|
||||
<div class="jem-eventslist__header">
|
||||
<h1 class="jem-eventslist__title">
|
||||
<?php echo $this->escape($this->pageheading); ?>
|
||||
</h1>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($items)) : ?>
|
||||
<div class="jem-eventslist__list">
|
||||
<?php foreach ($items as $item) : ?>
|
||||
<div class="jem-eventslist__item">
|
||||
<div class="jem-eventslist__item-inner">
|
||||
|
||||
<!-- Event Date -->
|
||||
<div class="jem-eventslist__date">
|
||||
<?php if (!empty($item->dates)) : ?>
|
||||
<time datetime="<?php echo $this->escape($item->dates); ?>"
|
||||
class="jem-eventslist__datetime">
|
||||
<?php echo HTMLHelper::_('date', $item->dates, Text::_('DATE_FORMAT_LC4')); ?>
|
||||
</time>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($item->enddates) && $item->enddates != $item->dates) : ?>
|
||||
<span class="jem-eventslist__date-separator"> - </span>
|
||||
<time datetime="<?php echo $this->escape($item->enddates); ?>"
|
||||
class="jem-eventslist__datetime">
|
||||
<?php echo HTMLHelper::_('date', $item->enddates, Text::_('DATE_FORMAT_LC4')); ?>
|
||||
</time>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<!-- Event Title -->
|
||||
<h2 class="jem-eventslist__event-title">
|
||||
<?php if (!empty($item->slug)) : ?>
|
||||
<a href="<?php echo Route::_('index.php?option=com_jem&view=event&id=' . $item->slug); ?>"
|
||||
class="jem-eventslist__link">
|
||||
<?php echo $this->escape($item->title); ?>
|
||||
</a>
|
||||
<?php else : ?>
|
||||
<?php echo $this->escape($item->title); ?>
|
||||
<?php endif; ?>
|
||||
</h2>
|
||||
|
||||
<!-- Event Venue -->
|
||||
<?php if (!empty($item->venue)) : ?>
|
||||
<div class="jem-eventslist__venue">
|
||||
<span class="jem-eventslist__venue-icon" aria-hidden="true">📍</span>
|
||||
<?php if (!empty($item->venueslug)) : ?>
|
||||
<a href="<?php echo Route::_('index.php?option=com_jem&view=venue&id=' . $item->venueslug); ?>"
|
||||
class="jem-eventslist__venue-link">
|
||||
<?php echo $this->escape($item->venue); ?>
|
||||
</a>
|
||||
<?php else : ?>
|
||||
<span class="jem-eventslist__venue-name">
|
||||
<?php echo $this->escape($item->venue); ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($item->city)) : ?>
|
||||
<span class="jem-eventslist__city">
|
||||
, <?php echo $this->escape($item->city); ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Event Description -->
|
||||
<?php if (!empty($item->introtext)) : ?>
|
||||
<div class="jem-eventslist__description">
|
||||
<?php echo $item->introtext; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Event Categories -->
|
||||
<?php if (!empty($item->categories)) : ?>
|
||||
<div class="jem-eventslist__categories">
|
||||
<?php foreach ($item->categories as $category) : ?>
|
||||
<span class="jem-eventslist__category-badge">
|
||||
<?php echo $this->escape($category->catname); ?>
|
||||
</span>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Read More Button -->
|
||||
<?php if (!empty($item->slug)) : ?>
|
||||
<div class="jem-eventslist__actions">
|
||||
<a href="<?php echo Route::_('index.php?option=com_jem&view=event&id=' . $item->slug); ?>"
|
||||
class="jem-eventslist__button btn btn-primary"
|
||||
aria-label="<?php echo Text::sprintf('COM_JEM_READ_MORE_ABOUT', $this->escape($item->title)); ?>">
|
||||
<?php echo Text::_('COM_JEM_READ_MORE'); ?>
|
||||
</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
|
||||
<!-- Pagination -->
|
||||
<?php if (!empty($this->pagination)) : ?>
|
||||
<div class="jem-eventslist__pagination">
|
||||
<?php echo $this->pagination->getPagesLinks(); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php else : ?>
|
||||
<div class="jem-eventslist__empty">
|
||||
<p class="jem-eventslist__empty-message">
|
||||
<?php echo Text::_('COM_JEM_NO_EVENTS'); ?>
|
||||
</p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><title></title>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><title></title>
|
||||
@@ -1,188 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package JEM
|
||||
* @subpackage com_jem
|
||||
*
|
||||
* @copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for JEM venue view
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Router\Route;
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
|
||||
$venue = $this->venue ?? null;
|
||||
$events = $this->rows ?? [];
|
||||
|
||||
if (!$venue) {
|
||||
return;
|
||||
}
|
||||
?>
|
||||
|
||||
<div class="jem-venue-responsive jem-component">
|
||||
<div class="jem-venue__container">
|
||||
|
||||
<!-- Venue Header -->
|
||||
<div class="jem-venue__header">
|
||||
<h1 class="jem-venue__title">
|
||||
<?php echo $this->escape($venue->venue); ?>
|
||||
</h1>
|
||||
</div>
|
||||
|
||||
<!-- Venue Image -->
|
||||
<?php if (!empty($venue->locimage)) : ?>
|
||||
<div class="jem-venue__image-wrapper">
|
||||
<img src="<?php echo $this->escape($venue->locimage); ?>"
|
||||
alt="<?php echo $this->escape($venue->venue); ?>"
|
||||
class="jem-venue__image"
|
||||
loading="lazy">
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Venue Information -->
|
||||
<div class="jem-venue__info">
|
||||
|
||||
<!-- Address -->
|
||||
<?php if (!empty($venue->street) || !empty($venue->city) || !empty($venue->postalCode)) : ?>
|
||||
<div class="jem-venue__info-item jem-venue__address">
|
||||
<span class="jem-venue__info-icon" aria-hidden="true">📍</span>
|
||||
<div class="jem-venue__info-content">
|
||||
<strong class="jem-venue__info-label">
|
||||
<?php echo Text::_('COM_JEM_ADDRESS'); ?>:
|
||||
</strong>
|
||||
<address class="jem-venue__address-content">
|
||||
<?php if (!empty($venue->street)) : ?>
|
||||
<div class="jem-venue__street">
|
||||
<?php echo $this->escape($venue->street); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if (!empty($venue->postalCode) || !empty($venue->city)) : ?>
|
||||
<div class="jem-venue__city-line">
|
||||
<?php if (!empty($venue->postalCode)) : ?>
|
||||
<span class="jem-venue__postal">
|
||||
<?php echo $this->escape($venue->postalCode); ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
<?php if (!empty($venue->city)) : ?>
|
||||
<span class="jem-venue__city">
|
||||
<?php echo $this->escape($venue->city); ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if (!empty($venue->state)) : ?>
|
||||
<div class="jem-venue__state">
|
||||
<?php echo $this->escape($venue->state); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if (!empty($venue->country)) : ?>
|
||||
<div class="jem-venue__country">
|
||||
<?php echo $this->escape($venue->country); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</address>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Website -->
|
||||
<?php if (!empty($venue->url)) : ?>
|
||||
<div class="jem-venue__info-item jem-venue__website">
|
||||
<span class="jem-venue__info-icon" aria-hidden="true">🌐</span>
|
||||
<div class="jem-venue__info-content">
|
||||
<strong class="jem-venue__info-label">
|
||||
<?php echo Text::_('COM_JEM_WEBSITE'); ?>:
|
||||
</strong>
|
||||
<a href="<?php echo $this->escape($venue->url); ?>"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="jem-venue__link">
|
||||
<?php echo $this->escape($venue->url); ?>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Description -->
|
||||
<?php if (!empty($venue->locdescription)) : ?>
|
||||
<div class="jem-venue__description">
|
||||
<h2 class="jem-venue__description-title">
|
||||
<?php echo Text::_('COM_JEM_DESCRIPTION'); ?>
|
||||
</h2>
|
||||
<div class="jem-venue__description-content">
|
||||
<?php echo $venue->locdescription; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Map -->
|
||||
<?php if (!empty($venue->latitude) && !empty($venue->longitude)) : ?>
|
||||
<div class="jem-venue__map">
|
||||
<h2 class="jem-venue__map-title">
|
||||
<?php echo Text::_('COM_JEM_LOCATION'); ?>
|
||||
</h2>
|
||||
<div class="jem-venue__map-container">
|
||||
<!-- Map would be rendered here by JEM's map functionality -->
|
||||
<div class="jem-venue__map-placeholder">
|
||||
<p><?php echo Text::_('COM_JEM_MAP_VIEW'); ?></p>
|
||||
<p>
|
||||
<a href="https://www.google.com/maps?q=<?php echo $venue->latitude; ?>,<?php echo $venue->longitude; ?>"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="jem-venue__map-link btn btn-primary">
|
||||
<?php echo Text::_('COM_JEM_VIEW_ON_MAP'); ?>
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Events at this Venue -->
|
||||
<?php if (!empty($events)) : ?>
|
||||
<div class="jem-venue__events">
|
||||
<h2 class="jem-venue__events-title">
|
||||
<?php echo Text::_('COM_JEM_EVENTS_AT_VENUE'); ?>
|
||||
</h2>
|
||||
<div class="jem-venue__events-list">
|
||||
<?php foreach ($events as $event) : ?>
|
||||
<div class="jem-venue__event-item">
|
||||
<div class="jem-venue__event-date">
|
||||
<?php if (!empty($event->dates)) : ?>
|
||||
<time datetime="<?php echo $this->escape($event->dates); ?>">
|
||||
<?php echo HTMLHelper::_('date', $event->dates, Text::_('DATE_FORMAT_LC4')); ?>
|
||||
</time>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<h3 class="jem-venue__event-title">
|
||||
<?php if (!empty($event->slug)) : ?>
|
||||
<a href="<?php echo Route::_('index.php?option=com_jem&view=event&id=' . $event->slug); ?>"
|
||||
class="jem-venue__event-link">
|
||||
<?php echo $this->escape($event->title); ?>
|
||||
</a>
|
||||
<?php else : ?>
|
||||
<?php echo $this->escape($event->title); ?>
|
||||
<?php endif; ?>
|
||||
</h3>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Back Button -->
|
||||
<div class="jem-venue__actions">
|
||||
<a href="<?php echo Route::_('index.php?option=com_jem&view=eventslist'); ?>"
|
||||
class="jem-venue__button btn btn-secondary">
|
||||
<?php echo Text::_('COM_JEM_BACK_TO_EVENTS'); ?>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1,70 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Kunena
|
||||
* @subpackage com_kunena
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for Kunena category list
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
$this->document->addStyleDeclaration('
|
||||
.kunena-category-list-responsive {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.kunena-category-responsive {
|
||||
background: var(--body-bg);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: var(--border-radius);
|
||||
padding: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
|
||||
.kunena-category-responsive:hover {
|
||||
background: var(--secondary-bg);
|
||||
border-color: var(--color-primary);
|
||||
}
|
||||
|
||||
@media (max-width: 575.98px) {
|
||||
.kunena-category-responsive {
|
||||
padding: 0.75rem;
|
||||
}
|
||||
}
|
||||
');
|
||||
?>
|
||||
|
||||
<div class="kunena-category-list-responsive">
|
||||
<?php if (!empty($this->categories)) : ?>
|
||||
<?php foreach ($this->categories as $category) : ?>
|
||||
<div class="kunena-category-responsive">
|
||||
<h3 class="kunena-category__title">
|
||||
<a href="<?php echo $category->getUrl(); ?>">
|
||||
<?php echo $this->escape($category->name); ?>
|
||||
</a>
|
||||
</h3>
|
||||
|
||||
<?php if ($category->description) : ?>
|
||||
<div class="kunena-category__description">
|
||||
<?php echo $category->displayField('description'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="kunena-category__meta">
|
||||
<span><?php echo Text::_('COM_KUNENA_TOPICS'); ?>: <?php echo $category->numTopics; ?></span>
|
||||
<span><?php echo Text::_('COM_KUNENA_POSTS'); ?>: <?php echo $category->numPosts; ?></span>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
<?php else : ?>
|
||||
<div class="alert alert-info">
|
||||
<?php echo Text::_('COM_KUNENA_NO_CATEGORIES'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1,141 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package OS Membership Pro
|
||||
* @subpackage com_osmembership
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for OS Membership plans list
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
$this->document->addStyleDeclaration('
|
||||
.osmembership-plans-responsive {
|
||||
display: grid;
|
||||
gap: 2rem;
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.osmembership-plan-card {
|
||||
background: var(--body-bg);
|
||||
border: 2px solid var(--border-color);
|
||||
border-radius: var(--border-radius);
|
||||
padding: 2rem;
|
||||
transition: all 0.3s;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.osmembership-plan-card:hover {
|
||||
transform: translateY(-4px);
|
||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
|
||||
border-color: var(--color-primary);
|
||||
}
|
||||
|
||||
.osmembership-plan-card--featured {
|
||||
border-color: var(--color-primary);
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.osmembership-plan-card--featured::before {
|
||||
content: "' . Text::_('OSM_POPULAR') . '";
|
||||
position: absolute;
|
||||
top: -12px;
|
||||
right: 20px;
|
||||
background: var(--color-primary);
|
||||
color: white;
|
||||
padding: 0.25rem 1rem;
|
||||
border-radius: 1rem;
|
||||
font-size: 0.875rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.osmembership-plans-responsive {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 992px) {
|
||||
.osmembership-plans-responsive {
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1200px) {
|
||||
.osmembership-plans-responsive.osmembership-plans--many {
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
}
|
||||
}
|
||||
');
|
||||
?>
|
||||
|
||||
<div class="osmembership-plans-responsive <?php echo count($this->items) > 3 ? 'osmembership-plans--many' : ''; ?>">
|
||||
<?php foreach ($this->items as $item) : ?>
|
||||
<div class="osmembership-plan-card <?php echo $item->featured ? 'osmembership-plan-card--featured' : ''; ?>">
|
||||
<?php if (!empty($item->image)) : ?>
|
||||
<div class="osmembership-plan__image" style="margin-bottom: 1.5rem;">
|
||||
<img src="<?php echo $item->image; ?>"
|
||||
alt="<?php echo htmlspecialchars($item->title, ENT_COMPAT, 'UTF-8'); ?>"
|
||||
style="width: 100%; height: auto; border-radius: var(--border-radius);" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<h2 class="osmembership-plan__title" style="margin: 0 0 1rem 0; font-size: 1.75rem; font-weight: 700;">
|
||||
<?php echo htmlspecialchars($item->title, ENT_COMPAT, 'UTF-8'); ?>
|
||||
</h2>
|
||||
|
||||
<div class="osmembership-plan__pricing" style="margin-bottom: 1.5rem;">
|
||||
<?php if ($item->price > 0) : ?>
|
||||
<div style="font-size: 2.5rem; font-weight: 700; color: var(--color-primary); line-height: 1;">
|
||||
<span style="font-size: 1.5rem; vertical-align: super;"><?php echo $this->config->currency_symbol; ?></span>
|
||||
<?php echo number_format($item->price, 0); ?>
|
||||
</div>
|
||||
<?php if ($item->subscription_length > 0) : ?>
|
||||
<div style="color: var(--gray-600); margin-top: 0.5rem;">
|
||||
<?php echo Text::_('OSM_PER') . ' ' . $item->subscription_length . ' ' . Text::_('OSM_' . strtoupper($item->subscription_length_unit)); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php else : ?>
|
||||
<div style="font-size: 2.5rem; font-weight: 700; color: var(--success);">
|
||||
<?php echo Text::_('OSM_FREE'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<?php if (!empty($item->short_description)) : ?>
|
||||
<div class="osmembership-plan__description" style="margin-bottom: 1.5rem; color: var(--gray-600); line-height: 1.6;">
|
||||
<?php echo $item->short_description; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($item->features)) : ?>
|
||||
<div class="osmembership-plan__features" style="flex: 1; margin-bottom: 1.5rem;">
|
||||
<ul style="list-style: none; padding: 0; margin: 0;">
|
||||
<?php foreach (explode("\n", $item->features) as $feature) : ?>
|
||||
<?php if (trim($feature)) : ?>
|
||||
<li style="padding: 0.5rem 0; display: flex; align-items: flex-start; gap: 0.5rem;">
|
||||
<span class="icon-check" style="color: var(--success); flex-shrink: 0; margin-top: 0.25rem;"></span>
|
||||
<span><?php echo htmlspecialchars(trim($feature), ENT_COMPAT, 'UTF-8'); ?></span>
|
||||
</li>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="osmembership-plan__actions">
|
||||
<a href="<?php echo OSMembershipHelperRoute::getRegistrationRoute($item->id); ?>"
|
||||
class="btn btn-primary"
|
||||
style="width: 100%; min-height: 48px; display: inline-flex; align-items: center; justify-content: center; text-decoration: none;">
|
||||
<?php echo Text::_('OSM_SUBSCRIBE_NOW'); ?>
|
||||
<span class="icon-chevron-right" style="margin-left: 0.5rem;"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1,82 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package AcyMailing
|
||||
* @subpackage mod_acymailing
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for mod_acymailing module
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');
|
||||
|
||||
// Add responsive wrapper class
|
||||
$wrapperClass = 'mod-acymailing mod-acymailing-responsive ' . $moduleclass_sfx;
|
||||
?>
|
||||
|
||||
<div class="<?php echo $wrapperClass; ?>">
|
||||
<?php if (!empty($formDisplay)) : ?>
|
||||
<div class="mod-acymailing__form-container">
|
||||
<?php if ($params->get('intro_text')) : ?>
|
||||
<div class="mod-acymailing__intro">
|
||||
<?php echo $params->get('intro_text'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php echo $formDisplay; ?>
|
||||
|
||||
<?php if ($params->get('outro_text')) : ?>
|
||||
<div class="mod-acymailing__outro">
|
||||
<?php echo $params->get('outro_text'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<div class="mod-acymailing__empty">
|
||||
<p><?php echo Text::_('MOD_ACYMAILING_NO_FORM'); ?></p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
/* Override AcyMailing inline styles for mobile responsiveness */
|
||||
.mod-acymailing-responsive .acymailing_module input[type="email"],
|
||||
.mod-acymailing-responsive .acymailing_module input[type="text"] {
|
||||
min-height: 44px !important;
|
||||
font-size: 1rem !important;
|
||||
padding: 0.5rem 0.75rem !important;
|
||||
border-radius: var(--border-radius, 0.375rem) !important;
|
||||
border: 1px solid var(--input-border-color, #dee2e6) !important;
|
||||
width: 100% !important;
|
||||
box-sizing: border-box !important;
|
||||
}
|
||||
|
||||
.mod-acymailing-responsive .acymailing_module button[type="submit"],
|
||||
.mod-acymailing-responsive .acymailing_module input[type="submit"] {
|
||||
min-height: 44px !important;
|
||||
padding: 0.625rem 1rem !important;
|
||||
font-size: 1rem !important;
|
||||
border-radius: var(--border-radius, 0.375rem) !important;
|
||||
cursor: pointer !important;
|
||||
}
|
||||
|
||||
@media (max-width: 575.98px) {
|
||||
.mod-acymailing-responsive .acymailing_module input[type="email"],
|
||||
.mod-acymailing-responsive .acymailing_module input[type="text"] {
|
||||
font-size: 16px !important;
|
||||
min-height: 48px !important;
|
||||
padding: 0.75rem 1rem !important;
|
||||
}
|
||||
|
||||
.mod-acymailing-responsive .acymailing_module button[type="submit"],
|
||||
.mod-acymailing-responsive .acymailing_module input[type="submit"] {
|
||||
min-height: 48px !important;
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1,164 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Community Builder
|
||||
* @subpackage mod_cblogin
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for mod_cblogin module
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
// Ensure module language file is loaded
|
||||
$lang = Factory::getLanguage();
|
||||
$lang->load('mod_cblogin', JPATH_SITE);
|
||||
|
||||
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');
|
||||
|
||||
// Add responsive wrapper class
|
||||
$wrapperClass = 'mod-cblogin mod-cblogin-responsive ' . $moduleclass_sfx;
|
||||
?>
|
||||
|
||||
<div class="<?php echo $wrapperClass; ?>">
|
||||
<?php if ($type === 'logout') : ?>
|
||||
<div class="mod-cblogin__logout">
|
||||
<?php if ($params->get('greeting', 1)) : ?>
|
||||
<div class="mod-cblogin__greeting">
|
||||
<?php if ($cbUser) : ?>
|
||||
<div class="mod-cblogin__avatar">
|
||||
<?php echo $cbUser->getField('avatar', null, 'html', 'none', 'list'); ?>
|
||||
</div>
|
||||
<div class="mod-cblogin__user-info">
|
||||
<span class="mod-cblogin__username">
|
||||
<?php echo htmlspecialchars($cbUser->getField('formatname', null, 'html', 'none', 'list'), ENT_COMPAT, 'UTF-8'); ?>
|
||||
</span>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<form action="<?php echo $action; ?>" method="post" class="mod-cblogin__form">
|
||||
<div class="mod-cblogin__actions">
|
||||
<?php if ($params->get('profileLink', 1) && $cbUser) : ?>
|
||||
<a href="<?php echo $cbUser->getField('canvas', null, 'html', 'none', 'profile'); ?>" class="mod-cblogin__btn mod-cblogin__btn--profile btn btn-secondary">
|
||||
<span class="icon-user" aria-hidden="true"></span>
|
||||
<?php echo Text::_('MOD_CBLOGIN_PROFILE'); ?>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
|
||||
<button type="submit" name="Submit" class="mod-cblogin__btn mod-cblogin__btn--logout btn btn-primary">
|
||||
<span class="icon-sign-out" aria-hidden="true"></span>
|
||||
<?php echo Text::_('MOD_CBLOGIN_LOGOUT'); ?>
|
||||
</button>
|
||||
</div>
|
||||
<input type="hidden" name="op2" value="logout" />
|
||||
<input type="hidden" name="lang" value="<?php echo $lang; ?>" />
|
||||
<input type="hidden" name="return" value="<?php echo $return; ?>" />
|
||||
<?php echo $securityToken; ?>
|
||||
</form>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<form action="<?php echo $action; ?>" method="post" name="login<?php echo $moduleId; ?>" id="login<?php echo $moduleId; ?>" class="mod-cblogin__form mod-cblogin__form--login">
|
||||
<?php if ($params->get('pretext')) : ?>
|
||||
<div class="mod-cblogin__pretext">
|
||||
<?php echo $params->get('pretext'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="mod-cblogin__fields">
|
||||
<div class="mod-cblogin__field">
|
||||
<label for="modloginusername<?php echo $moduleId; ?>" class="mod-cblogin__label">
|
||||
<?php echo Text::_('MOD_CBLOGIN_USERNAME'); ?>
|
||||
</label>
|
||||
<input
|
||||
id="modloginusername<?php echo $moduleId; ?>"
|
||||
type="text"
|
||||
name="username"
|
||||
class="mod-cblogin__input form-control"
|
||||
placeholder="<?php echo Text::_('MOD_CBLOGIN_USERNAME'); ?>"
|
||||
autocomplete="username"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="mod-cblogin__field">
|
||||
<label for="modloginpass<?php echo $moduleId; ?>" class="mod-cblogin__label">
|
||||
<?php echo Text::_('MOD_CBLOGIN_PASSWORD'); ?>
|
||||
</label>
|
||||
<input
|
||||
id="modloginpass<?php echo $moduleId; ?>"
|
||||
type="password"
|
||||
name="passwd"
|
||||
class="mod-cblogin__input form-control"
|
||||
placeholder="<?php echo Text::_('MOD_CBLOGIN_PASSWORD'); ?>"
|
||||
autocomplete="current-password"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
|
||||
<?php if ($params->get('remember_me', 1)) : ?>
|
||||
<div class="mod-cblogin__remember">
|
||||
<input
|
||||
id="modloginrememberme<?php echo $moduleId; ?>"
|
||||
type="checkbox"
|
||||
name="remember"
|
||||
class="mod-cblogin__checkbox"
|
||||
value="yes"
|
||||
/>
|
||||
<label for="modloginrememberme<?php echo $moduleId; ?>" class="mod-cblogin__remember-label">
|
||||
<?php echo Text::_('MOD_CBLOGIN_REMEMBER_ME'); ?>
|
||||
</label>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<div class="mod-cblogin__actions">
|
||||
<button type="submit" name="Submit" class="mod-cblogin__btn mod-cblogin__btn--submit btn btn-primary">
|
||||
<span class="icon-sign-in" aria-hidden="true"></span>
|
||||
<?php echo Text::_('MOD_CBLOGIN_LOGIN'); ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="mod-cblogin__links">
|
||||
<?php if ($params->get('lostpassword_link', 1)) : ?>
|
||||
<a href="<?php echo $lostPasswordLink; ?>" class="mod-cblogin__link">
|
||||
<?php echo Text::_('MOD_CBLOGIN_FORGOT_PASSWORD'); ?>
|
||||
<span class="icon-chevron-right" aria-hidden="true"></span>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('lostusername_link', 1)) : ?>
|
||||
<a href="<?php echo $lostUsernameLink; ?>" class="mod-cblogin__link">
|
||||
<?php echo Text::_('MOD_CBLOGIN_FORGOT_USERNAME'); ?>
|
||||
<span class="icon-chevron-right" aria-hidden="true"></span>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('registration_link', 1)) : ?>
|
||||
<a href="<?php echo $registrationLink; ?>" class="mod-cblogin__link">
|
||||
<?php echo Text::_('MOD_CBLOGIN_REGISTER'); ?>
|
||||
<span class="icon-chevron-right" aria-hidden="true"></span>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<?php if ($params->get('posttext')) : ?>
|
||||
<div class="mod-cblogin__posttext">
|
||||
<?php echo $params->get('posttext'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<input type="hidden" name="op2" value="login" />
|
||||
<input type="hidden" name="lang" value="<?php echo $lang; ?>" />
|
||||
<input type="hidden" name="return" value="<?php echo $return; ?>" />
|
||||
<input type="hidden" name="message" value="0" />
|
||||
<input type="hidden" name="loginfrom" value="loginmodule" />
|
||||
<?php echo $securityToken; ?>
|
||||
</form>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1,99 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Community Builder
|
||||
* @subpackage mod_comprofilerOnline
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for mod_comprofilerOnline module
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
// Ensure module language file is loaded
|
||||
$lang = Factory::getLanguage();
|
||||
$lang->load('mod_comprofilerOnline', JPATH_SITE);
|
||||
|
||||
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');
|
||||
|
||||
// Add responsive wrapper class
|
||||
$wrapperClass = 'mod-cb-online mod-cb-online-responsive ' . $moduleclass_sfx;
|
||||
?>
|
||||
|
||||
<div class="<?php echo $wrapperClass; ?>">
|
||||
<?php if (!empty($onlineUsers)) : ?>
|
||||
<div class="mod-cb-online__stats">
|
||||
<div class="mod-cb-online__count">
|
||||
<span class="mod-cb-online__count-number"><?php echo $totalOnline; ?></span>
|
||||
<span class="mod-cb-online__count-label">
|
||||
<?php echo $totalOnline == 1 ? Text::_('MOD_CB_ONLINE_USER') : Text::_('MOD_CB_ONLINE_USERS'); ?>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<?php if ($params->get('show_guest_count', 1)) : ?>
|
||||
<div class="mod-cb-online__breakdown">
|
||||
<span class="mod-cb-online__breakdown-item">
|
||||
<span class="icon-users" aria-hidden="true"></span>
|
||||
<?php echo $membersOnline; ?> <?php echo Text::_('MOD_CB_ONLINE_MEMBERS'); ?>
|
||||
</span>
|
||||
<span class="mod-cb-online__breakdown-item">
|
||||
<span class="icon-eye" aria-hidden="true"></span>
|
||||
<?php echo $guestsOnline; ?> <?php echo Text::_('MOD_CB_ONLINE_GUESTS'); ?>
|
||||
</span>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<?php if ($params->get('show_user_list', 1) && !empty($onlineUsers)) : ?>
|
||||
<div class="mod-cb-online__users">
|
||||
<h<?php echo $params->get('header_level', 3); ?> class="mod-cb-online__heading">
|
||||
<?php echo Text::_('MOD_CB_ONLINE_WHO_IS_ONLINE'); ?>
|
||||
</h<?php echo $params->get('header_level', 3); ?>>
|
||||
|
||||
<ul class="mod-cb-online__list">
|
||||
<?php foreach ($onlineUsers as $user) : ?>
|
||||
<li class="mod-cb-online__user">
|
||||
<?php if ($params->get('show_avatar', 1) && !empty($user->avatar)) : ?>
|
||||
<div class="mod-cb-online__avatar">
|
||||
<?php echo $user->avatar; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="mod-cb-online__info">
|
||||
<?php if ($params->get('link_names', 1) && !empty($user->link)) : ?>
|
||||
<a href="<?php echo $user->link; ?>" class="mod-cb-online__name">
|
||||
<?php echo htmlspecialchars($user->name, ENT_COMPAT, 'UTF-8'); ?>
|
||||
</a>
|
||||
<?php else : ?>
|
||||
<span class="mod-cb-online__name">
|
||||
<?php echo htmlspecialchars($user->name, ENT_COMPAT, 'UTF-8'); ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('show_status', 1) && !empty($user->status)) : ?>
|
||||
<span class="mod-cb-online__status">
|
||||
<?php echo htmlspecialchars($user->status, ENT_COMPAT, 'UTF-8'); ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<?php if ($params->get('show_online_icon', 1)) : ?>
|
||||
<span class="mod-cb-online__indicator" title="<?php echo Text::_('MOD_CB_ONLINE_NOW'); ?>">
|
||||
<span class="icon-checkmark" aria-hidden="true"></span>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php else : ?>
|
||||
<div class="mod-cb-online__empty">
|
||||
<p><?php echo Text::_('MOD_CB_ONLINE_NO_USERS'); ?></p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1,110 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package HikaShop
|
||||
* @subpackage mod_hikashop_cart
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for mod_hikashop_cart module
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');
|
||||
|
||||
// Add responsive wrapper class
|
||||
$wrapperClass = 'mod-hikashop-cart mod-hikashop-cart-responsive ' . $moduleclass_sfx;
|
||||
?>
|
||||
|
||||
<div class="<?php echo $wrapperClass; ?>" id="hikashop_cart_module<?php echo $params->get('id'); ?>">
|
||||
<?php if (!empty($cart->products)) : ?>
|
||||
<div class="mod-hikashop-cart__header">
|
||||
<span class="mod-hikashop-cart__icon" aria-hidden="true">
|
||||
<span class="icon-basket"></span>
|
||||
</span>
|
||||
<div class="mod-hikashop-cart__summary">
|
||||
<div class="mod-hikashop-cart__count">
|
||||
<?php echo count($cart->products); ?>
|
||||
<?php echo count($cart->products) == 1 ? Text::_('ITEM') : Text::_('ITEMS'); ?>
|
||||
</div>
|
||||
<?php if (!empty($cart->total)) : ?>
|
||||
<div class="mod-hikashop-cart__total">
|
||||
<?php echo $cart->total->price_value_with_tax_formated; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php if ($params->get('show_products', 1)) : ?>
|
||||
<div class="mod-hikashop-cart__products">
|
||||
<?php foreach ($cart->products as $product) : ?>
|
||||
<div class="mod-hikashop-cart__product">
|
||||
<?php if (!empty($product->images[0]) && $params->get('show_image', 1)) : ?>
|
||||
<div class="mod-hikashop-cart__product-image">
|
||||
<img src="<?php echo $product->images[0]->file_path; ?>"
|
||||
alt="<?php echo htmlspecialchars($product->product_name, ENT_COMPAT, 'UTF-8'); ?>" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="mod-hikashop-cart__product-details">
|
||||
<div class="mod-hikashop-cart__product-name">
|
||||
<?php echo htmlspecialchars($product->product_name, ENT_COMPAT, 'UTF-8'); ?>
|
||||
</div>
|
||||
|
||||
<div class="mod-hikashop-cart__product-quantity">
|
||||
<?php echo Text::_('QUANTITY'); ?>:
|
||||
<span class="mod-hikashop-cart__quantity-value"><?php echo $product->cart_product_quantity; ?></span>
|
||||
</div>
|
||||
|
||||
<?php if (!empty($product->prices[0])) : ?>
|
||||
<div class="mod-hikashop-cart__product-price">
|
||||
<?php echo $product->prices[0]->price_value_with_tax_formated; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<?php if ($params->get('show_delete', 1)) : ?>
|
||||
<div class="mod-hikashop-cart__product-remove">
|
||||
<a href="#"
|
||||
class="mod-hikashop-cart__remove-btn hikashop_cart_product_delete"
|
||||
data-product-id="<?php echo $product->product_id; ?>"
|
||||
title="<?php echo Text::_('HIKA_DELETE'); ?>"
|
||||
aria-label="<?php echo Text::_('HIKA_DELETE') . ' ' . htmlspecialchars($product->product_name, ENT_COMPAT, 'UTF-8'); ?>">
|
||||
<span class="icon-remove" aria-hidden="true"></span>
|
||||
</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="mod-hikashop-cart__actions">
|
||||
<?php if ($params->get('show_cart_button', 1)) : ?>
|
||||
<a href="<?php echo hikashop_completeLink('cart'); ?>"
|
||||
class="mod-hikashop-cart__btn mod-hikashop-cart__btn--view btn btn-secondary">
|
||||
<?php echo Text::_('HIKASHOP_CART_VIEW'); ?>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('show_checkout_button', 1)) : ?>
|
||||
<a href="<?php echo hikashop_completeLink('checkout'); ?>"
|
||||
class="mod-hikashop-cart__btn mod-hikashop-cart__btn--checkout btn btn-primary">
|
||||
<?php echo Text::_('HIKASHOP_CHECKOUT'); ?>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<div class="mod-hikashop-cart__empty">
|
||||
<span class="mod-hikashop-cart__empty-icon" aria-hidden="true">
|
||||
<span class="icon-basket"></span>
|
||||
</span>
|
||||
<p class="mod-hikashop-cart__empty-text">
|
||||
<?php echo Text::_('HIKASHOP_CART_EMPTY'); ?>
|
||||
</p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1,112 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package K2
|
||||
* @subpackage mod_k2_content
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for mod_k2_content module
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');
|
||||
|
||||
// Add responsive wrapper class
|
||||
$wrapperClass = 'mod-k2-content mod-k2-content-responsive ' . $moduleclass_sfx;
|
||||
?>
|
||||
|
||||
<div class="<?php echo $wrapperClass; ?>">
|
||||
<?php if (count($items)) : ?>
|
||||
<ul class="mod-k2-content__list">
|
||||
<?php foreach ($items as $key => $item) : ?>
|
||||
<li class="mod-k2-content__item">
|
||||
<?php if ($params->get('itemImage') && !empty($item->imageXSmall)) : ?>
|
||||
<div class="mod-k2-content__image">
|
||||
<a href="<?php echo $item->link; ?>" title="<?php echo htmlspecialchars($item->title, ENT_COMPAT, 'UTF-8'); ?>">
|
||||
<img src="<?php echo $item->imageXSmall; ?>" alt="<?php echo htmlspecialchars($item->title, ENT_COMPAT, 'UTF-8'); ?>" />
|
||||
</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="mod-k2-content__content">
|
||||
<?php if ($params->get('itemTitle')) : ?>
|
||||
<h<?php echo $params->get('item_heading', 4); ?> class="mod-k2-content__title">
|
||||
<a href="<?php echo $item->link; ?>">
|
||||
<?php echo htmlspecialchars($item->title, ENT_COMPAT, 'UTF-8'); ?>
|
||||
</a>
|
||||
</h<?php echo $params->get('item_heading', 4); ?>>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('itemAuthor') || $params->get('itemDateCreated') || $params->get('itemCategory') || $params->get('itemHits')) : ?>
|
||||
<div class="mod-k2-content__meta">
|
||||
<?php if ($params->get('itemAuthor')) : ?>
|
||||
<span class="mod-k2-content__author">
|
||||
<span class="icon-user" aria-hidden="true"></span>
|
||||
<?php echo $item->author; ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('itemDateCreated')) : ?>
|
||||
<span class="mod-k2-content__date">
|
||||
<span class="icon-calendar" aria-hidden="true"></span>
|
||||
<time datetime="<?php echo HTMLHelper::_('date', $item->created, 'c'); ?>">
|
||||
<?php echo HTMLHelper::_('date', $item->created, Text::_('DATE_FORMAT_LC3')); ?>
|
||||
</time>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('itemCategory')) : ?>
|
||||
<span class="mod-k2-content__category">
|
||||
<span class="icon-folder" aria-hidden="true"></span>
|
||||
<a href="<?php echo $item->categoryLink; ?>">
|
||||
<?php echo $item->categoryname; ?>
|
||||
</a>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('itemHits')) : ?>
|
||||
<span class="mod-k2-content__hits">
|
||||
<span class="icon-eye" aria-hidden="true"></span>
|
||||
<?php echo $item->hits; ?> <?php echo Text::_('MOD_K2_CONTENT_HITS'); ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('itemIntroText') && !empty($item->introtext)) : ?>
|
||||
<div class="mod-k2-content__intro">
|
||||
<?php echo $item->introtext; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('itemReadMore')) : ?>
|
||||
<div class="mod-k2-content__readmore">
|
||||
<a href="<?php echo $item->link; ?>" class="mod-k2-content__readmore-link btn btn-secondary">
|
||||
<?php echo Text::_('MOD_K2_CONTENT_READ_MORE'); ?>
|
||||
<span class="icon-chevron-right" aria-hidden="true"></span>
|
||||
</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
|
||||
<?php if ($params->get('itemCustomLink')) : ?>
|
||||
<div class="mod-k2-content__custom-link">
|
||||
<a href="<?php echo $params->get('itemCustomLinkURL'); ?>" class="btn btn-primary">
|
||||
<?php echo $params->get('itemCustomLinkTitle'); ?>
|
||||
</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php else : ?>
|
||||
<div class="mod-k2-content__empty">
|
||||
<p><?php echo Text::_('MOD_K2_CONTENT_NO_ITEMS'); ?></p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1,110 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Kunena
|
||||
* @subpackage mod_kunenalatest
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for mod_kunenalatest module
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');
|
||||
|
||||
// Add responsive wrapper class
|
||||
$wrapperClass = 'mod-kunena-latest mod-kunena-latest-responsive ' . $moduleclass_sfx;
|
||||
?>
|
||||
|
||||
<div class="<?php echo $wrapperClass; ?>">
|
||||
<?php if (!empty($posts)) : ?>
|
||||
<ul class="mod-kunena-latest__list">
|
||||
<?php foreach ($posts as $post) : ?>
|
||||
<li class="mod-kunena-latest__item">
|
||||
<?php if ($params->get('sh_userpic', 1) && !empty($post->getAuthor()->getAvatarImage())) : ?>
|
||||
<div class="mod-kunena-latest__avatar">
|
||||
<?php echo $post->getAuthor()->getAvatarImage('', 40, 40); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="mod-kunena-latest__content">
|
||||
<?php if ($params->get('sh_topic', 1)) : ?>
|
||||
<h<?php echo $params->get('header_level', 4); ?> class="mod-kunena-latest__title">
|
||||
<a href="<?php echo $post->getUrl(); ?>">
|
||||
<?php echo htmlspecialchars($post->subject, ENT_COMPAT, 'UTF-8'); ?>
|
||||
</a>
|
||||
</h<?php echo $params->get('header_level', 4); ?>>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="mod-kunena-latest__meta">
|
||||
<?php if ($params->get('sh_username', 1)) : ?>
|
||||
<span class="mod-kunena-latest__author">
|
||||
<span class="icon-user" aria-hidden="true"></span>
|
||||
<a href="<?php echo $post->getAuthor()->getLink(); ?>">
|
||||
<?php echo $post->getAuthor()->getName(); ?>
|
||||
</a>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('sh_time', 1)) : ?>
|
||||
<span class="mod-kunena-latest__date">
|
||||
<span class="icon-clock" aria-hidden="true"></span>
|
||||
<time datetime="<?php echo HTMLHelper::_('date', $post->time, 'c'); ?>">
|
||||
<?php echo $post->getTime(); ?>
|
||||
</time>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('sh_category', 1)) : ?>
|
||||
<span class="mod-kunena-latest__category">
|
||||
<span class="icon-folder" aria-hidden="true"></span>
|
||||
<a href="<?php echo $post->getCategory()->getUrl(); ?>">
|
||||
<?php echo $post->getCategory()->name; ?>
|
||||
</a>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('sh_hits', 0)) : ?>
|
||||
<span class="mod-kunena-latest__hits">
|
||||
<span class="icon-eye" aria-hidden="true"></span>
|
||||
<?php echo $post->getTopic()->hits; ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('sh_replies', 0)) : ?>
|
||||
<span class="mod-kunena-latest__replies">
|
||||
<span class="icon-comments" aria-hidden="true"></span>
|
||||
<?php echo $post->getTopic()->getReplies(); ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<?php if ($params->get('sh_text', 0) && !empty($post->message)) : ?>
|
||||
<div class="mod-kunena-latest__excerpt">
|
||||
<?php echo KunenaHtmlParser::parseBBCode($post->message, $params->get('txt_len', 50)); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
|
||||
<?php if ($params->get('more_link', 1)) : ?>
|
||||
<div class="mod-kunena-latest__more">
|
||||
<a href="<?php echo KunenaRoute::_('index.php?option=com_kunena'); ?>"
|
||||
class="mod-kunena-latest__more-link btn btn-secondary">
|
||||
<?php echo Text::_('MOD_KUNENALATEST_MORE'); ?>
|
||||
<span class="icon-chevron-right" aria-hidden="true"></span>
|
||||
</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php else : ?>
|
||||
<div class="mod-kunena-latest__empty">
|
||||
<p><?php echo Text::_('MOD_KUNENALATEST_NO_POSTS'); ?></p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1,187 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Kunena
|
||||
* @subpackage mod_kunenalogin
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for mod_kunenalogin module
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Router\Route;
|
||||
|
||||
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');
|
||||
|
||||
// Add responsive wrapper class
|
||||
$wrapperClass = 'mod-kunena-login mod-kunena-login-responsive ' . $moduleclass_sfx;
|
||||
?>
|
||||
|
||||
<div class="<?php echo $wrapperClass; ?>">
|
||||
<?php if ($kunena_my->exists()) : ?>
|
||||
<!-- Logged in state -->
|
||||
<div class="mod-kunena-login__profile">
|
||||
<?php if ($params->get('showAvatar', 1)) : ?>
|
||||
<div class="mod-kunena-login__avatar">
|
||||
<?php echo $kunena_my->getAvatarImage('', 60, 60); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="mod-kunena-login__user-info">
|
||||
<div class="mod-kunena-login__username">
|
||||
<a href="<?php echo $kunena_my->getURL(); ?>">
|
||||
<?php echo $kunena_my->getName(); ?>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<?php if ($params->get('showRank', 1) && !empty($kunena_my->getRank())) : ?>
|
||||
<div class="mod-kunena-login__rank">
|
||||
<?php echo $kunena_my->getRank(); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php if ($params->get('showStats', 1)) : ?>
|
||||
<div class="mod-kunena-login__stats">
|
||||
<div class="mod-kunena-login__stat">
|
||||
<span class="mod-kunena-login__stat-label"><?php echo Text::_('MOD_KUNENALOGIN_POSTS'); ?>:</span>
|
||||
<span class="mod-kunena-login__stat-value"><?php echo $kunena_my->posts; ?></span>
|
||||
</div>
|
||||
|
||||
<?php if ($params->get('showKarma', 0) && isset($kunena_my->karma)) : ?>
|
||||
<div class="mod-kunena-login__stat">
|
||||
<span class="mod-kunena-login__stat-label"><?php echo Text::_('MOD_KUNENALOGIN_KARMA'); ?>:</span>
|
||||
<span class="mod-kunena-login__stat-value"><?php echo $kunena_my->karma; ?></span>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="mod-kunena-login__actions">
|
||||
<?php if ($params->get('showProfile', 1)) : ?>
|
||||
<a href="<?php echo $kunena_my->getURL(); ?>" class="mod-kunena-login__btn btn btn-secondary">
|
||||
<span class="icon-user" aria-hidden="true"></span>
|
||||
<?php echo Text::_('MOD_KUNENALOGIN_PROFILE'); ?>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('showMessages', 1)) : ?>
|
||||
<a href="<?php echo KunenaRoute::_('index.php?option=com_kunena&view=user&layout=messages'); ?>"
|
||||
class="mod-kunena-login__btn btn btn-secondary">
|
||||
<span class="icon-envelope" aria-hidden="true"></span>
|
||||
<?php echo Text::_('MOD_KUNENALOGIN_PRIVATE_MESSAGES'); ?>
|
||||
<?php if (!empty($private_messages)) : ?>
|
||||
<span class="mod-kunena-login__badge"><?php echo $private_messages; ?></span>
|
||||
<?php endif; ?>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
|
||||
<form action="<?php echo Route::_('index.php', true); ?>" method="post" class="mod-kunena-login__logout-form">
|
||||
<button type="submit" class="mod-kunena-login__btn mod-kunena-login__btn--logout btn btn-primary">
|
||||
<span class="icon-sign-out" aria-hidden="true"></span>
|
||||
<?php echo Text::_('MOD_KUNENALOGIN_LOGOUT'); ?>
|
||||
</button>
|
||||
<input type="hidden" name="option" value="com_users" />
|
||||
<input type="hidden" name="task" value="user.logout" />
|
||||
<input type="hidden" name="return" value="<?php echo $return; ?>" />
|
||||
<?php echo JHtml::_('form.token'); ?>
|
||||
</form>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<!-- Login form -->
|
||||
<form action="<?php echo Route::_('index.php', true); ?>" method="post" class="mod-kunena-login__form">
|
||||
<?php if ($params->get('pretext')) : ?>
|
||||
<div class="mod-kunena-login__pretext">
|
||||
<?php echo $params->get('pretext'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="mod-kunena-login__fields">
|
||||
<div class="mod-kunena-login__field">
|
||||
<label for="kunena-login-username-<?php echo $module->id; ?>" class="mod-kunena-login__label">
|
||||
<?php echo Text::_('MOD_KUNENALOGIN_USERNAME'); ?>
|
||||
</label>
|
||||
<input
|
||||
id="kunena-login-username-<?php echo $module->id; ?>"
|
||||
type="text"
|
||||
name="username"
|
||||
class="mod-kunena-login__input form-control"
|
||||
placeholder="<?php echo Text::_('MOD_KUNENALOGIN_USERNAME'); ?>"
|
||||
autocomplete="username"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="mod-kunena-login__field">
|
||||
<label for="kunena-login-password-<?php echo $module->id; ?>" class="mod-kunena-login__label">
|
||||
<?php echo Text::_('MOD_KUNENALOGIN_PASSWORD'); ?>
|
||||
</label>
|
||||
<input
|
||||
id="kunena-login-password-<?php echo $module->id; ?>"
|
||||
type="password"
|
||||
name="password"
|
||||
class="mod-kunena-login__input form-control"
|
||||
placeholder="<?php echo Text::_('MOD_KUNENALOGIN_PASSWORD'); ?>"
|
||||
autocomplete="current-password"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
|
||||
<?php if ($params->get('showRememberMe', 1)) : ?>
|
||||
<div class="mod-kunena-login__remember">
|
||||
<input
|
||||
id="kunena-login-remember-<?php echo $module->id; ?>"
|
||||
type="checkbox"
|
||||
name="remember"
|
||||
class="mod-kunena-login__checkbox"
|
||||
value="yes"
|
||||
/>
|
||||
<label for="kunena-login-remember-<?php echo $module->id; ?>" class="mod-kunena-login__remember-label">
|
||||
<?php echo Text::_('MOD_KUNENALOGIN_REMEMBER_ME'); ?>
|
||||
</label>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<div class="mod-kunena-login__actions">
|
||||
<button type="submit" class="mod-kunena-login__btn mod-kunena-login__btn--submit btn btn-primary">
|
||||
<span class="icon-sign-in" aria-hidden="true"></span>
|
||||
<?php echo Text::_('MOD_KUNENALOGIN_LOGIN'); ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="mod-kunena-login__links">
|
||||
<?php if ($params->get('showRegister', 1) && $usersConfig->get('allowUserRegistration')) : ?>
|
||||
<a href="<?php echo Route::_('index.php?option=com_users&view=registration'); ?>"
|
||||
class="mod-kunena-login__link">
|
||||
<?php echo Text::_('MOD_KUNENALOGIN_REGISTER'); ?>
|
||||
<span class="icon-chevron-right" aria-hidden="true"></span>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('showForgot', 1)) : ?>
|
||||
<a href="<?php echo Route::_('index.php?option=com_users&view=reset'); ?>"
|
||||
class="mod-kunena-login__link">
|
||||
<?php echo Text::_('MOD_KUNENALOGIN_FORGOT_PASSWORD'); ?>
|
||||
<span class="icon-chevron-right" aria-hidden="true"></span>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<?php if ($params->get('posttext')) : ?>
|
||||
<div class="mod-kunena-login__posttext">
|
||||
<?php echo $params->get('posttext'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<input type="hidden" name="option" value="com_users" />
|
||||
<input type="hidden" name="task" value="user.login" />
|
||||
<input type="hidden" name="return" value="<?php echo $return; ?>" />
|
||||
<?php echo JHtml::_('form.token'); ?>
|
||||
</form>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1,74 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Kunena
|
||||
* @subpackage mod_kunenasearch
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for mod_kunenasearch module
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');
|
||||
|
||||
// Add responsive wrapper class
|
||||
$wrapperClass = 'mod-kunena-search mod-kunena-search-responsive ' . $moduleclass_sfx;
|
||||
|
||||
$button_pos = $params->get('button_pos', 'right');
|
||||
$button_text = $params->get('button_text', '');
|
||||
?>
|
||||
|
||||
<div class="<?php echo $wrapperClass; ?>">
|
||||
<form action="<?php echo KunenaRoute::_('index.php?option=com_kunena&view=search'); ?>"
|
||||
method="post"
|
||||
class="mod-kunena-search__form mod-kunena-search__form--button-<?php echo $button_pos; ?>">
|
||||
|
||||
<?php if ($button_pos === 'top' || $button_pos === 'left') : ?>
|
||||
<div class="mod-kunena-search__button-wrapper mod-kunena-search__button-wrapper--<?php echo $button_pos; ?>">
|
||||
<button type="submit" class="mod-kunena-search__button btn btn-primary">
|
||||
<?php if ($button_text) : ?>
|
||||
<?php echo htmlspecialchars($button_text, ENT_COMPAT, 'UTF-8'); ?>
|
||||
<?php else : ?>
|
||||
<span class="icon-search" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('MOD_KUNENASEARCH_SEARCH'); ?></span>
|
||||
<?php endif; ?>
|
||||
</button>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="mod-kunena-search__input-wrapper">
|
||||
<label for="mod-kunena-search-<?php echo $module->id; ?>" class="visually-hidden">
|
||||
<?php echo Text::_('MOD_KUNENASEARCH_SEARCH_FORUM'); ?>
|
||||
</label>
|
||||
<input
|
||||
type="search"
|
||||
name="q"
|
||||
id="mod-kunena-search-<?php echo $module->id; ?>"
|
||||
class="mod-kunena-search__input form-control"
|
||||
placeholder="<?php echo Text::_('MOD_KUNENASEARCH_SEARCH_FORUM'); ?>"
|
||||
aria-label="<?php echo Text::_('MOD_KUNENASEARCH_SEARCH_FORUM'); ?>"
|
||||
value="<?php echo htmlspecialchars($params->get('default_value', ''), ENT_COMPAT, 'UTF-8'); ?>"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<?php if ($button_pos === 'bottom' || $button_pos === 'right') : ?>
|
||||
<div class="mod-kunena-search__button-wrapper mod-kunena-search__button-wrapper--<?php echo $button_pos; ?>">
|
||||
<button type="submit" class="mod-kunena-search__button btn btn-primary">
|
||||
<?php if ($button_text) : ?>
|
||||
<?php echo htmlspecialchars($button_text, ENT_COMPAT, 'UTF-8'); ?>
|
||||
<?php else : ?>
|
||||
<span class="icon-search" aria-hidden="true"></span>
|
||||
<span class="visually-hidden"><?php echo Text::_('MOD_KUNENASEARCH_SEARCH'); ?></span>
|
||||
<?php endif; ?>
|
||||
</button>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<input type="hidden" name="task" value="results" />
|
||||
<input type="hidden" name="option" value="com_kunena" />
|
||||
</form>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1,100 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Kunena
|
||||
* @subpackage mod_kunenastats
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for mod_kunenastats module
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');
|
||||
|
||||
// Add responsive wrapper class
|
||||
$wrapperClass = 'mod-kunena-stats mod-kunena-stats-responsive ' . $moduleclass_sfx;
|
||||
?>
|
||||
|
||||
<div class="<?php echo $wrapperClass; ?>">
|
||||
<div class="mod-kunena-stats__container">
|
||||
<?php if ($params->get('sh_latestMemberCount', 1)) : ?>
|
||||
<div class="mod-kunena-stats__stat">
|
||||
<div class="mod-kunena-stats__icon">
|
||||
<span class="icon-users" aria-hidden="true"></span>
|
||||
</div>
|
||||
<div class="mod-kunena-stats__content">
|
||||
<div class="mod-kunena-stats__value"><?php echo $kunena_stats->memberCount; ?></div>
|
||||
<div class="mod-kunena-stats__label"><?php echo Text::_('MOD_KUNENASTATS_MEMBERS'); ?></div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('sh_latestMember', 1) && !empty($kunena_stats->latestMember)) : ?>
|
||||
<div class="mod-kunena-stats__stat mod-kunena-stats__stat--latest-member">
|
||||
<div class="mod-kunena-stats__icon">
|
||||
<span class="icon-user-plus" aria-hidden="true"></span>
|
||||
</div>
|
||||
<div class="mod-kunena-stats__content">
|
||||
<div class="mod-kunena-stats__label"><?php echo Text::_('MOD_KUNENASTATS_LATEST_MEMBER'); ?></div>
|
||||
<div class="mod-kunena-stats__value mod-kunena-stats__value--link">
|
||||
<a href="<?php echo $kunena_stats->latestMember->getURL(); ?>">
|
||||
<?php echo $kunena_stats->latestMember->getName(); ?>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('sh_messageCount', 1)) : ?>
|
||||
<div class="mod-kunena-stats__stat">
|
||||
<div class="mod-kunena-stats__icon">
|
||||
<span class="icon-comments" aria-hidden="true"></span>
|
||||
</div>
|
||||
<div class="mod-kunena-stats__content">
|
||||
<div class="mod-kunena-stats__value"><?php echo $kunena_stats->messageCount; ?></div>
|
||||
<div class="mod-kunena-stats__label"><?php echo Text::_('MOD_KUNENASTATS_MESSAGES'); ?></div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('sh_topicCount', 1)) : ?>
|
||||
<div class="mod-kunena-stats__stat">
|
||||
<div class="mod-kunena-stats__icon">
|
||||
<span class="icon-folder-open" aria-hidden="true"></span>
|
||||
</div>
|
||||
<div class="mod-kunena-stats__content">
|
||||
<div class="mod-kunena-stats__value"><?php echo $kunena_stats->topicCount; ?></div>
|
||||
<div class="mod-kunena-stats__label"><?php echo Text::_('MOD_KUNENASTATS_TOPICS'); ?></div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('sh_todayTopicCount', 0)) : ?>
|
||||
<div class="mod-kunena-stats__stat">
|
||||
<div class="mod-kunena-stats__icon">
|
||||
<span class="icon-calendar-check" aria-hidden="true"></span>
|
||||
</div>
|
||||
<div class="mod-kunena-stats__content">
|
||||
<div class="mod-kunena-stats__value"><?php echo $kunena_stats->todayTopicCount; ?></div>
|
||||
<div class="mod-kunena-stats__label"><?php echo Text::_('MOD_KUNENASTATS_TODAY_TOPICS'); ?></div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('sh_yesterdayTopicCount', 0)) : ?>
|
||||
<div class="mod-kunena-stats__stat">
|
||||
<div class="mod-kunena-stats__icon">
|
||||
<span class="icon-calendar" aria-hidden="true"></span>
|
||||
</div>
|
||||
<div class="mod-kunena-stats__content">
|
||||
<div class="mod-kunena-stats__value"><?php echo $kunena_stats->yesterdayTopicCount; ?></div>
|
||||
<div class="mod-kunena-stats__label"><?php echo Text::_('MOD_KUNENASTATS_YESTERDAY_TOPICS'); ?></div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,9 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,104 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Site
|
||||
* @subpackage mod_menu
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Main Menu - Mobile responsive collapsible dropdown menu override
|
||||
* Bootstrap 5 responsive navbar with hamburger menu
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Helper\ModuleHelper;
|
||||
|
||||
$id = '';
|
||||
|
||||
if ($tagId = $params->get('tag_id', '')) {
|
||||
$id = ' id="' . $tagId . '"';
|
||||
}
|
||||
|
||||
// Get module class suffix
|
||||
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');
|
||||
|
||||
// The menu class is deprecated. Use mod-menu instead
|
||||
?>
|
||||
<nav class="mod-menu mod-menu-main navbar navbar-expand-lg<?php echo $moduleclass_sfx; ?>"<?php echo $id; ?>>
|
||||
<div class="container-fluid">
|
||||
<!-- Hamburger toggle button for mobile -->
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#mainMenuCollapse" aria-controls="mainMenuCollapse" aria-expanded="false" aria-label="Toggle Main Menu">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<!-- Collapsible menu content -->
|
||||
<div class="collapse navbar-collapse" id="mainMenuCollapse">
|
||||
<ul class="navbar-nav mod-menu-main__list">
|
||||
<?php foreach ($list as $i => &$item) :
|
||||
$itemParams = $item->getParams();
|
||||
$class = 'nav-item mod-menu-main__item item-' . $item->id;
|
||||
|
||||
if ($item->id == $default_id) {
|
||||
$class .= ' default';
|
||||
}
|
||||
|
||||
if ($item->id == $active_id || ($item->type === 'alias' && $itemParams->get('aliasoptions') == $active_id)) {
|
||||
$class .= ' current';
|
||||
}
|
||||
|
||||
if (in_array($item->id, $path)) {
|
||||
$class .= ' active';
|
||||
} elseif ($item->type === 'alias') {
|
||||
$aliasToId = $itemParams->get('aliasoptions');
|
||||
|
||||
if (count($path) > 0 && $aliasToId == $path[count($path) - 1]) {
|
||||
$class .= ' active';
|
||||
} elseif (in_array($aliasToId, $path)) {
|
||||
$class .= ' alias-parent-active';
|
||||
}
|
||||
}
|
||||
|
||||
if ($item->type === 'separator') {
|
||||
$class .= ' divider';
|
||||
}
|
||||
|
||||
if ($item->deeper) {
|
||||
$class .= ' deeper dropdown';
|
||||
}
|
||||
|
||||
if ($item->parent) {
|
||||
$class .= ' parent';
|
||||
}
|
||||
|
||||
echo '<li class="' . $class . '">';
|
||||
|
||||
switch ($item->type) :
|
||||
case 'separator':
|
||||
case 'component':
|
||||
case 'heading':
|
||||
case 'url':
|
||||
require ModuleHelper::getLayoutPath('mod_menu', 'mainmenu_' . $item->type);
|
||||
break;
|
||||
|
||||
default:
|
||||
require ModuleHelper::getLayoutPath('mod_menu', 'mainmenu_url');
|
||||
break;
|
||||
endswitch;
|
||||
|
||||
// The next item is deeper.
|
||||
if ($item->deeper) {
|
||||
echo '<ul class="dropdown-menu mod-menu-main__dropdown">';
|
||||
} elseif ($item->shallower) {
|
||||
// The next item is shallower.
|
||||
echo '</li>';
|
||||
echo str_repeat('</ul></li>', $item->level_diff);
|
||||
} else {
|
||||
// The next item is on the same level.
|
||||
echo '</li>';
|
||||
}
|
||||
endforeach;
|
||||
?></ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
@@ -1,64 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Site
|
||||
* @subpackage mod_menu
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Main Menu - Component item layout
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Filter\OutputFilter;
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
|
||||
$attributes = [];
|
||||
|
||||
if ($item->anchor_title) {
|
||||
$attributes['title'] = $item->anchor_title;
|
||||
}
|
||||
|
||||
if ($item->anchor_css) {
|
||||
$attributes['class'] = $item->anchor_css;
|
||||
}
|
||||
|
||||
if ($item->anchor_rel) {
|
||||
$attributes['rel'] = $item->anchor_rel;
|
||||
}
|
||||
|
||||
$linktype = $item->title;
|
||||
|
||||
if ($item->menu_icon) {
|
||||
// The link is an icon
|
||||
if ($itemParams->get('menu_text', 1)) {
|
||||
// If the link text is to be displayed, the icon is added with aria-hidden
|
||||
$linktype = '<span class="p-2 ' . $item->menu_icon . '" aria-hidden="true"></span>' . $item->title;
|
||||
} else {
|
||||
// If the icon itself is the link, it needs a visually hidden text
|
||||
$linktype = '<span class="p-2 ' . $item->menu_icon . '" aria-hidden="true"></span><span class="visually-hidden">' . $item->title . '</span>';
|
||||
}
|
||||
}
|
||||
|
||||
if ($item->browserNav == 1) {
|
||||
$attributes['target'] = '_blank';
|
||||
$attributes['rel'] = 'noopener noreferrer';
|
||||
} elseif ($item->browserNav == 2) {
|
||||
$options = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,' . $params->get('window_open');
|
||||
|
||||
$attributes['onclick'] = "window.open(this.href, 'targetWindow', '" . $options . "'); return false;";
|
||||
}
|
||||
|
||||
// Add dropdown toggle for items with children
|
||||
$linkClass = 'nav-link mod-menu-main__link';
|
||||
if ($item->deeper) {
|
||||
$linkClass .= ' dropdown-toggle';
|
||||
$attributes['data-bs-toggle'] = 'dropdown';
|
||||
$attributes['role'] = 'button';
|
||||
$attributes['aria-expanded'] = 'false';
|
||||
}
|
||||
|
||||
$attributes['class'] = $linkClass;
|
||||
|
||||
echo HTMLHelper::_('link', OutputFilter::ampReplace(htmlspecialchars($item->flink, ENT_COMPAT, 'UTF-8', false)), $linktype, $attributes);
|
||||
@@ -1,37 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Site
|
||||
* @subpackage mod_menu
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Main Menu - Heading item layout
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
$title = $item->anchor_title ? ' title="' . $item->anchor_title . '"' : '';
|
||||
$anchor_css = $item->anchor_css ?: '';
|
||||
|
||||
$linktype = $item->title;
|
||||
|
||||
if ($item->menu_icon) {
|
||||
// The link is an icon
|
||||
if ($itemParams->get('menu_text', 1)) {
|
||||
// If the link text is to be displayed, the icon is added with aria-hidden
|
||||
$linktype = '<span class="p-2 ' . $item->menu_icon . '" aria-hidden="true"></span>' . $item->title;
|
||||
} else {
|
||||
// If the icon itself is the link, it needs a visually hidden text
|
||||
$linktype = '<span class="p-2 ' . $item->menu_icon . '" aria-hidden="true"></span><span class="visually-hidden">' . $item->title . '</span>';
|
||||
}
|
||||
}
|
||||
|
||||
// Add dropdown toggle for items with children
|
||||
$headingClass = 'nav-link mod-menu-main__heading';
|
||||
if ($item->deeper) {
|
||||
$headingClass .= ' dropdown-toggle';
|
||||
}
|
||||
|
||||
?>
|
||||
<span class="<?php echo $headingClass . ' ' . $anchor_css; ?>"<?php echo $title; ?>><?php echo $linktype; ?></span>
|
||||
@@ -1,31 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Site
|
||||
* @subpackage mod_menu
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Main Menu - Separator item layout
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
$title = $item->anchor_title ? ' title="' . $item->anchor_title . '"' : '';
|
||||
$anchor_css = $item->anchor_css ?: '';
|
||||
|
||||
$linktype = $item->title;
|
||||
|
||||
if ($item->menu_icon) {
|
||||
// The link is an icon
|
||||
if ($itemParams->get('menu_text', 1)) {
|
||||
// If the link text is to be displayed, the icon is added with aria-hidden
|
||||
$linktype = '<span class="p-2 ' . $item->menu_icon . '" aria-hidden="true"></span>' . $item->title;
|
||||
} else {
|
||||
// If the icon itself is the link, it needs a visually hidden text
|
||||
$linktype = '<span class="p-2 ' . $item->menu_icon . '" aria-hidden="true"></span><span class="visually-hidden">' . $item->title . '</span>';
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
<span class="dropdown-divider mod-menu-main__separator <?php echo $anchor_css; ?>"<?php echo $title; ?>><?php echo $linktype; ?></span>
|
||||
@@ -1,69 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Site
|
||||
* @subpackage mod_menu
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Main Menu - URL item layout
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Filter\OutputFilter;
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
|
||||
$attributes = [];
|
||||
|
||||
if ($item->anchor_title) {
|
||||
$attributes['title'] = $item->anchor_title;
|
||||
}
|
||||
|
||||
if ($item->anchor_css) {
|
||||
$attributes['class'] = $item->anchor_css;
|
||||
}
|
||||
|
||||
if ($item->anchor_rel) {
|
||||
$attributes['rel'] = $item->anchor_rel;
|
||||
}
|
||||
|
||||
$linktype = $item->title;
|
||||
|
||||
if ($item->menu_icon) {
|
||||
// The link is an icon
|
||||
if ($itemParams->get('menu_text', 1)) {
|
||||
// If the link text is to be displayed, the icon is added with aria-hidden
|
||||
$linktype = '<span class="p-2 ' . $item->menu_icon . '" aria-hidden="true"></span>' . $item->title;
|
||||
} else {
|
||||
// If the icon itself is the link, it needs a visually hidden text
|
||||
$linktype = '<span class="p-2 ' . $item->menu_icon . '" aria-hidden="true"></span><span class="visually-hidden">' . $item->title . '</span>';
|
||||
}
|
||||
}
|
||||
|
||||
if ($item->browserNav == 1) {
|
||||
$attributes['target'] = '_blank';
|
||||
$attributes['rel'] = 'noopener noreferrer';
|
||||
} elseif ($item->browserNav == 2) {
|
||||
$options = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,' . $params->get('window_open');
|
||||
|
||||
$attributes['onclick'] = "window.open(this.href, 'targetWindow', '" . $options . "'); return false;";
|
||||
}
|
||||
|
||||
// Add dropdown toggle for items with children
|
||||
$linkClass = 'nav-link mod-menu-main__link';
|
||||
if ($item->deeper) {
|
||||
$linkClass .= ' dropdown-toggle';
|
||||
$attributes['data-bs-toggle'] = 'dropdown';
|
||||
$attributes['role'] = 'button';
|
||||
$attributes['aria-expanded'] = 'false';
|
||||
}
|
||||
|
||||
// Merge existing class with our class
|
||||
if (isset($attributes['class'])) {
|
||||
$attributes['class'] .= ' ' . $linkClass;
|
||||
} else {
|
||||
$attributes['class'] = $linkClass;
|
||||
}
|
||||
|
||||
echo HTMLHelper::_('link', OutputFilter::ampReplace(htmlspecialchars($item->flink, ENT_COMPAT, 'UTF-8', false)), $linktype, $attributes);
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1,105 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package OS Membership Pro
|
||||
* @subpackage mod_osmembership
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for mod_osmembership module
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');
|
||||
|
||||
// Add responsive wrapper class
|
||||
$wrapperClass = 'mod-osmembership mod-osmembership-responsive ' . $moduleclass_sfx;
|
||||
?>
|
||||
|
||||
<div class="<?php echo $wrapperClass; ?>">
|
||||
<?php if (!empty($plans)) : ?>
|
||||
<div class="mod-osmembership__plans">
|
||||
<?php foreach ($plans as $plan) : ?>
|
||||
<div class="mod-osmembership__plan">
|
||||
<?php if ($params->get('show_plan_image', 1) && !empty($plan->image)) : ?>
|
||||
<div class="mod-osmembership__plan-image">
|
||||
<img src="<?php echo $plan->image; ?>"
|
||||
alt="<?php echo htmlspecialchars($plan->title, ENT_COMPAT, 'UTF-8'); ?>" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="mod-osmembership__plan-content">
|
||||
<h<?php echo $params->get('header_level', 3); ?> class="mod-osmembership__plan-title">
|
||||
<?php echo htmlspecialchars($plan->title, ENT_COMPAT, 'UTF-8'); ?>
|
||||
</h<?php echo $params->get('header_level', 3); ?>>
|
||||
|
||||
<?php if ($params->get('show_short_description', 1) && !empty($plan->short_description)) : ?>
|
||||
<div class="mod-osmembership__plan-description">
|
||||
<?php echo $plan->short_description; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('show_price', 1)) : ?>
|
||||
<div class="mod-osmembership__plan-pricing">
|
||||
<?php if ($plan->price > 0) : ?>
|
||||
<div class="mod-osmembership__price">
|
||||
<span class="mod-osmembership__currency"><?php echo $config->currency_symbol; ?></span>
|
||||
<span class="mod-osmembership__amount"><?php echo number_format($plan->price, 2); ?></span>
|
||||
<?php if ($plan->subscription_length > 0) : ?>
|
||||
<span class="mod-osmembership__period">
|
||||
/ <?php echo $plan->subscription_length . ' ' . Text::_('OSM_' . strtoupper($plan->subscription_length_unit)); ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<div class="mod-osmembership__price mod-osmembership__price--free">
|
||||
<?php echo Text::_('OSM_FREE'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($params->get('show_features', 1) && !empty($plan->features)) : ?>
|
||||
<div class="mod-osmembership__features">
|
||||
<ul class="mod-osmembership__features-list">
|
||||
<?php foreach (explode("\n", $plan->features) as $feature) : ?>
|
||||
<?php if (trim($feature)) : ?>
|
||||
<li class="mod-osmembership__feature">
|
||||
<span class="icon-check" aria-hidden="true"></span>
|
||||
<?php echo htmlspecialchars(trim($feature), ENT_COMPAT, 'UTF-8'); ?>
|
||||
</li>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="mod-osmembership__actions">
|
||||
<a href="<?php echo $plan->link; ?>"
|
||||
class="mod-osmembership__btn btn btn-primary">
|
||||
<?php echo $params->get('button_text', Text::_('OSM_SUBSCRIBE')); ?>
|
||||
<span class="icon-chevron-right" aria-hidden="true"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
|
||||
<?php if ($params->get('show_all_plans_link', 1)) : ?>
|
||||
<div class="mod-osmembership__all-plans">
|
||||
<a href="<?php echo OSMembershipHelperRoute::getCategoriesRoute(); ?>"
|
||||
class="mod-osmembership__all-plans-link btn btn-secondary">
|
||||
<?php echo Text::_('OSM_VIEW_ALL_PLANS'); ?>
|
||||
</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php else : ?>
|
||||
<div class="mod-osmembership__empty">
|
||||
<p><?php echo Text::_('OSM_NO_PLANS_AVAILABLE'); ?></p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1,122 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package VirtueMart
|
||||
* @subpackage mod_virtuemart_cart
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for mod_virtuemart_cart module
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
// Load VirtueMart assets if not already loaded
|
||||
vmJsApi::js('fancybox/jquery.fancybox-1.3.4.pack');
|
||||
vmJsApi::css('jquery.fancybox-1.3.4');
|
||||
|
||||
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');
|
||||
$show_price = $params->get('show_price', 1);
|
||||
$show_product_list = $params->get('show_product_list', 1);
|
||||
|
||||
// Add responsive wrapper class
|
||||
$wrapperClass = 'mod-vm-cart mod-vm-cart-responsive ' . $moduleclass_sfx;
|
||||
?>
|
||||
|
||||
<div class="<?php echo $wrapperClass; ?>">
|
||||
<?php if (!empty($data->totalProduct) && $data->totalProduct > 0) : ?>
|
||||
<div class="mod-vm-cart__header">
|
||||
<span class="mod-vm-cart__icon" aria-hidden="true">
|
||||
<span class="icon-basket"></span>
|
||||
</span>
|
||||
<div class="mod-vm-cart__summary">
|
||||
<div class="mod-vm-cart__count">
|
||||
<?php echo $data->totalProduct; ?>
|
||||
<?php echo $data->totalProduct == 1 ? Text::_('MOD_VIRTUEMART_CART_ITEM') : Text::_('MOD_VIRTUEMART_CART_ITEMS'); ?>
|
||||
</div>
|
||||
<?php if ($show_price && !empty($data->billTotal)) : ?>
|
||||
<div class="mod-vm-cart__total">
|
||||
<?php echo $data->billTotal; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php if ($show_product_list && !empty($data->products)) : ?>
|
||||
<div class="mod-vm-cart__products">
|
||||
<?php foreach ($data->products as $product) : ?>
|
||||
<div class="mod-vm-cart__product">
|
||||
<?php if (!empty($product->image)) : ?>
|
||||
<div class="mod-vm-cart__product-image">
|
||||
<a href="<?php echo $product->url; ?>"
|
||||
title="<?php echo htmlspecialchars($product->product_name, ENT_COMPAT, 'UTF-8'); ?>">
|
||||
<?php echo $product->image; ?>
|
||||
</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="mod-vm-cart__product-details">
|
||||
<div class="mod-vm-cart__product-name">
|
||||
<a href="<?php echo $product->url; ?>">
|
||||
<?php echo htmlspecialchars($product->product_name, ENT_COMPAT, 'UTF-8'); ?>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="mod-vm-cart__product-quantity">
|
||||
<?php echo Text::_('MOD_VIRTUEMART_CART_QUANTITY'); ?>:
|
||||
<span class="mod-vm-cart__quantity-value"><?php echo $product->quantity; ?></span>
|
||||
</div>
|
||||
|
||||
<?php if ($show_price && !empty($product->prices)) : ?>
|
||||
<div class="mod-vm-cart__product-price">
|
||||
<?php echo $product->prices; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<?php if (!empty($product->delete_link)) : ?>
|
||||
<div class="mod-vm-cart__product-remove">
|
||||
<a href="<?php echo $product->delete_link; ?>"
|
||||
class="mod-vm-cart__remove-btn"
|
||||
title="<?php echo Text::_('MOD_VIRTUEMART_CART_DELETE'); ?>"
|
||||
aria-label="<?php echo Text::_('MOD_VIRTUEMART_CART_DELETE') . ' ' . htmlspecialchars($product->product_name, ENT_COMPAT, 'UTF-8'); ?>">
|
||||
<span class="icon-remove" aria-hidden="true"></span>
|
||||
</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="mod-vm-cart__actions">
|
||||
<?php if (!empty($data->cart_show)) : ?>
|
||||
<a href="<?php echo $data->cart_show; ?>"
|
||||
class="mod-vm-cart__btn mod-vm-cart__btn--view btn btn-secondary"
|
||||
title="<?php echo Text::_('MOD_VIRTUEMART_CART_SHOW'); ?>">
|
||||
<?php echo Text::_('MOD_VIRTUEMART_CART_SHOW'); ?>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($data->checkout_link)) : ?>
|
||||
<a href="<?php echo $data->checkout_link; ?>"
|
||||
class="mod-vm-cart__btn mod-vm-cart__btn--checkout btn btn-primary"
|
||||
title="<?php echo Text::_('MOD_VIRTUEMART_CART_CHECKOUT'); ?>">
|
||||
<?php echo Text::_('MOD_VIRTUEMART_CART_CHECKOUT'); ?>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<div class="mod-vm-cart__empty">
|
||||
<span class="mod-vm-cart__empty-icon" aria-hidden="true">
|
||||
<span class="icon-basket"></span>
|
||||
</span>
|
||||
<p class="mod-vm-cart__empty-text">
|
||||
<?php echo Text::_('MOD_VIRTUEMART_CART_EMPTY'); ?>
|
||||
</p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1,85 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package VirtueMart
|
||||
* @subpackage mod_virtuemart_category
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for mod_virtuemart_category module
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');
|
||||
$show_images = $params->get('show_images', 1);
|
||||
$show_description = $params->get('show_description', 0);
|
||||
$show_product_count = $params->get('show_product_count', 0);
|
||||
|
||||
// Add responsive wrapper class
|
||||
$wrapperClass = 'mod-vm-category mod-vm-category-responsive ' . $moduleclass_sfx;
|
||||
?>
|
||||
|
||||
<div class="<?php echo $wrapperClass; ?>">
|
||||
<?php if (!empty($categories)) : ?>
|
||||
<nav class="mod-vm-category__nav" aria-label="<?php echo Text::_('MOD_VIRTUEMART_CATEGORY_NAVIGATION'); ?>">
|
||||
<ul class="mod-vm-category__list">
|
||||
<?php foreach ($categories as $category) : ?>
|
||||
<li class="mod-vm-category__item <?php echo ($category->current) ? 'mod-vm-category__item--active' : ''; ?>">
|
||||
<a href="<?php echo $category->link; ?>"
|
||||
class="mod-vm-category__link <?php echo ($category->current) ? 'mod-vm-category__link--active' : ''; ?>"
|
||||
<?php echo ($category->current) ? 'aria-current="page"' : ''; ?>>
|
||||
|
||||
<?php if ($show_images && !empty($category->images[0])) : ?>
|
||||
<span class="mod-vm-category__image">
|
||||
<?php echo $category->images[0]->displayMediaThumb('', false); ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
|
||||
<span class="mod-vm-category__name">
|
||||
<?php echo htmlspecialchars($category->category_name, ENT_COMPAT, 'UTF-8'); ?>
|
||||
</span>
|
||||
|
||||
<?php if ($show_product_count && isset($category->product_count)) : ?>
|
||||
<span class="mod-vm-category__count">
|
||||
(<?php echo $category->product_count; ?>)
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</a>
|
||||
|
||||
<?php if ($show_description && !empty($category->category_description)) : ?>
|
||||
<div class="mod-vm-category__description">
|
||||
<?php echo shopFunctionsF::limitStringByWord($category->category_description, 50, '...'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($category->children)) : ?>
|
||||
<ul class="mod-vm-category__sublist">
|
||||
<?php foreach ($category->children as $child) : ?>
|
||||
<li class="mod-vm-category__subitem <?php echo ($child->current) ? 'mod-vm-category__subitem--active' : ''; ?>">
|
||||
<a href="<?php echo $child->link; ?>"
|
||||
class="mod-vm-category__sublink <?php echo ($child->current) ? 'mod-vm-category__sublink--active' : ''; ?>"
|
||||
<?php echo ($child->current) ? 'aria-current="page"' : ''; ?>>
|
||||
<?php echo htmlspecialchars($child->category_name, ENT_COMPAT, 'UTF-8'); ?>
|
||||
<?php if ($show_product_count && isset($child->product_count)) : ?>
|
||||
<span class="mod-vm-category__count">
|
||||
(<?php echo $child->product_count; ?>)
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</a>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
<?php endif; ?>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</nav>
|
||||
<?php else : ?>
|
||||
<div class="mod-vm-category__empty">
|
||||
<p><?php echo Text::_('MOD_VIRTUEMART_CATEGORY_NO_CATEGORIES'); ?></p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1,72 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package VirtueMart
|
||||
* @subpackage mod_virtuemart_currencies
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for mod_virtuemart_currencies module
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');
|
||||
$text_before = $params->get('text_before', '');
|
||||
$text_after = $params->get('text_after', '');
|
||||
|
||||
// Add responsive wrapper class
|
||||
$wrapperClass = 'mod-vm-currencies mod-vm-currencies-responsive ' . $moduleclass_sfx;
|
||||
?>
|
||||
|
||||
<div class="<?php echo $wrapperClass; ?>">
|
||||
<?php if ($text_before) : ?>
|
||||
<div class="mod-vm-currencies__text-before">
|
||||
<?php echo $text_before; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<form action="<?php echo $action; ?>" method="post" id="currency_form_<?php echo $module->id; ?>" class="mod-vm-currencies__form">
|
||||
<label for="virtuemart_currency_id_<?php echo $module->id; ?>" class="mod-vm-currencies__label">
|
||||
<?php echo Text::_('MOD_VIRTUEMART_CURRENCIES_SELECT'); ?>
|
||||
</label>
|
||||
|
||||
<div class="mod-vm-currencies__select-wrapper">
|
||||
<select
|
||||
name="virtuemart_currency_id"
|
||||
id="virtuemart_currency_id_<?php echo $module->id; ?>"
|
||||
class="mod-vm-currencies__select form-select"
|
||||
onchange="document.getElementById('currency_form_<?php echo $module->id; ?>').submit();"
|
||||
aria-label="<?php echo Text::_('MOD_VIRTUEMART_CURRENCIES_SELECT'); ?>">
|
||||
<?php foreach ($currencies as $currency) : ?>
|
||||
<option
|
||||
value="<?php echo $currency->virtuemart_currency_id; ?>"
|
||||
<?php echo ($currency->virtuemart_currency_id == $virtuemart_currency_id) ? 'selected="selected"' : ''; ?>>
|
||||
<?php echo $currency->currency_name; ?> (<?php echo $currency->currency_code_3; ?>)
|
||||
</option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<span class="mod-vm-currencies__icon" aria-hidden="true">
|
||||
<span class="icon-chevron-down"></span>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<noscript>
|
||||
<button type="submit" class="mod-vm-currencies__submit btn btn-primary">
|
||||
<?php echo Text::_('MOD_VIRTUEMART_CURRENCIES_CHANGE'); ?>
|
||||
</button>
|
||||
</noscript>
|
||||
|
||||
<input type="hidden" name="option" value="com_virtuemart" />
|
||||
<input type="hidden" name="view" value="user" />
|
||||
<input type="hidden" name="task" value="setcurrency" />
|
||||
</form>
|
||||
|
||||
<?php if ($text_after) : ?>
|
||||
<div class="mod-vm-currencies__text-after">
|
||||
<?php echo $text_after; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1,59 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package VirtueMart
|
||||
* @subpackage mod_virtuemart_manufacturer
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for mod_virtuemart_manufacturer module
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');
|
||||
$show_images = $params->get('show_images', 1);
|
||||
$display_style = $params->get('display_style', 'list');
|
||||
|
||||
// Add responsive wrapper class
|
||||
$wrapperClass = 'mod-vm-manufacturer mod-vm-manufacturer-responsive ' . $moduleclass_sfx;
|
||||
?>
|
||||
|
||||
<div class="<?php echo $wrapperClass; ?>">
|
||||
<?php if (!empty($manufacturers)) : ?>
|
||||
<div class="mod-vm-manufacturer__container mod-vm-manufacturer__container--<?php echo $display_style; ?>">
|
||||
<?php foreach ($manufacturers as $manufacturer) : ?>
|
||||
<div class="mod-vm-manufacturer__item">
|
||||
<a href="<?php echo $manufacturer->link; ?>"
|
||||
class="mod-vm-manufacturer__link"
|
||||
title="<?php echo htmlspecialchars($manufacturer->mf_name, ENT_COMPAT, 'UTF-8'); ?>">
|
||||
|
||||
<?php if ($show_images && !empty($manufacturer->images[0])) : ?>
|
||||
<div class="mod-vm-manufacturer__image">
|
||||
<?php echo $manufacturer->images[0]->displayMediaThumb('', false); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="mod-vm-manufacturer__content">
|
||||
<span class="mod-vm-manufacturer__name">
|
||||
<?php echo htmlspecialchars($manufacturer->mf_name, ENT_COMPAT, 'UTF-8'); ?>
|
||||
</span>
|
||||
|
||||
<?php if (!empty($manufacturer->mf_desc)) : ?>
|
||||
<div class="mod-vm-manufacturer__description">
|
||||
<?php echo shopFunctionsF::limitStringByWord($manufacturer->mf_desc, 30, '...'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<div class="mod-vm-manufacturer__empty">
|
||||
<p><?php echo Text::_('MOD_VIRTUEMART_MANUFACTURER_NO_MANUFACTURERS'); ?></p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><html><head><title></title></head><body></body></html>
|
||||
@@ -1,93 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @package VirtueMart
|
||||
* @subpackage mod_virtuemart_product
|
||||
*
|
||||
* @copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Mobile responsive override for mod_virtuemart_product module
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
|
||||
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');
|
||||
$headerText = $params->get('headerText', '');
|
||||
$headerText = HTMLHelper::_('content.prepare', $headerText);
|
||||
$display_style = $params->get('display_style', 'div');
|
||||
|
||||
// Add responsive wrapper class
|
||||
$wrapperClass = 'mod-vm-product mod-vm-product-responsive ' . $moduleclass_sfx;
|
||||
?>
|
||||
|
||||
<div class="<?php echo $wrapperClass; ?>">
|
||||
<?php if ($headerText) : ?>
|
||||
<div class="mod-vm-product__header">
|
||||
<?php echo $headerText; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($products)) : ?>
|
||||
<div class="mod-vm-product__list mod-vm-product__list--<?php echo $display_style; ?>">
|
||||
<?php foreach ($products as $product) : ?>
|
||||
<div class="mod-vm-product__item">
|
||||
<?php if (!empty($product->images[0])) : ?>
|
||||
<div class="mod-vm-product__image">
|
||||
<a href="<?php echo $product->link; ?>"
|
||||
title="<?php echo htmlspecialchars($product->product_name, ENT_COMPAT, 'UTF-8'); ?>">
|
||||
<?php echo $product->images[0]->displayMediaThumb('', false); ?>
|
||||
</a>
|
||||
|
||||
<?php if (!empty($product->product_availability)) : ?>
|
||||
<span class="mod-vm-product__availability">
|
||||
<?php echo $product->product_availability; ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="mod-vm-product__content">
|
||||
<h3 class="mod-vm-product__title">
|
||||
<a href="<?php echo $product->link; ?>">
|
||||
<?php echo htmlspecialchars($product->product_name, ENT_COMPAT, 'UTF-8'); ?>
|
||||
</a>
|
||||
</h3>
|
||||
|
||||
<?php if (!empty($product->product_s_desc)) : ?>
|
||||
<div class="mod-vm-product__description">
|
||||
<?php echo shopFunctionsF::limitStringByWord($product->product_s_desc, 60, '...'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($product->prices)) : ?>
|
||||
<div class="mod-vm-product__price">
|
||||
<?php echo $product->prices; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="mod-vm-product__actions">
|
||||
<a href="<?php echo $product->link; ?>"
|
||||
class="mod-vm-product__btn mod-vm-product__btn--view btn btn-secondary"
|
||||
title="<?php echo Text::_('MOD_VIRTUEMART_PRODUCT_DETAILS'); ?>">
|
||||
<?php echo Text::_('MOD_VIRTUEMART_PRODUCT_DETAILS'); ?>
|
||||
</a>
|
||||
|
||||
<?php if (!empty($product->form)) : ?>
|
||||
<div class="mod-vm-product__form">
|
||||
<?php echo $product->form; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<div class="mod-vm-product__empty">
|
||||
<p><?php echo Text::_('MOD_VIRTUEMART_PRODUCT_NO_PRODUCTS'); ?></p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@@ -1,95 +0,0 @@
|
||||
<!-- Copyright (C) 2025 Moko Consulting <jmiller@mokoconsulting.tech>
|
||||
|
||||
This file is part of a Moko Consulting project.
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
# FILE INFORMATION
|
||||
DEFGROUP: Joomla.Templates.Site
|
||||
INGROUP: MokoCassiopeia
|
||||
FILE: index.html
|
||||
BRIEF: Security redirect page to block folder access and forward to site root.
|
||||
-->
|
||||
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>Redirecting…</title>
|
||||
|
||||
<!-- Search engines: do not index this placeholder redirect page -->
|
||||
<meta name="robots" content="noindex, nofollow, noarchive" />
|
||||
|
||||
<!-- Instant redirect fallback even if JavaScript is disabled -->
|
||||
<meta http-equiv="refresh" content="0; url=/" />
|
||||
|
||||
<!-- Canonical root reference -->
|
||||
<link rel="canonical" href="/" />
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<script>
|
||||
|
||||
(function redirectToRoot() {
|
||||
// Configuration object with safe defaults.
|
||||
var opts = {
|
||||
fallbackPath: "/", // string: fallback destination if origin is unavailable
|
||||
delayMs: 0, // number: delay before redirect in ms (0 = immediate)
|
||||
behavior: "replace" // enum: "replace" | "assign"
|
||||
};
|
||||
|
||||
// Determine absolute origin in all mainstream browsers.
|
||||
var origin = (typeof location.origin === "string" && location.origin)
|
||||
|| (location.protocol + "//" + location.host);
|
||||
|
||||
// Final destination: absolute root of the current site, or fallback path.
|
||||
var destination = origin ? origin + "/" : opts.fallbackPath;
|
||||
|
||||
function go() {
|
||||
if (opts.behavior === "assign") {
|
||||
location.assign(destination);
|
||||
} else {
|
||||
location.replace(destination);
|
||||
}
|
||||
}
|
||||
|
||||
// Execute redirect, optionally after a short delay.
|
||||
if (opts.delayMs > 0) {
|
||||
setTimeout(go, opts.delayMs);
|
||||
} else {
|
||||
go();
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
|
||||
<!--
|
||||
Secondary meta-refresh for no-JS environments is already set above.
|
||||
Some very old crawlers may ignore JS; the meta refresh ensures coverage.
|
||||
-->
|
||||
|
||||
<noscript>
|
||||
<!-- Extra defense-in-depth: if JS is disabled, meta refresh (above) handles redirect. -->
|
||||
<style>
|
||||
html, body { height:100%; }
|
||||
body { display:flex; align-items:center; justify-content:center; margin:0; font: 16px/1.4 system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif; }
|
||||
.msg { opacity: .75; text-align: center; }
|
||||
</style>
|
||||
</noscript>
|
||||
</head>
|
||||
<body>
|
||||
<div class="msg">Redirecting to the site root… If you are not redirected, <a href="/">click here</a>.</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,552 +0,0 @@
|
||||
<?php
|
||||
/* Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
|
||||
This file is part of a Moko Consulting project.
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
# FILE INFORMATION
|
||||
DEFGROUP: Joomla.Template.Site
|
||||
INGROUP: MokoCassiopeia
|
||||
REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia
|
||||
PATH: ./templates/mokocassiopeia/index.php
|
||||
VERSION: 03.06.02
|
||||
BRIEF: Main template index file for MokoCassiopeia rendering site layout
|
||||
*/
|
||||
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Uri\Uri;
|
||||
use Joomla\CMS\Component\ComponentHelper;
|
||||
|
||||
/** @var Joomla\CMS\Document\HtmlDocument $this */
|
||||
|
||||
$app = Factory::getApplication();
|
||||
$input = $app->getInput();
|
||||
$document = $app->getDocument();
|
||||
$wa = $document->getWebAssetManager();
|
||||
|
||||
// Template params
|
||||
$params_LightColorName = (string) $this->params->get('colorLightName', 'colors_standard'); // colors_standard|colors_alternative|colors_custom
|
||||
|
||||
$params_DarkColorName = (string) $this->params->get('colorDarkName', 'colors_standard'); // colors_standard|colors_alternative|colors_custom
|
||||
|
||||
$params_googletagmanager = $this->params->get('googletagmanager', false);
|
||||
$params_googletagmanagerid = $this->params->get('googletagmanagerid', null);
|
||||
$params_googleanalytics = $this->params->get('googleanalytics', false);
|
||||
$params_googleanalyticsid = $this->params->get('googleanalyticsid', null);
|
||||
$params_custom_head_start = $this->params->get('custom_head_start', null);
|
||||
$params_custom_head_end = $this->params->get('custom_head_end', null);
|
||||
$params_developmentmode = $this->params->get('developmentmode', false);
|
||||
|
||||
// Theme params
|
||||
$params_theme_enabled = $this->params->get('theme_enabled', 1);
|
||||
$params_theme_fab_enabled = $this->params->get('theme_fab_enabled', 1);
|
||||
$params_theme_fab_pos = $this->params->get('theme_fab_pos', 'br');
|
||||
|
||||
// Detecting Active Variables
|
||||
$option = $input->getCmd('option', '');
|
||||
$view = $input->getCmd('view', '');
|
||||
$layout = $input->getCmd('layout', '');
|
||||
$task = $input->getCmd('task', '');
|
||||
$itemid = $input->getCmd('Itemid', '');
|
||||
$sitenameR = $app->get('sitename'); // raw for title composition
|
||||
$sitename = htmlspecialchars($sitenameR, ENT_QUOTES, 'UTF-8');
|
||||
$menu = $app->getMenu()->getActive();
|
||||
$pageclass = $menu !== null ? $menu->getParams()->get('pageclass_sfx', '') : '';
|
||||
|
||||
// Respect “Site Name in Page Titles” (0:none, 1:before, 2:after)
|
||||
$mode = (int) $app->get('sitename_pagetitles', 0);
|
||||
$pageTitle = trim($this->getTitle());
|
||||
$final = $pageTitle !== ''
|
||||
? ($mode === 1 ? $sitenameR . ' - ' . $pageTitle
|
||||
: ($mode === 2 ? $pageTitle . ' - ' . $sitenameR : $pageTitle))
|
||||
: $sitenameR;
|
||||
$this->setTitle($final);
|
||||
|
||||
// Template/Media path
|
||||
$templatePath = 'media/templates/site/mokocassiopeia';
|
||||
|
||||
// Core template CSS
|
||||
$wa->useStyle('template.base'); // css/template.css
|
||||
|
||||
// Color theme (light + optional dark)
|
||||
$colorLightKey = strtolower(preg_replace('/[^a-z0-9_.-]/i', '', $params_LightColorName));
|
||||
$colorDarkKey = strtolower(preg_replace('/[^a-z0-9_.-]/i', '', $params_DarkColorName));
|
||||
$lightKey = 'template.light.' . $colorLightKey;
|
||||
$darkKey = 'template.dark.' . $colorDarkKey;
|
||||
|
||||
try {
|
||||
$wa->useStyle('template.light.colors_standard');
|
||||
} catch (\Throwable $e) {
|
||||
$wa->registerAndUseStyle('template.light.colors_standard', $templatePath . '/css/colors/light/colors_standard.css');
|
||||
}
|
||||
|
||||
try {
|
||||
$wa->useStyle('template.dark.colors_standard');
|
||||
} catch (\Throwable $e) {
|
||||
$wa->registerAndUseStyle('template.dark.colors_standard', $templatePath . '/css/colors/dark/colors_standard.css');
|
||||
}
|
||||
|
||||
try {
|
||||
$wa->useStyle($lightKey);
|
||||
} catch (\Throwable $e) {
|
||||
$wa->registerAndUseStyle('template.light.dynamic', $templatePath . '/css/colors/light/' . $colorLightKey . '.css');
|
||||
}
|
||||
|
||||
try {
|
||||
$wa->useStyle($darkKey);
|
||||
} catch (\Throwable $e) {
|
||||
$wa->registerAndUseStyle('template.dark.dynamic', $templatePath . '/css/colors/dark/' . $colorDarkKey . '.css');
|
||||
}
|
||||
|
||||
// Scripts
|
||||
$wa->useScript('template.js');
|
||||
|
||||
// Load Osaka font for site title
|
||||
$wa->useStyle('template.font.osaka');
|
||||
|
||||
// Load GTM script if GTM is enabled
|
||||
if (!empty($params_googletagmanager) && !empty($params_googletagmanagerid)) {
|
||||
$wa->useScript('gtm.js');
|
||||
}
|
||||
|
||||
/**
|
||||
* VirtueMart detection:
|
||||
* - Component must exist and be enabled
|
||||
*/
|
||||
$isVirtueMartActive = ComponentHelper::isEnabled('com_virtuemart', true);
|
||||
|
||||
if ($isVirtueMartActive) {
|
||||
/**
|
||||
* Load a VirtueMart-specific stylesheet defined in your template manifest.
|
||||
* This assumes you defined an asset named "template.virtuemart".
|
||||
*/
|
||||
$wa->useStyle('vendor.vm');
|
||||
}
|
||||
|
||||
// Font scheme (external or local) + CSS custom properties
|
||||
$params_FontScheme = $this->params->get('useFontScheme', false);
|
||||
$fontStyles = '';
|
||||
|
||||
if ($params_FontScheme) {
|
||||
if (stripos($params_FontScheme, 'https://') === 0) {
|
||||
$this->getPreloadManager()->preconnect('https://fonts.googleapis.com/', ['crossorigin' => 'anonymous']);
|
||||
$this->getPreloadManager()->preconnect('https://fonts.gstatic.com/', ['crossorigin' => 'anonymous']);
|
||||
$this->getPreloadManager()->preload($params_FontScheme, ['as' => 'style', 'crossorigin' => 'anonymous']);
|
||||
$wa->registerAndUseStyle('fontscheme.current', $params_FontScheme, [], [
|
||||
'media' => 'print',
|
||||
'rel' => 'lazy-stylesheet',
|
||||
'onload' => 'this.media=\'all\'',
|
||||
'crossorigin' => 'anonymous'
|
||||
]);
|
||||
|
||||
if (preg_match_all('/family=([^?:]*):/i', $params_FontScheme, $matches) > 0) {
|
||||
$fontStyles = '--font-family-body: "' . str_replace('+', ' ', $matches[1][0]) . '", sans-serif;' . "\n";
|
||||
$fontStyles .= '--font-family-headings: "' . str_replace('+', ' ', isset($matches[1][1]) ? $matches[1][1] : $matches[1][0]) . '", sans-serif;' . "\n";
|
||||
$fontStyles .= '--font-weight-normal: 400;' . "\n";
|
||||
$fontStyles .= '--font-weight-headings: 700;';
|
||||
}
|
||||
} else {
|
||||
$wa->registerAndUseStyle('fontscheme.current', $params_FontScheme, ['version' => 'auto'], [
|
||||
'media' => 'print',
|
||||
'rel' => 'lazy-stylesheet',
|
||||
'onload' => 'this.media=\'all\''
|
||||
]);
|
||||
$this->getPreloadManager()->preload(
|
||||
$wa->getAsset('style', 'fontscheme.current')->getUri() . '?' . $this->getMediaVersion(),
|
||||
['as' => 'style']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------------
|
||||
// Brand: logo from params OR siteTitle
|
||||
// -------------------------------------
|
||||
$brandHtml = '';
|
||||
$logoFile = (string) $this->params->get('logoFile');
|
||||
|
||||
if ($logoFile !== '') {
|
||||
$brandHtml = HTMLHelper::_(
|
||||
'image',
|
||||
Uri::root(false) . htmlspecialchars($logoFile, ENT_QUOTES, 'UTF-8'),
|
||||
$sitename,
|
||||
['class' => 'logo d-inline-block', 'loading' => 'eager', 'decoding' => 'async'],
|
||||
false,
|
||||
0
|
||||
);
|
||||
} else {
|
||||
// If no logo file, show the title (defaults to "MokoCassiopeia" if not set)
|
||||
$siteTitle = $this->params->get('siteTitle', 'MokoCassiopeia');
|
||||
$brandHtml = '<span class="site-title" title="' . $sitename . '">'
|
||||
. htmlspecialchars($siteTitle, ENT_COMPAT, 'UTF-8')
|
||||
. '</span>';
|
||||
}
|
||||
|
||||
// Layout flags
|
||||
$hasClass = '';
|
||||
if ($this->countModules('sidebar-left', true)) { $hasClass .= ' has-sidebar-left'; }
|
||||
if ($this->countModules('sidebar-right', true)) { $hasClass .= ' has-sidebar-right'; }
|
||||
if ($this->countModules('drawer-left', true)) { $hasClass .= ' has-drawer-left'; }
|
||||
if ($this->countModules('drawer-right', true)) { $hasClass .= ' has-drawer-right'; }
|
||||
|
||||
// Smart Bootstrap component loading - only load what's needed
|
||||
if ($this->countModules('drawer-left', true) || $this->countModules('drawer-right', true)) {
|
||||
// Load Bootstrap Offcanvas component for drawers
|
||||
HTMLHelper::_('bootstrap.offcanvas');
|
||||
}
|
||||
|
||||
// Container
|
||||
$wrapper = $this->params->get('fluidContainer') ? 'wrapper-fluid' : 'wrapper-static';
|
||||
$stickyHeader = $this->params->get('stickyHeader') ? 'position-sticky sticky-top' : '';
|
||||
|
||||
// Meta
|
||||
$this->setMetaData('viewport', 'width=device-width, initial-scale=1');
|
||||
|
||||
if ($this->params->get('fA6KitCode')) {
|
||||
$faKit = "https://kit.fontawesome.com/" . $this->params->get('fA6KitCode') . ".js";
|
||||
HTMLHelper::_('script', $faKit, ['crossorigin' => 'anonymous']);
|
||||
} else {
|
||||
try {
|
||||
if($params_developmentmode){
|
||||
$wa->useStyle('vendor.fa7free.all');
|
||||
$wa->useStyle('vendor.fa7free.brands');
|
||||
$wa->useStyle('vendor.fa7free.fontawesome');
|
||||
$wa->useStyle('vendor.fa7free.regular');
|
||||
$wa->useStyle('vendor.fa7free.solid');
|
||||
} else {
|
||||
$wa->useStyle('vendor.fa7free.all.min');
|
||||
$wa->useStyle('vendor.fa7free.brands.min');
|
||||
$wa->useStyle('vendor.fa7free.fontawesome.min');
|
||||
$wa->useStyle('vendor.fa7free.regular.min');
|
||||
$wa->useStyle('vendor.fa7free.solid.min');
|
||||
}
|
||||
} catch (\Throwable $e) {
|
||||
if($params_developmentmode){
|
||||
$wa->registerAndUseStyle('vendor.fa7free.all.dynamic', $templatePath . '/vendor/fa7free/css/all.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.brands.dynamic', $templatePath . '/vendor/fa7free/css/brands.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.fontawesome.dynamic', $templatePath . '/vendor/fa7free/css/fontawesome.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.regular.dynamic', $templatePath . '/vendor/fa7free/css/regular.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.solid.dynamic', $templatePath . '/vendor/fa7free/css/solid.css');
|
||||
} else {
|
||||
$wa->registerAndUseStyle('vendor.fa7free.all.min.dynamic', $templatePath . '/vendor/fa7free/css/all.min.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.brands.min.dynamic', $templatePath . '/vendor/fa7free/css/brands.min.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.fontawesome.min.dynamic', $templatePath . '/vendor/fa7free/css/fontawesome.min.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.regular.min.dynamic', $templatePath . '/vendor/fa7free/css/regular.min.css');
|
||||
$wa->registerAndUseStyle('vendor.fa7free.solid.min.dynamic', $templatePath . '/vendor/fa7free/css/solid.min.css');
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
$params_leftIcon = htmlspecialchars($this->params->get('drawerLeftIcon', 'fa-solid fa-chevron-left'), ENT_COMPAT, 'UTF-8');
|
||||
$params_rightIcon = htmlspecialchars($this->params->get('drawerRightIcon', 'fa-solid fa-chevron-right'), ENT_COMPAT, 'UTF-8');
|
||||
|
||||
$wa->useStyle('template.user'); // css/user.css
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
|
||||
<head>
|
||||
<?php if (trim($params_custom_head_start)) : ?><?php echo $params_custom_head_start; ?><?php endif; ?>
|
||||
<jdoc:include type="head" />
|
||||
|
||||
<?php if ($params_theme_enabled) : ?>
|
||||
<script>
|
||||
// Early theme application to avoid FOUC
|
||||
(function () {
|
||||
try {
|
||||
var stored = localStorage.getItem('theme');
|
||||
var prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
||||
var theme = stored ? stored : (prefersDark ? 'dark' : 'light');
|
||||
document.documentElement.setAttribute('data-bs-theme', theme);
|
||||
document.documentElement.setAttribute('data-aria-theme', theme);
|
||||
} catch (e) {}
|
||||
})();
|
||||
</script>
|
||||
<?php endif; ?>
|
||||
|
||||
<script>
|
||||
// Facebook in-app browser warning banner
|
||||
window.addEventListener('DOMContentLoaded', function () {
|
||||
var ua = navigator.userAgent || navigator.vendor || window.opera;
|
||||
var isFacebookBrowser = ua.indexOf('FBAN') > -1 || ua.indexOf('FBAV') > -1;
|
||||
if (isFacebookBrowser) {
|
||||
var warning = document.createElement('div');
|
||||
warning.textContent = '⚠️ KNOWN ISSUE: Images do not load in Facebook Web browser. Please open in external browser for full experience.';
|
||||
warning.style.position = 'fixed';
|
||||
warning.style.top = '0';
|
||||
warning.style.left = '0';
|
||||
warning.style.right = '0';
|
||||
warning.style.zIndex = '10000';
|
||||
warning.style.backgroundColor = '#007bff';
|
||||
warning.style.color = '#fff';
|
||||
warning.style.padding = '15px';
|
||||
warning.style.textAlign = 'center';
|
||||
warning.style.fontWeight = 'bold';
|
||||
warning.style.fontSize = '16px';
|
||||
warning.style.boxShadow = '0 2px 5px rgba(0,0,0,0.2)';
|
||||
document.body.appendChild(warning);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<?php if (trim($params_custom_head_end)) : ?><?php echo $params_custom_head_end; ?><?php endif; ?>
|
||||
</head>
|
||||
<body data-bs-spy="scroll" data-bs-target="#toc"
|
||||
data-theme-fab-enabled="<?php echo $params_theme_fab_enabled ? '1' : '0'; ?>"
|
||||
data-theme-fab-pos="<?php echo htmlspecialchars($params_theme_fab_pos, ENT_QUOTES, 'UTF-8'); ?>"
|
||||
class="site <?php
|
||||
echo $option . ' ' . $wrapper
|
||||
. ' view-' . $view
|
||||
. ($layout ? ' layout-' . $layout : ' no-layout')
|
||||
. ($task ? ' task-' . $task : ' no-task')
|
||||
. ($itemid ? ' itemid-' . $itemid : '')
|
||||
. ($pageclass ? ' ' . $pageclass : '')
|
||||
. $hasClass
|
||||
. ($this->direction == 'rtl' ? ' rtl' : '');
|
||||
?>">
|
||||
<?php if (!empty($params_googletagmanager) && !empty($params_googletagmanagerid)) :
|
||||
$gtmID = htmlspecialchars($params_googletagmanagerid, ENT_QUOTES, 'UTF-8'); ?>
|
||||
<!-- Google Tag Manager -->
|
||||
<script>
|
||||
(function(w,d,s,l,i){
|
||||
w[l]=w[l]||[];
|
||||
w[l].push({'gtm.start': new Date().getTime(), event:'gtm.js'});
|
||||
var f=d.getElementsByTagName(s)[0],
|
||||
j=d.createElement(s),
|
||||
dl=l!='dataLayer'?'&l='+l:'';
|
||||
j.async=true;
|
||||
j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;
|
||||
f.parentNode.insertBefore(j,f);
|
||||
})(window,document,'script','dataLayer','<?php echo $gtmID; ?>');
|
||||
</script>
|
||||
<!-- End Google Tag Manager -->
|
||||
|
||||
<!-- Google Tag Manager (noscript) -->
|
||||
<noscript>
|
||||
<iframe src="https://www.googletagmanager.com/ns.html?id=<?php echo $gtmID; ?>"
|
||||
height="0" width="0" style="display:none;visibility:hidden"></iframe>
|
||||
</noscript>
|
||||
<!-- End Google Tag Manager (noscript) -->
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($params_googleanalytics) && !empty($params_googleanalyticsid)) :
|
||||
$gaId = htmlspecialchars($params_googleanalyticsid, ENT_QUOTES, 'UTF-8'); ?>
|
||||
<!-- Google Analytics (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=<?php echo $gaId; ?>"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
gtag('consent', 'default', {
|
||||
'ad_storage': 'denied',
|
||||
'analytics_storage': 'granted',
|
||||
'ad_user_data': 'denied',
|
||||
'ad_personalization': 'denied'
|
||||
});
|
||||
(function(id){
|
||||
if (/^G-/.test(id)) {
|
||||
gtag('config', id, { 'anonymize_ip': true });
|
||||
} else if (/^UA-/.test(id)) {
|
||||
gtag('config', id, { 'anonymize_ip': true });
|
||||
console.warn('Using a UA- ID. Universal Analytics is sunset; consider migrating to GA4.');
|
||||
} else {
|
||||
console.warn('Unrecognized Google Analytics ID format:', id);
|
||||
}
|
||||
})('<?php echo $gaId; ?>');
|
||||
</script>
|
||||
<!-- End Google Analytics -->
|
||||
<?php endif; ?>
|
||||
|
||||
<header class="header container-header full-width<?php echo $stickyHeader ? ' ' . $stickyHeader : ''; ?>" role="banner">
|
||||
|
||||
<?php if ($this->countModules('topbar')) : ?>
|
||||
<div class="container-topbar">
|
||||
<jdoc:include type="modules" name="topbar" style="none" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="header-top">
|
||||
<?php if ($this->countModules('below-topbar')) : ?>
|
||||
<div class="grid-child container-below-topbar">
|
||||
<jdoc:include type="modules" name="below-topbar" style="none" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->params->get('brand', 1)) : ?>
|
||||
<div class="grid-child">
|
||||
<div class="navbar-brand">
|
||||
<a class="brand-logo" href="<?php echo $this->baseurl; ?>/">
|
||||
<?php echo $brandHtml; ?>
|
||||
</a>
|
||||
<?php if ($this->params->get('siteDescription')) : ?>
|
||||
<div class="site-description">
|
||||
<?php echo htmlspecialchars($this->params->get('siteDescription'), ENT_QUOTES, 'UTF-8'); ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->countModules('below-logo')) : ?>
|
||||
<div class="grid container-below-logo">
|
||||
<jdoc:include type="modules" name="below-logo" style="none" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<!-- Drawer Toggle Buttons -->
|
||||
<?php if ($this->countModules('drawer-left')) : ?>
|
||||
<button class="drawer-toggle-left btn btn-outline-secondary me-2"
|
||||
type="button"
|
||||
data-bs-toggle="offcanvas"
|
||||
data-bs-target="#drawer-left"
|
||||
aria-controls="drawer-left">
|
||||
<span class="<?php echo $params_leftIcon; ?>"></span>
|
||||
</button>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->countModules('drawer-right')) : ?>
|
||||
<button class="drawer-toggle-right btn btn-outline-secondary"
|
||||
type="button"
|
||||
data-bs-toggle="offcanvas"
|
||||
data-bs-target="#drawer-right"
|
||||
aria-controls="drawer-right">
|
||||
<span class="<?php echo $params_rightIcon; ?>"></span>
|
||||
</button>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->countModules('menu', true) || $this->countModules('search', true)) : ?>
|
||||
<div class="grid-child container-nav">
|
||||
<?php if ($this->countModules('menu', true)) : ?>
|
||||
<nav role="navigation" aria-label="Primary">
|
||||
<jdoc:include type="modules" name="menu" style="none" />
|
||||
</nav>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->countModules('search', true)) : ?>
|
||||
<div class="container-search">
|
||||
<jdoc:include type="modules" name="search" style="none" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</header>
|
||||
|
||||
<div class="site-grid">
|
||||
<?php if ($this->countModules('banner', true)) : ?>
|
||||
<div class="container-banner full-width">
|
||||
<jdoc:include type="modules" name="banner" style="none" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->countModules('top-a', true)) : ?>
|
||||
<div class="grid-child container-top-a">
|
||||
<jdoc:include type="modules" name="top-a" style="card" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->countModules('top-b', true)) : ?>
|
||||
<div class="grid-child container-top-b">
|
||||
<jdoc:include type="modules" name="top-b" style="card" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->countModules('sidebar-left', true)) : ?>
|
||||
<div class="grid-child container-sidebar-left">
|
||||
<jdoc:include type="modules" name="sidebar-left" style="card" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="grid-child container-component">
|
||||
<jdoc:include type="modules" name="breadcrumbs" style="none" />
|
||||
<jdoc:include type="modules" name="main-top" style="card" />
|
||||
<jdoc:include type="message" />
|
||||
<main id="maincontent" role="main">
|
||||
<jdoc:include type="component" />
|
||||
</main>
|
||||
<jdoc:include type="modules" name="main-bottom" style="card" />
|
||||
</div>
|
||||
|
||||
<?php if ($this->countModules('sidebar-right', true)) : ?>
|
||||
<div class="grid-child container-sidebar-right">
|
||||
<jdoc:include type="modules" name="sidebar-right" style="card" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->countModules('bottom-a', true)) : ?>
|
||||
<div class="grid-child container-bottom-a">
|
||||
<jdoc:include type="modules" name="bottom-a" style="card" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->countModules('bottom-b', true)) : ?>
|
||||
<div class="grid-child container-bottom-b">
|
||||
<jdoc:include type="modules" name="bottom-b" style="card" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<footer class="container-footer footer full-width">
|
||||
<?php if ($this->countModules('footer-menu', true)) : ?>
|
||||
<div class="grid-child footer-menu">
|
||||
<jdoc:include type="modules" name="footer-menu" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->countModules('footer', true)) : ?>
|
||||
<div class="grid-child">
|
||||
<jdoc:include type="modules" name="footer" style="none" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</footer>
|
||||
|
||||
<?php if ($this->params->get('backTop') == 1) : ?>
|
||||
<a href="#top" id="back-top" class="back-to-top-link" aria-label="<?php echo Text::_('TPL_MOKOCASSIOPEIA_BACKTOTOP'); ?>">
|
||||
<span class="icon-arrow-up icon-fw" aria-hidden="true"></span>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->countModules('drawer-left', true)) : ?>
|
||||
<!-- Left Offcanvas Drawer -->
|
||||
<aside class="offcanvas offcanvas-start" tabindex="-1" id="drawer-left">
|
||||
<div class="offcanvas-header">
|
||||
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="<?php echo Text::_('JLIB_HTML_BEHAVIOR_CLOSE'); ?>"></button>
|
||||
</div>
|
||||
<div class="offcanvas-body">
|
||||
<jdoc:include type="modules" name="drawer-left" style="none" />
|
||||
</div>
|
||||
</aside>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($this->countModules('drawer-right', true)) : ?>
|
||||
<!-- Right Offcanvas Drawer -->
|
||||
<aside class="offcanvas offcanvas-end" tabindex="-1" id="drawer-right">
|
||||
<div class="offcanvas-header">
|
||||
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="<?php echo Text::_('JLIB_HTML_BEHAVIOR_CLOSE'); ?>"></button>
|
||||
</div>
|
||||
<div class="offcanvas-body">
|
||||
<jdoc:include type="modules" name="drawer-right" style="none" />
|
||||
</div>
|
||||
</aside>
|
||||
<?php endif; ?>
|
||||
|
||||
<jdoc:include type="modules" name="debug" style="none" />
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,229 +0,0 @@
|
||||
{
|
||||
"$schema": "https://developer.joomla.org/schemas/json-schema/web_assets.json",
|
||||
"name": "mokocassiopeia",
|
||||
"description": "MokoCassiopeia template assets",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"x-header": {
|
||||
"copyright_year": 2026,
|
||||
"author": "Jonathan Miller",
|
||||
"owner": "Moko Consulting",
|
||||
"contact": "hello@mokoconsulting.tech",
|
||||
"project": "MokoCassiopeia Template",
|
||||
"spdx_license": "GPL-3.0-or-later",
|
||||
"notice": "This file is part of a Moko Consulting project.",
|
||||
"disclaimer": "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.",
|
||||
"repo": "https://github.com/mokoconsulting-tech/MokoCassiopeia",
|
||||
"file_information": {
|
||||
"defgroup": "Joomla.Template.Site",
|
||||
"ingroup": "MokoCassiopeia.Template.Assets",
|
||||
"path": "./media/templates/site/mokocassiopeia/joomla.asset.json",
|
||||
"version": "03.06.02",
|
||||
"brief": "Joomla asset registry for MokoCassiopeia"
|
||||
}
|
||||
},
|
||||
"assets": [
|
||||
{
|
||||
"name": "template.base",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/css/template.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "template.base.min",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/css/template.min.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "template.user",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/css/user.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "template.user.min",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/css/user.min.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "template.font.osaka",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/css/fonts/osaka.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "template.editor",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/css/editor.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "template.editor.min",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/css/editor.min.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "template.light.colors_standard",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/css/colors/light/colors_standard.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "template.light.colors_standard.min",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/css/colors/light/colors_standard.min.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "template.light.colors_custom",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/css/colors/light/colors_custom.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "template.light.colors_custom.min",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/css/colors/light/colors_custom.min.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "template.dark.colors_standard",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/css/colors/dark/colors_standard.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "template.dark.colors_standard.min",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/css/colors/dark/colors_standard.min.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "template.dark.colors_alternative",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/css/colors/dark/colors_alternative.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "template.dark.colors_alternative.min",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/css/colors/dark/colors_alternative.min.css"
|
||||
},
|
||||
{
|
||||
"name": "template.dark.colors_custom",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/css/colors/dark/colors_custom.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "template.dark.colors_custom.min",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/css/colors/dark/colors_custom.min.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "template.js",
|
||||
"type": "script",
|
||||
"uri": "media/templates/site/mokocassiopeia/js/template.js",
|
||||
"attributes": {"defer": true}
|
||||
},
|
||||
{
|
||||
"name": "template.js.min",
|
||||
"type": "script",
|
||||
"uri": "media/templates/site/mokocassiopeia/js/template.min.js",
|
||||
"attributes": {"defer": true}
|
||||
},
|
||||
{
|
||||
"name": "gtm.js",
|
||||
"type": "script",
|
||||
"uri": "media/templates/site/mokocassiopeia/js/gtm.js",
|
||||
"attributes": {"defer": true}
|
||||
},
|
||||
{
|
||||
"name": "gtm.min.js",
|
||||
"type": "script",
|
||||
"uri": "media/templates/site/mokocassiopeia/js/gtm.min.js",
|
||||
"attributes": {"defer": true}
|
||||
},
|
||||
{
|
||||
"name": "vendor.fa7free.all",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/vendor/fa7free/css/all.css"
|
||||
},
|
||||
{
|
||||
"name": "vendor.fa7free.all.min",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/vendor/fa7free/css/all.min.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "vendor.fa7free.brands",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/vendor/fa7free/css/brands.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "vendor.fa7free.brands.min",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/vendor/fa7free/css/brands.min.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "vendor.fa7free.fontawesome",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/vendor/fa7free/css/fontawesome.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "vendor.fa7free.fontawesome.min",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/vendor/fa7free/css/fontawesome.min.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "vendor.fa7free.regular",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/vendor/fa7free/css/regular.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "vendor.fa7free.regular.min",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/vendor/fa7free/css/regular.min.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "vendor.fa7free.solid",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/vendor/fa7free/css/solid.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "vendor.fa7free.solid.min",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/vendor/fa7free/css/solid.min.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "vendor.vm",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/css/vendor/vm.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "vendor.bootstrap-toc",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/mokocassiopeia/vendor/bootstrap-toc/bootstrap-toc.css",
|
||||
"attributes": {"media": "all"}
|
||||
},
|
||||
{
|
||||
"name": "vendor.bootstrap-toc.js",
|
||||
"type": "script",
|
||||
"uri": "media/templates/site/mokocassiopeia/vendor/bootstrap-toc/bootstrap-toc.js",
|
||||
"dependencies": ["jquery"],
|
||||
"attributes": {"defer": true}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,342 +0,0 @@
|
||||
<?php
|
||||
/* Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
|
||||
This file is part of a Moko Consulting project.
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
|
||||
|
||||
# FILE INFORMATION
|
||||
DEFGROUP: Joomla.Template.Site
|
||||
INGROUP: MokoCassiopeia
|
||||
REPO: https://github.com/mokoconsulting-tech/MokoCassiopeia
|
||||
PATH: ./templates/mokocassiopeia/offline.php
|
||||
VERSION: 03.06.02
|
||||
BRIEF: Offline page template file for MokoCassiopeia
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Component\ComponentHelper;
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Router\Route;
|
||||
use Joomla\CMS\Uri\Uri;
|
||||
|
||||
/**
|
||||
* @var \Joomla\CMS\Document\HtmlDocument $this
|
||||
* @var \Joomla\Registry\Registry $this->params
|
||||
* @var string $this->language
|
||||
* @var string $this->direction
|
||||
*/
|
||||
|
||||
$app = Factory::getApplication();
|
||||
$doc = Factory::getDocument();
|
||||
$params = $this->params ?: $app->getTemplate(true)->params;
|
||||
$direction = $this->direction ?: 'ltr';
|
||||
|
||||
/* -----------------------
|
||||
Load ONLY template.css + colors_*.css (with min toggle)
|
||||
------------------------ */
|
||||
$useMin = !((int) $params->get('development_mode', 0) === 1);
|
||||
$assetSuffix = $useMin ? '.min' : '';
|
||||
$base = rtrim(Uri::root(true), '/') . '/templates/' . $this->template . '/css/';
|
||||
|
||||
$doc->addStyleSheet($base . 'template' . $assetSuffix . '.css', ['version' => 'auto'], ['id' => 'moko-template']);
|
||||
/* If you have a template param for color variant, set it here; defaults to 'standard' */
|
||||
$colorKey = (string) ($params->get('colors', 'standard') ?: 'standard');
|
||||
$colorKey = preg_replace('~[^a-z0-9_-]~i', '', $colorKey);
|
||||
$doc->addStyleSheet($base . 'colors_' . $colorKey . $assetSuffix . '.css', ['version' => 'auto'], ['id' => 'moko-colors']);
|
||||
|
||||
/* Bootstrap CSS/JS for accordion behavior; safe to keep. */
|
||||
HTMLHelper::_('bootstrap.loadCss', true, $doc);
|
||||
HTMLHelper::_('bootstrap.framework');
|
||||
|
||||
/* -----------------------
|
||||
Title + Meta (Include Site Name in Page Titles)
|
||||
------------------------ */
|
||||
$sitename = (string) $app->get('sitename');
|
||||
$baseTitle = Text::_('JGLOBAL_OFFLINE') ?: 'Offline';
|
||||
$snSetting = (int) $app->get('sitename_pagetitles', 0); // 0=no, 1=before, 2=after
|
||||
|
||||
if ($snSetting === 1) {
|
||||
$doc->setTitle(Text::sprintf('JPAGETITLE', $sitename, $baseTitle)); // Site Name BEFORE
|
||||
} elseif ($snSetting === 2) {
|
||||
$doc->setTitle(Text::sprintf('JPAGETITLE', $baseTitle, $sitename)); // Site Name AFTER
|
||||
} else {
|
||||
$doc->setTitle($baseTitle);
|
||||
}
|
||||
$doc->setMetaData('robots', 'noindex, nofollow');
|
||||
|
||||
/* -----------------------
|
||||
Offline content from Global Config
|
||||
------------------------ */
|
||||
$displayOfflineMessage = (int) $app->get('display_offline_message', 1); // 0|1|2
|
||||
$offlineMessage = trim((string) $app->get('offline_message', ''));
|
||||
|
||||
/* -----------------------
|
||||
Brand: logo from params OR siteTitle (matches index.php)
|
||||
------------------------ */
|
||||
$brandHtml = '';
|
||||
$logoFile = (string) $params->get('logoFile');
|
||||
|
||||
if ($logoFile !== '') {
|
||||
$brandHtml = HTMLHelper::_(
|
||||
'image',
|
||||
Uri::root(false) . htmlspecialchars($logoFile, ENT_QUOTES, 'UTF-8'),
|
||||
$sitename,
|
||||
['class' => 'logo d-inline-block', 'loading' => 'eager', 'decoding' => 'async'],
|
||||
false,
|
||||
0
|
||||
);
|
||||
} else {
|
||||
// If no logo file, show the title (defaults to "MokoCassiopeia" if not set)
|
||||
$siteTitle = $params->get('siteTitle', 'MokoCassiopeia');
|
||||
$brandHtml = '<span class="site-title" title="' . $sitename . '">'
|
||||
. htmlspecialchars($siteTitle, ENT_COMPAT, 'UTF-8')
|
||||
. '</span>';
|
||||
}
|
||||
|
||||
$brandTagline = (string) ($params->get('brand_tagline') ?: $params->get('siteDescription') ?: '');
|
||||
$showTagline = (int) $params->get('show_brand_tagline', 0);
|
||||
|
||||
// Theme params
|
||||
$params_theme_enabled = (int) $params->get('theme_enabled', 1);
|
||||
|
||||
// Analytics params
|
||||
$params_googletagmanager = $params->get('googletagmanager', false);
|
||||
$params_googletagmanagerid = $params->get('googletagmanagerid', null);
|
||||
$params_googleanalytics = $params->get('googleanalytics', false);
|
||||
$params_googleanalyticsid = $params->get('googleanalyticsid', null);
|
||||
|
||||
/* -----------------------
|
||||
Login routes & Users
|
||||
------------------------ */
|
||||
$action = Route::_('index.php', true);
|
||||
$return = base64_encode(Uri::base());
|
||||
$allowRegistration = (bool) ComponentHelper::getParams('com_users')->get('allowUserRegistration', 0);
|
||||
|
||||
if (class_exists('\Joomla\Component\Users\Site\Helper\RouteHelper')) {
|
||||
$resetUrl = \Joomla\Component\Users\Site\Helper\RouteHelper::getResetRoute();
|
||||
$remindUrl = \Joomla\Component\Users\Site\Helper\RouteHelper::getRemindRoute();
|
||||
$registrationUrl = \Joomla\Component\Users\Site\Helper\RouteHelper::getRegistrationRoute();
|
||||
} else {
|
||||
$resetUrl = Route::_('index.php?option=com_users&view=reset');
|
||||
$remindUrl = Route::_('index.php?option=com_users&view=remind');
|
||||
$registrationUrl = Route::_('index.php?option=com_users&view=registration');
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="<?php echo htmlspecialchars($this->language ?? 'en', ENT_QUOTES, 'UTF-8'); ?>" dir="<?php echo htmlspecialchars($direction, ENT_QUOTES, 'UTF-8'); ?>">
|
||||
<head>
|
||||
<jdoc:include type="head" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<?php if ($params_theme_enabled) : ?>
|
||||
<script>
|
||||
// Early theme application to avoid FOUC
|
||||
(function () {
|
||||
try {
|
||||
var stored = localStorage.getItem('theme');
|
||||
var prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
||||
var theme = stored ? stored : (prefersDark ? 'dark' : 'light');
|
||||
document.documentElement.setAttribute('data-bs-theme', theme);
|
||||
document.documentElement.setAttribute('data-aria-theme', theme);
|
||||
} catch (e) {}
|
||||
})();
|
||||
</script>
|
||||
<?php endif; ?>
|
||||
|
||||
<style>
|
||||
.moko-offline-wrap { min-height: 100vh; display: grid; grid-template-rows: auto 1fr auto; }
|
||||
.moko-offline-main { display: grid; place-items: center; padding: 2rem 1rem; }
|
||||
.moko-card { max-width: 720px; width: 100%; }
|
||||
.moko-brand { display:flex; align-items:center; gap:.75rem; text-decoration:none; }
|
||||
.moko-brand .brand-tagline { display:block; opacity:.75; font-size:.875rem; line-height:1.2; }
|
||||
.skip-link { position:absolute; left:-9999px; top:auto; width:1px; height:1px; overflow:hidden; }
|
||||
.skip-link:focus { position:static; width:auto; height:auto; padding:.5rem 1rem; }
|
||||
</style>
|
||||
</head>
|
||||
<body class="site moko-offline-wrap <?php echo htmlspecialchars($direction, ENT_QUOTES, 'UTF-8'); ?>">
|
||||
<?php if (!empty($params_googletagmanager) && !empty($params_googletagmanagerid)) :
|
||||
$gtmID = htmlspecialchars($params_googletagmanagerid, ENT_QUOTES, 'UTF-8'); ?>
|
||||
<!-- Google Tag Manager -->
|
||||
<script>
|
||||
(function(w,d,s,l,i){
|
||||
w[l]=w[l]||[];
|
||||
w[l].push({'gtm.start': new Date().getTime(), event:'gtm.js'});
|
||||
var f=d.getElementsByTagName(s)[0],
|
||||
j=d.createElement(s),
|
||||
dl=l!='dataLayer'?'&l='+l:'';
|
||||
j.async=true;
|
||||
j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;
|
||||
f.parentNode.insertBefore(j,f);
|
||||
})(window,document,'script','dataLayer','<?php echo $gtmID; ?>');
|
||||
</script>
|
||||
<!-- End Google Tag Manager -->
|
||||
|
||||
<!-- Google Tag Manager (noscript) -->
|
||||
<noscript>
|
||||
<iframe src="https://www.googletagmanager.com/ns.html?id=<?php echo $gtmID; ?>"
|
||||
height="0" width="0" style="display:none;visibility:hidden"></iframe>
|
||||
</noscript>
|
||||
<!-- End Google Tag Manager (noscript) -->
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($params_googleanalytics) && !empty($params_googleanalyticsid)) :
|
||||
$gaId = htmlspecialchars($params_googleanalyticsid, ENT_QUOTES, 'UTF-8'); ?>
|
||||
<!-- Google Analytics (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=<?php echo $gaId; ?>"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
gtag('consent', 'default', {
|
||||
'ad_storage': 'denied',
|
||||
'analytics_storage': 'granted',
|
||||
'ad_user_data': 'denied',
|
||||
'ad_personalization': 'denied'
|
||||
});
|
||||
(function(id){
|
||||
if (/^G-/.test(id)) {
|
||||
gtag('config', id, { 'anonymize_ip': true });
|
||||
} else if (/^UA-/.test(id)) {
|
||||
gtag('config', id, { 'anonymize_ip': true });
|
||||
console.warn('Using a UA- ID. Universal Analytics is sunset; consider migrating to GA4.');
|
||||
} else {
|
||||
console.warn('Unrecognized Google Analytics ID format:', id);
|
||||
}
|
||||
})('<?php echo $gaId; ?>');
|
||||
</script>
|
||||
<!-- End Google Analytics -->
|
||||
<?php endif; ?>
|
||||
|
||||
<a class="skip-link" href="#maincontent"><?php echo Text::_('JSKIP_TO_CONTENT') ?: 'Skip to content'; ?></a>
|
||||
|
||||
<header class="container-header header py-3">
|
||||
<div class="grid-child container-nav d-flex align-items-center gap-3">
|
||||
|
||||
<!-- Brand (mutually exclusive image/text) -->
|
||||
<a class="moko-brand me-auto" href="<?php echo htmlspecialchars(Uri::base(), ENT_QUOTES, 'UTF-8'); ?>" aria-label="<?php echo htmlspecialchars($sitename, ENT_COMPAT, 'UTF-8'); ?>">
|
||||
<?php echo $brandHtml; ?>
|
||||
<?php if ($showTagline && $brandTagline): ?>
|
||||
<small class="brand-tagline"><?php echo htmlspecialchars($brandTagline, ENT_COMPAT, 'UTF-8'); ?></small>
|
||||
<?php endif; ?>
|
||||
</a>
|
||||
|
||||
<!-- Header module position: offline-header -->
|
||||
<?php if ($this->countModules('offline-header')) : ?>
|
||||
<div class="ms-2">
|
||||
<jdoc:include type="modules" name="offline-header" style="none" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="maincontent" class="moko-offline-main">
|
||||
<div class="container">
|
||||
<jdoc:include type="message" />
|
||||
|
||||
<div class="moko-card card shadow-sm rounded-3 p-4 p-md-5">
|
||||
<?php if ($displayOfflineMessage === 1 && $offlineMessage !== '') : ?>
|
||||
<div class="mb-4">
|
||||
<h1 class="h3 mb-2"><?php echo Text::_('JOFFLINE_MESSAGE') ?: 'Site Offline'; ?></h1>
|
||||
<p class="lead mb-0"><?php echo $offlineMessage; ?></p>
|
||||
</div>
|
||||
<?php elseif ($displayOfflineMessage === 2) : ?>
|
||||
<div class="mb-4">
|
||||
<h1 class="h3 mb-2"><?php echo Text::_('JOFFLINE_MESSAGE') ?: 'Site Offline'; ?></h1>
|
||||
<p class="lead mb-0">
|
||||
<?php echo Text::_('JOFFLINE_MESSAGE_DEFAULT') ?: 'This site is down for maintenance. Please check back soon.'; ?>
|
||||
</p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Main offline module position -->
|
||||
<?php if ($this->countModules('offline')) : ?>
|
||||
<section class="mb-4" aria-label="Offline modules">
|
||||
<jdoc:include type="modules" name="offline" style="none" />
|
||||
</section>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- Login UNDER an accordion (collapsed by default) -->
|
||||
<div class="accordion" id="offlineAccordion">
|
||||
<div class="accordion-item">
|
||||
<h2 class="accordion-header" id="headingLogin">
|
||||
<button class="accordion-button collapsed" type="button"
|
||||
data-bs-toggle="collapse" data-bs-target="#collapseLogin"
|
||||
aria-expanded="false" aria-controls="collapseLogin">
|
||||
<?php echo Text::_('JLOGIN'); ?>
|
||||
</button>
|
||||
</h2>
|
||||
<div id="collapseLogin" class="accordion-collapse collapse" aria-labelledby="headingLogin" data-bs-parent="#offlineAccordion">
|
||||
<div class="accordion-body">
|
||||
<form action="<?php echo $action; ?>" method="post" class="form-validate">
|
||||
<fieldset>
|
||||
<legend class="visually-hidden"><?php echo Text::_('JLOGIN'); ?></legend>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label" for="username"><?php echo Text::_('JGLOBAL_USERNAME'); ?></label>
|
||||
<input class="form-control" type="text" name="username" id="username" autocomplete="username" required aria-required="true">
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label" for="password"><?php echo Text::_('JGLOBAL_PASSWORD'); ?></label>
|
||||
<input class="form-control" type="password" name="password" id="password" autocomplete="current-password" required aria-required="true">
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label" for="secretkey"><?php echo Text::_('JGLOBAL_SECRETKEY'); ?></label>
|
||||
<input class="form-control" type="text" name="secretkey" id="secretkey" autocomplete="one-time-code" placeholder="<?php echo Text::_('JGLOBAL_SECRETKEY'); ?>">
|
||||
</div>
|
||||
|
||||
<div class="form-check mb-4">
|
||||
<input class="form-check-input" type="checkbox" name="remember" id="remember">
|
||||
<label class="form-check-label" for="remember"><?php echo Text::_('JGLOBAL_REMEMBER_ME'); ?></label>
|
||||
</div>
|
||||
|
||||
<div class="d-grid">
|
||||
<button type="submit" class="btn btn-primary"><?php echo Text::_('JLOGIN'); ?></button>
|
||||
</div>
|
||||
|
||||
<input type="hidden" name="option" value="com_users">
|
||||
<input type="hidden" name="task" value="user.login">
|
||||
<input type="hidden" name="return" value="<?php echo $return; ?>">
|
||||
<?php echo HTMLHelper::_('form.token'); ?>
|
||||
</fieldset>
|
||||
|
||||
<nav class="mt-3 small" aria-label="<?php echo Text::_('COM_USERS'); ?>">
|
||||
<ul class="list-inline m-0">
|
||||
<li class="list-inline-item">
|
||||
<a href="<?php echo $resetUrl; ?>"><?php echo Text::_('COM_USERS_LOGIN_RESET'); ?></a>
|
||||
</li>
|
||||
<li class="list-inline-item">
|
||||
<a href="<?php echo $remindUrl; ?>"><?php echo Text::_('COM_USERS_LOGIN_REMIND'); ?></a>
|
||||
</li>
|
||||
<?php if ($allowRegistration) : ?>
|
||||
<li class="list-inline-item">
|
||||
<a href="<?php echo $registrationUrl; ?>"><?php echo Text::_('COM_USERS_REGISTER'); ?></a>
|
||||
</li>
|
||||
<?php endif; ?>
|
||||
</ul>
|
||||
</nav>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /accordion -->
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- No footer modules on offline page -->
|
||||
<jdoc:include type="modules" name="debug" style="none" />
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,255 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- =========================================================================
|
||||
Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
|
||||
This file is part of a Moko Consulting project.
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
=========================================================================
|
||||
FILE INFORMATION
|
||||
DEFGROUP: Joomla
|
||||
INGROUP: MokoCassiopeia
|
||||
PATH: templates/mokocassiopeia/templateDetails.xml
|
||||
VERSION: 03.08.04
|
||||
BRIEF: Template manifest XML file for MokoCassiopeia
|
||||
=========================================================================
|
||||
-->
|
||||
<extension type="template" client="site" method="upgrade">
|
||||
<updateservers>
|
||||
<server type="extension" name="MokoCassiopeia Updates" priority="1">
|
||||
https://raw.githubusercontent.com/mokoconsulting-tech/MokoCassiopeia/main/updates.xml
|
||||
</server>
|
||||
</updateservers>
|
||||
<name>MokoCassiopeia</name>
|
||||
<version>03.08.04</version>
|
||||
<creationDate>2026-02-27</creationDate>
|
||||
<author>Jonathan Miller || Moko Consulting</author>
|
||||
<authorEmail>hello@mokoconsulting.tech</authorEmail>
|
||||
<copyright>(C)GNU General Public License Version 3 - 2026 Moko Consulting</copyright>
|
||||
<description>TPL_MOKOCASSIOPEIA_XML_DESCRIPTION</description>
|
||||
<inheritable>1</inheritable>
|
||||
<files>
|
||||
<filename>component.php</filename>
|
||||
<filename>error.php</filename>
|
||||
<filename>index.php</filename>
|
||||
<filename>joomla.asset.json</filename>
|
||||
<filename>offline.php</filename>
|
||||
<filename>templateDetails.xml</filename>
|
||||
<folder>html</folder>
|
||||
</files>
|
||||
<stylesheets>
|
||||
<stylesheet>media/templates/site/mokocassiopeia/css/editor.css</stylesheet>
|
||||
</stylesheets>
|
||||
<media destination="templates/site/mokocassiopeia" folder="media">
|
||||
<folder>js</folder>
|
||||
<folder>css</folder>
|
||||
<folder>images</folder>
|
||||
<folder>fonts</folder>
|
||||
</media>
|
||||
<positions>
|
||||
<position>topbar</position>
|
||||
<position>below-topbar</position>
|
||||
<position>below-logo</position>
|
||||
<position>menu</position>
|
||||
<position>search</position>
|
||||
<position>banner</position>
|
||||
<position>top-a</position>
|
||||
<position>top-b</position>
|
||||
<position>main-top</position>
|
||||
<position>main-bottom</position>
|
||||
<position>breadcrumbs</position>
|
||||
<position>sidebar-left</position>
|
||||
<position>sidebar-right</position>
|
||||
<position>bottom-a</position>
|
||||
<position>bottom-b</position>
|
||||
<position>footer-menu</position>
|
||||
<position>footer</position>
|
||||
<position>debug</position>
|
||||
<position>offline-header</position>
|
||||
<position>offline</position>
|
||||
<position>offline-footer</position>
|
||||
<position>drawer-left</position>
|
||||
<position>drawer-right</position>
|
||||
</positions>
|
||||
<languages folder="language">
|
||||
<language tag="en-GB">en-GB/tpl_mokocassiopeia.ini</language>
|
||||
<language tag="en-US">en-US/tpl_mokocassiopeia.ini</language>
|
||||
</languages>
|
||||
|
||||
<languages folder="administrator/language">
|
||||
<language tag="en-GB">en-GB/tpl_mokocassiopeia.sys.ini</language>
|
||||
<language tag="en-US">en-US/tpl_mokocassiopeia.sys.ini</language>
|
||||
</languages>
|
||||
|
||||
<config>
|
||||
|
||||
<fields name="params">
|
||||
<!-- Advanced tab (non-theme/system options only) -->
|
||||
<fieldset name="advanced">
|
||||
<!--
|
||||
<field name="developmentmode" type="radio" label="TPL_MOKOCASSIOPEIA_DEVELOPMENTMODE_LABEL" description="TPL_MOKOCASSIOPEIA_DEVELOPMENTMODE_DESC" default="1" layout="joomla.form.field.radio.switcher" filter="boolean">
|
||||
<option value="0">JNO</option>
|
||||
<option value="1">JYES</option>
|
||||
</field>
|
||||
-->
|
||||
<field name="fluidContainer" type="radio" layout="joomla.form.field.radio.switcher" default="0" label="TPL_MOKOCASSIOPEIA_FLUID_LABEL">
|
||||
<option value="0">TPL_MOKOCASSIOPEIA_STATIC</option>
|
||||
<option value="1">TPL_MOKOCASSIOPEIA_FLUID</option>
|
||||
</field>
|
||||
</fieldset>
|
||||
|
||||
<!-- Google tab -->
|
||||
<fieldset name="google" label="TPL_MOKOCASSIOPEIA_GOOGLE_FIELDSET_LABEL">
|
||||
<field name="googletagmanager" type="radio" label="TPL_MOKOCASSIOPEIA_GOOGLETAGMANAGER_LABEL" description="TPL_MOKOCASSIOPEIA_GOOGLETAGMANAGER_DESC" layout="joomla.form.field.radio.switcher" filter="boolean">
|
||||
<option value="0">JNO</option>
|
||||
<option value="1">JYES</option>
|
||||
</field>
|
||||
<field name="googletagmanagerid" type="text" default="" label="TPL_MOKOCASSIOPEIA_GOOGLETAGMANAGERID_LABEL" description="TPL_MOKOCASSIOPEIA_GOOGLETAGMANAGERID_DESC" filter="string" showon="googletagmanager:1" />
|
||||
<field name="googleanalytics" type="radio" label="TPL_MOKOCASSIOPEIA_GOOGLEANALYTICS_LABEL" description="TPL_MOKOCASSIOPEIA_GOOGLEANALYTICS_DESC" layout="joomla.form.field.radio.switcher" filter="boolean">
|
||||
<option value="0">JNO</option>
|
||||
<option value="1">JYES</option>
|
||||
</field>
|
||||
<field name="googleanalyticsid" type="text" default="" label="TPL_MOKOCASSIOPEIA_GOOGLEANALYTICSID_LABEL" description="TPL_MOKOCASSIOPEIA_GOOGLEANALYTICSID_DESC" filter="string" showon="googleanalytics:1" />
|
||||
</fieldset>
|
||||
|
||||
<!-- Custom Code tab -->
|
||||
<fieldset name="custom_head" label="TPL_MOKOCASSIOPEIA_CUSTOM_CODE_FIELDSET">
|
||||
<field name="custom_head_start" type="textarea" default="" label="TPL_MOKOCASSIOPEIA_CUSTOM_HEAD_START_LABEL" description="TPL_MOKOCASSIOPEIA_CUSTOM_HEAD_START_DESC" filter="raw" />
|
||||
<field name="custom_head_end" type="textarea" default="" label="TPL_MOKOCASSIOPEIA_CUSTOM_HEAD_END_LABEL" description="TPL_MOKOCASSIOPEIA_CUSTOM_HEAD_END_DESC" filter="raw" />
|
||||
</fieldset>
|
||||
|
||||
<!-- Drawers tab -->
|
||||
<fieldset name="drawers" label="TPL_MOKOCASSIOPEIA_DRAWERS_FIELDSET_LABEL">
|
||||
<field name="drawerLeftIcon" type="text" default="fa-solid fa-chevron-right" label="TPL_MOKOCASSIOPEIA_DRAWER_LEFT_ICON_LABEL" description="TPL_MOKOCASSIOPEIA_DRAWER_LEFT_ICON_DESC" filter="string" />
|
||||
<field name="drawerRightIcon" type="text" default="fa-solid fa-chevron-left" label="TPL_MOKOCASSIOPEIA_DRAWER_RIGHT_ICON_LABEL" description="TPL_MOKOCASSIOPEIA_DRAWER_RIGHT_ICON_DESC" filter="string" />
|
||||
</fieldset>
|
||||
|
||||
<!-- THEME TAB (all style/theme settings grouped) -->
|
||||
<fieldset name="theme" label="TPL_MOKO_THEME_FIELDSET">
|
||||
|
||||
<!-- General -->
|
||||
<field name="theme_sep_general" type="spacer" label="General" hr="false" class="text fw-bold" />
|
||||
<field name="theme_enabled" type="radio" default="1"
|
||||
label="TPL_MOKO_THEME_ENABLED" description="TPL_MOKO_THEME_ENABLED_DESC"
|
||||
layout="joomla.form.field.radio.switcher" filter="boolean">
|
||||
<option value="0">JNO</option>
|
||||
<option value="1">JYES</option>
|
||||
</field>
|
||||
<field name="theme_control_type" type="list" default="radios"
|
||||
label="TPL_MOKO_THEME_CONTROL_TYPE" description="TPL_MOKO_THEME_CONTROL_TYPE_DESC">
|
||||
<option value="switch">Switch (Light↔Dark)</option>
|
||||
<option value="radios">Radios (Light/Dark/System)</option>
|
||||
<option value="none">No visible control</option>
|
||||
</field>
|
||||
<field name="theme_default_choice" type="list" default="system"
|
||||
label="TPL_MOKO_THEME_DEFAULT_CHOICE" description="TPL_MOKO_THEME_DEFAULT_CHOICE_DESC">
|
||||
<option value="system">System</option>
|
||||
<option value="light">Light</option>
|
||||
<option value="dark">Dark</option>
|
||||
</field>
|
||||
<field name="theme_auto_dark" type="radio" default="0"
|
||||
label="TPL_MOKO_THEME_AUTO_DARK" description="TPL_MOKO_THEME_AUTO_DARK_DESC"
|
||||
layout="joomla.form.field.radio.switcher" filter="boolean">
|
||||
<option value="0">JNO</option>
|
||||
<option value="1">JYES</option>
|
||||
</field>
|
||||
<field name="theme_meta_color_scheme" type="radio" default="1"
|
||||
label="TPL_MOKO_THEME_META_COLOR_SCHEME" description="TPL_MOKO_THEME_META_COLOR_SCHEME_DESC"
|
||||
layout="joomla.form.field.radio.switcher" filter="boolean">
|
||||
<option value="0">JNO</option>
|
||||
<option value="1">JYES</option>
|
||||
</field>
|
||||
<field name="theme_meta_theme_color" type="radio" default="1"
|
||||
label="TPL_MOKO_THEME_META_THEME_COLOR" description="TPL_MOKO_THEME_META_THEME_COLOR_DESC"
|
||||
layout="joomla.form.field.radio.switcher" filter="boolean">
|
||||
<option value="0">JNO</option>
|
||||
<option value="1">JYES</option>
|
||||
</field>
|
||||
<field name="theme_bridge_bs_aria" type="radio" default="1"
|
||||
label="TPL_MOKO_THEME_BRIDGE" description="TPL_MOKO_THEME_BRIDGE_DESC"
|
||||
layout="joomla.form.field.radio.switcher" filter="boolean">
|
||||
<option value="0">JNO</option>
|
||||
<option value="1">JYES</option>
|
||||
</field>
|
||||
|
||||
<!-- Variables & Palettes -->
|
||||
<field name="theme_sep_vars" type="spacer" label="Variables & Palettes" hr="false" class="text fw-bold" />
|
||||
<field name="colorLightName" type="list" label="TPL_MOKOCASSIOPEIA_COLOR_LIGHT_NAME_LABEL" hint="TPL_MOKOCASSIOPEIA_COLOR_LIGHT_NAME_DESC" default="colors_standard">
|
||||
<option value="colors_standard">TPL_MOKOCASSIOPEIA_COLOR_NAME_STANDARD</option>
|
||||
<option value="colors_custom">TPL_MOKOCASSIOPEIA_COLOR_NAME_CUSTOM</option>
|
||||
</field>
|
||||
<field name="colorDarkName" type="list" label="TPL_MOKOCASSIOPEIA_COLOR_DARK_NAME_LABEL" hint="TPL_MOKOCASSIOPEIA_COLOR_DARK_NAME_DESC" default="colors_standard">
|
||||
<option value="colors_standard">TPL_MOKOCASSIOPEIA_COLOR_NAME_STANDARD</option>
|
||||
<option value="colors_custom">TPL_MOKOCASSIOPEIA_COLOR_NAME_CUSTOM</option>
|
||||
</field>
|
||||
|
||||
<!-- Typography -->
|
||||
<field name="theme_sep_typo" type="spacer" label="Typography" hr="false" class="text fw-bold" />
|
||||
<field name="useFontScheme" type="groupedlist" label="TPL_MOKOCASSIOPEIA_FONT_LABEL" description="TPL_MOKOCASSIOPEIA_FONT_LABEL_DESC" default="media/templates/site/mokocassiopeia/css/colors/fonts-local_roboto.css">
|
||||
<option value="0">JNONE</option>
|
||||
<group label="TPL_MOKOCASSIOPEIA_FONT_GROUP_LOCAL">
|
||||
<option value="media/templates/site/mokocassiopeia/css/colors/fonts-local_roboto.css">Roboto (local)</option>
|
||||
</group>
|
||||
<group label="TPL_MOKOCASSIOPEIA_FONT_GROUP_WEB">
|
||||
<option value="https://fonts.googleapis.com/css2?family=Fira+Sans:wght@100;300;400;700&display=swap">Fira Sans (web)</option>
|
||||
<option value="https://fonts.googleapis.com/css2?family=Noto+Sans:wght@100;300;400;700&family=Roboto:wght@100;300;400;700&display=swap">Roboto + Noto Sans (web)</option>
|
||||
</group>
|
||||
</field>
|
||||
<field name="noteFontScheme" type="note" description="TPL_MOKOCASSIOPEIA_FONT_NOTE_TEXT" class="alert alert-warning" />
|
||||
|
||||
<!-- Branding & Icons -->
|
||||
<field name="theme_sep_brand" type="spacer" label="Branding & Icons" hr="false" class="text fw-bold" />
|
||||
<field name="brand" type="radio" label="TPL_MOKOCASSIOPEIA_BRAND_LABEL" default="1" layout="joomla.form.field.radio.switcher" filter="boolean">
|
||||
<option value="0">JNO</option>
|
||||
<option value="1">JYES</option>
|
||||
</field>
|
||||
<field name="logoFile" type="media" label="TPL_MOKOCASSIOPEIA_LOGO_LABEL" showon="brand:1" />
|
||||
<field name="siteTitle" type="text" default="MokoCassiopeia" label="TPL_MOKOCASSIOPEIA_TITLE" filter="string" showon="brand:1" />
|
||||
<field name="siteDescription" type="text" default="" label="TPL_MOKOCASSIOPEIA_TAGLINE_LABEL" description="TPL_MOKOCASSIOPEIA_TAGLINE_DESC" filter="string" showon="brand:1" />
|
||||
<field name="fA6KitCode" type="text" default="" label="TPL_MOKOCASSIOPEIA_FA7KITCODE_LABEL" description="TPL_MOKOCASSIOPEIA_FA7KITCODE_DESC" filter="string" />
|
||||
|
||||
<!-- Header & Navigation UI -->
|
||||
<field name="theme_sep_header" type="spacer" label="Header & Navigation" hr="false" class="text fw-bold" />
|
||||
<field name="stickyHeader" type="radio" label="TPL_MOKOCASSIOPEIA_STICKY_LABEL" layout="joomla.form.field.radio.switcher" default="0" filter="integer">
|
||||
<option value="0">JNO</option>
|
||||
<option value="1">JYES</option>
|
||||
</field>
|
||||
<field name="backTop" type="radio" label="TPL_MOKOCASSIOPEIA_BACKTOTOP_LABEL" layout="joomla.form.field.radio.switcher" default="0" filter="integer">
|
||||
<option value="0">JNO</option>
|
||||
<option value="1">JYES</option>
|
||||
</field>
|
||||
|
||||
<!-- Toggle UI -->
|
||||
<field name="theme_sep_toggle" type="spacer" label="Theme Toggle UI" hr="false" class="text fw-bold" />
|
||||
<field name="theme_fab_enabled" type="radio" default="1"
|
||||
label="TPL_MOKO_THEME_FAB_ENABLED" description="TPL_MOKO_THEME_FAB_ENABLED_DESC"
|
||||
layout="joomla.form.field.radio.switcher" filter="boolean">
|
||||
<option value="0">JNO</option>
|
||||
<option value="1">JYES</option>
|
||||
</field>
|
||||
<field name="theme_fab_pos" type="list" default="br"
|
||||
label="TPL_MOKO_THEME_FAB_POS" description="TPL_MOKO_THEME_FAB_POS_DESC">
|
||||
<option value="br">Bottom-right</option>
|
||||
<option value="bl">Bottom-left</option>
|
||||
<option value="tr">Top-right</option>
|
||||
<option value="tl">Top-left</option>
|
||||
</field>
|
||||
</fieldset>
|
||||
</fields>
|
||||
</config>
|
||||
</extension>
|
||||
Reference in New Issue
Block a user