From 563f0979b3ec3f6382834cd8a0c54b4b88a16750 Mon Sep 17 00:00:00 2001 From: Mark Gregory Date: Tue, 28 Jul 2026 14:11:59 +0100 Subject: [PATCH] updated theme --- resources/themes/saasland/css/theme.css | 3 + resources/themes/saasland/js/app.js | 49 ++++++++- resources/themes/saasland/theme.json | 4 +- .../saasland/views/partials/header.blade.php | 22 +++- .../views/views/partials/header.blade.php | 101 ++++++++---------- 5 files changed, 114 insertions(+), 65 deletions(-) diff --git a/resources/themes/saasland/css/theme.css b/resources/themes/saasland/css/theme.css index a6c8d32..295370c 100644 --- a/resources/themes/saasland/css/theme.css +++ b/resources/themes/saasland/css/theme.css @@ -19,3 +19,6 @@ @media(max-width:1180px){.hero-premium-grid{grid-template-columns:1fr;gap:38px;padding-top:60px}.hero-copy{text-align:center}.hero-copy h1,.hero-copy>p{margin-left:auto;margin-right:auto}.hero-actions,.hero-assurances{justify-content:center}.dashboard-preview{max-width:900px;width:100%;margin:0 auto}.feature-row{grid-template-columns:repeat(2,1fr)}.footer-grid-premium{grid-template-columns:1.25fr repeat(3,1fr)}.footer-newsletter{grid-column:1/-1;max-width:560px}} @media(max-width:760px){.hero-premium-grid{padding:52px 0 44px}.hero-copy h1{font-size:46px}.dashboard-preview{display:none}.features-premium{padding:42px 0}.feature-row{grid-template-columns:1fr}.footer-grid-premium{grid-template-columns:repeat(2,1fr)}.footer-brand,.footer-newsletter{grid-column:1/-1}.copyright{align-items:flex-start;flex-direction:column}.footer-bottom-links{flex-wrap:wrap}} @media(max-width:480px){.hero-copy h1{font-size:39px}.hero-assurances{align-items:center;flex-direction:column}.footer-grid-premium{grid-template-columns:1fr}.footer-brand,.footer-newsletter{grid-column:auto}.footer-subscribe{flex-direction:column;border:0;background:transparent;gap:8px}.footer-subscribe input{border:1px solid #454845;border-radius:8px;background:#181a18}.footer-subscribe button{min-height:44px;border-radius:8px}} + +/* Saasland mobile navigation controller */ +.mobile-nav[hidden]{display:none!important}.mobile-nav.is-open{display:flex!important}.menu.is-open span:nth-child(1){transform:translateY(7px) rotate(45deg)}.menu.is-open span:nth-child(2){opacity:0}.menu.is-open span:nth-child(3){transform:translateY(-7px) rotate(-45deg)}.menu span{transition:transform .2s ease,opacity .2s ease}.saasland-menu-open{overflow:hidden}@media(min-width:981px){.mobile-nav.is-open{display:none!important}.saasland-menu-open{overflow:auto}} diff --git a/resources/themes/saasland/js/app.js b/resources/themes/saasland/js/app.js index 1dd447f..3fec589 100644 --- a/resources/themes/saasland/js/app.js +++ b/resources/themes/saasland/js/app.js @@ -1 +1,48 @@ -// Theme JavaScript is intentionally minimal; Alpine is supplied by the Laravel application bundle. +(() => { + const initialise = () => { + document.querySelectorAll('[data-saasland-header]').forEach((header) => { + const toggle = header.querySelector('[data-saasland-menu-toggle]'); + const menu = document.querySelector('[data-saasland-mobile-nav]'); + + if (!toggle || !menu || toggle.dataset.initialised === 'true') { + return; + } + + const setOpen = (open) => { + toggle.setAttribute('aria-expanded', String(open)); + toggle.setAttribute('aria-label', open ? 'Close navigation' : 'Open navigation'); + toggle.classList.toggle('is-open', open); + menu.hidden = !open; + menu.classList.toggle('is-open', open); + document.documentElement.classList.toggle('saasland-menu-open', open); + }; + + toggle.addEventListener('click', () => { + setOpen(toggle.getAttribute('aria-expanded') !== 'true'); + }); + + menu.querySelectorAll('a').forEach((link) => { + link.addEventListener('click', () => setOpen(false)); + }); + + document.addEventListener('keydown', (event) => { + if (event.key === 'Escape') setOpen(false); + }); + + window.addEventListener('resize', () => { + if (window.innerWidth > 980) setOpen(false); + }); + + toggle.dataset.initialised = 'true'; + setOpen(false); + }); + }; + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initialise); + } else { + initialise(); + } + + document.addEventListener('livewire:navigated', initialise); +})(); diff --git a/resources/themes/saasland/theme.json b/resources/themes/saasland/theme.json index 138ebf6..71755f9 100644 --- a/resources/themes/saasland/theme.json +++ b/resources/themes/saasland/theme.json @@ -2,9 +2,9 @@ "manifest_version": 2, "name": "Saasland", "slug": "saasland", - "version": "1.3.0", + "version": "1.3.1", "author": "ABSDEV", - "description": "Premium dark SaaS frontend with compact section spacing, responsive dashboard hero, CMS-driven content and an expanded lead-generation footer.", + "description": "Premium dark SaaS frontend with CMS-driven content and a dependency-free responsive mobile navigation.", "type": "frontend", "extends": null, "entry_view": "home", diff --git a/resources/themes/saasland/views/partials/header.blade.php b/resources/themes/saasland/views/partials/header.blade.php index 53ce6ef..aa84f69 100644 --- a/resources/themes/saasland/views/partials/header.blade.php +++ b/resources/themes/saasland/views/partials/header.blade.php @@ -3,9 +3,10 @@ $menuLocation = $headerContent['menu_location'] ?? 'primary'; $navigationLinks = app(\Modules\Stylist\Support\FrontendNavigation::class)->location($menuLocation, $primaryNavigation ?? []); $brandUrl = $siteSettings['site_url'] ?: url('/'); + $mobileMenuId = 'saasland-mobile-navigation'; @endphp -