diff --git a/.mokogitea/manifest.xml b/.mokogitea/manifest.xml
index e134379..be72701 100644
--- a/.mokogitea/manifest.xml
+++ b/.mokogitea/manifest.xml
@@ -9,7 +9,7 @@
Template - MokoOnyx
MokoConsulting
MokoOnyx - Joomla site template (successor to MokoCassiopeia)
- 02.20.00
+ 02.19.03
GNU General Public License v3
diff --git a/.mokogitea/workflows/issue-branch.yml b/.mokogitea/workflows/issue-branch.yml
index 5e03998..0839499 100644
--- a/.mokogitea/workflows/issue-branch.yml
+++ b/.mokogitea/workflows/issue-branch.yml
@@ -5,7 +5,7 @@
# FILE INFORMATION
# DEFGROUP: Gitea.Workflow
# INGROUP: moko-platform.Automation
-# VERSION: 02.20.00
+# VERSION: 02.19.03
# BRIEF: Auto-create feature branch when an issue is opened
name: "Universal: Issue Branch"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 484088e..ebfd6c6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,13 +8,24 @@
DEFGROUP: Joomla.Template.Site
INGROUP: MokoOnyx.Documentation
PATH: ./CHANGELOG.md
- VERSION: 02.20.00
+ VERSION: 02.19.03
BRIEF: Changelog file documenting version history of MokoOnyx
-->
-# Changelog — MokoOnyx (VERSION: 02.20.00)
+# Changelog — MokoOnyx (VERSION: 02.19.03)
## [Unreleased]
+### Fixed
+- Strip Joomla-injected `p-2` padding class from Font Awesome icons in all menu overrides (default, mainmenu, horizontal)
+
+### Changed
+- Migrated update server URL from raw file endpoint to Gitea Pages
+- Release workflow no longer manages updates.xml (decoupled to Gitea Pages)
+- Added conflict-marker guard to PR check and release workflows
+- Added Joomla language file validation (syntax, duplicates, en-GB/en-US consistency)
+- Added JEXEC guard, joomla.asset.json, XML well-formedness, and script file CI checks
+- Removed RS_FTP_PATH_SUFFIX from repo health requirements
+
## [02.20.00] --- 2026-06-04
## [02.19.00] --- 2026-06-04
@@ -24,3 +35,4 @@
## [02.17.00] --- 2026-06-02
## [02.15.00] --- 2026-05-30
+## [02.14.00] --- 2026-05-30
diff --git a/SECURITY.md b/SECURITY.md
index 46cba7c..5fae7f7 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -10,7 +10,7 @@
INGROUP: MokoOnyx.Governance
REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
FILE: SECURITY.md
- VERSION: 02.20.00
+ VERSION: 02.19.03
BRIEF: Security policy and vulnerability reporting process for MokoOnyx.
PATH: /SECURITY.md
NOTE: This policy is process oriented and does not replace secure engineering practices.
diff --git a/src/html/layouts/joomla/module/card.php b/src/html/layouts/joomla/module/card.php
index 316554d..566ab1a 100644
--- a/src/html/layouts/joomla/module/card.php
+++ b/src/html/layouts/joomla/module/card.php
@@ -10,7 +10,7 @@
* INGROUP: MokoOnyx
* REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
* PATH: /html/layouts/joomla/module/card.php
- * VERSION: 02.20.00
+ * VERSION: 02.19.03
* BRIEF: Custom card module chrome — renders module titles for all modules
*/
diff --git a/src/html/layouts/mokoonyx/article-metadata.php b/src/html/layouts/mokoonyx/article-metadata.php
index 17812e1..d95431f 100644
--- a/src/html/layouts/mokoonyx/article-metadata.php
+++ b/src/html/layouts/mokoonyx/article-metadata.php
@@ -11,7 +11,7 @@
* INGROUP: MokoOnyx.Layouts
* REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
* PATH: /src/html/layouts/mokoonyx/article-metadata.php
- * VERSION: 02.20.00
+ * VERSION: 02.19.03
* BRIEF: Article metadata footer layout -- renders jcfields grouped by field group
*/
diff --git a/src/html/mod_menu/default_component.php b/src/html/mod_menu/default_component.php
index 2242c7f..9568e3f 100644
--- a/src/html/mod_menu/default_component.php
+++ b/src/html/mod_menu/default_component.php
@@ -33,6 +33,8 @@ if ($item->anchor_rel) {
$linktype = $item->title;
if ($item->menu_icon) {
+ // Strip Joomla-injected padding classes that conflict with FA icon sizing
+ $item->menu_icon = trim(preg_replace('/\bp-[0-5]\b/', '', $item->menu_icon));
if ($itemParams->get('menu_text', 1)) {
$linktype = '' . $item->title;
} else {
diff --git a/src/html/mod_menu/default_heading.php b/src/html/mod_menu/default_heading.php
index eeaaf2e..60368f5 100644
--- a/src/html/mod_menu/default_heading.php
+++ b/src/html/mod_menu/default_heading.php
@@ -19,6 +19,8 @@ $anchor_css = $item->anchor_css ?: '';
$linktype = $item->title;
if ($item->menu_icon) {
+ // Strip Joomla-injected padding classes that conflict with FA icon sizing
+ $item->menu_icon = trim(preg_replace('/\bp-[0-5]\b/', '', $item->menu_icon));
if ($itemParams->get('menu_text', 1)) {
$linktype = '' . $item->title;
} else {
diff --git a/src/html/mod_menu/default_separator.php b/src/html/mod_menu/default_separator.php
index 1a08dbc..7eb600c 100644
--- a/src/html/mod_menu/default_separator.php
+++ b/src/html/mod_menu/default_separator.php
@@ -19,6 +19,8 @@ $anchor_css = $item->anchor_css ?: '';
$linktype = $item->title;
if ($item->menu_icon) {
+ // Strip Joomla-injected padding classes that conflict with FA icon sizing
+ $item->menu_icon = trim(preg_replace('/\bp-[0-5]\b/', '', $item->menu_icon));
if ($itemParams->get('menu_text', 1)) {
$linktype = '' . $item->title;
} else {
diff --git a/src/html/mod_menu/default_url.php b/src/html/mod_menu/default_url.php
index 55b6eab..affe564 100644
--- a/src/html/mod_menu/default_url.php
+++ b/src/html/mod_menu/default_url.php
@@ -33,6 +33,8 @@ if ($item->anchor_rel) {
$linktype = $item->title;
if ($item->menu_icon) {
+ // Strip Joomla-injected padding classes that conflict with FA icon sizing
+ $item->menu_icon = trim(preg_replace('/\bp-[0-5]\b/', '', $item->menu_icon));
if ($itemParams->get('menu_text', 1)) {
$linktype = '' . $item->title;
} else {
diff --git a/src/html/mod_menu/horizontal_component.php b/src/html/mod_menu/horizontal_component.php
index 7619390..30c76d2 100644
--- a/src/html/mod_menu/horizontal_component.php
+++ b/src/html/mod_menu/horizontal_component.php
@@ -33,6 +33,8 @@ if ($item->anchor_rel) {
$linktype = $item->title;
if ($item->menu_icon) {
+ // Strip Joomla-injected padding classes that conflict with FA icon sizing
+ $item->menu_icon = trim(preg_replace('/\bp-[0-5]\b/', '', $item->menu_icon));
if ($itemParams->get('menu_text', 1)) {
$linktype = '' . $item->title;
} else {
diff --git a/src/html/mod_menu/horizontal_heading.php b/src/html/mod_menu/horizontal_heading.php
index 2bc20ef..fe559a9 100644
--- a/src/html/mod_menu/horizontal_heading.php
+++ b/src/html/mod_menu/horizontal_heading.php
@@ -19,6 +19,8 @@ $anchor_css = $item->anchor_css ?: '';
$linktype = $item->title;
if ($item->menu_icon) {
+ // Strip Joomla-injected padding classes that conflict with FA icon sizing
+ $item->menu_icon = trim(preg_replace('/\bp-[0-5]\b/', '', $item->menu_icon));
if ($itemParams->get('menu_text', 1)) {
$linktype = '' . $item->title;
} else {
diff --git a/src/html/mod_menu/horizontal_separator.php b/src/html/mod_menu/horizontal_separator.php
index d7625b6..ed469f1 100644
--- a/src/html/mod_menu/horizontal_separator.php
+++ b/src/html/mod_menu/horizontal_separator.php
@@ -19,6 +19,8 @@ $anchor_css = $item->anchor_css ?: '';
$linktype = $item->title;
if ($item->menu_icon) {
+ // Strip Joomla-injected padding classes that conflict with FA icon sizing
+ $item->menu_icon = trim(preg_replace('/\bp-[0-5]\b/', '', $item->menu_icon));
if ($itemParams->get('menu_text', 1)) {
$linktype = '' . $item->title;
} else {
diff --git a/src/html/mod_menu/horizontal_url.php b/src/html/mod_menu/horizontal_url.php
index 2ed318d..caa2cc4 100644
--- a/src/html/mod_menu/horizontal_url.php
+++ b/src/html/mod_menu/horizontal_url.php
@@ -33,6 +33,8 @@ if ($item->anchor_rel) {
$linktype = $item->title;
if ($item->menu_icon) {
+ // Strip Joomla-injected padding classes that conflict with FA icon sizing
+ $item->menu_icon = trim(preg_replace('/\bp-[0-5]\b/', '', $item->menu_icon));
if ($itemParams->get('menu_text', 1)) {
$linktype = '' . $item->title;
} else {
diff --git a/src/html/mod_menu/mainmenu_component.php b/src/html/mod_menu/mainmenu_component.php
index d2887cb..6f0cc07 100644
--- a/src/html/mod_menu/mainmenu_component.php
+++ b/src/html/mod_menu/mainmenu_component.php
@@ -33,6 +33,8 @@ if ($item->anchor_rel) {
$linktype = $item->title;
if ($item->menu_icon) {
+ // Strip Joomla-injected padding classes that conflict with FA icon sizing
+ $item->menu_icon = trim(preg_replace('/\bp-[0-5]\b/', '', $item->menu_icon));
// The link is an icon
if ($itemParams->get('menu_text', 1)) {
// If the link text is to be displayed, the icon is added with aria-hidden
diff --git a/src/html/mod_menu/mainmenu_heading.php b/src/html/mod_menu/mainmenu_heading.php
index af61674..b1c2b50 100644
--- a/src/html/mod_menu/mainmenu_heading.php
+++ b/src/html/mod_menu/mainmenu_heading.php
@@ -19,6 +19,8 @@ $anchor_css = $item->anchor_css ?: '';
$linktype = $item->title;
if ($item->menu_icon) {
+ // Strip Joomla-injected padding classes that conflict with FA icon sizing
+ $item->menu_icon = trim(preg_replace('/\bp-[0-5]\b/', '', $item->menu_icon));
// The link is an icon
if ($itemParams->get('menu_text', 1)) {
// If the link text is to be displayed, the icon is added with aria-hidden
diff --git a/src/html/mod_menu/mainmenu_separator.php b/src/html/mod_menu/mainmenu_separator.php
index 42579b9..59d0c58 100644
--- a/src/html/mod_menu/mainmenu_separator.php
+++ b/src/html/mod_menu/mainmenu_separator.php
@@ -19,6 +19,8 @@ $anchor_css = $item->anchor_css ?: '';
$linktype = $item->title;
if ($item->menu_icon) {
+ // Strip Joomla-injected padding classes that conflict with FA icon sizing
+ $item->menu_icon = trim(preg_replace('/\bp-[0-5]\b/', '', $item->menu_icon));
// The link is an icon
if ($itemParams->get('menu_text', 1)) {
// If the link text is to be displayed, the icon is added with aria-hidden
diff --git a/src/html/mod_menu/mainmenu_url.php b/src/html/mod_menu/mainmenu_url.php
index 1d81553..e537255 100644
--- a/src/html/mod_menu/mainmenu_url.php
+++ b/src/html/mod_menu/mainmenu_url.php
@@ -33,6 +33,8 @@ if ($item->anchor_rel) {
$linktype = $item->title;
if ($item->menu_icon) {
+ // Strip Joomla-injected padding classes that conflict with FA icon sizing
+ $item->menu_icon = trim(preg_replace('/\bp-[0-5]\b/', '', $item->menu_icon));
// The link is an icon
if ($itemParams->get('menu_text', 1)) {
// If the link text is to be displayed, the icon is added with aria-hidden
diff --git a/src/media/css/a11y-high-contrast.css b/src/media/css/a11y-high-contrast.css
index e9e2471..81e0b96 100644
--- a/src/media/css/a11y-high-contrast.css
+++ b/src/media/css/a11y-high-contrast.css
@@ -10,7 +10,7 @@
* INGROUP: MokoOnyx.Accessibility
* REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
* PATH: ./media/css/a11y-high-contrast.css
- * VERSION: 02.20.00
+ * VERSION: 02.19.03
* BRIEF: High-contrast stylesheet for accessibility toolbar
*/
diff --git a/src/templateDetails.xml b/src/templateDetails.xml
index 3bdc767..d192160 100644
--- a/src/templateDetails.xml
+++ b/src/templateDetails.xml
@@ -31,12 +31,10 @@
-->
-
- https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx/updates.xml
-
+ https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx/updates.xml
mokoonyx
- 02.20.00
+ 02.19.03-dev
script.php
2026-05-16
Jonathan Miller || Moko Consulting