add mobile nav

This commit is contained in:
Enrico Bühler 2024-07-01 21:49:17 +02:00
parent ff6b723b11
commit 84dde04352
3 changed files with 128 additions and 65 deletions

View File

@ -38,9 +38,14 @@ export interface Props
extends HTMLAttributes<"button">,
VariantProps<typeof button> {}
const { variant = "default", size = "default", ...props } = Astro.props;
const {
variant = "default",
size = "default",
class: className,
...props
} = Astro.props;
---
<button {...props} class={button({ variant, size })}>
<button {...props} class={button({ variant, size, class: className })}>
<slot />
</button>

View File

@ -1,8 +1,13 @@
---
import { button } from "../Button.astro";
import Button, { button } from "../Button.astro";
import { Menu } from "lucide-astro";
---
<header id="header" class="fixed top-0 w-full h-[100px] z-50 bg-neutral-accent">
<header id="header" class="fixed top-0 w-full h-[100px] z-50">
<div
class="bg-neutral-accent/90 w-full h-full absolute -z-20 backdrop-blur-lg"
>
</div>
<div
class="flex flex-row justify-between h-full w-full max-w-section m-auto p-main"
>
@ -11,11 +16,39 @@ import { button } from "../Button.astro";
<h2 class="text-3xl font-extrabold">vspace.one</h2>
</a>
</div>
<div class="flex flex-row gap-2 items-center">
<Button variant="default" class="lg:hidden" id="nav-button">
<Menu />
</Button>
<div
id="nav-mobile"
class="animate-in slide-in-from-top-10 ease-out-quart duration-1000 absolute top-[100px] w-full
bg-neutral p-main left-0 hidden flex flex-col gap-3 -z-30"
>
<a class={button({ variant: "secondary", size: "lg" })} href="/#location"
>Standort</a
>
<a class={button({ variant: "secondary", size: "lg" })} href="/faq">FAQ</a
<a
class={button({
variant: "secondary",
size: "lg",
})}
href="/faq">FAQ</a
>
<a class={button({ variant: "primary", size: "lg" })} href="/support"
>Unterstütze uns!</a
>
</div>
<div class="flex flex-row gap-2 items-center max-lg:hidden">
<a class={button({ variant: "secondary", size: "lg" })} href="/#location"
>Standort</a
>
<a
class={button({
variant: "secondary",
size: "lg",
class: "max-md:hidden",
})}
href="/faq">FAQ</a
>
<a class={button({ variant: "primary", size: "lg" })} href="/support"
>Unterstütze uns!</a
@ -23,3 +56,34 @@ import { button } from "../Button.astro";
</div>
</div>
</header>
<script>
import { animate, spring, stagger } from "motion";
const button = document.getElementById("nav-button")!;
const navMobile = document.getElementById("nav-mobile")!;
const navButtons = navMobile.children;
button.addEventListener("click", () => {
if (navMobile.classList.contains("hidden")) {
animate(
navButtons as unknown as NodeListOf<any>,
{
y: [-30, 0],
scale: [0.8, 1],
opacity: [0, 1],
},
{
easing: spring({
stiffness: 200,
damping: 20,
mass: 1,
}),
delay: stagger(0.1),
},
);
}
navMobile.classList.toggle("hidden");
});
</script>

View File

@ -9,10 +9,11 @@ import "pannellum/build/pannellum.css";
<div
id="landing-heading-container"
style="opacity: 0;"
class="flex flex-col justify-center items-center gap-2 backdrop-blur-2xl p-card rounded-card ring ring-primary/20"
class="flex flex-col justify-center items-center gap-2 backdrop-blur-2xl p-card rounded-card ring ring-primary/20
max-md:w-[90vw]"
>
<!--h1>vspace.one</h1-->
<h2 class="text-4xl">Ein Makerspace und Hackerspace</h2>
<h2 class="text-4xl text-center">Ein Makerspace und Hackerspace</h2>
<p>
<a class="text-xl" href="/tour">Hier gehts zur virtuellen Space-Tour!</a
>
@ -20,7 +21,7 @@ import "pannellum/build/pannellum.css";
</div>
</div>
<div class="w-full h-full">
<div class="w-full h-full" id="pano-bg"></div>
<div style="opacity: 0;" class="w-full h-full" id="pano-bg"></div>
<!--little-planet
width="2400"
height="900"
@ -36,68 +37,61 @@ import "pannellum/build/pannellum.css";
import { animate } from "motion";
import { ease } from "@unom/style";
const viewer = pannellum.viewer("pano-bg", {
panorama: "/pic/panorama/maschinenraum_half.jpg",
autoLoad: true,
showControls: false,
});
const init = () => {
const panoBg = document.getElementById("pano-bg")!;
viewer.setYaw(90, true);
const animateEntry = () => {
let scene: any = document.querySelector("little-planet.anim")!;
const landingHeadingContainer = document.querySelector(
"#landing-heading-container",
)!;
console.log(scene.children);
scene.addEventListener("load", () => {
animate(
scene,
{ scale: [0.9, 1], opacity: [0, 1] },
{
...ease.quint!(1.5).out,
},
);
animate(
landingHeadingContainer,
{ scale: [0.4, 1], opacity: [0, 1] },
{
...ease.quint!(1.4, 0.2).out,
},
);
animate(
(progress) => {
scene.camera = {
lon: -180 + ((progress * 270) % 360),
lat: progress * 10,
fov: 20 + 50 * progress,
};
},
{
...ease.quint!(4).inOut,
},
);
/** spring({
stiffness: 10,
damping: 40,
mass: 2,
restSpeed: 0.01,
restDistance: 0.001,
}) */
const viewer = pannellum.viewer(panoBg, {
panorama: "/pic/panorama/maschinenraum_half.jpg",
autoLoad: true,
showControls: false,
});
viewer.setYaw(90, false);
const animateEntry = () => {
const landingHeadingContainer = document.querySelector(
"#landing-heading-container",
)!;
viewer.on("load", () => {
console.log("loaded");
animate(
panoBg,
{ scale: [0.9, 1], opacity: [0, 1] },
{
...ease.quint!(1.5).out,
},
);
animate(
landingHeadingContainer,
{ scale: [0.4, 1], opacity: [0, 1] },
{
...ease.quint!(1.4, 0.2).out,
},
);
animate(
(progress) => {
viewer.setPitch(progress * 10, false);
viewer.setYaw(160 + ((progress * 270) % 360), false);
viewer.setHfov(50 + progress * 50, false);
},
{
...ease.quint!(4).inOut,
},
);
});
};
animateEntry();
};
animateEntry();
init();
document.addEventListener("astro:after-swap", () => {
animateEntry();
init();
});
</script>
<script is:inline type="module" src="https://unpkg.com/little-planet@0.5"
></script>
</div>