**Major Release** — introduces the long-awaited **Dark Mode Toggle**, streamlining accessibility and usability enhancements. ##Added * **Dark Mode Toggle** * Frontend toggle switch included in template. * JavaScript handles switching between light/dark modes. * Dark mode CSS rules applied across template styles. * Automatic persistence of user choice (via localStorage). * **Header Parameters Update** * Added **logo parameter support** in template settings. * Updated metadata & copyright header. * **Expanded TOC (Table of Contents)** * Automatic TOC injection when enabled. * User selects placement via article > options > layout (`toc-left` or `toc-right`). ##Improved * Cleaned up `index.php` by removing **skip-to-content** duplicate calls. * Consolidated JavaScript asset loading (ensuring dark-mode script is loaded correctly from external JS file). * Streamlined CSS for **toggle switch**, ensuring it inherits Bootstrap/Cassiopeia defaults. * General accessibility refinements in typography and color contrast. ##Fixed * Fixed missing **logo param** in header output. * Corrected stylesheet inconsistencies between Bootstrap 5 helpers and template overrides. * Patched redundant calls in script includes.
174 lines
7.5 KiB
PHP
174 lines
7.5 KiB
PHP
<?php
|
|
/* =========================================================================
|
|
* Copyright (C) 2025 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: Moko-Cassiopeia
|
|
* PATH: templates/moko-cassiopeia/html/com_content/article/toc-left.php
|
|
* VERSION: 02.00
|
|
* BRIEF: Template override for Joomla articles with Table of Contents aligned left
|
|
* =========================================================================
|
|
*/
|
|
|
|
defined('_JEXEC') or die;
|
|
|
|
use Joomla\CMS\Factory;
|
|
use Joomla\CMS\HTML\HTMLHelper;
|
|
use Joomla\CMS\Language\Associations;
|
|
use Joomla\CMS\Language\Text;
|
|
use Joomla\CMS\Layout\FileLayout;
|
|
use Joomla\CMS\Layout\LayoutHelper;
|
|
use Joomla\CMS\Router\Route;
|
|
use Joomla\CMS\Uri\Uri;
|
|
use Joomla\Component\Content\Administrator\Extension\ContentComponent;
|
|
use Joomla\Component\Content\Site\Helper\RouteHelper;
|
|
|
|
// Create shortcuts to some parameters.
|
|
$params = $this->item->params;
|
|
$canEdit = $params->get('access-edit');
|
|
$user = Factory::getUser();
|
|
$info = $params->get('info_block_position', 0);
|
|
$htag = $this->params->get('show_page_heading') ? 'h2' : 'h1';
|
|
|
|
// Check if associations are implemented. If they are, define the parameter.
|
|
$assocParam = (Associations::isEnabled() && $params->get('show_associations'));
|
|
$currentDate = Factory::getDate()->format('Y-m-d H:i:s');
|
|
$isNotPublishedYet = $this->item->publish_up > $currentDate;
|
|
$isExpired = !is_null($this->item->publish_down) && $this->item->publish_down < $currentDate;
|
|
?>
|
|
<div class="com-content-article item-page<?php echo $this->pageclass_sfx; ?>" itemscope itemtype="https://schema.org/Article">
|
|
<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;
|
|
if (!empty($this->item->pagination) && !$this->item->paginationposition && $this->item->paginationrelative) {
|
|
echo $this->item->pagination;
|
|
}
|
|
?>
|
|
|
|
<?php $useDefList = $params->get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date')
|
|
|| $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category') || $params->get('show_author') || $assocParam; ?>
|
|
|
|
<?php if ($params->get('show_title')) : ?>
|
|
<div class="page-header">
|
|
<<?php echo $htag; ?> itemprop="headline">
|
|
<?php echo $this->escape($this->item->title); ?>
|
|
</<?php echo $htag; ?>>
|
|
<?php if ($this->item->state == ContentComponent::CONDITION_UNPUBLISHED) : ?>
|
|
<span class="badge bg-warning text-light"><?php echo Text::_('JUNPUBLISHED'); ?></span>
|
|
<?php endif; ?>
|
|
<?php if ($isNotPublishedYet) : ?>
|
|
<span class="badge bg-warning text-light"><?php echo Text::_('JNOTPUBLISHEDYET'); ?></span>
|
|
<?php endif; ?>
|
|
<?php if ($isExpired) : ?>
|
|
<span class="badge bg-warning text-light"><?php echo Text::_('JEXPIRED'); ?></span>
|
|
<?php endif; ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
<?php if ($canEdit) : ?>
|
|
<?php echo LayoutHelper::render('joomla.content.icons', ['params' => $params, 'item' => $this->item]); ?>
|
|
<?php endif; ?>
|
|
|
|
<?php // Content is generated by content plugin event "onContentAfterTitle" ?>
|
|
<?php echo $this->item->event->afterDisplayTitle; ?>
|
|
|
|
<?php if ($useDefList && ($info == 0 || $info == 2)) : ?>
|
|
<?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 $this->item->tagLayout = new FileLayout('joomla.content.tags'); ?>
|
|
|
|
<?php echo $this->item->tagLayout->render($this->item->tags->itemTags); ?>
|
|
<?php endif; ?>
|
|
|
|
<?php // Content is generated by content plugin event "onContentBeforeDisplay" ?>
|
|
<?php echo $this->item->event->beforeDisplayContent; ?>
|
|
|
|
<?php if ((int) $params->get('urls_position', 0) === 0) : ?>
|
|
<?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 (!empty($this->item->pagination) && !$this->item->paginationposition && !$this->item->paginationrelative) :
|
|
echo $this->item->pagination;
|
|
endif;
|
|
?>
|
|
<div itemprop="articleBody" class="com-content-article__body">
|
|
<div class="container-toc-left">
|
|
<?php
|
|
// Table of Contents header using template language string
|
|
echo '<h2>' . Text::_('TPL_MOKO-CASSIOPEIA_TOC') . '</h2>';
|
|
?>
|
|
<nav id="toc" data-toggle="toc"></nav>
|
|
</div>
|
|
<?php
|
|
echo $this->item->text;
|
|
?>
|
|
|
|
</div>
|
|
|
|
|
|
<?php if ($info == 1 || $info == 2) : ?>
|
|
<?php if ($useDefList) : ?>
|
|
<?php echo LayoutHelper::render('joomla.content.info_block', ['item' => $this->item, 'params' => $params, 'position' => 'below']); ?>
|
|
<?php endif; ?>
|
|
<?php if ($params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
|
|
<?php $this->item->tagLayout = new FileLayout('joomla.content.tags'); ?>
|
|
<?php echo $this->item->tagLayout->render($this->item->tags->itemTags); ?>
|
|
<?php endif; ?>
|
|
<?php endif; ?>
|
|
|
|
<?php
|
|
if (!empty($this->item->pagination) && $this->item->paginationposition && !$this->item->paginationrelative) :
|
|
echo $this->item->pagination;
|
|
?>
|
|
<?php endif; ?>
|
|
<?php if ((int) $params->get('urls_position', 0) === 1) : ?>
|
|
<?php echo $this->loadTemplate('links'); ?>
|
|
<?php endif; ?>
|
|
<?php // Optional teaser intro text for guests ?>
|
|
<?php elseif ($params->get('show_noauth') == true && $user->get('guest')) : ?>
|
|
<?php echo LayoutHelper::render('joomla.content.intro_image', $this->item); ?>
|
|
<?php echo HTMLHelper::_('content.prepare', $this->item->introtext); ?>
|
|
<?php // Optional link to let them register to see the whole article. ?>
|
|
<?php if ($params->get('show_readmore') && $this->item->fulltext != null) : ?>
|
|
<?php $menu = Factory::getApplication()->getMenu(); ?>
|
|
<?php $active = $menu->getActive(); ?>
|
|
<?php $itemId = $active->id; ?>
|
|
<?php $link = new Uri(Route::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false)); ?>
|
|
<?php $link->setVar('return', base64_encode(RouteHelper::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language))); ?>
|
|
<?php echo LayoutHelper::render('joomla.content.readmore', ['item' => $this->item, 'params' => $params, 'link' => $link]); ?>
|
|
<?php endif; ?>
|
|
<?php endif; ?>
|
|
<?php
|
|
if (!empty($this->item->pagination) && $this->item->paginationposition && $this->item->paginationrelative) :
|
|
echo $this->item->pagination;
|
|
?>
|
|
<?php endif; ?>
|
|
<?php // Content is generated by content plugin event "onContentAfterDisplay" ?>
|
|
<?php echo $this->item->event->afterDisplayContent; ?>
|
|
</div>
|
|
|