组件/BotAvatar

BotAvatar

用 canvas 绘制的动画机器人头像

已验证自 0.6.2

用法

基础

state 跟随智能体的真实状态:流式输出或执行中为 working,空闲为 default。

示例加载中...

对话回复

<template>
  <div class="msg msg--bot">
    <TxBotAvatar type="clover" :state="streaming ? 'working' : 'default'" :size="32" />
    <div class="msg-body">
      {{ streaming ? '思考中…' : content }}
    </div>
  </div>
</template>

智能体名册

每个实例默认错开眨眼时机,同一行不会同时眨眼。

<template>
  <ul class="roster">
    <li v-for="agent in agents" :key="agent.id">
      <TxBotAvatar :type="agent.avatar" :state="agent.busy ? 'working' : 'default'" :size="32" aria-hidden />
      <span>{{ agent.name }}</span>
      <span class="muted">{{ agent.status }}</span>
    </li>
  </ul>
</template>

静态头像

<template>
  <TxBotAvatar type="hexagon" :size="96" paused />
</template>

最佳实践

  • 用 size 控制尺寸,不要在 style 或类里写 width、height、margin,否则头像会位移或被裁。
  • 头像上方留出空间:画布按 size 的 1.5 倍绘制,跳跃会超出布局盒,overflow: hidden 的父级会把它裁掉。
  • 映射自有状态:running / streaming / pending / busy → working;idle / ready / online → default;offline / away / disabled → default 加 paused。
  • 名称与状态已在旁边以文字呈现时,加 aria-hidden 作为装饰。
  • 只用于机器人;真人头像用照片或首字母。

API 参考

属性

属性类型默认值说明
typeBotAvatarType'clover'体型,各带调色板颜色。
faceBotAvatarFace该体型默认面部类型。
state'default' | 'working' | 'sleeping''default'空闲(张望、眨眼、偶尔跳跃)、工作(跳跃旋转并微笑)或睡眠。
sizenumber | string64布局尺寸,也接受任意 CSS 长度。
colorstring体型调色板身体颜色。
inkstring自动面部墨色;默认深色,深色身体上为浅色。
brightness / saturationnumber1 / 1.5身体颜色的明度与饱和度。
speednumber1所有动画的速度倍数。
pausedbooleanfalse把动画冻结在当前帧。
seednumber由实例派生错开眨眼与张望时机,避免整行同步。
shading'plastic' | 'crisp' | 'smooth' | 'flat' | boolean'plastic'打光方式;true 即 crisp,false 即 flat。
shadow / highlightnumber0.35 / 1.3暗面与亮面的强度。
depthnumber0.65身体厚度,0.2–2。
lightnumber265光源方向,自顶部顺时针的角度。
rimnumber0.5crisp 下为亮边宽度,plastic 下为菲涅尔强度。
spreadnumber1.55柔光覆盖范围或高光宽度。
interactivebooleantrue眼睛与头部跟随靠近的指针;点击会跳起转身。
theme'auto' | 'dark' | 'light''auto'所在表面;auto 先读祖先的 data-theme 属性或类,再读系统。
turnnumber1空闲时左右转头的幅度。
whirlnumber0旋转时旋风环的强度。
whirlSize / whirlWidth / whirlLength / whirlTiltnumber1旋风环的几何。
jumpHeightnumber26跳跃高度,以身体高 100 为单位。
jumpTimenumber0.68一次跳跃的滞空秒数。
jumpStretch / jumpSquashnumber1 / 1.15空中拉伸与落地压扁。
jumpSquashTime / jumpSquashEasenumber / BotAvatarSquashEase0.37 / 'pulse'落地压扁从触地到复原的秒数与缓动。
jumpGroundTime / jumpGroundEasenumber / BotAvatarSquashEase0.11 / 'pulse'停在最深压扁处的秒数与缓动。
jumpRiseTime / jumpRiseEasenumber / BotAvatarSquashEase0.33 / 'pulse'从最深压扁回到原形的秒数与缓动。
jumpClickSquashTimenumber0.24点击跳跃的落地压扁时长。
jumpSpinnumber1空中转的整圈数。
jumpLeannumber6跳跃时的倾斜角度。
jumpEverynumber8空闲跳跃间隔秒数(±40%);0 关闭。
jumpLandnumber0落地压扁相对触地的开始时刻(秒)。

BotAvatarType 共 18 种:clover、flower、triangle、square、blob、ghost、circle、drop、star、droid、mech、alien、hexagon、cat、cloud、pill、pebble、puddle。BotAvatarFace 为 'eyes' | 'mouth'。BotAvatarSquashEase 为 'sharp' | 'pulse' | 'soft' | 'bouncy'。

暴露方法

名称类型说明
canvasHTMLCanvasElement | null根 <canvas> 元素。

概述

  • 画布为 role="img",aria-label 随状态变化(如 "Clover bot, idle");传入 aria-label 可覆盖。
  • 其余属性与 DOM 事件直接透传到 <canvas>,class、style、data-* 照常可用。
  • 未知 state 回退到 default,未知 type 回退到 clover。
  • 全页共用一个 requestAnimationFrame 循环;实例离开视口或标签页隐藏时停止绘制。
  • 减少动态效果时不启动循环,只画当前状态的静止姿势;该偏好在渲染时读取,不实时监听。
  • 状态切换带过渡,每个 token 或工具调用都切换 state 也安全。

技术实现

  • 设备像素比上限为 2;plastic 打光在某体型首次出现时于空闲时间烘焙,完成前以柔和外观顶替。
  • 绘制引擎逐字移植自上游 Jakubantalik/Libraries · bot-avatars(MIT © Jakub Antalik),Vue 壳对应上游 React 组件。
  • 源码:packages/tuffex/packages/components/src/bot-avatar/。
查看源码
packages/tuffex/packages/components/src/bot-avatar/index.ts