Skip to content

Commit

Permalink
feat: update tooltip layout and organize modifiers (#1196)
Browse files Browse the repository at this point in the history
Co-authored-by: Niall Maher <nialljoemaher@gmail.com>
  • Loading branch information
dineshsutihar and NiallJoeMaher authored Oct 31, 2024
1 parent 5f1f760 commit 69625c1
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 69 deletions.
50 changes: 23 additions & 27 deletions components/editor/editor/components/bubble-menu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { useState } from "react";
import {
BoldIcon,
ItalicIcon,
CodeIcon,
} from "lucide-react";

import { NodeSelector } from "./node-selector";
Expand All @@ -25,22 +24,16 @@ export const EditorBubbleMenu: FC<EditorBubbleMenuProps> = (props) => {
const items: BubbleMenuItem[] = [
{
name: "bold",
isActive: () => props.editor.isActive("bold"),
command: () => props.editor.chain().focus().toggleBold().run(),
isActive: () => props.editor?.isActive("bold") ?? false,
command: () => props.editor?.chain().focus().toggleBold().run(),
icon: BoldIcon,
},
{
name: "italic",
isActive: () => props.editor.isActive("italic"),
command: () => props.editor.chain().focus().toggleItalic().run(),
isActive: () => props.editor?.isActive("italic") ?? false,
command: () => props.editor?.chain().focus().toggleItalic().run(),
icon: ItalicIcon,
},
{
name: "code",
isActive: () => props.editor.isActive("code"),
command: () => props.editor.chain().focus().toggleCode().run(),
icon: CodeIcon,
},
];

const bubbleMenuProps: EditorBubbleMenuProps = {
Expand Down Expand Up @@ -79,22 +72,16 @@ export const EditorBubbleMenu: FC<EditorBubbleMenuProps> = (props) => {
{...bubbleMenuProps}
className="flex w-fit divide-x divide-stone-200 rounded border border-stone-200 bg-white shadow-xl"
>
<NodeSelector
editor={props.editor}
isOpen={isNodeSelectorOpen}
setIsOpen={() => {
setIsNodeSelectorOpen(!isNodeSelectorOpen);
setIsLinkSelectorOpen(false);
}}
/>
<LinkSelector
editor={props.editor}
isOpen={isLinkSelectorOpen}
setIsOpen={() => {
setIsLinkSelectorOpen(!isLinkSelectorOpen);
setIsNodeSelectorOpen(false);
}}
/>
{props.editor && (
<NodeSelector
editor={props.editor}
isOpen={isNodeSelectorOpen}
setIsOpen={() => {
setIsNodeSelectorOpen(!isNodeSelectorOpen);
setIsLinkSelectorOpen(false);
}}
/>
)}
<div className="flex">
{items.map((item, index) => (
<button
Expand All @@ -110,6 +97,15 @@ export const EditorBubbleMenu: FC<EditorBubbleMenuProps> = (props) => {
/>
</button>
))}
{props.editor && (
<LinkSelector
editor={props.editor}
isOpen={isLinkSelectorOpen}
setIsOpen={() => {
setIsLinkSelectorOpen(!isLinkSelectorOpen);
}}
/>
)}
</div>
</BubbleMenu>
);
Expand Down
11 changes: 4 additions & 7 deletions components/editor/editor/components/link-selector.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { cn, getUrlFromString } from "@/utils/utils";
import type { Editor } from "@tiptap/core";
import { Check, Trash } from "lucide-react";
import { Link } from "lucide-react";
import type { Dispatch, FC, SetStateAction } from "react";
import { useEffect, useRef, useCallback } from "react";

Expand Down Expand Up @@ -60,14 +60,11 @@ export const LinkSelector: FC<LinkSelectorProps> = ({
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"
onClick={setLink}
>
<p className="text-base"></p>
<p
className={cn("underline decoration-stone-400 underline-offset-4", {
<Link
className={cn("h-4 w-4", {
"text-blue-500": editor.isActive("link"),
})}
>
Link
</p>
/>
</button>
{/* {isOpen && (
<form
Expand Down
43 changes: 8 additions & 35 deletions components/editor/editor/components/node-selector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,8 @@ import type { Editor } from "@tiptap/core";
import {
Check,
ChevronDown,
Heading1,
Heading2,
Heading3,
TextQuote,
ListOrdered,
TextIcon,
Code,
CheckSquare,
Heading,
} from "lucide-react";
import type { Dispatch, FC, SetStateAction } from "react";
Expand All @@ -28,17 +22,6 @@ export const NodeSelector: FC<NodeSelectorProps> = ({
setIsOpen,
}) => {
const items: BubbleMenuItem[] = [
{
name: "Text",
icon: TextIcon,
command: () =>
editor.chain().focus().toggleNode("paragraph", "paragraph").run(),
// I feel like there has to be a more efficient way to do this – feel free to PR if you know how!
isActive: () =>
editor.isActive("paragraph") &&
!editor.isActive("bulletList") &&
!editor.isActive("orderedList"),
},
{
name: "Heading",
icon: Heading,
Expand All @@ -51,6 +34,13 @@ export const NodeSelector: FC<NodeSelectorProps> = ({
command: () => editor.chain().focus().toggleHeading({ level: 3 }).run(),
isActive: () => editor.isActive("heading", { level: 3 }),
},
{
name: "Text",
icon: TextIcon,
command: () =>
editor.chain().focus().toggleNode("paragraph", "paragraph").run(),
isActive: () => editor.isActive("paragraph"),
},
{
name: "Quote",
icon: TextQuote,
Expand All @@ -63,24 +53,6 @@ export const NodeSelector: FC<NodeSelectorProps> = ({
.run(),
isActive: () => editor.isActive("blockquote"),
},
{
name: "Code",
icon: Code,
command: () => editor.chain().focus().toggleCodeBlock().run(),
isActive: () => editor.isActive("codeBlock"),
},
{
name: "Bullet List",
icon: ListOrdered,
command: () => editor.chain().focus().toggleBulletList().run(),
isActive: () => editor.isActive("bulletList"),
},
{
name: "Numbered List",
icon: ListOrdered,
command: () => editor.chain().focus().toggleOrderedList().run(),
isActive: () => editor.isActive("orderedList"),
},
];

const activeItem = items.filter((item) => item.isActive()).pop() ?? {
Expand All @@ -93,6 +65,7 @@ export const NodeSelector: FC<NodeSelectorProps> = ({
type="button"
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"
onClick={() => setIsOpen(!isOpen)}
aria-expanded={isOpen}
>
<span>{activeItem?.name}</span>
<ChevronDown className="h-4 w-4" />
Expand Down

0 comments on commit 69625c1

Please sign in to comment.