feat: update mobile header styles and behavior
This commit is contained in:
@@ -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,45 +48,54 @@
|
|||||||
|
|
||||||
<style>
|
<style>
|
||||||
header {
|
header {
|
||||||
position: fixed;
|
|
||||||
inset-inline: 0;
|
|
||||||
bottom: 2rem;
|
|
||||||
z-index: var(--z-index-header);
|
|
||||||
|
|
||||||
width: fit-content;
|
|
||||||
padding: 1rem;
|
|
||||||
margin-inline: auto;
|
|
||||||
|
|
||||||
border: 1px solid var(--color-header-border);
|
|
||||||
border-radius: 0.5rem;
|
|
||||||
|
|
||||||
font-size: 0.75rem;
|
|
||||||
font-weight: bold;
|
|
||||||
|
|
||||||
background-color: var(--color-header-background);
|
|
||||||
backdrop-filter: blur(1rem);
|
|
||||||
|
|
||||||
|
|
||||||
@media (min-width: 768px) {
|
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top: 0;
|
top: 0;
|
||||||
bottom: unset;
|
bottom: unset;
|
||||||
|
inset-inline: 0;
|
||||||
|
z-index: var(--z-index-header);
|
||||||
|
|
||||||
width: auto;
|
width: auto;
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
|
|
||||||
border: unset;
|
|
||||||
border-bottom: 1px solid var(--color-header-border);
|
border-bottom: 1px solid var(--color-header-border);
|
||||||
border-radius: unset;
|
border-radius: unset;
|
||||||
|
|
||||||
font-size: 1.125rem;
|
font-size: 1.125rem;
|
||||||
|
font-weight: bold;
|
||||||
|
|
||||||
|
background-color: var(--color-header-background);
|
||||||
|
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) {
|
||||||
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
@@ -65,10 +103,26 @@
|
|||||||
list-style: none;
|
list-style: none;
|
||||||
|
|
||||||
@media (min-width: 768px) {
|
@media (min-width: 768px) {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
gap: 2rem;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
li {
|
li {
|
||||||
display: contents;
|
display: contents;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user