Skip to content

Commit 21e22d4

Browse files
committed
feat: update tooltip icons and layout in alpha editor
1 parent 2cb44b3 commit 21e22d4

2 files changed

Lines changed: 48 additions & 38 deletions

File tree

‎components/editor/editor/components/bubble-menu.tsx‎

Lines changed: 43 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ import {
66
BoldIcon,
77
ItalicIcon,
88
CodeIcon,
9+
QuoteIcon,
10+
MinusSquareIcon,
11+
Type as TextIcon,
12+
Heading,
913
} from "lucide-react";
10-
11-
import { NodeSelector } from "./node-selector";
1214
import { LinkSelector } from "./link-selector";
1315
import { cn } from "@/utils/utils";
1416

@@ -23,34 +25,56 @@ type EditorBubbleMenuProps = Omit<Required<Pick<BubbleMenuProps, "editor">> & Bu
2325

2426
export const EditorBubbleMenu: FC<EditorBubbleMenuProps> = (props) => {
2527
const items: BubbleMenuItem[] = [
28+
{
29+
name: "heading",
30+
isActive: () => props.editor?.isActive("heading", { level: 2 }) ?? false,
31+
command: () => props.editor?.chain().focus().toggleHeading({ level: 2 }).run(),
32+
icon: Heading,
33+
},
34+
{
35+
name: "text",
36+
isActive: () => props.editor?.isActive("paragraph") ?? false,
37+
command: () => props.editor?.chain().focus().setParagraph().run(),
38+
icon: TextIcon,
39+
},
2640
{
2741
name: "bold",
28-
isActive: () => props.editor.isActive("bold"),
29-
command: () => props.editor.chain().focus().toggleBold().run(),
42+
isActive: () => props.editor?.isActive("bold") ?? false,
43+
command: () => props.editor?.chain().focus().toggleBold().run(),
3044
icon: BoldIcon,
3145
},
3246
{
3347
name: "italic",
34-
isActive: () => props.editor.isActive("italic"),
35-
command: () => props.editor.chain().focus().toggleItalic().run(),
48+
isActive: () => props.editor?.isActive("italic") ?? false,
49+
command: () => props.editor?.chain().focus().toggleItalic().run(),
3650
icon: ItalicIcon,
3751
},
3852
{
3953
name: "code",
40-
isActive: () => props.editor.isActive("code"),
41-
command: () => props.editor.chain().focus().toggleCode().run(),
54+
isActive: () => props.editor?.isActive("code") ?? false,
55+
command: () => props.editor?.chain().focus().toggleCode().run(),
4256
icon: CodeIcon,
4357
},
58+
{
59+
name: "quote",
60+
isActive: () => props.editor?.isActive("blockquote") ?? false,
61+
command: () => props.editor?.chain().focus().toggleBlockquote().run(),
62+
icon: QuoteIcon,
63+
},
64+
{
65+
name: "horizontalRule",
66+
isActive: () => false,
67+
command: () => props.editor?.chain().focus().setHorizontalRule().run(),
68+
icon: MinusSquareIcon,
69+
},
4470
];
4571

4672
const bubbleMenuProps: EditorBubbleMenuProps = {
4773
...props,
4874
shouldShow: ({ editor }) => {
49-
// don't show if image is selected or a heading
50-
if (editor.isActive("image") || editor.isActive("heading")) {
75+
if (editor.isActive("image")) {
5176
return false;
5277
}
53-
5478
try {
5579
if (editor.view.state.selection.$from.before() === 0) {
5680
return false;
@@ -65,36 +89,18 @@ export const EditorBubbleMenu: FC<EditorBubbleMenuProps> = (props) => {
6589
tippyOptions: {
6690
moveTransition: "transform 0.15s ease-out",
6791
onHidden: () => {
68-
setIsNodeSelectorOpen(false);
6992
setIsLinkSelectorOpen(false);
7093
},
7194
},
7295
};
7396

74-
const [isNodeSelectorOpen, setIsNodeSelectorOpen] = useState(false);
7597
const [isLinkSelectorOpen, setIsLinkSelectorOpen] = useState(false);
7698

7799
return (
78100
<BubbleMenu
79101
{...bubbleMenuProps}
80102
className="flex w-fit divide-x divide-stone-200 rounded border border-stone-200 bg-white shadow-xl"
81103
>
82-
<NodeSelector
83-
editor={props.editor}
84-
isOpen={isNodeSelectorOpen}
85-
setIsOpen={() => {
86-
setIsNodeSelectorOpen(!isNodeSelectorOpen);
87-
setIsLinkSelectorOpen(false);
88-
}}
89-
/>
90-
<LinkSelector
91-
editor={props.editor}
92-
isOpen={isLinkSelectorOpen}
93-
setIsOpen={() => {
94-
setIsLinkSelectorOpen(!isLinkSelectorOpen);
95-
setIsNodeSelectorOpen(false);
96-
}}
97-
/>
98104
<div className="flex">
99105
{items.map((item, index) => (
100106
<button
@@ -111,6 +117,13 @@ export const EditorBubbleMenu: FC<EditorBubbleMenuProps> = (props) => {
111117
</button>
112118
))}
113119
</div>
120+
<LinkSelector
121+
editor={props.editor!}
122+
isOpen={isLinkSelectorOpen}
123+
setIsOpen={() => {
124+
setIsLinkSelectorOpen(!isLinkSelectorOpen);
125+
}}
126+
/>
114127
</BubbleMenu>
115128
);
116-
};
129+
};

‎components/editor/editor/components/link-selector.tsx‎

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { cn, getUrlFromString } from "@/utils/utils";
22
import type { Editor } from "@tiptap/core";
3-
import { Check, Trash } from "lucide-react";
3+
import { Link2Icon } from "lucide-react";
44
import type { Dispatch, FC, SetStateAction } from "react";
55
import { useEffect, useRef, useCallback } from "react";
66

@@ -60,14 +60,11 @@ export const LinkSelector: FC<LinkSelectorProps> = ({
6060
className="flex h-full items-center space-x-2 px-3 py-1.5 text-sm font-medium text-stone-600 hover:bg-stone-100 active:bg-stone-200"
6161
onClick={setLink}
6262
>
63-
<p className="text-base">↗</p>
64-
<p
65-
className={cn("underline decoration-stone-400 underline-offset-4", {
63+
<Link2Icon
64+
className={cn("h-4 w-4", {
6665
"text-blue-500": editor.isActive("link"),
6766
})}
68-
>
69-
Link
70-
</p>
67+
/>
7168
</button>
7269
{/* {isOpen && (
7370
<form
@@ -106,4 +103,4 @@ export const LinkSelector: FC<LinkSelectorProps> = ({
106103
)} */}
107104
</div>
108105
);
109-
};
106+
};

0 commit comments

Comments
 (0)