├── .gitignore
├── screenshots
└── 1.gif
├── .npmignore
├── gulpfile.js
├── package.json
├── README_zh.md
├── README.md
├── lib
├── index.js
└── toast.css
└── src
└── index.js
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | dist/
4 | npm-debug.log
5 |
--------------------------------------------------------------------------------
/screenshots/1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lin-xin/vue-toast/HEAD/screenshots/1.gif
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | screenshots
4 | .gitignore
5 | .npmignore
6 | .git/
--------------------------------------------------------------------------------
/gulpfile.js:
--------------------------------------------------------------------------------
1 | const gulp = require('gulp');
2 | const babel = require('gulp-babel');
3 |
4 | gulp.task('default', () => {
5 | gulp.src('./src/index.js')
6 | .pipe(babel({
7 | presets: ['@babel/env']
8 | }))
9 | .pipe(gulp.dest('./lib'))
10 | })
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue2-toast",
3 | "version": "2.1.0",
4 | "description": "A mobile toast plugin for vue2.",
5 | "keywords": [
6 | "vue.js",
7 | "vue-plugin",
8 | "toast"
9 | ],
10 | "main": "lib/index.js",
11 | "directories": {
12 | "test": "test"
13 | },
14 | "bugs": {
15 | "url": "https://github.com/lin-xin/vue-toast/issues",
16 | "email": "2981207131@qq.com"
17 | },
18 | "repository": {
19 | "type": "git",
20 | "url": "https://github.com/lin-xin/vue-toast.git"
21 | },
22 | "scripts": {
23 | "test": "echo \"Error: no test specified\" && exit 1"
24 | },
25 | "author": "linxin",
26 | "license": "ISC",
27 | "devDependencies": {
28 | "@babel/core": "^7.1.2",
29 | "@babel/preset-env": "^7.1.0",
30 | "gulp": "^3.9.1",
31 | "gulp-babel": "^8.0.0"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/README_zh.md:
--------------------------------------------------------------------------------
1 | # vue2-toast
2 | 基于vue2的移动端 toast 插件。 [English document](https://github.com/lin-xin/vue-toast/blob/master/README.md)
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | [互动演示](http://blog.gdfengshuo.com/example/#/vue2-toast)
11 |
12 | ## 使用
13 | 安装:
14 |
15 | ```
16 | npm install vue2-toast -S
17 | ```
18 | 引入:
19 |
20 | ```javascript
21 | import 'vue2-toast/lib/toast.css';
22 | import Toast from 'vue2-toast';
23 | Vue.use(Toast);
24 | ```
25 | 或者使用配置
26 |
27 | ```javascript
28 | import 'vue2-toast/lib/toast.css';
29 | import Toast from 'vue2-toast';
30 | Vue.use(Toast, {
31 | type: 'center',
32 | duration: 3000,
33 | wordWrap: true,
34 | width: '150px'
35 | });
36 | ```
37 |
38 | 在组件中使用:
39 |
40 | ```javascript
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 | export default {
50 | methods:{
51 | openTop(){
52 | this.$toast.top('top');
53 | },
54 | openCenter(){
55 | this.$toast.center('center');
56 | },
57 | openBottom(){
58 | this.$toast('bottom'); // or this.$toast.bottom('bottom');
59 | },
60 | openLoading(){
61 | this.$loading('loading...');
62 | let self = this;
63 | setTimeout(function () {
64 | self.closeLoading()
65 | }, 2000)
66 | },
67 | closeLoading(){
68 | this.$loading.close();
69 | }
70 | }
71 | }
72 | ```
73 | ## 在 Nuxt.js 中使用
74 | 除了 nuxt.js 使用 vue 插件的配置之外,还需要再 nuxt.config.js 添加以下配置
75 |
76 | ```js
77 | build: {
78 | vendor: ['vue2-toast'],
79 | extend (config, ctx) {
80 | if (ctx.isClient) {
81 | config.resolve.alias['vue'] = 'vue/dist/vue.js';
82 | }
83 | }
84 | }
85 | ```
86 |
87 | ## 配置
88 |
89 | Vue.use(Toast, [options])
90 |
91 | - type : Toast 的位置. | String | 默认: 'bottom' | 可选值 'top, center,bottom'
92 | - duration : Number | 默认 2500ms
93 | - wordWrap : 是否自动换行. | Boolean | 默认: false
94 | - width : Toast 的宽度. | String | 默认: 'auto'
95 |
96 |
97 | ## demo
98 | 
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # vue2-toast
2 | A mobile toast plugin for vue2. [中文文档](https://github.com/lin-xin/vue-toast/blob/master/README_zh.md)
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | [Interactive Demo](http://blog.gdfengshuo.com/example/#/vue2-toast)
11 |
12 | ## Usage
13 | Install:
14 |
15 | ```
16 | npm install vue2-toast -S
17 | ```
18 | Import:
19 |
20 | ```javascript
21 | import 'vue2-toast/lib/toast.css';
22 | import Toast from 'vue2-toast';
23 | Vue.use(Toast);
24 | ```
25 | or
26 | ```javascript
27 | import 'vue2-toast/lib/toast.css';
28 | import Toast from 'vue2-toast';
29 | Vue.use(Toast, {
30 | type: 'center',
31 | duration: 3000,
32 | wordWrap: true,
33 | width: '150px'
34 | });
35 | ```
36 |
37 | Use in component:
38 |
39 | ```javascript
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 | export default {
49 | methods:{
50 | openTop(){
51 | this.$toast.top('top');
52 | },
53 | openCenter(){
54 | this.$toast.center('center');
55 | },
56 | openBottom(){
57 | this.$toast('bottom'); // or this.$toast.bottom('bottom');
58 | },
59 | openLoading(){
60 | this.$loading('loading...');
61 | let self = this;
62 | setTimeout(function () {
63 | self.closeLoading()
64 | }, 2000)
65 | },
66 | closeLoading(){
67 | this.$loading.close();
68 | }
69 | }
70 | }
71 | ```
72 | ## work in Nuxt.js
73 | config it in nuxt.config.js
74 |
75 | ```js
76 | build: {
77 | vendor: ['vue2-toast'],
78 | extend (config, ctx) {
79 | if (ctx.isClient) {
80 | config.resolve.alias['vue'] = 'vue/dist/vue.js';
81 | }
82 | }
83 | }
84 | ```
85 |
86 | ## options
87 |
88 | Vue.use(Toast, [options])
89 |
90 | - type : position of Toast. | String | default: 'bottom' | possible 'top, center,bottom'
91 | - duration : Number | default 2500ms
92 | - wordWrap : word wrap. | Boolean | default: false
93 | - width : width of Toast. | String | default: 'auto'
94 |
95 | ## source code
96 | download in [Github](https://github.com/lin-xin/vue-toast).
97 |
98 | ## demo
99 | 
--------------------------------------------------------------------------------
/lib/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | Object.defineProperty(exports, "__esModule", {
4 | value: true
5 | });
6 | exports.default = void 0;
7 |
8 | function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
9 |
10 | var Toast = {}; // toastTimer:存储toast定时器id; toastVM:存储toast vm; showLoad:存储loading显示状态; loadNode:存储loading节点元素;
11 |
12 | var toastTimer = false,
13 | toastVM = null,
14 | showLoad = false,
15 | loadNode = null; // 默认配置
16 |
17 | var defaultOption = {
18 | type: 'bottom',
19 | duration: '2500',
20 | wordWrap: false,
21 | width: 'auto'
22 | };
23 |
24 | Toast.install = function (Vue, options) {
25 | /**
26 | * toast方法
27 | * @param {string} tip 提示文本
28 | * @param {object|string} config 配置参数
29 | */
30 | Vue.prototype.$toast = function (tip, config) {
31 | var option = {};
32 | Object.assign(option, defaultOption, options);
33 |
34 | if (_typeof(config) === 'object') {
35 | Object.assign(option, config);
36 | } else if (config) {
37 | option['type'] = config;
38 | }
39 |
40 | if (toastTimer) {
41 | // 如果toast还在,则取消上次消失时间
42 | clearTimeout(toastTimer);
43 | toastVM.show = false;
44 | }
45 |
46 | if (!toastVM) {
47 | var toastTpl = Vue.extend({
48 | data: function data() {
49 | return {
50 | show: false,
51 | tip: tip,
52 | wordWrap: option.wordWrap,
53 | type: option.type,
54 | extStyle: {
55 | width: option.width
56 | }
57 | };
58 | },
59 | render: function render(h) {
60 | if (!this.show) {
61 | return false;
62 | }
63 |
64 | return h('div', {
65 | class: ['lx-toast', "lx-toast-".concat(this.type), this.wordWrap ? 'lx-word-wrap' : ''],
66 | style: this.extStyle,
67 | show: this.show,
68 | domProps: {
69 | innerHTML: this.tip
70 | }
71 | });
72 | }
73 | });
74 | toastVM = new toastTpl();
75 | var tpl = toastVM.$mount().$el;
76 | document.body.appendChild(tpl);
77 | }
78 |
79 | toastVM.tip = tip;
80 | toastVM.wordWrap = option.wordWrap;
81 | toastVM.type = option.type;
82 | toastVM.extStyle.width = option.width;
83 | toastVM.show = true;
84 | toastTimer = setTimeout(function () {
85 | toastVM.show = toastTimer = false;
86 | }, option.duration);
87 | };
88 |
89 | ['bottom', 'center', 'top'].forEach(function (type) {
90 | Vue.prototype.$toast[type] = function (tip) {
91 | var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
92 | type: type
93 | };
94 | return Vue.prototype.$toast(tip, config);
95 | };
96 | });
97 | /**
98 | * loading方法
99 | * @param {*string} tip 提示文本
100 | * @param {*string} type loading类型,可选open/close
101 | */
102 |
103 | Vue.prototype.$loading = function (tip, type) {
104 | if (type === 'close') {
105 | if (loadNode) {
106 | loadNode.show = showLoad = false;
107 | }
108 | } else {
109 | if (showLoad && loadNode) {
110 | showLoad.tip = tip;
111 | return false;
112 | }
113 |
114 | var loadTpl = Vue.extend({
115 | data: function data() {
116 | return {
117 | show: false,
118 | tip: tip
119 | };
120 | },
121 | render: function render(h) {
122 | if (!this.show) {
123 | return;
124 | }
125 |
126 | return h('div', {
127 | class: 'lx-load-mark',
128 | show: this.show
129 | }, [h('div', {
130 | class: 'lx-load-box'
131 | }, [h('div', {
132 | class: this.tip ? 'lx-loading' : 'lx-loading-nocontent'
133 | }, Array.apply(null, {
134 | length: 12
135 | }).map(function (value, index) {
136 | return h('div', {
137 | class: ['loading_leaf', "loading_leaf_".concat(index)]
138 | });
139 | })), h('div', {
140 | class: 'lx-load-content',
141 | domProps: {
142 | innerHTML: this.tip
143 | }
144 | })])]);
145 | }
146 | });
147 | loadNode = new loadTpl();
148 | var tpl = loadNode.$mount().$el;
149 | document.body.appendChild(tpl);
150 | loadNode.show = showLoad = true;
151 | }
152 | };
153 |
154 | ['open', 'close'].forEach(function (type) {
155 | Vue.prototype.$loading[type] = function (tip) {
156 | return Vue.prototype.$loading(tip, type);
157 | };
158 | });
159 | };
160 |
161 | var _default = Toast;
162 | exports.default = _default;
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | const Toast = {};
2 | // toastTimer:存储toast定时器id; toastVM:存储toast vm; showLoad:存储loading显示状态; loadNode:存储loading节点元素;
3 | let [toastTimer, toastVM, showLoad, loadNode] = [false, null, false, null];
4 |
5 | // 默认配置
6 | const defaultOption = {
7 | type: 'bottom',
8 | duration: '2500',
9 | wordWrap: false,
10 | width: 'auto'
11 | };
12 |
13 | Toast.install = (Vue, options) => {
14 | /**
15 | * toast方法
16 | * @param {string} tip 提示文本
17 | * @param {object|string} config 配置参数
18 | */
19 | Vue.prototype.$toast = (tip, config) => {
20 | let option = {};
21 | Object.assign(option, defaultOption, options);
22 |
23 | if(typeof config === 'object'){
24 | Object.assign(option, config);
25 | }else if(config){
26 | option['type'] = config
27 | }
28 |
29 | if (toastTimer) {
30 | // 如果toast还在,则取消上次消失时间
31 | clearTimeout(toastTimer);
32 | toastVM.show = false;
33 | }
34 |
35 | if(!toastVM){
36 | const toastTpl = Vue.extend({
37 | data(){
38 | return {
39 | show: false,
40 | tip,
41 | wordWrap: option.wordWrap,
42 | type: option.type,
43 | extStyle: {
44 | width: option.width
45 | },
46 | }
47 | },
48 | render(h){
49 | if(!this.show){
50 | return false;
51 | }
52 | return h(
53 | 'div',
54 | {
55 | class: ['lx-toast', `lx-toast-${this.type}`, this.wordWrap?'lx-word-wrap':''],
56 | style: this.extStyle,
57 | show: this.show,
58 | domProps: {
59 | innerHTML: this.tip
60 | }
61 | }
62 | )
63 | }
64 | });
65 | toastVM = new toastTpl();
66 | const tpl = toastVM.$mount().$el;
67 | document.body.appendChild(tpl);
68 | }
69 |
70 | toastVM.tip = tip;
71 | toastVM.wordWrap = option.wordWrap;
72 | toastVM.type = option.type;
73 | toastVM.extStyle.width = option.width;
74 | toastVM.show = true;
75 |
76 | toastTimer = setTimeout(() => {
77 | toastVM.show = toastTimer = false;
78 | }, option.duration);
79 | };
80 |
81 | ['bottom', 'center', 'top'].forEach(type => {
82 | Vue.prototype.$toast[type] = (tip, config = {type}) => {
83 | return Vue.prototype.$toast(tip, config);
84 | }
85 | });
86 |
87 | /**
88 | * loading方法
89 | * @param {*string} tip 提示文本
90 | * @param {*string} type loading类型,可选open/close
91 | */
92 | Vue.prototype.$loading = (tip, type) => {
93 | if(type === 'close'){
94 | if(loadNode){
95 | loadNode.show = showLoad = false;
96 | }
97 | }else{
98 | if(showLoad && loadNode){
99 | showLoad.tip = tip;
100 | return false;
101 | }
102 | const loadTpl = Vue.extend({
103 | data(){
104 | return {
105 | show: false,
106 | tip
107 | }
108 | },
109 | render(h){
110 | if(!this.show){
111 | return ;
112 | }
113 | return h('div', {
114 | class: 'lx-load-mark',
115 | show: this.show
116 | },[
117 | h('div', {
118 | class: 'lx-load-box'
119 | }, [
120 | h('div', {
121 | class: this.tip?'lx-loading':'lx-loading-nocontent'
122 | }, Array.apply(null, {length: 12}).map((value, index) => {
123 | return h('div', {
124 | class: ['loading_leaf',`loading_leaf_${index}`]
125 | })
126 | })),
127 | h('div', {
128 | class: 'lx-load-content',
129 | domProps: {
130 | innerHTML: this.tip
131 | }
132 | })
133 | ])
134 | ])
135 | }
136 | });
137 | loadNode = new loadTpl();
138 | const tpl = loadNode.$mount().$el;
139 |
140 | document.body.appendChild(tpl);
141 | loadNode.show = showLoad = true;
142 | }
143 | };
144 |
145 | ['open', 'close'].forEach(type => {
146 | Vue.prototype.$loading[type] = tip => {
147 | return Vue.prototype.$loading(tip, type);
148 | }
149 | })
150 | }
151 | export default Toast;
--------------------------------------------------------------------------------
/lib/toast.css:
--------------------------------------------------------------------------------
1 | .lx-toast {
2 | position: fixed;
3 | bottom: 100px;
4 | left: 50%;
5 | -webkit-box-sizing: border-box;
6 | box-sizing: border-box;
7 | max-width: 80%;
8 | height: 40px;
9 | line-height: 20px;
10 | padding: 10px 20px;
11 | transform: translateX(-50%);
12 | -webkit-transform: translateX(-50%);
13 | text-align: center;
14 | z-index: 9999;
15 | font-size: 14px;
16 | color: #fff;
17 | border-radius: 5px;
18 | background: rgba(0, 0, 0, 0.7);
19 | animation: show-toast .5s;
20 | -webkit-animation: show-toast .5s;
21 | overflow: hidden;
22 | text-overflow: ellipsis;
23 | white-space: nowrap;
24 | }
25 |
26 | .lx-toast.lx-word-wrap {
27 | width: 80%;
28 | white-space: inherit;
29 | height: auto;
30 | }
31 |
32 | .lx-toast.lx-toast-top {
33 | top: 50px;
34 | bottom: inherit;
35 | }
36 |
37 | .lx-toast.lx-toast-center {
38 | top: 50%;
39 | margin-top: -20px;
40 | bottom: inherit;
41 | }
42 |
43 | @-webkit-keyframes show-toast {
44 | from {
45 | opacity: 0;
46 | }
47 | to {
48 | opacity: 1;
49 | }
50 | }
51 |
52 | @keyframes show-toast {
53 | from {
54 | opacity: 0;
55 | }
56 | to {
57 | opacity: 1;
58 | }
59 | }
60 |
61 | .lx-load-mark {
62 | position: fixed;
63 | left: 0;
64 | top: 0;
65 | width: 100%;
66 | height: 100%;
67 | z-index: 9999;
68 | }
69 |
70 | .lx-load-box {
71 | position: fixed;
72 | z-index: 3;
73 | width: 7.6em;
74 | min-height: 7.6em;
75 | top: 180px;
76 | left: 50%;
77 | margin-left: -3.8em;
78 | background: rgba(0, 0, 0, 0.7);
79 | text-align: center;
80 | border-radius: 5px;
81 | color: #FFFFFF;
82 | }
83 |
84 | .lx-load-content {
85 | margin-top: 64%;
86 | font-size: 14px;
87 | }
88 |
89 | .lx-loading, .lx-loading-nocontent {
90 | position: absolute;
91 | width: 0px;
92 | left: 50%;
93 | top: 38%;
94 | }
95 |
96 | .lx-loading-nocontent {
97 | top: 50%;
98 | }
99 |
100 | .loading_leaf {
101 | position: absolute;
102 | top: -1px;
103 | opacity: 0.25;
104 | }
105 |
106 | .loading_leaf:before {
107 | content: " ";
108 | position: absolute;
109 | width: 9.14px;
110 | height: 3.08px;
111 | background: #d1d1d5;
112 | -webkit-box-shadow: rgba(0, 0, 0, 0.0980392) 0px 0px 1px;
113 | box-shadow: rgba(0, 0, 0, 0.0980392) 0px 0px 1px;
114 | border-radius: 1px;
115 | -webkit-transform-origin: left 50% 0px;
116 | transform-origin: left 50% 0px;
117 | }
118 |
119 | .loading_leaf_0 {
120 | -webkit-animation: opacity-0 1.25s linear infinite;
121 | animation: opacity-0 1.25s linear infinite;
122 | }
123 |
124 | .loading_leaf_0:before {
125 | -webkit-transform: rotate(0deg) translate(7.92px, 0px);
126 | transform: rotate(0deg) translate(7.92px, 0px);
127 | }
128 |
129 | .loading_leaf_1 {
130 | -webkit-animation: opacity-1 1.25s linear infinite;
131 | animation: opacity-1 1.25s linear infinite;
132 | }
133 |
134 | .loading_leaf_1:before {
135 | -webkit-transform: rotate(30deg) translate(7.92px, 0px);
136 | transform: rotate(30deg) translate(7.92px, 0px);
137 | }
138 |
139 | .loading_leaf_2 {
140 | -webkit-animation: opacity-2 1.25s linear infinite;
141 | animation: opacity-2 1.25s linear infinite;
142 | }
143 |
144 | .loading_leaf_2:before {
145 | -webkit-transform: rotate(60deg) translate(7.92px, 0px);
146 | transform: rotate(60deg) translate(7.92px, 0px);
147 | }
148 |
149 | .loading_leaf_3 {
150 | -webkit-animation: opacity-3 1.25s linear infinite;
151 | animation: opacity-3 1.25s linear infinite;
152 | }
153 |
154 | .loading_leaf_3:before {
155 | -webkit-transform: rotate(90deg) translate(7.92px, 0px);
156 | transform: rotate(90deg) translate(7.92px, 0px);
157 | }
158 |
159 | .loading_leaf_4 {
160 | -webkit-animation: opacity-4 1.25s linear infinite;
161 | animation: opacity-4 1.25s linear infinite;
162 | }
163 |
164 | .loading_leaf_4:before {
165 | -webkit-transform: rotate(120deg) translate(7.92px, 0px);
166 | transform: rotate(120deg) translate(7.92px, 0px);
167 | }
168 |
169 | .loading_leaf_5 {
170 | -webkit-animation: opacity-5 1.25s linear infinite;
171 | animation: opacity-5 1.25s linear infinite;
172 | }
173 |
174 | .loading_leaf_5:before {
175 | -webkit-transform: rotate(150deg) translate(7.92px, 0px);
176 | transform: rotate(150deg) translate(7.92px, 0px);
177 | }
178 |
179 | .loading_leaf_6 {
180 | -webkit-animation: opacity-6 1.25s linear infinite;
181 | animation: opacity-6 1.25s linear infinite;
182 | }
183 |
184 | .loading_leaf_6:before {
185 | -webkit-transform: rotate(180deg) translate(7.92px, 0px);
186 | transform: rotate(180deg) translate(7.92px, 0px);
187 | }
188 |
189 | .loading_leaf_7 {
190 | -webkit-animation: opacity-7 1.25s linear infinite;
191 | animation: opacity-7 1.25s linear infinite;
192 | }
193 |
194 | .loading_leaf_7:before {
195 | -webkit-transform: rotate(210deg) translate(7.92px, 0px);
196 | transform: rotate(210deg) translate(7.92px, 0px);
197 | }
198 |
199 | .loading_leaf_8 {
200 | -webkit-animation: opacity-8 1.25s linear infinite;
201 | animation: opacity-8 1.25s linear infinite;
202 | }
203 |
204 | .loading_leaf_8:before {
205 | -webkit-transform: rotate(240deg) translate(7.92px, 0px);
206 | transform: rotate(240deg) translate(7.92px, 0px);
207 | }
208 |
209 | .loading_leaf_9 {
210 | -webkit-animation: opacity-9 1.25s linear infinite;
211 | animation: opacity-9 1.25s linear infinite;
212 | }
213 |
214 | .loading_leaf_9:before {
215 | -webkit-transform: rotate(270deg) translate(7.92px, 0px);
216 | transform: rotate(270deg) translate(7.92px, 0px);
217 | }
218 |
219 | .loading_leaf_10 {
220 | -webkit-animation: opacity-10 1.25s linear infinite;
221 | animation: opacity-10 1.25s linear infinite;
222 | }
223 |
224 | .loading_leaf_10:before {
225 | -webkit-transform: rotate(300deg) translate(7.92px, 0px);
226 | transform: rotate(300deg) translate(7.92px, 0px);
227 | }
228 |
229 | .loading_leaf_11 {
230 | -webkit-animation: opacity-11 1.25s linear infinite;
231 | animation: opacity-11 1.25s linear infinite;
232 | }
233 |
234 | .loading_leaf_11:before {
235 | -webkit-transform: rotate(330deg) translate(7.92px, 0px);
236 | transform: rotate(330deg) translate(7.92px, 0px);
237 | }
238 |
239 | @-webkit-keyframes opacity-0 {
240 | 0% {
241 | opacity: 0.25;
242 | }
243 | 0.01% {
244 | opacity: 0.25;
245 | }
246 | 0.02% {
247 | opacity: 1;
248 | }
249 | 60.01% {
250 | opacity: 0.25;
251 | }
252 | 100% {
253 | opacity: 0.25;
254 | }
255 | }
256 |
257 | @keyframes opacity-0 {
258 | 0% {
259 | opacity: 0.25;
260 | }
261 | 0.01% {
262 | opacity: 0.25;
263 | }
264 | 0.02% {
265 | opacity: 1;
266 | }
267 | 60.01% {
268 | opacity: 0.25;
269 | }
270 | 100% {
271 | opacity: 0.25;
272 | }
273 | }
274 |
275 | @-webkit-keyframes opacity-1 {
276 | 0% {
277 | opacity: 0.25;
278 | }
279 | 8.34333% {
280 | opacity: 0.25;
281 | }
282 | 8.35333% {
283 | opacity: 1;
284 | }
285 | 68.3433% {
286 | opacity: 0.25;
287 | }
288 | 100% {
289 | opacity: 0.25;
290 | }
291 | }
292 |
293 | @keyframes opacity-1 {
294 | 0% {
295 | opacity: 0.25;
296 | }
297 | 8.34333% {
298 | opacity: 0.25;
299 | }
300 | 8.35333% {
301 | opacity: 1;
302 | }
303 | 68.3433% {
304 | opacity: 0.25;
305 | }
306 | 100% {
307 | opacity: 0.25;
308 | }
309 | }
310 |
311 | @-webkit-keyframes opacity-2 {
312 | 0% {
313 | opacity: 0.25;
314 | }
315 | 16.6767% {
316 | opacity: 0.25;
317 | }
318 | 16.6867% {
319 | opacity: 1;
320 | }
321 | 76.6767% {
322 | opacity: 0.25;
323 | }
324 | 100% {
325 | opacity: 0.25;
326 | }
327 | }
328 |
329 | @keyframes opacity-2 {
330 | 0% {
331 | opacity: 0.25;
332 | }
333 | 16.6767% {
334 | opacity: 0.25;
335 | }
336 | 16.6867% {
337 | opacity: 1;
338 | }
339 | 76.6767% {
340 | opacity: 0.25;
341 | }
342 | 100% {
343 | opacity: 0.25;
344 | }
345 | }
346 |
347 | @-webkit-keyframes opacity-3 {
348 | 0% {
349 | opacity: 0.25;
350 | }
351 | 25.01% {
352 | opacity: 0.25;
353 | }
354 | 25.02% {
355 | opacity: 1;
356 | }
357 | 85.01% {
358 | opacity: 0.25;
359 | }
360 | 100% {
361 | opacity: 0.25;
362 | }
363 | }
364 |
365 | @keyframes opacity-3 {
366 | 0% {
367 | opacity: 0.25;
368 | }
369 | 25.01% {
370 | opacity: 0.25;
371 | }
372 | 25.02% {
373 | opacity: 1;
374 | }
375 | 85.01% {
376 | opacity: 0.25;
377 | }
378 | 100% {
379 | opacity: 0.25;
380 | }
381 | }
382 |
383 | @-webkit-keyframes opacity-4 {
384 | 0% {
385 | opacity: 0.25;
386 | }
387 | 33.3433% {
388 | opacity: 0.25;
389 | }
390 | 33.3533% {
391 | opacity: 1;
392 | }
393 | 93.3433% {
394 | opacity: 0.25;
395 | }
396 | 100% {
397 | opacity: 0.25;
398 | }
399 | }
400 |
401 | @keyframes opacity-4 {
402 | 0% {
403 | opacity: 0.25;
404 | }
405 | 33.3433% {
406 | opacity: 0.25;
407 | }
408 | 33.3533% {
409 | opacity: 1;
410 | }
411 | 93.3433% {
412 | opacity: 0.25;
413 | }
414 | 100% {
415 | opacity: 0.25;
416 | }
417 | }
418 |
419 | @-webkit-keyframes opacity-5 {
420 | 0% {
421 | opacity: 0.270958333333333;
422 | }
423 | 41.6767% {
424 | opacity: 0.25;
425 | }
426 | 41.6867% {
427 | opacity: 1;
428 | }
429 | 1.67667% {
430 | opacity: 0.25;
431 | }
432 | 100% {
433 | opacity: 0.270958333333333;
434 | }
435 | }
436 |
437 | @keyframes opacity-5 {
438 | 0% {
439 | opacity: 0.270958333333333;
440 | }
441 | 41.6767% {
442 | opacity: 0.25;
443 | }
444 | 41.6867% {
445 | opacity: 1;
446 | }
447 | 1.67667% {
448 | opacity: 0.25;
449 | }
450 | 100% {
451 | opacity: 0.270958333333333;
452 | }
453 | }
454 |
455 | @-webkit-keyframes opacity-6 {
456 | 0% {
457 | opacity: 0.375125;
458 | }
459 | 50.01% {
460 | opacity: 0.25;
461 | }
462 | 50.02% {
463 | opacity: 1;
464 | }
465 | 10.01% {
466 | opacity: 0.25;
467 | }
468 | 100% {
469 | opacity: 0.375125;
470 | }
471 | }
472 |
473 | @keyframes opacity-6 {
474 | 0% {
475 | opacity: 0.375125;
476 | }
477 | 50.01% {
478 | opacity: 0.25;
479 | }
480 | 50.02% {
481 | opacity: 1;
482 | }
483 | 10.01% {
484 | opacity: 0.25;
485 | }
486 | 100% {
487 | opacity: 0.375125;
488 | }
489 | }
490 |
491 | @-webkit-keyframes opacity-7 {
492 | 0% {
493 | opacity: 0.479291666666667;
494 | }
495 | 58.3433% {
496 | opacity: 0.25;
497 | }
498 | 58.3533% {
499 | opacity: 1;
500 | }
501 | 18.3433% {
502 | opacity: 0.25;
503 | }
504 | 100% {
505 | opacity: 0.479291666666667;
506 | }
507 | }
508 |
509 | @keyframes opacity-7 {
510 | 0% {
511 | opacity: 0.479291666666667;
512 | }
513 | 58.3433% {
514 | opacity: 0.25;
515 | }
516 | 58.3533% {
517 | opacity: 1;
518 | }
519 | 18.3433% {
520 | opacity: 0.25;
521 | }
522 | 100% {
523 | opacity: 0.479291666666667;
524 | }
525 | }
526 |
527 | @-webkit-keyframes opacity-8 {
528 | 0% {
529 | opacity: 0.583458333333333;
530 | }
531 | 66.6767% {
532 | opacity: 0.25;
533 | }
534 | 66.6867% {
535 | opacity: 1;
536 | }
537 | 26.6767% {
538 | opacity: 0.25;
539 | }
540 | 100% {
541 | opacity: 0.583458333333333;
542 | }
543 | }
544 |
545 | @keyframes opacity-8 {
546 | 0% {
547 | opacity: 0.583458333333333;
548 | }
549 | 66.6767% {
550 | opacity: 0.25;
551 | }
552 | 66.6867% {
553 | opacity: 1;
554 | }
555 | 26.6767% {
556 | opacity: 0.25;
557 | }
558 | 100% {
559 | opacity: 0.583458333333333;
560 | }
561 | }
562 |
563 | @-webkit-keyframes opacity-9 {
564 | 0% {
565 | opacity: 0.687625;
566 | }
567 | 75.01% {
568 | opacity: 0.25;
569 | }
570 | 75.02% {
571 | opacity: 1;
572 | }
573 | 35.01% {
574 | opacity: 0.25;
575 | }
576 | 100% {
577 | opacity: 0.687625;
578 | }
579 | }
580 |
581 | @keyframes opacity-9 {
582 | 0% {
583 | opacity: 0.687625;
584 | }
585 | 75.01% {
586 | opacity: 0.25;
587 | }
588 | 75.02% {
589 | opacity: 1;
590 | }
591 | 35.01% {
592 | opacity: 0.25;
593 | }
594 | 100% {
595 | opacity: 0.687625;
596 | }
597 | }
598 |
599 | @-webkit-keyframes opacity-10 {
600 | 0% {
601 | opacity: 0.791791666666667;
602 | }
603 | 83.3433% {
604 | opacity: 0.25;
605 | }
606 | 83.3533% {
607 | opacity: 1;
608 | }
609 | 43.3433% {
610 | opacity: 0.25;
611 | }
612 | 100% {
613 | opacity: 0.791791666666667;
614 | }
615 | }
616 |
617 | @keyframes opacity-10 {
618 | 0% {
619 | opacity: 0.791791666666667;
620 | }
621 | 83.3433% {
622 | opacity: 0.25;
623 | }
624 | 83.3533% {
625 | opacity: 1;
626 | }
627 | 43.3433% {
628 | opacity: 0.25;
629 | }
630 | 100% {
631 | opacity: 0.791791666666667;
632 | }
633 | }
634 |
635 | @-webkit-keyframes opacity-11 {
636 | 0% {
637 | opacity: 0.895958333333333;
638 | }
639 | 91.6767% {
640 | opacity: 0.25;
641 | }
642 | 91.6867% {
643 | opacity: 1;
644 | }
645 | 51.6767% {
646 | opacity: 0.25;
647 | }
648 | 100% {
649 | opacity: 0.895958333333333;
650 | }
651 | }
652 |
653 | @keyframes opacity-11 {
654 | 0% {
655 | opacity: 0.895958333333333;
656 | }
657 | 91.6767% {
658 | opacity: 0.25;
659 | }
660 | 91.6867% {
661 | opacity: 1;
662 | }
663 | 51.6767% {
664 | opacity: 0.25;
665 | }
666 | 100% {
667 | opacity: 0.895958333333333;
668 | }
669 | }
--------------------------------------------------------------------------------