@@ -12,32 +12,61 @@ const { label, className } = Astro.props;
1212
1313<div
1414 class ={ clsx (
15- " color-gray-200 hover:text-blue-600 dark:hover:text-blue-400 text-sm transition-colors px-2.5 relative inline-block h-full " ,
15+ " color-gray-200 hover:text-blue-600 dark:hover:text-blue-400 text-sm transition-colors px-2.5 relative inline-block" ,
1616 className
1717 )}
1818 data-nav-dropdown
1919>
20- <span class =" flex flex-row items-center gap-1" role =" button" >
20+ <span
21+ class =" flex cursor-pointer flex-row items-center gap-1 select-none"
22+ role =" button"
23+ aria-haspopup =" menu"
24+ aria-expanded =" false"
25+ data-trigger
26+ >
2127 { label }
2228 <Icon name =" icons/heroicons/chevron-down" class =" h-4 w-4 fill-gray-700 dark:fill-gray-300" />
2329 </span >
30+
2431 <ul
25- class =" bg-background-light-10 dark:bg-background-dark-90 pointer-events-none z-100 mt-2 flex flex-col py-1 opacity-0 transition-all md:absolute md:mt-0 md:rounded-lg md:border md:border-gray-200 md:shadow-md md:dark:border-gray-800"
32+ class =" bg-background-light-10 dark:bg-background-dark-90 z-[100] hidden md:absolute md:mt-0 md:min-w-40 md:rounded-lg md:border md:border-gray-200 md:py-1 md:shadow-md md:dark:border-gray-800"
33+ role =" menu"
2634 >
2735 <slot />
2836 </ul >
2937</div >
3038
3139<script >
40+ const mqDesktop = () => window.matchMedia("(min-width: 768px)").matches;
41+
3242 document.querySelectorAll("[data-nav-dropdown]").forEach((el) => {
33- const ul = el.querySelector("ul");
43+ const trigger = el.querySelector("[data-trigger]");
44+ const menu = el.querySelector("ul");
45+
46+ const open = () => {
47+ menu?.classList.remove("hidden");
48+ trigger?.setAttribute?.("aria-expanded", "true");
49+ };
50+ const close = () => {
51+ menu?.classList.add("hidden");
52+ trigger?.setAttribute?.("aria-expanded", "false");
53+ };
54+
3455 el.addEventListener("mouseenter", () => {
35- ul?.classList?.remove("opacity-0", "pointer-events-none");
36- ul?.classList?.add("opacity-100");
56+ if (mqDesktop()) open();
3757 });
3858 el.addEventListener("mouseleave", () => {
39- ul?.classList?.remove("opacity-100");
40- ul?.classList?.add("opacity-0", "pointer-events-none");
59+ if (mqDesktop()) close();
60+ });
61+
62+ trigger?.addEventListener("click", (e) => {
63+ if (!mqDesktop()) {
64+ e.preventDefault();
65+ menu?.classList.toggle("hidden");
66+ trigger?.setAttribute?.("aria-expanded", menu?.classList.contains("hidden") ? "false" : "true");
67+ }
4168 });
69+
70+ close();
4271 });
4372</script >
0 commit comments