@gv-tech/ui-native 2.19.0 → 2.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/index.ts CHANGED
@@ -38,7 +38,15 @@ export { Avatar, AvatarFallback, AvatarImage } from './avatar';
38
38
  export { Badge, badgeVariants } from './badge';
39
39
 
40
40
  // Breadcrumb
41
- export { Breadcrumb } from './breadcrumb';
41
+ export {
42
+ Breadcrumb,
43
+ BreadcrumbEllipsis,
44
+ BreadcrumbItem,
45
+ BreadcrumbLink,
46
+ BreadcrumbList,
47
+ BreadcrumbPage,
48
+ BreadcrumbSeparator,
49
+ } from './breadcrumb';
42
50
 
43
51
  // Button
44
52
  export { Button, buttonVariants } from './button';
@@ -52,10 +60,17 @@ export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle }
52
60
  export type { CardProps } from './card';
53
61
 
54
62
  // Carousel
55
- export { Carousel } from './carousel';
63
+ export { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious } from './carousel';
56
64
 
57
65
  // Chart
58
- export { Chart } from './chart';
66
+ export {
67
+ ChartContainer,
68
+ ChartLegend,
69
+ ChartLegendContent,
70
+ ChartStyle,
71
+ ChartTooltip,
72
+ ChartTooltipContent,
73
+ } from './chart';
59
74
 
60
75
  // Checkbox
61
76
  export { Checkbox } from './checkbox';
@@ -65,10 +80,36 @@ export type { CheckboxProps } from './checkbox';
65
80
  export { Collapsible, CollapsibleContent, CollapsibleTrigger } from './collapsible';
66
81
 
67
82
  // Command
68
- export { Command } from './command';
83
+ export {
84
+ Command,
85
+ CommandDialog,
86
+ CommandEmpty,
87
+ CommandGroup,
88
+ CommandInput,
89
+ CommandItem,
90
+ CommandList,
91
+ CommandSeparator,
92
+ CommandShortcut,
93
+ } from './command';
69
94
 
70
95
  // Context Menu
71
- export { ContextMenu } from './context-menu';
96
+ export {
97
+ ContextMenu,
98
+ ContextMenuCheckboxItem,
99
+ ContextMenuContent,
100
+ ContextMenuGroup,
101
+ ContextMenuItem,
102
+ ContextMenuLabel,
103
+ ContextMenuPortal,
104
+ ContextMenuRadioGroup,
105
+ ContextMenuRadioItem,
106
+ ContextMenuSeparator,
107
+ ContextMenuShortcut,
108
+ ContextMenuSub,
109
+ ContextMenuSubContent,
110
+ ContextMenuSubTrigger,
111
+ ContextMenuTrigger,
112
+ } from './context-menu';
72
113
 
73
114
  // Dialog
74
115
  export {
@@ -84,16 +125,43 @@ export {
84
125
  export type { DialogProps } from './dialog';
85
126
 
86
127
  // Drawer
87
- export { Drawer } from './drawer';
128
+ export {
129
+ Drawer,
130
+ DrawerClose,
131
+ DrawerContent,
132
+ DrawerDescription,
133
+ DrawerFooter,
134
+ DrawerHeader,
135
+ DrawerOverlay,
136
+ DrawerPortal,
137
+ DrawerTitle,
138
+ DrawerTrigger,
139
+ } from './drawer';
88
140
 
89
141
  // Dropdown Menu
90
- export { DropdownMenu } from './dropdown-menu';
142
+ export {
143
+ DropdownMenu,
144
+ DropdownMenuCheckboxItem,
145
+ DropdownMenuContent,
146
+ DropdownMenuGroup,
147
+ DropdownMenuItem,
148
+ DropdownMenuLabel,
149
+ DropdownMenuPortal,
150
+ DropdownMenuRadioGroup,
151
+ DropdownMenuRadioItem,
152
+ DropdownMenuSeparator,
153
+ DropdownMenuShortcut,
154
+ DropdownMenuSub,
155
+ DropdownMenuSubContent,
156
+ DropdownMenuSubTrigger,
157
+ DropdownMenuTrigger,
158
+ } from './dropdown-menu';
91
159
 
92
160
  // Form
93
161
  export { Form } from './form';
94
162
 
95
163
  // Hover Card
96
- export { HoverCard } from './hover-card';
164
+ export { HoverCard, HoverCardContent, HoverCardTrigger } from './hover-card';
97
165
 
98
166
  // Input
99
167
  export { Input } from './input';
@@ -103,13 +171,47 @@ export type { InputProps } from './input';
103
171
  export { Label } from './label';
104
172
 
105
173
  // Menubar
106
- export { Menubar } from './menubar';
174
+ export {
175
+ Menubar,
176
+ MenubarCheckboxItem,
177
+ MenubarContent,
178
+ MenubarGroup,
179
+ MenubarItem,
180
+ MenubarLabel,
181
+ MenubarMenu,
182
+ MenubarPortal,
183
+ MenubarRadioGroup,
184
+ MenubarRadioItem,
185
+ MenubarSeparator,
186
+ MenubarShortcut,
187
+ MenubarSub,
188
+ MenubarSubContent,
189
+ MenubarSubTrigger,
190
+ MenubarTrigger,
191
+ } from './menubar';
107
192
 
108
193
  // Navigation Menu
109
- export { NavigationMenu } from './navigation-menu';
194
+ export {
195
+ NavigationMenu,
196
+ NavigationMenuContent,
197
+ NavigationMenuIndicator,
198
+ NavigationMenuItem,
199
+ NavigationMenuLink,
200
+ NavigationMenuList,
201
+ NavigationMenuTrigger,
202
+ NavigationMenuViewport,
203
+ } from './navigation-menu';
110
204
 
111
205
  // Pagination
112
- export { Pagination } from './pagination';
206
+ export {
207
+ Pagination,
208
+ PaginationContent,
209
+ PaginationEllipsis,
210
+ PaginationItem,
211
+ PaginationLink,
212
+ PaginationNext,
213
+ PaginationPrevious,
214
+ } from './pagination';
113
215
 
114
216
  // Popover
115
217
  export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from './popover';
@@ -204,6 +306,7 @@ export { ToggleGroup, ToggleGroupItem } from './toggle-group';
204
306
  export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './tooltip';
205
307
 
206
308
  // Toast
309
+ export { toast, useToast } from './hooks/use-toast';
207
310
  export { Toast } from './toast';
208
311
  export type { ToastProps } from './toast';
209
312
 
package/src/menubar.tsx CHANGED
@@ -1,9 +1,257 @@
1
- import { Text, View } from 'react-native';
1
+ import type {
2
+ MenubarBaseProps,
3
+ MenubarCheckboxItemBaseProps,
4
+ MenubarContentBaseProps,
5
+ MenubarItemBaseProps,
6
+ MenubarLabelBaseProps,
7
+ MenubarRadioItemBaseProps,
8
+ MenubarSeparatorBaseProps,
9
+ MenubarShortcutBaseProps,
10
+ MenubarSubContentBaseProps,
11
+ MenubarSubTriggerBaseProps,
12
+ MenubarTriggerBaseProps,
13
+ } from '@gv-tech/ui-core';
14
+ import * as MenubarPrimitive from '@rn-primitives/menubar';
15
+ import { Check, ChevronRight, Circle } from 'lucide-react-native';
16
+ import * as React from 'react';
17
+ import { Platform, StyleSheet, View } from 'react-native';
18
+ import Animated, { FadeIn, FadeOut } from 'react-native-reanimated';
19
+ import { wrapTextChildren } from './lib/render-native';
20
+ import { cn } from './lib/utils';
21
+ import { Text } from './text';
2
22
 
3
- export const Menubar = () => {
23
+ export const Menubar = React.forwardRef<React.ElementRef<typeof MenubarPrimitive.Root>, MenubarBaseProps>(
24
+ ({ className, children, value: valueProp, onValueChange: onValueChangeProp, ...props }, ref) => {
25
+ const [localValue, setLocalValue] = React.useState<string | undefined>(valueProp || '');
26
+ const value = valueProp !== undefined ? valueProp : localValue;
27
+ const onValueChange = (val: string | undefined) => {
28
+ setLocalValue(val);
29
+ onValueChangeProp?.(val || '');
30
+ };
31
+
32
+ return (
33
+ <MenubarPrimitive.Root
34
+ ref={ref}
35
+ value={value}
36
+ onValueChange={onValueChange}
37
+ className={cn(
38
+ 'bg-background border-border flex flex-row items-center space-x-1 rounded-md border p-1 shadow-sm',
39
+ className,
40
+ )}
41
+ {...props}
42
+ >
43
+ {children}
44
+ </MenubarPrimitive.Root>
45
+ );
46
+ },
47
+ );
48
+ Menubar.displayName = 'Menubar';
49
+
50
+ export const MenubarMenu = MenubarPrimitive.Menu;
51
+
52
+ export const MenubarPortal = MenubarPrimitive.Portal;
53
+
54
+ export const MenubarGroup = MenubarPrimitive.Group;
55
+
56
+ export const MenubarRadioGroup = MenubarPrimitive.RadioGroup;
57
+
58
+ export const MenubarSub = MenubarPrimitive.Sub;
59
+
60
+ const MenubarOverlay = React.forwardRef<
61
+ React.ElementRef<typeof MenubarPrimitive.Overlay>,
62
+ React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Overlay>
63
+ >(({ className, ...props }, ref) => {
64
+ return (
65
+ <MenubarPrimitive.Overlay style={Platform.OS !== 'web' ? StyleSheet.absoluteFill : undefined} ref={ref} {...props}>
66
+ <Animated.View
67
+ entering={FadeIn.duration(100)}
68
+ exiting={FadeOut.duration(100)}
69
+ className={cn('absolute inset-0 z-50 bg-black/30', className)}
70
+ />
71
+ </MenubarPrimitive.Overlay>
72
+ );
73
+ });
74
+ MenubarOverlay.displayName = 'MenubarOverlay';
75
+
76
+ export const MenubarTrigger = React.forwardRef<
77
+ React.ElementRef<typeof MenubarPrimitive.Trigger>,
78
+ MenubarTriggerBaseProps
79
+ >(({ className, children, ...props }, ref) => {
80
+ return (
81
+ <MenubarPrimitive.Trigger
82
+ ref={ref}
83
+ className={cn(
84
+ 'focus:bg-accent focus:text-accent-foreground active:bg-accent active:text-accent-foreground flex flex-row items-center rounded-sm px-3 py-1.5 text-sm font-medium outline-none',
85
+ className,
86
+ )}
87
+ {...props}
88
+ >
89
+ {wrapTextChildren(children, Text)}
90
+ </MenubarPrimitive.Trigger>
91
+ );
92
+ });
93
+ MenubarTrigger.displayName = 'MenubarTrigger';
94
+
95
+ export const MenubarContent = React.forwardRef<
96
+ React.ElementRef<typeof MenubarPrimitive.Content>,
97
+ MenubarContentBaseProps
98
+ >(({ className, children, ...props }, ref) => {
4
99
  return (
5
- <View>
6
- <Text>menubar is not yet implemented for React Native</Text>
7
- </View>
100
+ <MenubarPortal>
101
+ <MenubarOverlay />
102
+ <MenubarPrimitive.Content
103
+ ref={ref}
104
+ className={cn(
105
+ 'bg-popover border-border z-50 min-w-[12rem] overflow-hidden rounded-md border p-1 shadow-md',
106
+ className,
107
+ )}
108
+ {...props}
109
+ >
110
+ {children}
111
+ </MenubarPrimitive.Content>
112
+ </MenubarPortal>
113
+ );
114
+ });
115
+ MenubarContent.displayName = 'MenubarContent';
116
+
117
+ export const MenubarItem = React.forwardRef<React.ElementRef<typeof MenubarPrimitive.Item>, MenubarItemBaseProps>(
118
+ ({ className, children, inset, ...props }, ref) => {
119
+ return (
120
+ <MenubarPrimitive.Item
121
+ ref={ref}
122
+ className={cn(
123
+ 'focus:bg-accent focus:text-accent-foreground active:bg-accent active:text-accent-foreground relative flex flex-row items-center rounded-sm px-2 py-1.5 text-sm outline-none',
124
+ inset && 'pl-8',
125
+ className,
126
+ )}
127
+ {...props}
128
+ >
129
+ {wrapTextChildren(children, Text)}
130
+ </MenubarPrimitive.Item>
131
+ );
132
+ },
133
+ );
134
+ MenubarItem.displayName = 'MenubarItem';
135
+
136
+ export const MenubarCheckboxItem = React.forwardRef<
137
+ React.ElementRef<typeof MenubarPrimitive.CheckboxItem>,
138
+ MenubarCheckboxItemBaseProps
139
+ >(({ className, children, checked, onCheckedChange, ...props }, ref) => {
140
+ return (
141
+ <MenubarPrimitive.CheckboxItem
142
+ ref={ref}
143
+ checked={!!checked}
144
+ onCheckedChange={onCheckedChange || (() => {})}
145
+ className={cn(
146
+ 'focus:bg-accent focus:text-accent-foreground active:bg-accent active:text-accent-foreground relative flex flex-row items-center rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none',
147
+ className,
148
+ )}
149
+ {...props}
150
+ >
151
+ <View className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
152
+ <MenubarPrimitive.ItemIndicator>
153
+ <Check size={14} className="text-foreground" />
154
+ </MenubarPrimitive.ItemIndicator>
155
+ </View>
156
+ {wrapTextChildren(children, Text)}
157
+ </MenubarPrimitive.CheckboxItem>
158
+ );
159
+ });
160
+ MenubarCheckboxItem.displayName = 'MenubarCheckboxItem';
161
+
162
+ export const MenubarRadioItem = React.forwardRef<
163
+ React.ElementRef<typeof MenubarPrimitive.RadioItem>,
164
+ MenubarRadioItemBaseProps
165
+ >(({ className, children, value, ...props }, ref) => {
166
+ return (
167
+ <MenubarPrimitive.RadioItem
168
+ ref={ref}
169
+ value={value}
170
+ className={cn(
171
+ 'focus:bg-accent focus:text-accent-foreground active:bg-accent active:text-accent-foreground relative flex flex-row items-center rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none',
172
+ className,
173
+ )}
174
+ {...props}
175
+ >
176
+ <View className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
177
+ <MenubarPrimitive.ItemIndicator>
178
+ <Circle size={8} className="text-foreground fill-current" />
179
+ </MenubarPrimitive.ItemIndicator>
180
+ </View>
181
+ {wrapTextChildren(children, Text)}
182
+ </MenubarPrimitive.RadioItem>
183
+ );
184
+ });
185
+ MenubarRadioItem.displayName = 'MenubarRadioItem';
186
+
187
+ export const MenubarLabel = React.forwardRef<React.ElementRef<typeof MenubarPrimitive.Label>, MenubarLabelBaseProps>(
188
+ ({ className, children, inset, ...props }, ref) => {
189
+ return (
190
+ <MenubarPrimitive.Label
191
+ ref={ref}
192
+ className={cn('text-foreground px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', className)}
193
+ {...props}
194
+ >
195
+ {wrapTextChildren(children, Text)}
196
+ </MenubarPrimitive.Label>
197
+ );
198
+ },
199
+ );
200
+ MenubarLabel.displayName = 'MenubarLabel';
201
+
202
+ export const MenubarSeparator = React.forwardRef<
203
+ React.ElementRef<typeof MenubarPrimitive.Separator>,
204
+ MenubarSeparatorBaseProps
205
+ >(({ className, ...props }, ref) => {
206
+ return <MenubarPrimitive.Separator ref={ref} className={cn('bg-border -mx-1 my-1 h-px', className)} {...props} />;
207
+ });
208
+ MenubarSeparator.displayName = 'MenubarSeparator';
209
+
210
+ export const MenubarShortcut = ({ className, children, ...props }: MenubarShortcutBaseProps) => {
211
+ return (
212
+ <Text className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)} {...props}>
213
+ {children}
214
+ </Text>
8
215
  );
9
216
  };
217
+ MenubarShortcut.displayName = 'MenubarShortcut';
218
+
219
+ export const MenubarSubTrigger = React.forwardRef<
220
+ React.ElementRef<typeof MenubarPrimitive.SubTrigger>,
221
+ MenubarSubTriggerBaseProps
222
+ >(({ className, children, inset, ...props }, ref) => {
223
+ return (
224
+ <MenubarPrimitive.SubTrigger
225
+ ref={ref}
226
+ className={cn(
227
+ 'focus:bg-accent focus:text-accent-foreground active:bg-accent active:text-accent-foreground flex flex-row items-center rounded-sm px-2 py-1.5 text-sm outline-none',
228
+ inset && 'pl-8',
229
+ className,
230
+ )}
231
+ {...props}
232
+ >
233
+ <View className="flex flex-row items-center gap-1.5">{wrapTextChildren(children, Text)}</View>
234
+ <ChevronRight size={14} className="text-foreground ml-auto" />
235
+ </MenubarPrimitive.SubTrigger>
236
+ );
237
+ });
238
+ MenubarSubTrigger.displayName = 'MenubarSubTrigger';
239
+
240
+ export const MenubarSubContent = React.forwardRef<
241
+ React.ElementRef<typeof MenubarPrimitive.SubContent>,
242
+ MenubarSubContentBaseProps
243
+ >(({ className, children, ...props }, ref) => {
244
+ return (
245
+ <MenubarPrimitive.SubContent
246
+ ref={ref}
247
+ className={cn(
248
+ 'bg-popover border-border z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-md',
249
+ className,
250
+ )}
251
+ {...props}
252
+ >
253
+ {children}
254
+ </MenubarPrimitive.SubContent>
255
+ );
256
+ });
257
+ MenubarSubContent.displayName = 'MenubarSubContent';
@@ -1,9 +1,179 @@
1
- import { Text, View } from 'react-native';
1
+ import type {
2
+ NavigationMenuBaseProps,
3
+ NavigationMenuContentBaseProps,
4
+ NavigationMenuIndicatorBaseProps,
5
+ NavigationMenuItemBaseProps,
6
+ NavigationMenuLinkBaseProps,
7
+ NavigationMenuListBaseProps,
8
+ NavigationMenuTriggerBaseProps,
9
+ NavigationMenuViewportBaseProps,
10
+ } from '@gv-tech/ui-core';
11
+ import * as NavigationMenuPrimitive from '@rn-primitives/navigation-menu';
12
+ import { ChevronDown } from 'lucide-react-native';
13
+ import * as React from 'react';
14
+ import { GestureResponderEvent, View } from 'react-native';
15
+ import Animated, { FadeIn, FadeOut } from 'react-native-reanimated';
16
+ import { cn } from './lib/utils';
2
17
 
3
- export const NavigationMenu = () => {
18
+ export const NavigationMenu = React.forwardRef<
19
+ React.ElementRef<typeof NavigationMenuPrimitive.Root>,
20
+ NavigationMenuBaseProps
21
+ >(
22
+ (
23
+ { className, children, value, onValueChange, dir, orientation, delayDuration, skipDelayDuration, ...props },
24
+ ref,
25
+ ) => {
26
+ return (
27
+ <NavigationMenuPrimitive.Root
28
+ ref={ref}
29
+ value={value}
30
+ onValueChange={onValueChange ? (val) => onValueChange(val || '') : () => {}}
31
+ delayDuration={delayDuration}
32
+ skipDelayDuration={skipDelayDuration}
33
+ className={cn('relative z-10 flex flex-row items-center justify-center', className)}
34
+ {...props}
35
+ >
36
+ {children}
37
+ </NavigationMenuPrimitive.Root>
38
+ );
39
+ },
40
+ );
41
+ NavigationMenu.displayName = 'NavigationMenu';
42
+
43
+ export const NavigationMenuList = React.forwardRef<
44
+ React.ElementRef<typeof NavigationMenuPrimitive.List>,
45
+ NavigationMenuListBaseProps
46
+ >(({ className, children, ...props }, ref) => {
47
+ return (
48
+ <NavigationMenuPrimitive.List
49
+ ref={ref}
50
+ className={cn('group flex flex-1 list-none flex-row items-center justify-center gap-1', className)}
51
+ {...props}
52
+ >
53
+ {children}
54
+ </NavigationMenuPrimitive.List>
55
+ );
56
+ });
57
+ NavigationMenuList.displayName = 'NavigationMenuList';
58
+
59
+ export const NavigationMenuItem = React.forwardRef<
60
+ React.ElementRef<typeof NavigationMenuPrimitive.Item>,
61
+ NavigationMenuItemBaseProps
62
+ >(({ className, children, value, ...props }, ref) => {
63
+ return (
64
+ <NavigationMenuPrimitive.Item ref={ref} value={value || ''} className={cn('relative', className)} {...props}>
65
+ {children}
66
+ </NavigationMenuPrimitive.Item>
67
+ );
68
+ });
69
+ NavigationMenuItem.displayName = 'NavigationMenuItem';
70
+
71
+ export const NavigationMenuTrigger = React.forwardRef<
72
+ React.ElementRef<typeof NavigationMenuPrimitive.Trigger>,
73
+ NavigationMenuTriggerBaseProps
74
+ >(({ className, children, disabled, ...props }, ref) => {
75
+ return (
76
+ <NavigationMenuPrimitive.Trigger
77
+ ref={ref}
78
+ disabled={disabled}
79
+ className={cn(
80
+ 'group bg-background hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground active:bg-accent active:text-accent-foreground flex flex-row items-center justify-center gap-1 rounded-md px-4 py-2 text-sm font-medium transition-colors disabled:opacity-50',
81
+ className,
82
+ )}
83
+ {...props}
84
+ >
85
+ <>{children}</>
86
+ <ChevronDown
87
+ size={12}
88
+ className="text-muted-foreground transition-transform duration-200 group-data-[state=open]:rotate-180"
89
+ />
90
+ </NavigationMenuPrimitive.Trigger>
91
+ );
92
+ });
93
+ NavigationMenuTrigger.displayName = 'NavigationMenuTrigger';
94
+
95
+ export const NavigationMenuContent = React.forwardRef<
96
+ React.ElementRef<typeof NavigationMenuPrimitive.Content>,
97
+ NavigationMenuContentBaseProps
98
+ >(({ className, children, forceMount, ...props }, ref) => {
4
99
  return (
5
- <View>
6
- <Text>navigation-menu is not yet implemented for React Native</Text>
100
+ <NavigationMenuPrimitive.Portal>
101
+ <NavigationMenuPrimitive.Content ref={ref} {...props}>
102
+ <Animated.View
103
+ entering={FadeIn.duration(150)}
104
+ exiting={FadeOut.duration(150)}
105
+ className={cn('bg-popover border-border z-50 overflow-hidden rounded-md border p-4 shadow-md', className)}
106
+ >
107
+ {children}
108
+ </Animated.View>
109
+ </NavigationMenuPrimitive.Content>
110
+ </NavigationMenuPrimitive.Portal>
111
+ );
112
+ });
113
+ NavigationMenuContent.displayName = 'NavigationMenuContent';
114
+
115
+ export const NavigationMenuLink = React.forwardRef<
116
+ React.ElementRef<typeof NavigationMenuPrimitive.Link>,
117
+ NavigationMenuLinkBaseProps & { onPress?: () => void }
118
+ >(({ className, children, active, onSelect, onPress, href, ...props }, ref) => {
119
+ const handlePress = (e: GestureResponderEvent) => {
120
+ if (onPress) {
121
+ onPress();
122
+ }
123
+ if (onSelect) {
124
+ onSelect(e as unknown as Event);
125
+ }
126
+ };
127
+
128
+ return (
129
+ <NavigationMenuPrimitive.Link
130
+ ref={ref}
131
+ active={active}
132
+ onPress={handlePress}
133
+ className={cn(
134
+ 'hover:bg-accent hover:text-accent-foreground active:bg-accent active:text-accent-foreground rounded-md px-3 py-2 text-sm font-medium transition-colors',
135
+ active && 'bg-accent text-accent-foreground',
136
+ className,
137
+ )}
138
+ {...props}
139
+ >
140
+ {children}
141
+ </NavigationMenuPrimitive.Link>
142
+ );
143
+ });
144
+ NavigationMenuLink.displayName = 'NavigationMenuLink';
145
+
146
+ export const NavigationMenuViewport = React.forwardRef<
147
+ React.ElementRef<typeof NavigationMenuPrimitive.Viewport>,
148
+ NavigationMenuViewportBaseProps
149
+ >(({ className, forceMount, ...props }, ref) => {
150
+ return (
151
+ <View className="absolute top-full left-0 flex justify-center">
152
+ <NavigationMenuPrimitive.Viewport
153
+ ref={ref}
154
+ className={cn(
155
+ 'origin-top-center bg-popover text-popover-foreground border-border relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border shadow-lg md:w-[var(--radix-navigation-menu-viewport-width)]',
156
+ className,
157
+ )}
158
+ {...props}
159
+ />
7
160
  </View>
8
161
  );
9
- };
162
+ });
163
+ NavigationMenuViewport.displayName = 'NavigationMenuViewport';
164
+
165
+ export const NavigationMenuIndicator = React.forwardRef<
166
+ React.ElementRef<typeof NavigationMenuPrimitive.Indicator>,
167
+ NavigationMenuIndicatorBaseProps
168
+ >(({ className, forceMount, ...props }, ref) => {
169
+ return (
170
+ <NavigationMenuPrimitive.Indicator
171
+ ref={ref}
172
+ className={cn('z-10 flex h-1.5 items-end justify-center overflow-hidden transition-all duration-200', className)}
173
+ {...props}
174
+ >
175
+ <View className="bg-border relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm shadow-md" />
176
+ </NavigationMenuPrimitive.Indicator>
177
+ );
178
+ });
179
+ NavigationMenuIndicator.displayName = 'NavigationMenuIndicator';