"use client"; import type { DropdownMenuProps } from "@radix-ui/react-dropdown-menu"; import { DropdownMenuItemIndicator } from "@radix-ui/react-dropdown-menu"; import { CheckIcon, ChevronRightIcon, FileCodeIcon, Heading1Icon, Heading2Icon, Heading3Icon, Heading4Icon, Heading5Icon, Heading6Icon, InfoIcon, ListIcon, ListOrderedIcon, PilcrowIcon, QuoteIcon, SquareIcon, } from "lucide-react"; import type { TElement } from "platejs"; import { KEYS } from "platejs"; import { useEditorRef, useSelectionFragmentProp } from "platejs/react"; import * as React from "react"; import { getBlockType, setBlockType } from "@/components/editor/transforms"; import { DropdownMenu, DropdownMenuContent, DropdownMenuRadioItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { ToolbarButton, ToolbarMenuGroup } from "./toolbar"; export const turnIntoItems = [ { icon: , keywords: ["paragraph"], label: "Text", value: KEYS.p, }, { icon: , keywords: ["title", "h1"], label: "Heading 1", value: "h1", }, { icon: , keywords: ["subtitle", "h2"], label: "Heading 2", value: "h2", }, { icon: , keywords: ["subtitle", "h3"], label: "Heading 3", value: "h3", }, { icon: , keywords: ["subtitle", "h4"], label: "Heading 4", value: "h4", }, { icon: , keywords: ["subtitle", "h5"], label: "Heading 5", value: "h5", }, { icon: , keywords: ["subtitle", "h6"], label: "Heading 6", value: "h6", }, { icon: , keywords: ["unordered", "ul", "-"], label: "Bulleted list", value: KEYS.ul, }, { icon: , keywords: ["ordered", "ol", "1"], label: "Numbered list", value: KEYS.ol, }, { icon: , keywords: ["checklist", "task", "checkbox", "[]"], label: "To-do list", value: KEYS.listTodo, }, { icon: , keywords: ["```"], label: "Code", value: KEYS.codeBlock, }, { icon: , keywords: ["citation", "blockquote", ">"], label: "Quote", value: KEYS.blockquote, }, { icon: , keywords: ["callout", "note", "info", "warning", "tip"], label: "Callout", value: KEYS.callout, }, { icon: , keywords: ["toggle", "collapsible", "expand"], label: "Toggle", value: KEYS.toggle, }, ]; export function TurnIntoToolbarButton({ tooltip = "Turn into", ...props }: DropdownMenuProps & { tooltip?: React.ReactNode }) { const editor = useEditorRef(); const [open, setOpen] = React.useState(false); const value = useSelectionFragmentProp({ defaultValue: KEYS.p, getProp: (node) => getBlockType(node as TElement), }); const selectedItem = React.useMemo( () => turnIntoItems.find((item) => item.value === (value ?? KEYS.p)) ?? turnIntoItems[0], [value] ); return ( {selectedItem.label} { e.preventDefault(); editor.tf.focus(); }} align="start" > { setBlockType(editor, type); }} label="Turn into" > {turnIntoItems.map(({ icon, label, value: itemValue }) => ( {icon} {label} ))} ); }