Skip to content

Commit 8f3c7a6

Browse files
committed
feat: update tooltip layout and organize modifiers
1 parent 2cb44b3 commit 8f3c7a6

File tree

3 files changed

+35
-69
lines changed

3 files changed

+35
-69
lines changed

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

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { useState } from "react";
55
import {
66
BoldIcon,
77
ItalicIcon,
8-
CodeIcon,
98
} from "lucide-react";
109

1110
import { NodeSelector } from "./node-selector";
@@ -25,22 +24,16 @@ export const EditorBubbleMenu: FC<EditorBubbleMenuProps> = (props) => {
2524
const items: BubbleMenuItem[] = [
2625
{
2726
name: "bold",
28-
isActive: () => props.editor.isActive("bold"),
29-
command: () => props.editor.chain().focus().toggleBold().run(),
27+
isActive: () => props.editor?.isActive("bold") ?? false,
28+
command: () => props.editor?.chain().focus().toggleBold().run(),
3029
icon: BoldIcon,
3130
},
3231
{
3332
name: "italic",
34-
isActive: () => props.editor.isActive("italic"),
35-
command: () => props.editor.chain().focus().toggleItalic().run(),
33+
isActive: () => props.editor?.isActive("italic") ?? false,
34+
command: () => props.editor?.chain().focus().toggleItalic().run(),
3635
icon: ItalicIcon,
3736
},
38-
{
39-
name: "code",
40-
isActive: () => props.editor.isActive("code"),
41-
command: () => props.editor.chain().focus().toggleCode().run(),
42-
icon: CodeIcon,
43-
},
4437
];
4538

4639
const bubbleMenuProps: EditorBubbleMenuProps = {
@@ -79,22 +72,16 @@ export const EditorBubbleMenu: FC<EditorBubbleMenuProps> = (props) => {
7972
{...bubbleMenuProps}
8073
className="flex w-fit divide-x divide-stone-200 rounded border border-stone-200 bg-white shadow-xl"
8174
>
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-
/>
75+
{props.editor && (
76+
<NodeSelector
77+
editor={props.editor}
78+
isOpen={isNodeSelectorOpen}
79+
setIsOpen={() => {
80+
setIsNodeSelectorOpen(!isNodeSelectorOpen);
81+
setIsLinkSelectorOpen(false);
82+
}}
83+
/>
84+
)}
9885
<div className="flex">
9986
{items.map((item, index) => (
10087
<button
@@ -110,6 +97,15 @@ export const EditorBubbleMenu: FC<EditorBubbleMenuProps> = (props) => {
11097
/>
11198
</button>
11299
))}
100+
{props.editor && (
101+
<LinkSelector
102+
editor={props.editor}
103+
isOpen={isLinkSelectorOpen}
104+
setIsOpen={() => {
105+
setIsLinkSelectorOpen(!isLinkSelectorOpen);
106+
}}
107+
/>
108+
)}
113109
</div>
114110
</BubbleMenu>
115111
);

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

Lines changed: 4 additions & 7 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 { Link } 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+
<Link
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

components/editor/editor/components/node-selector.tsx

Lines changed: 8 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,8 @@ import type { Editor } from "@tiptap/core";
22
import {
33
Check,
44
ChevronDown,
5-
Heading1,
6-
Heading2,
7-
Heading3,
85
TextQuote,
9-
ListOrdered,
106
TextIcon,
11-
Code,
12-
CheckSquare,
137
Heading,
148
} from "lucide-react";
159
import type { Dispatch, FC, SetStateAction } from "react";
@@ -28,17 +22,6 @@ export const NodeSelector: FC<NodeSelectorProps> = ({
2822
setIsOpen,
2923
}) => {
3024
const items: BubbleMenuItem[] = [
31-
{
32-
name: "Text",
33-
icon: TextIcon,
34-
command: () =>
35-
editor.chain().focus().toggleNode("paragraph", "paragraph").run(),
36-
// I feel like there has to be a more efficient way to do this – feel free to PR if you know how!
37-
isActive: () =>
38-
editor.isActive("paragraph") &&
39-
!editor.isActive("bulletList") &&
40-
!editor.isActive("orderedList"),
41-
},
4225
{
4326
name: "Heading",
4427
icon: Heading,
@@ -51,6 +34,13 @@ export const NodeSelector: FC<NodeSelectorProps> = ({
5134
command: () => editor.chain().focus().toggleHeading({ level: 3 }).run(),
5235
isActive: () => editor.isActive("heading", { level: 3 }),
5336
},
37+
{
38+
name: "Text",
39+
icon: TextIcon,
40+
command: () =>
41+
editor.chain().focus().toggleNode("paragraph", "paragraph").run(),
42+
isActive: () => editor.isActive("paragraph"),
43+
},
5444
{
5545
name: "Quote",
5646
icon: TextQuote,
@@ -63,24 +53,6 @@ export const NodeSelector: FC<NodeSelectorProps> = ({
6353
.run(),
6454
isActive: () => editor.isActive("blockquote"),
6555
},
66-
{
67-
name: "Code",
68-
icon: Code,
69-
command: () => editor.chain().focus().toggleCodeBlock().run(),
70-
isActive: () => editor.isActive("codeBlock"),
71-
},
72-
{
73-
name: "Bullet List",
74-
icon: ListOrdered,
75-
command: () => editor.chain().focus().toggleBulletList().run(),
76-
isActive: () => editor.isActive("bulletList"),
77-
},
78-
{
79-
name: "Numbered List",
80-
icon: ListOrdered,
81-
command: () => editor.chain().focus().toggleOrderedList().run(),
82-
isActive: () => editor.isActive("orderedList"),
83-
},
8456
];
8557

8658
const activeItem = items.filter((item) => item.isActive()).pop() ?? {
@@ -93,6 +65,7 @@ export const NodeSelector: FC<NodeSelectorProps> = ({
9365
type="button"
9466
className="flex h-full items-center gap-1 whitespace-nowrap p-2 text-sm font-medium text-stone-600 hover:bg-stone-100 active:bg-stone-200"
9567
onClick={() => setIsOpen(!isOpen)}
68+
aria-expanded={isOpen}
9669
>
9770
<span>{activeItem?.name}</span>
9871
<ChevronDown className="h-4 w-4" />

0 commit comments

Comments
 (0)