valaxy-theme-hairy 0.0.11 → 0.0.13

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>
@@ -0,0 +1,61 @@
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 v-for="(item, index) in links" :key="index" class="link-block flex items-center py-0.5rem px-1rem rounded-lg" :style="{ '--block-color': item.color }">
18
+ <a :href="item.url" class="w-4rem h-4rem">
19
+ <HairyImage class="w-full h-full rounded-xl" :src="item.image" />
20
+ </a>
21
+ <div class="pl-1rem flex-1">
22
+ <a :href="item.url" class="font-bold text-lg title">
23
+ {{ item.name }}
24
+ </a>
25
+ <div class="max-w-180px text-sm my-0.5rem truncate">
26
+ {{ item.desc }}
27
+ </div>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ </div>
32
+ </template>
33
+
34
+ <style lang="scss" scoped>
35
+ .link-block {
36
+ border: 0.0625rem solid #f7f7f7;
37
+ box-shadow: 0 0.625rem 1.875rem -0.9375rem rgba(0,0,0,0.1);
38
+ --bg-color: var(--block-color, #666);
39
+ @apply transition-all;
40
+ .title {
41
+ color: var(--block-color);
42
+ }
43
+ }
44
+ .dark .link-block {
45
+ background: rgba($color: #989898, $alpha: 0.1);
46
+ }
47
+ .links .link-block:hover {
48
+ background-color: var(--bg-color);
49
+ box-shadow: 0 0.125rem 1.25rem var(--bg-color);
50
+ border-color: var(--bg-color);
51
+ .title {
52
+ color: #fff;
53
+ }
54
+ }
55
+
56
+ .links {
57
+ display: grid;
58
+ grid-template-columns: repeat(auto-fill, 300px);
59
+ gap: 24px;
60
+ }
61
+ </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.13",
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
@@ -65,4 +65,8 @@ body {
65
65
  .breakpoint {
66
66
  width: 75vw;
67
67
  }
68
+ }
69
+
70
+ body {
71
+ // background-image: linear-gradient(to top, #f7f7f7 0, #fdfdfd 20%) no-repeat bottom;
68
72
  }
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
-