返回 DeepSeek-Reasonix
InvocationBadge.tsx
根目录 / desktop / frontend / src / components / InvocationBadge.tsx
1 import { Bot, WandSparkles, X } from "lucide-react";
2 import type { CSSProperties } from "react";
3 import type { InvocationDisplay } from "../lib/invocationDisplay";
4 import { projectColorValue } from "../lib/projectColors";
5 import { useT } from "../lib/i18n";
6 import { Tooltip } from "./Tooltip";
7
8 export function InvocationBadge({
9 invocation,
10 kind = "skill",
11 description,
12 onRemove,
13 variant,
14 }: {
15 invocation: InvocationDisplay;
16 kind?: "skill" | "subagent";
17 description?: string;
18 onRemove?: () => void;
19 variant: "composer" | "message";
20 }) {
21 const t = useT();
22 const accent = projectColorValue(invocation.color);
23 return (
24 <span
25 className={`invocation-display invocation-display--${variant} invocation-display--${kind}${accent ? " invocation-display--custom-color" : ""}`}
26 role="group"
27 aria-label={t("composer.selectedInvocation")}
28 style={accent ? { "--invocation-color": accent } as CSSProperties : undefined}
29 >
30 <Tooltip label={description || `/${invocation.name}`}>
31 <span className="invocation-display__identity">
32 {kind === "subagent"
33 ? <Bot size={variant === "composer" ? 18 : 16} />
34 : <WandSparkles size={variant === "composer" ? 18 : 16} />}
35 <span className="invocation-display__name">{invocation.label}</span>
36 {invocation.source && <span className="invocation-display__source">{t("slash.plugin", { name: invocation.source })}</span>}
37 </span>
38 </Tooltip>
39 {onRemove && (
40 <Tooltip label={t("composer.removeInvocation")}>
41 <button
42 type="button"
43 className="invocation-display__remove"
44 onClick={onRemove}
45 aria-label={t("composer.removeInvocationNamed", { name: invocation.label })}
46 >
47 <X size={14} />
48 </button>
49 </Tooltip>
50 )}
51 </span>
52 );
53 }
54
54 lines Plain Text