Files
MetonaToast/README.md
T

254 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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)
## 特性
- **零依赖** — 纯原生 JavaScriptgzip 后不到 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
<!-- CDN UMD 开发版 -->
<script src="https://unpkg.com/metona-toast@2.0.0/dist/metona-toast.js"></script>
<!-- CDN 压缩版(生产环境推荐) -->
<script src="https://unpkg.com/metona-toast@2.0.0/dist/metona-toast.min.js"></script>
<!-- CDN ES Module -->
<script type="module">
import MeToast from 'https://unpkg.com/metona-toast@2.0.0/dist/metona-toast.esm.js';
</script>
```
## 环境与版本支持
| 环境 | 最低版本 |
|------|---------|
| Chrome | 64+ |
| Firefox | 63+ |
| Safari | 11+ |
| Edge | 79+ |
| Opera | 51+ |
| iOS Safari | 11+ |
| Android Chrome | 64+ |
| Node.js | 18+ESM & CJS 双格式) |
| TypeScript | 4.5+(完整类型声明) |
核心依赖:Web Animations APIChrome 64+, Firefox 63+, Safari 11+)、Pointer Events、CSS Grid、CSS Custom Properties。
## 快速开始
浏览器中 `window` 上会注册两个全局变量:`MeToast``Met`,两者完全等价,任选其一使用。
```javascript
import MeToast from 'metona-toast';
// 也可以使用 Met — 与 MeToast 完全等价
Met.success('使用 Met 同样可用');
// 基础用法
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<boolean>
const ok = await MeToast.confirm('确定删除?', { confirmText: '删除', confirmColor: '#ef4444' });
// 输入对话框 → Promise<string|null>
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