bot.stateMorphBotState读取或设置当前状态。赋值会立即开始状态切换。
FRAMEWORK-FREE WEB COMPONENT
用一个 <morph-bot> 标签展示状态、加载过程和任务反馈。组件基于原生 Web Component,可在普通 HTML、React、Vue 或任何能加载 ES Module 的项目中使用。
QUICK START
morph-bot/ 文件夹放在 HTML 文件旁。type="module" 脚本注册自定义元素。state、shape 和 size。<script type="module" src="./morph-bot/morph-bot.js"></script>
<morph-bot
state="idle"
shape="blob"
size="72"
label="等待任务"
></morph-bot>
INSTALLATION
组件入口会从同目录加载动画引擎和几何数据,因此不要只复制 morph-bot.js。
路径规则:如果页面和 morph-bot/ 是同级,使用 ./morph-bot/morph-bot.js。框架项目应把整个目录放进公开静态资源目录,再使用对应的公开 URL。
ELEMENT
| 属性 | 类型 | 默认值 | 作用 |
|---|---|---|---|
state | string | idle | 选择 39 个状态之一。 |
shape | string | blob | 选择 18 个身体轮廓之一。 |
size | number | 96 | 组件边长,范围 12–1024 CSS px。 |
color | CSS color | #0b0b0b | 纯色模式下的身体与 Morph 主色。 |
material | string | solid | solid、gradient 或 rainbow-glass。 |
gradient-preset | string | electric-dusk | 选择内置渐变预设。 |
gradient-start | CSS color | — | 自定义双色渐变起始色;设置后不必提供 preset。 |
gradient-end | CSS color | — | 自定义双色渐变结束色。 |
gradient-angle | number | 135 | 自定义渐变方向,范围 0–360°。 |
glass-preset | string | iridescent-orb | 选择彩虹玻璃预设。 |
eye-color | CSS color | #ffffff | 眼睛颜色。 |
speed | number | 1 | 播放倍率,范围 0.1–4。 |
rotation | number | 0 | 额外旋转角度,范围 -180–180°;适合对话动作。 |
follow-pointer | boolean | 关闭 | 让视线跟随页面指针。 |
flip | boolean | 关闭 | 水平翻转组件。 |
paused | boolean | 关闭 | 暂停内部仿真时钟。 |
decorative | boolean | 关闭 | 作为纯装饰并从无障碍树隐藏。 |
label | string | 自动 | 非装饰组件的无障碍名称。 |
<morph-bot
state="thinking"
shape="hex"
size="64"
color="#111210"
eye-color="#ffffff"
speed="1"
follow-pointer
label="正在思考"
></morph-bot>
JAVASCRIPT
bot.stateMorphBotState读取或设置当前状态。赋值会立即开始状态切换。
bot.shapeMorphBotShape读取或设置当前轮廓。
bot.materialMorphBotMaterial读取或设置当前材质模式。
bot.gradientPresetstring读取当前渐变预设,使用双色参数时为 custom。
bot.glassPresetstring读取当前彩虹玻璃预设。
bot.sizenumber读取或设置组件尺寸。
bot.speednumber读取或设置播放倍率。
bot.rotationnumber读取或设置额外旋转角度,状态自身运动仍会叠加。
bot.pausedboolean读取或设置暂停状态。
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。每步支持 state、hold、morph、morphHold;{ loop: true } 可循环。
stopSequence()立即取消当前时间线并退出正在播放的单次 Morph,返回当前元素。
performDialogue(script, options?)播放文字、表情、旋转、Morph 和停顿组成的对话脚本。中文会按整句语境解析为拼音;animalese 与 playful 使用 animalese-tts 人声 Sprite,分别提供干净与高音跳跃配置,也支持 gameboy、rpg。
pauseDialogue() / resumeDialogue() / stopDialogue()暂停、继续或停止对话及其角色音。停止会退出单次 Morph 并把额外旋转归零。
restoreStateMorph()结束单次 Morph 预览,恢复当前状态自带的 Morph 逻辑。
configure(project)加载编辑器导出的 v6 preset,并返回当前元素。
snapshot()返回当前引擎快照;组件尚未连接时返回 null。
每一步都按固定顺序执行:进入 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,
});
playful 与 animalese 都使用真正的 animalese-tts 人声 Sprite 合成链路。汉字按整句语境解析为拼音和声调,英文片段自动交给官方 EnglishAnalyzer;phonetic 会组合英文音素,letters 会逐字母拟声。整句采用单一音频时间线、统一响度和 10–12ms 交叉淡化。播放器提前约 60ms 调度音频,字幕和进度读取带设备输出延迟补偿的 AudioContext 播放头;组合英文音素仍逐字显示。首次播放会从组件包本地加载约 1.2 MB 的音频 Sprite。
EVENTS
| 事件 | event.detail | 触发时机 |
|---|---|---|
ready | — | Shadow 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);
});
RUNTIME
snapshot() 返回只读的即时信息,适合调试面板和测试,不用于反向修改组件。
stateexpressionIndexeyeOpeneyeOpenTargetmorphEffectmorphAmountmorphPhaseelapsedplaybackRatepaused
STATE REFERENCE
状态控制眼形池、眨眼节奏、姿态、运动和默认 Morph。点击右侧 Live API 的“应用状态”可立即检查任意状态。
SHAPE REFERENCE
形状只改变身体轮廓和眼位适配,不改变状态语义。
MATERIAL REFERENCE
纯色提供 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" });
MORPH REFERENCE
通过 playMorph() 单独触发,或放进 playSequence() 的步骤中。它们按 RESET → ENTER → HOLD → EXIT → DONE 完整播放。
await bot.playMorph("send", {
hold: 1200,
restore: "idle",
});
PRESET
configure() 接受编辑器导出的 v6 JSON。标签上的 HTML 属性优先,因此可以用一个 preset 保存完整设计,再在每个使用位置覆盖状态、形状、尺寸或材质。
const preset = await fetch("./my-bot.json")
.then((response) => response.json());
document.querySelector("morph-bot")
.configure(preset);
ACCESSIBILITY
label,例如“正在生成报告”。decorative,避免重复朗读。loading、progress 和 spawning 默认使用 role="status"。prefers-reduced-motion 设置。progress 不是 0–100% 进度。LIFECYCLE
IntersectionObserver 自动暂停,重新可见时恢复。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
import MorphBotElement, {
MORPH_BOT_STATES,
MORPH_BOT_SHAPES,
MORPH_BOT_EFFECTS,
} from "./morph-bot/morph-bot.js";