From 8ea6ce249a58cfdb64662470e5d09c3cdc9e3471 Mon Sep 17 00:00:00 2001 From: Sonny Le Date: Fri, 31 Jul 2026 10:31:06 +0700 Subject: [PATCH 1/9] - Update hover overlay content - Update hover overlay content in uk grid --- framework/elements/uk_grid/uk_grid.php | 14 ++++++++++++++ framework/elements/uk_grid/uk_grid.xml | 8 ++++++++ language/en-GB/en-GB.astroid.ini | 1 + 3 files changed, 23 insertions(+) diff --git a/framework/elements/uk_grid/uk_grid.php b/framework/elements/uk_grid/uk_grid.php index 6d0455d6..7e2aa426 100644 --- a/framework/elements/uk_grid/uk_grid.php +++ b/framework/elements/uk_grid/uk_grid.php @@ -107,6 +107,7 @@ $image_fullwidth = $enable_image_cover ? 1 : $params->get('image_fullwidth', 1); $min_height = $params->get('min_height', 0); $overlay_type = $params->get('overlay_type', ''); +$overlay_type_hover = $params->get('overlay_type_hover', ''); $enable_grid_match = $params->get('enable_grid_match', 0); $vertical_middle = $params->get('vertical_middle', 0); @@ -392,6 +393,19 @@ } break; } +switch ($overlay_type_hover) { + case 'color': + $overlay_hover_color = Style::getColor($params->get('overlay_hover_color', '')); + $style->child('.as-image-cover:hover .astroid-image-overlay-cover:after')->addCss('background-color', $overlay_hover_color['light']); + $style_dark->child('.as-image-cover:hover .astroid-image-overlay-cover:after')->addCss('background-color', $overlay_hover_color['dark']); + break; + case 'background-color': + $overlay_hover_gradient = $params->get('overlay_hover_gradient', ''); + if (!empty($overlay_hover_gradient)) { + $style->child('.as-image-cover:hover .astroid-image-overlay-cover:after')->addCss('background-image', Style::getGradientValue($overlay_hover_gradient)); + } + break; +} $media_margin = $params->get('media_margin', ''); if (!empty($media_margin)) { diff --git a/framework/elements/uk_grid/uk_grid.xml b/framework/elements/uk_grid/uk_grid.xml index 40d9c926..ec133108 100644 --- a/framework/elements/uk_grid/uk_grid.xml +++ b/framework/elements/uk_grid/uk_grid.xml @@ -486,6 +486,14 @@ + + + + + + + + diff --git a/language/en-GB/en-GB.astroid.ini b/language/en-GB/en-GB.astroid.ini index 0942a629..f77725d1 100644 --- a/language/en-GB/en-GB.astroid.ini +++ b/language/en-GB/en-GB.astroid.ini @@ -1758,6 +1758,7 @@ ASTROID_WIDGET_ENABLE_ICON_LINK="Enable Icon Link" ASTROID_WIDGET_MIN_HEIGHT="Min Height" ASTROID_WIDGET_NAV_COLOR="Navigation Color" ASTROID_WIDGET_OVERLAY_COLOR="Overlay Color" +ASTROID_WIDGET_OVERLAY_HOVER_COLOR="Overlay Hover Color" ASTROID_WIDGET_ENABLE_IMAGE_EFFECT="Enable Image Effect" ASTROID_WIDGET_IMAGE_EFFECT="Image Effect" ASTROID_WIDGET_IMAGE_HOVER_EFFECT="Image Hover Effect" From a58fc8a65934c93161c51906739e0676489b14ef Mon Sep 17 00:00:00 2001 From: Sonny Le Date: Fri, 31 Jul 2026 16:30:24 +0700 Subject: [PATCH 2/9] Add astroid-embed-responsive style --- assets/vendor/astroid/scss/_base.scss | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/assets/vendor/astroid/scss/_base.scss b/assets/vendor/astroid/scss/_base.scss index b4e598c6..fa155584 100644 --- a/assets/vendor/astroid/scss/_base.scss +++ b/assets/vendor/astroid/scss/_base.scss @@ -71,4 +71,21 @@ a { filter: invert(1) grayscale(100); } } +} + +.astroid-embed-responsive { + position: relative; + width: 100%; + &:before { + display: block; + padding-top: var(--bs-aspect-ratio); + content: ""; + } + > iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } } \ No newline at end of file From 520214f689ccef1cd850df9519d63049894a5989 Mon Sep 17 00:00:00 2001 From: Sonny Le Date: Tue, 4 Aug 2026 09:03:42 +0700 Subject: [PATCH 3/9] Update Helper.php --- framework/library/astroid/Helper.php | 37 ++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/framework/library/astroid/Helper.php b/framework/library/astroid/Helper.php index 24d5fb12..9df4f9fe 100644 --- a/framework/library/astroid/Helper.php +++ b/framework/library/astroid/Helper.php @@ -358,7 +358,7 @@ public static function getJoomlaVersion() public static function getAstroidFieldsets($form) { $astroidfieldsets = $form->getFieldsets(); - usort($astroidfieldsets, "self::fieldsetOrding"); + usort($astroidfieldsets, [self::class, 'fieldsetOrding']); $fieldsets = []; @@ -385,7 +385,11 @@ public static function fieldsetOrding($a, $b) public static function getModules() { $db = Factory::getContainer()->get(DatabaseInterface::class); - $query = "SELECT #__modules.*, #__usergroups.title as access_title FROM #__modules JOIN #__usergroups ON #__usergroups.id=#__modules.access WHERE #__modules.client_id=0"; + $query = $db->getQuery(true) + ->select([$db->quoteName('m') . '.*', $db->quoteName('ug.title', 'access_title')]) + ->from($db->quoteName('#__modules', 'm')) + ->join('INNER', $db->quoteName('#__usergroups', 'ug') . ' ON ' . $db->quoteName('ug.id') . ' = ' . $db->quoteName('m.access')) + ->where($db->quoteName('m.client_id') . ' = 0'); $db->setQuery($query); $results = $db->loadObjectList(); @@ -913,18 +917,18 @@ public static function fetchAstroidPromotions() $response = $http->get($url); if ($response->code !== 200) { - throw new Exception('Failed to fetch data. HTTP Code: ' . $response->code); + throw new \Exception('Failed to fetch data. HTTP Code: ' . $response->code); } $xml = simplexml_load_string($response->body, 'SimpleXMLElement', LIBXML_NOCDATA); if ($xml === false) { - throw new Exception('Failed to parse XML data.'); + throw new \Exception('Failed to parse XML data.'); } // Convert XML to Array $data = json_decode(json_encode($xml), true); $json = json_encode(['time' => $today, 'data' => $data]); if ($json === false) { - throw new Exception('Failed to convert XML to JSON.'); + throw new \Exception('Failed to convert XML to JSON.'); } // Save the latest promotion data @@ -942,7 +946,7 @@ public static function fetchAstroidPromotions() $db->execute(); return $data; - } catch (Exception $e) { + } catch (\Exception $e) { Factory::getApplication()->enqueueMessage('Error: ' . $e->getMessage(), 'error'); return null; } @@ -1005,4 +1009,23 @@ public static function getLanguageStrings() : array return $strings; } -} + + public static function getCategoryParams($article) + { + $params = new Registry(); + if (!empty($article->catid)) { + $db = Factory::getContainer()->get(DatabaseInterface::class); + $catid = (int) $article->catid; + $query = $db->getQuery(true) + ->select($db->quoteName('params')) + ->from($db->quoteName('#__categories')) + ->where($db->quoteName('id') . ' = ' . $catid); + $db->setQuery($query); + $result = $db->loadObject(); + if (!empty($result) && !empty($result->params)) { + $params->loadString($result->params, 'JSON'); + } + } + return $params; + } +} \ No newline at end of file From 99eff45cf845859727cc15f137a1ba35c40e121d Mon Sep 17 00:00:00 2001 From: Sonny Le Date: Mon, 10 Aug 2026 10:42:27 +0700 Subject: [PATCH 4/9] Update condition option for sticky menu --- framework/options/header.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/framework/options/header.xml b/framework/options/header.xml index 277a83bb..a35ea6a9 100644 --- a/framework/options/header.xml +++ b/framework/options/header.xml @@ -2,7 +2,6 @@
- @@ -224,7 +223,7 @@ - + From 7abb1fc3db9fc17f3fb3ddf37089a734251d75d6 Mon Sep 17 00:00:00 2001 From: Sonny Le Date: Mon, 10 Aug 2026 15:10:07 +0700 Subject: [PATCH 5/9] Remove jQuery in script.js --- joomla.asset.json | 5 +- js/script.js | 468 ++++++++++++++++++++++++++++------------------ js/script.min.js | 2 +- 3 files changed, 283 insertions(+), 192 deletions(-) diff --git a/joomla.asset.json b/joomla.asset.json index 33263e28..6a07842b 100644 --- a/joomla.asset.json +++ b/joomla.asset.json @@ -1,7 +1,7 @@ { "$schema": "https://developer.joomla.org/schemas/json-schema/web_assets.json", "name": "astroid", - "version": "3.4.3", + "version": "3.5.0", "description": "Astroid Framework Assets", "license": "GPL-3.0-or-later", "assets": [ @@ -37,9 +37,6 @@ { "name": "astroid.script", "type": "script", - "dependencies": [ - "jquery" - ], "uri": "astroid/script.min.js" }, { diff --git a/js/script.js b/js/script.js index efd4d406..8812e091 100644 --- a/js/script.js +++ b/js/script.js @@ -1,125 +1,227 @@ -(function ($) { +(function () { // Functions let lastScrollTop = 0; let windowloaded = false; + let initLastScrollTop = function () { - lastScrollTop = $(window).scrollTop(); + lastScrollTop = window.scrollY; + }; + + let isScrollDown = () => window.scrollY > lastScrollTop; + + // --- Helpers --- + + let getOffsetTop = function (el) { + return el.getBoundingClientRect().top + window.scrollY; + }; + + let slideUp = function (el, duration) { + duration = duration || 300; + if (getComputedStyle(el).display === 'none') return; + el.style.height = el.scrollHeight + 'px'; + el.style.overflow = 'hidden'; + el.style.transition = 'height ' + duration + 'ms ease'; + requestAnimationFrame(function () { + el.style.height = '0'; + }); + setTimeout(function () { + el.style.display = 'none'; + el.style.height = ''; + el.style.overflow = ''; + el.style.transition = ''; + }, duration); + }; + + let slideToggle = function (el, duration) { + duration = duration || 300; + const isHidden = getComputedStyle(el).display === 'none'; + if (isHidden) { + el.style.display = 'block'; + el.style.overflow = 'hidden'; + el.style.height = '0'; + el.style.transition = 'height ' + duration + 'ms ease'; + const targetHeight = el.scrollHeight; + requestAnimationFrame(function () { + el.style.height = targetHeight + 'px'; + }); + setTimeout(function () { + el.style.height = ''; + el.style.overflow = ''; + el.style.transition = ''; + }, duration); + } else { + slideUp(el, duration); + } }; - let isScrollDown = () => $(window).scrollTop() > lastScrollTop; + + // --- Init functions --- let initMobileMenu = function () { - if (!$('.astroid-mobile-menu').length) { - return; + const mobileMenus = document.querySelectorAll('.astroid-mobile-menu'); + if (!mobileMenus.length) return; + // astroidMobileMenu is an external jQuery plugin + if (typeof jQuery !== 'undefined') { + jQuery('.astroid-mobile-menu').astroidMobileMenu(); } - $('.astroid-mobile-menu').astroidMobileMenu(); - $('.astroid-mobile-menu').removeClass('d-none'); + mobileMenus.forEach(function (el) { + el.classList.remove('d-none'); + }); }; + let initOffcanvasMenu = function () { - if (!$('#astroid-offcanvas').length) { - return; - } - if ($('#astroid-offcanvas').find('ul.menu').length) { - $('#astroid-offcanvas').find('ul.menu').astroidMobileMenu(); + const offcanvas = document.querySelector('#astroid-offcanvas'); + if (!offcanvas) return; + if (offcanvas.querySelectorAll('ul.menu').length && typeof jQuery !== 'undefined') { + jQuery('#astroid-offcanvas').find('ul.menu').astroidMobileMenu(); } }; + let initSidebarMenu = function () { - if (!$('.astroid-sidebar-menu').length) { - return; - } - $('.astroid-sidebar-menu .nav-item-caret').click(function () { - $(this).parent().parent('li').siblings('li').children('ul').slideUp(); - $(this).parent().parent('li').siblings('li').children('div').children('.nav-item-caret').removeClass('open'); - $(this).toggleClass('open'); - $(this).parent().siblings('ul').slideToggle(); + if (!document.querySelector('.astroid-sidebar-menu')) return; + + document.querySelectorAll('.astroid-sidebar-menu .nav-item-caret').forEach(function (caret) { + caret.addEventListener('click', function () { + const parentDiv = caret.parentElement; + const parentLi = parentDiv && parentDiv.parentElement; + + if (parentLi && parentLi.tagName === 'LI' && parentLi.parentElement) { + // Collapse sibling list items + Array.from(parentLi.parentElement.children).forEach(function (sibling) { + if (sibling === parentLi || sibling.tagName !== 'LI') return; + Array.from(sibling.children).forEach(function (child) { + if (child.tagName === 'UL') slideUp(child); + if (child.tagName === 'DIV') { + child.querySelectorAll('.nav-item-caret').forEach(function (c) { + c.classList.remove('open'); + }); + } + }); + }); + } + + // Toggle open class on clicked caret + caret.classList.toggle('open'); + + // Toggle the sibling