@c轨道/反应-ui
代理产品的回放组件:与推理的对话,工具调用和批准,运行状态,文物和图表,由一个Tailwind v4符号主题来作风格. 轨道的UI软件包:它使数据成为来自Interchange的主机网络应用负载,并在任何React 18或19应用中工作而无需Interchange.
为什么?
- 推进,加注出局. 没有组件获取、订阅或持有客户端 。 你的数据层是属于你的,每个组件在故事,测试和制作上都是一样的.
- 特工形状的构件.
Message转一转Tool, (中文(简体) ),Reasoning财务报告和审定财务报表Activity将其部分(文本、推理、工具调用),ToolApproval在电话之前问一个人GateBlock财务报告和审定财务报表StepList掩护一个人的跑道. - 付你进口的东西. 一个根条目,包除了它的 CSS 外是无副作用的,还有重同位素(Radix 对话框,下放菜单,工具提示,
sonner)是可选的. - 服务器组件准备 . 状态模块船
"use client"因此,一个 React Server 组件应用程序直接导入它们。 在RSC之外,指令是禁止的.
安装
bun add @corbits/react-ui react react-dom lucide-react @radix-ui/react-slot
需要节点 24 或以后。 在React 19上被测试;对等范围也接受React 18.2+.
只有导入它们的模块需要可选同伴。 这些模块不在根项中, 因此通过子路径导入 :
| 端点 | 子路径 |
|---|---|
@radix-ui/react-dialog | ui/dialog, (中文(简体) ), ui/command-palette, (中文(简体) ), ui/sidebar-search, (中文(简体) ), ui/mic-permission-dialog |
@radix-ui/react-dropdown-menu | ui/menu |
@radix-ui/react-tooltip | ui/tooltip |
sonner | ui/toast |
快速启动
在应用程序根导入样式表, 在您的 CSS 之前, 并挂载 ThemeProvider 靠近根 :
import "@corbits/react-ui/styles.css";
import {
Activity,
Conversation,
ConversationContent,
ConversationItem,
ConversationScrollButton,
Message,
MessageContent,
MessageHeader,
ThemeProvider,
groupActivity,
type ConversationMessage,
type ConversationParticipant,
} from "@corbits/react-ui";
const you: ConversationParticipant = { id: "u1", kind: "person", name: "You" };
const scout: ConversationParticipant = {
id: "a1",
kind: "agent",
name: "Scout",
};
const messages: ConversationMessage[] = [
{
id: "m1",
author: you,
at: "2026-01-01T09:00:00Z",
status: "sent",
parts: [{ kind: "text", text: "What changed in the repo today?" }],
},
{
id: "m2",
author: scout,
at: "2026-01-01T09:00:04Z",
status: "sent",
parts: [
{
kind: "reasoning",
text: "Check the commit log first.",
durationMs: 1200,
},
{
kind: "tool-trace",
toolCallId: "t1",
name: "git__log",
status: "output-available",
output: "3 commits",
},
{ kind: "text", text: "Three commits landed today, all in the docs." },
],
},
];
function Turn({ message }: { message: ConversationMessage }) {
const own = message.author.id === you.id;
return (
<Message
from={own ? "own" : message.author.kind}
status={message.status}
aria-label={own ? "You" : undefined}
>
{own ? null : (
<MessageHeader name={message.author.name} at={message.at} />
)}
{groupActivity(message.parts).map((group) => {
if (group.kind === "activity")
return <Activity key={group.key} steps={group.steps} />;
if (group.part.kind === "text")
return <MessageContent key={group.key} text={group.part.text} />;
return null;
})}
</Message>
);
}
export function App() {
return (
<ThemeProvider>
<div style={{ display: "flex", flexDirection: "column", height: 480 }}>
<Conversation>
<ConversationContent>
{messages.map((message) => (
<ConversationItem key={message.id} itemId={message.id}>
<Turn message={message} />
</ConversationItem>
))}
</ConversationContent>
<ConversationScrollButton />
</Conversation>
</div>
</ThemeProvider>
);
}
这使得用户消息在泡沫中,代理商的思维和工具调用被折叠成一个活动行并打开到两者,代理商的回复. 所有其他部分(工具呼叫等待一个人、图像、来源、文件)都有自己的组件;见 聊天。 。 。 .
styles.css 包括Tailwind预飞和一基层,因此它重新塑造了页面. 如果您已经运行 Tailwind v4, 导入 @corbits/react-ui/theme.css 让你的建筑 产生公用事业。 导入其中之一,绝不是两者兼有;没有两者之一,组件就变得不具有样式.
合适的话
- 互换 管理AI代理作为主要负责人(拥有自己权限和资格的一等身份). 该枢纽是其多租户控制平面:租户、校长、赠款(授权持有本金)和证书。 侧车是便携式代理运行时间.
- 轨道 是一个将代理产品转化为产品的套件。 这个包是UI桶:它在主机网络应用中运行并插入主机的数据层,而不是插入中枢或侧车.
- 它与它所生成的数据的枢纽模块相配,例如:
@corbits/artifacts, (中文(简体) ),@corbits/mailbox财务报告和审定财务报表@corbits/cron。 。 。 .
参考文献
从根部导入;它会树摇动到您使用的东西. 只有可选的对等模块有自己的子路径:
import { Button } from "@corbits/react-ui";
import { Toaster, toast } from "@corbits/react-ui/ui/toast";
export function SignOut() {
return (
<>
<Button onClick={() => toast("Signed out.")}>Sign out</Button>
<Toaster position="bottom-right" />
</>
);
}
他们
暗模式是一个 .dark 班级的祖先。 没有 .dark 也没有 .light 在根上,符号跟着 prefers-color-scheme 设置 color-scheme 当地控制; dark: 公用事业仍然需要 .dark 祖师相.
ThemeProvider 切换两个类并坚持选择 storageKey。管理类本身的主机添加 .light 自去除后 .dark 回到操作系统。 为避免黑暗OS上存储的光选择,添加 .light 仅当存储的选择是轻而易举时,在第一次油漆之前:
<script>
if (localStorage.getItem("corbits-theme")?.includes('"light"'))
document.documentElement.classList.add("light");
</script>
主题名称为"红色帽子"(Red Hat Display)和"空间单曲"(Space Mono),但没有将它们捆绑. 自己装入或堆栈倒回系统字体; 覆盖 --font-sans 财务报告和审定财务报表 --font-mono 以另一个名字装入的脸.
构成部分
所有从 @corbits/react-ui,但标记“可选对等点”的行除外,该行从显示的子路径导入;见 安装。 。 。 .
聊天
| 构成部分 | 这是什么 |
|---|---|
Conversation | 整理或跟踪新消息的对话; useConversation |
ConversationContent | 滚动日志; a ConversationItem 覆盖每个条目 |
ConversationScrollButton | 跳回到最近的消息中 |
ConversationEmptyState | 还没有消息 |
ConversationDivider | 有可选标签的规则,例如一天; ConversationNotice 系统行 |
ConversationEarlier | 在阅读器滚动时装入旧信件; useHistoryWindow |
ConversationMap | 每转一圈,一圈一圈; useReadingPosition |
ConversationThread | 以父信件为首的回覆线索 |
Message | 一个消息,从 MessageAvatar, (中文(简体) ), MessageHeader, (中文(简体) ), MessageContent, (中文(简体) ), MessageSendStatus 财务报告和审定财务报表 MessageFooter |
MessageFold | 粉碎一个很长的答案 打开它 |
MessageParts | 信件的部件作为其组件, 任何类型的可替换; 当决定的调用折叠时保持焦点 |
MessageActions | 消息下的行行动 : MessageAction, (中文(简体) ), MessageActionMenu |
MessageReactions | Emoji对数的反应 |
MessageReplies | 回覆数和打开线程的时间 |
Activity | 一系列思维和工具呼叫折叠成一行; groupActivity |
Reasoning | 一个特工的想法,折叠 |
Tool | 一个打开输入和输出的工具呼叫 |
ToolGroup | 工具调用同时运行 |
ToolApproval | 批准、批准或拒绝工具召唤等待某人 |
GeneratedImages | 生成时带有占位符的代理图像 |
Sources | 答案的编号引用 |
MediaViewer | 图片、视频、音频、PDF和全文; useMediaViewer |
Attachments | 文件为堆栈、平板或列表; useAttachments |
AttachmentDropZone | 取掉的文件和文件夹的区域; useFileDrop |
PromptInput | 信息框: PromptInputTextarea, (中文(简体) ), PromptInputSubmit, (中文(简体) ), PromptInputSuggestions· ; usePromptInput |
PromptInputToolbar | 文本下的控件: 添加菜单、 模式和模式选择、 注释 |
ToolPicker | 浏览、搜索和选择工具 |
TypingIndicator | 代理脚印点 |
ThinkingIndicator | 带有状态标签的动画轨道标记 |
ThinkingMark | 装饰动画轨道标记 |
ThinkingLabel | 旋转动词状态标签 |
ShimmerText | 闪光扫描文本 |
MicButton | 允许的麦克风切换 |
VoiceWaveform | 直播音频关卡栏 |
DictationStatusLine | 作曲者拼写状态行 |
MicPermissionDialog | 麦克风权限提示( 可选的对等点, ui/mic-permission-dialog(中文(简体) ) |
Panel | 侧面板从边缘调整大小; 隐藏面板保持状态 |
PanelTabs | 面板的标签行: 选择、 关闭、 拖放或键盘重排 ; useTabs |
运行
| 构成部分 | 这是什么 |
|---|---|
LiveRunBanner | 运行中的状况 |
LiveStatusLine | 单行"现在发生什么" |
GateBlock | {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}要是有人决定就停在车站 |
StepList | 运行步骤及其状态的垂直列表 |
HorizontalStepper | 横向步骤进展 |
ProgressChecklist | 长期行动的步骤和进展有多远 |
TraceWaterfall | 运行跟踪时间表, 每段一行 |
IntakeForm | 运行前输入工作流程要求 |
RunNowButton | 立即运行一些东西 |
ConfirmButton | 需要第二次点击的按钮 |
NowCards | 需要采取行动的项目的注意范围 |
NotificationsBell | 有计数和面板槽的铃声 |
艺术品
| 构成部分 | 这是什么 |
|---|---|
ArtifactBody | 一件艺术品,画的就是它的意思 |
ArtifactNotice | "这里没什么可画"给文物观众的留言 |
BlockCard | 基因- UI 块框 |
ResearchBody | 研究简报和报告 |
CompareBody | 逐一比较 |
EmbedBody | 嵌入了沙盒的第三方 |
CsvTable | CSV 文本的封面预览 |
QuoteCard | 旋转引用 |
ProfileCard | 身份、地位、行动和渠道 |
图表
| 构成部分 | 这是什么 |
|---|---|
ChartFrame | 说明、传说、图案和与表格相同的数据 |
TimeSeriesChart | 随时间演变的数值 |
BarChart | 垂直条 |
CategoryBars | 水平等级 |
Sparkline | 内在趋势线 |
TokenMosaic | 整体份额为一叠条 |
StatGrid | 标题编号网格 |
AnimatedNumber | 算入新值的数字 |
版式
| 构成部分 | 这是什么 |
|---|---|
PageShell | 页面边距和滚动属性 |
PagePanel | 相邻的页面内容框架 |
TopBar | 标题、面包屑和动作行 |
Sidebar | 可折叠的导航侧边栏 |
SidebarSearch | 搜索已标注为 Cmd+K (可选的对等点, ui/sidebar-search(中文(简体) ) |
SidebarPanel | 有针头、身体和脚的边栏 |
SidebarItemRow | 一个侧行 |
ListDetail | 左边索引,右边打开的项目 |
InspectorShell | 副巡视员铁路 |
Section | 标题内容块 |
SettingsPanel | 可选保存的设置框架 |
LibraryPageHeader | 库页的标题、数和控制 |
Card | 边框内容卡 |
EmptyState | 标题、说明、图标和行动 |
RichEmptyState | 带有建议下一步行动的空状态 |
BootScreen | 应用程序加载前显示的屏幕 |
DitherCanvas | 动画抖动背景 |
CorbitsMark | 轨道标志 |
AuthLayout | 签名页面布局 |
LoginForm | 签名和注册表,可选 SSO |
控件
| 构成部分 | 这是什么 |
|---|---|
Button | 有变体和大小的按钮 |
Input | 文本输入 |
Textarea | 多行输入 |
Select | 本地选择 |
Checkbox | 复选框 |
SelectionCheckbox | 行选择复选框 |
Switch | 打开/关闭切换 |
FileInput | 文件拾取器 |
Tabs | 标签条 |
ViewToggle | 网格或行分割控制 |
FilterBar | 带有活动过滤摘要的过滤行 |
FilterChip | 一个可切换的过滤器 |
KindCardGrid | 可选择的牌网格 |
ActionBar | 组合视图控件, 内置或浮动 |
BulkActionBar | 多行选择动作 |
Table | 原始表格 |
SortableTable | 可排序列的表格 |
Badge | 状态标签 |
StatusDot | 有色状态点 |
Avatar | 缩写或图像化 |
ProviderMark | 动作要经过哪些服务 |
Skeleton | 正在装入占位符 |
Dialog | Modal 对话框( 可选对等点 , ui/dialog(中文(简体) ) |
CommandPalette | 全局搜索覆盖( 可选的对等者, ui/command-palette(中文(简体) ) |
Menu | 下放菜单( 可选的对等点, ui/menu(中文(简体) ) |
Tooltip, (中文(简体) ), InfoTooltip | 任何触发器周围的通用工具提示,以及徘徊信息glyph(可选对等点, ui/tooltip(中文(简体) ) |
Toaster | 烤面包主机; 调用 toast() 任何地方(可选对等点, ui/toast(中文(简体) ) |
ThemeProvider | 持久光线、 黑暗或系统模式和预设 |
ThemeToggle | 光、暗或系统开关 |
编码代理
包裹载有一种代理技能:一个简短的指南、使用规则和每个部件的道具参考。 对准你的经纪人 node_modules/@corbits/react-ui/skills/react-ui (从 SKILL.md),或将该文件夹复制到您的代理技能目录中.
使用互换
主机应用程序拥有与枢纽的连接;组件仅取道具.
- 装入运行状态
@intx/hub-client数字 :createRunSession民意调查 工作流程记录 并披露以下顺序WorkflowRunEvent时间表. - 将时间线映射到道具: 代理输出到
ConversationMessage提供部件Message内置 aConversation一个工具呼叫等待一个人到PartTool携带ToolApprovalRecord页:1ToolApproval,步骤事件StepList,并运行在一个人停GateBlock。 。 。 . - 电线回调回枢纽.
ToolApproval是因为onDecide呼叫您的中枢路线,以决定的结果和范围解决等待的批准;中枢检查呼叫者的赠款,而不是组件. 和解记录又回来了ToolApproval显示什么是决定.
从0.3升级
旧聊家取出. 对话家庭代替它:一个信息就是一个 ConversationMessage 谁 parts 为 a ConversationPart[] (歧视 kind),组件由您所编的部件构建,而不是每个屏幕的一个组件.
Part, (中文(简体) ),PartText, (中文(简体) ),PartReasoning, (中文(简体) ),PartToolTrace, (中文(简体) ),PartBlock, (中文(简体) ),PartFile, (中文(简体) ),PartEvent财务报告和审定财务报表ToolTraceStatus不变,仍从根导入.
删除了出口和替换出口的内容:
| 删除 | 改为使用 |
|---|---|
ChatThread, (中文(简体) ), ChatThreadProps | Conversation 与 ConversationContent页:1 ConversationItem 每个消息和 ConversationScrollButton |
AgentTurn, (中文(简体) ), AgentTurnProps | Message 与 from="agent", (中文(简体) ), MessageAvatar, (中文(简体) ), MessageHeader 财务报告和审定财务报表 MessageContent,与 MessageParts 各编 |
MessageBubble, (中文(简体) ), MessageBubbleProps | Message 与 MessageContent· ; from="own" 画出气泡 |
PartsRenderer, (中文(简体) ), PartsRendererProps | MessageParts 内置 a Message· ; renderBlock 页:1 block 组件 |
toolTraceToBlockState | 无替换 : Tool 读取 ToolTraceStatus 和直接批准记录 |
ReasoningBlock, (中文(简体) ), ReasoningBlockProps | Reasoning (单位:千美元)ReasoningTrigger, (中文(简体) ), ReasoningContent在一个 PartReasoning |
ToolBlock, (中文(简体) ), ToolBlockProps, (中文(简体) ), ToolBlockState | Tool (单位:千美元)ToolHeader, (中文(简体) ), ToolInput, (中文(简体) ), ToolOutput在一个 PartTool国家是它的 ToolTraceStatus |
ToolNarrative, (中文(简体) ), ToolNarrativeProps | Tool,或 ToolGroup {\fn黑体\fs20\shad2\2ah82\3ah20\4ah33\fscx95\3ch592001\be1}因为电话是一起打来的 |
ApprovalCard, (中文(简体) ), ApprovalCardProps | ToolApproval 编号 PartTool 带有 ToolApprovalRecord· ; onApprove, (中文(简体) ), onReject 财务报告和审定财务报表 onAllowAlways 变成 onDecide(ToolApprovalDecision),还有忙碌 state 变成 disabled |
ApprovalRequest, (中文(简体) ), ApprovalDetail | 这个 PartTool 本身: name 财务报告和审定财务报表 input,以主机本身对动作的描述为 ToolApproval孩子们 |
ApprovalState | ToolApprovalRecord是因为 status 成果, ToolApproval是因为 disabled 当决定被记录时 |
ChatInput, (中文(简体) ), ChatInputProps | PromptInput 与 PromptInputTextarea 财务报告和审定财务报表 PromptInputSubmit· ; PromptInputToolbar 用于文本下的控件 |
ChatAttachment | AttachmentData 页:1 Attachments, (中文(简体) ), AttachmentItem 从 useAttachments |
ChatComposer, (中文(简体) ), ChatComposerProps | PromptInput,与 ConversationEmptyState 空话 |
QuickReplyChips, (中文(简体) ), QuickReply | 没有替换 : 建议的回复是主机自己的按钮, 例如内部 ConversationEmptyState |
ChatPanel, (中文(简体) ), ChatPanelHeader, (中文(简体) ), ChatPanelFooter | Panel, (中文(简体) ), PanelHeader 财务报告和审定财务报表 PanelContent 用于侧面板; 置入 Conversation 财务报告和审定财务报表 PromptInput 在自己的画框中 |
ChatMessage | ConversationMessage数字 : role 变成 author (单位:千美元)ConversationParticipant, (中文(简体) ), createdAt 变成 at, (中文(简体) ), status 需要时间 |
ChatRole | ConversationParticipant是因为 kind (单位:千美元)person 或者说 agent);系统行是 PartEvent,显示为 ConversationNotice |
MessageStatus | ConversationMessageStatus,则添加 streaming |
MessagePart | ConversationPart歧视 kind 改为 type |
TextPart, (中文(简体) ), ReasoningPart, (中文(简体) ), FilePart | PartText, (中文(简体) ), PartReasoning, (中文(简体) ), PartFile |
ToolPart | PartTool数字 : toolName 变成 name, (中文(简体) ), state 变成 status,以及 label 移动到 ToolHeader是因为 label |
ToolPartState | ToolTraceStatus数字 : done 变成 output-available |
AgentIdentity | ConversationParticipant 与 kind: "agent"· ; tagline 变成 role,以及 MessageAvatar 带 initials |
agentInitials | MessageAvatar的缩写 name |
SubagentRun, (中文(简体) ), SubagentState | 没有替换: 对话模式没有子代理类型; 显示助手的呼叫为 PartTools或 a 类型 PartToolBatch |
ChatThreadSummary | 没有替换: 对话列表是主机自己的数据 |
messageText, (中文(简体) ), reasoningText, (中文(简体) ), toolParts | 无替换:过滤器 message.parts 以 kind |
isTurnWorking | parts.some((p) => p.kind === "tool-trace" && p.status === "running") (任何仍在运行的工具; message.status === "streaming" 是整个消息) |
toolLabel | 无替换 : ToolHeader 显示原始工具名称,在 label 你通过 |
ToolProviderMark | ProviderMark 由提供者读取工具代号(name.split("__")[0],用于标识形状 provider__operation(中文(简体) ) |
useDelayedAutofocus | 无替换: 元素进入完成后从效果中聚焦 |
从0.1升级
- 从 npm 安装 。 Git 安装( E)
github:corbitsdev/react-ui#<sha>不再建设dist/。 。 。 . - 每个模块子路径已消失: 从
@corbits/react-ui(单位:千美元)import { Button } from "@corbits/react-ui") (中文(简体) ). ui/dialog, (中文(简体) ),ui/command-palette, (中文(简体) ),ui/sidebar-search, (中文(简体) ),ui/mic-permission-dialog, (中文(简体) ),ui/menu, (中文(简体) ),ui/tooltip财务报告和审定财务报表ui/toast只能是子路径,而他们的同伴是可选的:import { Toaster, toast } from "@corbits/react-ui/ui/toast"。为您保存的每个子路径安装对等点.lib/csv, (中文(简体) ),lib/url, (中文(简体) ),lib/utils, (中文(简体) ),lib/workflow-registry财务报告和审定财务报表ui/chat-dock-timing(去除于0.4)为内. 替换cn与twMerge(clsx(...))。 。 。 .- 国有部件船
"use client"客户端的包装纸你为它们写了,还可以去. - 删除了84个未使用的模块,
ui/command被删除,ActivityBlock重新命名为ReasoningBlock(删除为0.4;使用)Reasoning,参见 从0.3升级),以及AuthLayout不再计算DitherCanvas默认. - 没有
.dark也没有.light在根上,主题遵循OS. 切换的主机.dark必须添加.light或挂载ThemeProvider。 。 。 .
许可证
LGPL-2.1-仅限. 见 自由主义。 。 。 .