2
2
import { useRoute } from ' vue-router' ;
3
3
import { useHead } from ' @vueuse/head' ;
4
4
import type { HeadObject } from ' @vueuse/head' ;
5
+ import VueMarkdown from ' vue-markdown-render' ;
5
6
6
7
import BaseLayout from ' ./base.layout.vue' ;
7
8
import FavoriteButton from ' @/components/FavoriteButton.vue' ;
@@ -28,6 +29,19 @@ const { t } = useI18n();
28
29
const i18nKey = computed <string >(() => route .path .trim ().replace (' /' , ' ' ));
29
30
const toolTitle = computed <string >(() => t (` tools.${i18nKey .value }.title ` , String (route .meta .name )));
30
31
const toolDescription = computed <string >(() => t (` tools.${i18nKey .value }.description ` , String (route .meta .description )));
32
+ const toolFooter = computed <string >(() => {
33
+ const createLink = (linkText : string , url : string ) => {
34
+ return ` [${linkText .replace (' [' , ' \\ [' ).replace (' ]' , ' \\ ]' )}](${url .replace (' (' , ' %28' ).replace (' )' , ' %29' )}) ` ;
35
+ };
36
+ const footer = t (` tools.${i18nKey .value }.footer ` , String (route .meta .footer ));
37
+ const npmPackages = (route .meta .npmPackages as string [] || [])
38
+ .map (
39
+ packageName => createLink (
40
+ packageName ,
41
+ packageName .includes (' ://' ) ? packageName : ` https://www.npmjs.com/package/${packageName } ` ),
42
+ );
43
+ return ((npmPackages .length > 0 ? ` Made with ${npmPackages .join (' , ' )}\n ` : ' ' ) + footer ).trim ();
44
+ });
31
45
</script >
32
46
33
47
<template >
@@ -55,6 +69,10 @@ const toolDescription = computed<string>(() => t(`tools.${i18nKey.value}.descrip
55
69
<div class =" tool-content" >
56
70
<slot />
57
71
</div >
72
+
73
+ <div class =" tool-footer" >
74
+ <VueMarkdown :source =" toolFooter" />
75
+ </div >
58
76
</BaseLayout >
59
77
</template >
60
78
@@ -66,9 +84,11 @@ const toolDescription = computed<string>(() => t(`tools.${i18nKey.value}.descrip
66
84
align-items : flex-start ;
67
85
flex-wrap : wrap ;
68
86
gap : 16px ;
87
+ overflow-x : auto ;
69
88
70
89
::v- deep(& > * ) {
71
90
flex : 0 1 600px ;
91
+ min-width :0 ;
72
92
}
73
93
}
74
94
@@ -104,5 +124,9 @@ const toolDescription = computed<string>(() => t(`tools.${i18nKey.value}.descrip
104
124
opacity : 0.7 ;
105
125
}
106
126
}
127
+ .tool-footer {
128
+ opacity : 0.7 ;
129
+ font-size : 12px ;
130
+ }
107
131
}
108
132
</style >
0 commit comments