@5even7/dlc-ui 0.2.17 → 0.2.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/README.md +27 -5
- package/THIRD_PARTY_NOTICES.md +40 -0
- package/dist/capsule.cjs +4 -2
- package/dist/capsule.mjs +2 -2
- package/dist/emo.cjs +1308 -398
- package/dist/emo.mjs +1186 -382
- package/dist/index.cjs +980 -190
- package/dist/index.mjs +1075 -386
- package/dist/index.umd.js +980 -190
- package/dist/index.umd.min.js +1 -1
- package/dist/vue2.cjs +888 -191
- package/dist/vue2.mjs +978 -377
- package/dist/vue3.cjs +888 -191
- package/dist/vue3.mjs +978 -377
- package/package.json +3 -2
- package/styles/emo.css +58 -2
- package/types/emo.d.ts +24 -1
- package/types/index.d.ts +157 -20
- package/types/vue3.d.ts +9 -7
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
> **发版规则**:默认每次发布只递增补丁号(0.x.y → 0.x.(y+1),即 +0.01);除非手动明确指定新版本号,否则不升次版本。
|
|
4
4
|
|
|
5
|
+
## 0.2.18 - 2026-08-15
|
|
6
|
+
- 新增第二个表情家族 `type="grok"`:纯 SVG Path Morph 动态角色(非 Lottie),内置 13 个语义状态(情绪 / Agent 状态 / 生命周期)、8 种身体形态、随机表情池与眨眼节奏、身体动作动画(bounce / tilt / scan / turn / pulse / glitch)、pointer 视线跟随交互。
|
|
7
|
+
- `createEmo` / `DlcEmo` 新增 `type`、`shape`、`interactive` 选项与 `setShape()` / `setInteractive()` 方法;`partColors` 对 grok 支持 `body` / `eyes` 两部位。TypeScript 改为判别联合(`MiaoEmoOptions` / `GrokEmoOptions`)。
|
|
8
|
+
- 架构重构:`emo.js` 收敛为公共 Facade,Miao(Lottie)与 Grok(SVG Morph)各自独立 Renderer;结构属性变更重建渲染器,行为属性变更实时转发;Grok 数据全部本地打包、离线可用。
|
|
9
|
+
- 新增 `getEmoType()` API 与 `EMO_CATEGORIES` 新分组;新增 THIRD_PARTY_NOTICES.md(LaoA-GrokBot MIT 声明)并加入 npm 发布文件列表。
|
|
10
|
+
- 修复(经外部 AI 代码审查验证):
|
|
11
|
+
- 修复 Grok 表情节奏被 `speed` 重复缩放(速度平方)的问题,`speed` 现在只生效一次。
|
|
12
|
+
- 修复共享 rAF Scheduler 全部暂停后 Grok `play()` / 页面重新可见无法唤醒动画循环的问题。
|
|
13
|
+
- Grok 眼睛现在由与身体形态同步的 `clipPath` 裁剪(对齐原版实现),`setShape()` 会同步更新裁剪路径,clipPath id 按实例唯一。
|
|
14
|
+
- Grok `fit`(contain / cover / fill)现在真正生效:svg 按 fit 映射 `preserveAspectRatio`(meet / slice / none)。
|
|
15
|
+
- Grok 的 `renderer` 对外恒为 `'svg'`,miao→grok→miao 往返时 miao 的 renderer 偏好(canvas/svg)不再丢失。
|
|
16
|
+
- `setName()` 改为事务式:非法名称在销毁旧动画前即抛错,原动画保持挂载。
|
|
17
|
+
- 修正 THIRD_PARTY_NOTICES.md 中的来源仓库与版权信息;版本号同步为 0.2.18。
|
|
18
|
+
- Grok 状态展示体系:新增 `GROK_STATE_META`(category / label / description / source 元数据)与派生列表 `GROK_NAMES` / `GROK_CATEGORIES`,以及 `getGrokStateMeta()` / `getGrokNamesFor()` 查询函数;13 个公开 name 全部保留,分类(情绪 / Agent 状态 / 生命周期)不影响公开 API。新增 `createEmoPreviewCard()` 轻量卡片预览控制器:默认静态,hover / focus 时临时播放约 2.8 秒,离开 / 移出视口 / 系统减少动态时立即暂停,避免多卡片同时长驻动画。Docs 的 Grok 区块改为不分类、平铺全部状态 + 动态预览卡片,并补充 Grok name = 动态状态模组 的说明。
|
|
19
|
+
- Grok 状态精简:按「静态首帧同一张脸只保留一个代表」归并,移除 26 个重复/近重复状态,公开 name 从 39 精简为 13(保留 `idle / sleeping / loading / thinking / listening / searching / working / happy / surprised / angry / sad / confused / receiving`)。
|
|
20
|
+
- 移除「推荐」体系:`recommended` 元数据字段与 `GROK_RECOMMENDED_NAMES` 删除,Docs 默认展示全部状态。
|
|
21
|
+
- 13 个状态的名称与描述不再照搬上游,改为按 25 组表情几何逐帧核对后重写(如 `idle 待机→平静`、`loading 加载→缓冲中`、`listening 倾听→聆听`、`working 工作→专注`、`confused 困惑→疑惑`、`searching 搜索→寻找`、`sleeping 睡眠→睡觉`),描述贴合实际眼神与动效。
|
|
22
|
+
- Capsule `pointerenter` / `pointerleave` 事件负载补齐 `event`,与文档 `{ event, preset }` 一致。
|
|
23
|
+
- Vue wrapper 补齐 Capsule `setSeed()` / `setSpeed()` 与 Progress `setEdgeStyle()`,与 H5 控制器及文档方法表对齐。
|
|
24
|
+
- 文档一致性:README `change.source` 更正为 `drag / keyboard / prop`;Grok 分类与 `GROK_CATEGORIES` 对齐;修正历史版本中“移除 Progress keyboard 控制”的过时说明(当前版本保留 `keyboard`,默认开启);削除从未被消费的 `--dlc-emo-play-state` CSS 变量。
|
|
25
|
+
|
|
5
26
|
## 0.2.17 - 2026-08-15
|
|
6
27
|
- Miao表情包优化展示,表情包拆分模块变更部分颜色属性
|
|
7
28
|
|
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# @5even7/dlc-ui
|
|
2
2
|
|
|
3
|
-
框架无关的 **星云胶囊**、**流体进度胶囊**、**星云背景层(dlc-color)** 与
|
|
3
|
+
框架无关的 **星云胶囊**、**流体进度胶囊**、**星云背景层(dlc-color)** 与 **动态表情(dlc-emo)** 组件库。一套核心,H5 / Vue2 / Vue3 都能用。
|
|
4
4
|
|
|
5
|
-
星云组件使用 WebGL2 实时渲染,不可用时自动降级 Canvas2D;Emo
|
|
5
|
+
星云组件使用 WebGL2 实时渲染,不可用时自动降级 Canvas2D;Emo 内置 `type="miao"`(按需加载的 `lottie-web` 轻量矢量播放器,可选 SVG / Canvas)与 `type="grok"`(纯 SVG Path Morph 动态角色,无需任何播放器库)。现代浏览器加载原生 ESM,旧工具链可使用转译后的 legacy 构建。
|
|
6
6
|
|
|
7
7
|
## 发版规则
|
|
8
8
|
|
|
@@ -25,7 +25,10 @@ npm install @5even7/dlc-ui
|
|
|
25
25
|
|
|
26
26
|
`dlc-color` 复用同一套星云渲染器,只做背景层,直接使用上表 capsule 的 6 个预置。
|
|
27
27
|
|
|
28
|
-
`dlc-emo`
|
|
28
|
+
`dlc-emo` 提供两个表情家族:
|
|
29
|
+
|
|
30
|
+
- `type="miao"`:Lottie 动作表情,内置 23 个动作名:`angry / cry / sad / sigh / investigate / mute / ponder / question / static / asleep / yawn / badminton / confident / laugh / leisure / music / smile / yummy / mock / shy / snigger / panic / shocked`。
|
|
31
|
+
- `type="grok"`:SVG Path Morph 动态角色,内置 13 个语义状态(分类与公开 API 一致,见 `GROK_CATEGORIES`):情绪(`idle / happy / surprised / sad / angry / confused`)、Agent 状态(`loading / thinking / searching / working / listening / receiving`)、生命周期(`sleeping`)。支持 `shape`(`blob / pebble / squircle / capsule / triangle / hex / cloud / drop`)与 `interactive`(pointer 视线跟随),`partColors` 为 `body` / `eyes` 两部位。
|
|
29
32
|
|
|
30
33
|
`preset` 只接受上表中的文学名称(如 `'沧溟'`),大小写不敏感、首尾空格忽略;不传时使用默认预置 `初光`(胶囊/背景层)或 `星火`(进度条)。`colors`、`seed`、`speed` 是独立属性,传了覆盖预置内置值,不传用预置默认值。
|
|
31
34
|
|
|
@@ -82,6 +85,25 @@ emo.setName('laugh').setSegment([0, 80]);
|
|
|
82
85
|
// 宿主销毁时:emo.dispose();
|
|
83
86
|
```
|
|
84
87
|
|
|
88
|
+
Grok 动态角色:
|
|
89
|
+
|
|
90
|
+
```js
|
|
91
|
+
const grok = createEmo(document.querySelector('#grok-host'), {
|
|
92
|
+
type: 'grok',
|
|
93
|
+
name: 'thinking',
|
|
94
|
+
width: 229,
|
|
95
|
+
height: 229,
|
|
96
|
+
shape: 'capsule',
|
|
97
|
+
interactive: true,
|
|
98
|
+
partColors: { body: '#2f86ed', eyes: '#fffdf7' }
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
grok.setName('celebrate').setShape('hex').setInteractive(false);
|
|
102
|
+
// 宿主销毁时:grok.dispose();
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
> Grok 的 `name` 表示一个**动态状态模组**(表情池 + 节奏 + 眨眼 + 身体动作),而不是一张固定表情:不同状态在静态第一帧可能相似,但动态行为不同。13 个公开 name 全部有效,展示元数据见 `GROK_STATE_META`(`category` / `label` / `description` / `source`),分类表 `GROK_CATEGORIES`、查询函数 `getGrokStateMeta(name)` / `getGrokNamesFor(tab)` 均由该元数据派生。需要做 hover 预览卡片时可复用 `createEmoPreviewCard({ container, options, playFor, respectReducedMotion, trackViewport })`:默认静态,进入时播放短预览,离开 / 移出视口 / 系统减少动态时立即暂停。
|
|
106
|
+
|
|
85
107
|
`partColors` 按部位替换颜色(`leftEye` / `rightEye` / `mouth` / `mouthFill` 等,每个部位在素材里有稳定的 `paint.*` 命名通道)。值为任意 CSS 颜色(`#fff` / `#rrggbb` / 命名色 / `rgb()` / `rgba()`,alpha 忽略);未传或为 `null` 的部位保留素材默认色,当前动作不支持的部位会被忽略。外框背景单独用 `background` 控制。
|
|
86
108
|
|
|
87
109
|
工厂调用用 `text` / `colorContent` 选项填插槽;Vue 组件直接用默认插槽和 `#color` 插槽(见下)。
|
|
@@ -268,10 +290,10 @@ createProgressCapsule(el, {
|
|
|
268
290
|
| capsule | `pointerenter` / `pointerleave` | `{ event, preset }` |
|
|
269
291
|
| capsule | `error` | `{ message }`(WebGL2 不可用降级时触发) |
|
|
270
292
|
| progress | `ready` / `presetchange` | `{ preset }` |
|
|
271
|
-
| progress | `change` | `{ value, source }`,source ∈ `drag/prop` |
|
|
293
|
+
| progress | `change` | `{ value, source }`,source ∈ `drag / keyboard / prop` |
|
|
272
294
|
| progress | `dragstart` / `dragend` | `{ value }` |
|
|
273
295
|
| progress | `error` | `{ message }` |
|
|
274
|
-
| emo | `ready` | `{ preset, duration, frames }
|
|
296
|
+
| emo | `ready` | `{ preset, duration, frames }`(grok 无逐帧概念:duration 为 null、不含 frames) |
|
|
275
297
|
| emo | `complete` / `loopComplete` / `segmentStart` | 播放生命周期 |
|
|
276
298
|
| emo | `namechange` / `typechange` | `{ preset }` |
|
|
277
299
|
| emo | `error` | `{ message }` |
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Third Party Notices
|
|
2
|
+
|
|
3
|
+
本组件库使用了以下第三方作品。所有内容均按各自许可条款使用。
|
|
4
|
+
|
|
5
|
+
## LaoA-GrokBot(Grok 表情数据与实现参考)
|
|
6
|
+
|
|
7
|
+
- 来源:https://github.com/zhulin025/LaoA-GrokBot(仅作为数据与算法参考,未分发其完整仓库)
|
|
8
|
+
- 许可证:MIT License
|
|
9
|
+
- 用途:DLC-EMO `type="grok"` 的 13 个语义状态、25 组表情几何数据(`GROK_EXPRESSIONS`)、眨眼/表情节奏参数、8 种身体形态与 SVG Path Morph 算法的参考实现。
|
|
10
|
+
- 本仓库中生成的 `src/dlc-emo/assets/grok/data.js` 源自该项目 `original-data.js` 的转换数据。
|
|
11
|
+
|
|
12
|
+
MIT License 全文:
|
|
13
|
+
|
|
14
|
+
> MIT License
|
|
15
|
+
>
|
|
16
|
+
> Copyright (c) 2026 老A玩AI
|
|
17
|
+
>
|
|
18
|
+
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
19
|
+
> of this software and associated documentation files (the "Software"), to deal
|
|
20
|
+
> in the Software without restriction, including without limitation the rights
|
|
21
|
+
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
22
|
+
> copies of the Software, and to permit persons to whom the Software is
|
|
23
|
+
> furnished to do so, subject to the following conditions:
|
|
24
|
+
>
|
|
25
|
+
> The above copyright notice and this permission notice shall be included in all
|
|
26
|
+
> copies or substantial portions of the Software.
|
|
27
|
+
>
|
|
28
|
+
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
29
|
+
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
30
|
+
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
31
|
+
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
32
|
+
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
33
|
+
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
34
|
+
> SOFTWARE.
|
|
35
|
+
|
|
36
|
+
## lottie-web
|
|
37
|
+
|
|
38
|
+
- 来源:https://github.com/airbnb/lottie-web
|
|
39
|
+
- 许可证:MIT License
|
|
40
|
+
- 用途:DLC-EMO `type="miao"` 的 Lottie 动画播放器。
|
package/dist/capsule.cjs
CHANGED
|
@@ -1366,13 +1366,15 @@ function createCapsule(container) {
|
|
|
1366
1366
|
var isMotionPaused = function isMotionPaused() {
|
|
1367
1367
|
return manuallyPaused || reducedPaused || staticMode || contextLost;
|
|
1368
1368
|
};
|
|
1369
|
-
root.addEventListener('pointerenter', function () {
|
|
1369
|
+
root.addEventListener('pointerenter', function (event) {
|
|
1370
1370
|
return emitter.emit('pointerenter', {
|
|
1371
|
+
event: event,
|
|
1371
1372
|
preset: _objectSpread2({}, preset)
|
|
1372
1373
|
});
|
|
1373
1374
|
});
|
|
1374
|
-
root.addEventListener('pointerleave', function () {
|
|
1375
|
+
root.addEventListener('pointerleave', function (event) {
|
|
1375
1376
|
return emitter.emit('pointerleave', {
|
|
1377
|
+
event: event,
|
|
1376
1378
|
preset: _objectSpread2({}, preset)
|
|
1377
1379
|
});
|
|
1378
1380
|
});
|
package/dist/capsule.mjs
CHANGED
|
@@ -1159,8 +1159,8 @@ function createCapsule(container, options = {}) {
|
|
|
1159
1159
|
reducedPaused = motionPreference.matches();
|
|
1160
1160
|
const isMotionPaused = () => manuallyPaused || reducedPaused || staticMode || contextLost;
|
|
1161
1161
|
|
|
1162
|
-
root.addEventListener('pointerenter', () => emitter.emit('pointerenter', { preset: { ...preset } }));
|
|
1163
|
-
root.addEventListener('pointerleave', () => emitter.emit('pointerleave', { preset: { ...preset } }));
|
|
1162
|
+
root.addEventListener('pointerenter', (event) => emitter.emit('pointerenter', { event, preset: { ...preset } }));
|
|
1163
|
+
root.addEventListener('pointerleave', (event) => emitter.emit('pointerleave', { event, preset: { ...preset } }));
|
|
1164
1164
|
root.addEventListener('click', (event) => {
|
|
1165
1165
|
emitter.emit('click', { event, preset: { ...preset } });
|
|
1166
1166
|
});
|