Popover
Displays rich content in a portal, triggered by a button.
Installation
bash npx @moe/cli add popover Install the following dependency:
npx expo install @rn-primitives/popoverCopy/paste the following code to @/components/ui/popover.tsx
import * as PopoverPrimitive from "@rn-primitives/popover";
import * as React from "react";
import { Platform, StyleSheet } from "react-native";
import Animated, { FadeIn, FadeOut } from "react-native-reanimated";
import { cn } from "@/lib/utils";
import { TextClassContext } from "@/components/ui/text";
const Popover = PopoverPrimitive.Root;
const PopoverTrigger = PopoverPrimitive.Trigger;
const PopoverContent = React.forwardRef<
React.ElementRef<typeof PopoverPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>
>(({ className, align = "center", sideOffset = 4, ...props }, ref) => {
return (
<PopoverPrimitive.Portal>
<PopoverPrimitive.Overlay
style={Platform.OS !== "web" ? StyleSheet.absoluteFill : undefined}
>
<Animated.View entering={FadeIn} exiting={FadeOut}>
<TextClassContext.Provider value="text-popover-foreground">
<PopoverPrimitive.Content
ref={ref}
align={align}
sideOffset={sideOffset}
className={cn(
"z-50 w-72 rounded-md border border-border bg-popover p-4 shadow-md shadow-foreground/5 web:outline-none",
className,
)}
{...props}
/>
</TextClassContext.Provider>
</Animated.View>
</PopoverPrimitive.Overlay>
</PopoverPrimitive.Portal>
);
});
PopoverContent.displayName = PopoverPrimitive.Content.displayName;
export { Popover, PopoverContent, PopoverTrigger };Usage