mirror of
https://github.com/nextui-org/nextui.git
synced 2025-12-08 19:26:11 +00:00
* chore(root): reat-aria packages updated (#2889) * chore(storybook): common colors enabled (#2902) * fix(range-calendar): hide only dates outside the month (#2906) * fix(range-calendar): hide only dates outside the month #2890 * fix(range-calendar): corrected spelling mistake in changeset description * fix(range-calendar): corrected capitalization in changeset description * chore(changeset): patch @nextui-org/theme --------- Co-authored-by: shrinidhi.upadhyaya <shrinidhi.upadhyaya@stud.uni-bamberg.de> Co-authored-by: աɨռɢӄաօռɢ <wingkwong.code@gmail.com> * fix(date-picker): keep date picker style consistent for different variants (#2908) * fix: add missing TableRowProps export (#2866) * fix: add missing TableRowProps export * feat(changeset): add changeset for PR2866 * chore(changeset): revise changeset message --------- Co-authored-by: աɨռɢӄաօռɢ <wingkwong.code@gmail.com> * fix(input): correct label margin for RTL required inputs (#2781) * fix(input): correct label margin for RTL required inputs * fix(theme): add changeset fr theme * docs(core): add storybook and canary release info (#2914) * Cn utility refactor (#2915) * refactor(core): cn utility adjusted and moved to the theme package * chore(root): changeset * fix(storybook): stories that used cn * docs(date-picker): change to jsx instead (#2919) * fix(switch): support uncontrolled switch in react-hook-form (#2924) * feat(switch): add @nextui-org/use-safe-layout-effect * chore(deps): add @nextui-org/use-safe-layout-effect * fix(switch): react-hook-form uncontrolled switch component * fix(switch): react-hook-form uncontrolled switch component * feat(switch): add rect-hook-form in dev dep * feat(switch): add WithReactHookFormTemplate * refactor(root): react aria packages fixed (#2944) * feat(docs): docs changes (#2868) * feat(docs): add example how to set locale (#2867) * docs(guide): add an explanation for the installation guide (#2769) * docs(guide): add an explanation for the installation guide * docs(guide): add an explanation for the cli guide * docs(guide): add support for cli output * fix: change sort priority - cmdk (#2873) * docs: remove unsupported props in range calendar and date range picker (#2881) * chore(calendar): remove showMonthAndYearPickers from range calendar story * docs(date-range-picker): remove showMonthAndYearPickers info * docs(range-calendar): remove unsupported props * docs: refactor typing in form.ts (#2882) * chore(docs): supplement errorMessage behaviour in input (#2892) * refactor(docs): revise NextUI Provider structure * chore(docs): add updated tag --------- Co-authored-by: Nozomi-Hijikata <116155762+Nozomi-Hijikata@users.noreply.github.com> Co-authored-by: HaRuki <soccer_haruki15@me.com> Co-authored-by: Kaben <carnoxen@gmail.com> * fix(slider): missing marks when hideThumb is true & revise slider styles (#2883) * chore(slider): include marks in hideThumb * fix(slider): revise slider styles * feat(changeset): add changeset * feat(slider): add tests with marks and hideThumb * feat(test): react hook form tests & stories (#2931) * feat(input): add Input with React Hook Form tests * refactor(input): add missing types * feat(checkbox): add checkbox with React Hook Form tests * feat(select): add react-hook-form to dev dep * feat(select): add react hook form story * feat(select): react hook form tests * fix(select): incorrect button reference * feat(deps): add react-hook-form to dev dep in autocomplete * feat(autocomplete): react hook form story * feat(autocomplete): react hook form tests * fix(autocomplete): rollback wrapper type * feat(switch): add react hook form tests * refactor(stories): reorder stories items * fix: update accordion item heading tag to be customizable (#2265) * fix: update accordion item heading tag to be customizable * Update .changeset/heavy-hairs-join.md Co-authored-by: Junior Garcia <jrgarciadev@gmail.com> * Update .changeset/heavy-hairs-join.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * chore(accordion): lint * chore(changeset): add issue number * feat(docs): add HeadingComponent prop --------- Co-authored-by: Shawn Dong <shawn.dong@flybuys.com.au> Co-authored-by: Junior Garcia <jrgarciadev@gmail.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: աɨռɢӄաօռɢ <wingkwong.code@gmail.com> * fix(theme): add pointer-events-none to skeleton base (#2972) * feat(tabs): add `destroyInactiveTabPanel` prop for Tabs component (#2973) * feat(tabs): add destroyInactiveTabPanel and set default to false * feat(tabs): integrate with destroyInactiveTabPanel * feat(theme): hidden inert tab panel * feat(changeset): add changeset * chore(changeset): add issue number * feat(docs): add `destroyInactiveTabPanel` prop to tabs page * chore(docs): set destroyInactiveTabPanel to true by default * chore(tabs): set destroyInactiveTabPanel to true by default * chore(tabs): revise destroyInactiveTabPanel logic * feat(tabs): add tests for destroyInactiveTabPanel * chore(tabs): change the default value of destroyInactiveTabPanel to true * refactor: add support for disabling the animation globally (#2929) * refactor: add support for disabling the animation globally * chore(docs): disableAnimation removed from global provider * feat(docs): nextui provider api updated, storybook preview adjusted * chore(theme): button is scalable when disabled, tooltip animation improved * fix(theme): remove origin-bottom from button (#2990) * fix(skeleton): overflow issue in skeleton (#2986) * fix(theme): set overflow visible after skeleton loaded * feat(changeset): add changeset * fix(table): v2 input/textarea don't allow spaces inside a table (#3020) * fix(table): set onKeyDownCapture to undefined * feat(changeset): add changeset * fix(slider): calculate the correct value on mark click (#3017) * fix(slider): calculate the correct value on mark click * refactor(slider): remove the tests inside describe block * feat(slider): add tests for thumb move on mark click * refactor(slider): use val instead of pos * fix(theme): revise input isInvalid styles (#3010) * fix(theme): revise isInvalid input styles * feat(changeset): add changeset * feat(date-picker): add missing ref to input wrapper (#3011) * fix(date-picker): add missing ref to input wrapper * feat(changeset): add changeset * fix(core): incorrect tailwind classnames (#3018) * fix(dropdown): focus behaviour on press / enter keydown (#2970) * fix(dropdown): set focus on the first item * feat(dropdown): add keyboard interactions tests * feat(changeset): add changeset * fix(dropdown): use fireEvent.keyDown instead * chore(deps): add @nextui-org/test-utils to dropdown * refactor(dropdown): pass onKeyDown to menu trigger and don't hardcode autoFocus * chore(dropdown): remove autoFocus * fix(menu): pass userMenuProps to useTreeState and useAriaMenu and remove from getListProps * chore(changeset): add menu package * fix(component): update type definition to prevent primitive values as items (#2953) * fix: update type definition to prevent primitive values as items * fix: typecheck * fix(select): onSelectionChange can handle number (#2937) * fix: onSelectionChange type for dynamic items in Select component * docs: remove unnecessary properties * docs: update highlightedLines * chore: add changeset * fix(calendar): scrolling is hidden when changing the month (#2949) * fix(calendar): scrolling is hidden when changing the month * chore(changeset): correct package name --------- Co-authored-by: Poli Sour <polisour.work@gmail.com> Co-authored-by: WK Wong <wingkwong.code@gmail.com> * fix: make VisuallyHidden's element type as span when it's inside phrasing element (#3013) * fix(checkbox): make VisuallyHidden's element type as span * feat(changeset): add changeset * fix(radio): make the VisuallyHidden element type as span * fix(switch): make the VisuallyHidden element type as span * fix(select): make the VisuallyHidden element type as span * feat(changeset): replace changeset * chore: fix formatting * docs: sync nextui-cli api (#3035) * docs: sync nextui-cli api * docs: update * chore: update routes.json with new path and set updated flag --------- Co-authored-by: Junior Garcia <jrgarciadev@gmail.com> * feat: switch default validationBehavior to aria and allow switching via props (#2987) * chore: add support validationBehavior aria * chore: add validationBehavior to Provider * chore: add autocomplete validation test * chore: add checkbox validation test * fix(input): require condition * docs: add description of validationBehavior props * chore: add support validationBehavior props for date components * docs(dates): add description of validationBehavior props * chore: add changeset * chore: format * chore: fix test * fix: select validationBehavior is not support yet * fix: select validationBehavior not supported yet * chore(docs): validation behavior prop added to nextui-provider --------- Co-authored-by: Junior Garcia <jrgarciadev@gmail.com> * fix: popover-based focus behaviour (#2854) * fix(autocomplete): autocomplete focus behaviour * feat(autocomplete): add test case for catching blur cases * refactor(autocomplete): use isOpen instead * feat(autocomplete): add "should focus when clicking autocomplete" test case * feat(autocomplete): add should set the input after selection * fix(autocomplete): remove shouldUseVirtualFocus * fix(autocomplete): uncomment blur logic * refactor(autocomplete): remove state as it is in getPopoverProps * refactor(autocomplete): remove unnecessary blur * refactor(select): remove unncessary props * fix(popover): use domRef instead * fix(popover): revise isNonModal and isDismissable * fix(popover): use dialogRef back * fix(popover): rollback * fix(autocomplete): onFocus logic * feat(popover): set disableFocusManagement to overlay * feat(modal): set disableFocusManagement to overlay * fix(autocomplete): set disableFocusManagement for autocomplete * feat(popover): include disableFocusManagement prop * refactor(autocomplete): revise type in selectorButton * fix(autocomplete): revise focus logic * feat(autocomplete): add internal focus state and add shouldCloseOnInteractOutside * feat(autocomplete): handle selectedItem change * feat(autocomplete): add clear button test * feat(changeset): add changeset * refactor(components): use the original order * refactor(autocomplete): add more comments * fix(autocomplete): revise focus behaviours * refactor(autocomplete): rename to listbox * chore(popover): remove disableFocusManagement from popover * chore(autocomplete): remove disableFocusManagement from autocomplete * chore(changeset): add issue number * fix(popover): don't set default value to transformOrigin * fix(autocomplete): revise shouldCloseOnInteractOutside logic * feat(autocomplete): should close listbox by clicking another autocomplete * fix(popover): add disableFocusManagement to overlay * refactor(autocomplete): revise comments and refactor shouldCloseOnInteractOutside * feat(changeset): add issue number * fix(autocomplete): merge with selectorButtonProps.onClick * refactor(autocomplete): remove extra line * refactor(autocomplete): revise comment * feat(select): add shouldCloseOnInteractOutside * feat(dropdown): add shouldCloseOnInteractOutside * feat(date-picker): add shouldCloseOnInteractOutside * feat(changeset): add dropdown and date-picker * fix(popover): revise shouldCloseOnInteractOutside * feat(date-picker): integrate with ariaShouldCloseOnInteractOutside * feat(select): integrate with ariaShouldCloseOnInteractOutside * feat(dropdown): integrate with ariaShouldCloseOnInteractOutside * feat(popover): integrate with ariaShouldCloseOnInteractOutside * feat(aria-utils): ariaShouldCloseOnInteractOutside * chore(deps): update pnpm-lock.yaml * feat(autocomplete): integrate with ariaShouldCloseOnInteractOutside * feat(aria-utils): handle setShouldFocus logic * feat(changeset): add @nextui-org/aria-utils * chore(autocomplete): put the test into correct group * feat(select): should close listbox by clicking another select * feat(dropdown): should close listbox by clicking another dropdown * feat(popover): should close listbox by clicking another popover * feat(date-picker): should close listbox by clicking another datepicker * chore(changeset): add issue numbers and revise changeset message * refactor(autocomplete): change to useRef instead * refactor(autocomplete): change to useRef instead * refactor(aria-utils): revise comments and format code * chore(changeset): add issue number * chore: take popoverProps.shouldCloseOnInteractOutside first * refactor(autocomplete): remove unnecessary logic * refactor(autocomplete): focus management logic * fix(components): Fix 'Tap to click' behavior on macOS with Edge/Chrome for Accordion and Tab (#2725) * fix(components): fix 'Tap to click' behavior on macOS * Add change file for accordion, menu, and tabs * Remove 'fix(components)' from the .changeset file * fix(components): undo dropdown change now that it's no longer applicable * fix(components): update changeset file now that we are no longer modifying the dropdown component * fix(date-picker): corrected inert value for true condition (#3054) * fix(date-picker): corrected inert value for true condition #3044 * refactor(calendar): add todo comment * feat(changeset): add changeset --------- Co-authored-by: shrinidhi.upadhyaya <shrinidhi.upadhyaya@stud.uni-bamberg.de> Co-authored-by: WK Wong <wingkwong.code@gmail.com> * fix(hooks): resolve type error in onKeyDown event handler (#3064) * fix(hooks): resolve type error in onKeyDown event handler * chore(changeset): revise changeset --------- Co-authored-by: WK Wong <wingkwong.code@gmail.com> * Update dependency array on setPage useCallback hook (#3029) Changes: Add the onChangeActivePage function to the dependency array of the setPage useCallback hook to ensure it always reflects the latest state. Impact: This fix ensures that the pagination component accurately reflects the current state when triggering onChangeActivePage. * fix: error peerDep in pkg (#3014) * fix: error peerDep in pkg * docs: changeset * Fix DatePicker Time Input (#2845) * fix(date-picker): set `isCalendarHeaderExpanded` to `false` when DatePicker is closed * fix(date-picker): calendar header controlled state on DatePicker * chore(date-picker): update test * chore(date-picker): remove unnecessary `async` in test * Update packages/components/date-picker/__tests__/date-picker.test.tsx --------- Co-authored-by: WK Wong <wingkwong.code@gmail.com> Co-authored-by: Junior Garcia <jrgarciadev@gmail.com> * fix(date-picker): test * fix(hooks): optimize useScrollPosition with useCallback and useRef (#3049) * fix(hooks): optimize useScrollPosition with useCallback and useRef * Update .changeset/lucky-cobras-jog.md * Update packages/hooks/use-scroll-position/src/index.ts * Update packages/hooks/use-scroll-position/src/index.ts --------- Co-authored-by: Junior Garcia <jrgarciadev@gmail.com> * fix(select): placeholder text display for controlled component (#3081) * fix: return placeholder when selectedItems is empty * chore: add test and changeset * chore(docs): v2.4.0 (#3084) * chore(docs): v2.4.0 * chore(docs): v2.4.0 blog * chore(docs): revise typos based on coderabbitai * chore(docs): adjust navbar --------- Co-authored-by: WK Wong <wingkwong.code@gmail.com> * chore(changese): update @nextui-org/react dependency to minor version * docs: update cli docs (#3096) * ci(changesets): version packages (#2903) Co-authored-by: Junior Garcia <jrgarciadev@gmail.com> --------- Co-authored-by: Shrinidhi Upadhyaya <shrinidhiupadhyaya1195@gmail.com> Co-authored-by: shrinidhi.upadhyaya <shrinidhi.upadhyaya@stud.uni-bamberg.de> Co-authored-by: աɨռɢӄաօռɢ <wingkwong.code@gmail.com> Co-authored-by: Paul Tiedtke <PaulTiedtke@web.de> Co-authored-by: Mohammad Reza Badri <85818966+mrbadri@users.noreply.github.com> Co-authored-by: Nozomi-Hijikata <116155762+Nozomi-Hijikata@users.noreply.github.com> Co-authored-by: HaRuki <soccer_haruki15@me.com> Co-authored-by: Kaben <carnoxen@gmail.com> Co-authored-by: Shawn Dong <dsknight@live.com.au> Co-authored-by: Shawn Dong <shawn.dong@flybuys.com.au> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: Ryo Matsukawa <76232929+ryo-manba@users.noreply.github.com> Co-authored-by: Poli Sour <57824881+novsource@users.noreply.github.com> Co-authored-by: Poli Sour <polisour.work@gmail.com> Co-authored-by: Artem Pitikin <git@kosmotema.dev> Co-authored-by: winches <329487092@qq.com> Co-authored-by: Eric Abreu <ericfabreu@gmail.com> Co-authored-by: Minsu <52266597+Gaic4o@users.noreply.github.com> Co-authored-by: Jesus Perdomo Lampignano <38929969+jesuzon@users.noreply.github.com> Co-authored-by: chirokas <157580465+chirokas@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
389 lines
13 KiB
TypeScript
389 lines
13 KiB
TypeScript
"use client";
|
|
|
|
import {useRef, useState, FC, ReactNode, Key} from "react";
|
|
import {
|
|
link,
|
|
Navbar as NextUINavbar,
|
|
NavbarContent,
|
|
NavbarMenu,
|
|
NavbarMenuToggle,
|
|
NavbarBrand,
|
|
NavbarItem,
|
|
Link,
|
|
Button,
|
|
Kbd,
|
|
Dropdown,
|
|
DropdownMenu,
|
|
DropdownItem,
|
|
DropdownTrigger,
|
|
Chip,
|
|
} from "@nextui-org/react";
|
|
import {dataFocusVisibleClasses} from "@nextui-org/theme";
|
|
import {ChevronDownIcon, LinkIcon} from "@nextui-org/shared-icons";
|
|
import {isAppleDevice} from "@react-aria/utils";
|
|
import {clsx} from "@nextui-org/shared-utils";
|
|
import NextLink from "next/link";
|
|
import {usePathname} from "next/navigation";
|
|
import {includes} from "lodash";
|
|
import {motion, AnimatePresence} from "framer-motion";
|
|
import {useEffect} from "react";
|
|
import {usePress} from "@react-aria/interactions";
|
|
import {useFocusRing} from "@react-aria/focus";
|
|
|
|
import {currentVersion} from "@/utils/version";
|
|
import {siteConfig} from "@/config/site";
|
|
import {Route} from "@/libs/docs/page";
|
|
import {LargeLogo, SmallLogo, ThemeSwitch} from "@/components";
|
|
import {TwitterIcon, GithubIcon, DiscordIcon, SearchLinearIcon} from "@/components/icons";
|
|
import {useIsMounted} from "@/hooks/use-is-mounted";
|
|
import {DocsSidebar} from "@/components/docs/sidebar";
|
|
import {useCmdkStore} from "@/components/cmdk";
|
|
import {FbRoadmapLink} from "@/components/featurebase/fb-roadmap-link";
|
|
import {trackEvent} from "@/utils/va";
|
|
|
|
export interface NavbarProps {
|
|
routes: Route[];
|
|
mobileRoutes?: Route[];
|
|
tag?: string;
|
|
slug?: string;
|
|
children?: ReactNode;
|
|
}
|
|
|
|
export const Navbar: FC<NavbarProps> = ({children, routes, mobileRoutes = [], slug, tag}) => {
|
|
const [isMenuOpen, setIsMenuOpen] = useState<boolean | undefined>(false);
|
|
const [commandKey, setCommandKey] = useState<"ctrl" | "command">("command");
|
|
|
|
const ref = useRef<HTMLElement>(null);
|
|
const isMounted = useIsMounted();
|
|
|
|
const pathname = usePathname();
|
|
|
|
const cmdkStore = useCmdkStore();
|
|
|
|
useEffect(() => {
|
|
if (isMenuOpen) {
|
|
setIsMenuOpen(false);
|
|
}
|
|
}, [pathname]);
|
|
|
|
useEffect(() => {
|
|
setCommandKey(isAppleDevice() ? "command" : "ctrl");
|
|
}, []);
|
|
|
|
const handleOpenCmdk = () => {
|
|
cmdkStore.onOpen();
|
|
trackEvent("Navbar - Search", {
|
|
name: "navbar - search",
|
|
action: "press",
|
|
category: "cmdk",
|
|
});
|
|
};
|
|
|
|
const {pressProps} = usePress({
|
|
onPress: handleOpenCmdk,
|
|
});
|
|
const {focusProps, isFocusVisible} = useFocusRing();
|
|
|
|
const docsPaths = [
|
|
"/docs/guide/introduction",
|
|
"/docs/guide/installation",
|
|
"/docs/guide/upgrade-to-v2",
|
|
];
|
|
|
|
const searchButton = (
|
|
<Button
|
|
aria-label="Quick search"
|
|
className="text-sm font-normal text-default-500 bg-default-400/20 dark:bg-default-500/20"
|
|
endContent={
|
|
<Kbd className="hidden py-0.5 px-2 lg:inline-block" keys={commandKey}>
|
|
K
|
|
</Kbd>
|
|
}
|
|
startContent={
|
|
<SearchLinearIcon
|
|
className="text-base text-default-400 pointer-events-none flex-shrink-0"
|
|
size={18}
|
|
strokeWidth={2}
|
|
/>
|
|
}
|
|
onPress={handleOpenCmdk}
|
|
>
|
|
Quick Search...
|
|
</Button>
|
|
);
|
|
|
|
if (pathname.includes("/examples")) {
|
|
return null;
|
|
}
|
|
|
|
const navLinkClasses = clsx(link({color: "foreground"}), "data-[active=true]:text-primary");
|
|
|
|
const handleVersionChange = (key: Key) => {
|
|
if (key === "v1") {
|
|
const newWindow = window.open("https://v1.nextui.org", "_blank", "noopener,noreferrer");
|
|
|
|
if (newWindow) newWindow.opener = null;
|
|
}
|
|
};
|
|
|
|
const handlePressNavbarItem = (name: string, url: string) => {
|
|
trackEvent("NavbarItem", {
|
|
name,
|
|
action: "press",
|
|
category: "navbar",
|
|
data: url,
|
|
});
|
|
};
|
|
|
|
return (
|
|
<NextUINavbar
|
|
ref={ref}
|
|
className={clsx({
|
|
"z-[100001]": isMenuOpen,
|
|
})}
|
|
isMenuOpen={isMenuOpen}
|
|
maxWidth="xl"
|
|
position="sticky"
|
|
onMenuOpenChange={setIsMenuOpen}
|
|
>
|
|
<NavbarContent className="basis-1/5 sm:basis-full" justify="start">
|
|
<NavbarBrand as="li" className="gap-3 max-w-fit">
|
|
<NextLink
|
|
aria-label="Home"
|
|
className="flex justify-start items-center gap-2 tap-highlight-transparent transition-opacity active:opacity-50"
|
|
href="/"
|
|
onClick={() => handlePressNavbarItem("Home", "/")}
|
|
>
|
|
<SmallLogo className="w-6 h-6 md:hidden" />
|
|
<LargeLogo className="h-5 md:h-6" />
|
|
</NextLink>
|
|
{ref.current ? (
|
|
<Dropdown placement="bottom-start" portalContainer={ref.current}>
|
|
<AnimatePresence>
|
|
{isMounted && (
|
|
<motion.div animate={{opacity: 1}} exit={{opacity: 0}} initial={{opacity: 0}}>
|
|
<DropdownTrigger>
|
|
<Button
|
|
className="hidden text-xs h-6 w-[74px] py-1 min-w-fit sm:flex gap-0.5 bg-default-400/20 dark:bg-default-500/20"
|
|
endContent={<ChevronDownIcon className="text-tiny" />}
|
|
radius="full"
|
|
size="sm"
|
|
variant="flat"
|
|
>
|
|
v{currentVersion}
|
|
</Button>
|
|
</DropdownTrigger>
|
|
</motion.div>
|
|
)}
|
|
</AnimatePresence>
|
|
<DropdownMenu
|
|
aria-label="NextUI versions"
|
|
defaultSelectedKeys={["v2"]}
|
|
selectionMode="single"
|
|
onAction={handleVersionChange}
|
|
>
|
|
<DropdownItem key="v2">v{currentVersion}</DropdownItem>
|
|
<DropdownItem key="v1" endContent={<LinkIcon />}>
|
|
v1.0.0
|
|
</DropdownItem>
|
|
</DropdownMenu>
|
|
</Dropdown>
|
|
) : (
|
|
<div className="w-[74px]" />
|
|
)}
|
|
</NavbarBrand>
|
|
<ul className="hidden lg:flex gap-4 justify-start items-center">
|
|
<NavbarItem>
|
|
<NextLink
|
|
className={navLinkClasses}
|
|
color="foreground"
|
|
data-active={includes(docsPaths, pathname)}
|
|
href="/docs/guide/introduction"
|
|
onClick={() => handlePressNavbarItem("Docs", "/docs/guide/introduction")}
|
|
>
|
|
Docs
|
|
</NextLink>
|
|
</NavbarItem>
|
|
<NavbarItem>
|
|
<NextLink
|
|
className={navLinkClasses}
|
|
color="foreground"
|
|
data-active={includes(pathname, "components")}
|
|
href="/docs/components/avatar"
|
|
onClick={() => handlePressNavbarItem("Components", "/docs/components/avatar")}
|
|
>
|
|
Components
|
|
</NextLink>
|
|
</NavbarItem>
|
|
<NavbarItem>
|
|
<NextLink
|
|
className={navLinkClasses}
|
|
color="foreground"
|
|
data-active={includes(pathname, "blog")}
|
|
href="/blog"
|
|
onClick={() => handlePressNavbarItem("Blog", "/blog")}
|
|
>
|
|
Blog
|
|
</NextLink>
|
|
</NavbarItem>
|
|
<NavbarItem>
|
|
<NextLink
|
|
className={navLinkClasses}
|
|
color="foreground"
|
|
data-active={includes(pathname, "figma")}
|
|
href="/figma"
|
|
onClick={() => handlePressNavbarItem("Figma", "/figma")}
|
|
>
|
|
Figma
|
|
</NextLink>
|
|
</NavbarItem>
|
|
{/* hide feedback and changelog at this moment */}
|
|
{/* <NavbarItem>
|
|
<NextLink className={navLinkClasses} color="foreground" href="#">
|
|
<FbChangelogButton key="changelog" userName="" />
|
|
</NextLink>
|
|
</NavbarItem>
|
|
<NavbarItem>
|
|
<NextLink className={navLinkClasses} color="foreground" href="#">
|
|
<FbFeedbackButton key="feedback" userEmail="" />
|
|
</NextLink>
|
|
</NavbarItem> */}
|
|
<NavbarItem>
|
|
<FbRoadmapLink className={navLinkClasses} />
|
|
</NavbarItem>
|
|
{/* <NavbarItem>
|
|
<Chip
|
|
as={NextLink}
|
|
className="hover:bg-default-100 border-default-200/80 dark:border-default-100/80 transition-colors cursor-pointer"
|
|
color="secondary"
|
|
href="/blog/v2.2.0"
|
|
variant="dot"
|
|
onClick={() => handlePressNavbarItem("Introducing v2.2.0", "/blog/v2.2.0")}
|
|
>
|
|
Introducing v2.2.0
|
|
<span aria-label="rocket emoji" role="img">
|
|
🚀
|
|
</span>
|
|
</Chip>
|
|
</NavbarItem> */}
|
|
</ul>
|
|
</NavbarContent>
|
|
|
|
<NavbarContent className="flex w-full gap-2 sm:hidden" justify="end">
|
|
<NavbarItem className="flex h-full items-center">
|
|
<Link
|
|
isExternal
|
|
aria-label="Github"
|
|
className="p-1"
|
|
href="https://github.com/nextui-org/nextui"
|
|
onClick={() => handlePressNavbarItem("Github", "https://github.com/nextui-org/nextui")}
|
|
>
|
|
<GithubIcon className="text-default-600 dark:text-default-500" />
|
|
</Link>
|
|
</NavbarItem>
|
|
<NavbarItem className="flex h-full items-center">
|
|
<ThemeSwitch />
|
|
</NavbarItem>
|
|
<NavbarItem className="flex h-full items-center">
|
|
<button
|
|
className={clsx(
|
|
"transition-opacity p-1 hover:opacity-80 rounded-full cursor-pointer outline-none",
|
|
// focus ring
|
|
...dataFocusVisibleClasses,
|
|
)}
|
|
data-focus-visible={isFocusVisible}
|
|
{...focusProps}
|
|
{...pressProps}
|
|
>
|
|
<SearchLinearIcon className="mt-px text-default-600 dark:text-default-500" size={20} />
|
|
</button>
|
|
</NavbarItem>
|
|
<NavbarItem className="w-10 h-full">
|
|
<NavbarMenuToggle
|
|
aria-label={isMenuOpen ? "Close menu" : "Open menu"}
|
|
className="w-full h-full pt-1"
|
|
/>
|
|
</NavbarItem>
|
|
</NavbarContent>
|
|
|
|
<NavbarContent className="hidden sm:flex basis-1/5 sm:basis-full" justify="end">
|
|
<NavbarItem className="hidden sm:flex">
|
|
<Chip
|
|
as={NextLink}
|
|
className="bg-default-100/50 hover:bg-default-100 border-default-200/80 dark:border-default-100/80 transition-colors cursor-pointer"
|
|
color="default"
|
|
href="/blog/v2.4.0"
|
|
variant="dot"
|
|
onClick={() => handlePressNavbarItem("New version v2.4.0", "/blog/v2.4.0")}
|
|
>
|
|
New version v2.4.0
|
|
<span aria-label="emoji" role="img">
|
|
🚀
|
|
</span>
|
|
</Chip>
|
|
</NavbarItem>
|
|
<NavbarItem className="hidden sm:flex">
|
|
<Link
|
|
isExternal
|
|
aria-label="Twitter"
|
|
className="p-1"
|
|
href={siteConfig.links.twitter}
|
|
onPress={() => handlePressNavbarItem("Twitter", siteConfig.links.twitter)}
|
|
>
|
|
<TwitterIcon className="text-default-600 dark:text-default-500" />
|
|
</Link>
|
|
<Link
|
|
isExternal
|
|
aria-label="Discord"
|
|
className="p-1"
|
|
href={siteConfig.links.discord}
|
|
onPress={() => handlePressNavbarItem("Discord", siteConfig.links.discord)}
|
|
>
|
|
<DiscordIcon className="text-default-600 dark:text-default-500" />
|
|
</Link>
|
|
<Link
|
|
isExternal
|
|
aria-label="Github"
|
|
className="p-1"
|
|
href={siteConfig.links.github}
|
|
onPress={() => handlePressNavbarItem("Github", siteConfig.links.github)}
|
|
>
|
|
<GithubIcon className="text-default-600 dark:text-default-500" />
|
|
</Link>
|
|
<ThemeSwitch />
|
|
</NavbarItem>
|
|
<NavbarItem className="hidden lg:flex">{searchButton}</NavbarItem>
|
|
{/* <NavbarItem className="hidden md:flex">
|
|
<Button
|
|
isExternal
|
|
as={Link}
|
|
className="group text-sm font-normal text-default-600 bg-default-400/20 dark:bg-default-500/20"
|
|
href={siteConfig.links.sponsor}
|
|
startContent={
|
|
<HeartFilledIcon className="text-danger group-data-[hover=true]:animate-heartbeat" />
|
|
}
|
|
variant="flat"
|
|
onPress={() => handlePressNavbarItem("Sponsor", siteConfig.links.sponsor)}
|
|
>
|
|
Sponsor
|
|
</Button>
|
|
</NavbarItem> */}
|
|
<NavbarMenuToggle
|
|
aria-label={isMenuOpen ? "Close menu" : "Open menu"}
|
|
className="hidden sm:flex lg:hidden ml-4"
|
|
/>
|
|
</NavbarContent>
|
|
|
|
<NavbarMenu>
|
|
<DocsSidebar
|
|
className="mt-4 pt-8"
|
|
routes={[...mobileRoutes, ...routes]}
|
|
slug={slug}
|
|
tag={tag}
|
|
/>
|
|
{children}
|
|
</NavbarMenu>
|
|
</NextUINavbar>
|
|
);
|
|
};
|