From f9ea4b3dbccb47f41a7e05bf3b96e139ef6f9d74 Mon Sep 17 00:00:00 2001 From: eggy Date: Sun, 7 Aug 2022 20:08:44 -0400 Subject: [PATCH] feat: make hamburger extra pretty and functional --- components/HamburgerMenu.vue | 61 +++++++++++++++++++++++++++++++++--- components/Navbar.vue | 11 ++++--- 2 files changed, 63 insertions(+), 9 deletions(-) diff --git a/components/HamburgerMenu.vue b/components/HamburgerMenu.vue index f901f4d..10d14ea 100644 --- a/components/HamburgerMenu.vue +++ b/components/HamburgerMenu.vue @@ -19,9 +19,10 @@ import { navItems } from "@/data/navItems"; /> -
-
  • - {{ item.title }} +
    +
  • + {{ item.title }} +
  • @@ -36,6 +37,8 @@ input.checkbox { input.checkbox ~ .drawer { opacity: 0; + right: 0; + top: 0; position: absolute; transform: scale(0); } @@ -52,15 +55,59 @@ input.checkbox:checked ~ .drawer, * surprisingly annoying */ opacity: 1; - transform: scale(1) translateY(3rem); + transform: scale(1) translate(0.5rem, 3.25rem); } .drawer { transition: transform var(--trans), opacity var(--trans); padding: 1rem; - margin-right: 1rem; + right: 0; background: white; border: 1px solid gray; + display: flex; + flex-direction: column; + align-items: center; + border-radius: 0.5rem; + width: 12rem; +} + +.drawer::before { + content: ""; + width: 0; + height: 0; + position: absolute; + + --tri-size: 0.6rem; + border-left: var(--tri-size) solid transparent; + border-right: var(--tri-size) solid transparent; + border-bottom: var(--tri-size) solid black; + right: 0.75rem; + top: calc(-1 * var(--tri-size)); +} + +.drawer::after { + content: ""; + width: 0; + height: 0; + position: absolute; + + --tri-size: 0.57rem; + border-left: var(--tri-size) solid transparent; + border-right: var(--tri-size) solid transparent; + border-bottom: var(--tri-size) solid white; + right: 0.75rem; + top: calc(-1 * var(--tri-size)); +} + +.drawer li { + list-style: none; + width: 100%; +} + +.drawer li > a { + /* overwrite tailwind */ + text-decoration: none; + width: 100%; } /* hamburger animation */ @@ -79,6 +126,10 @@ input.checkbox:checked ~ .drawer, stroke-width: 5.5; stroke-linecap: round; } + +html.dark .line { + stroke: #fff; +} .ham .top { stroke-dasharray: 40 139; } diff --git a/components/Navbar.vue b/components/Navbar.vue index b8bac13..ef015c2 100644 --- a/components/Navbar.vue +++ b/components/Navbar.vue @@ -26,6 +26,8 @@ nav { width: 100%; border: 1px solid red; padding: 1rem; + /* main stuff is z-index 1 and the hamburger must be above everything else */ + z-index: 2; } ul { @@ -43,24 +45,25 @@ li.home-text { } .hamburger { - transform: scale(0); + width: 0rem; opacity: 0; } * { --trans: 0.2s ease; - transition: opacity var(--trans), transform var(--trans), gap var(--trans); + transition: opacity var(--trans), transform var(--trans), gap var(--trans), + width var(--trans); } @media screen and (max-width: 510px) { .hamburger { display: flex; - transform: none; + width: 3rem; opacity: 1; } li:not(.home-text) { - transform: scale(0); + width: 0; opacity: 0; /* accessibility? screw accessibility * i want my pretty animations