\n"
diff --git a/README.md b/README.md
index 4f8cc42..185f14e 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@
INGROUP: MokoOnyx.Documentation
REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
FILE: ./README.md
- VERSION: 01.00.19
+ VERSION: 01.00.25
BRIEF: Documentation for MokoOnyx template
-->
diff --git a/src/.build-trigger b/src/.build-trigger
new file mode 100644
index 0000000..a60fd55
--- /dev/null
+++ b/src/.build-trigger
@@ -0,0 +1 @@
+2026-04-26
diff --git a/src/html/com_joomgallery/category/default.php b/src/html/com_joomgallery/category/default.php
new file mode 100644
index 0000000..a3118e2
--- /dev/null
+++ b/src/html/com_joomgallery/category/default.php
@@ -0,0 +1,51 @@
+
+ *
+ * This file is part of a Moko Consulting project.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * FILE INFORMATION
+ * DEFGROUP: MokoOnyx.Override
+ * INGROUP: MokoOnyx
+ * REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
+ * PATH: /html/com_joomgallery/category/default.php
+ * VERSION: 01.00.00
+ * BRIEF: Category view override — password gate then loads default_cat sub-layout
+ */
+
+// No direct access
+defined('_JEXEC') or die;
+
+use Joomla\CMS\Router\Route;
+use Joomla\CMS\Language\Text;
+use Joomla\CMS\HTML\HTMLHelper;
+
+// Import CSS & JS
+$wa = $this->document->getWebAssetManager();
+$wa->useStyle('com_joomgallery.site');
+$wa->useStyle('com_joomgallery.jg-icon-font');
+?>
+
+item->pw_protected) : ?>
+
+
+ loadTemplate('cat'); ?>
+
diff --git a/src/html/com_joomgallery/category/default_cat.php b/src/html/com_joomgallery/category/default_cat.php
new file mode 100644
index 0000000..fbbcad2
--- /dev/null
+++ b/src/html/com_joomgallery/category/default_cat.php
@@ -0,0 +1,219 @@
+
+ *
+ * This file is part of a Moko Consulting project.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * FILE INFORMATION
+ * DEFGROUP: MokoOnyx.Override
+ * INGROUP: MokoOnyx
+ * REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
+ * PATH: /html/com_joomgallery/category/default_cat.php
+ * VERSION: 01.00.00
+ * BRIEF: Category sub-layout — subcategories grid + images grid with pagination
+ */
+
+// No direct access
+defined('_JEXEC') or die;
+
+use Joomla\CMS\Factory;
+use Joomla\CMS\Router\Route;
+use Joomla\CMS\Language\Text;
+use Joomla\CMS\Session\Session;
+use Joomla\CMS\HTML\HTMLHelper;
+use Joomla\CMS\Layout\LayoutHelper;
+use Joomgallery\Component\Joomgallery\Administrator\Helper\JoomHelper;
+
+// Image params
+$image_type = $this->params['configs']->get('jg_category_view_type_image', 'thumbnail', 'STRING');
+$gallery_class = $this->params['configs']->get('jg_category_view_class', 'masonry', 'STRING');
+$num_columns = $this->params['configs']->get('jg_category_view_num_columns', 3, 'INT');
+$image_class = $this->params['configs']->get('jg_category_view_image_class', 0, 'INT');
+$justified_height = $this->params['configs']->get('jg_category_view_justified_height', 200, 'INT');
+$justified_gap = $this->params['configs']->get('jg_category_view_justified_gap', 5, 'INT');
+$image_link = $this->params['configs']->get('jg_category_view_image_link', 'defaultview', 'STRING');
+$lightbox_image = $this->params['configs']->get('jg_category_view_lightbox_image', 'detail', 'STRING');
+$pagination_type = $this->params['configs']->get('jg_category_view_pagination', 0, 'INT');
+$show_subcategories = $this->params['configs']->get('jg_category_view_subcategories', 1, 'INT');
+$subcategory_type_image = $this->params['configs']->get('jg_category_view_type_subcategory_image', 'thumbnail', 'STRING');
+$num_columns_subcats = $this->params['configs']->get('jg_category_view_subcategories_num_columns', 3, 'INT');
+
+// Import CSS & JS
+$wa = $this->document->getWebAssetManager();
+
+if ($gallery_class == 'masonry') {
+ $wa->useScript('com_joomgallery.masonry');
+}
+
+if ($gallery_class == 'justified') {
+ $wa->useScript('com_joomgallery.justified');
+ $wa->addInlineStyle('.jg-images[class*=" justified-"] .jg-image-caption-hover { right: ' . $justified_gap . 'px; }');
+}
+
+$lightbox = false;
+if ($image_link == 'lightgallery') {
+ $lightbox = true;
+ $wa->useScript('com_joomgallery.lightgallery');
+ $wa->useScript('com_joomgallery.lg-thumbnail');
+ $wa->useStyle('com_joomgallery.lightgallery-bundle');
+}
+
+// Initialise the grid script
+$iniJS = 'window.joomGrid = {';
+$iniJS .= ' itemid: ' . $this->item->id . ',';
+$iniJS .= ' pagination: ' . $pagination_type . ',';
+$iniJS .= ' layout: "' . $gallery_class . '",';
+$iniJS .= ' num_columns: ' . $num_columns . ',';
+$iniJS .= ' lightbox: ' . ($lightbox ? 'true' : 'false') . ',';
+$iniJS .= ' justified: {height: ' . $justified_height . ', gap: ' . $justified_gap . '}';
+$iniJS .= '};';
+
+$wa->addInlineScript($iniJS, ['position' => 'before'], [], ['com_joomgallery.joomgrid']);
+$wa->useScript('com_joomgallery.joomgrid');
+
+// Access check
+$canEdit = $this->getAcl()->checkACL('edit', 'com_joomgallery.category', $this->item->id, $this->item->parent_id, true);
+$canAdd = $this->getAcl()->checkACL('add', 'com_joomgallery.image', 0, $this->item->id, true);
+$canDelete = $this->getAcl()->checkACL('delete', 'com_joomgallery.category', $this->item->id, $this->item->parent_id, true);
+$canCheckin = $this->getAcl()->checkACL('editstate', 'com_joomgallery.category', $this->item->id, $this->item->parent_id, true) || $this->item->checked_out == Factory::getUser()->id;
+$returnURL = base64_encode(JoomHelper::getViewRoute('category', $this->item->id, $this->item->parent_id, $this->item->language, $this->getLayout()));
+
+$hasSubcats = $show_subcategories && !empty($this->item->children->items) && count($this->item->children->items) > 0;
+$hasImages = !empty($this->item->images->items) && count($this->item->images->items) > 0;
+?>
+
+
diff --git a/src/html/com_joomgallery/category/index.html b/src/html/com_joomgallery/category/index.html
new file mode 100644
index 0000000..2efb97f
--- /dev/null
+++ b/src/html/com_joomgallery/category/index.html
@@ -0,0 +1 @@
+
diff --git a/src/html/com_joomgallery/gallery/default.php b/src/html/com_joomgallery/gallery/default.php
new file mode 100644
index 0000000..8eb0aae
--- /dev/null
+++ b/src/html/com_joomgallery/gallery/default.php
@@ -0,0 +1,138 @@
+
+ *
+ * This file is part of a Moko Consulting project.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * FILE INFORMATION
+ * DEFGROUP: MokoOnyx.Override
+ * INGROUP: MokoOnyx
+ * REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
+ * PATH: /html/com_joomgallery/gallery/default.php
+ * VERSION: 01.00.00
+ * BRIEF: Gallery view override — main image grid with masonry/justified layout
+ */
+
+// No direct access
+defined('_JEXEC') or die;
+
+use Joomla\CMS\Router\Route;
+use Joomla\CMS\Language\Text;
+use Joomla\CMS\Layout\LayoutHelper;
+
+// Image params
+$image_type = $this->params['configs']->get('jg_gallery_view_type_image', 'thumbnail', 'STRING');
+$gallery_class = $this->params['configs']->get('jg_gallery_view_class', 'masonry', 'STRING');
+$num_columns = $this->params['configs']->get('jg_gallery_view_num_columns', 3, 'INT');
+$image_class = $this->params['configs']->get('jg_gallery_view_image_class', 0, 'INT');
+$justified_height = $this->params['configs']->get('jg_gallery_view_justified_height', 200, 'INT');
+$justified_gap = $this->params['configs']->get('jg_gallery_view_justified_gap', 5, 'INT');
+$image_link = $this->params['configs']->get('jg_gallery_view_image_link', 'defaultview', 'STRING');
+$lightbox_image = $this->params['configs']->get('jg_category_view_lightbox_image', 'detail', 'STRING');
+$browse_categories_link = $this->params['configs']->get('jg_gallery_view_browse_categories_link', 1, 'INT');
+
+// Import CSS & JS
+$wa = $this->document->getWebAssetManager();
+$wa->useStyle('com_joomgallery.site');
+$wa->useStyle('com_joomgallery.jg-icon-font');
+
+if ($gallery_class == 'masonry') {
+ $wa->useScript('com_joomgallery.masonry');
+}
+
+if ($gallery_class == 'justified') {
+ $wa->useScript('com_joomgallery.justified');
+ $wa->addInlineStyle('.jg-images[class*=" justified-"] .jg-image-caption-hover { right: ' . $justified_gap . 'px; }');
+}
+
+$lightbox = false;
+if ($image_link == 'lightgallery') {
+ $lightbox = true;
+ $wa->useScript('com_joomgallery.lightgallery');
+ $wa->useScript('com_joomgallery.lg-thumbnail');
+ $wa->useStyle('com_joomgallery.lightgallery-bundle');
+}
+
+// Initialise the grid script
+$iniJS = 'window.joomGrid = {';
+$iniJS .= ' itemid: ' . $this->item->id . ',';
+$iniJS .= ' pagination: 0,';
+$iniJS .= ' layout: "' . $gallery_class . '",';
+$iniJS .= ' num_columns: ' . $num_columns . ',';
+$iniJS .= ' lightbox: ' . ($lightbox ? 'true' : 'false') . ',';
+$iniJS .= ' justified: {height: ' . $justified_height . ', gap: ' . $justified_gap . '}';
+$iniJS .= '};';
+
+$wa->addInlineScript($iniJS, ['position' => 'before'], [], ['com_joomgallery.joomgrid']);
+$wa->useScript('com_joomgallery.joomgrid');
+?>
+
+
diff --git a/src/html/com_joomgallery/gallery/index.html b/src/html/com_joomgallery/gallery/index.html
new file mode 100644
index 0000000..2efb97f
--- /dev/null
+++ b/src/html/com_joomgallery/gallery/index.html
@@ -0,0 +1 @@
+
diff --git a/src/html/com_joomgallery/image/default.php b/src/html/com_joomgallery/image/default.php
new file mode 100644
index 0000000..536fcdc
--- /dev/null
+++ b/src/html/com_joomgallery/image/default.php
@@ -0,0 +1,249 @@
+
+ *
+ * This file is part of a Moko Consulting project.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * FILE INFORMATION
+ * DEFGROUP: MokoOnyx.Override
+ * INGROUP: MokoOnyx
+ * REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
+ * PATH: /html/com_joomgallery/image/default.php
+ * VERSION: 01.00.00
+ * BRIEF: Image detail view override — single image with metadata, tags, custom fields
+ */
+
+// No direct access
+defined('_JEXEC') or die;
+
+use Joomla\CMS\Factory;
+use Joomla\CMS\Router\Route;
+use Joomla\CMS\Language\Text;
+use Joomla\CMS\Session\Session;
+use Joomla\CMS\HTML\HTMLHelper;
+use Joomla\CMS\Layout\FileLayout;
+use Joomla\CMS\User\UserFactoryInterface;
+use Joomla\Component\Fields\Administrator\Helper\FieldsHelper;
+use Joomgallery\Component\Joomgallery\Administrator\Helper\JoomHelper;
+
+// Image params
+$image_type = $this->params['configs']->get('jg_detail_view_type_image', 'detail', 'STRING');
+$show_title = $this->params['configs']->get('jg_detail_view_show_title', 0, 'INT');
+$show_category = $this->params['configs']->get('jg_detail_view_show_category', 0, 'INT');
+$show_description = $this->params['configs']->get('jg_detail_view_show_description', 0, 'INT');
+$show_imgdate = $this->params['configs']->get('jg_detail_view_show_imgdate', 0, 'INT');
+$show_imgauthor = $this->params['configs']->get('jg_detail_view_show_imgauthor', 0, 'INT');
+$show_created_by = $this->params['configs']->get('jg_detail_view_show_created_by', 0, 'INT');
+$show_votes = $this->params['configs']->get('jg_detail_view_show_votes', 0, 'INT');
+$show_rating = $this->params['configs']->get('jg_detail_view_show_rating', 0, 'INT');
+$show_hits = $this->params['configs']->get('jg_detail_view_show_hits', 0, 'INT');
+$show_downloads = $this->params['configs']->get('jg_detail_view_show_downloads', 0, 'INT');
+$show_tags = $this->params['configs']->get('jg_detail_view_show_tags', 0, 'INT');
+$show_metadata = $this->params['configs']->get('jg_detail_view_show_metadata', 0, 'INT');
+
+// Import CSS & JS
+$wa = $this->document->getWebAssetManager();
+$wa->useStyle('com_joomgallery.site');
+$wa->useStyle('com_joomgallery.jg-icon-font');
+
+// Access check
+$canEdit = $this->getAcl()->checkACL('edit', 'com_joomgallery.image', $this->item->id, $this->item->catid, true);
+$canDelete = $this->getAcl()->checkACL('delete', 'com_joomgallery.image', $this->item->id, $this->item->catid, true);
+$canCheckin = $this->getAcl()->checkACL('editstate', 'com_joomgallery.image', $this->item->id, $this->item->catid, true) || $this->item->checked_out == Factory::getUser()->id;
+$returnURL = base64_encode(JoomHelper::getViewRoute('image', $this->item->id, $this->item->catid, $this->item->language, $this->getLayout()));
+
+// Tags
+$tagLayout = new FileLayout('joomgallery.content.tags');
+$tags = $tagLayout->render($this->item->tags);
+
+// Metadata
+$metadataLayout = new FileLayout('joomgallery.content.metadata');
+$metadata = $metadataLayout->render($this->item->imgmetadata);
+
+// Custom Fields
+$fields = FieldsHelper::getFields('com_joomgallery.image', $this->item);
+
+// Check if we have any info rows to show
+$hasInfo = $show_category || $show_imgdate || $show_imgauthor || $show_created_by
+ || $show_votes || $show_rating || $show_hits || $show_downloads
+ || $show_tags || $show_metadata || count($fields) > 0;
+?>
+
+
diff --git a/src/html/com_joomgallery/image/index.html b/src/html/com_joomgallery/image/index.html
new file mode 100644
index 0000000..2efb97f
--- /dev/null
+++ b/src/html/com_joomgallery/image/index.html
@@ -0,0 +1 @@
+
diff --git a/src/templateDetails.xml b/src/templateDetails.xml
index 20b46a5..95f2af0 100644
--- a/src/templateDetails.xml
+++ b/src/templateDetails.xml
@@ -39,9 +39,9 @@
MokoOnyx
- 01.00.18
+ 01.00.25
script.php
- 2026-04-15
+ 2026-04-26
Jonathan Miller || Moko Consulting
hello@mokoconsulting.tech
(C)GNU General Public License Version 3 - 2026 Moko Consulting
@@ -376,3 +376,4 @@