Spaces:
Runtime error
Runtime error
| import { Transition } from "@headlessui/react"; | |
| import clsx from "clsx"; | |
| import type { ReactNode } from "react"; | |
| import { Fragment } from "react"; | |
| import { FaBars } from "react-icons/fa"; | |
| export type DisplayProps = { | |
| show: boolean; | |
| setShow: (boolean: boolean) => void; | |
| }; | |
| export type SidebarProps = DisplayProps & { | |
| children: ReactNode; | |
| side: "left" | "right"; | |
| className?: string; | |
| }; | |
| const Sidebar = ({ show, children, side, className }: SidebarProps) => { | |
| return ( | |
| <SidebarTransition show={show} side={side}> | |
| <nav | |
| className={clsx( | |
| "flex flex-1 flex-col overflow-x-hidden bg-slate-3 p-4 ring-1 ring-white/10", | |
| className | |
| )} | |
| > | |
| {children} | |
| </nav> | |
| </SidebarTransition> | |
| ); | |
| }; | |
| type SidebarTransitionProps = { | |
| side: "left" | "right"; | |
| children: ReactNode; | |
| show: boolean; | |
| className?: string; | |
| }; | |
| export const SidebarTransition = ({ children, show, side, className }: SidebarTransitionProps) => { | |
| return ( | |
| <Transition.Root show={show} as={Fragment}> | |
| <div className="relative z-30"> | |
| <Transition.Child | |
| as={Fragment} | |
| enter="transition-opacity ease-linear duration-300" | |
| enterFrom="opacity-0" | |
| enterTo="opacity-100" | |
| leave="transition-opacity ease-linear duration-300" | |
| leaveFrom="opacity-100" | |
| leaveTo="opacity-0" | |
| > | |
| <div className="fixed inset-0 bg-neutral-900/80 lg:hidden" /> | |
| </Transition.Child> | |
| <div className={`fixed ${side}-0 flex`}> | |
| <Transition.Child | |
| as={Fragment} | |
| enter="transition ease-in-out duration-300 transform" | |
| enterFrom={side === "left" ? "-translate-x-full" : "translate-x-full"} | |
| enterTo="translate-x-0" | |
| leave="transition ease-in-out duration-300 transform" | |
| leaveFrom="translate-x-0" | |
| leaveTo={side === "left" ? "-translate-x-full" : "translate-x-full"} | |
| > | |
| <div | |
| className={clsx("flex max-w-xs flex-1", className || "h-screen max-h-screen w-64")} | |
| > | |
| {children} | |
| </div> | |
| </Transition.Child> | |
| </div> | |
| </div> | |
| </Transition.Root> | |
| ); | |
| }; | |
| export const SidebarControlButton = ({ | |
| show, | |
| setShow, | |
| side, | |
| }: DisplayProps & { side: "left" | "right" }) => { | |
| return ( | |
| <button | |
| className={clsx( | |
| "fixed z-20 m-1 rounded-md bg-slate-1 shadow-depth-1 transition-all sm:m-2", | |
| side === "right" && "right-0" | |
| )} | |
| onClick={() => setShow(!show)} | |
| > | |
| <FaBars size="12" className="z-20 m-2 text-slate-11" /> | |
| </button> | |
| ); | |
| }; | |
| export default Sidebar; | |