avatar
UI
Components
Changelog
LobeHub UI
Antd Components
Lucide Icons
CSSinJS
Ctrl
K
Chat
ChatInputArea
ChatItem
EditableMessage
Data Display
Card
ChatMarkdown
CollapseGroup
Descriptions
Highlighter
JsonViewer
LogViewer
ProCard
RichTextEditor
Status
Table
Tree
Data Entry
CodeEditor
Form
Mentions
MonacoEditor
SelectCard
SliderInput
Feedback
Alert
DragPanel
Drawer
Modal
Notification
General
Breadcrumb
Typography
WaveformIcon
Layout
Divider
Page
Navigation
ButtonGroup
Dropdown
Theme
ConfigProvider
Logo
TTS
useSpeechSynthes
Utils
FormHelper

Mentions

Based on lexical editor, inspired by Dify and lexical-beautiful-mentions.

import { Mentions } from '@yuntijs/ui';
NPM
UNPKG
BundlePhobia
PackagePhobia
Anvaka Graph
Source
Edit
Previous
Form
Next
MonacoEditor

Resources

Lobe UI-AIGC Components
Lobe Icon-AI / LLM Icon Collection
Lobe Charts-Modern Charts
Lobe TTS-TTS / STT Library

Community

Report Bug
Request Feature

Help

GitHub
Changelog

More Products

🤯 Lobe Chat-AI / LLM Chat Framework
🧸 Lobe Vidol-Virtual Idols for EveryOne
🅰️ Lobe Theme-Stable Diffusion Extension
🌐 Lobe i18n-AI i18next CLI
Copyright © 2022-2026
Made with ☁️ by YuntiJS
LobeHub

Usage

Based on lexical editor, inspired by Dify and lexical-beautiful-mentions.

Simple usage

TSX
import { Icon } from '@lobehub/ui';
import { Mentions } from '@yuntijs/ui';
import { Smile } from 'lucide-react';

export default () => {
  return (
    <Mentions
      autoSize={{
        minRows: 3,
      }}
      defaultValue="👋,I'm {{1.zhang}}"
      options={[{ label: 'zhang', value: '1.zhang', icon: <Icon icon={Smile} /> }]}
      triggers={['@']}
    />
  );
};

Chat input

Press shift + enter for line break, press enter to send and clear input.

Single line

JSON input

Playground

APIs

NameDescriptionTypeDefault
className--string--
classNames--{wrapper?:string;menuOverlay?:string}--
wrapperClassname--string--
placeholder--ReactNode--
style--{}--
value--string--
defaultValue--string--
readOnly--boolean--
disabled--boolean--
onChange--(text:string)=>void--
onBlur--()=>void--
onFocus--()=>void--
onPressEnter按下回车的回调,指定后会改变回车的默认行为,换行需要使用 shift + enter(value:string,__1:{ event: KeyboardEvent | null; })=>void--
onKeyDown用户输入 trigger 后的回调; 按下键盘的回调(event:KeyboardEvent | null)=>void--
onTrigger用户输入 trigger 后的回调(trigger:string)=>void--
variant--"outlined"|"borderless"|"filled"--
autoSize--{minRows?:number;maxRows?:number}--
code--boolean--
getPopContainer--()=>HTMLElement--
autoFocus--"rootStart"|"rootEnd"--
extraNodes--{length:number;toString:()=>string;toLocaleString:()=>string;concat:(items:ConcatArray<T>[])=>T[]|(items:(T | ConcatArray<T>)[])=>T[];join:(separator?:string)=>string;slice:(start?:number,end?:number)=>T[];indexOf:(searchElement:T,fromIndex?:number)=>number;lastIndexOf:(searchElement:T,fromIndex?:number)=>number;every:(predicate:(value: T, index: number, array: readonly T[]) => value is S,thisArg?:any)=>boolean|(predicate:(value: T, index: number, array: readonly T[]) => unknown,thisArg?:any)=>boolean;some:(predicate:(value: T, index: number, array: readonly T[]) => unknown,thisArg?:any)=>boolean;forEach:(callbackfn:(value: T, index: number, array: readonly T[]) => void,thisArg?:any)=>void;map:(callbackfn:(value: T, index: number, array: readonly T[]) => U,thisArg?:any)=>U[];filter:(predicate:(value: T, index: number, array: readonly T[]) => value is S,thisArg?:any)=>S[]|(predicate:(value: T, index: number, array: readonly T[]) => unknown,thisArg?:any)=>T[];reduce:(callbackfn:(previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T)=>any|(callbackfn:(previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T,initialValue:T)=>any|(callbackfn:(previousValue: U, currentValue: T, currentIndex: number, array: readonly T[]) => U,initialValue:U)=>any;reduceRight:(callbackfn:(previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T)=>any|(callbackfn:(previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T,initialValue:T)=>any|(callbackfn:(previousValue: U, currentValue: T, currentIndex: number, array: readonly T[]) => U,initialValue:U)=>any;find:(predicate:(this: void, value: T, index: number, obj: readonly T[]) => value is S,thisArg?:any)=>any|(predicate:(value: T, index: number, obj: readonly T[]) => unknown,thisArg?:any)=>any;findIndex:(predicate:(value: T, index: number, obj: readonly T[]) => unknown,thisArg?:any)=>number;entries:unknown;keys:unknown;values:()=>unknown;includes:(searchElement:T,fromIndex?:number)=>boolean;flatMap:(callback:(this: This, value: T, index: number, array: T[]) => U | readonly U[],thisArg?:This)=>U[];flat:(depth?:D)=>FlatArray<A_D>[];__@iterator@1032:()=>unknown}--
overlayClassNameThe className of menu overlaystring--
optionsThe options of menuMentionOption[]--
triggersThe characters that trigger the mention menu. Needed to tell the plugin when to call the query function.string[](required)
allowSpacesIf `true`, mentions can contain spaces.booleantrue
punctuationRegular expression that matches punctuation characters when looking for mentions. In addition to spaces, these characters can appear directly after a mention. E.g. `@John!` or `@John,`.string"\\.,\\*\\?\\$\\|#{}\\(\\)\\^\\[\\]\\/!%'\\\"~=<>_:;"
preTriggerCharsRegular expression that matches characters that can appear directly before the trigger character.string"\\("
onSelectWhen mention selected, this func will be called(option:import("/src/Mentions/plugins/mention-picker/utils").MentionMenuOption,trigger:string | null,queryString:string | null)=>void--
parentParent elementHTMLElement--
onOpen--(resolution:import("/node_modules/@lexical/react/shared/LexicalMenu").MenuResolution)=>void--
children--ReactNode--
refAllows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref).|bivarianceHack|RefObject--
key--Key|--
输入 @ 或 # 插入引用
输入 @ 或 # 插入引用
输入 @ 插入引用
输入 @ 插入引用
输入 @ 触发提及