# MetonaToast 轻量、零依赖、精致美观的 Toast 通知库。 [![npm version](https://img.shields.io/npm/v/metona-toast.svg)](https://www.npmjs.com/package/metona-toast) [![bundle size](https://img.shields.io/bundlephobia/minzip/metona-toast)](https://bundlephobia.com/package/metona-toast) [![license](https://img.shields.io/badge/license-MIT-green.svg)](https://gitee.com/thzxx/MetonaToast) ## 特性 - **零依赖** — 纯原生 JavaScript,gzip 后不到 10KB - **80+ 图标类型** — success/error/warning/info/loading 及更多扩展类型 - **11 种动画** — slide/fade/scale/bounce/flip/rotate/zoom/slideUp/slideDown/slideLeft/slideRight,每种效果明显不同 - **主题系统** — light/dark/auto/warm 四种内置主题,支持 `registerTheme()` 注册自定义主题 - **国际化** — 内置 zh-CN / en-US 完整翻译,可通过 `addTranslations()` 扩展 - **插件系统** — 3 款预设插件 (keyboard/persistence/accessibility) + 自定义插件 - **可拖拽关闭** — 拖动 Toast 任意方向即可关闭 - **TypeScript** — 完整类型定义 ## 安装 ```bash npm install metona-toast ``` ### 引用方式 ```javascript // ES Module import MeToast from 'metona-toast'; // CommonJS const MeToast = require('metona-toast'); ``` ```html ``` ## 快速开始 ```javascript import MeToast from 'metona-toast'; // 基础用法 MeToast.success('操作成功!'); MeToast.error('操作失败!'); MeToast.warning('请注意检查'); MeToast.info('系统维护中'); // 带标题 MeToast.success({ title: '保存成功', message: '文件已同步到云端' }); // 加载 → 成功链式转换 const loading = MeToast.loading('正在提交...'); setTimeout(() => loading.success('提交成功!'), 2000); // Promise 风格 await MeToast.promise(fetch('/api/data'), { loading: '加载中...', success: '加载完成!', error: '加载失败', }); ``` ## 全局配置 ```javascript MeToast.configure({ position: 'top-right', // top-left | top-center | top-right | bottom-left | bottom-center | bottom-right duration: 4000, // 显示时长(ms),0 为不自动关闭 max: 6, // 同时最多显示条数 theme: 'auto', // light | dark | auto | warm animation: 'slide', // slide | fade | scale | bounce | flip | rotate | zoom | slideUp | slideDown | slideLeft | slideRight pauseOnHover: true, // 悬停暂停计时 closeOnClick: true, // 点击关闭 showProgress: true, // 显示进度条 draggable: true, // 允许拖拽关闭 locale: 'zh-CN', // 语言 }); ``` ## 动画效果 11 种动画,每种感官差异明显: | 动画 | 效果描述 | |------|----------| | `slide` | 从右侧滑入 + 轻微过冲回弹 | | `fade` | 纯淡入(blur→清晰),从容优雅 | | `scale` | 弹性放大(0.55→1.07→1.0) | | `bounce` | 从天而降四段弹跳 | | `flip` | 3D 翻转入场 + 回摆 | | `rotate` | 旋转摇摆进入 | | `zoom` | 从中心爆发式弹出 | | `slideUp` | 从下方弹入 | | `slideDown` | 从上方弹入 | | `slideLeft` | 从左侧滑入 | | `slideRight` | 从右侧滑入 | ```javascript MeToast.success('弹跳动画', { animation: 'bounce' }); // 注册自定义动画 MeToast.animations.register('myAnim', { enter: { transform: 'rotate(-30deg) scale(0.5)', opacity: 0 }, leave: { transform: 'rotate(0) scale(1)', opacity: 1 }, duration: 500, easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)', }); ``` ## 主题 ```javascript // 切换主题 MeToast.themes.switchTheme('dark'); MeToast.themes.switchTheme('warm'); // 注册自定义主题 MeToast.themes.registerTheme('ocean', { bg: 'rgba(240, 249, 255, 0.96)', text: '#0c4a6e', border: 'rgba(14, 165, 233, 0.2)', shadow: '0 10px 36px -10px rgba(14, 165, 233, 0.18)', hoverShadow: '0 14px 48px -10px rgba(14, 165, 233, 0.22)', progressBg: 'rgba(14, 165, 233, 0.1)', closeHoverBg: 'rgba(14, 165, 233, 0.1)', }); MeToast.themes.switchTheme('ocean'); ``` ## 高级功能 ```javascript // 确认对话框 → Promise const ok = await MeToast.confirm('确定删除?', { confirmText: '删除', confirmColor: '#ef4444' }); // 输入对话框 → Promise const name = await MeToast.prompt('请输入姓名', { placeholder: '请输入...' }); // 进度条 const p = MeToast.progress('上传中...'); p.setProgress(60); p.complete('上传完成!'); // 倒计时({seconds} 自动替换) MeToast.countdown('操作将在 {seconds} 秒后执行', 5, { onComplete: () => MeToast.success('已执行'), }); // 队列展示(顺序逐个) await MeToast.queue(['步骤一', '步骤二', '步骤三'], { delay: 800 }); // 堆叠展示(同时错峰) MeToast.stack(['消息1', '消息2', '消息3'], { stagger: 150 }); ``` ## 插件 ```javascript // 安装预设插件 MeToast.use('keyboard'); // ESC 关闭所有 Toast MeToast.use('persistence'); // 配置持久化到 localStorage MeToast.use('accessibility'); // 屏幕阅读器朗读公告 // 自定义插件(通过 install 中注册 Toast 生命周期钩子) import MeToast, { Toast } from 'metona-toast'; MeToast.use({ name: 'my-plugin', install() { Toast.on('afterShow', (toast) => { console.log('Toast shown:', toast.message); }); }, }); ``` ## 国际化 ```javascript MeToast.i18n.switchLocale('en-US'); // 添加语言 MeToast.i18n.addTranslations('ja', { success: '成功', error: 'エラー', confirm: '確認', cancel: 'キャンセル', }); // 格式化工具 MeToast.i18n.formatNumber(1234567); // "1,234,567" MeToast.i18n.formatCurrency(99, 'CNY'); // "¥99.00" ``` ## Toast 管理 ```javascript MeToast.count(); // 当前数量 MeToast.getToasts(); // 获取所有实例 MeToast.dismiss(); // 关闭所有 MeToast.dismiss(id); // 关闭指定 MeToast.pauseAll(); // 暂停所有计时 MeToast.resumeAll(); // 恢复所有计时 MeToast.destroy(); // 完全销毁 ``` ## 回调 ```javascript MeToast.success({ message: '操作成功', onShow: (toast) => console.log('显示:', toast.id), onClose: (toast) => console.log('关闭:', toast.id), onClick: (toast) => console.log('点击:', toast.id), }); ``` ## License MIT