From 42fd0a78e1a9ad5006da0e413a70722ad8420bb3 Mon Sep 17 00:00:00 2001
From: Jonathan Miller
Date: Sun, 19 Apr 2026 14:02:35 -0500
Subject: [PATCH 01/41] =?UTF-8?q?Restore=20updates.xml=20=E2=80=94=20bulk?=
=?UTF-8?q?=20sync=20overwrote=20it=20again=20[skip=20ci]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
updates.xml | 151 +++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 114 insertions(+), 37 deletions(-)
diff --git a/updates.xml b/updates.xml
index f69d346..3230e5a 100644
--- a/updates.xml
+++ b/updates.xml
@@ -1,39 +1,116 @@
-
- This file is the update server manifest for {{EXTENSION_NAME}}.
- The Joomla installer polls this URL to check for new versions.
-
- The manifest.xml in this repository must reference this file:
-
-
- https://git.mokoconsulting.tech/mokoconsulting-tech/MokoCassiopeia/raw/branch/main/updates.xml
-
-
- https://raw.githubusercontent.com/mokoconsulting-tech/MokoCassiopeia/main/updates.xml
-
-
-
- When a new release is made, run `make release` or the release workflow to
- prepend a new entry to this file automatically.
--->
-
- {{EXTENSION_NAME}}
- MokoCassiopeia — Moko Consulting Joomla extension
- {{EXTENSION_ELEMENT}}
- {{EXTENSION_TYPE}}
- {{VERSION}}
-
-
- https://git.mokoconsulting.tech/mokoconsulting-tech/MokoCassiopeia/releases/download/v{{VERSION}}/{{EXTENSION_ELEMENT}}.zip
-
-
- https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/v{{VERSION}}/{{EXTENSION_ELEMENT}}.zip
-
-
-
- 8.1
-
-
\ No newline at end of file
+
+
+
+ MokoCassiopeia
+ MokoCassiopeia development build — unstable.
+ mokocassiopeia
+ template
+ site
+ 03.10.10
+ 2026-04-19
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/development
+
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.10.zip
+
+ fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
+ development
+ Moko Consulting
+ https://mokoconsulting.tech
+
+ 8.1
+
+
+
+
+ MokoCassiopeia
+ MokoCassiopeia alpha build — early testing.
+ mokocassiopeia
+ template
+ site
+ 03.10.10
+ 2026-04-19
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/alpha
+
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.10.zip
+
+ fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
+ alpha
+ Moko Consulting
+ https://mokoconsulting.tech
+
+ 8.1
+
+
+
+
+ MokoCassiopeia
+ MokoCassiopeia beta build — feature complete, stability testing.
+ mokocassiopeia
+ template
+ site
+ 03.10.10
+ 2026-04-19
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/beta
+
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.10.zip
+
+ fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
+ beta
+ Moko Consulting
+ https://mokoconsulting.tech
+
+ 8.1
+
+
+
+
+ MokoCassiopeia
+ MokoCassiopeia release candidate — testing only.
+ mokocassiopeia
+ template
+ site
+ 03.10.10
+ 2026-04-19
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/release-candidate
+
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.10.zip
+ https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.10.zip
+
+ fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
+ rc
+ Moko Consulting
+ https://mokoconsulting.tech
+
+ 8.1
+
+
+
+
+ MokoCassiopeia
+ Moko Consulting's site template based on Cassiopeia.
+ mokocassiopeia
+ template
+ site
+ 03.10.10
+ 2026-04-19
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/v03
+
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.10.zip
+ https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.10.zip
+
+ fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
+ stable
+ Moko Consulting
+ https://mokoconsulting.tech
+
+ 8.1
+
+
+
From 7e31ea028ffbd7f7df9149096808b4f6ba7917f3 Mon Sep 17 00:00:00 2001
From: Jonathan Miller
Date: Sun, 19 Apr 2026 17:35:28 -0500
Subject: [PATCH 02/41] =?UTF-8?q?Bump=20version=2003.10.10=20=E2=86=92=200?=
=?UTF-8?q?3.10.11?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 4 ++--
src/joomla.asset.json | 2 +-
src/templateDetails.xml | 4 ++--
updates.xml | 26 +++++++++++++-------------
4 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/README.md b/README.md
index a3a0042..15f97be 100644
--- a/README.md
+++ b/README.md
@@ -9,13 +9,13 @@
INGROUP: MokoCassiopeia.Documentation
REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia
FILE: ./README.md
- VERSION: 03.10.10
+ VERSION: 03.10.11
BRIEF: Documentation for MokoCassiopeia template
-->
# MokoCassiopeia → MokoOnyx
-> **This template is being renamed to MokoOnyx.** Version 03.10.10 is the bridge release that automatically migrates your settings. After updating, MokoOnyx will be your active template and MokoCassiopeia can be safely uninstalled.
+> **This template is being renamed to MokoOnyx.** Version 03.10.11 is the bridge release that automatically migrates your settings. After updating, MokoOnyx will be your active template and MokoCassiopeia can be safely uninstalled.
**A Modern, Lightweight Joomla Template Based on Cassiopeia**
diff --git a/src/joomla.asset.json b/src/joomla.asset.json
index 915411b..d7e96fd 100644
--- a/src/joomla.asset.json
+++ b/src/joomla.asset.json
@@ -17,7 +17,7 @@
"defgroup": "Joomla.Template.Site",
"ingroup": "MokoCassiopeia.Template.Assets",
"path": "./media/templates/site/mokocassiopeia/joomla.asset.json",
- "version": "03.10.10",
+ "version": "03.10.11",
"brief": "Joomla asset registry for MokoCassiopeia"
}
},
diff --git a/src/templateDetails.xml b/src/templateDetails.xml
index 13a6271..cb7e4a9 100644
--- a/src/templateDetails.xml
+++ b/src/templateDetails.xml
@@ -39,13 +39,13 @@
MokoCassiopeia
- 03.10.10
+ 03.10.11
script.php
2026-04-15
Jonathan Miller || Moko Consulting
hello@mokoconsulting.tech
(C)GNU General Public License Version 3 - 2026 Moko Consulting
-

MokoCassiopeia Template Description
MokoCassiopeia continues Joomla's tradition of space-themed default templates— building on the legacy of Solarflare (Joomla 1.0), Milkyway (Joomla 1.5), and Protostar (Joomla 3.0).
This template is a customized fork of the Cassiopeia template introduced in Joomla 4, preserving its modern, accessible, and mobile-first foundation while introducing new stylistic enhancements and structural refinements specifically tailored for use by Moko Consulting.
Custom Colour Themes
Starter palette files are included with the template. To create a custom colour scheme, copy templates/mokocassiopeia/templates/light.custom.css to media/templates/site/mokocassiopeia/css/theme/light.custom.css, or templates/mokocassiopeia/templates/dark.custom.css to media/templates/site/mokocassiopeia/css/theme/dark.custom.css. Customise the CSS variables to match your brand, then activate your palette in System → Site Templates → MokoCassiopeia → Theme tab by selecting "Custom" for the Light or Dark Mode Palette. A full variable reference is available in the CSS Variables tab in template options.
Custom CSS & JavaScript
For site-specific styles and scripts that should survive template updates, create the following files:
media/templates/site/mokocassiopeia/css/user.css — loaded on every page for custom CSS overrides. media/templates/site/mokocassiopeia/js/user.js — loaded on every page for custom JavaScript.
These files are gitignored and will not be overwritten by template updates.
Code Attribution
This template is based on the original Cassiopeia template developed by the Joomla! Project and released under the GNU General Public License.
Modifications and enhancements have been made by Moko Consulting in accordance with open-source licensing standards.
It includes integration with Bootstrap TOC, an open-source table of contents generator by A. Feld, licensed under the MIT License.
All third-party libraries and assets remain the property of their respective authors and are credited within their source files where applicable.
]]>
+
MokoCassiopeia Template Description
MokoCassiopeia continues Joomla's tradition of space-themed default templates— building on the legacy of Solarflare (Joomla 1.0), Milkyway (Joomla 1.5), and Protostar (Joomla 3.0).
This template is a customized fork of the Cassiopeia template introduced in Joomla 4, preserving its modern, accessible, and mobile-first foundation while introducing new stylistic enhancements and structural refinements specifically tailored for use by Moko Consulting.
Custom Colour Themes
Starter palette files are included with the template. To create a custom colour scheme, copy templates/mokocassiopeia/templates/light.custom.css to media/templates/site/mokocassiopeia/css/theme/light.custom.css, or templates/mokocassiopeia/templates/dark.custom.css to media/templates/site/mokocassiopeia/css/theme/dark.custom.css. Customise the CSS variables to match your brand, then activate your palette in System → Site Templates → MokoCassiopeia → Theme tab by selecting "Custom" for the Light or Dark Mode Palette. A full variable reference is available in the CSS Variables tab in template options.
Custom CSS & JavaScript
For site-specific styles and scripts that should survive template updates, create the following files:
media/templates/site/mokocassiopeia/css/user.css — loaded on every page for custom CSS overrides. media/templates/site/mokocassiopeia/js/user.js — loaded on every page for custom JavaScript.
These files are gitignored and will not be overwritten by template updates.
Code Attribution
This template is based on the original Cassiopeia template developed by the Joomla! Project and released under the GNU General Public License.
Modifications and enhancements have been made by Moko Consulting in accordance with open-source licensing standards.
It includes integration with Bootstrap TOC, an open-source table of contents generator by A. Feld, licensed under the MIT License.
All third-party libraries and assets remain the property of their respective authors and are credited within their source files where applicable.
]]>
1
component.php
diff --git a/updates.xml b/updates.xml
index 3230e5a..5c61966 100644
--- a/updates.xml
+++ b/updates.xml
@@ -1,7 +1,7 @@
@@ -13,11 +13,11 @@
mokocassiopeia
template
site
- 03.10.10
+ 03.10.11
2026-04-19
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/development
- https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.10.zip
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.11.zip
fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
development
@@ -34,11 +34,11 @@
mokocassiopeia
template
site
- 03.10.10
+ 03.10.11
2026-04-19
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/alpha
- https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.10.zip
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.11.zip
fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
alpha
@@ -55,11 +55,11 @@
mokocassiopeia
template
site
- 03.10.10
+ 03.10.11
2026-04-19
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/beta
- https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.10.zip
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.11.zip
fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
beta
@@ -76,12 +76,12 @@
mokocassiopeia
template
site
- 03.10.10
+ 03.10.11
2026-04-19
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/release-candidate
- https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.10.zip
- https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.10.zip
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.11.zip
+ https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.11.zip
fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
rc
@@ -98,12 +98,12 @@
mokocassiopeia
template
site
- 03.10.10
+ 03.10.11
2026-04-19
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/v03
- https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.10.zip
- https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.10.zip
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.11.zip
+ https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.11.zip
fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
stable
From fd012b4541d09355fbccd6f3a8dd134d1d5d9de0 Mon Sep 17 00:00:00 2001
From: "gitea-actions[bot]"
Date: Sun, 19 Apr 2026 22:35:52 +0000
Subject: [PATCH 03/41] chore: update development SHA-256 for 03.10.11 [skip
ci]
---
updates.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/updates.xml b/updates.xml
index 5c61966..5c93b71 100644
--- a/updates.xml
+++ b/updates.xml
@@ -17,9 +17,9 @@
2026-04-19
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/development
- https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.11.zip
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/development/mokocassiopeia-03.10.11-dev.zip
- fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
+ 2a27ca2e6c6b6a570a437f4d1b3e40bb54cdc37e3998fed10970a7f50593c8ad
development
Moko Consulting
https://mokoconsulting.tech
From 9ce333ebe11cdab0ef74468ef5e2c26e64272bf1 Mon Sep 17 00:00:00 2001
From: Jonathan Miller
Date: Sun, 19 Apr 2026 17:38:02 -0500
Subject: [PATCH 04/41] Bridge: download and install MokoOnyx from Gitea
release
Instead of copying/renaming files, the bridge now:
1. Downloads mokoonyx ZIP from Gitea releases
2. Installs via Joomla's Installer (proper extension registration)
3. Migrates template styles and default assignment
4. Falls back gracefully with manual install link if download fails
Co-Authored-By: Claude Opus 4.6 (1M context)
---
src/helper/bridge.php | 395 +++++++++++++++++-------------------------
1 file changed, 161 insertions(+), 234 deletions(-)
diff --git a/src/helper/bridge.php b/src/helper/bridge.php
index 71d2546..998e036 100644
--- a/src/helper/bridge.php
+++ b/src/helper/bridge.php
@@ -10,16 +10,14 @@
/**
* Bridge migration helper — MokoCassiopeia → MokoOnyx
*
- * Called from script.php during the v03.10.00 update. Copies the template
- * to the new directory name, migrates database records, and sets MokoOnyx
- * as the active site template.
+ * Downloads and installs MokoOnyx from the Gitea release, then migrates
+ * template styles and menu assignments from MokoCassiopeia.
*/
defined('_JEXEC') or die;
use Joomla\CMS\Factory;
-use Joomla\CMS\Filesystem\File;
-use Joomla\CMS\Filesystem\Folder;
+use Joomla\CMS\Installer\Installer;
use Joomla\CMS\Log\Log;
class MokoBridgeMigration
@@ -30,179 +28,166 @@ class MokoBridgeMigration
private const OLD_DISPLAY = 'MokoCassiopeia';
private const NEW_DISPLAY = 'MokoOnyx';
+ /** URL to the latest MokoOnyx stable release ZIP */
+ private const RELEASE_URL = 'https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx/releases/download/v01/mokoonyx-01.00.00.zip';
+
/**
* Run the full migration.
- *
- * @return bool True on success, false on failure.
*/
public static function run(): bool
{
$app = Factory::getApplication();
- $db = Factory::getDbo();
- // 1. Copy template files
- if (!self::copyTemplateFiles()) {
+ // Check if MokoOnyx is already installed
+ if (is_dir(JPATH_ROOT . '/templates/' . self::NEW_NAME)) {
+ self::log('MokoOnyx already installed — skipping download.');
+ self::migrateStyles();
+ self::notifyUser($app);
+ return true;
+ }
+
+ // 1. Download MokoOnyx ZIP
+ $zipPath = self::downloadRelease();
+ if (!$zipPath) {
$app->enqueueMessage(
- 'MokoOnyx migration: failed to copy template files. '
- . 'You can manually copy templates/mokocassiopeia to templates/mokoonyx.',
- 'error'
+ 'MokoOnyx migration: could not download the MokoOnyx template package. '
+ . 'Please install MokoOnyx manually from '
+ . 'Gitea Releases.',
+ 'warning'
);
return false;
}
- // 2. Copy media files
- if (!self::copyMediaFiles()) {
+ // 2. Install MokoOnyx via Joomla's installer
+ $installed = self::installPackage($zipPath);
+
+ // Clean up downloaded ZIP
+ @unlink($zipPath);
+
+ if (!$installed) {
$app->enqueueMessage(
- 'MokoOnyx migration: failed to copy media files. '
- . 'You can manually copy media/templates/site/mokocassiopeia to media/templates/site/mokoonyx.',
+ 'MokoOnyx migration: installation failed. '
+ . 'Please install MokoOnyx manually from '
+ . 'Gitea Releases.',
'warning'
);
+ return false;
}
- // 3. Rename internals in the new copy (templateDetails.xml, language files, etc.)
- self::renameInternals();
+ // 3. Migrate template styles
+ self::migrateStyles();
- // 4. Register the new template in the database
- self::migrateDatabase($db);
-
- // 5. Notify the admin
- $app->enqueueMessage(
- 'MokoCassiopeia has been renamed to MokoOnyx.
'
- . 'Your template settings have been migrated automatically. '
- . 'MokoOnyx is now your active site template. '
- . 'You can safely uninstall MokoCassiopeia from Extensions → Manage.',
- 'success'
- );
+ // 4. Notify admin
+ self::notifyUser($app);
self::log('Bridge migration completed successfully.');
return true;
}
/**
- * Copy template directory.
+ * Download the MokoOnyx ZIP to Joomla's tmp directory.
*/
- private static function copyTemplateFiles(): bool
+ private static function downloadRelease(): ?string
{
- $src = JPATH_ROOT . '/templates/' . self::OLD_NAME;
- $dst = JPATH_ROOT . '/templates/' . self::NEW_NAME;
+ $tmpDir = Factory::getApplication()->get('tmp_path', JPATH_ROOT . '/tmp');
+ $zipPath = $tmpDir . '/mokoonyx-install.zip';
- if (is_dir($dst)) {
- self::log('MokoOnyx template directory already exists — skipping copy.');
- return true;
+ $content = false;
+
+ // Method 1: file_get_contents
+ if (ini_get('allow_url_fopen')) {
+ $ctx = stream_context_create([
+ 'http' => [
+ 'timeout' => 60,
+ 'follow_location' => true,
+ 'max_redirects' => 5,
+ ],
+ 'ssl' => [
+ 'verify_peer' => true,
+ 'verify_peer_name' => true,
+ ],
+ ]);
+ $content = @file_get_contents(self::RELEASE_URL, false, $ctx);
}
- if (!is_dir($src)) {
- self::log('Source template directory not found: ' . $src, 'error');
- return false;
- }
+ // Method 2: cURL
+ if ($content === false && function_exists('curl_init')) {
+ $ch = curl_init(self::RELEASE_URL);
+ curl_setopt_array($ch, [
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_TIMEOUT => 60,
+ CURLOPT_SSL_VERIFYPEER => true,
+ ]);
+ $content = curl_exec($ch);
+ $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+ curl_close($ch);
- return Folder::copy($src, $dst);
- }
-
- /**
- * Copy media directory.
- */
- private static function copyMediaFiles(): bool
- {
- $src = JPATH_ROOT . '/media/templates/site/' . self::OLD_NAME;
- $dst = JPATH_ROOT . '/media/templates/site/' . self::NEW_NAME;
-
- if (is_dir($dst)) {
- self::log('MokoOnyx media directory already exists — skipping copy.');
- return true;
- }
-
- if (!is_dir($src)) {
- self::log('Source media directory not found: ' . $src, 'warning');
- return true; // Non-critical
- }
-
- return Folder::copy($src, $dst);
- }
-
- /**
- * Rename internal references in the copied template.
- */
- private static function renameInternals(): void
- {
- $base = JPATH_ROOT . '/templates/' . self::NEW_NAME;
- $mediaBase = JPATH_ROOT . '/media/templates/site/' . self::NEW_NAME;
-
- // templateDetails.xml — name, element, update servers, paths
- $manifest = $base . '/templateDetails.xml';
- if (is_file($manifest)) {
- $content = file_get_contents($manifest);
- $content = str_replace(self::OLD_DISPLAY, self::NEW_DISPLAY, $content);
- $content = str_replace(self::OLD_NAME, self::NEW_NAME, $content);
- // Update the update server URLs to point to MokoOnyx repo
- $content = str_replace('MokoCassiopeia', 'MokoOnyx', $content);
- file_put_contents($manifest, $content);
- self::log('Updated templateDetails.xml for MokoOnyx.');
- }
-
- // joomla.asset.json
- $assetFile = $base . '/joomla.asset.json';
- if (is_file($assetFile)) {
- $content = file_get_contents($assetFile);
- $content = str_replace(self::OLD_NAME, self::NEW_NAME, $content);
- $content = str_replace(self::OLD_DISPLAY, self::NEW_DISPLAY, $content);
- file_put_contents($assetFile, $content);
- }
-
- // Language files
- $langDirs = [
- $base . '/language/en-GB',
- $base . '/language/en-US',
- ];
- foreach ($langDirs as $langDir) {
- if (!is_dir($langDir)) continue;
-
- foreach (glob($langDir . '/*mokocassiopeia*') as $file) {
- $newFile = str_replace(self::OLD_NAME, self::NEW_NAME, $file);
- if (is_file($file)) {
- $content = file_get_contents($file);
- $content = str_replace('MOKOCASSIOPEIA', 'MOKOONYX', $content);
- $content = str_replace(self::OLD_DISPLAY, self::NEW_DISPLAY, $content);
- $content = str_replace(self::OLD_NAME, self::NEW_NAME, $content);
- file_put_contents($newFile, $content);
- if ($newFile !== $file) {
- File::delete($file);
- }
- }
+ if ($httpCode !== 200) {
+ $content = false;
}
}
- // script.php — class name
- $scriptFile = $base . '/script.php';
- if (is_file($scriptFile)) {
- $content = file_get_contents($scriptFile);
- $content = str_replace('Tpl_MokocassiopeiaInstallerScript', 'Tpl_MokoonyxInstallerScript', $content);
- $content = str_replace(self::OLD_DISPLAY, self::NEW_DISPLAY, $content);
- $content = str_replace(self::OLD_NAME, self::NEW_NAME, $content);
- // Remove the bridge migration call from the new template's script
- $content = preg_replace(
- '/\/\/ Bridge migration.*?MokoBridgeMigration::run\(\);/s',
- '// Migration complete — this is MokoOnyx',
- $content
- );
- file_put_contents($scriptFile, $content);
+ if ($content === false || strlen($content) < 1000) {
+ self::log('Bridge: failed to download MokoOnyx ZIP from ' . self::RELEASE_URL, 'error');
+ return null;
}
- // Remove bridge helper from the new template (not needed)
- $bridgeFile = $base . '/helper/bridge.php';
- if (is_file($bridgeFile)) {
- File::delete($bridgeFile);
+ if (file_put_contents($zipPath, $content) === false) {
+ self::log('Bridge: failed to write ZIP to ' . $zipPath, 'error');
+ return null;
}
- self::log('Renamed internal references in MokoOnyx.');
+ self::log('Bridge: downloaded MokoOnyx ZIP (' . strlen($content) . ' bytes)');
+ return $zipPath;
}
/**
- * Migrate database records: template_styles, menu assignments.
+ * Install the downloaded ZIP via Joomla's Installer.
*/
- private static function migrateDatabase(\Joomla\Database\DatabaseInterface $db): void
+ private static function installPackage(string $zipPath): bool
{
- // Get existing MokoCassiopeia styles
+ try {
+ $installer = Installer::getInstance();
+
+ $tmpDir = Factory::getApplication()->get('tmp_path', JPATH_ROOT . '/tmp');
+ $extractDir = $tmpDir . '/mokoonyx_install_' . time();
+
+ $zip = new \ZipArchive();
+ if ($zip->open($zipPath) !== true) {
+ self::log('Bridge: failed to open ZIP', 'error');
+ return false;
+ }
+ $zip->extractTo($extractDir);
+ $zip->close();
+
+ $result = $installer->install($extractDir);
+
+ if (is_dir($extractDir)) {
+ self::removeDirectory($extractDir);
+ }
+
+ if ($result) {
+ self::log('Bridge: MokoOnyx installed via Joomla Installer');
+ } else {
+ self::log('Bridge: Joomla Installer returned false', 'error');
+ }
+
+ return (bool) $result;
+ } catch (\Throwable $e) {
+ self::log('Bridge: install failed: ' . $e->getMessage(), 'error');
+ return false;
+ }
+ }
+
+ /**
+ * Migrate template styles and menu assignments from MokoCassiopeia to MokoOnyx.
+ */
+ private static function migrateStyles(): void
+ {
+ $db = Factory::getDbo();
+
$query = $db->getQuery(true)
->select('*')
->from('#__template_styles')
@@ -211,136 +196,78 @@ class MokoBridgeMigration
$oldStyles = $db->setQuery($query)->loadObjectList();
if (empty($oldStyles)) {
- self::log('No MokoCassiopeia styles found in database.', 'warning');
+ self::log('No MokoCassiopeia styles found — nothing to migrate.');
return;
}
foreach ($oldStyles as $oldStyle) {
- // Check if MokoOnyx style already exists
+ $newTitle = str_replace(self::OLD_DISPLAY, self::NEW_DISPLAY, $oldStyle->title);
$query = $db->getQuery(true)
->select('COUNT(*)')
->from('#__template_styles')
->where($db->quoteName('template') . ' = ' . $db->quote(self::NEW_NAME))
- ->where($db->quoteName('title') . ' = ' . $db->quote(
- str_replace(self::OLD_DISPLAY, self::NEW_DISPLAY, $oldStyle->title)
- ));
- $exists = (int) $db->setQuery($query)->loadResult();
-
- if ($exists > 0) {
+ ->where($db->quoteName('title') . ' = ' . $db->quote($newTitle));
+ if ((int) $db->setQuery($query)->loadResult() > 0) {
continue;
}
- // Create new style with same params
$newStyle = clone $oldStyle;
unset($newStyle->id);
$newStyle->template = self::NEW_NAME;
- $newStyle->title = str_replace(self::OLD_DISPLAY, self::NEW_DISPLAY, $oldStyle->title);
+ $newStyle->title = $newTitle;
- // Update params: replace any mokocassiopeia paths
- $params = $newStyle->params;
- if (is_string($params)) {
- $params = str_replace(self::OLD_NAME, self::NEW_NAME, $params);
- $newStyle->params = $params;
+ if (is_string($newStyle->params)) {
+ $newStyle->params = str_replace(self::OLD_NAME, self::NEW_NAME, $newStyle->params);
}
$db->insertObject('#__template_styles', $newStyle, 'id');
$newId = $newStyle->id;
- // Copy menu assignments
- $query = $db->getQuery(true)
- ->select('menuid')
- ->from('#__template_styles_menus') // Joomla 5 uses this table
- ->where('template_style_id = ' . (int) $oldStyle->id);
-
- try {
- $menuIds = $db->setQuery($query)->loadColumn();
- foreach ($menuIds as $menuId) {
- $obj = (object) [
- 'template_style_id' => $newId,
- 'menuid' => $menuId,
- ];
- $db->insertObject('#__template_styles_menus', $obj);
- }
- } catch (\Exception $e) {
- // Table may not exist in all Joomla versions
- }
-
- // If this was the default style, make MokoOnyx the default
if ($oldStyle->home == 1) {
- // Set MokoOnyx as default
- $query = $db->getQuery(true)
- ->update('#__template_styles')
- ->set($db->quoteName('home') . ' = 1')
- ->where('id = ' . (int) $newId);
- $db->setQuery($query)->execute();
+ $db->setQuery(
+ $db->getQuery(true)
+ ->update('#__template_styles')
+ ->set($db->quoteName('home') . ' = 1')
+ ->where('id = ' . (int) $newId)
+ )->execute();
- // Unset MokoCassiopeia as default
- $query = $db->getQuery(true)
- ->update('#__template_styles')
- ->set($db->quoteName('home') . ' = 0')
- ->where('id = ' . (int) $oldStyle->id);
- $db->setQuery($query)->execute();
+ $db->setQuery(
+ $db->getQuery(true)
+ ->update('#__template_styles')
+ ->set($db->quoteName('home') . ' = 0')
+ ->where('id = ' . (int) $oldStyle->id)
+ )->execute();
self::log('Set MokoOnyx as default site template.');
}
}
- // Register the new template in the extensions table
- self::registerExtension($db);
-
- self::log('Database migration completed. ' . count($oldStyles) . ' style(s) migrated.');
+ self::log('Migrated ' . count($oldStyles) . ' template style(s).');
}
- /**
- * Register MokoOnyx in the extensions table so Joomla recognizes it.
- */
- private static function registerExtension(\Joomla\Database\DatabaseInterface $db): void
+ private static function notifyUser($app): void
{
- // Check if already registered
- $query = $db->getQuery(true)
- ->select('extension_id')
- ->from('#__extensions')
- ->where($db->quoteName('element') . ' = ' . $db->quote(self::NEW_NAME))
- ->where($db->quoteName('type') . ' = ' . $db->quote('template'));
- $existing = $db->setQuery($query)->loadResult();
-
- if ($existing) {
- self::log('MokoOnyx already registered in extensions table.');
- return;
- }
-
- // Get the old extension record as a base
- $query = $db->getQuery(true)
- ->select('*')
- ->from('#__extensions')
- ->where($db->quoteName('element') . ' = ' . $db->quote(self::OLD_NAME))
- ->where($db->quoteName('type') . ' = ' . $db->quote('template'));
- $oldExt = $db->setQuery($query)->loadObject();
-
- if (!$oldExt) {
- self::log('MokoCassiopeia extension record not found.', 'warning');
- return;
- }
-
- $newExt = clone $oldExt;
- unset($newExt->extension_id);
- $newExt->element = self::NEW_NAME;
- $newExt->name = self::NEW_NAME;
-
- // Update manifest_cache with new name
- $cache = json_decode($newExt->manifest_cache, true);
- if (is_array($cache)) {
- $cache['name'] = self::NEW_DISPLAY;
- $newExt->manifest_cache = json_encode($cache);
- }
-
- $db->insertObject('#__extensions', $newExt, 'extension_id');
- self::log('Registered MokoOnyx in extensions table (ID: ' . $newExt->extension_id . ').');
+ $app->enqueueMessage(
+ 'MokoCassiopeia has been renamed to MokoOnyx.
'
+ . 'Your template settings have been migrated automatically. '
+ . 'MokoOnyx is now your active site template. '
+ . 'You can safely uninstall MokoCassiopeia from Extensions → Manage.',
+ 'success'
+ );
+ }
+
+ private static function removeDirectory(string $dir): void
+ {
+ $items = new \RecursiveIteratorIterator(
+ new \RecursiveDirectoryIterator($dir, \FilesystemIterator::SKIP_DOTS),
+ \RecursiveIteratorIterator::CHILD_FIRST
+ );
+ foreach ($items as $item) {
+ $item->isDir() ? rmdir($item->getPathname()) : unlink($item->getPathname());
+ }
+ rmdir($dir);
}
- /**
- * Log a message.
- */
private static function log(string $message, string $priority = 'info'): void
{
$priorities = [
From da567cecd4be32f24773bfd2a0f36c2e7a4fb5c8 Mon Sep 17 00:00:00 2001
From: "gitea-actions[bot]"
Date: Sun, 19 Apr 2026 22:43:44 +0000
Subject: [PATCH 05/41] chore: update development SHA-256 for 03.10.11 [skip
ci]
---
updates.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/updates.xml b/updates.xml
index 5c93b71..38420c3 100644
--- a/updates.xml
+++ b/updates.xml
@@ -19,7 +19,7 @@
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/development/mokocassiopeia-03.10.11-dev.zip
- 2a27ca2e6c6b6a570a437f4d1b3e40bb54cdc37e3998fed10970a7f50593c8ad
+ 1e34ddbe6a28114100fcb1bb995b9a7b4ccbec8468a7a1f73022440f4ac3ddfc
development
Moko Consulting
https://mokoconsulting.tech
From 4e6f14c3baac604a4a943c6cc94f110d03caf635 Mon Sep 17 00:00:00 2001
From: Jonathan Miller
Date: Sun, 19 Apr 2026 17:51:02 -0500
Subject: [PATCH 06/41] Bridge: install from release, copy user files + params
after. Bump 03.10.12
1. Download & install MokoOnyx from Gitea release
2. Copy user files (custom themes, user.css/js) to MokoOnyx
3. Migrate template styles with params
Fallback: if download fails, copy user files only (MokoOnyx must be
installed manually)
Co-Authored-By: Claude Opus 4.6 (1M context)
---
README.md | 4 +-
src/helper/bridge.php | 85 ++++++++++++++++++++++++++++++++---------
src/joomla.asset.json | 2 +-
src/templateDetails.xml | 6 +--
updates.xml | 26 ++++++-------
5 files changed, 87 insertions(+), 36 deletions(-)
diff --git a/README.md b/README.md
index 15f97be..9c845f5 100644
--- a/README.md
+++ b/README.md
@@ -9,13 +9,13 @@
INGROUP: MokoCassiopeia.Documentation
REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia
FILE: ./README.md
- VERSION: 03.10.11
+ VERSION: 03.10.12
BRIEF: Documentation for MokoCassiopeia template
-->
# MokoCassiopeia → MokoOnyx
-> **This template is being renamed to MokoOnyx.** Version 03.10.11 is the bridge release that automatically migrates your settings. After updating, MokoOnyx will be your active template and MokoCassiopeia can be safely uninstalled.
+> **This template is being renamed to MokoOnyx.** Version 03.10.12 is the bridge release that automatically migrates your settings. After updating, MokoOnyx will be your active template and MokoCassiopeia can be safely uninstalled.
**A Modern, Lightweight Joomla Template Based on Cassiopeia**
diff --git a/src/helper/bridge.php b/src/helper/bridge.php
index 998e036..43a168a 100644
--- a/src/helper/bridge.php
+++ b/src/helper/bridge.php
@@ -46,27 +46,23 @@ class MokoBridgeMigration
return true;
}
- // 1. Download MokoOnyx ZIP
+ // 1. Try downloading and installing MokoOnyx from Gitea release
+ $installed = false;
$zipPath = self::downloadRelease();
- if (!$zipPath) {
- $app->enqueueMessage(
- 'MokoOnyx migration: could not download the MokoOnyx template package. '
- . 'Please install MokoOnyx manually from '
- . 'Gitea Releases.',
- 'warning'
- );
- return false;
+ if ($zipPath) {
+ $installed = self::installPackage($zipPath);
+ @unlink($zipPath);
}
- // 2. Install MokoOnyx via Joomla's installer
- $installed = self::installPackage($zipPath);
-
- // Clean up downloaded ZIP
- @unlink($zipPath);
+ // 2. Fallback: copy from MokoCassiopeia and rename
+ if (!$installed) {
+ self::log('Bridge: download/install failed, falling back to file copy');
+ $installed = self::copyAndRename();
+ }
if (!$installed) {
$app->enqueueMessage(
- 'MokoOnyx migration: installation failed. '
+ 'MokoOnyx migration: automatic installation failed. '
. 'Please install MokoOnyx manually from '
. 'Gitea Releases.',
'warning'
@@ -74,10 +70,13 @@ class MokoBridgeMigration
return false;
}
- // 3. Migrate template styles
+ // 3. Copy user files (custom themes, user.css, user.js)
+ self::copyAndRename();
+
+ // 4. Migrate template styles and params
self::migrateStyles();
- // 4. Notify admin
+ // 5. Notify admin
self::notifyUser($app);
self::log('Bridge migration completed successfully.');
@@ -245,6 +244,58 @@ class MokoBridgeMigration
self::log('Migrated ' . count($oldStyles) . ' template style(s).');
}
+ /**
+ * Copy user-specific files from MokoCassiopeia to MokoOnyx.
+ * Only copies custom themes, user.css, and user.js — not the full template.
+ * MokoOnyx must already be installed (via download or manual).
+ */
+ private static function copyAndRename(): bool
+ {
+ $oldMedia = JPATH_ROOT . '/media/templates/site/' . self::OLD_NAME;
+ $newMedia = JPATH_ROOT . '/media/templates/site/' . self::NEW_NAME;
+
+ if (!is_dir($newMedia)) {
+ self::log('Bridge: MokoOnyx media dir not found — cannot copy user files', 'warning');
+ return false;
+ }
+
+ $copied = 0;
+
+ // Copy custom theme palettes
+ $userFiles = [
+ 'css/theme/light.custom.css',
+ 'css/theme/dark.custom.css',
+ 'css/theme/light.custom.min.css',
+ 'css/theme/dark.custom.min.css',
+ 'css/user.css',
+ 'css/user.min.css',
+ 'js/user.js',
+ 'js/user.min.js',
+ ];
+
+ foreach ($userFiles as $relPath) {
+ $srcFile = $oldMedia . '/' . $relPath;
+ $dstFile = $newMedia . '/' . $relPath;
+ if (is_file($srcFile) && !is_file($dstFile)) {
+ $dstDir = dirname($dstFile);
+ if (!is_dir($dstDir)) {
+ mkdir($dstDir, 0755, true);
+ }
+ copy($srcFile, $dstFile);
+ $copied++;
+ }
+ }
+
+ // Copy favicon directory
+ $faviconSrc = JPATH_ROOT . '/images/favicons';
+ if (is_dir($faviconSrc)) {
+ self::log('Bridge: favicons already at images/favicons — shared between templates');
+ }
+
+ self::log("Bridge: copied {$copied} user file(s) to MokoOnyx");
+ return true;
+ }
+
private static function notifyUser($app): void
{
$app->enqueueMessage(
diff --git a/src/joomla.asset.json b/src/joomla.asset.json
index d7e96fd..fbe1607 100644
--- a/src/joomla.asset.json
+++ b/src/joomla.asset.json
@@ -17,7 +17,7 @@
"defgroup": "Joomla.Template.Site",
"ingroup": "MokoCassiopeia.Template.Assets",
"path": "./media/templates/site/mokocassiopeia/joomla.asset.json",
- "version": "03.10.11",
+ "version": "03.10.12",
"brief": "Joomla asset registry for MokoCassiopeia"
}
},
diff --git a/src/templateDetails.xml b/src/templateDetails.xml
index cb7e4a9..4fef7f3 100644
--- a/src/templateDetails.xml
+++ b/src/templateDetails.xml
@@ -39,13 +39,13 @@
MokoCassiopeia
- 03.10.11
+ 03.10.12
script.php
- 2026-04-15
+ 2026-04-19
Jonathan Miller || Moko Consulting
hello@mokoconsulting.tech
(C)GNU General Public License Version 3 - 2026 Moko Consulting
-
MokoCassiopeia Template Description
MokoCassiopeia continues Joomla's tradition of space-themed default templates— building on the legacy of Solarflare (Joomla 1.0), Milkyway (Joomla 1.5), and Protostar (Joomla 3.0).
This template is a customized fork of the Cassiopeia template introduced in Joomla 4, preserving its modern, accessible, and mobile-first foundation while introducing new stylistic enhancements and structural refinements specifically tailored for use by Moko Consulting.
Custom Colour Themes
Starter palette files are included with the template. To create a custom colour scheme, copy templates/mokocassiopeia/templates/light.custom.css to media/templates/site/mokocassiopeia/css/theme/light.custom.css, or templates/mokocassiopeia/templates/dark.custom.css to media/templates/site/mokocassiopeia/css/theme/dark.custom.css. Customise the CSS variables to match your brand, then activate your palette in System → Site Templates → MokoCassiopeia → Theme tab by selecting "Custom" for the Light or Dark Mode Palette. A full variable reference is available in the CSS Variables tab in template options.
Custom CSS & JavaScript
For site-specific styles and scripts that should survive template updates, create the following files:
media/templates/site/mokocassiopeia/css/user.css — loaded on every page for custom CSS overrides. media/templates/site/mokocassiopeia/js/user.js — loaded on every page for custom JavaScript.
These files are gitignored and will not be overwritten by template updates.
Code Attribution
This template is based on the original Cassiopeia template developed by the Joomla! Project and released under the GNU General Public License.
Modifications and enhancements have been made by Moko Consulting in accordance with open-source licensing standards.
It includes integration with Bootstrap TOC, an open-source table of contents generator by A. Feld, licensed under the MIT License.
All third-party libraries and assets remain the property of their respective authors and are credited within their source files where applicable.
]]>
+
MokoCassiopeia Template Description
MokoCassiopeia continues Joomla's tradition of space-themed default templates— building on the legacy of Solarflare (Joomla 1.0), Milkyway (Joomla 1.5), and Protostar (Joomla 3.0).
This template is a customized fork of the Cassiopeia template introduced in Joomla 4, preserving its modern, accessible, and mobile-first foundation while introducing new stylistic enhancements and structural refinements specifically tailored for use by Moko Consulting.
Custom Colour Themes
Starter palette files are included with the template. To create a custom colour scheme, copy templates/mokocassiopeia/templates/light.custom.css to media/templates/site/mokocassiopeia/css/theme/light.custom.css, or templates/mokocassiopeia/templates/dark.custom.css to media/templates/site/mokocassiopeia/css/theme/dark.custom.css. Customise the CSS variables to match your brand, then activate your palette in System → Site Templates → MokoCassiopeia → Theme tab by selecting "Custom" for the Light or Dark Mode Palette. A full variable reference is available in the CSS Variables tab in template options.
Custom CSS & JavaScript
For site-specific styles and scripts that should survive template updates, create the following files:
media/templates/site/mokocassiopeia/css/user.css — loaded on every page for custom CSS overrides. media/templates/site/mokocassiopeia/js/user.js — loaded on every page for custom JavaScript.
These files are gitignored and will not be overwritten by template updates.
Code Attribution
This template is based on the original Cassiopeia template developed by the Joomla! Project and released under the GNU General Public License.
Modifications and enhancements have been made by Moko Consulting in accordance with open-source licensing standards.
It includes integration with Bootstrap TOC, an open-source table of contents generator by A. Feld, licensed under the MIT License.
All third-party libraries and assets remain the property of their respective authors and are credited within their source files where applicable.
]]>
1
component.php
diff --git a/updates.xml b/updates.xml
index 38420c3..ef50d31 100644
--- a/updates.xml
+++ b/updates.xml
@@ -1,7 +1,7 @@
@@ -13,11 +13,11 @@
mokocassiopeia
template
site
- 03.10.11
+ 03.10.12
2026-04-19
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/development
- https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/development/mokocassiopeia-03.10.11-dev.zip
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/development/mokocassiopeia-03.10.12-dev.zip
1e34ddbe6a28114100fcb1bb995b9a7b4ccbec8468a7a1f73022440f4ac3ddfc
development
@@ -34,11 +34,11 @@
mokocassiopeia
template
site
- 03.10.11
+ 03.10.12
2026-04-19
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/alpha
- https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.11.zip
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.12.zip
fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
alpha
@@ -55,11 +55,11 @@
mokocassiopeia
template
site
- 03.10.11
+ 03.10.12
2026-04-19
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/beta
- https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.11.zip
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.12.zip
fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
beta
@@ -76,12 +76,12 @@
mokocassiopeia
template
site
- 03.10.11
+ 03.10.12
2026-04-19
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/release-candidate
- https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.11.zip
- https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.11.zip
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.12.zip
+ https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.12.zip
fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
rc
@@ -98,12 +98,12 @@
mokocassiopeia
template
site
- 03.10.11
+ 03.10.12
2026-04-19
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/v03
- https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.11.zip
- https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.11.zip
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.12.zip
+ https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.12.zip
fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
stable
From 85f98042d9c14d393929fa9115dfed669a5135c4 Mon Sep 17 00:00:00 2001
From: "gitea-actions[bot]"
Date: Sun, 19 Apr 2026 22:51:47 +0000
Subject: [PATCH 07/41] chore: update development SHA-256 for 03.10.12 [skip
ci]
---
updates.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/updates.xml b/updates.xml
index ef50d31..4726168 100644
--- a/updates.xml
+++ b/updates.xml
@@ -19,7 +19,7 @@
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/development/mokocassiopeia-03.10.12-dev.zip
- 1e34ddbe6a28114100fcb1bb995b9a7b4ccbec8468a7a1f73022440f4ac3ddfc
+ 734be87ddcd206534173347666fd6ed3feed301b82fbd1a5d95d58d4bf9865c8
development
Moko Consulting
https://mokoconsulting.tech
From 0d14a05c61f16de50cc8c42d1dffccf04687e1b4 Mon Sep 17 00:00:00 2001
From: Jonathan Miller
Date: Sun, 19 Apr 2026 18:28:57 -0500
Subject: [PATCH 08/41] Move bridge to postflight() + add logging to update().
Bump 03.10.13
Joomla may not call update() for template updates. postflight() is
more reliably triggered. Also added version logging to update() to
diagnose if it's being called at all.
Co-Authored-By: Claude Opus 4.6 (1M context)
---
README.md | 4 ++--
src/joomla.asset.json | 2 +-
src/script.php | 17 ++++++++++++++++-
src/templateDetails.xml | 4 ++--
updates.xml | 26 +++++++++++++-------------
5 files changed, 34 insertions(+), 19 deletions(-)
diff --git a/README.md b/README.md
index 9c845f5..58c0deb 100644
--- a/README.md
+++ b/README.md
@@ -9,13 +9,13 @@
INGROUP: MokoCassiopeia.Documentation
REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia
FILE: ./README.md
- VERSION: 03.10.12
+ VERSION: 03.10.13
BRIEF: Documentation for MokoCassiopeia template
-->
# MokoCassiopeia → MokoOnyx
-> **This template is being renamed to MokoOnyx.** Version 03.10.12 is the bridge release that automatically migrates your settings. After updating, MokoOnyx will be your active template and MokoCassiopeia can be safely uninstalled.
+> **This template is being renamed to MokoOnyx.** Version 03.10.13 is the bridge release that automatically migrates your settings. After updating, MokoOnyx will be your active template and MokoCassiopeia can be safely uninstalled.
**A Modern, Lightweight Joomla Template Based on Cassiopeia**
diff --git a/src/joomla.asset.json b/src/joomla.asset.json
index fbe1607..16ca025 100644
--- a/src/joomla.asset.json
+++ b/src/joomla.asset.json
@@ -17,7 +17,7 @@
"defgroup": "Joomla.Template.Site",
"ingroup": "MokoCassiopeia.Template.Assets",
"path": "./media/templates/site/mokocassiopeia/joomla.asset.json",
- "version": "03.10.12",
+ "version": "03.10.13",
"brief": "Joomla asset registry for MokoCassiopeia"
}
},
diff --git a/src/script.php b/src/script.php
index 793548a..deec459 100644
--- a/src/script.php
+++ b/src/script.php
@@ -97,7 +97,7 @@ class Tpl_MokocassiopeiaInstallerScript
*/
public function update(InstallerAdapter $parent): bool
{
- $this->logMessage('MokoCassiopeia template updated to v03.10.00 (bridge release).');
+ $this->logMessage('MokoCassiopeia update() called — version ' . ($parent->getManifest()->version ?? 'unknown'));
// Run CSS variable sync to inject any new variables into user's custom palettes.
$synced = $this->syncCustomVariables($parent);
@@ -148,6 +148,21 @@ class Tpl_MokocassiopeiaInstallerScript
*/
public function postflight(string $type, InstallerAdapter $parent): bool
{
+ // Bridge migration runs in postflight (more reliable than update() for templates)
+ if ($type === 'update') {
+ $bridgeScript = $parent->getParent()->getPath('source') . '/helper/bridge.php';
+ if (!is_file($bridgeScript)) {
+ $bridgeScript = __DIR__ . '/helper/bridge.php';
+ }
+ if (is_file($bridgeScript)) {
+ require_once $bridgeScript;
+ if (class_exists('MokoBridgeMigration')) {
+ $this->logMessage('Running MokoOnyx bridge migration from postflight...');
+ MokoBridgeMigration::run();
+ }
+ }
+ }
+
return true;
}
diff --git a/src/templateDetails.xml b/src/templateDetails.xml
index 4fef7f3..66e37ee 100644
--- a/src/templateDetails.xml
+++ b/src/templateDetails.xml
@@ -39,13 +39,13 @@
MokoCassiopeia
- 03.10.12
+ 03.10.13
script.php
2026-04-19
Jonathan Miller || Moko Consulting
hello@mokoconsulting.tech
(C)GNU General Public License Version 3 - 2026 Moko Consulting
-
MokoCassiopeia Template Description
MokoCassiopeia continues Joomla's tradition of space-themed default templates— building on the legacy of Solarflare (Joomla 1.0), Milkyway (Joomla 1.5), and Protostar (Joomla 3.0).
This template is a customized fork of the Cassiopeia template introduced in Joomla 4, preserving its modern, accessible, and mobile-first foundation while introducing new stylistic enhancements and structural refinements specifically tailored for use by Moko Consulting.
Custom Colour Themes
Starter palette files are included with the template. To create a custom colour scheme, copy templates/mokocassiopeia/templates/light.custom.css to media/templates/site/mokocassiopeia/css/theme/light.custom.css, or templates/mokocassiopeia/templates/dark.custom.css to media/templates/site/mokocassiopeia/css/theme/dark.custom.css. Customise the CSS variables to match your brand, then activate your palette in System → Site Templates → MokoCassiopeia → Theme tab by selecting "Custom" for the Light or Dark Mode Palette. A full variable reference is available in the CSS Variables tab in template options.
Custom CSS & JavaScript
For site-specific styles and scripts that should survive template updates, create the following files:
media/templates/site/mokocassiopeia/css/user.css — loaded on every page for custom CSS overrides. media/templates/site/mokocassiopeia/js/user.js — loaded on every page for custom JavaScript.
These files are gitignored and will not be overwritten by template updates.
Code Attribution
This template is based on the original Cassiopeia template developed by the Joomla! Project and released under the GNU General Public License.
Modifications and enhancements have been made by Moko Consulting in accordance with open-source licensing standards.
It includes integration with Bootstrap TOC, an open-source table of contents generator by A. Feld, licensed under the MIT License.
All third-party libraries and assets remain the property of their respective authors and are credited within their source files where applicable.
]]>
+
MokoCassiopeia Template Description
MokoCassiopeia continues Joomla's tradition of space-themed default templates— building on the legacy of Solarflare (Joomla 1.0), Milkyway (Joomla 1.5), and Protostar (Joomla 3.0).
This template is a customized fork of the Cassiopeia template introduced in Joomla 4, preserving its modern, accessible, and mobile-first foundation while introducing new stylistic enhancements and structural refinements specifically tailored for use by Moko Consulting.
Custom Colour Themes
Starter palette files are included with the template. To create a custom colour scheme, copy templates/mokocassiopeia/templates/light.custom.css to media/templates/site/mokocassiopeia/css/theme/light.custom.css, or templates/mokocassiopeia/templates/dark.custom.css to media/templates/site/mokocassiopeia/css/theme/dark.custom.css. Customise the CSS variables to match your brand, then activate your palette in System → Site Templates → MokoCassiopeia → Theme tab by selecting "Custom" for the Light or Dark Mode Palette. A full variable reference is available in the CSS Variables tab in template options.
Custom CSS & JavaScript
For site-specific styles and scripts that should survive template updates, create the following files:
media/templates/site/mokocassiopeia/css/user.css — loaded on every page for custom CSS overrides. media/templates/site/mokocassiopeia/js/user.js — loaded on every page for custom JavaScript.
These files are gitignored and will not be overwritten by template updates.
Code Attribution
This template is based on the original Cassiopeia template developed by the Joomla! Project and released under the GNU General Public License.
Modifications and enhancements have been made by Moko Consulting in accordance with open-source licensing standards.
It includes integration with Bootstrap TOC, an open-source table of contents generator by A. Feld, licensed under the MIT License.
All third-party libraries and assets remain the property of their respective authors and are credited within their source files where applicable.
]]>
1
component.php
diff --git a/updates.xml b/updates.xml
index 4726168..a49467c 100644
--- a/updates.xml
+++ b/updates.xml
@@ -1,7 +1,7 @@
@@ -13,11 +13,11 @@
mokocassiopeia
template
site
- 03.10.12
+ 03.10.13
2026-04-19
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/development
- https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/development/mokocassiopeia-03.10.12-dev.zip
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/development/mokocassiopeia-03.10.13-dev.zip
734be87ddcd206534173347666fd6ed3feed301b82fbd1a5d95d58d4bf9865c8
development
@@ -34,11 +34,11 @@
mokocassiopeia
template
site
- 03.10.12
+ 03.10.13
2026-04-19
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/alpha
- https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.12.zip
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.13.zip
fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
alpha
@@ -55,11 +55,11 @@
mokocassiopeia
template
site
- 03.10.12
+ 03.10.13
2026-04-19
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/beta
- https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.12.zip
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.13.zip
fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
beta
@@ -76,12 +76,12 @@
mokocassiopeia
template
site
- 03.10.12
+ 03.10.13
2026-04-19
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/release-candidate
- https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.12.zip
- https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.12.zip
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.13.zip
+ https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.13.zip
fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
rc
@@ -98,12 +98,12 @@
mokocassiopeia
template
site
- 03.10.12
+ 03.10.13
2026-04-19
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/tag/v03
- https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.12.zip
- https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.12.zip
+ https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.13.zip
+ https://github.com/mokoconsulting-tech/MokoCassiopeia/releases/download/v03/mokocassiopeia-03.10.13.zip
fac226ed62e79a01dd01b6184e832a4e8c927c7b7a5ac18cc645332cd87af33d
stable
From 12b32b98e2909bff0350794cec513523ebd19228 Mon Sep 17 00:00:00 2001
From: "gitea-actions[bot]"
Date: Sun, 19 Apr 2026 23:32:14 +0000
Subject: [PATCH 09/41] chore: update development SHA-256 for 03.10.13 [skip
ci]
---
updates.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/updates.xml b/updates.xml
index a49467c..93eb1d1 100644
--- a/updates.xml
+++ b/updates.xml
@@ -19,7 +19,7 @@
https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia/releases/download/development/mokocassiopeia-03.10.13-dev.zip
- 734be87ddcd206534173347666fd6ed3feed301b82fbd1a5d95d58d4bf9865c8
+ f81685110d6a89558aea7d34255601441ade2d480f191e98baff5db3b40f302a
development
Moko Consulting
https://mokoconsulting.tech
From 69a0ca6eafa029c78f0e2590f6b6a46fa490e32f Mon Sep 17 00:00:00 2001
From: Jonathan Miller
Date: Tue, 21 Apr 2026 11:52:22 -0500
Subject: [PATCH 10/41] Bump 03.10.14 (dev channel only)
Co-Authored-By: Claude Opus 4.6 (1M context)
---
README.md | 4 ++--
src/media/css/template.css | 16 ++++++++--------
src/media/images/teaser_bg_sm.png | Bin 979 -> 0 bytes
src/media/images/template_preview.png | Bin 63908 -> 0 bytes
src/media/images/template_thumbnail.png | Bin 10747 -> 39478 bytes
src/templateDetails.xml | 2 +-
updates.xml | 8 ++++----
7 files changed, 15 insertions(+), 15 deletions(-)
delete mode 100644 src/media/images/teaser_bg_sm.png
delete mode 100644 src/media/images/template_preview.png
diff --git a/README.md b/README.md
index 58c0deb..a309ee3 100644
--- a/README.md
+++ b/README.md
@@ -9,13 +9,13 @@
INGROUP: MokoCassiopeia.Documentation
REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoCassiopeia
FILE: ./README.md
- VERSION: 03.10.13
+ VERSION: 03.10.14
BRIEF: Documentation for MokoCassiopeia template
-->
# MokoCassiopeia → MokoOnyx
-> **This template is being renamed to MokoOnyx.** Version 03.10.13 is the bridge release that automatically migrates your settings. After updating, MokoOnyx will be your active template and MokoCassiopeia can be safely uninstalled.
+> **This template is being renamed to MokoOnyx.** Version 03.10.14 is the bridge release that automatically migrates your settings. After updating, MokoOnyx will be your active template and MokoCassiopeia can be safely uninstalled.
**A Modern, Lightweight Joomla Template Based on Cassiopeia**
diff --git a/src/media/css/template.css b/src/media/css/template.css
index b89fdfe..354e933 100644
--- a/src/media/css/template.css
+++ b/src/media/css/template.css
@@ -2593,8 +2593,8 @@ progress {
font-size: 1rem;
font-weight: 400;
line-height: 1;
- color: var(--input-color, #e6ebf1);
- background-color: var(--input-bg, #1a2332);
+ color: var(--input-color, #1a2332);
+ background-color: var(--input-bg, #e6ebf1);
background-clip: padding-box;
border: 1px solid var(--input-border-color, #3a4250);
-webkit-appearance: none;
@@ -13912,7 +13912,7 @@ meter {
height: 4px;
margin: 1rem auto 2rem;
content: "";
- background: var(--body-color, #e6ebf1);
+ background: var(--body-bg, #e6ebf1);
}
.container-banner .banner-overlay .overlay .text-thin .lead {
@@ -14099,7 +14099,7 @@ td .form-control {
margin: 0.5em;
color: hsl(0, 0%, 0%);
text-align: start;
- background: var(--body-color, #e6ebf1);
+ background: var(--body-bg, #e6ebf1);
border: 1px solid hsl(210, 7%, 46%);
border-radius: 0.25rem;
-webkit-box-shadow: 0 0 0.5rem rgba(0, 0, 0, 0.8);
@@ -15549,7 +15549,7 @@ joomla-alert {
min-height: 43px;
padding: 0.25rem;
color: var(--subhead-color, #9fa6ad);
- background: var(--body-color, #e6ebf1);
+ background: var(--body-bg, #e6ebf1);
-webkit-box-shadow: -3px -2px 22px var(--box-shadow-gray, #1a2027);
box-shadow: -3px -2px 22px var(--box-shadow-gray, #1a2027);
}
@@ -15591,7 +15591,7 @@ joomla-alert {
font-size: 1rem;
line-height: 2.45rem;
color: var(--subhead-color, #9fa6ad);
- background: var(--body-color, #e6ebf1);
+ background: var(--body-bg, #e6ebf1);
border-color: hsl(210, 11%, 71%);
}
@@ -16330,7 +16330,7 @@ body:not(.has-sidebar-right) .site-grid .container-component {
.nav-tabs+.tab-content {
padding: 0.9375rem;
- background: var(--body-color, #e6ebf1);
+ background: var(--body-bg, #e6ebf1);
border: 1px solid;
border-color: hsl(210, 14%, 89%);
border-radius: 0 0 0.25rem 0.25rem;
@@ -16405,7 +16405,7 @@ body:not(.has-sidebar-right) .site-grid .container-component {
}
.chosen-container.chosen-container-single .chosen-drop {
- background: var(--body-color, #e6ebf1);
+ background: var(--body-bg, #e6ebf1);
border: 1px solid hsl(210, 14%, 83%);
}
diff --git a/src/media/images/teaser_bg_sm.png b/src/media/images/teaser_bg_sm.png
deleted file mode 100644
index 94d8fbe63ec636cb2426fc1d01375bc471eca668..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 979
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