# 美西螈表情包 · AxoStickers > 给 AI 助手 / 浏览器自动化工具的说明(llms.txt)。Axolotl Launcher 的美西螈动图表情包网站:图鉴(300 张 GIF)、创意工坊编辑器(在浏览器里做动图)、工坊作品(用同一个引擎出图的作品)。 > Guide for AI agents driving this site in a browser. The UI is Chinese; every control also has a stable `data-ax` name and an accessible label. 网站:https://axolotl-launcher.github.io/AxoStickers/ 源码:https://github.com/Axolotl-Launcher/AxoStickers ## 路由(地址栏 # 后面) - `#/` 图鉴;`#/s/001` 打开第 1 张的大图(逐帧播放器,空格暂停,←/→ 逐帧) - `#/editor` 创意工坊编辑器;`#/editor?s=分享码` 打开分享的工程(完整链接,一直有效);`#/e/密钥` 1 分钟短链接;`#/editor?w=issue号` 把工坊作品载进编辑器 - `#/workshop` 工坊作品;`#/w/12` 打开第 12 号作品 ## 最稳的用法:window.axo(能在页面里执行 JavaScript 的工具) 点按钮、拖滑块容易点偏;能执行 JS 就直接调接口,每个函数都返回普通的 JSON 数据或 Promise。 ```js const axo = await window.axo.studio(); // 打开编辑器并等预览沙盒准备好,返回完整接口 axo.help(); // 接口一览(中文) axo.state(); // { ready, playing, frame, frames, fps, selected, errors, perf, status } axo.project.summary(); // 名字、尺寸、帧率、模型、皮肤、图层列表 axo.catalog('motion'); // 能用的动作;类型:motion face fx textanim prop wear skin scene axo.use('motion', 'hop'); // 换动作;{ add: true } 再叠一层 axo.use('face', 'smile'); axo.use('fx', 'hearts', { add: true }); axo.text('早安/打工人'); // 改第一行字(/ 换行) axo.layers.add('text', 'pop', { text: '收到', y: 300, style: 'gold' }); axo.layers.update('l3', { start: 0.2, end: 0.8, strength: 0.6 }); // 时间段是 0~1 的比例 axo.layers.remove('l3'); const gif = await axo.export({ format: 'gif', size: 240, maxKb: 500 }); // → { url, kb, mime, blob, errors };url 用完了 URL.revokeObjectURL(gif.url) const link = await axo.share(); // → { long }:能打开这个工程的完整链接 const both = await axo.share({ short: true }); // → { long, short, expires }:短链接 1 分钟后失效(工程加密后经 ntfy.sh 中转) axo.fonts.list(); // 字体:axo(Axo 黑体,默认)、sys-sans / sys-serif / sys-kai / sys-round(系统字体)、font:文件名(导入的) axo.fonts.use('sys-kai', { all: true }); // 所有文字换字体;{ layer: '图层id' } 只换一层 axo.models.list(); // 模型:axolotl(原版)+ 库里的(工坊下载的 / 载入的文件) await axo.models.use('logo'); // 换模型(要先在库里:axo.workshop.add('logo')) axo.models.transform({ x: 40, y: -20, scale: 1.3, rot: 10, flip: true }); // 模型整体挪(像素,-256~256)、缩放(0.3~2.5)、转(度)、左右镜像 axo.layers.update('w1', { params: { gy: 3, gs: 1.2 } }); // 帽子戴在哪:gx gy gz 挪、gs 缩放、rx ry rz 转 axo.layers.update('t1', { style: '#33aa77' }); // 字色可以是内置的名字,也可以是 #rrggbb await axo.projects.save(); // 「我的工程」:存在这台设备浏览器里;await list() / open(origin) / remove(origin)(都是 Promise)。别的标签页改过同一份时会另存一份,不覆盖 await axo.export({ format: 'video', size: 480, loops: 3 }); // 视频(浏览器能录 MP4 就是 MP4,不然 WebM),按真实时间录 ``` 工坊(组件库): ```js await axo.workshop.list(); // 工坊里的全部组件和模型:{ id, type, kind, name, author, description, file, added, favorite }(模型 type 是 model) await axo.workshop.add('tornado', { use: true }); // 下载到这台设备的组件库并用上(模型:axo.workshop.add('logo', { use: true })) axo.workshop.library(); // 这台设备上已经有的(下载的 / 自己写的 / 文件载入的) await axo.workshop.remove('repo:tornado.axo.js'); // 从浏览器里真的删掉(不弹确认框) axo.favorites.toggle('motion:hop'); // 收藏:键是「类型:id」,模板是「tpl:编号」 ``` 图鉴页面没打开编辑器时也有:`axo.stickers()` 列出全部表情,`axo.go('editor')` 换页面。 ## 只能看页面、点按钮的工具 - 等编辑器根节点 `.studio[data-state="ready"]` 出现再操作(`booting` = 沙盒还在启动,`error` = 没启动起来)。 - 预览是沙盒 iframe 里的画布,读不到内容;看 `[data-ax="status"]`(读屏用的一句话,描述当前工程)和 `[data-ax="frame-counter"]`。 - 按钮都有中文名字(aria-label),也有稳定的 `data-ax`: - 顶栏:`back` `project-name` `save-state`(自动保存的状态)`undo` `redo` `new` `open` `save` `projects`(我的工程)`random` `help` `share` `export` - 网站顶栏(图鉴 / 创意工坊 / 工坊作品)在编辑器里会收起来:鼠标移到窗口最上沿、或者 Tab 到导航时出来;自动化工具直接 `location.hash = '#/'` 换页就行 - 预览:在 `.st-stage-box` 上拖 = 挪选中的文字(没选中文字就挪模型),滚轮缩放;`guides` 参考线开关 - 模型的大小和位置(素材栏「模型」和工程设置里):`field:model-scale` `field:model-x` `field:model-y` `field:model-rot`(数字框,加 `:range` 是滑块)、`model-flip` `model-reset` - 帽子的「戴在哪」:`field:gx` … `field:rz`、`wear-reset`;字色:`style:pink`… 和 `style:custom`(颜色选择器);背景 `field:background`(white / transparent / color / gradient) - 我的工程弹窗:`project-save` `project-save-new`,卡片 `[data-ax="project-item"][data-origin]` 里的 `project-open` `project-remove` - 导出:`export-format`(gif / video / png-zip / png)`export-size` `export-colors` `export-maxkb` `export-loops` `export-start` - 素材栏:`drawer:templates|text|motion|face|fx|prop|wear|skin|model|workshop`;搜索 `search`;只看收藏 `fav-only` - 素材:`[data-ax="item"][data-type][data-id]` 里面的 `use`(换上)、`add-layer`(再叠一层)、`fav`(收藏) - 工坊:`workshop-tab:browse|mine`、`workshop-filter:all|fav|added|scene|model|motion|fx|textanim|face|prop|wear|skin`、卡片 `[data-ax="workshop-item"][data-id]` 里的 `workshop-add` `workshop-add-use` `workshop-use` `workshop-remove`;组件库 `library-use` `library-remove`。点了要等的按钮会带 `aria-busy="true"`,做完才去掉 - 模型:`model:id`(换上)、`model-remove`、`models-workshop`、`load-model`、`model-face` - 字体(文字抽屉和文字图层的属性里):`font:id`、`import-font`、`font-all` - 分享弹窗:`share-url`(完整链接)、`share-make-short`、`share-short-url`、`share-short-left`(还剩几秒) - 预览没启动:`boot-retry`(重试) - 舞台:`zoom` `stage-bg` `quality`(自动 / 流畅 / 清晰);播放 `play` `first` `prev` `next` `last` `scrub` `speed` `onion` - 时间轴:`[data-ax="layer"][data-layer][data-type][data-component]`,里面 `layer-select` `layer-visible` - 属性面板:`layer-up` `layer-down` `layer-duplicate` `layer-delete` `deselect`,参数输入框 `field:参数名`(数字框)和 `field:参数名:range`(滑块) - 弹窗:`[data-ax="dialog"]` 里的 `dialog-ok` `dialog-close`、输入框 `dialog-input:标签` - 不用浏览器原生的 confirm / prompt:所有确认都是页面里的弹窗,能正常点。 - 接口参数不对(没有这个组件 / 图层、时间段倒过来、格式不支持)会直接抛错并说明原因,不会悄悄做错。 ## 概念 - 工程(project)= 画布设置 + 一叠图层。图层类型:motion 动作(可以叠多个)、face 表情、prop 道具、wear 帽子、fx 特效、text 文字(带文字动画 textanim)、scene 场景组件。 - 组件(component)是一段 `component({...})` JavaScript,只在沙盒 iframe 里跑(不透明来源,不能联网)。 - 「工坊」= 仓库里 workshop/components 文件夹。添加 = 下载到这台设备浏览器的组件库(IndexedDB),之后在它那一类里能用;删除 = 从浏览器里真的删掉。 - 只有水龙卷这种多种效果拼起来、代码很多的整帧场景才叫「组件」(类型 scene);工坊里的动作、特效、文字动画下载后分别出现在「动作」「特效」「文字」里。 - 模型也在工坊里(仓库 workshop/models,类型 model):添加 = 把 .glb 存进这台设备的库;用了工坊里的模型,分享出去别人也能打开,自己载入的模型文件只在本机。 - 字体:文字图层可以换字体、导入 .ttf / .otf / .woff / .woff2(存在本机的库里)。 - 分享:完整链接把工程整个装在链接里;短链接 1 分钟后失效(工程在浏览器里加密,只把密文交给公开中转站 ntfy.sh)。 ## 性能 编辑器按设备分档(`axo.state().perf`):有显卡加速的电脑高画质;手机 / 平板标准;没有显卡加速(软件渲染)的省电预览。预览和 GIF 一样一帧一帧地换,每帧画一次就缓存;导出总是全画质。 引擎一般在沙盒开的 Worker 里跑(`axo.state().perf.thread` 是 `worker`,跑不起来时是 `page`),不占编辑器界面的线程;导出时界面照常能点。 画布上的表情字只下用到的那几个字的字体切片;切片没下下来时导出会报错(不会导出系统字体的图),网络好了再改一下字就行。