This component no longer exists. It was in atlas-ui’s manifest when we first indexed it and is not there now — the registry served its inventory on 2026-08-13 and this item was not on it. The install command below will fail. It is kept here because a tutorial somewhere still tells people to run it.
Notch Nav
atlas-ui/notch-navRemovedComponent
A Notch style trigger that reveals the navigation menu from above.
Live preview
live · rendered by the registry
Rendered by atlas-ui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://atlasui.dev/r/notch-nav.jsonSource
1"use client";23import {4 type ReactNode,5 createContext,6 useContext,7 useEffect,8 useRef,9 useState,10} from "react";1112import { AnimatePresence, type Variants, motion, stagger } from "motion/react";1314import { cn } from "@/lib/utils";1516interface NotchNavContextValue {17 open: boolean;18 toggle: () => void;19 contentRef: React.RefObject<HTMLDivElement | null>;20 contentHeight: number;21 offsetY: number;22 setOffsetY: (y: number) => void;23}2425const NotchNavContext = createContext<NotchNavContextValue | null>(null);2627const useNotchNav = () => {28 const ctx = useContext(NotchNavContext);29 if (!ctx) {30 throw new Error("NotchNav components must be used within <NotchNav />");31 }32 return ctx;33};3435const NotchNavContentContext = createContext<boolean | null>(null);3637const useNotchNavContent = () => {38 const ctx = useContext(NotchNavContentContext);39 if (!ctx) {40 throw new Error("<NotchNavItem /> must be used within <NotchNavContent />");41 }42 return ctx;43};4445const NotchNav = ({ children }: { children: ReactNode }) => {46 const [open, setOpen] = useState(false);47 const toggle = () => setOpen((p) => !p);4849 const contentRef = useRef<HTMLDivElement>(null);50 const [contentHeight, setContentHeight] = useState(0);5152 const [offsetY, setOffsetY] = useState(20);5354 useEffect(() => {55 if (!open || !contentRef.current) return;5657 const { height } = contentRef.current.getBoundingClientRect();58 setContentHeight((prev) => (prev !== height ? height : prev));59 }, [open]);6061 return (62 <NotchNavContext.Provider63 value={{ open, toggle, contentRef, contentHeight, offsetY, setOffsetY }}64 >65 <div className="relative flex flex-col items-center">{children}</div>66 </NotchNavContext.Provider>67 );68};6970interface PathProps {71 d: string;72 variants: Variants;73 transition?: { duration: number };74}7576const Path = (props: PathProps) => (77 <motion.path78 fill="transparent"79 strokeWidth="1"80 stroke="#171717"81 strokeLinecap="round"82 {...props}83 />84);8586const NotchNavTrigger = ({ className }: { className?: string }) => {87 const { open, toggle, contentHeight, offsetY } = useNotchNav();8889 return (90 <motion.button91 type="button"92 aria-expanded={open}93 onClick={toggle}94 onKeyDown={(e) => {95 if (e.key === "Enter" || e.key === " ") {96 e.preventDefault();97 toggle();98 }99 }}100 initial={{ y: 0 }}101 animate={{ y: open ? contentHeight + offsetY : 0 }}102 transition={{103// … truncated
What it pulls in
npm packages
Other registry items
