From 56864fb340b35252259efae1c742f2e391884de7 Mon Sep 17 00:00:00 2001 From: BIT-zhaoyang Date: Mon, 12 May 2025 23:06:16 +0800 Subject: [PATCH 1/6] feat: navigation menu --- app/docs/components/navigation-menu/demo.tsx | 138 +++++++++++++++ app/docs/components/navigation-menu/page.tsx | 87 ++++++++++ components/ui/8bit/navigation-menu.tsx | 169 +++++++++++++++++++ components/ui/navigation-menu.tsx | 168 ++++++++++++++++++ config/nav-items.ts | 4 + package.json | 1 + public/r/8bit-navigation-menu.json | 18 ++ registry.json | 14 ++ 8 files changed, 599 insertions(+) create mode 100644 app/docs/components/navigation-menu/demo.tsx create mode 100644 app/docs/components/navigation-menu/page.tsx create mode 100644 components/ui/8bit/navigation-menu.tsx create mode 100644 components/ui/navigation-menu.tsx create mode 100644 public/r/8bit-navigation-menu.json diff --git a/app/docs/components/navigation-menu/demo.tsx b/app/docs/components/navigation-menu/demo.tsx new file mode 100644 index 00000000..d0f345ec --- /dev/null +++ b/app/docs/components/navigation-menu/demo.tsx @@ -0,0 +1,138 @@ +"use client" + +import * as React from "react" +import Link from "next/link" + +import { + NavigationMenu, + NavigationMenuContent, + NavigationMenuIndicator, + NavigationMenuItem, + NavigationMenuLink, + NavigationMenuList, + NavigationMenuTrigger, + navigationMenuTriggerStyle, +} from "@/components/ui/8bit/navigation-menu" + +const components: { title: string; href: string; description: string }[] = [ + { + title: "Alert Dialog", + href: "/docs/primitives/alert-dialog", + description: + "A modal dialog that interrupts the user with important content and expects a response.", + }, + { + title: "Hover Card", + href: "/docs/primitives/hover-card", + description: + "For sighted users to preview content available behind a link.", + }, + { + title: "Progress", + href: "/docs/primitives/progress", + description: + "Displays an indicator showing the completion progress of a task, typically displayed as a progress bar.", + }, + { + title: "Scroll-area", + href: "/docs/primitives/scroll-area", + description: "Visually or semantically separates content.", + }, + { + title: "Tabs", + href: "/docs/primitives/tabs", + description: + "A set of layered sections of content—known as tab panels—that are displayed one at a time.", + }, + { + title: "Tooltip", + href: "/docs/primitives/tooltip", + description: + "A popup that displays information related to an element when the element receives keyboard focus or the mouse hovers over it.", + }, +] + +export default function NavigationMenuDemo() { + return ( + + + + Getting started + +
    +
  • + + +
    + shadcn/ui +
    +

    + Beautifully designed components built with Tailwind CSS. +

    + +
    +
  • + + Re-usable components built using Radix UI and Tailwind CSS. + + + How to install dependencies and structure your app. + + + Styles for headings, paragraphs, lists...etc + +
+
+
+ + + Components + +
    + {components.map((component) => ( + + {component.description} + + ))} +
+
+
+ + + + Documentation + + + + +
+
+ ) +} + +function ListItem({ + title, + children, + href, + ...props +}: React.ComponentPropsWithoutRef<"li"> & { href: string }) { + return ( +
  • + + +
    {title}
    +

    + {children} +

    + +
    +
  • + ) +} diff --git a/app/docs/components/navigation-menu/page.tsx b/app/docs/components/navigation-menu/page.tsx new file mode 100644 index 00000000..99077d70 --- /dev/null +++ b/app/docs/components/navigation-menu/page.tsx @@ -0,0 +1,87 @@ +import { Metadata } from "next" + +import { labelMetaData } from "@/lib/metadata" +import { Separator } from "@/components/ui/separator" + +import CodeSnippet from "../code-snippet" +import CopyCommandButton from "../copy-command-button" +import InstallationCommands from "../installation-commands" +import { OpenInV0Button } from "../open-in-v0-button" +import NavigationMenuDemo from "./demo" + +export const metadata: Metadata = { + title: "8-bit Label", + description: "Displays an 8-bit label component.", + openGraph: { + images: labelMetaData, + }, +} + +export default function NavigationMenuPage() { + return ( +
    +
    +

    Navigation Menu

    + +
    + +

    + Displays an 8-bit navigation menu component. +

    + +
    +
    +

    + 8-bit navigation menu component +

    + +
    + +
    +
    +
    + +
    +
    + +

    Installation

    + + + + + +

    Usage

    + + + + {`import { + NavigationMenu, + NavigationMenuContent, + NavigationMenuIndicator, + NavigationMenuItem, + NavigationMenuLink, + NavigationMenuList, + NavigationMenuTrigger, + NavigationMenuViewport, +} from "@/components/ui/navigation-menu" +`} + + {` + + + Item One + + Link + + + + +`} +
    + ) +} diff --git a/components/ui/8bit/navigation-menu.tsx b/components/ui/8bit/navigation-menu.tsx new file mode 100644 index 00000000..3e69298e --- /dev/null +++ b/components/ui/8bit/navigation-menu.tsx @@ -0,0 +1,169 @@ +import * as React from "react" +import { Press_Start_2P } from "next/font/google" +import { cva, VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" +import { + NavigationMenu as ShadcnNavigationMenu, + NavigationMenuContent as ShadcnNavigationMenuContent, + NavigationMenuIndicator as ShadcnNavigationMenuIndicator, + NavigationMenuItem as ShadcnNavigationMenuItem, + NavigationMenuLink as ShadcnNavigationMenuLink, + NavigationMenuList as ShadcnNavigationMenuList, + NavigationMenuTrigger as ShadcnNavigationMenuTrigger, + NavigationMenuViewport as ShadcnNavigationMenuViewport, +} from "@/components/ui/navigation-menu" + +export { navigationMenuTriggerStyle } from "@/components/ui/navigation-menu" + +const pressStart = Press_Start_2P({ + weight: ["400"], + subsets: ["latin"], +}) + +export const navigationMenuVariants = cva("", { + variants: { + font: { + normal: "", + retro: pressStart.className, + }, + }, + defaultVariants: { + font: "retro", + }, +}) + +type FontVariantProps = VariantProps + +export interface BitNavigationMenuProps + extends React.ComponentProps, + VariantProps { + asChild?: boolean +} + +function NavigationMenu({ + className, + font, + ...props +}: React.ComponentProps & FontVariantProps) { + return ( + + ) +} + +function NavigationMenuList({ + className, + font, + ...props +}: React.ComponentProps & + VariantProps) { + return ( + + ) +} + +function NavigationMenuItem({ + className, + font, + ...props +}: React.ComponentProps & FontVariantProps) { + return ( + + ) +} + +function NavigationMenuTrigger({ + className, + font, + ...props +}: React.ComponentProps & + FontVariantProps) { + return ( + + ) +} + +function NavigationMenuContent({ + className, + font, + children, + ...props +}: React.ComponentProps & + FontVariantProps) { + return ( + + {children} + + ) +} + +function NavigationMenuViewport({ + className, + font, + ...props +}: React.ComponentProps & + FontVariantProps) { + return ( + + ) +} + +function NavigationMenuLink({ + className, + font, + ...props +}: React.ComponentProps & FontVariantProps) { + return ( + + ) +} + +function NavigationMenuIndicator({ + className, + font, + ...props +}: React.ComponentProps & + FontVariantProps) { + return ( + + ) +} + +export { + NavigationMenu, + NavigationMenuContent, + NavigationMenuIndicator, + NavigationMenuItem, + NavigationMenuLink, + NavigationMenuList, + NavigationMenuTrigger, + NavigationMenuViewport, +} diff --git a/components/ui/navigation-menu.tsx b/components/ui/navigation-menu.tsx new file mode 100644 index 00000000..1199945c --- /dev/null +++ b/components/ui/navigation-menu.tsx @@ -0,0 +1,168 @@ +import * as React from "react" +import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu" +import { cva } from "class-variance-authority" +import { ChevronDownIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function NavigationMenu({ + className, + children, + viewport = true, + ...props +}: React.ComponentProps & { + viewport?: boolean +}) { + return ( + + {children} + {viewport && } + + ) +} + +function NavigationMenuList({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function NavigationMenuItem({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +const navigationMenuTriggerStyle = cva( + "group inline-flex h-9 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=open]:hover:bg-accent data-[state=open]:text-accent-foreground data-[state=open]:focus:bg-accent data-[state=open]:bg-accent/50 focus-visible:ring-ring/50 outline-none transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1" +) + +function NavigationMenuTrigger({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + {children}{" "} + + ) +} + +function NavigationMenuContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function NavigationMenuViewport({ + className, + ...props +}: React.ComponentProps) { + return ( +
    + +
    + ) +} + +function NavigationMenuLink({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function NavigationMenuIndicator({ + className, + ...props +}: React.ComponentProps) { + return ( + +
    + + ) +} + +export { + NavigationMenu, + NavigationMenuList, + NavigationMenuItem, + NavigationMenuContent, + NavigationMenuTrigger, + NavigationMenuLink, + NavigationMenuIndicator, + NavigationMenuViewport, + navigationMenuTriggerStyle, +} diff --git a/config/nav-items.ts b/config/nav-items.ts index a3faffbc..e8e9b2b0 100644 --- a/config/nav-items.ts +++ b/config/nav-items.ts @@ -95,6 +95,10 @@ const components = [ title: "Input OTP", url: "/docs/components/input-otp", }, + { + title: "Navigation Menu", + url: "/docs/components/navigation-menu", + }, { title: "Scroll Area", url: "/docs/components/scroll-area", diff --git a/package.json b/package.json index 73356fad..d12676cc 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "@radix-ui/react-hover-card": "^1.1.14", "@radix-ui/react-label": "^2.1.7", "@radix-ui/react-menubar": "^1.1.15", + "@radix-ui/react-navigation-menu": "^1.2.12", "@radix-ui/react-popover": "^1.1.14", "@radix-ui/react-progress": "^1.1.7", "@radix-ui/react-radio-group": "^1.3.7", diff --git a/public/r/8bit-navigation-menu.json b/public/r/8bit-navigation-menu.json new file mode 100644 index 00000000..eb0ff8e8 --- /dev/null +++ b/public/r/8bit-navigation-menu.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "8bit-navigation-menu", + "type": "registry:component", + "title": "8-bit Navigation Menu", + "description": "A simple 8-bit navigation menu component", + "registryDependencies": [ + "sidebar" + ], + "files": [ + { + "path": "components/ui/8bit/navigation-menu.tsx", + "content": "import * as React from \"react\"\nimport { Press_Start_2P } from \"next/font/google\"\nimport { Root } from \"@radix-ui/react-navigation-menu\"\nimport { cva, VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n NavigationMenu as ShadcnNavigationMenu,\n NavigationMenuContent as ShadcnNavigationMenuContent,\n NavigationMenuIndicator as ShadcnNavigationMenuIndicator,\n NavigationMenuItem as ShadcnNavigationMenuItem,\n NavigationMenuLink as ShadcnNavigationMenuLink,\n NavigationMenuList as ShadcnNavigationMenuList,\n NavigationMenuTrigger as ShadcnNavigationMenuTrigger,\n NavigationMenuViewport as ShadcnNavigationMenuViewport,\n} from \"@/components/ui/navigation-menu\"\n\nexport { navigationMenuTriggerStyle } from \"@/components/ui/navigation-menu\"\n\nconst pressStart = Press_Start_2P({\n weight: [\"400\"],\n subsets: [\"latin\"],\n})\n\nexport const navigationMenuVariants = cva(\"\", {\n variants: {\n font: {\n normal: \"\",\n retro: pressStart.className,\n },\n },\n defaultVariants: {\n font: \"retro\",\n },\n})\n\ntype FontVariantProps = VariantProps\n\nexport interface BitNavigationMenuProps\n extends React.ComponentProps,\n VariantProps {\n asChild?: boolean\n}\n\nfunction NavigationMenu({\n className,\n font,\n ...props\n}: React.ComponentProps & FontVariantProps) {\n return (\n \n )\n}\n\nfunction NavigationMenuList({\n className,\n font,\n ...props\n}: React.ComponentProps &\n VariantProps) {\n return (\n \n )\n}\n\nfunction NavigationMenuItem({\n className,\n font,\n ...props\n}: React.ComponentProps & FontVariantProps) {\n return (\n \n )\n}\n\nfunction NavigationMenuTrigger({\n className,\n font,\n ...props\n}: React.ComponentProps &\n FontVariantProps) {\n return (\n \n )\n}\n\nfunction NavigationMenuContent({\n className,\n font,\n children,\n ...props\n}: React.ComponentProps &\n FontVariantProps) {\n return (\n \n {children}\n \n )\n}\n\nfunction NavigationMenuViewport({\n className,\n font,\n children,\n ...props\n}: React.ComponentProps &\n FontVariantProps) {\n return (\n \n )\n}\n\nfunction NavigationMenuLink({\n className,\n font,\n ...props\n}: React.ComponentProps & FontVariantProps) {\n return (\n \n )\n}\n\nfunction NavigationMenuIndicator({\n className,\n font,\n ...props\n}: React.ComponentProps &\n FontVariantProps) {\n return (\n \n )\n}\n\nexport {\n NavigationMenu,\n NavigationMenuList,\n NavigationMenuItem,\n NavigationMenuContent,\n NavigationMenuTrigger,\n NavigationMenuLink,\n NavigationMenuIndicator,\n NavigationMenuViewport,\n}\n", + "type": "registry:component", + "target": "components/ui/8bit/navigation-menu.tsx" + } + ] +} \ No newline at end of file diff --git a/registry.json b/registry.json index a7e9fc6a..38aa826a 100644 --- a/registry.json +++ b/registry.json @@ -769,6 +769,20 @@ "target": "components/ui/8bit/drawer.tsx" } ] + }, + { + "name": "8bit-navigation-menu", + "type": "registry:component", + "title": "8-bit Navigation Menu", + "description": "A simple 8-bit navigation menu component", + "registryDependencies": ["sidebar"], + "files": [ + { + "path": "components/ui/8bit/navigation-menu.tsx", + "type": "registry:component", + "target": "components/ui/8bit/navigation-menu.tsx" + } + ] } ] } From d319ab5449c331b061aba08a71acd68ae80b864c Mon Sep 17 00:00:00 2001 From: BIT-zhaoyang Date: Fri, 23 May 2025 20:29:52 +0800 Subject: [PATCH 2/6] feat: navigation menu fix code rabbit ai comments --- app/docs/components/navigation-menu/demo.tsx | 14 +++++++------- app/docs/components/navigation-menu/page.tsx | 6 +++--- public/r/8bit-navigation-menu.json | 2 +- registry.json | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/docs/components/navigation-menu/demo.tsx b/app/docs/components/navigation-menu/demo.tsx index d0f345ec..3c309878 100644 --- a/app/docs/components/navigation-menu/demo.tsx +++ b/app/docs/components/navigation-menu/demo.tsx @@ -17,36 +17,36 @@ import { const components: { title: string; href: string; description: string }[] = [ { title: "Alert Dialog", - href: "/docs/primitives/alert-dialog", + href: "/docs/components/alert-dialog", description: "A modal dialog that interrupts the user with important content and expects a response.", }, { title: "Hover Card", - href: "/docs/primitives/hover-card", + href: "/docs/components/hover-card", description: "For sighted users to preview content available behind a link.", }, { title: "Progress", - href: "/docs/primitives/progress", + href: "/docs/components/progress", description: "Displays an indicator showing the completion progress of a task, typically displayed as a progress bar.", }, { title: "Scroll-area", - href: "/docs/primitives/scroll-area", + href: "/docs/components/scroll-area", description: "Visually or semantically separates content.", }, { title: "Tabs", - href: "/docs/primitives/tabs", + href: "/docs/components/tabs", description: "A set of layered sections of content—known as tab panels—that are displayed one at a time.", }, { title: "Tooltip", - href: "/docs/primitives/tooltip", + href: "/docs/components/tooltip", description: "A popup that displays information related to an element when the element receives keyboard focus or the mouse hovers over it.", }, @@ -81,7 +81,7 @@ export default function NavigationMenuDemo() { How to install dependencies and structure your app. - + Styles for headings, paragraphs, lists...etc diff --git a/app/docs/components/navigation-menu/page.tsx b/app/docs/components/navigation-menu/page.tsx index 99077d70..09a080a3 100644 --- a/app/docs/components/navigation-menu/page.tsx +++ b/app/docs/components/navigation-menu/page.tsx @@ -10,8 +10,8 @@ import { OpenInV0Button } from "../open-in-v0-button" import NavigationMenuDemo from "./demo" export const metadata: Metadata = { - title: "8-bit Label", - description: "Displays an 8-bit label component.", + title: "8-bit Navigation Menu", + description: "Displays an 8-bit navigation menu component.", openGraph: { images: labelMetaData, }, @@ -68,7 +68,7 @@ export default function NavigationMenuPage() { NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, -} from "@/components/ui/navigation-menu" +from "@/components/ui/8bit/navigation-menu" `} {` diff --git a/public/r/8bit-navigation-menu.json b/public/r/8bit-navigation-menu.json index eb0ff8e8..14f10ad8 100644 --- a/public/r/8bit-navigation-menu.json +++ b/public/r/8bit-navigation-menu.json @@ -5,7 +5,7 @@ "title": "8-bit Navigation Menu", "description": "A simple 8-bit navigation menu component", "registryDependencies": [ - "sidebar" + "navigation-menu" ], "files": [ { diff --git a/registry.json b/registry.json index 38aa826a..8e6f19f9 100644 --- a/registry.json +++ b/registry.json @@ -775,7 +775,7 @@ "type": "registry:component", "title": "8-bit Navigation Menu", "description": "A simple 8-bit navigation menu component", - "registryDependencies": ["sidebar"], + "registryDependencies": ["navigation-menu"], "files": [ { "path": "components/ui/8bit/navigation-menu.tsx", From 4d4536f4fdeafcff7f7e4d94e1c48d2f885e03e7 Mon Sep 17 00:00:00 2001 From: BIT-zhaoyang Date: Sun, 25 May 2025 11:49:53 +0800 Subject: [PATCH 3/6] feat: navigation menu - create better, more consistent border behavior - fix broken links in demo --- app/docs/components/navigation-menu/demo.tsx | 17 +++--- app/docs/components/navigation-menu/page.tsx | 2 +- app/globals.css | 10 ++++ components/ui/8bit/navigation-menu.tsx | 59 +++++++++++++++----- package.json | 2 +- 5 files changed, 66 insertions(+), 24 deletions(-) diff --git a/app/docs/components/navigation-menu/demo.tsx b/app/docs/components/navigation-menu/demo.tsx index 3c309878..3a31d450 100644 --- a/app/docs/components/navigation-menu/demo.tsx +++ b/app/docs/components/navigation-menu/demo.tsx @@ -36,7 +36,8 @@ const components: { title: string; href: string; description: string }[] = [ { title: "Scroll-area", href: "/docs/components/scroll-area", - description: "Visually or semantically separates content.", + description: + "Augments native scroll functionality for custom, cross-browser styling.", }, { title: "Tabs", @@ -67,7 +68,7 @@ export default function NavigationMenuDemo() { href="/" >
    - shadcn/ui + 8bitcn/ui

    Beautifully designed components built with Tailwind CSS. @@ -75,14 +76,14 @@ export default function NavigationMenuDemo() { - - Re-usable components built using Radix UI and Tailwind CSS. - - + How to install dependencies and structure your app. - - Styles for headings, paragraphs, lists...etc + + Re-usable components built using Radix UI and Tailwind CSS. + + + Building Retro Blocks for the Web diff --git a/app/docs/components/navigation-menu/page.tsx b/app/docs/components/navigation-menu/page.tsx index 09a080a3..f13c36ff 100644 --- a/app/docs/components/navigation-menu/page.tsx +++ b/app/docs/components/navigation-menu/page.tsx @@ -68,7 +68,7 @@ export default function NavigationMenuPage() { NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, -from "@/components/ui/8bit/navigation-menu" +} from "@/components/ui/8bit/navigation-menu" `} {` diff --git a/app/globals.css b/app/globals.css index 8150f195..d5739552 100644 --- a/app/globals.css +++ b/app/globals.css @@ -76,6 +76,7 @@ --sidebar-accent-foreground: oklch(0.21 0.006 285.885); --sidebar-border: oklch(0.92 0.004 286.32); --sidebar-ring: oklch(0.795 0.184 86.047); + --shadow-border: var(--foreground); } .dark { @@ -110,6 +111,7 @@ --sidebar-accent-foreground: oklch(0.985 0 0); --sidebar-border: oklch(1 0 0 / 10%); --sidebar-ring: oklch(0.554 0.135 66.442); + --shadow-border: var(--ring); } @layer base { @@ -120,3 +122,11 @@ @apply bg-background text-foreground; } } + +.shadow-border { + box-shadow: + 6px 0px var(--shadow-border), + -6px 0px var(--shadow-border), + 0px 6px var(--shadow-border), + 0px -6px var(--shadow-border); +} diff --git a/components/ui/8bit/navigation-menu.tsx b/components/ui/8bit/navigation-menu.tsx index 3e69298e..ac92326f 100644 --- a/components/ui/8bit/navigation-menu.tsx +++ b/components/ui/8bit/navigation-menu.tsx @@ -1,5 +1,6 @@ import * as React from "react" import { Press_Start_2P } from "next/font/google" +import { Indicator, Root, Viewport } from "@radix-ui/react-navigation-menu" import { cva, VariantProps } from "class-variance-authority" import { cn } from "@/lib/utils" @@ -11,7 +12,6 @@ import { NavigationMenuLink as ShadcnNavigationMenuLink, NavigationMenuList as ShadcnNavigationMenuList, NavigationMenuTrigger as ShadcnNavigationMenuTrigger, - NavigationMenuViewport as ShadcnNavigationMenuViewport, } from "@/components/ui/navigation-menu" export { navigationMenuTriggerStyle } from "@/components/ui/navigation-menu" @@ -44,13 +44,26 @@ export interface BitNavigationMenuProps function NavigationMenu({ className, font, + children, + viewport = true, ...props -}: React.ComponentProps & FontVariantProps) { +}: React.ComponentProps & { + viewport?: boolean +} & FontVariantProps) { return ( - + > + {children} + {viewport && } + ) } @@ -120,13 +133,24 @@ function NavigationMenuViewport({ className, font, ...props -}: React.ComponentProps & - FontVariantProps) { +}: React.ComponentProps & FontVariantProps) { return ( - +

    + +
    ) } @@ -150,10 +174,17 @@ function NavigationMenuIndicator({ }: React.ComponentProps & FontVariantProps) { return ( - + > +
    + ) } diff --git a/package.json b/package.json index d12676cc..751afc73 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "@radix-ui/react-hover-card": "^1.1.14", "@radix-ui/react-label": "^2.1.7", "@radix-ui/react-menubar": "^1.1.15", - "@radix-ui/react-navigation-menu": "^1.2.12", + "@radix-ui/react-navigation-menu": "^1.2.13", "@radix-ui/react-popover": "^1.1.14", "@radix-ui/react-progress": "^1.1.7", "@radix-ui/react-radio-group": "^1.3.7", From 9e4526282efd88332c2b65b16ac53ae40e69e787 Mon Sep 17 00:00:00 2001 From: BIT-zhaoyang Date: Mon, 26 May 2025 23:31:55 +0800 Subject: [PATCH 4/6] feat: navigation menu fix code rabbit ai comments --- components/ui/8bit/navigation-menu.tsx | 28 +++++++++----------------- 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/components/ui/8bit/navigation-menu.tsx b/components/ui/8bit/navigation-menu.tsx index ac92326f..6c203e39 100644 --- a/components/ui/8bit/navigation-menu.tsx +++ b/components/ui/8bit/navigation-menu.tsx @@ -5,7 +5,6 @@ import { cva, VariantProps } from "class-variance-authority" import { cn } from "@/lib/utils" import { - NavigationMenu as ShadcnNavigationMenu, NavigationMenuContent as ShadcnNavigationMenuContent, NavigationMenuIndicator as ShadcnNavigationMenuIndicator, NavigationMenuItem as ShadcnNavigationMenuItem, @@ -35,11 +34,8 @@ export const navigationMenuVariants = cva("", { type FontVariantProps = VariantProps -export interface BitNavigationMenuProps - extends React.ComponentProps, - VariantProps { - asChild?: boolean -} +const getFontClassName = (font: FontVariantProps["font"]) => + navigationMenuVariants({ font }) function NavigationMenu({ className, @@ -56,7 +52,7 @@ function NavigationMenu({ data-viewport={viewport} className={cn( "group/navigation-menu relative flex max-w-max flex-1 items-center justify-center", - font !== "normal" && pressStart.className, + getFontClassName(font), className )} {...props} @@ -75,7 +71,7 @@ function NavigationMenuList({ VariantProps) { return ( ) @@ -88,11 +84,7 @@ function NavigationMenuItem({ }: React.ComponentProps & FontVariantProps) { return ( ) @@ -106,7 +98,7 @@ function NavigationMenuTrigger({ FontVariantProps) { return ( ) @@ -121,7 +113,7 @@ function NavigationMenuContent({ FontVariantProps) { return ( {children} @@ -144,7 +136,7 @@ function NavigationMenuViewport({ data-slot="navigation-menu-viewport" className={cn( "origin-top-center bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 relative mt-3 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border shadow md:w-[var(--radix-navigation-menu-viewport-width)]", - font !== "normal" && pressStart.className, + getFontClassName(font), "shadow-border", className )} @@ -161,7 +153,7 @@ function NavigationMenuLink({ }: React.ComponentProps & FontVariantProps) { return ( ) @@ -178,7 +170,7 @@ function NavigationMenuIndicator({ data-slot="navigation-menu-indicator" className={cn( "data-[state=visible]:animate-in data-[state=hidden]:fade-out data-[state=visible]:fade-in top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden", - font !== "normal" && pressStart.className, + getFontClassName(font), className )} {...props} From ab3f3221af3a99069e9f2fe7db0e980ecf1662b6 Mon Sep 17 00:00:00 2001 From: BIT-zhaoyang Date: Wed, 28 May 2025 00:37:48 +0800 Subject: [PATCH 5/6] feat: navigation menu - Address review comment --- app/docs/components/navigation-menu/page.tsx | 6 +++--- app/globals.css | 10 ---------- .../examples/navigation-menu.tsx | 0 components/ui/8bit/navigation-menu.tsx | 3 ++- lib/metadata.ts | 1 + public/assets/8bitcn-navigation-menu-light.png | Bin 0 -> 35104 bytes 6 files changed, 6 insertions(+), 14 deletions(-) rename app/docs/components/navigation-menu/demo.tsx => components/examples/navigation-menu.tsx (100%) create mode 100644 public/assets/8bitcn-navigation-menu-light.png diff --git a/app/docs/components/navigation-menu/page.tsx b/app/docs/components/navigation-menu/page.tsx index f13c36ff..74dbbfe8 100644 --- a/app/docs/components/navigation-menu/page.tsx +++ b/app/docs/components/navigation-menu/page.tsx @@ -1,19 +1,19 @@ import { Metadata } from "next" -import { labelMetaData } from "@/lib/metadata" +import { navigationMenuMetaData } from "@/lib/metadata" import { Separator } from "@/components/ui/separator" +import NavigationMenuDemo from "@/components/examples/navigation-menu" import CodeSnippet from "../code-snippet" import CopyCommandButton from "../copy-command-button" import InstallationCommands from "../installation-commands" import { OpenInV0Button } from "../open-in-v0-button" -import NavigationMenuDemo from "./demo" export const metadata: Metadata = { title: "8-bit Navigation Menu", description: "Displays an 8-bit navigation menu component.", openGraph: { - images: labelMetaData, + images: navigationMenuMetaData, }, } diff --git a/app/globals.css b/app/globals.css index d5739552..8150f195 100644 --- a/app/globals.css +++ b/app/globals.css @@ -76,7 +76,6 @@ --sidebar-accent-foreground: oklch(0.21 0.006 285.885); --sidebar-border: oklch(0.92 0.004 286.32); --sidebar-ring: oklch(0.795 0.184 86.047); - --shadow-border: var(--foreground); } .dark { @@ -111,7 +110,6 @@ --sidebar-accent-foreground: oklch(0.985 0 0); --sidebar-border: oklch(1 0 0 / 10%); --sidebar-ring: oklch(0.554 0.135 66.442); - --shadow-border: var(--ring); } @layer base { @@ -122,11 +120,3 @@ @apply bg-background text-foreground; } } - -.shadow-border { - box-shadow: - 6px 0px var(--shadow-border), - -6px 0px var(--shadow-border), - 0px 6px var(--shadow-border), - 0px -6px var(--shadow-border); -} diff --git a/app/docs/components/navigation-menu/demo.tsx b/components/examples/navigation-menu.tsx similarity index 100% rename from app/docs/components/navigation-menu/demo.tsx rename to components/examples/navigation-menu.tsx diff --git a/components/ui/8bit/navigation-menu.tsx b/components/ui/8bit/navigation-menu.tsx index 6c203e39..d44b54d9 100644 --- a/components/ui/8bit/navigation-menu.tsx +++ b/components/ui/8bit/navigation-menu.tsx @@ -137,7 +137,8 @@ function NavigationMenuViewport({ className={cn( "origin-top-center bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 relative mt-3 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border shadow md:w-[var(--radix-navigation-menu-viewport-width)]", getFontClassName(font), - "shadow-border", + "shadow-[6px_0px_0px_0px_var(--foreground),-6px_0px_0px_0px_var(--foreground),0px_-6px_0px_0px_var(--foreground),0px_6px_0px_0px_var(--foreground)]", + "dark:shadow-[6px_0px_0px_0px_var(--ring),-6px_0px_0px_0px_var(--ring),0px_-6px_0px_0px_var(--ring),0px_6px_0px_0px_var(--ring)]", className )} {...props} diff --git a/lib/metadata.ts b/lib/metadata.ts index 1e62ae32..e7fec42a 100644 --- a/lib/metadata.ts +++ b/lib/metadata.ts @@ -54,3 +54,4 @@ export const contextMenuMetaData = "/assets/8bitcn-context-menu-light.png" export const menubarMetaData = "/assets/8bitcn-menubar-light.png" export const sidebarMetaData = "/assets/8bitcn-sidebar-light.png" export const toastMetaData = "/assets/8bitcn-toast-light.png" +export const navigationMenuMetaData = "/assets/8bitcn-navigation-menu-light.png" diff --git a/public/assets/8bitcn-navigation-menu-light.png b/public/assets/8bitcn-navigation-menu-light.png new file mode 100644 index 0000000000000000000000000000000000000000..914cabd561206bb1d71bae4082d673b080831a53 GIT binary patch literal 35104 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 )0ABPQ66BSjP( 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 Aa{vGU literal 0 HcmV?d00001 From 86667f3b12d904e00ad3ad19c70bb936259bb3e3 Mon Sep 17 00:00:00 2001 From: BIT-zhaoyang Date: Wed, 28 May 2025 00:41:59 +0800 Subject: [PATCH 6/6] feat: navigation menu - update registry file --- public/r/8bit-navigation-menu.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/r/8bit-navigation-menu.json b/public/r/8bit-navigation-menu.json index 14f10ad8..bc27ad6f 100644 --- a/public/r/8bit-navigation-menu.json +++ b/public/r/8bit-navigation-menu.json @@ -10,7 +10,7 @@ "files": [ { "path": "components/ui/8bit/navigation-menu.tsx", - "content": "import * as React from \"react\"\nimport { Press_Start_2P } from \"next/font/google\"\nimport { Root } from \"@radix-ui/react-navigation-menu\"\nimport { cva, VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n NavigationMenu as ShadcnNavigationMenu,\n NavigationMenuContent as ShadcnNavigationMenuContent,\n NavigationMenuIndicator as ShadcnNavigationMenuIndicator,\n NavigationMenuItem as ShadcnNavigationMenuItem,\n NavigationMenuLink as ShadcnNavigationMenuLink,\n NavigationMenuList as ShadcnNavigationMenuList,\n NavigationMenuTrigger as ShadcnNavigationMenuTrigger,\n NavigationMenuViewport as ShadcnNavigationMenuViewport,\n} from \"@/components/ui/navigation-menu\"\n\nexport { navigationMenuTriggerStyle } from \"@/components/ui/navigation-menu\"\n\nconst pressStart = Press_Start_2P({\n weight: [\"400\"],\n subsets: [\"latin\"],\n})\n\nexport const navigationMenuVariants = cva(\"\", {\n variants: {\n font: {\n normal: \"\",\n retro: pressStart.className,\n },\n },\n defaultVariants: {\n font: \"retro\",\n },\n})\n\ntype FontVariantProps = VariantProps\n\nexport interface BitNavigationMenuProps\n extends React.ComponentProps,\n VariantProps {\n asChild?: boolean\n}\n\nfunction NavigationMenu({\n className,\n font,\n ...props\n}: React.ComponentProps & FontVariantProps) {\n return (\n \n )\n}\n\nfunction NavigationMenuList({\n className,\n font,\n ...props\n}: React.ComponentProps &\n VariantProps) {\n return (\n \n )\n}\n\nfunction NavigationMenuItem({\n className,\n font,\n ...props\n}: React.ComponentProps & FontVariantProps) {\n return (\n \n )\n}\n\nfunction NavigationMenuTrigger({\n className,\n font,\n ...props\n}: React.ComponentProps &\n FontVariantProps) {\n return (\n \n )\n}\n\nfunction NavigationMenuContent({\n className,\n font,\n children,\n ...props\n}: React.ComponentProps &\n FontVariantProps) {\n return (\n \n {children}\n \n )\n}\n\nfunction NavigationMenuViewport({\n className,\n font,\n children,\n ...props\n}: React.ComponentProps &\n FontVariantProps) {\n return (\n \n )\n}\n\nfunction NavigationMenuLink({\n className,\n font,\n ...props\n}: React.ComponentProps & FontVariantProps) {\n return (\n \n )\n}\n\nfunction NavigationMenuIndicator({\n className,\n font,\n ...props\n}: React.ComponentProps &\n FontVariantProps) {\n return (\n \n )\n}\n\nexport {\n NavigationMenu,\n NavigationMenuList,\n NavigationMenuItem,\n NavigationMenuContent,\n NavigationMenuTrigger,\n NavigationMenuLink,\n NavigationMenuIndicator,\n NavigationMenuViewport,\n}\n", + "content": "import * as React from \"react\"\nimport { Press_Start_2P } from \"next/font/google\"\nimport { Indicator, Root, Viewport } from \"@radix-ui/react-navigation-menu\"\nimport { cva, VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n NavigationMenuContent as ShadcnNavigationMenuContent,\n NavigationMenuIndicator as ShadcnNavigationMenuIndicator,\n NavigationMenuItem as ShadcnNavigationMenuItem,\n NavigationMenuLink as ShadcnNavigationMenuLink,\n NavigationMenuList as ShadcnNavigationMenuList,\n NavigationMenuTrigger as ShadcnNavigationMenuTrigger,\n} from \"@/components/ui/navigation-menu\"\n\nexport { navigationMenuTriggerStyle } from \"@/components/ui/navigation-menu\"\n\nconst pressStart = Press_Start_2P({\n weight: [\"400\"],\n subsets: [\"latin\"],\n})\n\nexport const navigationMenuVariants = cva(\"\", {\n variants: {\n font: {\n normal: \"\",\n retro: pressStart.className,\n },\n },\n defaultVariants: {\n font: \"retro\",\n },\n})\n\ntype FontVariantProps = VariantProps\n\nconst getFontClassName = (font: FontVariantProps[\"font\"]) =>\n navigationMenuVariants({ font })\n\nfunction NavigationMenu({\n className,\n font,\n children,\n viewport = true,\n ...props\n}: React.ComponentProps & {\n viewport?: boolean\n} & FontVariantProps) {\n return (\n \n {children}\n {viewport && }\n \n )\n}\n\nfunction NavigationMenuList({\n className,\n font,\n ...props\n}: React.ComponentProps &\n VariantProps) {\n return (\n \n )\n}\n\nfunction NavigationMenuItem({\n className,\n font,\n ...props\n}: React.ComponentProps & FontVariantProps) {\n return (\n \n )\n}\n\nfunction NavigationMenuTrigger({\n className,\n font,\n ...props\n}: React.ComponentProps &\n FontVariantProps) {\n return (\n \n )\n}\n\nfunction NavigationMenuContent({\n className,\n font,\n children,\n ...props\n}: React.ComponentProps &\n FontVariantProps) {\n return (\n \n {children}\n \n )\n}\n\nfunction NavigationMenuViewport({\n className,\n font,\n ...props\n}: React.ComponentProps & FontVariantProps) {\n return (\n \n \n
    \n )\n}\n\nfunction NavigationMenuLink({\n className,\n font,\n ...props\n}: React.ComponentProps & FontVariantProps) {\n return (\n \n )\n}\n\nfunction NavigationMenuIndicator({\n className,\n font,\n ...props\n}: React.ComponentProps &\n FontVariantProps) {\n return (\n \n
    \n \n )\n}\n\nexport {\n NavigationMenu,\n NavigationMenuContent,\n NavigationMenuIndicator,\n NavigationMenuItem,\n NavigationMenuLink,\n NavigationMenuList,\n NavigationMenuTrigger,\n NavigationMenuViewport,\n}\n", "type": "registry:component", "target": "components/ui/8bit/navigation-menu.tsx" }