a tool for shared writing and social publishing
at main 3.2 kB view raw
1"use client"; 2import * as DropdownMenu from "@radix-ui/react-dropdown-menu"; 3import { theme } from "tailwind.config"; 4import { NestedCardThemeProvider } from "./ThemeManager/ThemeProvider"; 5import { PopoverArrow } from "./Icons/PopoverArrow"; 6import { PopoverOpenContext } from "./Popover/PopoverContext"; 7import { useState } from "react"; 8 9export const Separator = (props: { classname?: string }) => { 10 return <div className={`h-full border-r border-border ${props.classname}`} />; 11}; 12 13export const Menu = (props: { 14 open?: boolean; 15 trigger: React.ReactNode; 16 children: React.ReactNode; 17 align?: "start" | "end" | "center" | undefined; 18 alignOffset?: number; 19 side?: "top" | "bottom" | "right" | "left" | undefined; 20 background?: string; 21 border?: string; 22 className?: string; 23 onOpenChange?: (o: boolean) => void; 24 asChild?: boolean; 25}) => { 26 let [open, setOpen] = useState(props.open || false); 27 return ( 28 <DropdownMenu.Root 29 onOpenChange={(o) => { 30 setOpen(o); 31 props.onOpenChange?.(o); 32 }} 33 open={props.open} 34 > 35 <PopoverOpenContext value={open}> 36 <DropdownMenu.Trigger asChild={props.asChild}> 37 {props.trigger} 38 </DropdownMenu.Trigger> 39 <DropdownMenu.Portal> 40 <NestedCardThemeProvider> 41 <DropdownMenu.Content 42 side={props.side ? props.side : "bottom"} 43 align={props.align ? props.align : "center"} 44 alignOffset={props.alignOffset ? props.alignOffset : undefined} 45 sideOffset={4} 46 collisionPadding={16} 47 className={`dropdownMenu z-20 bg-bg-page flex flex-col p-1 gap-0.5 border border-border rounded-md shadow-md ${props.className}`} 48 > 49 {props.children} 50 <DropdownMenu.Arrow 51 asChild 52 width={16} 53 height={8} 54 viewBox="0 0 16 8" 55 > 56 <PopoverArrow 57 arrowFill={ 58 props.background 59 ? props.background 60 : theme.colors["bg-page"] 61 } 62 arrowStroke={ 63 props.border ? props.border : theme.colors["border"] 64 } 65 /> 66 </DropdownMenu.Arrow> 67 </DropdownMenu.Content> 68 </NestedCardThemeProvider> 69 </DropdownMenu.Portal> 70 </PopoverOpenContext> 71 </DropdownMenu.Root> 72 ); 73}; 74 75export const MenuItem = (props: { 76 children?: React.ReactNode; 77 className?: string; 78 onSelect: (e: Event) => void; 79 id?: string; 80}) => { 81 return ( 82 <DropdownMenu.Item 83 id={props.id} 84 onSelect={(event) => { 85 props.onSelect(event); 86 }} 87 className={` 88 menuItem 89 z-10 py-1! px-2! 90 flex gap-2 91 ${props.className} 92 `} 93 > 94 {props.children} 95 </DropdownMenu.Item> 96 ); 97}; 98 99export const ShortcutKey = (props: { children: React.ReactNode }) => { 100 return ( 101 <span> 102 <code className="min-w-6 w-fit text-xs text-primary bg-border-light border border-secondary rounded-md px-0.5 flex justify-center font-bold "> 103 {props.children} 104 </code> 105 </span> 106 ); 107};