zan-layer 1.0.0
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/README.md +197 -0
- package/lib/index.css +1 -0
- package/lib/zan-layer.js +1150 -0
- package/lib/zan-layer.umd.js +1 -0
- package/package.json +52 -0
- package/types/component/Footer.vue.d.ts +19 -0
- package/types/component/Header.vue.d.ts +20 -0
- package/types/component/HeaderBtn.vue.d.ts +19 -0
- package/types/component/Iframe.vue.d.ts +6 -0
- package/types/component/Notifiy.vue.d.ts +17 -0
- package/types/component/Photos.vue.d.ts +14 -0
- package/types/component/Prompt.vue.d.ts +16 -0
- package/types/component/Render.vue.d.ts +6 -0
- package/types/component/Shade.vue.d.ts +16 -0
- package/types/component/Tips.vue.d.ts +7 -0
- package/types/component/ZanLayer.vue.d.ts +79 -0
- package/types/composable/useDragable.d.ts +2 -0
- package/types/index.d.ts +28 -0
- package/types/tokens/index.d.ts +3 -0
- package/types/types/index.d.ts +99 -0
- package/types/utils/index.d.ts +43 -0
- package/types/utils/render.d.ts +3 -0
package/README.md
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# ZanLayer
|
|
2
|
+
|
|
3
|
+
一个功能完整的 Vue 3 弹层组件库,基于 layui-vue layer 架构开发。
|
|
4
|
+
|
|
5
|
+
## ✨ 特性
|
|
6
|
+
|
|
7
|
+
- 🎯 **7种弹窗类型** - Dialog、Page、Iframe、Loading、Drawer、Photos、Notify、Prompt
|
|
8
|
+
- 🎨 **6种动画效果** - 缩放、掉落、飞入、旋转、渐显、抖动
|
|
9
|
+
- 🖱️ **拖拽和调整** - 支持拖拽移动和右下角拉伸调整大小
|
|
10
|
+
- 📐 **最大化/最小化** - 完整的窗口控制功能
|
|
11
|
+
- 🎭 **图标系统** - 7种内置图标(成功、失败、警告、信息等)
|
|
12
|
+
- 🔔 **通知消息** - 4个位置(右上、右下、左上、左下)
|
|
13
|
+
- 🖼️ **图片预览** - 支持单图和相册模式
|
|
14
|
+
- ⌨️ **输入层** - 支持文本、密码、文本域输入
|
|
15
|
+
- 🎛️ **完整API** - open、close、msg、confirm、load、drawer、notify、photos、prompt
|
|
16
|
+
|
|
17
|
+
## 📦 安装
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install @zan-ui/layer
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 🚀 快速开始
|
|
24
|
+
|
|
25
|
+
### 全局注册
|
|
26
|
+
|
|
27
|
+
```js
|
|
28
|
+
import { createApp } from 'vue'
|
|
29
|
+
import ZanLayer from '@zan-ui/layer'
|
|
30
|
+
import '@zan-ui/layer/dist/style.css'
|
|
31
|
+
|
|
32
|
+
const app = createApp(App)
|
|
33
|
+
app.use(ZanLayer)
|
|
34
|
+
app.mount('#app')
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 基础使用
|
|
38
|
+
|
|
39
|
+
```js
|
|
40
|
+
import { zanLayer } from '@zan-ui/layer'
|
|
41
|
+
|
|
42
|
+
// 消息提示
|
|
43
|
+
zanLayer.msg('操作成功', { icon: 1, time: 2000 })
|
|
44
|
+
|
|
45
|
+
// 确认框
|
|
46
|
+
zanLayer.confirm('确定要删除吗?', {
|
|
47
|
+
yes: (id) => {
|
|
48
|
+
console.log('确认')
|
|
49
|
+
zanLayer.close(id)
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
// 加载动画
|
|
54
|
+
const loadId = zanLayer.load(0, { time: 3000 })
|
|
55
|
+
|
|
56
|
+
// 打开弹层
|
|
57
|
+
zanLayer.open({
|
|
58
|
+
type: 1,
|
|
59
|
+
title: '标题',
|
|
60
|
+
content: '内容',
|
|
61
|
+
area: ['500px', '400px']
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
// 抽屉
|
|
65
|
+
zanLayer.drawer({
|
|
66
|
+
title: '抽屉',
|
|
67
|
+
content: '内容',
|
|
68
|
+
offset: 'r' // 右侧
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
// 通知
|
|
72
|
+
zanLayer.notify({
|
|
73
|
+
title: '通知标题',
|
|
74
|
+
content: '通知内容',
|
|
75
|
+
icon: 1,
|
|
76
|
+
offset: 'rt' // 右上角
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
// 图片预览
|
|
80
|
+
zanLayer.photos({
|
|
81
|
+
imgList: [
|
|
82
|
+
{ src: 'image1.jpg', alt: '图片1' },
|
|
83
|
+
{ src: 'image2.jpg', alt: '图片2' }
|
|
84
|
+
]
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
// 输入层
|
|
88
|
+
zanLayer.prompt({
|
|
89
|
+
title: '请输入',
|
|
90
|
+
formType: 'text',
|
|
91
|
+
yes: (id, value) => {
|
|
92
|
+
console.log('输入值:', value)
|
|
93
|
+
zanLayer.close(id)
|
|
94
|
+
}
|
|
95
|
+
})
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## 📖 API
|
|
99
|
+
|
|
100
|
+
### 基础方法
|
|
101
|
+
|
|
102
|
+
| 方法 | 说明 | 参数 |
|
|
103
|
+
|------|------|------|
|
|
104
|
+
| `open(options)` | 打开弹层 | LayerProps |
|
|
105
|
+
| `close(id)` | 关闭指定弹层 | string |
|
|
106
|
+
| `closeAll()` | 关闭所有弹层 | - |
|
|
107
|
+
| `msg(message, options)` | 消息提示 | string, LayerProps |
|
|
108
|
+
| `confirm(message, options)` | 确认框 | string, LayerProps |
|
|
109
|
+
| `load(type, options)` | 加载动画 | number, LayerProps |
|
|
110
|
+
| `drawer(options)` | 抽屉 | LayerProps |
|
|
111
|
+
| `notify(options)` | 通知 | LayerProps |
|
|
112
|
+
| `photos(options)` | 图片预览 | LayerProps |
|
|
113
|
+
| `prompt(options)` | 输入层 | LayerProps |
|
|
114
|
+
|
|
115
|
+
### 控制方法
|
|
116
|
+
|
|
117
|
+
| 方法 | 说明 | 参数 |
|
|
118
|
+
|------|------|------|
|
|
119
|
+
| `reset(id)` | 重置位置 | string |
|
|
120
|
+
| `min(id)` | 最小化 | string |
|
|
121
|
+
| `full(id)` | 最大化 | string |
|
|
122
|
+
| `revert(id)` | 复原 | string |
|
|
123
|
+
|
|
124
|
+
### LayerProps
|
|
125
|
+
|
|
126
|
+
| 属性 | 说明 | 类型 | 默认值 |
|
|
127
|
+
|------|------|------|--------|
|
|
128
|
+
| type | 弹层类型 | 0-7 / 'dialog' / 'page' / 'iframe' / 'loading' / 'drawer' / 'photos' / 'notify' / 'prompt' | 1 |
|
|
129
|
+
| title | 标题 | string / VNode / boolean | '标题' |
|
|
130
|
+
| content | 内容 | string / VNode | - |
|
|
131
|
+
| area | 宽高 | string / string[] | 'auto' |
|
|
132
|
+
| offset | 位置 | string / string[] | 'auto' |
|
|
133
|
+
| shade | 显示遮罩 | boolean | true |
|
|
134
|
+
| shadeClose | 点击遮罩关闭 | boolean | true |
|
|
135
|
+
| shadeOpacity | 遮罩透明度 | string | '0.1' |
|
|
136
|
+
| move | 允许拖拽 | boolean | true |
|
|
137
|
+
| resize | 允许调整大小 | boolean | false |
|
|
138
|
+
| maxmin | 显示最大化/最小化按钮 | boolean | false |
|
|
139
|
+
| closeBtn | 显示关闭按钮 | boolean / string | '1' |
|
|
140
|
+
| btn | 自定义按钮 | BtnType[] | - |
|
|
141
|
+
| btnAlign | 按钮对齐 | 'l' / 'c' / 'r' | 'r' |
|
|
142
|
+
| anim | 动画类型 | 0-6 | 0 |
|
|
143
|
+
| icon | 图标 | number / string | - |
|
|
144
|
+
| time | 自动关闭时间(ms) | number | 0 |
|
|
145
|
+
| zIndex | 层级 | number | - |
|
|
146
|
+
|
|
147
|
+
## 🎨 弹层类型
|
|
148
|
+
|
|
149
|
+
- **0 (dialog)** - 对话框
|
|
150
|
+
- **1 (page)** - 页面层
|
|
151
|
+
- **2 (iframe)** - iframe层
|
|
152
|
+
- **3 (loading)** - 加载层
|
|
153
|
+
- **4 (drawer)** - 抽屉
|
|
154
|
+
- **5 (photos)** - 图片层
|
|
155
|
+
- **6 (notify)** - 通知
|
|
156
|
+
- **7 (prompt)** - 输入层
|
|
157
|
+
|
|
158
|
+
## 🎭 图标类型
|
|
159
|
+
|
|
160
|
+
- **1** - 成功 ✓
|
|
161
|
+
- **2** - 失败 ✕
|
|
162
|
+
- **3** - 疑问 ?
|
|
163
|
+
- **4** - 信息 ℹ
|
|
164
|
+
- **5** - 哭脸 ☹
|
|
165
|
+
- **6** - 笑脸 ☺
|
|
166
|
+
- **7** - 警告 !
|
|
167
|
+
|
|
168
|
+
## 🎬 动画效果
|
|
169
|
+
|
|
170
|
+
- **0** - 默认缩放
|
|
171
|
+
- **1** - 从上掉落
|
|
172
|
+
- **2** - 从下飞入
|
|
173
|
+
- **3** - 从左飞入
|
|
174
|
+
- **4** - 旋转飞入
|
|
175
|
+
- **5** - 渐显
|
|
176
|
+
- **6** - 抖动
|
|
177
|
+
|
|
178
|
+
## 📝 开发
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
# 安装依赖
|
|
182
|
+
npm install
|
|
183
|
+
|
|
184
|
+
# 启动开发服务器
|
|
185
|
+
npm run dev
|
|
186
|
+
|
|
187
|
+
# 构建
|
|
188
|
+
npm run build
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## 📄 License
|
|
192
|
+
|
|
193
|
+
MIT
|
|
194
|
+
|
|
195
|
+
## 🙏 致谢
|
|
196
|
+
|
|
197
|
+
本项目基于 [layui-vue](https://github.com/layui-vue/layui-vue) 的 layer 组件架构开发。
|
package/lib/index.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.zan-icon-btn[data-v-8d683fcb]{position:relative;width:20px;height:20px;display:inline-block;cursor:pointer;color:#333;font-style:normal;text-align:center;padding:2px}.zan-icon-btn[data-v-8d683fcb]:hover{color:var(--global-primary-color)}.zan-tooltip[data-v-8d683fcb]{position:absolute;bottom:-32px;left:50%;transform:translate(-50%);padding:4px 8px;background-color:#000000bf;color:#fff;font-size:12px;white-space:nowrap;border-radius:4px;pointer-events:none;opacity:0;transition:opacity .3s;z-index:9999}.zan-tooltip[data-v-8d683fcb]:before{content:"";position:absolute;top:-4px;left:50%;transform:translate(-50%);width:0;height:0;border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(0,0,0,.75)}.zan-icon-btn:hover .zan-tooltip[data-v-8d683fcb]{opacity:1}.zan-icon-min[data-v-8d683fcb]:before{content:"";position:absolute;bottom:8px;left:0;width:16px;height:2px;text-align:center;background-color:currentColor}.zan-icon-max[data-v-8d683fcb]:before{content:"";position:absolute;top:4px;left:4px;width:12px;height:12px;border:2px solid currentColor}.zan-icon-full[data-v-8d683fcb]:before{content:"";position:absolute;top:4px;left:4px;width:12px;height:12px;border:2px solid currentColor}.zan-icon-restore[data-v-8d683fcb]:before{content:"";position:absolute;top:4px;left:4px;width:10px;height:10px;border:2px solid currentColor}.zan-icon-restore[data-v-8d683fcb]:after{content:"";position:absolute;top:6px;left:6px;width:10px;height:10px;border:2px solid currentColor;background:#fff}.zan-icon-close-btn[data-v-8d683fcb]:before,.zan-icon-close-btn[data-v-8d683fcb]:after{content:"";position:absolute;top:50%;left:50%;width:16px;height:2px;background-color:currentColor}.zan-icon-close-btn[data-v-8d683fcb]:before{transform:translate(-50%,-50%) rotate(45deg)}.zan-icon-close-btn[data-v-8d683fcb]:after{transform:translate(-50%,-50%) rotate(-45deg)}.zan-layer-close2[data-v-8d683fcb]:before,.zan-layer-close2[data-v-8d683fcb]:after{width:16px;height:2px}:root{--global-primary-color: #16baaa;--global-border-radius: 2px}.zan-layer-imgbar,.zan-layer-imgtit a,.zan-layer-tab .zan-layer-title span,.zan-layer-title{text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:none;user-select:none}.zan-layer,.zan-layer-shade{position:absolute;pointer-events:auto}.zan-layer-shade{top:0;left:0;width:100%;height:100%;background-color:#000}.zan-layer{top:0;left:0;display:flex;flex-direction:column;box-shadow:1px 1px 50px #0000004d;background-color:#fff;border-radius:var(--global-border-radius);padding:0;margin:0;will-change:transform,width,height;transform:translateZ(0);backface-visibility:hidden}.zan-layer-close{position:absolute}.zan-layer-content{position:relative;flex:1 1 auto}.zan-layer-dialog .zan-layer-content,.zan-layer-page .zan-layer-content{min-width:200px;min-height:100px}.zan-layer-border{border:1px solid #eeeeee;box-shadow:1px 1px 5px #0003}.zan-layer-btn a,.zan-layer-dialog .zan-layer-ico,.zan-layer-setwin a{display:inline-block;vertical-align:top}.zan-layer-resize{z-index:999999999;position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.zan-layer-resizing,.zan-layer-resizing *,.zan-layer-moving,.zan-layer-moving *{pointer-events:none}.zan-layer-anim{animation-fill-mode:both;animation-duration:.3s}.zan-layer-drawer-anim{animation-duration:.3s;animation-timing-function:cubic-bezier(.7,.3,.1,1)}@keyframes zan-layer-rl{0%{transform:translate3d(100%,0,0);opacity:1}to{transform:translateZ(0);opacity:1}}.zan-layer-anim-rl{animation-name:zan-layer-rl}@keyframes zan-layer-rl-close{0%{transform:translateZ(0)}to{transform:translate3d(100%,0,0)}}.zan-layer-anim-rl-close{animation-name:zan-layer-rl-close}@keyframes zan-layer-lr{0%{transform:translate3d(-100%,0,0);opacity:1}to{transform:translateZ(0);opacity:1}}.zan-layer-anim-lr{animation-name:zan-layer-lr}@keyframes zan-layer-lr-close{0%{transform:translateZ(0)}to{transform:translate3d(-100%,0,0)}}.zan-layer-anim-lr-close{animation-name:zan-layer-lr-close}@keyframes zan-layer-tb{0%{transform:translate3d(0,-100%,0);opacity:1;animation-timing-function:cubic-bezier(.7,.3,.1,1)}to{transform:translateZ(0);opacity:1;animation-timing-function:cubic-bezier(.7,.3,.1,1)}}.zan-layer-anim-tb{animation-name:zan-layer-tb}@keyframes zan-layer-tb-close{0%{transform:translateZ(0)}to{transform:translate3d(0,-100%,0)}}.zan-layer-anim-tb-close{animation-name:zan-layer-tb-close}@keyframes zan-layer-bt{0%{transform:translate3d(0,100%,0);opacity:1}to{transform:translateZ(0);opacity:1}}.zan-layer-anim-bt{animation-name:zan-layer-bt}@keyframes zan-layer-bt-close{0%{transform:translateZ(0)}to{transform:translate3d(0,100%,0)}}.zan-layer-anim-bt-close{animation-name:zan-layer-bt-close}@keyframes zan-layer-bounceIn{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}.zan-layer-anim-00{animation-name:zan-layer-bounceIn}@keyframes zan-layer-zoomInDown{0%{opacity:0;transform:scale(.1) translateY(-2000px);animation-timing-function:ease-in-out}60%{opacity:1;transform:scale(.475) translateY(60px);animation-timing-function:ease-out}}.zan-layer-anim-01{animation-name:zan-layer-zoomInDown}@keyframes zan-layer-fadeInUpBig{0%{opacity:0;transform:translateY(2000px)}to{opacity:1;transform:translateY(0)}}.zan-layer-anim-02{animation-name:zan-layer-fadeInUpBig}@keyframes zan-layer-zoomInLeft{0%{opacity:0;transform:scale(.1) translate(-2000px);animation-timing-function:ease-in-out}60%{opacity:1;transform:scale(.475) translate(48px);animation-timing-function:ease-out}}.zan-layer-anim-03{animation-name:zan-layer-zoomInLeft}@keyframes zan-layer-rollIn{0%{opacity:0;transform:translate(-100%) rotate(-120deg)}to{opacity:1;transform:translate(0) rotate(0)}}.zan-layer-anim-04{animation-name:zan-layer-rollIn}@keyframes zan-layer-fadeIn{0%{opacity:0}to{opacity:1}}.zan-layer-anim-05{animation-name:zan-layer-fadeIn}@keyframes zan-layer-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-10px)}20%,40%,60%,80%{transform:translate(10px)}}.zan-layer-anim-06{animation-name:zan-layer-shake}.zan-layer-title{padding:0 100px 0 5px;height:36px;line-height:36px;border-bottom:1px solid #f0f0f0;font-size:14px;color:#333;overflow:hidden;border-radius:2px 2px 0 0;flex-shrink:0}.zan-layer-setwin{position:absolute;right:5px;top:5px;font-size:0;line-height:initial;display:flex;align-items:center;gap:5px}.zan-layer-setwin a{position:relative;width:16px;height:16px;margin-left:0;font-size:12px}.zan-layer-setwin i{position:relative;width:16px;height:16px;margin-left:0;font-size:16px;color:#333;cursor:pointer;transition:color .3s}.zan-layer-setwin i:hover{color:var(--global-primary-color)}.zan-layer-btn{text-align:right;padding:0 5px 5px;pointer-events:auto}.zan-layer-btn a{height:28px;line-height:28px;padding:0 5px;border-radius:var(--global-border-radius);border:1px solid #dedede;background-color:#fff;cursor:pointer;color:#333;font-weight:400;margin-left:5px}.zan-layer-btn-disabled{border-color:#eee!important;background-color:#fbfbfb!important;color:#d2d2d2!important;cursor:not-allowed!important}.zan-layer-btn .zan-layer-btn0{border-color:var(--global-primary-color);background-color:var(--global-primary-color);color:#fff}.zan-layer-btn-l{text-align:left}.zan-layer-btn-c{text-align:center}.zan-layer-dialog{min-width:300px}.zan-layer-dialog .zan-layer-content{position:relative;padding:5px;line-height:22px;word-break:break-all;overflow:hidden;font-size:13px;overflow-x:hidden;overflow-y:auto;color:#333}.zan-layer-msg{min-width:180px;border:1px solid rgba(220,220,220,.5);box-shadow:2px 0 8px #1d232908}.zan-layer-msg .zan-layer-content{padding:10px;text-align:center;line-height:22px;font-size:13px}.zan-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:#0009;color:#fff;border:none}.zan-layer-hui .zan-layer-content{padding:5px;text-align:center;color:#fff}.zan-layer-dialog .zan-layer-padding{padding:5px 5px 5px 50px;text-align:left}.zan-layer-drawer{border-radius:0}.zan-layer-drawer .zan-layer-content,.zan-layer-page .zan-layer-content{position:relative;overflow:auto;padding:5px;color:#333;font-size:13px;line-height:1.5}.zan-layer-drawer .zan-layer-btn,.zan-layer-iframe .zan-layer-btn,.zan-layer-page .zan-layer-btn{padding-top:5px}.zan-layer-iframe iframe{display:block;width:100%;height:100%}.zan-layer-loading{border-radius:100%;background:#000000b3;box-shadow:none;border:none}.zan-layer-loading .zan-layer-content{background:transparent;display:flex;align-items:center;justify-content:center;position:relative;min-width:auto;min-height:auto}.zan-layer-loading0{padding:15px}.zan-layer-loading0 .zan-layer-content{width:60px;height:24px;padding:0}.zan-layer-loading0 .zan-layer-content:after{content:"";position:absolute;width:60px;height:24px;background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjAiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCA2MCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBmaWxsPSIjZmZmIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI0Ij48YW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPSJvcGFjaXR5IiBkdXI9IjFzIiB2YWx1ZXM9IjA7MTswIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgYmVnaW49IjAiLz48L2NpcmNsZT48Y2lyY2xlIGN4PSIzMCIgY3k9IjEyIiByPSI0Ij48YW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPSJvcGFjaXR5IiBkdXI9IjFzIiB2YWx1ZXM9IjA7MTswIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgYmVnaW49IjAuMzMzIi8+PC9jaXJjbGU+PGNpcmNsZSBjeD0iNDgiIGN5PSIxMiIgcj0iNCI+PGFuaW1hdGUgYXR0cmlidXRlTmFtZT0ib3BhY2l0eSIgZHVyPSIxcyIgdmFsdWVzPSIwOzE7MCIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIGJlZ2luPSIwLjY2NiIvPjwvY2lyY2xlPjwvc3ZnPg==) no-repeat center;background-size:contain}.zan-layer-loading1{padding:20px}.zan-layer-loading1 .zan-layer-content{width:40px;height:40px;padding:0}.zan-layer-loading1 .zan-layer-content:after{content:"";position:absolute;width:32px;height:32px;border:3px solid #fff;border-top-color:transparent;border-radius:50%;animation:zan-spin 1s linear infinite}.zan-layer-loading2{padding:20px}.zan-layer-loading2 .zan-layer-content{width:40px;height:40px;padding:0}.zan-layer-loading2 .zan-layer-content:after{content:"";position:absolute;width:32px;height:32px;border:4px solid;border-color:#fff transparent #fff transparent;border-radius:50%;animation:zan-spin 1.2s linear infinite}@keyframes zan-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.zan-layer-photos{background:#000000e6;box-shadow:none;border:none}.zan-layer-photos .zan-layer-content{overflow:hidden;text-align:center;background:transparent}.zan-layer-photos .zan-layer-phimg img{position:relative;width:100%;height:100%;display:inline-block;vertical-align:top;object-fit:contain}.zan-layer-imgnext,.zan-layer-imgprev{position:fixed;top:50%;width:40px;height:60px;margin-top:-30px;outline:0;font-size:40px;color:#fff;text-align:center;line-height:60px;cursor:pointer;text-decoration:none}.zan-layer-imgprev{left:30px}.zan-layer-imgnext{right:30px}.zan-layer-imgbar{position:fixed;left:0;right:0;bottom:0;width:100%;min-height:40px;height:auto;line-height:40px;background-color:#02000059;color:#fff;overflow:hidden;font-size:0;opacity:0;transition:all 1s ease-in-out;display:flex;flex-wrap:wrap;justify-content:center}.zan-layer-imgtit *{display:inline-block;vertical-align:top;font-size:12px}.zan-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.zan-layer-imgtit em{padding-left:5px;font-style:normal}.zan-layer-imgbar .thumb-row{width:100%;display:flex;justify-content:center;align-self:center}.zan-layer-imgbar .thumb-box{width:100px;height:100px;margin:0;display:inline-flex;align-items:center;justify-content:center;position:relative}.zan-layer-imgbar .thumb-box-border{position:absolute;top:0;transition:all .2s ease-in-out;width:100px;height:100px;border:1px solid #5fb878;box-sizing:border-box}.zan-layer-imgbar img{max-width:100%;max-height:100%;object-fit:contain}@keyframes zan-layer-bounceOut{to{opacity:0;transform:scale(.7)}30%{transform:scale(1.05)}0%{transform:scale(1)}}.zan-layer-anim-close{animation-name:zan-layer-bounceOut;animation-fill-mode:both;animation-duration:.2s}.zan-layer-notifiy{border:none;box-shadow:none}.zan-layer-notifiy-wrapper{padding:5px 10px 5px 5px;box-sizing:border-box;background-color:#fff;overflow:hidden;border-radius:4px;border:1px solid #ebeef5;box-shadow:0 2px 8px #0000001a;min-width:280px;max-width:380px;transition:opacity .3s,transform .3s}.zan-layer-notifiy-wrapper .title{font-weight:600;font-size:14px;color:#303133;margin:0;display:flex;align-items:center;gap:8px;line-height:1.4}.zan-layer-notifiy-wrapper .content{font-size:13px;line-height:1.5;margin:8px 0 0;color:#606266;word-break:break-word}.zan-layer-notifiy-wrapper .content img{max-width:100%}.zan-icon-close{cursor:pointer;width:20px;height:20px;position:absolute;top:10px;right:10px;color:#909399;font-style:normal;font-size:16px;line-height:20px;transition:color .3s;display:flex;align-items:center;justify-content:center}.zan-icon-close svg{width:20px;height:20px}.zan-icon-close:hover{color:#333}.zan-layer-notifiy-transition{transition:top .3s ease-in-out,opacity .3s ease-in-out}.zan-layer-notifiy-wrapper .title .zan-icon{display:inline-block;position:inherit;margin:0;transform:scale(1);height:24px!important;width:24px!important;line-height:24px;font-size:16px;flex-shrink:0}.zan-icon{display:inline-flex;align-items:center;justify-content:center;width:48px;height:48px;border-radius:50%;text-align:center;line-height:1;font-style:normal;font-size:26px;font-weight:700;flex-shrink:0}.zan-icon-ico1{background-color:#67c23a;color:#fff}.zan-icon-ico1:before{content:"✓"}.zan-icon-ico2{background-color:#f56c6c;color:#fff}.zan-icon-ico2:before{content:"✕"}.zan-icon-ico3{background-color:#e6a23c;color:#fff}.zan-icon-ico3:before{content:"?"}.zan-icon-ico4{background-color:#409eff;color:#fff}.zan-icon-ico4:before{content:"ℹ"}.zan-icon-ico5{background-color:#e6a23c;color:#fff}.zan-icon-ico5:before{content:"☹"}.zan-icon-ico6{background-color:#67c23a;color:#fff}.zan-icon-ico6:before{content:"☺"}.zan-icon-ico7{background-color:#f56c6c;color:#fff}.zan-icon-ico7:before{content:"!"}.zan-icon-ico16{background:transparent}.zan-input,.zan-textarea{width:100%;padding:5px;border:1px solid #ddd;border-radius:var(--global-border-radius);font-size:13px;outline:none;box-sizing:border-box;font-family:inherit}.zan-input:focus,.zan-textarea:focus{border-color:var(--global-primary-color)}.zan-textarea{min-height:80px;resize:vertical;line-height:1.5}.zan-layer-dialog .zan-input,.zan-layer-dialog .zan-textarea{margin-top:8px}.zan-layer-dialog .zan-layer-content>.zan-input,.zan-layer-dialog .zan-layer-content>.zan-textarea{display:block;width:100%}.zan-layer-dialog .zan-layer-content .zan-input,.zan-layer-dialog .zan-layer-content .zan-textarea{width:100%}.zan-layer-msg .zan-icon{margin-right:10px;vertical-align:middle}.zan-layer-msg .zan-layer-content{display:flex;align-items:center;justify-content:center;padding:10px;min-height:48px}.zan-layer-dialog .zan-layer-padding .zan-icon{position:absolute;left:10px;top:10px}.zan-layer.zan-layer-min{z-index:99999}.zan-layer.zan-layer-min .zan-layer-title{cursor:default;-webkit-user-select:none;user-select:none}.zan-layer.zan-layer-min:hover{box-shadow:0 2px 8px #0000004d}.zan-layer.zan-layer-tips{background:transparent!important;box-shadow:none!important;border:none!important;padding:0!important}.zan-layer.zan-layer-tips .zan-layer-content{padding:0!important;min-width:auto!important;min-height:auto!important;background:transparent!important;overflow:visible!important}
|