Spaces:
Runtime error
Runtime error
| /* | |
| * Copyright (c) Meta Platforms, Inc. and affiliates. | |
| * | |
| * This source code is licensed under the Chameleon License found in the | |
| * LICENSE file in the root directory of this source tree. | |
| */ | |
| import { ArrowUpRight, Menu, LogoGithub } from "@carbon/icons-react"; | |
| export type NavContent = { | |
| title: string; | |
| description: string; | |
| showHomeLink?: boolean; | |
| githubLink?: string; | |
| navItems: { | |
| id: string; | |
| url?: string; | |
| title: string; | |
| showArrowIcon?: boolean; | |
| }[]; | |
| }; | |
| export type NavProps = { | |
| position?: "fixed" | "absolute" | "relative"; | |
| variant?: string; | |
| content: NavContent; | |
| selected?: string; | |
| logoIconSrc?: string; | |
| basePath?: string; | |
| handleSelect?: (selected: string) => void; | |
| }; | |
| export function BasicNavbar({ | |
| selected = "", | |
| basePath = "/", | |
| position, | |
| content, | |
| logoIconSrc, | |
| }: NavProps) { | |
| const logoWithLink = () => | |
| logoIconSrc ? ( | |
| <div className="flex-shrink-0 hidden md:flex items-center cursor-pointer"> | |
| <a href={basePath}> | |
| <img className="h-10 w-auto" src={logoIconSrc} alt="" /> | |
| </a> | |
| </div> | |
| ) : null; | |
| const desktopMenuItem = (selected: string, id: string) => { | |
| return `p-0 m-3 border-b-[1px] bg-transparent rounded-none hover:bg-transparent hover:border-gray-600 focus:border-0 focus:text-primary active:bg-transparent active:text-gray-800 ${ | |
| selected === id ? "border-primary" : "border-transparent" | |
| }`; | |
| }; | |
| const getItemLink = (item, className = "") => { | |
| const url = item.url ? item.url : `${basePath}${item.id}`; | |
| return ( | |
| <a href={url} className={className}> | |
| {item.title} {item.showArrowIcon && <ArrowUpRight />} | |
| </a> | |
| ); | |
| }; | |
| return ( | |
| <div className={`${position} navbar h-[88px] p-2 md:p-10 z-10 `}> | |
| <div className="navbar-start lg:flex-3 lg:w-1/2 w-full relative"> | |
| <div className="dropdown absolute start-0"> | |
| <label tabIndex={0} className="btn btn-ghost lg:hidden"> | |
| <Menu className="w-6 h-6" /> | |
| </label> | |
| {/* Mobile Menu */} | |
| <ul | |
| tabIndex={0} | |
| className={`menu dropdown-content mt-3 p-4 shadow w-[80vw] bg-base-100`} | |
| > | |
| {content.navItems && | |
| content.navItems.map((item) => | |
| content.showHomeLink || item.id !== "home" ? ( | |
| <li key={item.id} className="font-medium"> | |
| {getItemLink(item, "border-0")} | |
| </li> | |
| ) : null, | |
| )} | |
| {content.githubLink && content.githubLink !== "" && ( | |
| <li> | |
| <a | |
| href={content.githubLink} | |
| className="border-0" | |
| target="_blank" | |
| rel="noreferrer" | |
| > | |
| <LogoGithub className="w-6 h-6" /> | |
| </a> | |
| </li> | |
| )} | |
| </ul> | |
| </div> | |
| <div className="mx-3 flex gap-1 lg:w-auto w-full"> | |
| {logoWithLink()} | |
| <div className="leading-tight text-center w-full lg:text-left lg:w-auto lg:mr-0"> | |
| <div className="lg:text-2xl text-xl font-bold lg:font-bold"> | |
| <a href={basePath} className="border-none"> | |
| {content.title} | |
| </a> | |
| </div> | |
| <div className="text-xs text-gray-600">{content.description}</div> | |
| </div> | |
| </div> | |
| </div> | |
| {/* Desktop menu */} | |
| <div className="navbar-center hidden lg:flex lg:flex-1 lg:flex-grow-6 lg:justify-end "> | |
| <ul className="menu menu-horizontal"> | |
| {content.navItems && | |
| content.navItems.map((item) => | |
| content.showHomeLink || item.id !== "home" ? ( | |
| <li className="font-medium" key={item.id}> | |
| {getItemLink(item, desktopMenuItem(selected, item.id))} | |
| </li> | |
| ) : null, | |
| )} | |
| {content.githubLink && content.githubLink !== "" && ( | |
| <li> | |
| <a | |
| href={content.githubLink} | |
| target="_blank" | |
| rel="noreferrer" | |
| className="no-style rounded-md" | |
| > | |
| <LogoGithub className="w-6 h-6" /> | |
| </a> | |
| </li> | |
| )} | |
| </ul> | |
| </div> | |
| </div> | |
| ); | |
| } | |