Private
Public Access
1
0

feat: update mobile header styles and behavior

This commit is contained in:
2026-02-11 20:16:21 +01:00
parent e71c6e2a7b
commit c6bfa6239f

View File

@@ -1,16 +1,45 @@
<script lang="ts"> <script lang="ts">
import type { Header } from '$lib/types/data'; import type { Header } from '$lib/types/data';
import favicon from '$lib/assets/favicon.svg';
import { Menu, X } from '@lucide/svelte';
let { links }: Header = $props(); let { links }: Header = $props();
let isMobileMenuOpen = $state(false);
const setIsMobileMenuOpen = (value: boolean) => {
isMobileMenuOpen = value;
};
</script> </script>
<header> <header>
<nav>
<nav class:mobile-open={isMobileMenuOpen}>
<div>
<span class="icon">
<img src={favicon} alt="">
</span>
<!-- open menu -->
<button class:hide={isMobileMenuOpen} onclick={() => setIsMobileMenuOpen(true)}>
<span class="icon">
<Menu class="icon" />
</span>
</button>
<!-- close menu -->
<button class:hide={!isMobileMenuOpen} onclick={() => setIsMobileMenuOpen(false)}>
<span class="icon">
<X class="icon" />
</span>
</button>
</div>
<ul> <ul>
{#each links as { href, label }, i (i)} {#each links as { href, label }, i (i)}
<li> <li>
<!-- eslint-disable-next-line svelte/no-navigation-without-resolve --> <!-- eslint-disable-next-line svelte/no-navigation-without-resolve -->
<a href={href}>{label}</a> <a href={href} onclick={() => setIsMobileMenuOpen(false)}>{label}</a>
</li> </li>
{/each} {/each}
</ul> </ul>
@@ -19,53 +48,78 @@
<style> <style>
header { header {
position: fixed; position: sticky;
inset-inline: 0; top: 0;
bottom: 2rem; bottom: unset;
inset-inline: 0;
z-index: var(--z-index-header); z-index: var(--z-index-header);
width: fit-content; width: auto;
padding: 1rem; padding: 1rem;
margin-inline: auto;
border: 1px solid var(--color-header-border); border-bottom: 1px solid var(--color-header-border);
border-radius: 0.5rem; border-radius: unset;
font-size: 0.75rem; font-size: 1.125rem;
font-weight: bold; font-weight: bold;
background-color: var(--color-header-background); background-color: var(--color-header-background);
backdrop-filter: blur(1rem); backdrop-filter: blur(1rem);
}
div {
display: flex;
align-items: center;
justify-content: space-between;
font-size: 2rem;
padding-inline: 0.5rem;
@media (min-width: 768px) { @media (min-width: 768px) {
position: sticky; display: none;
top: 0;
bottom: unset;
width: auto;
padding: 1rem;
border: unset;
border-bottom: 1px solid var(--color-header-border);
border-radius: unset;
font-size: 1.125rem;
} }
} }
button {
border: unset;
background: unset;
color: inherit;
font-size: inherit;
cursor: pointer;
}
.hide {
display: none;
}
ul { ul {
display: flex; display: none;
flex-direction: column;
justify-content: center; justify-content: center;
align-items: center; align-items: stretch;
gap: 0.5rem; gap: 0.5rem;
margin: unset; margin: unset;
padding: unset; padding: unset;
list-style: none; list-style: none;
@media (min-width: 768px) { @media (min-width: 768px) {
gap: 2rem; display: flex;
flex-direction: row;
align-items: center;
gap: 2rem;
}
}
nav.mobile-open ul {
display: flex;
margin-top: 1rem;
padding-top: 1rem;
border-top: 1px solid var(--color-header-border);
@media (min-width: 768px) {
margin-top: unset;
padding-top: unset;
border-top: unset;
} }
} }
@@ -74,9 +128,9 @@
} }
a { a {
padding: 0.5rem; padding: 0.5rem;
color: var(--color-text-primary); color: var(--color-text-primary);
text-decoration: none; text-decoration: none;
transition: ease-in-out 0.2s; transition: ease-in-out 0.2s;
&:hover { &:hover {