返回 presentation-ai
VariantControl.tsx
根目录 / src / components / presentation / floating-toolbar / VariantControl.tsx
1 "use client";
2
3 import { LayoutTemplate } from "lucide-react";
4 import * as React from "react";
5
6 import {
7 DropdownMenu,
8 DropdownMenuContent,
9 DropdownMenuRadioItem,
10 DropdownMenuTrigger,
11 } from "@/components/plate/ui/dropdown-menu";
12 import {
13 ToolbarButton,
14 ToolbarGroup,
15 ToolbarMenuGroup,
16 } from "@/components/plate/ui/toolbar";
17 import { useToolbarContext } from "./ToolbarContext";
18
19 export function VariantControl() {
20 const [open, setOpen] = React.useState(false);
21 const {
22 supportsVariantControl,
23 currentVariant,
24 variantOptions,
25 handleNodePropertyUpdate,
26 } = useToolbarContext();
27
28 if (!supportsVariantControl || variantOptions.length === 0) {
29 return null;
30 }
31
32 return (
33 <ToolbarGroup>
34 <DropdownMenu open={open} onOpenChange={setOpen} modal={false}>
35 <DropdownMenuTrigger asChild>
36 <ToolbarButton
37 className="min-w-25"
38 pressed={open}
39 tooltip="Change Variant"
40 isDropdown
41 >
42 <LayoutTemplate className="size-4" />
43 <span className="capitalize">
44 {currentVariant === "inside" ? "Inside Text" : currentVariant}
45 </span>
46 </ToolbarButton>
47 </DropdownMenuTrigger>
48 <DropdownMenuContent
49 className="ignore-click-outside/toolbar min-w-0"
50 align="start"
51 >
52 <ToolbarMenuGroup
53 value={currentVariant}
54 onValueChange={(variant) => {
55 handleNodePropertyUpdate("variant", variant);
56 }}
57 label="Variant"
58 >
59 {variantOptions.map((option) => (
60 <DropdownMenuRadioItem key={option} value={option}>
61 <span className="capitalize">
62 {option === "inside" ? "Inside Text" : option}
63 </span>
64 </DropdownMenuRadioItem>
65 ))}
66 </ToolbarMenuGroup>
67 </DropdownMenuContent>
68 </DropdownMenu>
69 </ToolbarGroup>
70 );
71 }
72
72 lines Plain Text