import * as NavigationMenuPrimitive from '@rn-primitives/navigation-menu'; import { cva } from 'class-variance-authority'; import * as React from 'react'; import { Platform, View } from 'react-native'; import Animated, { Extrapolation, FadeInLeft, FadeOutLeft, interpolate, useAnimatedStyle, useDerivedValue, withTiming, } from 'react-native-reanimated'; import { ChevronDown } from '@/lib/icons/ChevronDown'; import { cn } from '@/lib/utils'; const NavigationMenu = React.forwardRef< NavigationMenuPrimitive.RootRef, NavigationMenuPrimitive.RootProps >(({ className, children, ...props }, ref) => ( {children} {Platform.OS === 'web' && } )); NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName; const NavigationMenuList = React.forwardRef< NavigationMenuPrimitive.ListRef, NavigationMenuPrimitive.ListProps >(({ className, ...props }, ref) => ( )); NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName; const NavigationMenuItem = NavigationMenuPrimitive.Item; const navigationMenuTriggerStyle = cva( 'web:group web:inline-flex flex-row h-10 native:h-12 native:px-3 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium web:transition-colors web:hover:bg-accent active:bg-accent web:hover:text-accent-foreground web:focus:bg-accent web:focus:text-accent-foreground web:focus:outline-none web:disabled:pointer-events-none disabled:opacity-50 web:data-[active]:bg-accent/50 web:data-[state=open]:bg-accent/50' ); const NavigationMenuTrigger = React.forwardRef< NavigationMenuPrimitive.TriggerRef, NavigationMenuPrimitive.TriggerProps >(({ className, children, ...props }, ref) => { const { value } = NavigationMenuPrimitive.useRootContext(); const { value: itemValue } = NavigationMenuPrimitive.useItemContext(); const progress = useDerivedValue(() => value === itemValue ? withTiming(1, { duration: 250 }) : withTiming(0, { duration: 200 }) ); const chevronStyle = useAnimatedStyle(() => ({ transform: [{ rotate: `${progress.value * 180}deg` }], opacity: interpolate(progress.value, [0, 1], [1, 0.8], Extrapolation.CLAMP), })); return ( <>{children} ); }); NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName; const NavigationMenuContent = React.forwardRef< NavigationMenuPrimitive.ContentRef, NavigationMenuPrimitive.ContentProps & { portalHost?: string; } >(({ className, children, portalHost, ...props }, ref) => { const { value } = NavigationMenuPrimitive.useRootContext(); const { value: itemValue } = NavigationMenuPrimitive.useItemContext(); return ( {children} ); }); NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName; const NavigationMenuLink = NavigationMenuPrimitive.Link; const NavigationMenuViewport = React.forwardRef< NavigationMenuPrimitive.ViewportRef, NavigationMenuPrimitive.ViewportProps >(({ className, ...props }, ref) => { return ( ); }); NavigationMenuViewport.displayName = NavigationMenuPrimitive.Viewport.displayName; const NavigationMenuIndicator = React.forwardRef< NavigationMenuPrimitive.IndicatorRef, NavigationMenuPrimitive.IndicatorProps >(({ className, ...props }, ref) => { const { value } = NavigationMenuPrimitive.useRootContext(); const { value: itemValue } = NavigationMenuPrimitive.useItemContext(); return ( ); }); NavigationMenuIndicator.displayName = NavigationMenuPrimitive.Indicator.displayName; export { NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, navigationMenuTriggerStyle, NavigationMenuViewport, };