diff --git a/.github/workflows/changelog-validation.yml b/.github/workflows/changelog-validation.yml
index e2ec667..bfd1be3 100644
--- a/.github/workflows/changelog-validation.yml
+++ b/.github/workflows/changelog-validation.yml
@@ -19,9 +19,7 @@ on:
push:
branches:
- main
- pull_request:
- branches:
- - main
+ - version/*
workflow_dispatch:
permissions:
diff --git a/.github/workflows/ci-joomla.yml b/.github/workflows/ci-joomla.yml
index 01e1edb..fa1b81a 100644
--- a/.github/workflows/ci-joomla.yml
+++ b/.github/workflows/ci-joomla.yml
@@ -19,14 +19,7 @@ on:
push:
branches:
- main
- - dev/**
- - rc/**
- - version/**
- pull_request:
- branches:
- - main
- - dev/**
- - rc/**
+ - version/*
workflow_dispatch:
permissions:
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index 1639497..72cacae 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -21,14 +21,7 @@ on:
push:
branches:
- main
- - dev/**
- - rc/**
- - version/**
- pull_request:
- branches:
- - main
- - dev/**
- - rc/**
+ - version/*
schedule:
# Weekly on Monday at 06:00 UTC
- cron: '0 6 * * 1'
diff --git a/.github/workflows/standards-compliance.yml b/.github/workflows/standards-compliance.yml
index 79aaedd..418a297 100644
--- a/.github/workflows/standards-compliance.yml
+++ b/.github/workflows/standards-compliance.yml
@@ -89,9 +89,7 @@ env:
on:
push:
- branches: [main, dev/**, rc/**, version/**]
- pull_request:
- branches: [main, dev/**, rc/**]
+ branches: [main, version/*]
workflow_dispatch:
permissions:
diff --git a/.github/workflows/update-server.yml b/.github/workflows/update-server.yml
index 90482e5..8becae8 100644
--- a/.github/workflows/update-server.yml
+++ b/.github/workflows/update-server.yml
@@ -22,10 +22,8 @@ name: Update Joomla Update Server XML Feed
on:
push:
branches:
- - 'dev/**'
- - 'alpha/**'
- - 'beta/**'
- - 'rc/**'
+ - main
+ - version/*
paths:
- 'src/**'
- 'htdocs/**'
diff --git a/src/html/mod_breadcrumbs/default.php b/src/html/mod_breadcrumbs/default.php
index 96e741e..b81fc8c 100644
--- a/src/html/mod_breadcrumbs/default.php
+++ b/src/html/mod_breadcrumbs/default.php
@@ -10,49 +10,20 @@
/**
* Default layout override for mod_breadcrumbs.
* Bootstrap 5 breadcrumb with schema.org BreadcrumbList markup.
- * Respects showHome, showLast, homeText module settings.
+ * Module settings (showHome, showLast, homeText) are handled by Joomla core
+ * before $list reaches this template.
*/
defined('_JEXEC') or die;
-use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
-use Joomla\CMS\Router\Route;
-use Joomla\CMS\Uri\Uri;
-
-Factory::getApplication()->getLanguage()->load('mod_breadcrumbs', JPATH_SITE);
$suffix = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');
$headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8');
$headerClass = htmlspecialchars($params->get('header_class', ''), ENT_COMPAT, 'UTF-8');
-$showHome = $params->get('showHome', 1);
-$showLast = $params->get('showLast', 1);
-$homeText = $params->get('homeText', '') ?: Text::_('MOD_BREADCRUMBS_HOME');
+$showHere = $params->get('showHere', 1);
-// Build filtered list respecting module settings
-$items = [];
-$count = count($list);
-
-foreach ($list as $key => $item) {
- // Skip Home item if showHome is off
- if ($key === 0 && !$showHome) {
- continue;
- }
-
- // Replace Home text if custom homeText is set
- if ($key === 0 && $showHome) {
- $item->name = $homeText;
- }
-
- // Skip last item if showLast is off
- if ($key === $count - 1 && !$showLast) {
- continue;
- }
-
- $items[] = $item;
-}
-
-if (empty($items)) {
+if (empty($list)) {
return;
}
?>
@@ -60,9 +31,12 @@ if (empty($items)) {
showtitle) : ?>
< class="mod-breadcrumbs__title">title; ?>>
+
+
+
- $item) : ?>
-
+ $item) : ?>
+
- >
link)) : ?>
diff --git a/src/html/mod_menu/horizontal.php b/src/html/mod_menu/horizontal.php
new file mode 100644
index 0000000..d24ffcb
--- /dev/null
+++ b/src/html/mod_menu/horizontal.php
@@ -0,0 +1,106 @@
+
+ *
+ * This file is part of a Moko Consulting project.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+/**
+ * Main Menu - Mobile responsive collapsible dropdown menu override
+ * Bootstrap 5 responsive navbar with hamburger menu
+ */
+
+defined('_JEXEC') or die;
+
+use Joomla\CMS\Helper\ModuleHelper;
+
+$id = '';
+
+if ($tagId = $params->get('tag_id', '')) {
+ $id = ' id="' . $tagId . '"';
+}
+
+// Get module class suffix
+$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');
+
+// The menu class is deprecated. Use mod-menu instead
+?>
+
diff --git a/src/html/mod_menu/horizontal_component.php b/src/html/mod_menu/horizontal_component.php
new file mode 100644
index 0000000..dfcfa7f
--- /dev/null
+++ b/src/html/mod_menu/horizontal_component.php
@@ -0,0 +1,66 @@
+
+ *
+ * This file is part of a Moko Consulting project.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+/**
+ * Main Menu - Component item layout
+ */
+
+defined('_JEXEC') or die;
+
+use Joomla\CMS\Filter\OutputFilter;
+use Joomla\CMS\HTML\HTMLHelper;
+
+$attributes = [];
+
+if ($item->anchor_title) {
+ $attributes['title'] = $item->anchor_title;
+}
+
+if ($item->anchor_css) {
+ $attributes['class'] = $item->anchor_css;
+}
+
+if ($item->anchor_rel) {
+ $attributes['rel'] = $item->anchor_rel;
+}
+
+$linktype = $item->title;
+
+if ($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
+ $linktype = '' . $item->title;
+ } else {
+ // If the icon itself is the link, it needs a visually hidden text
+ $linktype = '' . $item->title . '';
+ }
+}
+
+if ($item->browserNav == 1) {
+ $attributes['target'] = '_blank';
+ $attributes['rel'] = 'noopener noreferrer';
+} elseif ($item->browserNav == 2) {
+ $options = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,' . $params->get('window_open');
+
+ $attributes['onclick'] = "window.open(this.href, 'targetWindow', '" . $options . "'); return false;";
+}
+
+// Add dropdown toggle for items with children
+$linkClass = 'nav-link mod-menu-main__link';
+if ($item->deeper) {
+ $linkClass .= ' dropdown-toggle';
+ $attributes['data-bs-toggle'] = 'dropdown';
+ $attributes['role'] = 'button';
+ $attributes['aria-expanded'] = 'false';
+}
+
+$attributes['class'] = $linkClass;
+
+echo HTMLHelper::_('link', OutputFilter::ampReplace(htmlspecialchars($item->flink, ENT_COMPAT, 'UTF-8', false)), $linktype, $attributes);
diff --git a/src/html/mod_menu/horizontal_heading.php b/src/html/mod_menu/horizontal_heading.php
new file mode 100644
index 0000000..990077e
--- /dev/null
+++ b/src/html/mod_menu/horizontal_heading.php
@@ -0,0 +1,39 @@
+
+ *
+ * This file is part of a Moko Consulting project.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+/**
+ * Main Menu - Heading item layout
+ */
+
+defined('_JEXEC') or die;
+
+$title = $item->anchor_title ? ' title="' . $item->anchor_title . '"' : '';
+$anchor_css = $item->anchor_css ?: '';
+
+$linktype = $item->title;
+
+if ($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
+ $linktype = '' . $item->title;
+ } else {
+ // If the icon itself is the link, it needs a visually hidden text
+ $linktype = '' . $item->title . '';
+ }
+}
+
+// Add dropdown toggle for items with children
+$headingClass = 'nav-link mod-menu-main__heading';
+if ($item->deeper) {
+ $headingClass .= ' dropdown-toggle';
+}
+
+?>
+>
diff --git a/src/html/mod_menu/horizontal_separator.php b/src/html/mod_menu/horizontal_separator.php
new file mode 100644
index 0000000..2c0c587
--- /dev/null
+++ b/src/html/mod_menu/horizontal_separator.php
@@ -0,0 +1,33 @@
+
+ *
+ * This file is part of a Moko Consulting project.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+/**
+ * Main Menu - Separator item layout
+ */
+
+defined('_JEXEC') or die;
+
+$title = $item->anchor_title ? ' title="' . $item->anchor_title . '"' : '';
+$anchor_css = $item->anchor_css ?: '';
+
+$linktype = $item->title;
+
+if ($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
+ $linktype = '' . $item->title;
+ } else {
+ // If the icon itself is the link, it needs a visually hidden text
+ $linktype = '' . $item->title . '';
+ }
+}
+
+?>
+>
diff --git a/src/html/mod_menu/horizontal_url.php b/src/html/mod_menu/horizontal_url.php
new file mode 100644
index 0000000..10b380b
--- /dev/null
+++ b/src/html/mod_menu/horizontal_url.php
@@ -0,0 +1,71 @@
+
+ *
+ * This file is part of a Moko Consulting project.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+/**
+ * Main Menu - URL item layout
+ */
+
+defined('_JEXEC') or die;
+
+use Joomla\CMS\Filter\OutputFilter;
+use Joomla\CMS\HTML\HTMLHelper;
+
+$attributes = [];
+
+if ($item->anchor_title) {
+ $attributes['title'] = $item->anchor_title;
+}
+
+if ($item->anchor_css) {
+ $attributes['class'] = $item->anchor_css;
+}
+
+if ($item->anchor_rel) {
+ $attributes['rel'] = $item->anchor_rel;
+}
+
+$linktype = $item->title;
+
+if ($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
+ $linktype = '' . $item->title;
+ } else {
+ // If the icon itself is the link, it needs a visually hidden text
+ $linktype = '' . $item->title . '';
+ }
+}
+
+if ($item->browserNav == 1) {
+ $attributes['target'] = '_blank';
+ $attributes['rel'] = 'noopener noreferrer';
+} elseif ($item->browserNav == 2) {
+ $options = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,' . $params->get('window_open');
+
+ $attributes['onclick'] = "window.open(this.href, 'targetWindow', '" . $options . "'); return false;";
+}
+
+// Add dropdown toggle for items with children
+$linkClass = 'nav-link mod-menu-main__link';
+if ($item->deeper) {
+ $linkClass .= ' dropdown-toggle';
+ $attributes['data-bs-toggle'] = 'dropdown';
+ $attributes['role'] = 'button';
+ $attributes['aria-expanded'] = 'false';
+}
+
+// Merge existing class with our class
+if (isset($attributes['class'])) {
+ $attributes['class'] .= ' ' . $linkClass;
+} else {
+ $attributes['class'] = $linkClass;
+}
+
+echo HTMLHelper::_('link', OutputFilter::ampReplace(htmlspecialchars($item->flink, ENT_COMPAT, 'UTF-8', false)), $linktype, $attributes);
diff --git a/src/html/mod_menu/mainmenu.php b/src/html/mod_menu/mainmenu.php
index e664177..1ee4c96 100644
--- a/src/html/mod_menu/mainmenu.php
+++ b/src/html/mod_menu/mainmenu.php
@@ -30,12 +30,12 @@ $moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COM