release: v0.4.0 — React 适配器、loading链式id稳定、dragThreshold、RTL适配、dedupe插件

- React 适配器子包:@metona-team/metona-toast/react — useToast() hook + 声明式 <Toast /> 组件,组件卸载自动清理;react 为 optional peerDependency,主包保持零依赖
- loading 链式转换改原地 update:id 稳定不重建 DOM,转换后 duration 恢复默认自动关闭;update() 支持 duration 变更动态重启计时器
- _emit 幽灵实例修复:beforeShow 拦截后的 toast 不再注册进 _toasts
- dragThreshold 配置项(默认 120px,原硬编码);RTL 容器 dir 属性 + 进度条/side 条/色条镜像
- dedupe 预设插件:相同 type+message 自动去重,支持 uninstall
- jest 环境隔离测试独立成 tests/ssr.test.ts(resetModules 不再污染共享模块状态);新增 tests/setup.ts 补 TextEncoder
- 文档:README/docs.html 补 React 适配器、dedupe、dragThreshold;CHANGELOG 更新;328 测试全过
This commit is contained in:
tianhao
2026-08-08 14:45:19 +08:00
parent 2937ce5e2d
commit bbff631f4f
41 changed files with 10761 additions and 161 deletions
+17 -7
View File
@@ -1,7 +1,7 @@
/**
* MetonaToast API — meToast 核心 API 对象
* @module api
* @version 0.3.0
* @version 0.4.0
*/
import { Toast, _containerCache } from './toast.js';
@@ -78,7 +78,10 @@ const meToast: MeToast = {
const t = new Toast(merged);
t.create();
this._toasts.set(t.id, t);
// beforeShow/onBeforeShow 拦截(返回 false)时 el 为 null,不注册幽灵实例
if (t.el !== null) {
this._toasts.set(t.id, t);
}
return t;
},
@@ -159,15 +162,22 @@ const meToast: MeToast = {
});
},
/**
* loading 链式转换 — 原地 update 同一实例(id 稳定,不重建 DOM)
* duration 从 0 恢复为默认值,使转换后的 toast 自动关闭
*/
_resolve(loadingToast: ToastInstance, type: string, message: string, opts: ToastOptions): ToastInstance | null {
const id = loadingToast.id;
const old = this._toasts.get(id);
const old = this._toasts.get(loadingToast.id);
if (!old) return null;
const position = old.config.position;
old.close();
old.update({
...opts,
type,
message,
duration: opts.duration ?? (old.config.duration || this._config.duration),
} as ToastOptions);
return this._emit({ ...opts, type, message, position } as ToastOptions);
return old;
},
confirm(message: string, opts: ConfirmOptions = {}): Promise<boolean> {