# Changelog All notable changes to MetonaToast will be documented in this file. ## [0.5.0] - 2026-08-08 ### Changed - **覆盖率 96.42%(行)**:新增 59 个测试用例(共 385),覆盖 DOM 交互事件(click/drag/hover/animation)、confirm/prompt/action 按钮交互、Intl/localStorage 异常路径、React 渲染生命周期 - **测试环境重构**:SSR 分支测试用 `Object.defineProperty` 真正覆盖 document/window(jsdom getter 使此前赋值无效);新增 `tests/dom.test.ts`(jsdom 真实 DOM 事件驱动)、`tests/setup.ts`(TextEncoder 补丁) - **jest 覆盖率门禁**:`lines >= 95%`,未达标测试即失败 ### Fixed - **`Toast.off` 空数组残留**:移除全部钩子后删除 Map key(此前空数组残留导致 `_hooks.has()` 误报 true) - **`Toast.on` 返回的取消函数 this 绑定**:改用类名引用,任意调用上下文可用 - **action 按钮 `close:false` 失效**:按钮 click 冒泡到 toast 的 closeOnClick 处理器导致总是关闭,已 stopPropagation 修复 - **`use()` 重复注册钩子**:accessibility/persistence 预设的钩子注册改为防重复(先卸载旧钩子),并在插件 `uninstall` 中一并清理 - **i18n catch 引用错误**:`catch {}` 中残留 `e` 引用导致的 ReferenceError(saveLocale/loadLocale/notifyLocaleListeners) - **删除残缺死代码**:`styles.autoApplySystemTheme`(无实际效果的占位实现) ### Removed - **lint 零警告**:`no-console` 规则关闭(库的错误报告依赖 console,生产构建已由 terser `drop_console` 剥离);catch 变量通过 `caughtErrorsIgnorePattern` 豁免 ### Added - **Gitea Actions 发布自动化**:`publish.yml` — 推送 `v*` tag 时自动 测试+构建+发布到 Gitea npm registry(需配置 `PACKAGES_TOKEN` secret) - **CI 强化**:lint 改为必过(移除 continue-on-error);测试命令带覆盖率门禁 - **CJS 产物兼容性修复**:包声明 `type: module` 下 `.js` 产物被 Node 按 ESM 解析导致 `require()` 失效,CJS 产物改 `.cjs` 扩展名并将 default 提升为 `module.exports`(`require()` 直接返回 MeToast,兼容 `.default`/`.MeToast`/`.Met`/`.Toast`/`.VERSION` 全部用法) ## [0.4.0] - 2026-08-08 ### Added - **React 适配器子包**:`@metona-team/metona-toast/react` — `useToast()` hook(组件卸载时自动移除本组件创建的 Toast)+ 声明式 `` 组件(props 变化更新、卸载自动清理)。主包保持零依赖,`react` 为 optional peerDependency - **`dedupe` 预设插件**:相同 type+message 的 Toast 自动去重(更新已有实例而非重复弹出),支持 uninstall - **`dragThreshold` 配置项**:拖拽关闭阈值可配置(默认 120px,原为硬编码) - **RTL 完整适配**:容器设置 `dir="rtl"`,进度条/side 条/类型色条/圆角正确镜像 - **`update({ duration })` 支持**:动态变更显示时长并自动重启/停止计时器(此前 update 忽略 duration) - **幽灵实例修复**:`_emit` 检查 `create()` 结果,beforeShow 拦截后的 toast 不再注册到 `_toasts`(此前会残留幽灵记录,影响 count 与去重类插件) ### Changed - **loading 链式转换 id 稳定**:`loading.success/error/info/warning` 由"关闭旧 + 新建"改为原地 `update()` 同一实例,返回的 Toast id 与 loading id 一致;转换后 duration 自动恢复默认值(自动关闭)。注:转换不再产生新的入场动画,改为平滑更新;关闭按钮/进度条保持 loading 配置(如需默认外观,请通过 opts 覆盖) ## [0.3.0] - 2026-08-08 ### Fixed - **自定义动画真实生效**:`animations.register()` 注册的动画此前仅写入内存 Map,实际渲染始终 fallback 到 slide。现在注册表驱动 `_buildClassName` 并动态注入对应 `@keyframes` + 类规则,README 的注册教程名实相符 - **`max` 超限真正关闭最早的 toast**:此前超限时仅从内存 Map 删除记录,DOM 上的旧 toast 依然显示。现在通过实例注册表找到最早的 toast 并真正 `close()`(触发离场动画与生命周期回调) - **`destroy()` 全量清理**:新增清理 `Toast._hooks` 钩子、`Toast._registry` 实例注册表、`metona-toast-theme-css` / `metona-toast-custom-styles` / `metona-toast-anim-styles` 样式标签;动画注册表改为真正清空 - **`applyThemeVariables` 重复注入**:修复多次调用追加相同 id 的 style 标签问题(改为先移除旧元素) - **`init()` 复活**:`destroy()` 后调用 `init()` 重置 `_destroyed` 标志,恢复可初始化状态 - **失效脚本清理**:删除 `docs`(typedoc 未安装)、`example`(examples/ 目录不存在)脚本,新增 `serve` 脚本 - **`AnimationConfig.enter/leave` 类型放宽**:支持 `opacity: 0` 等数值属性(此前仅 `string`,README 示例在 TS 严格模式下报错) ### Added - **钩子系统完整化**:此前 `HOOK_NAMES` 声明 20+ 钩子但多数永不触发。现在全部声明均有触发点: - 拦截语义:`beforeClose` / `beforeUpdate` 返回 `false` 可分别阻止关闭、更新 - 新触发点:`click` / `hover` / `dragStart` / `dragEnd` / `animationStart` / `animationEnd` / `progressStart` / `progressEnd` / `configChange` / `themeChange` / `localeChange` / `beforeInit` / `afterInit` / `beforeDestroy` / `afterDestroy` - **`init({ plugins })` 支持插件对象**:与 `use()` 一致,可传 `string | Plugin` ### Changed - **VERSION 唯一来源**:版本号统一在 `src/constants.ts` 维护,`api.ts` / `index.ts` 引用,消除三处硬编码漂移 - **`HOOK_NAMES` 收敛**:移除永不触发的 `progressUpdate` / `custom` 声明 - 版本升级至 **v0.3.0**(含行为增强,按 semver minor 处理) ## [0.2.1] - 2026-07-25 ### Fixed - **`auto` 主题配置死值**:`THEMES.auto` 改为合法 CSS 值(复用 light 默认值),避免 `getThemeConfig('auto')` 返回无意义字符串 - **`resolveTheme` 循环逻辑**:`resolveTheme('auto')` 始终检测系统主题,不再依赖 `currentTheme` 全局状态 - **`formatList` 国际化**:优先使用 `Intl.ListFormat`,降级到逗号拼接,支持各语言原生列表格式 - **RTL 容器定位**:RTL 语言自动翻转 left/right 位置,容器创建时正确适配 - **`_containerCache` 泄露**:`index.ts` 的 `destroy()` 中增加 `_containerCache.clear()`,与 `api.ts` 保持一致 ### Changed - **代码去重**:消除 `index.ts` 与 `api.ts` 之间 11 个方法的重复定义,统一在 `api.ts` 实现 - **Toast 回调注入**:`Toast._onError` / `Toast._removeToast` 改为 `Toast.setCallbacks()` 静态方法,消除隐式契约 - **Stub 方法替换**:`api.ts` 中 7 个 stub 方法替换为完整实现(init/use/destroy/getStatus/getConfig/updateConfig/resetConfig) - **ESLint 规则**:新增 `@typescript-eslint/no-explicit-any` (warn) 和 `prefer-const` (warn) ### Added - **`beforeShow` 拦截**:钩子函数返回 `false` 可阻止 Toast 显示;配置 `onBeforeShow` 回调支持同样能力 - **`updatePosition()` 方法**:允许运行时移动 Toast 到不同位置容器 - **`remove()` + `removeToast()` 方法**:立即移除 Toast(不触发离场动画),提供无动画的快速清除 API ## [0.2.0] - 2026-07-25 ### Changed - **TypeScript 源码重构**:全部源码从 JavaScript 迁移到 TypeScript - 删除手动维护的 `types/index.d.ts`,类型由源码自动生成 - `core.js` (1244行) 拆分为 `toast.ts` + `api.ts` + `templates.ts` - 构建工具链:Babel → `ts-jest`,新增 `@rollup/plugin-typescript` - 测试迁移至 TypeScript (`tests/index.test.ts`) ### Added - `tsconfig.json` (strict: true) - `src/types.ts` 核心类型模块 - `.eslintrc.json` ESLint 配置 - `.gitea/workflows/ci.yml` CI 工作流 - `CHANGELOG.md` ### Removed - `babel.config.js` - `types/` 目录 ## [0.1.2] - 2026-07-24 ### Fixed - 补全和修正 TypeScript 类型声明 - 全面修复、优化与增强 ## [0.1.1] - 2026-07-23 ### Changed - 版本号重置,更新文档页面 ## [0.1.0] - 2026-07-22 ### Added - 初始发布 - 107 种内置图标 - 11 种动画效果 - 4 种主题(light/dark/auto/warm) - 国际化支持 (zh-CN/en-US) - 插件系统 (keyboard/persistence/accessibility) - 拖拽关闭、进度条、倒计时等高级特性 - TypeScript 类型声明 - 零依赖