Stylesheet Updats
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
<?php
|
||||
|
||||
|
||||
/**
|
||||
* @package Joomla.Site
|
||||
* @subpackage Templates.Moko-Cassiopeia
|
||||
@@ -48,7 +47,7 @@ if ($paramsFontScheme) {
|
||||
}
|
||||
|
||||
// Enable assets
|
||||
$wa->usePreset('template.MOKO-CASSIOPEIA.' . ($this->direction === 'rtl' ? 'rtl' : 'ltr'))
|
||||
$wa->usePreset('template.moko-cassiopeia.' . ($this->direction === 'rtl' ? 'rtl' : 'ltr'))
|
||||
->useStyle('template.active.language')
|
||||
->useStyle('template.user')
|
||||
->useScript('template.user')
|
||||
@@ -64,7 +63,7 @@ $wa->usePreset('template.MOKO-CASSIOPEIA.' . ($this->direction === 'rtl' ? 'rtl'
|
||||
|
||||
|
||||
// Override 'template.active' asset to set correct ltr/rtl dependency
|
||||
$wa->registerStyle('template.active', '', [], [], ['template.MOKO-CASSIOPEIA.' . ($this->direction === 'rtl' ? 'rtl' : 'ltr')]);
|
||||
$wa->registerStyle('template.active', '', [], [], ['template.moko-cassiopeia.' . ($this->direction === 'rtl' ? 'rtl' : 'ltr')]);
|
||||
|
||||
// Browsers support SVG favicons
|
||||
$this->addHeadLink(HTMLHelper::_('image', 'joomla-favicon.svg', '', [], true, 1), 'icon', 'rel', ['type' => 'image/svg+xml']);
|
||||
@@ -87,4 +86,3 @@ $wa->getAsset('style', 'fontawesome')->setAttribute('rel', 'lazy-stylesheet');
|
||||
<jdoc:include type="component" />
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
@@ -1,24 +1,30 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
*
|
||||
* @package Joomla.Site
|
||||
* @subpackage Templates.moko-cassiopeia
|
||||
* @subpackage Templates.Moko-Cassiopeia
|
||||
* @file /templates/moko-cassiopeia/custom.php
|
||||
* @version 02.00
|
||||
* @copyright © 2025 Moko Consulting
|
||||
* @author Jonathan Miller
|
||||
* @website https://mokoconsulting.tech
|
||||
* @email hello@mokoconsulting.tech
|
||||
* @phone +1 (931) 279-6313
|
||||
*
|
||||
* @copyright © 2025 Moko Consulting — All Rights Reserved
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*
|
||||
* Website: https://mokoconsulting.tech
|
||||
* Email: hello@mokoconsulting.tech
|
||||
* Phone: +1 (931) 279-6313
|
||||
* This file is part of a Moko Consulting project released under the
|
||||
* GNU General Public License v3 or (at your option) any later version.
|
||||
* It 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.
|
||||
*/
|
||||
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;
|
||||
}
|
||||
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,16 +1,21 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* error.php — Error page template for Moko Cassiopeia
|
||||
*
|
||||
* @package Joomla.Site
|
||||
* @subpackage Templates.moko-cassiopeia
|
||||
* @subpackage Templates.Moko-Cassiopeia
|
||||
* @file /templates/moko-cassiopeia/error.php
|
||||
*
|
||||
* @copyright © 2025 Moko Consulting — All Rights Reserved
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Website: https://mokoconsulting.tech
|
||||
* Email: hello@mokoconsulting.tech
|
||||
* Phone: +1 (931) 279-6313
|
||||
* @version 2.1
|
||||
* @copyright (C) 2025 Moko Consulting
|
||||
* @author Jonathan Miller
|
||||
* @website https://mokoconsulting.tech
|
||||
* @email hello@mokoconsulting.tech
|
||||
* @phone +1 (931) 279-6313
|
||||
* @license GNU General Public License version 3 or later; see LICENSE.txt
|
||||
* @disclaimer 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.
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
@@ -20,213 +25,245 @@ use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Uri\Uri;
|
||||
|
||||
/** @var Joomla\CMS\Document\ErrorDocument $this */
|
||||
/** @var Joomla\CMS\Document\ErrorDocument|Joomla\CMS\Document\HtmlDocument $this */
|
||||
$app = Factory::getApplication();
|
||||
$params = $this->params;
|
||||
$wa = $this->getWebAssetManager();
|
||||
|
||||
$app = Factory::getApplication();
|
||||
$input = $app->getInput();
|
||||
$wa = $this->getWebAssetManager();
|
||||
// ------------------ Params ------------------
|
||||
$colorLight = (string) $params->get('colorLightName', 'colors_standard');
|
||||
$colorDark = (string) $params->get('colorDarkName', 'colors_standard');
|
||||
$themeFab = (int) $params->get('theme_fab_enabled', 1);
|
||||
$fABodyPos = (string) $params->get('theme_fab_pos', 'br');
|
||||
$gtmEnabled = (int) $params->get('googletagmanager', 0);
|
||||
$gtmId = (string) $params->get('googletagmanagerid', '');
|
||||
$fa6KitCode = (string) $params->get('fA6KitCode', '');
|
||||
$stickyHeader = (bool) $params->get('stickyHeader', 0);
|
||||
$brandEnabled = (int) $params->get('brand', 1);
|
||||
$siteDescription = (string) $params->get('siteDescription', '');
|
||||
|
||||
// Drawer icon params (escaped)
|
||||
$params_leftIcon = htmlspecialchars($params->get('drawerLeftIcon', 'fa-solid fa-chevron-right'), ENT_QUOTES, 'UTF-8');
|
||||
$params_rightIcon = htmlspecialchars($params->get('drawerRightIcon', 'fa-solid fa-chevron-left'), ENT_QUOTES, 'UTF-8');
|
||||
|
||||
// Browsers support SVG favicons
|
||||
$this->addHeadLink(HTMLHelper::_('image', '../media/templates/site/moko-cassiopeia/images/favicon/favicon.svg', '', [], true, 1), 'icon', 'rel', ['type' => 'image/svg+xml']);
|
||||
$this->addHeadLink(HTMLHelper::_('image', '../media/templates/site/moko-cassiopeia/images/favicon/favicon.ico', '', [], true, 1), 'alternate icon', 'rel', ['type' => 'image/vnd.microsoft.icon']);
|
||||
$this->addHeadLink(HTMLHelper::_('image', '../media/templates/site/moko-cassiopeia/images/favicon/favicon.svg', '', [], true, 1), 'mask-icon', 'rel', ['color' => '#fff']);
|
||||
// ------------------ Styles ------------------
|
||||
$wa->useStyle('template.base');
|
||||
$wa->useStyle('template.user');
|
||||
$wa->useStyle('vendor.vmbasic');
|
||||
$wa->useStyle('vendor.gable');
|
||||
|
||||
//add Bootsrap 5 Support
|
||||
HTMLHelper::_('bootstrap.alert');
|
||||
HTMLHelper::_('bootstrap.button');
|
||||
HTMLHelper::_('bootstrap.carousel');
|
||||
HTMLHelper::_('bootstrap.collapse');
|
||||
HTMLHelper::_('bootstrap.dropdown');
|
||||
HTMLHelper::_('bootstrap.modal');
|
||||
HTMLHelper::_('bootstrap.offcanvas');
|
||||
HTMLHelper::_('bootstrap.popover');
|
||||
HTMLHelper::_('bootstrap.scrollspy');
|
||||
HTMLHelper::_('bootstrap.tab');
|
||||
HTMLHelper::_('bootstrap.tooltip');
|
||||
HTMLHelper::_('bootstrap.toast');
|
||||
|
||||
|
||||
// Detecting Active Variables
|
||||
$option = $input->getCmd('option', '');
|
||||
$view = $input->getCmd('view', '');
|
||||
$layout = $input->getCmd('layout', '');
|
||||
$task = $input->getCmd('task', '');
|
||||
$itemid = $input->getCmd('Itemid', '');
|
||||
$sitename = htmlspecialchars($app->get('sitename'), ENT_QUOTES, 'UTF-8');
|
||||
$menu = $app->getMenu()->getActive();
|
||||
$pageclass = $menu !== null ? $menu->getParams()->get('pageclass_sfx', '') : '';
|
||||
|
||||
// Template path
|
||||
$templatePath = 'media/templates/site/moko-cassiopeia';
|
||||
|
||||
// Color Theme
|
||||
$paramsColorName = $this->params->get('colorName', 'colors_standard');
|
||||
$assetColorName = 'theme.' . $paramsColorName;
|
||||
$wa->registerAndUseStyle($assetColorName, $templatePath . '/css/global/' . $paramsColorName . '.css');
|
||||
|
||||
// Use a font scheme if set in the template style options
|
||||
$paramsFontScheme = $this->params->get('useFontScheme', false);
|
||||
$fontStyles = '';
|
||||
|
||||
if ($paramsFontScheme) {
|
||||
if (stripos($paramsFontScheme, 'https://') === 0) {
|
||||
$this->getPreloadManager()->preconnect('https://fonts.googleapis.com/', ['crossorigin' => 'anonymous']);
|
||||
$this->getPreloadManager()->preconnect('https://fonts.gstatic.com/', ['crossorigin' => 'anonymous']);
|
||||
$this->getPreloadManager()->preload($paramsFontScheme, ['as' => 'style', 'crossorigin' => 'anonymous']);
|
||||
$wa->registerAndUseStyle('fontscheme.current', $paramsFontScheme, [], ['media' => 'print', 'rel' => 'lazy-stylesheet', 'onload' => 'this.media=\'all\'', 'crossorigin' => 'anonymous']);
|
||||
|
||||
if (preg_match_all('/family=([^?:]*):/i', $paramsFontScheme, $matches) > 0) {
|
||||
$fontStyles = '--font-family-body: "' . str_replace('+', ' ', $matches[1][0]) . '", sans-serif;
|
||||
--font-family-headings: "' . str_replace('+', ' ', isset($matches[1][1]) ? $matches[1][1] : $matches[1][0]) . '", sans-serif;
|
||||
--font-weight-normal: 400;
|
||||
--font-weight-headings: 700;';
|
||||
}
|
||||
} else {
|
||||
$wa->registerAndUseStyle('fontscheme.current', $paramsFontScheme, ['version' => 'auto'], ['media' => 'print', 'rel' => 'lazy-stylesheet', 'onload' => 'this.media=\'all\'']);
|
||||
$this->getPreloadManager()->preload($wa->getAsset('style', 'fontscheme.current')->getUri() . '?' . $this->getMediaVersion(), ['as' => 'style']);
|
||||
}
|
||||
// Light/Dark variable sheets (load before consumers)
|
||||
if ($wa->assetExists('style', 'template.light.' . $colorLight)) {
|
||||
$wa->useStyle('template.light.' . $colorLight);
|
||||
}
|
||||
if ($wa->assetExists('style', 'template.dark.' . $colorDark)) {
|
||||
$wa->useStyle('template.dark.' . $colorDark);
|
||||
}
|
||||
|
||||
// Enable assets
|
||||
$wa->usePreset('template.MOKO-CASSIOPEIA.' . ($this->direction === 'rtl' ? 'rtl' : 'ltr'))
|
||||
->useStyle('template.active.language')
|
||||
->useStyle('template.user')
|
||||
->useScript('template.user')
|
||||
->addInlineStyle(":root {
|
||||
--hue: 214;
|
||||
--template-bg-light: #f0f4fb;
|
||||
--template-text-dark: #495057;
|
||||
--template-text-light: #ffffff;
|
||||
--template-link-color: #2a69b8;
|
||||
--template-special-color: #001B4C;
|
||||
$fontStyles
|
||||
}");
|
||||
// ------------------ Scripts ------------------
|
||||
$wa->useScript('theme-init.js');
|
||||
if ($themeFab === 1) {
|
||||
$wa->useScript('darkmode-toggle.js');
|
||||
}
|
||||
if ($gtmEnabled === 1) {
|
||||
$wa->useScript('gtm.js');
|
||||
}
|
||||
|
||||
// Override 'template.active' asset to set correct ltr/rtl dependency
|
||||
$wa->registerStyle('template.active', '', [], [], ['template.MOKO-CASSIOPEIA.' . ($this->direction === 'rtl' ? 'rtl' : 'ltr')]);
|
||||
|
||||
// Browsers support SVG favicons
|
||||
$this->addHeadLink(HTMLHelper::_('image', 'joomla-favicon.svg', '', [], true, 1), 'icon', 'rel', ['type' => 'image/svg+xml']);
|
||||
$this->addHeadLink(HTMLHelper::_('image', 'favicon.ico', '', [], true, 1), 'alternate icon', 'rel', ['type' => 'image/vnd.microsoft.icon']);
|
||||
$this->addHeadLink(HTMLHelper::_('image', 'joomla-favicon-pinned.svg', '', [], true, 1), 'mask-icon', 'rel', ['color' => '#000']);
|
||||
|
||||
// Logo file or site title param
|
||||
if ($this->params->get('logoFile')) {
|
||||
$logo = HTMLHelper::_('image', Uri::root(false) . htmlspecialchars($this->params->get('logoFile'), ENT_QUOTES), $sitename, ['loading' => 'eager', 'decoding' => 'async'], false, 0);
|
||||
} elseif ($this->params->get('siteTitle')) {
|
||||
$logo = '<span title="' . $sitename . '">' . htmlspecialchars($this->params->get('siteTitle'), ENT_COMPAT, 'UTF-8') . '</span>';
|
||||
// Optional Font Awesome 6 Kit (preferred) or FA5 fallback
|
||||
if (!empty($fa6KitCode)) {
|
||||
HTMLHelper::_('script', 'https://kit.fontawesome.com/' . rawurlencode($fa6KitCode) . '.js', [
|
||||
'crossorigin' => 'anonymous'
|
||||
]);
|
||||
} else {
|
||||
$logo = HTMLHelper::_('image', 'logo.svg', $sitename, ['class' => 'logo d-inline-block', 'loading' => 'eager', 'decoding' => 'async'], true, 0);
|
||||
HTMLHelper::_('stylesheet', 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css', ['version' => 'auto'], [
|
||||
'crossorigin' => 'anonymous',
|
||||
'referrerpolicy' => 'no-referrer',
|
||||
]);
|
||||
}
|
||||
|
||||
// Container
|
||||
$wrapper = $this->params->get('fluidContainer') ? 'wrapper-fluid' : 'wrapper-static';
|
||||
// ------------------ Context (logo, bootstrap needs) ------------------
|
||||
$sitename = htmlspecialchars($app->get('sitename'), ENT_QUOTES, 'UTF-8');
|
||||
|
||||
$this->setMetaData('viewport', 'width=device-width, initial-scale=1');
|
||||
// Build logo/title
|
||||
if ($params->get('logoFile')) {
|
||||
$logo = HTMLHelper::_(
|
||||
'image',
|
||||
Uri::root(false) . htmlspecialchars($params->get('logoFile'), ENT_QUOTES),
|
||||
$sitename,
|
||||
['loading' => 'eager', 'decoding' => 'async'],
|
||||
false,
|
||||
0
|
||||
);
|
||||
} elseif ($params->get('siteTitle')) {
|
||||
$logo = '<span title="' . $sitename . '">' . htmlspecialchars($params->get('siteTitle'), ENT_COMPAT, 'UTF-8') . '</span>';
|
||||
} else {
|
||||
$logo = HTMLHelper::_('image', 'full_logo.png', $sitename, ['class' => 'logo d-inline-block', 'loading' => 'eager', 'decoding' => 'async'], true, 0);
|
||||
}
|
||||
|
||||
// Defer font awesome
|
||||
$wa->getAsset('style', 'fontawesome')->setAttribute('rel', 'lazy-stylesheet');
|
||||
// ------------------ 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>
|
||||
<jdoc:include type="metas" />
|
||||
<jdoc:include type="styles" />
|
||||
<jdoc:include type="scripts" />
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="theme-color" content="#ffffff" id="meta-theme-color" />
|
||||
<jdoc:include type="head" />
|
||||
</head>
|
||||
<body data-theme-fab-pos="<?php echo htmlspecialchars($fABodyPos, ENT_QUOTES, 'UTF-8'); ?>">
|
||||
<?php if ($gtmEnabled === 1 && !empty($gtmId)) : ?>
|
||||
<!-- Google Tag Manager (noscript) -->
|
||||
<noscript>
|
||||
<iframe src="https://www.googletagmanager.com/ns.html?id=<?php echo htmlspecialchars($gtmId, ENT_QUOTES, 'UTF-8'); ?>"
|
||||
height="0" width="0" style="display:none;visibility:hidden"></iframe>
|
||||
</noscript>
|
||||
<!-- End Google Tag Manager (noscript) -->
|
||||
<?php endif; ?>
|
||||
|
||||
<body class="site error_site <?php echo $option
|
||||
. ' ' . $wrapper
|
||||
. ' view-' . $view
|
||||
. ($layout ? ' layout-' . $layout : ' no-layout')
|
||||
. ($task ? ' task-' . $task : ' no-task')
|
||||
. ($itemid ? ' itemid-' . $itemid : '')
|
||||
. ' ' . $pageclass;
|
||||
echo ($this->direction == 'rtl' ? ' rtl' : '');
|
||||
?>">
|
||||
<!-- ========== DUPLICATED HEADER FROM INDEX ========== -->
|
||||
<header class="header container-header full-width<?php echo $stickyHeader ? ' position-sticky sticky-top' : ''; ?>">
|
||||
<?php if ($this->countModules('topbar')) : ?>
|
||||
<div class="container-topbar">
|
||||
<jdoc:include type="modules" name="topbar" style="none" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<header class="header container-header full-width">
|
||||
<?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 $logo; ?>
|
||||
</a>
|
||||
<?php if ($this->params->get('siteDescription')) : ?>
|
||||
<div class="site-description"><?php echo htmlspecialchars($this->params->get('siteDescription')); ?></div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->countModules('menu') || $this->countModules('search')) : ?>
|
||||
<div class="grid-child container-nav">
|
||||
<?php if ($this->countModules('menu')) : ?>
|
||||
<jdoc:include type="modules" name="menu" style="none" />
|
||||
<?php endif; ?>
|
||||
<?php if ($this->countModules('search')) : ?>
|
||||
<div class="container-search">
|
||||
<jdoc:include type="modules" name="search" style="none" />
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</header>
|
||||
<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; ?>
|
||||
|
||||
<div class="site-grid">
|
||||
<div class="grid-child container-component">
|
||||
<h1 class="page-header"><?php echo Text::_('JERROR_LAYOUT_PAGE_NOT_FOUND'); ?></h1>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<jdoc:include type="message" />
|
||||
<p><strong><?php echo Text::_('JERROR_LAYOUT_ERROR_HAS_OCCURRED_WHILE_PROCESSING_YOUR_REQUEST'); ?></strong></p>
|
||||
<p><?php echo Text::_('JERROR_LAYOUT_NOT_ABLE_TO_VISIT'); ?></p>
|
||||
<ul>
|
||||
<li><?php echo Text::_('JERROR_LAYOUT_AN_OUT_OF_DATE_BOOKMARK_FAVOURITE'); ?></li>
|
||||
<li><?php echo Text::_('JERROR_LAYOUT_MIS_TYPED_ADDRESS'); ?></li>
|
||||
<li><?php echo Text::_('JERROR_LAYOUT_SEARCH_ENGINE_OUT_OF_DATE_LISTING'); ?></li>
|
||||
<li><?php echo Text::_('JERROR_LAYOUT_YOU_HAVE_NO_ACCESS_TO_THIS_PAGE'); ?></li>
|
||||
</ul>
|
||||
<p><?php echo Text::_('JERROR_LAYOUT_GO_TO_THE_HOME_PAGE'); ?></p>
|
||||
<p><a href="<?php echo $this->baseurl; ?>/index.php" class="btn btn-secondary"><span class="icon-home" aria-hidden="true"></span> <?php echo Text::_('JERROR_LAYOUT_HOME_PAGE'); ?></a></p>
|
||||
<hr>
|
||||
<p><?php echo Text::_('JERROR_LAYOUT_PLEASE_CONTACT_THE_SYSTEM_ADMINISTRATOR'); ?></p>
|
||||
<blockquote>
|
||||
<span class="badge bg-secondary"><?php echo $this->error->getCode(); ?></span> <?php echo htmlspecialchars($this->error->getMessage(), ENT_QUOTES, 'UTF-8'); ?>
|
||||
</blockquote>
|
||||
<?php if ($this->debug) : ?>
|
||||
<div>
|
||||
<?php echo $this->renderBacktrace(); ?>
|
||||
<?php // Check if there are more Exceptions and render their data as well ?>
|
||||
<?php if ($this->error->getPrevious()) : ?>
|
||||
<?php $loop = true; ?>
|
||||
<?php // Reference $this->_error here and in the loop as setError() assigns errors to this property and we need this for the backtrace to work correctly ?>
|
||||
<?php // Make the first assignment to setError() outside the loop so the loop does not skip Exceptions ?>
|
||||
<?php $this->setError($this->_error->getPrevious()); ?>
|
||||
<?php while ($loop === true) : ?>
|
||||
<p><strong><?php echo Text::_('JERROR_LAYOUT_PREVIOUS_ERROR'); ?></strong></p>
|
||||
<p><?php echo htmlspecialchars($this->_error->getMessage(), ENT_QUOTES, 'UTF-8'); ?></p>
|
||||
<?php echo $this->renderBacktrace(); ?>
|
||||
<?php $loop = $this->setError($this->_error->getPrevious()); ?>
|
||||
<?php endwhile; ?>
|
||||
<?php // Reset the main error object to the base error ?>
|
||||
<?php $this->setError($this->error); ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php if ($this->countModules('footer')) : ?>
|
||||
<footer class="container-footer footer full-width">
|
||||
<div class="grid-child">
|
||||
<jdoc:include type="modules" name="footer" style="none" />
|
||||
</div>
|
||||
</footer>
|
||||
<?php endif; ?>
|
||||
<?php if ($brandEnabled) : ?>
|
||||
<div class="grid-child">
|
||||
<div class="navbar-brand">
|
||||
<a class="brand-logo" href="<?php echo $this->baseurl; ?>/">
|
||||
<?php echo $logo; ?>
|
||||
</a>
|
||||
<?php if (!empty($siteDescription)) : ?>
|
||||
<div class="site-description"><?php echo htmlspecialchars($siteDescription); ?></div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<jdoc:include type="modules" name="debug" style="none" />
|
||||
<?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>
|
||||
|
||||
<?php if ($this->countModules('menu', true) || $this->countModules('search', true)) : ?>
|
||||
<div class="grid-child container-nav">
|
||||
<?php if ($this->countModules('menu', true)) : ?>
|
||||
<jdoc:include type="modules" name="menu" style="none" />
|
||||
<?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 DUPLICATED 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="fas 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="fas 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 py-4">
|
||||
<?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,110 +1,151 @@
|
||||
{
|
||||
"$schema": "https://developer.joomla.org/schemas/json-schema/web_assets.json",
|
||||
"name": "moko-cassiopeia",
|
||||
"version": "4.0.0",
|
||||
"description": "This file contains details of the assets used by moko-cassiopeia, the default Joomla 4 site template.",
|
||||
"license": "GPL-2.0-or-later",
|
||||
"assets": [
|
||||
{
|
||||
"name": "template.MOKO-CASSIOPEIA.ltr",
|
||||
"description": "The css file to be used when the site is left to right (LTR).",
|
||||
"type": "style",
|
||||
"uri": "template.min.css",
|
||||
"dependencies": [
|
||||
"fontawesome"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "template.MOKO-CASSIOPEIA.rtl",
|
||||
"description": "The css file to be used when the site is right to left (RTL).",
|
||||
"type": "style",
|
||||
"uri": "template-rtl.min.css",
|
||||
"dependencies": [
|
||||
"fontawesome"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "template.offline",
|
||||
"description": "The css file to be used when the site is offline and offline.php is being used.",
|
||||
"type": "style",
|
||||
"uri": "offline.css"
|
||||
},
|
||||
{
|
||||
"name": "template.active.language",
|
||||
"description": "An asset to allow language specific css, eg 'language/[lang-CODE]/[lang-CODE].css', to use it as a dependency to the active template",
|
||||
"type": "style",
|
||||
"uri": "",
|
||||
"class": "LangActiveAssetItem",
|
||||
"dependencies": [
|
||||
"template.active"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "template.user",
|
||||
"description": "A file where a user can add their own css.",
|
||||
"type": "style",
|
||||
"uri": "user.css",
|
||||
"weight": 500,
|
||||
"dependencies": [
|
||||
"template.active",
|
||||
"template.active.language"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "template.MOKO-CASSIOPEIA",
|
||||
"description": "The file containing the javascript for this template.",
|
||||
"type": "script",
|
||||
"uri": "template.js",
|
||||
"attributes" : {
|
||||
"defer": true
|
||||
},
|
||||
"dependencies": [
|
||||
"core"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "template.active",
|
||||
"description": "A dummy asset to allow extensions to use it as a dependency to the active template.",
|
||||
"type": "script",
|
||||
"uri": "",
|
||||
"dependencies": [
|
||||
"template.MOKO-CASSIOPEIA"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "template.user",
|
||||
"description": "The name of a file where a user can add their own javascript",
|
||||
"type": "script",
|
||||
"uri": "user.js",
|
||||
"dependencies": [
|
||||
"template.active"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "template.MOKO-CASSIOPEIA.ltr",
|
||||
"type": "preset",
|
||||
"dependencies": [
|
||||
"template.MOKO-CASSIOPEIA.ltr#style",
|
||||
"template.MOKO-CASSIOPEIA#script"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "template.MOKO-CASSIOPEIA.rtl",
|
||||
"type": "preset",
|
||||
"dependencies": [
|
||||
"template.MOKO-CASSIOPEIA.rtl#style",
|
||||
"template.MOKO-CASSIOPEIA#script"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "searchtools",
|
||||
"type": "style",
|
||||
"uri": "system/searchtools/searchtools.min.css"
|
||||
},
|
||||
{
|
||||
"name": "fontawesome",
|
||||
"type": "style",
|
||||
"uri": "system/joomla-fontawesome.min.css"
|
||||
}
|
||||
]
|
||||
"$schema": "https://developer.joomla.org/schemas/json-schema/web_assets.json",
|
||||
"name": "tpl_moko-cassiopeia",
|
||||
"version": "02.00",
|
||||
"description": "Moko-Cassiopeia template assets",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"x-header":
|
||||
{
|
||||
"copyright_year": 2025,
|
||||
"author": "Jonathan Miller",
|
||||
"owner": "Moko Consulting",
|
||||
"contact": "hello@mokoconsulting.tech",
|
||||
"project": "Moko-Cassiopeia 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/."
|
||||
},
|
||||
"assets": [
|
||||
{
|
||||
"name": "template.base",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/moko-cassiopeia/css/template.css",
|
||||
"attributes":
|
||||
{
|
||||
"media": "all"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "template.user",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/moko-cassiopeia/css/user.css",
|
||||
"attributes":
|
||||
{
|
||||
"media": "all"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "template.editor",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/moko-cassiopeia/css/editor.css",
|
||||
"attributes":
|
||||
{
|
||||
"media": "all"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "vendor.vmbasic",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/moko-cassiopeia/css/vendor/vmbasic.css",
|
||||
"attributes":
|
||||
{
|
||||
"media": "all"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "vendor.gable",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/moko-cassiopeia/css/vendor/gable.css",
|
||||
"attributes":
|
||||
{
|
||||
"media": "all"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "vendor.bootstrap-toc",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/moko-cassiopeia/css/vendor/afeld/bootstrap-toc.min.css",
|
||||
"attributes":
|
||||
{
|
||||
"media": "all"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "template.light.colors_standard",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/moko-cassiopeia/css/global/colors/light/colors_standard.css"
|
||||
},
|
||||
{
|
||||
"name": "template.light.colors_alternative",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/moko-cassiopeia/css/global/colors/light/colors_alternative.css"
|
||||
},
|
||||
{
|
||||
"name": "template.light.colors_custom",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/moko-cassiopeia/css/global/colors/light/colors_custom.css"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "template.dark.colors_standard",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/moko-cassiopeia/css/global/colors/dark/colors_standard.css"
|
||||
},
|
||||
{
|
||||
"name": "template.dark.colors_alternative",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/moko-cassiopeia/css/global/colors/dark/colors_alternative.css"
|
||||
},
|
||||
{
|
||||
"name": "template.dark.colors_custom",
|
||||
"type": "style",
|
||||
"uri": "media/templates/site/moko-cassiopeia/css/global/colors/dark/colors_custom.css"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "template.js",
|
||||
"type": "script",
|
||||
"uri": "media/templates/site/moko-cassiopeia/js/template.js",
|
||||
"attributes":
|
||||
{
|
||||
"defer": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "theme-init.js",
|
||||
"type": "script",
|
||||
"uri": "media/templates/site/moko-cassiopeia/js/theme-init.js",
|
||||
"attributes":
|
||||
{
|
||||
"defer": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "darkmode-toggle.js",
|
||||
"type": "script",
|
||||
"uri": "media/templates/site/moko-cassiopeia/js/darkmode-toggle.js",
|
||||
"attributes":
|
||||
{
|
||||
"defer": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "gtm.js",
|
||||
"type": "script",
|
||||
"uri": "media/templates/site/moko-cassiopeia/js/gtm.js",
|
||||
"attributes":
|
||||
{
|
||||
"defer": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "vendor.bootstrap-toc.js",
|
||||
"type": "script",
|
||||
"uri": "media/templates/site/moko-cassiopeia/js/vendor/afeld/bootstrap-toc.min.js",
|
||||
"attributes":
|
||||
{
|
||||
"defer": true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,263 +1,91 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Site
|
||||
* @subpackage Templates.moko-cassiopeia
|
||||
* @file /templates/moko-cassiopeia/offline.php
|
||||
* @subpackage Templates.Moko-Cassiopeia
|
||||
*
|
||||
* @copyright © 2025 Moko Consulting — All Rights Reserved
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*
|
||||
* Website: https://mokoconsulting.tech
|
||||
* Email: hello@mokoconsulting.tech
|
||||
* Phone: +1 (931) 279-6313
|
||||
* Offline template that explicitly loads css/template.css and css/colors_*.css.
|
||||
* Includes: site-name-in-title rules, brand (logo OR title), theme switcher,
|
||||
* module positions (offline-header, offline), and login inside Bootstrap accordion.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Component\ComponentHelper;
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Helper\AuthenticationHelper;
|
||||
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\CMS\Document\HtmlDocument $this
|
||||
* @var \Joomla\Registry\Registry $this->params
|
||||
* @var string $this->language
|
||||
* @var string $this->direction
|
||||
*/
|
||||
|
||||
$extraButtons = AuthenticationHelper::getLoginButtons('form-login');
|
||||
$app = Factory::getApplication();
|
||||
$wa = $this->getWebAssetManager();
|
||||
$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/';
|
||||
|
||||
if ($this->params->get('offlineEmbed')) {
|
||||
$fullWidth = 1;
|
||||
$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 {
|
||||
$fullWidth = 0;
|
||||
$doc->setTitle($baseTitle);
|
||||
}
|
||||
$doc->setMetaData('robots', 'noindex, nofollow');
|
||||
|
||||
// Template path
|
||||
$templatePath = 'media/templates/site/moko-cassiopeia';
|
||||
|
||||
// Color Theme
|
||||
$paramsColorName = $this->params->get('colorName', 'colors_standard');
|
||||
$assetColorName = 'theme.' . $paramsColorName;
|
||||
$wa->registerAndUseStyle($assetColorName, $templatePath . '/css/global/' . $paramsColorName . '.css');
|
||||
|
||||
// Use a font scheme if set in the template style options
|
||||
$paramsFontScheme = $this->params->get('useFontScheme', false);
|
||||
$fontStyles = '';
|
||||
|
||||
if ($paramsFontScheme) {
|
||||
if (stripos($paramsFontScheme, 'https://') === 0) {
|
||||
$this->getPreloadManager()->preconnect('https://fonts.googleapis.com/', ['crossorigin' => 'anonymous']);
|
||||
$this->getPreloadManager()->preconnect('https://fonts.gstatic.com/', ['crossorigin' => 'anonymous']);
|
||||
$this->getPreloadManager()->preload($paramsFontScheme, ['as' => 'style', 'crossorigin' => 'anonymous']);
|
||||
$wa->registerAndUseStyle('fontscheme.current', $paramsFontScheme, [], ['media' => 'print', 'rel' => 'lazy-stylesheet', 'onload' => 'this.media=\'all\'', 'crossorigin' => 'anonymous']);
|
||||
|
||||
if (preg_match_all('/family=([^?:]*):/i', $paramsFontScheme, $matches) > 0) {
|
||||
$fontStyles = '--font-family-body: "' . str_replace('+', ' ', $matches[1][0]) . '", sans-serif;
|
||||
--font-family-headings: "' . str_replace('+', ' ', isset($matches[1][1]) ? $matches[1][1] : $matches[1][0]) . '", sans-serif;
|
||||
--font-weight-normal: 400;
|
||||
--font-weight-headings: 700;';
|
||||
}
|
||||
} else {
|
||||
$wa->registerAndUseStyle('fontscheme.current', $paramsFontScheme, ['version' => 'auto'], ['media' => 'print', 'rel' => 'lazy-stylesheet', 'onload' => 'this.media=\'all\'']);
|
||||
$this->getPreloadManager()->preload($wa->getAsset('style', 'fontscheme.current')->getUri() . '?' . $this->getMediaVersion(), ['as' => 'style']);
|
||||
}
|
||||
}
|
||||
|
||||
// Enable assets
|
||||
$wa->usePreset('template.MOKO-CASSIOPEIA.' . ($this->direction === 'rtl' ? 'rtl' : 'ltr'))
|
||||
->useStyle('template.active.language')
|
||||
->useStyle('template.offline')
|
||||
->useStyle('template.user')
|
||||
->useScript('template.user')
|
||||
->addInlineStyle(":root {
|
||||
--hue: 214;
|
||||
--template-bg-light: #f0f4fb;
|
||||
--template-text-dark: #495057;
|
||||
--template-text-light: #ffffff;
|
||||
--template-link-color: #2a69b8;
|
||||
--template-special-color: #001B4C;
|
||||
$fontStyles
|
||||
}");
|
||||
|
||||
// Override 'template.active' asset to set correct ltr/rtl dependency
|
||||
$wa->registerStyle('template.active', '', [], [], ['template.MOKO-CASSIOPEIA.' . ($this->direction === 'rtl' ? 'rtl' : 'ltr')]);
|
||||
$this->addStyleSheet('//cdn-images.mailchimp.com/embedcode/classic-061523.css');
|
||||
// Logo file or site title param
|
||||
$sitename = htmlspecialchars($app->get('sitename'), ENT_QUOTES, 'UTF-8');
|
||||
|
||||
// Browsers support SVG favicons
|
||||
$this->addHeadLink(HTMLHelper::_('image', 'favicon.svg', '', [], true, 1), 'icon', 'rel', ['type' => 'image/svg+xml']);
|
||||
$this->addHeadLink(HTMLHelper::_('image', 'favicon.ico', '', [], true, 1), 'alternate icon', 'rel', ['type' => 'image/vnd.microsoft.icon']);
|
||||
$this->addHeadLink(HTMLHelper::_('image', 'favicon.svg', '', [], true, 1), 'mask-icon', 'rel', ['color' => '#fff']);
|
||||
|
||||
|
||||
//add Bootsrap 5 Support
|
||||
HTMLHelper::_('bootstrap.alert');
|
||||
HTMLHelper::_('bootstrap.button');
|
||||
HTMLHelper::_('bootstrap.carousel');
|
||||
HTMLHelper::_('bootstrap.collapse');
|
||||
HTMLHelper::_('bootstrap.dropdown');
|
||||
HTMLHelper::_('bootstrap.modal');
|
||||
HTMLHelper::_('bootstrap.offcanvas');
|
||||
HTMLHelper::_('bootstrap.popover');
|
||||
HTMLHelper::_('bootstrap.scrollspy');
|
||||
HTMLHelper::_('bootstrap.tab');
|
||||
HTMLHelper::_('bootstrap.tooltip');
|
||||
HTMLHelper::_('bootstrap.toast');
|
||||
|
||||
|
||||
if ($this->params->get('logoFile')) {
|
||||
$logo = HTMLHelper::_('image', Uri::root(false) . htmlspecialchars($this->params->get('logoFile'), ENT_QUOTES), $sitename, ['class' => 'logo d-inline-block', 'loading' => 'eager', 'decoding' => 'async'], false, 0);
|
||||
} elseif ($this->params->get('siteTitle')) {
|
||||
$logo = '<span title="' . $sitename . '">' . htmlspecialchars($this->params->get('siteTitle'), ENT_COMPAT, 'UTF-8') . '</span>';
|
||||
} else {
|
||||
$logo = HTMLHelper::_('image', 'logo.svg', $sitename, ['class' => 'logo d-inline-block', 'loading' => 'eager', 'decoding' => 'async'], true, 0);
|
||||
}
|
||||
|
||||
if($this->params->get('fA6KitCode')){
|
||||
//build unique kit embed code
|
||||
$fa6Kit="https://kit.fontawesome.com/".$this->params->get('fA6KitCode').".js";
|
||||
|
||||
//adding FontAwesome V6 Kit Code
|
||||
JHtml::_('script', $fa6Kit, array('crossorigin' => 'anonymous'));
|
||||
} else {
|
||||
// Defer fontawesome for increased performance. Once the page is loaded javascript changes it to a stylesheet.
|
||||
$wa->getAsset('style', 'fontawesome')->setAttribute('rel', 'lazy-stylesheet');
|
||||
}
|
||||
|
||||
if ($app->get('offline_image')){
|
||||
//echo HTMLHelper::_('image', $app->get('offline_image'), $sitename, ['class' => 'offline-image'], false, 0);
|
||||
$backgroundstyle='
|
||||
body {
|
||||
background-image: url('.$app->get('offline_image').');
|
||||
background-repeat: no-repeat;
|
||||
background-attachment: fixed;
|
||||
background-size: cover;
|
||||
}';
|
||||
$this->addStyleDeclaration($backgroundstyle);
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html 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" />
|
||||
|
||||
</head>
|
||||
<body class="site">
|
||||
<div class="outer">
|
||||
<div class="offline-card">
|
||||
<div class="header">
|
||||
<?php if (!empty($logo)) : ?>
|
||||
<h1><?php echo $logo; ?></h1>
|
||||
<?php else : ?>
|
||||
<h1><?php echo $sitename; ?></h1>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->countModules('offline-header')) : ?>
|
||||
<jdoc:include type="modules" name="offline-header" style="none" />
|
||||
<?php endif; ?></div><div class="offline-message">
|
||||
<?php if ($app->get('display_offline_message', 1) == 1 && str_replace(' ', '', $app->get('offline_message')) != '') : ?>
|
||||
<p><?php echo $app->get('offline_message'); ?></p>
|
||||
<?php elseif ($app->get('display_offline_message', 1) == 2) : ?>
|
||||
<p><?php echo Text::_('JOFFLINE_MESSAGE'); ?></p>
|
||||
<?php endif; ?></div>
|
||||
<?php if ($this->countModules('offline')) : ?>
|
||||
<jdoc:include type="modules" name="offline" style="none" />
|
||||
<?php endif; ?></div>
|
||||
|
||||
</div>
|
||||
<a id="offline-login-link" data-bs-toggle="collapse" href="#collapseLogin" role="button" aria-expanded="false" aria-controls="collapseLogin">
|
||||
<div class="logo-icon">
|
||||
<svg version="1.1" xmlns="https://www.w3.org/2000/svg" x="0px" y="0px"
|
||||
viewBox="0 0 74.8 74.8" enable-background="new 0 0 74.8 74.8" xml:space="preserve">
|
||||
<title>Login Override</title>
|
||||
<g id="brandmark">
|
||||
<path id="j-green" fill="#1C3D5C" d="M13.5,37.7L12,36.3c-4.5-4.5-5.8-10.8-4.2-16.5c-4.5-1-7.8-5-7.8-9.8c0-5.5,4.5-10,10-10 c5,0,9.1,3.6,9.9,8.4c5.4-1.3,11.3,0.2,15.5,4.4l0.6,0.6l-7.4,7.4l-0.6-0.6c-2.4-2.4-6.3-2.4-8.7,0c-2.4,2.4-2.4,6.3,0,8.7l1.4,1.4 l7.4,7.4l7.8,7.8l-7.4,7.4l-7.8-7.8L13.5,37.7L13.5,37.7z"/>
|
||||
<path id="j-orange" fill="#1C3D5C" d="M21.8,29.5l7.8-7.8l7.4-7.4l1.4-1.4C42.9,8.4,49.2,7,54.8,8.6C55.5,3.8,59.7,0,64.8,0 c5.5,0,10,4.5,10,10c0,5.1-3.8,9.3-8.7,9.9c1.6,5.6,0.2,11.9-4.2,16.3l-0.6,0.6l-7.4-7.4l0.6-0.6c2.4-2.4,2.4-6.3,0-8.7 c-2.4-2.4-6.3-2.4-8.7,0l-1.4,1.4L37,29l-7.8,7.8L21.8,29.5L21.8,29.5z"/>
|
||||
<path id="j-red" fill="#1C3D5C" d="M55,66.8c-5.7,1.7-12.1,0.4-16.6-4.1l-0.6-0.6l7.4-7.4l0.6,0.6c2.4,2.4,6.3,2.4,8.7,0 c2.4-2.4,2.4-6.3,0-8.7L53,45.1l-7.4-7.4l-7.8-7.8l7.4-7.4l7.8,7.8l7.4,7.4l1.5,1.5c4.2,4.2,5.7,10.2,4.4,15.7 c4.9,0.7,8.6,4.9,8.6,9.9c0,5.5-4.5,10-10,10C60,74.8,56,71.3,55,66.8L55,66.8z"/>
|
||||
<path id="j-blue" fill="#1C3D5C" d="M52.2,46l-7.8,7.8L37,61.2l-1.4,1.4c-4.3,4.3-10.3,5.7-15.7,4.4c-1,4.5-5,7.8-9.8,7.8 c-5.5,0-10-4.5-10-10C0,60,3.3,56.1,7.7,55C6.3,49.5,7.8,43.5,12,39.2l0.6-0.6L20,46l-0.6,0.6c-2.4,2.4-2.4,6.3,0,8.7 c2.4,2.4,6.3,2.4,8.7,0l1.4-1.4l7.4-7.4l7.8-7.8L52.2,46L52.2,46z"/>
|
||||
</g>
|
||||
</svg>
|
||||
</div></a>
|
||||
<div class="collapse" id="collapseLogin">
|
||||
<div class="login">
|
||||
<jdoc:include type="message" />
|
||||
<form action="<?php echo Route::_('index.php', true); ?>" method="post" id="form-login">
|
||||
<fieldset>
|
||||
<label for="username"><?php echo Text::_('JGLOBAL_USERNAME'); ?></label>
|
||||
<input name="username" class="form-control" id="username" type="text">
|
||||
|
||||
<label for="password"><?php echo Text::_('JGLOBAL_PASSWORD'); ?></label>
|
||||
<input name="password" class="form-control" id="password" type="password">
|
||||
|
||||
<?php foreach ($extraButtons as $button) :
|
||||
$dataAttributeKeys = array_filter(array_keys($button), function ($key) {
|
||||
return substr($key, 0, 5) == 'data-';
|
||||
});
|
||||
?>
|
||||
<div class="mod-login__submit form-group">
|
||||
<button type="button"
|
||||
class="btn btn-secondary w-100 mt-4 <?php echo $button['class'] ?? '' ?>"
|
||||
<?php foreach ($dataAttributeKeys as $key) : ?>
|
||||
<?php echo $key ?>="<?php echo $button[$key] ?>"
|
||||
<?php endforeach; ?>
|
||||
<?php if ($button['onclick']) : ?>
|
||||
onclick="<?php echo $button['onclick'] ?>"
|
||||
<?php endif; ?>
|
||||
title="<?php echo Text::_($button['label']) ?>"
|
||||
id="<?php echo $button['id'] ?>"
|
||||
>
|
||||
<?php if (!empty($button['icon'])) : ?>
|
||||
<span class="<?php echo $button['icon'] ?>"></span>
|
||||
<?php elseif (!empty($button['image'])) : ?>
|
||||
<?php echo $button['image']; ?>
|
||||
<?php elseif (!empty($button['svg'])) : ?>
|
||||
<?php echo $button['svg']; ?>
|
||||
<?php endif; ?>
|
||||
<?php echo Text::_($button['label']) ?>
|
||||
</button>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
|
||||
<button type="submit" name="Submit" class="btn btn-primary"><?php echo Text::_('JLOGIN'); ?></button>
|
||||
|
||||
<input type="hidden" name="option" value="com_users">
|
||||
<input type="hidden" name="task" value="user.login">
|
||||
<input type="hidden" name="return" value="<?php echo base64_encode(Uri::base()); ?>">
|
||||
<?php echo HTMLHelper::_('form.token'); ?>
|
||||
</fieldset>
|
||||
</form>
|
||||
</div>
|
||||
</div></div>
|
||||
<?php if ($this->countModules('offline-footer')) : ?>
|
||||
<jdoc:include type="modules" name="offline-footer" style="none" />
|
||||
<?php endif; ?>
|
||||
<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')) : ?>
|
||||
<jdoc:include type="modules" name="footer" style="none" />
|
||||
<?php endif; ?>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<?php if ($this->params->get('backTop') == 1) : ?>
|
||||
<a href="#top" id="back-top" class="back-to-top-link" aria-label="<?php echo Text::_('TPL_MOKO-CASSIOPEIA_BACKTOTOP'); ?>">
|
||||
<span class="icon-arrow-up icon-fw" aria-hidden="true"></span>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
|
||||
<jdoc:include type="modules" name="debug" style="none" />
|
||||
</body>
|
||||
</html>
|
||||
/* -----------------------
|
||||
Offline content from Global Config
|
||||
------------------------ */
|
||||
$displayOfflineMessage = (int) $app->get('display_offline_message', 1); // 0|1|2
|
||||
$offlineMessage = trim((string) $app->get('offline_message', ''));
|
||||
|
||||
/* -----------------------
|
||||
Brand (mutually exclusive: logoFile OR siteTitle)
|
||||
------------------------ */
|
||||
if ($params->get('logoFile')) {
|
||||
$logo = HTMLHelper::_(
|
||||
'image',
|
||||
Uri::root(false) . htmlspecialchars((string) $params->get('logoFile'), ENT_QUOTES, 'UTF-8'),
|
||||
$sitename,
|
||||
[
|
||||
'class' => 'logo d-inline-block',
|
||||
'loading' => 'eager',
|
||||
'decoding' => 'async',
|
||||
'style' => 'max-height:64px;height:auto;width:auto;'
|
||||
],
|
||||
false,
|
||||
0
|
||||
);
|
||||
} elseif ($params->get('siteTitle')) {
|
||||
$logo = '<sp
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
© 2025 Moko Consulting — All Rights Reserved
|
||||
@copyright © 2025 Moko Consulting — All Rights Reserved
|
||||
@license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
|
||||
Website: https://mokoconsulting.tech
|
||||
@@ -21,8 +21,8 @@
|
||||
<server type="extension" name="Moko Consulting">https://raw.githubusercontent.com/mokoconsulting-tech/MokoUpdates/refs/heads/main/joomla/moko-cassiopeia/updates.xml</server>
|
||||
</updateservers>
|
||||
<name>moko-cassiopeia</name>
|
||||
<version>1.15</version>
|
||||
<creationDate>2025-08-20</creationDate>
|
||||
<version>02.00</version>
|
||||
<creationDate>2025-08-23</creationDate>
|
||||
<author>Jonathan Miller || Moko Consulting</author>
|
||||
<authorEmail>hello@mokoconsulting.tech</authorEmail>
|
||||
<copyright>(C)GNU General Public License Version 2 - 2025 Moko Consulting</copyright>
|
||||
@@ -37,6 +37,9 @@
|
||||
<filename>templateDetails.xml</filename>
|
||||
<folder>html</folder>
|
||||
</files>
|
||||
<stylesheets>
|
||||
<stylesheet>media/templates/site/moko-cassiopeia/css/editor.css</stylesheet>
|
||||
</stylesheets>
|
||||
<media destination="templates/site/moko-cassiopeia" folder="media">
|
||||
<folder>js</folder>
|
||||
<folder>css</folder>
|
||||
@@ -76,52 +79,21 @@
|
||||
</languages>
|
||||
<config>
|
||||
<fields name="params">
|
||||
<!-- Advanced tab (non-theme/system options only) -->
|
||||
<fieldset name="advanced">
|
||||
<!--
|
||||
<field name="developmentmode" type="radio" label="TPL_MOKO-CASSIOPEIA_DEVELOPMENTMODE_LABEL" description="TPL_MOKO-CASSIOPEIA_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="brand" type="radio" label="TPL_MOKO-CASSIOPEIA_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" default="media/templates/site/moko-cassiopeia/images/logo.svg" label="TPL_MOKO-CASSIOPEIA_LOGO_LABEL" showon="brand:1" />
|
||||
<field name="siteTitle" type="text" default="" label="TPL_MOKO-CASSIOPEIA_TITLE" filter="string" showon="brand:1" />
|
||||
<field name="siteDescription" type="text" default="" label="TPL_MOKO-CASSIOPEIA_TAGLINE_LABEL" description="TPL_MOKO-CASSIOPEIA_TAGLINE_DESC" filter="string" showon="brand:1" />
|
||||
<field name="fA6KitCode" type="text" default="" label="TPL_MOKO-CASSIOPEIA_FA6KITCODE_LABEL" description="TPL_MOKO-CASSIOPEIA_FA6KITCODE_DESC" filter="string" />
|
||||
<field name="offlineEmbed" type="text" default="" label="TPL_MOKO-CASSIOPEIA_OFFLINEEMBED_LABEL" description="TPL_MOKO-CASSIOPEIA_OFFLINEEMBED_DESC" filter="raw" />
|
||||
<field name="useFontScheme" type="groupedlist" label="TPL_MOKO-CASSIOPEIA_FONT_LABEL" default="0">
|
||||
<option value="0">JNONE</option>
|
||||
<group label="TPL_MOKO-CASSIOPEIA_FONT_GROUP_LOCAL">
|
||||
<option value="media/templates/site/moko-cassiopeia/css/global/fonts-local_roboto.css">Roboto
|
||||
(local)</option>
|
||||
</group>
|
||||
<group label="TPL_MOKO-CASSIOPEIA_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_MOKO-CASSIOPEIA_FONT_NOTE_TEXT" class="alert alert-warning" />
|
||||
<field name="colorName" type="list" label="TPL_MOKO-CASSIOPEIA_COLOR_NAME_LABEL" default="colors_standard">
|
||||
<option value="colors_standard">TPL_MOKO-CASSIOPEIA_COLOR_NAME_STANDARD</option>
|
||||
<option value="colors_alternative">TPL_MOKO-CASSIOPEIA_COLOR_NAME_ALTERNATIVE</option>
|
||||
<option value="colors_custom">TPL_MOKO-CASSIOPEIA_COLOR_NAME_CUSTOM</option>
|
||||
</field>
|
||||
-->
|
||||
<field name="fluidContainer" type="radio" layout="joomla.form.field.radio.switcher" default="0" label="TPL_MOKO-CASSIOPEIA_FLUID_LABEL">
|
||||
<option value="0">TPL_MOKO-CASSIOPEIA_STATIC</option>
|
||||
<option value="1">TPL_MOKO-CASSIOPEIA_FLUID</option>
|
||||
</field>
|
||||
<field name="stickyHeader" type="radio" label="TPL_MOKO-CASSIOPEIA_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_MOKO-CASSIOPEIA_BACKTOTOP_LABEL" layout="joomla.form.field.radio.switcher" default="0" filter="integer">
|
||||
<option value="0">JNO</option>
|
||||
<option value="1">JYES</option>
|
||||
</field>
|
||||
</fieldset>
|
||||
|
||||
<!-- Google tab -->
|
||||
<fieldset name="google">
|
||||
<field name="googletagmanager" type="radio" label="TPL_MOKO-CASSIOPEIA_GOOGLETAGMANAGER_LABEL" description="TPL_MOKO-CASSIOPEIA_GOOGLETAGMANAGER_DESC" layout="joomla.form.field.radio.switcher" filter="boolean">
|
||||
<option value="0">JNO</option>
|
||||
@@ -134,14 +106,132 @@
|
||||
</field>
|
||||
<field name="googleanalyticsid" type="text" default="" label="TPL_MOKO-CASSIOPEIA_GOOGLEANALYTICSID_LABEL" description="TPL_MOKO-CASSIOPEIA_GOOGLEANALYTICSID_DESC" filter="string" showon="googleanalytics:1" />
|
||||
</fieldset>
|
||||
<fieldset name="custom_head">
|
||||
|
||||
<!-- Custom Code tab -->
|
||||
<fieldset name="custom_head" label="TPL_MOKO-CASSIOPEIA_CUSTOM_CODE_FIELDSET">
|
||||
<field name="custom_head_start" type="textarea" default="" label="TPL_MOKO-CASSIOPEIA_CUSTOM_HEAD_START_LABEL" description="TPL_MOKO-CASSIOPEIA_CUSTOM_HEAD_START_DESC" filter="raw" />
|
||||
<field name="custom_head_end" type="textarea" default="" label="TPL_MOKO-CASSIOPEIA_CUSTOM_HEAD_END_LABEL" description="TPL_MOKO-CASSIOPEIA_CUSTOM_HEAD_END_DESC" filter="raw" />
|
||||
</fieldset>
|
||||
|
||||
<!-- Drawers tab -->
|
||||
<fieldset name="drawers">
|
||||
<field name="drawerLeftIcon" type="text" default="fa-solid fa-chevron-right" label="TPL_MOKO-CASSIOPEIA_DRAWER_LEFT_ICON_LABEL" description="TPL_MOKO-CASSIOPEIA_DRAWER_LEFT_ICON_DESC" filter="string" />
|
||||
<field name="drawerRightIcon" type="text" default="fa-solid fa-chevron-left" label="TPL_MOKO-CASSIOPEIA_DRAWER_RIGHT_ICON_LABEL" description="TPL_MOKO-CASSIOPEIA_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_MOKO-CASSIOPEIA_COLOR_LIGHT_NAME_LABEL" default="colors_standard">
|
||||
<option value="colors_standard">TPL_MOKO-CASSIOPEIA_COLOR_NAME_STANDARD</option>
|
||||
<option value="colors_alternative">TPL_MOKO-CASSIOPEIA_COLOR_NAME_ALTERNATIVE</option>
|
||||
<option value="colors_custom">TPL_MOKO-CASSIOPEIA_COLOR_NAME_CUSTOM</option>
|
||||
</field>
|
||||
<field name="colorDarkName" type="list" label="TPL_MOKO-CASSIOPEIA_COLOR_DARK_NAME_LABEL" default="colors_standard">
|
||||
<option value="colors_standard">TPL_MOKO-CASSIOPEIA_COLOR_NAME_STANDARD</option>
|
||||
<option value="colors_alternative">TPL_MOKO-CASSIOPEIA_COLOR_NAME_ALTERNATIVE</option>
|
||||
<option value="colors_custom">TPL_MOKO-CASSIOPEIA_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_MOKO-CASSIOPEIA_FONT_LABEL" default="0">
|
||||
<option value="0">JNONE</option>
|
||||
<group label="TPL_MOKO-CASSIOPEIA_FONT_GROUP_LOCAL">
|
||||
<option value="media/templates/site/moko-cassiopeia/css/global/fonts-local_roboto.css">Roboto (local)</option>
|
||||
</group>
|
||||
<group label="TPL_MOKO-CASSIOPEIA_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_MOKO-CASSIOPEIA_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_MOKO-CASSIOPEIA_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" default="media/templates/site/moko-cassiopeia/images/logo.svg" label="TPL_MOKO-CASSIOPEIA_LOGO_LABEL" showon="brand:1" />
|
||||
<field name="siteTitle" type="text" default="" label="TPL_MOKO-CASSIOPEIA_TITLE" filter="string" showon="brand:1" />
|
||||
<field name="siteDescription" type="text" default="" label="TPL_MOKO-CASSIOPEIA_TAGLINE_LABEL" description="TPL_MOKO-CASSIOPEIA_TAGLINE_DESC" filter="string" showon="brand:1" />
|
||||
<field name="fA6KitCode" type="text" default="" label="TPL_MOKO-CASSIOPEIA_FA6KITCODE_LABEL" description="TPL_MOKO-CASSIOPEIA_FA6KITCODE_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_MOKO-CASSIOPEIA_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_MOKO-CASSIOPEIA_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