diff --git a/CHANGELOG.md b/CHANGELOG.md index b7ed2cf..49e9063 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,11 +8,15 @@ DEFGROUP: Joomla.Template.Site INGROUP: Moko-Cassiopeia.Documentation PATH: ./CHANGELOG.md - VERSION: 03.05.00 + VERSION: 03.06.00 BRIEF: Changelog file documenting version history of Moko-Cassiopeia --> -# Changelog — Moko-Cassiopeia (VERSION: 03.05.00) +# Changelog — Moko-Cassiopeia (VERSION: 03.06.00) + +## [03.06.00] 2026-01-28 +### Changed +- Updated version to 03.06.00 across all files ## [03.05.01] 2026-01-09 ### Added diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 8ece2af..5f44283 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -10,7 +10,7 @@ INGROUP: Moko-Cassiopeia.Governance REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia FILE: CODE_OF_CONDUCT.md - VERSION: 03.05.00 + VERSION: 03.06.00 BRIEF: Contributor code of conduct for the Moko-Cassiopeia project. PATH: /CODE_OF_CONDUCT.md NOTE: This document defines behavioral expectations and enforcement processes. @@ -86,7 +86,7 @@ This project is managed from Tennessee, USA. This statement is informational and * **Repository:** [https://github.com/mokoconsulting-tech/moko-cassiopeia](https://github.com/mokoconsulting-tech/moko-cassiopeia) * **Path:** /CODE_OF_CONDUCT.md * **Owner:** Moko Consulting -* **Version:** 03.05.00 +* **Version:** 03.06.00 * **Status:** Active * **Effective Date:** 2025-12-18 * **Last Reviewed:** 2025-12-18 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 44dd89c..a5079b5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,7 +10,7 @@ INGROUP: Moko-Cassiopeia.Governance REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia FILE: CONTRIBUTING.md - VERSION: 03.05.00 + VERSION: 03.06.00 BRIEF: Contribution guidelines for the Moko-Cassiopeia project. PATH: /CONTRIBUTING.md NOTE: This document defines contribution workflow, standards, and governance alignment. @@ -133,7 +133,7 @@ Participation in this project is governed by the Code of Conduct. Unacceptable b * **Repository:** [https://github.com/mokoconsulting-tech/moko-cassiopeia](https://github.com/mokoconsulting-tech/moko-cassiopeia) * **Path:** /CONTRIBUTING.md * **Owner:** Moko Consulting -* **Version:** 03.05.00 +* **Version:** 03.06.00 * **Status:** Active * **Effective Date:** 2025-12-18 * **Last Reviewed:** 2025-12-18 diff --git a/GOVERNANCE.md b/GOVERNANCE.md index deb3de2..22329d8 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -10,7 +10,7 @@ INGROUP: Moko-Cassiopeia.Governance REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia FILE: GOVERNANCE.md - VERSION: 03.05.00 + VERSION: 03.06.00 BRIEF: Project governance model, roles, and decision processes for Moko-Cassiopeia. PATH: /GOVERNANCE.md NOTE: This document defines authority, decision making, and escalation paths. @@ -103,7 +103,7 @@ This project is managed from Tennessee, USA. This statement is informational and * **Repository:** [https://github.com/mokoconsulting-tech/moko-cassiopeia](https://github.com/mokoconsulting-tech/moko-cassiopeia) * **Path:** /GOVERNANCE.md * **Owner:** Moko Consulting -* **Version:** 03.05.00 +* **Version:** 03.06.00 * **Status:** Active * **Effective Date:** 2025-12-18 * **Last Reviewed:** 2025-12-18 diff --git a/README.md b/README.md index 4f2ce21..3776fbe 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,11 @@ INGROUP: Moko-Cassiopeia.Documentation REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia FILE: ./README.md - VERSION: 03.05.00 + VERSION: 03.06.00 BRIEF: Documentation for Moko-Cassiopeia template --> -# Moko-Cassiopeia (VERSION: 03.05.00) +# Moko-Cassiopeia (VERSION: 03.06.00) A modern, lightweight enhancement layer for Joomla's Cassiopeia template. diff --git a/SECURITY.md b/SECURITY.md index 1dab51e..fca253d 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -10,7 +10,7 @@ INGROUP: Moko-Cassiopeia.Governance REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia FILE: SECURITY.md - VERSION: 03.05.00 + VERSION: 03.06.00 BRIEF: Security policy and vulnerability reporting process for Moko-Cassiopeia. PATH: /SECURITY.md NOTE: This policy is process oriented and does not replace secure engineering practices. @@ -153,7 +153,7 @@ If you want credit, include the name or handle to list in an advisory. If you pr * **Repository:** [https://github.com/mokoconsulting-tech/moko-cassiopeia](https://github.com/mokoconsulting-tech/moko-cassiopeia) * **Path:** /SECURITY.md * **Owner:** Moko Consulting -* **Version:** 03.05.00 +* **Version:** 03.06.00 * **Status:** Active * **Effective Date:** 2025-12-18 * **Last Reviewed:** 2025-12-18 diff --git a/docs/QUICK_START.md b/docs/QUICK_START.md index 6b63364..879b739 100644 --- a/docs/QUICK_START.md +++ b/docs/QUICK_START.md @@ -271,7 +271,7 @@ make test ### Version Management -- Use semantic versioning: Major.Minor.Patch (03.05.00) +- Use semantic versioning: Major.Minor.Patch (03.06.00) - Update CHANGELOG.md with all changes - Follow the version hierarchy: dev → rc → version → main - Never skip stages in the release process diff --git a/docs/README.md b/docs/README.md index 48ff528..57fc126 100644 --- a/docs/README.md +++ b/docs/README.md @@ -10,7 +10,7 @@ INGROUP: Moko-Cassiopeia.Documentation REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia FILE: docs/README.md - VERSION: 03.05.00 + VERSION: 03.06.00 BRIEF: Documentation index for Moko-Cassiopeia template PATH: /docs/README.md --> @@ -41,7 +41,7 @@ This directory contains comprehensive documentation for the Moko-Cassiopeia Joom * Multi-version testing * **[Roadmap](ROADMAP.md)** - Version-specific roadmap - * Current features (v03.05.00) + * Current features (v03.06.00) * Feature evolution timeline * Planned enhancements * Development priorities @@ -105,7 +105,7 @@ This project adheres to [MokoStandards](https://github.com/mokoconsulting-tech/M * Repository: [https://github.com/mokoconsulting-tech/moko-cassiopeia](https://github.com/mokoconsulting-tech/moko-cassiopeia) * Path: /docs/README.md * Owner: Moko Consulting -* Version: 03.05.00 +* Version: 03.06.00 * Status: Active * Effective Date: 2026-01-09 diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 7fea464..3927f36 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -10,12 +10,12 @@ INGROUP: Moko-Cassiopeia.Documentation REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia FILE: docs/ROADMAP.md - VERSION: 03.05.00 + VERSION: 03.06.00 BRIEF: Version-specific roadmap for Moko-Cassiopeia template PATH: /docs/ROADMAP.md --> -# Moko-Cassiopeia Roadmap (VERSION: 03.05.00) +# Moko-Cassiopeia Roadmap (VERSION: 03.06.00) This document provides a comprehensive, version-specific roadmap for the Moko-Cassiopeia Joomla template, tracking feature evolution, current capabilities, and planned enhancements. @@ -24,7 +24,7 @@ This document provides a comprehensive, version-specific roadmap for the Moko-Ca - [Version Timeline](#version-timeline) - [Past Releases](#past-releases) - [Future Roadmap (5-Year Plan)](#future-roadmap-5-year-plan) -- [Current Release (v03.05.00)](#current-release-v030500) +- [Current Release (v03.06.00)](#current-release-v030600) - [Implemented Features](#implemented-features) - [Planned Features](#planned-features) - [Development Priorities](#development-priorities) @@ -51,9 +51,15 @@ This document provides a comprehensive, version-specific roadmap for the Moko-Ca - Enforced repository compliance with MokoStandards - Improved security posture with automated scanning -### v03.05.00 (2026-01-04) - Workflow & Governance +### v03.06.00 (2026-01-28) - Version Update **Status**: Current Release (in code) +**Changed**: +- Updated version to 03.06.00 across all files + +### v03.05.00 (2026-01-04) - Workflow & Governance +**Status**: Mentioned in CHANGELOG (v03.05.00) + **Added**: - `.github/workflows` directory structure - CODE_OF_CONDUCT.md from MokoStandards @@ -431,7 +437,7 @@ The following versions represent our planned annual major releases, each buildin --- -## Current Release (v03.05.00) +## Current Release (v03.06.00) ### System Requirements - **Joomla**: 4.4.x or 5.x @@ -835,7 +841,7 @@ Have ideas for future features? We welcome community input! * Repository: [https://github.com/mokoconsulting-tech/moko-cassiopeia](https://github.com/mokoconsulting-tech/moko-cassiopeia) * Path: /docs/ROADMAP.md * Owner: Moko Consulting -* Version: 03.05.00 +* Version: 03.06.00 * Status: Active * Last Updated: 2026-01-27 * Classification: Public Open Source Documentation diff --git a/docs/WORKFLOW_GUIDE.md b/docs/WORKFLOW_GUIDE.md index f538784..d9aef1f 100644 --- a/docs/WORKFLOW_GUIDE.md +++ b/docs/WORKFLOW_GUIDE.md @@ -134,7 +134,7 @@ codecept run **How to run:** 1. Go to Actions → Create version branch 2. Click "Run workflow" -3. Enter version (e.g., 03.05.00) +3. Enter version (e.g., 03.06.00) 4. Select branch prefix (dev/, rc/, or version/) 5. Click "Run workflow" @@ -322,7 +322,7 @@ make validate-required git branch -r | grep dev/ # Delete remote branch if needed (carefully!) -git push origin --delete dev/03.05.00 +git push origin --delete dev/03.06.00 ``` #### "Missing required secrets" @@ -381,7 +381,7 @@ phpcs --standard=phpcs.xml --report=source src/ 1. **Always use version branches:** dev/X.Y.Z, rc/X.Y.Z, version/X.Y.Z 2. **Follow hierarchy:** dev → rc → version → main 3. **Update CHANGELOG:** Document all changes in Unreleased section -4. **Semantic versioning:** Major.Minor.Patch (03.05.00) +4. **Semantic versioning:** Major.Minor.Patch (03.06.00) ### Code Quality diff --git a/src/templates/component.php b/src/templates/component.php index a4b0c2d..4669a8e 100644 --- a/src/templates/component.php +++ b/src/templates/component.php @@ -10,7 +10,7 @@ INGROUP: Moko-Cassiopeia REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia PATH: ./templates/moko-cassiopeia/component.php - VERSION: 03.05.00 + VERSION: 03.06.00 BRIEF: Main template index file for Moko-Cassiopeia rendering site layout */ diff --git a/src/templates/custom.php b/src/templates/custom.php index 3b6c38e..94c8e95 100644 --- a/src/templates/custom.php +++ b/src/templates/custom.php @@ -10,7 +10,7 @@ INGROUP: Moko-Cassiopeia REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia PATH: ./templates/moko-cassiopeia/custom.php - VERSION: 03.05.00 + VERSION: 03.06.00 BRIEF: Custom entry template file for Moko-Cassiopeia with user-defined overrides */ diff --git a/src/templates/error.php b/src/templates/error.php index 9610ede..6f9c8f6 100644 --- a/src/templates/error.php +++ b/src/templates/error.php @@ -10,7 +10,7 @@ INGROUP: Moko-Cassiopeia REPO: https://github.com/mokoconsulting-tech/moko-cassiopeia PATH: ./templates/moko-cassiopeia/error.php - VERSION: 03.05.00 + VERSION: 03.06.00 BRIEF: Error page template file for Moko-Cassiopeia */ @@ -26,72 +26,154 @@ $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); + +// Bootstrap behaviors (assets handled via WAM) +HTMLHelper::_('bootstrap.framework'); +HTMLHelper::_('bootstrap.loadCss', true); +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'); + // ------------------ 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'); +$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'); -// ------------------ Styles ------------------ -$wa->useStyle('template.base'); -$wa->useStyle('template.user'); +// Template/Media path +$templatePath = 'media/templates/site/moko-cassiopeia'; -// Light/Dark variable sheets (load before consumers) -if ($wa->assetExists('style', 'template.light.' . $colorLight)) { - $wa->useStyle('template.light.' . $colorLight); +// =========================== +// Web Asset Manager (WAM) — matches your joomla.asset.json +// =========================== + +// Core template CSS +$wa->useStyle('template.global.base'); // css/template.css +$wa->useStyle('template.global.social-media-demo'); // css/global/social-media-demo.css + +// Optional vendor CSS +$wa->useStyle('vendor.bootstrap-toc'); + +// 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/global/light/colors_standard.css'); } -if ($wa->assetExists('style', 'template.dark.' . $colorDark)) { - $wa->useStyle('template.dark.' . $colorDark); +try { + $wa->useStyle('template.dark.colors_standard'); +} catch (\Throwable $e) { + $wa->registerAndUseStyle('template.dark.colors_standard', $templatePath . '/css/global/dark/colors_standard.css'); +} +try { + $wa->useStyle($lightKey); +} catch (\Throwable $e) { + $wa->registerAndUseStyle('template.light.dynamic', $templatePath . '/css/global/light/' . $colorLightKey . '.css'); +} +try { + $wa->useStyle($darkKey); +} catch (\Throwable $e) { + $wa->registerAndUseStyle('template.dark.dynamic', $templatePath . '/css/global/dark/' . $colorDarkKey . '.css'); } -// ------------------ Scripts ------------------ +// Scripts +$wa->useScript('template.js'); $wa->useScript('theme-init.js'); -if ($themeFab === 1) { - $wa->useScript('darkmode-toggle.js'); -} -if ($gtmEnabled === 1) { - $wa->useScript('gtm.js'); +$wa->useScript('darkmode-toggle.js'); +$wa->useScript('vendor.bootstrap-toc.js'); + +// 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'); + } + + } } -// Optional Font Awesome 6 Kit (preferred) or FA5 fallback -if (!empty($fa6KitCode)) { - HTMLHelper::_('script', 'https://kit.fontawesome.com/' . rawurlencode($fa6KitCode) . '.js', [ - 'crossorigin' => 'anonymous' - ]); -} else { - HTMLHelper::_('stylesheet', 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css', ['version' => 'auto'], [ - 'crossorigin' => 'anonymous', - 'referrerpolicy' => 'no-referrer', - ]); -} +$wa->useStyle('template.user'); // css/user.css // ------------------ Context (logo, bootstrap needs) ------------------ $sitename = htmlspecialchars($app->get('sitename'), ENT_QUOTES, 'UTF-8'); -// Build logo/title -if ($params->get('logoFile')) { - $logo = HTMLHelper::_( +// ------------------------------------- +// Brand: logo from params OR siteTitle +// ------------------------------------- +$brandHtml = ''; +$logoFile = (string) $this->params->get('logoFile'); + +if ($logoFile !== '') { + $brandHtml = HTMLHelper::_( 'image', - Uri::root(false) . htmlspecialchars($params->get('logoFile'), ENT_QUOTES), + Uri::root(false) . htmlspecialchars($logoFile, ENT_QUOTES, 'UTF-8'), $sitename, - ['loading' => 'eager', 'decoding' => 'async'], + ['class' => 'logo d-inline-block', 'loading' => 'eager', 'decoding' => 'async'], false, 0 ); -} elseif ($params->get('siteTitle')) { - $logo = '' . htmlspecialchars($params->get('siteTitle'), ENT_COMPAT, 'UTF-8') . ''; +} elseif ($this->params->get('siteTitle')) { + $brandHtml = '' + . htmlspecialchars($this->params->get('siteTitle'), ENT_COMPAT, 'UTF-8') + . ''; } else { - $logo = HTMLHelper::_('image', 'full_logo.png', $sitename, ['class' => 'logo d-inline-block', 'loading' => 'eager', 'decoding' => 'async'], true, 0); + // Fallback to a bundled image (relative to media paths) + $brandHtml = HTMLHelper::_('image', 'full_logo.png', $sitename, ['class' => 'logo d-inline-block', 'loading' => 'eager', 'decoding' => 'async'], true, 0); } // ------------------ Error details ------------------ @@ -103,23 +185,105 @@ $debugOn = defined('JDEBUG') && JDEBUG; - - - + + + + + + + - - + + + + + + - -
+ + + + + + + + + - +
@@ -186,11 +375,11 @@ $debugOn = defined('JDEBUG') && JDEBUG;
- +
@@ -245,7 +434,7 @@ $debugOn = defined('JDEBUG') && JDEBUG;
-