a tool for shared writing and social publishing
1"use client"; 2import * as RadixPopover from "@radix-ui/react-popover"; 3import { theme } from "tailwind.config"; 4import { NestedCardThemeProvider } from "./ThemeManager/ThemeProvider"; 5import { createContext, useEffect, useState } from "react"; 6import { PopoverArrow } from "./Icons/PopoverArrow"; 7 8export const PopoverOpenContext = createContext(false); 9export const Popover = (props: { 10 trigger: React.ReactNode; 11 disabled?: boolean; 12 children: React.ReactNode; 13 align?: "start" | "end" | "center"; 14 side?: "top" | "bottom" | "left" | "right"; 15 background?: string; 16 border?: string; 17 className?: string; 18 open?: boolean; 19 onOpenChange?: (open: boolean) => void; 20 onOpenAutoFocus?: (e: Event) => void; 21 asChild?: boolean; 22 arrowFill?: string; 23}) => { 24 let [open, setOpen] = useState(props.open || false); 25 useEffect(() => { 26 if (props.open !== undefined) setOpen(props.open); 27 }, [props.open]); 28 return ( 29 <RadixPopover.Root 30 open={props.open} 31 onOpenChange={(o) => { 32 setOpen(o); 33 props.onOpenChange?.(o); 34 }} 35 > 36 <PopoverOpenContext value={open}> 37 <RadixPopover.Trigger disabled={props.disabled} asChild={props.asChild}> 38 {props.trigger} 39 </RadixPopover.Trigger> 40 <RadixPopover.Portal> 41 <NestedCardThemeProvider> 42 <RadixPopover.Content 43 className={` 44 z-20 bg-bg-page 45 px-3 py-2 46 max-w-(--radix-popover-content-available-width) 47 max-h-(--radix-popover-content-available-height) 48 border border-border rounded-md shadow-md 49 overflow-y-scroll 50 ${props.className} 51 `} 52 side={props.side} 53 align={props.align ? props.align : "center"} 54 sideOffset={4} 55 collisionPadding={16} 56 onOpenAutoFocus={props.onOpenAutoFocus} 57 > 58 {props.children} 59 <RadixPopover.Arrow 60 asChild 61 width={16} 62 height={8} 63 viewBox="0 0 16 8" 64 > 65 <PopoverArrow 66 arrowFill={ 67 props.arrowFill 68 ? props.arrowFill 69 : props.background 70 ? props.background 71 : theme.colors["bg-page"] 72 } 73 arrowStroke={ 74 props.border ? props.border : theme.colors["border"] 75 } 76 /> 77 </RadixPopover.Arrow> 78 </RadixPopover.Content> 79 </NestedCardThemeProvider> 80 </RadixPopover.Portal> 81 </PopoverOpenContext> 82 </RadixPopover.Root> 83 ); 84};