fix(mobile-menu): move state to root x-data and add .stop to all logo links
All checks were successful
Deploy Theme / deploy (push) Successful in 15s

This commit is contained in:
2026-02-19 21:13:24 +01:00
parent ce531399f9
commit b00f0559f0
3 changed files with 15 additions and 21 deletions

View File

@@ -2,6 +2,7 @@
<html lang="{{@site.lang}}" <html lang="{{@site.lang}}"
x-data="{ x-data="{
theme: localStorage.getItem('theme') || (window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark'), theme: localStorage.getItem('theme') || (window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark'),
mobileMenuOpen: false,
init() { init() {
$watch('theme', val => { $watch('theme', val => {
localStorage.setItem('theme', val); localStorage.setItem('theme', val);
@@ -9,6 +10,13 @@
}); });
document.documentElement.setAttribute('data-theme', this.theme); document.documentElement.setAttribute('data-theme', this.theme);
document.documentElement.classList.remove('hidden'); document.documentElement.classList.remove('hidden');
document.addEventListener('htmx:beforeRequest', () => {
this.mobileMenuOpen = false;
});
},
toggleMenu() {
this.mobileMenuOpen = !this.mobileMenuOpen;
} }
}" }"
:data-theme="theme" :data-theme="theme"
@@ -25,24 +33,10 @@
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script> <script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
<script src="https://unpkg.com/htmx.org@2.0.0"></script> <script src="https://unpkg.com/htmx.org@2.0.0"></script>
<script>
document.addEventListener('alpine:init', () => {
Alpine.store('mobileMenu', {
open: false,
close() { this.open = false; },
openMenu() { this.open = true; }
});
});
document.addEventListener('htmx:beforeRequest', () => {
if (window.Alpine) Alpine.store('mobileMenu').close();
});
</script>
{{ghost_head}} {{ghost_head}}
</head> </head>
<body class="{{body_class}} font-sans antialiased"> <body class="{{body_class}} font-sans antialiased">
{{!-- Mobile menu stays outside the boosted area --}} {{!-- Mobile menu outside boosted area --}}
{{> mobile-menu}} {{> mobile-menu}}
<div class="min-h-screen flex flex-col" hx-boost="true"> <div class="min-h-screen flex flex-col" hx-boost="true">

View File

@@ -22,7 +22,7 @@
</button> </button>
</nav> </nav>
<button @click.stop="$store.mobileMenu.openMenu()" class="md:hidden p-2 rounded-full bg-[var(--bg-secondary)] text-[var(--text-primary)] hover:bg-[var(--bg-tertiary)] transition-colors duration-200"> <button @click.stop="mobileMenuOpen = true" class="md:hidden p-2 rounded-full bg-[var(--bg-secondary)] text-[var(--text-primary)] hover:bg-[var(--bg-tertiary)] transition-colors duration-200">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" /> <path stroke-linecap="round" stroke-linejoin="round" d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" />
</svg> </svg>

View File

@@ -1,5 +1,5 @@
<div id="mobile-menu" <div id="mobile-menu"
x-show="$store.mobileMenu.open" x-show="mobileMenuOpen"
x-transition:enter="transition ease-out duration-300" x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="-translate-x-full" x-transition:enter-start="-translate-x-full"
x-transition:enter-end="translate-x-0" x-transition:enter-end="translate-x-0"
@@ -7,13 +7,13 @@
x-transition:leave-start="translate-x-0" x-transition:leave-start="translate-x-0"
x-transition:leave-end="-translate-x-full" x-transition:leave-end="-translate-x-full"
class="fixed inset-0 z-50 bg-[var(--bg-primary)] flex flex-col md:hidden" class="fixed inset-0 z-50 bg-[var(--bg-primary)] flex flex-col md:hidden"
@click.away="$store.mobileMenu.close()" @click.away="mobileMenuOpen = false"
hx-boost="false" hx-boost="false"
x-cloak> x-cloak>
<!-- Mobile Menu Header --> <!-- Mobile Menu Header -->
<div class="flex justify-between items-center p-5 flex-none"> <div class="flex justify-between items-center p-5 flex-none">
<a href="{{@site.url}}" class="flex items-center text-[var(--text-primary)]" @click.stop="$store.mobileMenu.close()"> <a href="{{@site.url}}" class="flex items-center text-[var(--text-primary)]" @click.stop="mobileMenuOpen = false">
{{#if @site.logo}} {{#if @site.logo}}
<img src="{{@site.logo}}" alt="{{@site.title}}" class="h-10 w-auto site-logo"> <img src="{{@site.logo}}" alt="{{@site.title}}" class="h-10 w-auto site-logo">
{{else}} {{else}}
@@ -21,7 +21,7 @@
{{/if}} {{/if}}
<span class="ml-3 text-xl font-bold">{{@site.title}}</span> <span class="ml-3 text-xl font-bold">{{@site.title}}</span>
</a> </a>
<button @click.stop="$store.mobileMenu.close()" class="p-2 rounded-full bg-[var(--bg-secondary)] text-[var(--text-primary)] hover:bg-[var(--bg-tertiary)] transition-colors duration-200"> <button @click.stop="mobileMenuOpen = false" class="p-2 rounded-full bg-[var(--bg-secondary)] text-[var(--text-primary)] hover:bg-[var(--bg-tertiary)] transition-colors duration-200">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" /> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />
</svg> </svg>
@@ -29,7 +29,7 @@
</div> </div>
<!-- Mobile Menu Navigation --> <!-- Mobile Menu Navigation -->
<nav class="flex-grow flex flex-col items-center justify-center p-10 overflow-y-auto" @click="$store.mobileMenu.close()"> <nav class="flex-grow flex flex-col items-center justify-center p-10 overflow-y-auto" @click="mobileMenuOpen = false">
<div class="w-full text-center"> <div class="w-full text-center">
{{navigation type="primary"}} {{navigation type="primary"}}
</div> </div>