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