valaxy-theme-hairy 0.0.11 → 0.0.15

Sign up to get free protection for your applications and to get access to all the features.
@@ -13,6 +13,13 @@ const text = computed(() => {
13
13
  return props.post.text
14
14
  return props.post.excerpt
15
15
  })
16
+
17
+ const Blogs = {
18
+ name: 'Mao’s blog',
19
+ desc: '记录生活、持续学习。',
20
+ link: 'https://hairy.blog/',
21
+ thumbnail: 'https://user-images.githubusercontent.com/49724027/182444624-6228d153-94cb-461d-a5d8-be8535441fb6.png',
22
+ }
16
23
  </script>
17
24
 
18
25
  <template>
@@ -21,7 +21,7 @@ const footerIcon = computed(() => themeConfig.value.footer.icon)
21
21
  </script>
22
22
 
23
23
  <template>
24
- <footer v-if="themeConfig.footer" class="va-footer p-4 pb-10" text="center sm" style="color:var(--va-c-text-light)">
24
+ <footer v-if="themeConfig.footer" class="va-footer p-4 pt-5 pb-14" text="center sm" style="color:var(--va-c-text-light)">
25
25
  <div v-if="themeConfig.footer.beian?.enable && themeConfig.footer.beian.icp" class="beian" m="y-2">
26
26
  <a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener">
27
27
  {{ themeConfig.footer.beian.icp }}
@@ -41,7 +41,12 @@ const footerIcon = computed(() => themeConfig.value.footer.icon)
41
41
  <div :class="footerIcon.name" />
42
42
  </a>
43
43
 
44
- <span class="ml-2">{{ config.author.name }}</span>
44
+ <span>{{ config.author.name }}</span>
45
+ <span class="mx-2">|</span>
46
+ <span v-if="config.comment.waline" class="flex items-center">
47
+ <div class="i-ri-eye-fill mr-1" />
48
+ <span class="waline-pageview-count" data-path="/" />
49
+ </span>
45
50
  </div>
46
51
 
47
52
  <div v-if="themeConfig.footer.powered" class="powered" m="2">
@@ -0,0 +1,69 @@
1
+ <script lang="ts" setup>
2
+ import { defineProps } from 'vue'
3
+ defineProps<{
4
+ links?: {
5
+ name: string
6
+ url: string
7
+ image: string
8
+ color: string
9
+ desc?: string
10
+ }[]
11
+ }>()
12
+ </script>
13
+
14
+ <template>
15
+ <div class="min-h-30vh">
16
+ <div class="links">
17
+ <div
18
+ v-for="(item, index) in links" :key="index" class="link-block flex items-center py-0.5rem px-1rem rounded-lg"
19
+ :style="{ '--block-color': item.color }"
20
+ >
21
+ <a :href="item.url" class="w-4rem h-4rem">
22
+ <HairyImage class="w-full h-full rounded-xl" :src="item.image" />
23
+ </a>
24
+ <div class="pl-1rem flex-1">
25
+ <a :href="item.url" class="font-bold text-lg title">
26
+ {{ item.name }}
27
+ </a>
28
+ <div class="max-w-180px text-sm my-0.5rem truncate desc">
29
+ {{ item.desc }}
30
+ </div>
31
+ </div>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ </template>
36
+
37
+ <style lang="scss" scoped>
38
+ .link-block {
39
+ border: 0.0625rem solid #f7f7f7;
40
+ box-shadow: 0 0.625rem 1.875rem -0.9375rem rgba(0, 0, 0, 0.1);
41
+ --bg-color: var(--block-color, #666);
42
+ @apply transition-all;
43
+
44
+ .title {
45
+ color: var(--block-color);
46
+ }
47
+ }
48
+
49
+ .dark .link-block {
50
+ background: rgba($color: #989898, $alpha: 0.1);
51
+ }
52
+
53
+ .links .link-block:hover {
54
+ background-color: var(--bg-color);
55
+ box-shadow: 0 0.125rem 1.25rem var(--bg-color);
56
+ border-color: var(--bg-color);
57
+
58
+ .title,
59
+ .desc {
60
+ color: #fff;
61
+ }
62
+ }
63
+
64
+ .links {
65
+ display: grid;
66
+ grid-template-columns: repeat(auto-fill, 300px);
67
+ gap: 24px;
68
+ }
69
+ </style>
@@ -6,6 +6,10 @@ const config = useConfig()
6
6
  // 挂载 Waline
7
7
  useWaline({
8
8
  el: '#waline',
9
+ emoji: [
10
+ '//unpkg.com/@waline/emojis@1.0.1/weibo',
11
+ '//unpkg.com/@waline/emojis@1.0.1/bilibili',
12
+ ],
9
13
  ...config.value.comment.waline,
10
14
  })
11
15
  </script>
@@ -26,4 +30,15 @@ useWaline({
26
30
  padding: 4px;
27
31
  width: calc(100% - 1rem - 8px);
28
32
  }
33
+ .wl-emoji-popup {
34
+ border-bottom: none !important;
35
+ z-index: 1000;
36
+ }
37
+ .wl-emoji-popup .wl-tabs {
38
+ height: auto !important;
39
+ overflow-x: auto !important;
40
+ padding: 0 !important;
41
+ margin-left: -1px;
42
+ margin-right: -1px;
43
+ }
29
44
  </style>
package/layouts/hairy.vue CHANGED
@@ -1,11 +1,20 @@
1
1
  <script lang="ts" setup>
2
- import { computed } from 'vue'
2
+ import { computed, onMounted } from 'vue'
3
3
  import { useRoute } from 'vue-router'
4
+ import { pageviewCount } from '@waline/client'
5
+ import { useConfig } from 'valaxy'
4
6
 
5
7
  const route = useRoute()
6
8
  const meta = computed(() => route.meta)
7
9
  const type = computed(() => meta.value.type || '')
8
- console.log(type.value)
10
+ const config = useConfig()
11
+
12
+ onMounted(() => {
13
+ pageviewCount({
14
+ serverURL: config.value.comment.waline.serverURL,
15
+ path: window.location.pathname,
16
+ })
17
+ })
9
18
  </script>
10
19
 
11
20
  <template>
package/layouts/post.vue CHANGED
@@ -1,8 +1,16 @@
1
1
  <script lang="ts" setup>
2
2
  import { useFrontmatter } from 'valaxy'
3
+ import { ElTag } from 'element-plus/es/components/tag/index'
4
+ import 'element-plus/es/components/tag/style/index'
3
5
  import dayjs from 'dayjs'
6
+ import { useRouter } from 'vue-router'
7
+ const router = useRouter()
4
8
 
5
9
  const post = useFrontmatter()
10
+
11
+ const displayTag = (tag: string) => {
12
+ router.push(`/tags/${tag}`)
13
+ }
6
14
  </script>
7
15
 
8
16
  <template>
@@ -16,11 +24,25 @@ const post = useFrontmatter()
16
24
  <span>本文字数 {{ (post.length / 1000).toFixed(1) }}k 字</span>
17
25
  <span>阅读时长 {{ post.durations.minutes.toFixed(2) }} 分钟</span>
18
26
  </div>
27
+ <div v-if="post.tags?.length" class="tags flex-center gap-2 mt-2">
28
+ <el-tag v-for="(tag) in post.tags" :key="tag" class="dark:bg-dark-50 cursor-pointer" @click="displayTag(tag)">
29
+ {{ tag }}
30
+ </el-tag>
31
+ </div>
19
32
  </template>
20
33
  <router-view />
34
+ <div class="mb-15">
35
+ <div class="border-t border-gray-200 dark:border-gray-600"></div>
36
+ <div class="flex items-center justify-end mt-2">
37
+ <div class="i-ri-eye-fill mr-2" />
38
+ 阅读次数 <span class="waline-pageview-count mx-2" /> 次
39
+ </div>
40
+ </div>
21
41
  <template #body-slide>
22
42
  <HairyUserTab />
23
43
  </template>
24
44
  </HairyLayout>
25
45
  </template>
26
46
 
47
+ <style lang="scss">
48
+ </style>
@@ -1,10 +1,13 @@
1
1
  import './loading.scss'
2
2
  import { ref } from 'vue'
3
+ import { fontFacePromise } from '../utils/fonts'
3
4
  import type { UserModule } from '..'
4
5
 
5
6
  export const install: UserModule = ({ router }) => {
6
7
  showFullLoading()
7
- router.afterEach(hideFullLoading)
8
+ router.afterEach(() => {
9
+ fontFacePromise.then(hideFullLoading)
10
+ })
8
11
  }
9
12
 
10
13
  export const isLoading = ref(false)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valaxy-theme-hairy",
3
- "version": "0.0.11",
3
+ "version": "0.0.15",
4
4
  "packageManager": "pnpm@7.5.0",
5
5
  "author": {
6
6
  "email": "wwu710632@gmail.com",
@@ -14,7 +14,7 @@
14
14
  src: url('./fonts/Modesty.ttf')
15
15
  }
16
16
 
17
- @font-face {
18
- font-family: "Seto";
19
- src: url('./fonts/Seto.ttf')
20
- }
17
+ // @font-face {
18
+ // font-family: "Seto";
19
+ // src: url('./fonts/Seto.ttf')
20
+ // }
package/styles/index.scss CHANGED
@@ -8,6 +8,7 @@
8
8
  body {
9
9
  font-family: var(--hy-font-family-seto);
10
10
  @apply transition-colors duration-200;
11
+ color: var(--va-c-text);
11
12
  }
12
13
 
13
14
  #app {
@@ -65,4 +66,8 @@ body {
65
66
  .breakpoint {
66
67
  width: 75vw;
67
68
  }
69
+ }
70
+
71
+ body {
72
+ // background-image: linear-gradient(to top, #f7f7f7 0, #fdfdfd 20%) no-repeat bottom;
68
73
  }
@@ -57,4 +57,19 @@ html.dark {
57
57
  .custom-block.tip {
58
58
  background-color: rgba(200, 200, 200, 0.1);
59
59
  border-color: var(--hy-c-primary);
60
+ }
61
+
62
+ .markdown-body {
63
+ --un-prose-borders: var(--hy-c-primary);
64
+ }
65
+
66
+ .prose :where(blockquote):not(:where(.not-prose, .not-prose *)) {
67
+ background: rgba(200, 200, 200, 0.1);
68
+ @apply py-1px;
69
+
70
+ font-size: 15px;
71
+
72
+ >p {
73
+ margin: 0.5rem 0;
74
+ }
60
75
  }
package/utils/fonts.ts ADDED
@@ -0,0 +1,15 @@
1
+ import Seto from '../styles/fonts/Seto.ttf?url'
2
+ import { createPromise } from '.'
3
+
4
+ export const fontFacePromise = createPromise<void>()
5
+
6
+ async function loadFonts(fontFamily: string, url: string) {
7
+ const font = new FontFace(fontFamily, `url(${url})`)
8
+ await font.load()
9
+ ;(document.fonts as any).add(font)
10
+ }
11
+
12
+ (async () => {
13
+ await loadFonts('Seto', Seto)
14
+ fontFacePromise.resolve()
15
+ })()
package/utils/index.ts CHANGED
@@ -36,3 +36,20 @@ export const atWillToUnit = (value: AtWillNumber, unit = 'px') => {
36
36
  return ''
37
37
  return isString(value) && /\D/g.test(value) ? value : value + unit
38
38
  }
39
+
40
+ export interface PromiseResolver<T = void> extends Promise<T> {
41
+ resolve: (value: T) => void
42
+ reject: Function
43
+ }
44
+ export function createPromise<T>(): PromiseResolver<T> {
45
+ let resolve
46
+ let reject
47
+ // eslint-disable-next-line promise/param-names
48
+ const promise: any = new Promise((_r, _j) => {
49
+ resolve = _r
50
+ reject = _j
51
+ })
52
+ promise.resolve = resolve
53
+ promise.reject = reject
54
+ return promise as PromiseResolver<T>
55
+ }
package/valaxy.config.ts CHANGED
@@ -12,6 +12,7 @@ export default defineTheme<HairyTheme>((options) => {
12
12
  return {
13
13
  vite: images.vite,
14
14
  pages: hairy.pages,
15
+ unocss: hairy.unocss,
15
16
  extendMd(ctx) {
16
17
  hairy.extendMd?.(ctx)
17
18
  images.extendMd?.(ctx)
@@ -1,531 +0,0 @@
1
- .vp-loading {
2
- position: absolute;
3
- top: 0;
4
- left: 0;
5
- z-index: 100;
6
- width: 100vw;
7
- height: 100vh;
8
- background: #eee;
9
-
10
- transition: opacity 0.5s;
11
-
12
- .wrapper {
13
- width: 50px;
14
- height: 50px;
15
- position: fixed;
16
- top: 50%;
17
- left: 50%;
18
- margin-left: -50px;
19
- margin-top: -50px;
20
-
21
- }
22
-
23
- #preloader {
24
- width: 50px;
25
- height: 50px;
26
- border: 2px solid var(--hy-c-primary);
27
- border-radius: 0px;
28
- -webkit-animation: preloader 4.5s infinite linear;
29
- -moz-animation: preloader 4.5s infinite linear;
30
- -ms-animation: preloader 4.5s infinite linear;
31
- animation: preloader 4.5s infinite linear;
32
- }
33
-
34
- #preloader:after {
35
- content: '';
36
- width: 14px;
37
- height: 14px;
38
- background: var(--hy-c-primary);
39
- position: absolute;
40
- top: 50%;
41
- left: 50%;
42
- margin-left: -7px;
43
- margin-top: -7px;
44
- border-radius: 20px;
45
- -webkit-animation: preloader_after 4.5s infinite linear;
46
- -moz-animation: preloader_after 4.5s infinite linear;
47
- -ms-animation: preloader_after 4.5s infinite linear;
48
- animation: preloader_after 4.5s infinite linear;
49
- -webkit-transform: scale(0);
50
- }
51
-
52
- @-webkit-keyframes preloader {
53
- 0% {
54
- -webkit-transform: scale(0)
55
- }
56
-
57
- 10% {
58
- -webkit-transform: scale(1.3)
59
- }
60
-
61
- 12% {
62
- -webkit-transform: scale(1)
63
- }
64
-
65
- 15% {
66
- -webkit-transform: scale(1.3)
67
- }
68
-
69
- 17% {
70
- -webkit-transform: scale(1)
71
- }
72
-
73
- 25% {
74
- -webkit-transform: scale(1)
75
- }
76
-
77
- 40% {
78
- -webkit-transform: scale(1) rotate(180deg);
79
- border-radius: 20px;
80
- }
81
-
82
- 42% {
83
- -webkit-transform: scale(1) rotate(180deg);
84
- border-radius: 0px;
85
- }
86
-
87
- 44% {
88
- -webkit-transform: scale(1) rotate(180deg);
89
- border-radius: 20px;
90
- }
91
-
92
- 46% {
93
- -webkit-transform: scale(1) rotate(180deg);
94
- border-radius: 0px;
95
- }
96
-
97
- 48% {
98
- -webkit-transform: scale(1) rotate(180deg);
99
- border-radius: 20px;
100
- }
101
-
102
- 50% {
103
- -webkit-transform: scale(1) rotate(180deg);
104
- border-radius: 20px;
105
- }
106
-
107
- 95% {
108
- -webkit-transform: scale(1) rotate(180deg);
109
- border-radius: 20px;
110
- }
111
-
112
- 100% {
113
- -webkit-transform: scale(0) rotate(180deg);
114
- border-radius: 100px;
115
- }
116
- }
117
-
118
- @-moz-keyframes preloader {
119
- 0% {
120
- -moz-transform: scale(0)
121
- }
122
-
123
- 10% {
124
- -moz-transform: scale(1.3)
125
- }
126
-
127
- 12% {
128
- -moz-transform: scale(1)
129
- }
130
-
131
- 15% {
132
- -moz-transform: scale(1.3)
133
- }
134
-
135
- 17% {
136
- -moz-transform: scale(1)
137
- }
138
-
139
- 25% {
140
- -moz-transform: scale(1)
141
- }
142
-
143
- 40% {
144
- -moz-transform: scale(1) rotate(180deg);
145
- border-radius: 20px;
146
- }
147
-
148
- 42% {
149
- -moz-transform: scale(1) rotate(180deg);
150
- border-radius: 0px;
151
- }
152
-
153
- 44% {
154
- -moz-transform: scale(1) rotate(180deg);
155
- border-radius: 20px;
156
- }
157
-
158
- 46% {
159
- -moz-transform: scale(1) rotate(180deg);
160
- border-radius: 0px;
161
- }
162
-
163
- 48% {
164
- -moz-transform: scale(1) rotate(180deg);
165
- border-radius: 20px;
166
- }
167
-
168
- 50% {
169
- -moz-transform: scale(1) rotate(180deg);
170
- border-radius: 20px;
171
- }
172
-
173
- 95% {
174
- -moz-transform: scale(1) rotate(180deg);
175
- border-radius: 20px;
176
- }
177
-
178
- 100% {
179
- -moz-transform: scale(0) rotate(180deg);
180
- border-radius: 100px;
181
- }
182
- }
183
-
184
- @-ms-keyframes preloader {
185
- 0% {
186
- -ms-transform: scale(0)
187
- }
188
-
189
- 10% {
190
- -ms-transform: scale(1.3)
191
- }
192
-
193
- 12% {
194
- -ms-transform: scale(1)
195
- }
196
-
197
- 15% {
198
- -ms-transform: scale(1.3)
199
- }
200
-
201
- 17% {
202
- -ms-transform: scale(1)
203
- }
204
-
205
- 25% {
206
- -ms-transform: scale(1)
207
- }
208
-
209
- 40% {
210
- -ms-transform: scale(1) rotate(180deg);
211
- border-radius: 20px;
212
- }
213
-
214
- 42% {
215
- -ms-transform: scale(1) rotate(180deg);
216
- border-radius: 0px;
217
- }
218
-
219
- 44% {
220
- -ms-transform: scale(1) rotate(180deg);
221
- border-radius: 20px;
222
- }
223
-
224
- 46% {
225
- -ms-transform: scale(1) rotate(180deg);
226
- border-radius: 0px;
227
- }
228
-
229
- 48% {
230
- -ms-transform: scale(1) rotate(180deg);
231
- border-radius: 20px;
232
- }
233
-
234
- 50% {
235
- -ms-transform: scale(1) rotate(180deg);
236
- border-radius: 20px;
237
- }
238
-
239
- 95% {
240
- -ms-transform: scale(1) rotate(180deg);
241
- border-radius: 20px;
242
- }
243
-
244
- 100% {
245
- -ms-transform: scale(0) rotate(180deg);
246
- border-radius: 100px;
247
- }
248
- }
249
-
250
- @keyframes preloader {
251
- 0% {
252
- transform: scale(0)
253
- }
254
-
255
- 10% {
256
- transform: scale(1.3)
257
- }
258
-
259
- 12% {
260
- transform: scale(1)
261
- }
262
-
263
- 15% {
264
- transform: scale(1.3)
265
- }
266
-
267
- 17% {
268
- transform: scale(1)
269
- }
270
-
271
- 25% {
272
- transform: scale(1)
273
- }
274
-
275
- 40% {
276
- transform: scale(1) rotate(180deg);
277
- border-radius: 20px;
278
- }
279
-
280
- 42% {
281
- transform: scale(1) rotate(180deg);
282
- border-radius: 0px;
283
- }
284
-
285
- 44% {
286
- transform: scale(1) rotate(180deg);
287
- border-radius: 20px;
288
- }
289
-
290
- 46% {
291
- transform: scale(1) rotate(180deg);
292
- border-radius: 0px;
293
- }
294
-
295
- 48% {
296
- transform: scale(1) rotate(180deg);
297
- border-radius: 20px;
298
- }
299
-
300
- 50% {
301
- transform: scale(1) rotate(180deg);
302
- border-radius: 20px;
303
- }
304
-
305
- 95% {
306
- transform: scale(1) rotate(180deg);
307
- border-radius: 20px;
308
- }
309
-
310
- 100% {
311
- transform: scale(0) rotate(180deg);
312
- border-radius: 100px;
313
- }
314
- }
315
-
316
- @-webkit-keyframes preloader_after {
317
- 0% {
318
- -webkit-transform: scale(0);
319
- }
320
-
321
- 45% {
322
- -webkit-transform: scale(0);
323
- }
324
-
325
- 50% {
326
- -webkit-transform: scale(1);
327
- }
328
-
329
- 55% {
330
- -webkit-transform: scale(1) translateY(-20px) translateX(-14px);
331
- }
332
-
333
- 60% {
334
- -webkit-transform: scale(1) translateY(20px) translateX(14px);
335
- }
336
-
337
- 65% {
338
- -webkit-transform: scale(1) translateY(-20px) translateX(14px);
339
- }
340
-
341
- 70% {
342
- -webkit-transform: scale(1) translateY(20px) translateX(-14px);
343
- }
344
-
345
- 75% {
346
- -webkit-transform: scale(1) translateY(-20px) translateX(14px);
347
- }
348
-
349
- 80% {
350
- -webkit-transform: scale(1) translateY(20px) translateX(-14px);
351
- }
352
-
353
- 85% {
354
- -webkit-transform: scale(1) translateY(-20px) translateX(-14px);
355
- }
356
-
357
- 90% {
358
- -webkit-transform: scale(1) translateY(0px) translateX(0px);
359
- }
360
-
361
- 95% {
362
- -webkit-transform: scale(1.5);
363
- }
364
-
365
- 100% {
366
- -webkit-transform: scale(0);
367
- }
368
- }
369
-
370
- @-moz-keyframes preloader_after {
371
- 0% {
372
- -moz-transform: scale(0);
373
- }
374
-
375
- 45% {
376
- -moz-transform: scale(0);
377
- }
378
-
379
- 50% {
380
- -moz-transform: scale(1);
381
- }
382
-
383
- 55% {
384
- -moz-transform: scale(1) translateY(-20px) translateX(-14px);
385
- }
386
-
387
- 60% {
388
- -moz-transform: scale(1) translateY(20px) translateX(14px);
389
- }
390
-
391
- 65% {
392
- -moz-transform: scale(1) translateY(-20px) translateX(14px);
393
- }
394
-
395
- 70% {
396
- -moz-transform: scale(1) translateY(20px) translateX(-14px);
397
- }
398
-
399
- 75% {
400
- -moz-transform: scale(1) translateY(-20px) translateX(14px);
401
- }
402
-
403
- 80% {
404
- -moz-transform: scale(1) translateY(20px) translateX(-14px);
405
- }
406
-
407
- 85% {
408
- -moz-transform: scale(1) translateY(-20px) translateX(-14px);
409
- }
410
-
411
- 90% {
412
- -moz-transform: scale(1) translateY(0px) translateX(0px);
413
- }
414
-
415
- 95% {
416
- -moz-transform: scale(1.5);
417
- }
418
-
419
- 100% {
420
- -moz-transform: scale(0);
421
- }
422
- }
423
-
424
- @-ms-keyframes preloader_after {
425
- 0% {
426
- -ms-transform: scale(0);
427
- }
428
-
429
- 45% {
430
- -ms-transform: scale(0);
431
- }
432
-
433
- 50% {
434
- -ms-transform: scale(1);
435
- }
436
-
437
- 55% {
438
- -ms-transform: scale(1) translateY(-20px) translateX(-14px);
439
- }
440
-
441
- 60% {
442
- -ms-transform: scale(1) translateY(20px) translateX(14px);
443
- }
444
-
445
- 65% {
446
- -ms-transform: scale(1) translateY(-20px) translateX(14px);
447
- }
448
-
449
- 70% {
450
- -ms-transform: scale(1) translateY(20px) translateX(-14px);
451
- }
452
-
453
- 75% {
454
- -ms-transform: scale(1) translateY(-20px) translateX(14px);
455
- }
456
-
457
- 80% {
458
- -ms-transform: scale(1) translateY(20px) translateX(-14px);
459
- }
460
-
461
- 85% {
462
- -ms-transform: scale(1) translateY(-20px) translateX(-14px);
463
- }
464
-
465
- 90% {
466
- -ms-transform: scale(1) translateY(0px) translateX(0px);
467
- }
468
-
469
- 95% {
470
- -ms-transform: scale(1.5);
471
- }
472
-
473
- 100% {
474
- -ms-transform: scale(0);
475
- }
476
- }
477
-
478
- @keyframes preloader_after {
479
- 0% {
480
- transform: scale(0);
481
- }
482
-
483
- 45% {
484
- transform: scale(0);
485
- }
486
-
487
- 50% {
488
- transform: scale(1);
489
- }
490
-
491
- 55% {
492
- transform: scale(1) translateY(-20px) translateX(-14px);
493
- }
494
-
495
- 60% {
496
- transform: scale(1) translateY(20px) translateX(14px);
497
- }
498
-
499
- 65% {
500
- transform: scale(1) translateY(-20px) translateX(14px);
501
- }
502
-
503
- 70% {
504
- transform: scale(1) translateY(20px) translateX(-14px);
505
- }
506
-
507
- 75% {
508
- transform: scale(1) translateY(-20px) translateX(14px);
509
- }
510
-
511
- 80% {
512
- transform: scale(1) translateY(20px) translateX(-14px);
513
- }
514
-
515
- 85% {
516
- transform: scale(1) translateY(-20px) translateX(-14px);
517
- }
518
-
519
- 90% {
520
- transform: scale(1) translateY(0px) translateX(0px);
521
- }
522
-
523
- 95% {
524
- transform: scale(1.5);
525
- }
526
-
527
- 100% {
528
- transform: scale(0);
529
- }
530
- }
531
- }
package/utils/loading.ts DELETED
@@ -1,30 +0,0 @@
1
- import './loading.scss'
2
-
3
- function createElement() {
4
- const loadingEl = document.createElement('div')
5
- loadingEl.className = 'vp-loading'
6
- loadingEl.innerHTML = `\
7
- <div class="wrapper">
8
- <div id="preloader"></div>
9
- </div>
10
- `
11
- return loadingEl
12
- }
13
-
14
- let el: HTMLElement
15
-
16
- export function showFullLoading() {
17
- if (!el)
18
- el = createElement()
19
- el.style.opacity = '0'
20
- document.body.appendChild(el)
21
- setTimeout(() => el.style.opacity = '1')
22
- }
23
-
24
- export function hideFullLoading() {
25
- if (!el)
26
- return
27
- el.style.opacity = '0'
28
- setTimeout(() => el.remove(), 500)
29
- }
30
-