Merge pull request #943 from Spiteless/ts.refactor_MobileNav
Refactor MobileNav to use headlessui
This commit is contained in:
		@@ -1,6 +1,7 @@
 | 
			
		||||
'use client'
 | 
			
		||||
 | 
			
		||||
import { useState } from 'react'
 | 
			
		||||
import { Dialog, Transition } from '@headlessui/react'
 | 
			
		||||
import { Fragment, useState } from 'react'
 | 
			
		||||
import Link from './Link'
 | 
			
		||||
import headerNavLinks from '@/data/headerNavLinks'
 | 
			
		||||
 | 
			
		||||
@@ -26,8 +27,7 @@ const MobileNav = () => {
 | 
			
		||||
          xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
          viewBox="0 0 20 20"
 | 
			
		||||
          fill="currentColor"
 | 
			
		||||
          className="h-8 w-8 text-gray-900 hover:text-primary-500 dark:text-gray-100
 | 
			
		||||
          dark:hover:text-primary-400"
 | 
			
		||||
          className="h-8 w-8 text-gray-900 hover:text-primary-500 dark:text-gray-100 dark:hover:text-primary-400"
 | 
			
		||||
        >
 | 
			
		||||
          <path
 | 
			
		||||
            fillRule="evenodd"
 | 
			
		||||
@@ -36,43 +36,72 @@ const MobileNav = () => {
 | 
			
		||||
          />
 | 
			
		||||
        </svg>
 | 
			
		||||
      </button>
 | 
			
		||||
      <div
 | 
			
		||||
        className={`fixed left-0 top-0 z-10 h-full w-full transform bg-white opacity-95 duration-300 ease-in-out dark:bg-gray-950 dark:opacity-[0.98] ${
 | 
			
		||||
          navShow ? 'translate-x-0' : 'translate-x-full'
 | 
			
		||||
        }`}
 | 
			
		||||
      >
 | 
			
		||||
        <div className="flex justify-end">
 | 
			
		||||
          <button className="mr-8 mt-11 h-8 w-8" aria-label="Toggle Menu" onClick={onToggleNav}>
 | 
			
		||||
            <svg
 | 
			
		||||
              xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
              viewBox="0 0 20 20"
 | 
			
		||||
              fill="currentColor"
 | 
			
		||||
              className="text-gray-900 hover:text-primary-500 dark:text-gray-100
 | 
			
		||||
              dark:hover:text-primary-400"
 | 
			
		||||
            >
 | 
			
		||||
              <path
 | 
			
		||||
                fillRule="evenodd"
 | 
			
		||||
                d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
 | 
			
		||||
                clipRule="evenodd"
 | 
			
		||||
              />
 | 
			
		||||
            </svg>
 | 
			
		||||
          </button>
 | 
			
		||||
        </div>
 | 
			
		||||
        <nav className="fixed mt-8 h-full">
 | 
			
		||||
          {headerNavLinks.map((link) => (
 | 
			
		||||
            <div key={link.title} className="px-12 py-4">
 | 
			
		||||
              <Link
 | 
			
		||||
                href={link.href}
 | 
			
		||||
                className="text-2xl font-bold tracking-widest text-gray-900 hover:text-primary-500 dark:text-gray-100
 | 
			
		||||
                dark:hover:text-primary-400"
 | 
			
		||||
                onClick={onToggleNav}
 | 
			
		||||
      <Transition appear show={navShow} as={Fragment}>
 | 
			
		||||
        <Dialog as="div" className="relative z-10" onClose={onToggleNav}>
 | 
			
		||||
          <Transition.Child
 | 
			
		||||
            as={Fragment}
 | 
			
		||||
            enter="ease-out duration-300"
 | 
			
		||||
            enterFrom="opacity-0"
 | 
			
		||||
            enterTo="opacity-100"
 | 
			
		||||
            leave="ease-in duration-200"
 | 
			
		||||
            leaveFrom="opacity-100"
 | 
			
		||||
            leaveTo="opacity-0"
 | 
			
		||||
          >
 | 
			
		||||
            <div className="fixed inset-0 bg-black/25" />
 | 
			
		||||
          </Transition.Child>
 | 
			
		||||
 | 
			
		||||
          <div className="fixed inset-0 overflow-y-auto">
 | 
			
		||||
            <div className="flex min-h-full items-center justify-center p-4 text-center">
 | 
			
		||||
              <Transition.Child
 | 
			
		||||
                as={Fragment}
 | 
			
		||||
                enter="transition ease-in-out duration-300 transform"
 | 
			
		||||
                enterFrom="translate-x-full opacity-0"
 | 
			
		||||
                enterTo="translate-x-0 opacity-95"
 | 
			
		||||
                leave="transition ease-in duration-200 transform"
 | 
			
		||||
                leaveFrom="translate-x-0 opacity-95"
 | 
			
		||||
                leaveTo="translate-x-full opacity-0"
 | 
			
		||||
              >
 | 
			
		||||
                {link.title}
 | 
			
		||||
              </Link>
 | 
			
		||||
                <Dialog.Panel className="fixed left-0 top-0 z-10 h-full w-full bg-white opacity-95 duration-300 dark:bg-gray-950 dark:opacity-[0.98]">
 | 
			
		||||
                  <nav className="fixed mt-8 h-full text-left">
 | 
			
		||||
                    {headerNavLinks.map((link) => (
 | 
			
		||||
                      <div key={link.title} className="px-12 py-4">
 | 
			
		||||
                        <Link
 | 
			
		||||
                          href={link.href}
 | 
			
		||||
                          className="text-2xl font-bold tracking-widest text-gray-900 hover:text-primary-500 dark:text-gray-100 dark:hover:text-primary-400"
 | 
			
		||||
                          onClick={onToggleNav}
 | 
			
		||||
                        >
 | 
			
		||||
                          {link.title}
 | 
			
		||||
                        </Link>
 | 
			
		||||
                      </div>
 | 
			
		||||
                    ))}
 | 
			
		||||
                  </nav>
 | 
			
		||||
 | 
			
		||||
                  <div className="flex justify-end">
 | 
			
		||||
                    <button
 | 
			
		||||
                      className="mr-8 mt-11 h-8 w-8"
 | 
			
		||||
                      aria-label="Toggle Menu"
 | 
			
		||||
                      onClick={onToggleNav}
 | 
			
		||||
                    >
 | 
			
		||||
                      <svg
 | 
			
		||||
                        xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
                        viewBox="0 0 20 20"
 | 
			
		||||
                        fill="currentColor"
 | 
			
		||||
                        className="text-gray-900 hover:text-primary-500 dark:text-gray-100 dark:hover:text-primary-400"
 | 
			
		||||
                      >
 | 
			
		||||
                        <path
 | 
			
		||||
                          fillRule="evenodd"
 | 
			
		||||
                          d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
 | 
			
		||||
                          clipRule="evenodd"
 | 
			
		||||
                        />
 | 
			
		||||
                      </svg>
 | 
			
		||||
                    </button>
 | 
			
		||||
                  </div>
 | 
			
		||||
                </Dialog.Panel>
 | 
			
		||||
              </Transition.Child>
 | 
			
		||||
            </div>
 | 
			
		||||
          ))}
 | 
			
		||||
        </nav>
 | 
			
		||||
      </div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </Dialog>
 | 
			
		||||
      </Transition>
 | 
			
		||||
    </>
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user