Morph Bot API
v0.6.0 返回组件编辑器 下载组件 ↓

FRAMEWORK-FREE WEB COMPONENT

完整 API 文档

用一个 <morph-bot> 标签展示状态、加载过程和任务反馈。组件基于原生 Web Component,可在普通 HTML、React、Vue 或任何能加载 ES Module 的项目中使用。

01

QUICK START

三步看到第一个 Bot

  1. 下载并解压把完整的 morph-bot/ 文件夹放在 HTML 文件旁。
  2. 加载组件用一个 type="module" 脚本注册自定义元素。
  3. 写标签指定 stateshapesize
index.html
<script type="module" src="./morph-bot/morph-bot.js"></script>

<morph-bot
  state="idle"
  shape="blob"
  size="72"
  label="等待任务"
></morph-bot>
02

INSTALLATION

保持文件相对位置

组件入口会从同目录加载动画引擎和几何数据,因此不要只复制 morph-bot.js

路径规则:如果页面和 morph-bot/ 是同级,使用 ./morph-bot/morph-bot.js。框架项目应把整个目录放进公开静态资源目录,再使用对应的公开 URL。

03

ELEMENT

HTML 属性

属性类型默认值作用
statestringidle选择 39 个状态之一。
shapestringblob选择 18 个身体轮廓之一。
sizenumber96组件边长,范围 12–1024 CSS px。
colorCSS color#0b0b0b纯色模式下的身体与 Morph 主色。
materialstringsolidsolidgradientrainbow-glass
gradient-presetstringelectric-dusk选择内置渐变预设。
gradient-startCSS color自定义双色渐变起始色;设置后不必提供 preset。
gradient-endCSS color自定义双色渐变结束色。
gradient-anglenumber135自定义渐变方向,范围 0–360°。
glass-presetstringiridescent-orb选择彩虹玻璃预设。
eye-colorCSS color#ffffff眼睛颜色。
speednumber1播放倍率,范围 0.1–4。
rotationnumber0额外旋转角度,范围 -180–180°;适合对话动作。
follow-pointerboolean关闭让视线跟随页面指针。
flipboolean关闭水平翻转组件。
pausedboolean关闭暂停内部仿真时钟。
decorativeboolean关闭作为纯装饰并从无障碍树隐藏。
labelstring自动非装饰组件的无障碍名称。
完整声明
<morph-bot
  state="thinking"
  shape="hex"
  size="64"
  color="#111210"
  eye-color="#ffffff"
  speed="1"
  follow-pointer
  label="正在思考"
></morph-bot>
04

JAVASCRIPT

可读写属性

bot.stateMorphBotState

读取或设置当前状态。赋值会立即开始状态切换。

bot.shapeMorphBotShape

读取或设置当前轮廓。

bot.materialMorphBotMaterial

读取或设置当前材质模式。

bot.gradientPresetstring

读取当前渐变预设,使用双色参数时为 custom

bot.glassPresetstring

读取当前彩虹玻璃预设。

bot.sizenumber

读取或设置组件尺寸。

bot.speednumber

读取或设置播放倍率。

bot.rotationnumber

读取或设置额外旋转角度,状态自身运动仍会叠加。

bot.pausedboolean

读取或设置暂停状态。

05

METHODS

方法

setState(state, options?)

切换到目标状态并返回当前元素。传入 { replay: true } 可重新播放相同状态。

setShape(shape)

切换轮廓并返回当前元素。

setMaterial(material, options?)

切换材质。纯色传 { color },渐变传 { preset }{ start, end, angle },玻璃传 { preset }

replay()

从头重播当前状态。

pause() / play()

暂停或恢复动画,均返回当前元素。

step()

前进一帧并保持暂停,适合逐帧检查。

playMorph(effect, options?)

播放一次 Morph。hold 默认 2500ms;restore 可传状态名、"default"null。返回 Promise。

playSequence(steps, options?)

依次执行状态停留和单次 Morph。每步支持 stateholdmorphmorphHold{ loop: true } 可循环。

stopSequence()

立即取消当前时间线并退出正在播放的单次 Morph,返回当前元素。

performDialogue(script, options?)

播放文字、表情、旋转、Morph 和停顿组成的对话脚本。中文会按整句语境解析为拼音;animaleseplayful 使用 animalese-tts 人声 Sprite,分别提供干净与高音跳跃配置,也支持 gameboyrpg

pauseDialogue() / resumeDialogue() / stopDialogue()

暂停、继续或停止对话及其角色音。停止会退出单次 Morph 并把额外旋转归零。

restoreStateMorph()

结束单次 Morph 预览,恢复当前状态自带的 Morph 逻辑。

configure(project)

加载编辑器导出的 v6 preset,并返回当前元素。

snapshot()

返回当前引擎快照;组件尚未连接时返回 null

精确控制状态停留与 Morph

每一步都按固定顺序执行:进入 state → 停留 hold 毫秒 → 播放 morph → 保持 morphHold 毫秒 → 进入下一步。省略 morph 就会在停留后直接进入下一状态。

状态时间线
const bot = document.querySelector("#status-bot");
const sequence = [
  { state: "idle", hold: 1000, morph: "gather", morphHold: 700 },
  { state: "thinking", hold: 2400, morph: "send", morphHold: 700 },
  { state: "celebrate", hold: 1600 },
];

// 播放一次;改为 loop: true 可持续循环
bot.playSequence(sequence, { loop: false });

// 随时停止
bot.stopSequence();

用动作标签编排对话

对话脚本是一组有序节点。文字节点逐字播放;动作节点在当前位置改变状态或旋转、触发 Morph,或者插入精确停顿。组件编辑器的“对话导演”会通过 @ 菜单生成同样的数据。

本地角色对话
const dialogue = [
  { type: "state", state: "idle", duration: 300 },
  { type: "text", text: "你好,我是 Morph Bot。" },
  { type: "state", state: "thinking", duration: 450 },
  { type: "text", text: "让我想一下……" },
  { type: "rotate", angle: -12, duration: 260 },
  { type: "morph", effect: "wave", duration: 650 },
  { type: "text", text: "有了!" },
];

await bot.performDialogue(dialogue, {
  voice: "playful",
  englishMode: "phonetic", // phonetic | letters
  rate: 1,
});

playfulanimalese 都使用真正的 animalese-tts 人声 Sprite 合成链路。汉字按整句语境解析为拼音和声调,英文片段自动交给官方 EnglishAnalyzerphonetic 会组合英文音素,letters 会逐字母拟声。整句采用单一音频时间线、统一响度和 10–12ms 交叉淡化。播放器提前约 60ms 调度音频,字幕和进度读取带设备输出延迟补偿的 AudioContext 播放头;组合英文音素仍逐字显示。首次播放会从组件包本地加载约 1.2 MB 的音频 Sprite。

06

EVENTS

事件

事件event.detail触发时机
readyShadow DOM 和引擎初始化完成。
statechange{ state }state 属性改变。
shapechange{ shape }shape 属性改变。
materialchange{ material }材质或其参数属性改变。
morphstart{ effect, hold }单次 Morph 开始。
morphend{ effect }单次 Morph 完成退出。
sequencestart{ steps, loop }时间线开始。
sequencestep{ index, cycle, state, hold, morph, morphHold }进入一个状态步骤。
sequenceend{ cycles }非循环时间线完整结束。
dialoguestart{ script, duration, voice, rate, englishMode }整句音频预渲染完成,对话开始。
dialogueaction{ index, node }进入表情、旋转、Morph 或停顿节点。
dialoguecharacter{ character, phonetic, phoneme, pitch, audioTime, text, index, node }音频 cue 到达新字符;同时给出拼音、合成音素、音高与句内音频时间。
dialogueprogress{ elapsed, duration, progress, text, node, audioTime? }采样语音播放时由 AudioContext 主时钟更新。
dialoguepause / dialogueresume{ elapsed, duration }对话暂停或继续。
dialogueend{ cancelled, duration, text }对话完成或被停止。
监听状态
bot.addEventListener("statechange", (event) => {
  console.log("当前状态:", event.detail.state);
});
07

RUNTIME

运行快照

snapshot() 返回只读的即时信息,适合调试面板和测试,不用于反向修改组件。

stateexpressionIndexeyeOpeneyeOpenTargetmorphEffectmorphAmountmorphPhaseelapsedplaybackRatepaused
08

STATE REFERENCE

39 个状态

状态控制眼形池、眨眼节奏、姿态、运动和默认 Morph。点击右侧 Live API 的“应用状态”可立即检查任意状态。

09

SHAPE REFERENCE

18 个形状

形状只改变身体轮廓和眼位适配,不改变状态语义。

10

MATERIAL REFERENCE

25 个材质预设

纯色提供 8 个基础色;渐变包含 8 个经过 OKLab 平滑的线性预设,以及 4 个由雾底和多个柔焦径向色团组成的空间预设;彩虹玻璃提供 5 个由基底、暗部、固定环境高光、边缘色散和内部焦散组成的多层预设。点击任意卡片即可应用到右侧 Live API。

设计依据:预设结构参考 Open Props 的可移植渐变 token 与 WebGradients 的 angle + ordered stops 表达;具体配色与玻璃分层为本项目设计。

材质切换
bot.setMaterial("gradient", { preset: "electric-dusk" });
bot.setMaterial("gradient", { preset: "porcelain-bloom" });
bot.setMaterial("gradient", {
  start: "#315cf5",
  end: "#34d399",
  angle: 130,
});
bot.setMaterial("rainbow-glass", { preset: "iridescent-orb" });
11

MORPH REFERENCE

14 个单次 Morph

通过 playMorph() 单独触发,或放进 playSequence() 的步骤中。它们按 RESET → ENTER → HOLD → EXIT → DONE 完整播放。

单次 Morph
await bot.playMorph("send", {
  hold: 1200,
  restore: "idle",
});
12

PRESET

加载编辑器配置

configure() 接受编辑器导出的 v6 JSON。标签上的 HTML 属性优先,因此可以用一个 preset 保存完整设计,再在每个使用位置覆盖状态、形状、尺寸或材质。

preset.json
const preset = await fetch("./my-bot.json")
  .then((response) => response.json());

document.querySelector("morph-bot")
  .configure(preset);
13

ACCESSIBILITY

无障碍语义

  • 有业务含义时提供明确的 label,例如“正在生成报告”。
  • 按钮旁已有相同文字时,给 Bot 添加 decorative,避免重复朗读。
  • loadingprogressspawning 默认使用 role="status"
  • 组件遵循系统的 prefers-reduced-motion 设置。
  • 真实百分比必须由业务界面另外显示;循环的 progress 不是 0–100% 进度。
14

LIFECYCLE

性能与生命周期

  • 每个实例使用独立 Shadow DOM 和 SVG clip ID,可同时放置多个 Bot。
  • 实例离开视口时通过 IntersectionObserver 自动暂停,重新可见时恢复。
  • 从 DOM 移除时清理动画帧、观察器和指针事件。
  • 状态、形状、尺寸、材质和速度可在运行时更新,无需重新创建元素。
  • 大量实例仍应控制可见数量;目录缩略图使用专用模式关闭粒子发射。
15

TYPESCRIPT

类型与导出

下载包包含 morph-bot.d.ts,并导出组件类、状态/形状/Morph 列表、材质列表、对话声音、中文语音单元分析器与全部预设。

MorphBotElementMORPH_BOT_STATESMORPH_BOT_SHAPESMORPH_BOT_EFFECTSMORPH_BOT_MATERIALSMORPH_BOT_SOLID_PRESETSMORPH_BOT_GRADIENT_PRESETSMORPH_BOT_GLASS_PRESETSMORPH_BOT_DIALOGUE_VOICESMORPH_BOT_DIALOGUE_ENGLISH_MODEScompileDialogueanalyzeSpeechUnitsMORPH_BY_STATE
ES Module
import MorphBotElement, {
  MORPH_BOT_STATES,
  MORPH_BOT_SHAPES,
  MORPH_BOT_EFFECTS,
} from "./morph-bot/morph-bot.js";