返回 presentation-ai
line-height-toolbar-button.tsx
根目录 / src / components / plate / ui / line-height-toolbar-button.tsx
1 "use client";
2
3 import { LineHeightPlugin } from "@platejs/basic-styles/react";
4 import {
5 DropdownMenuItemIndicator,
6 type DropdownMenuProps,
7 } from "@radix-ui/react-dropdown-menu";
8 import { CheckIcon, WrapText } from "lucide-react";
9 import { useEditorRef, useSelectionFragmentProp } from "platejs/react";
10 import * as React from "react";
11
12 import {
13 DropdownMenu,
14 DropdownMenuContent,
15 DropdownMenuRadioGroup,
16 DropdownMenuRadioItem,
17 DropdownMenuTrigger,
18 } from "@/components/plate/ui/dropdown-menu";
19 import { ToolbarButton } from "./toolbar";
20
21 export function LineHeightToolbarButton(props: DropdownMenuProps) {
22 const editor = useEditorRef();
23 const { defaultNodeValue, validNodeValues: values = [] } =
24 editor.getInjectProps(LineHeightPlugin);
25
26 const value = useSelectionFragmentProp({
27 defaultValue: defaultNodeValue,
28 getProp: (node) => node.lineHeight,
29 });
30
31 const [open, setOpen] = React.useState(false);
32
33 return (
34 <DropdownMenu open={open} onOpenChange={setOpen} modal={false} {...props}>
35 <DropdownMenuTrigger asChild>
36 <ToolbarButton pressed={open} tooltip="Line height" isDropdown>
37 <WrapText />
38 </ToolbarButton>
39 </DropdownMenuTrigger>
40
41 <DropdownMenuContent className="min-w-0" align="start">
42 <DropdownMenuRadioGroup
43 value={value}
44 onValueChange={(newValue) => {
45 editor
46 .getTransforms(LineHeightPlugin)
47 .lineHeight.setNodes(Number(newValue));
48 editor.tf.focus();
49 }}
50 >
51 {values.map((value) => (
52 <DropdownMenuRadioItem
53 key={value}
54 className="min-w-45 pl-2 [span]:first:*:hidden"
55 value={value}
56 >
57 <span className="pointer-events-none absolute right-2 flex size-3.5 items-center justify-center">
58 <DropdownMenuItemIndicator>
59 <CheckIcon />
60 </DropdownMenuItemIndicator>
61 </span>
62 {value}
63 </DropdownMenuRadioItem>
64 ))}
65 </DropdownMenuRadioGroup>
66 </DropdownMenuContent>
67 </DropdownMenu>
68 );
69 }
70
70 lines Plain Text