1
1
<script setup lang="ts">
2
2
import { downloadProject } from ' ./download/download'
3
- import { ref , onMounted } from ' vue'
3
+ import { ref } from ' vue'
4
4
import Sun from ' ./icons/Sun.vue'
5
5
import Moon from ' ./icons/Moon.vue'
6
6
import Share from ' ./icons/Share.vue'
7
7
import Download from ' ./icons/Download.vue'
8
8
import GitHub from ' ./icons/GitHub.vue'
9
9
import type { ReplStore } from ' @vue/repl'
10
+ import VersionSelect from ' ./VersionSelect.vue'
10
11
11
12
const props = defineProps <{
12
13
store: ReplStore
13
14
dev: boolean
14
15
ssr: boolean
15
16
}>()
17
+ const emit = defineEmits ([' toggle-theme' , ' toggle-ssr' , ' toggle-dev' ])
16
18
17
19
const { store } = props
18
20
19
21
const currentCommit = __COMMIT__
20
- const activeVersion = ref (` @${currentCommit } ` )
21
- const publishedVersions = ref <string []>()
22
- const expanded = ref (false )
23
-
24
- async function toggle() {
25
- expanded .value = ! expanded .value
26
- if (! publishedVersions .value ) {
27
- publishedVersions .value = await fetchVersions ()
28
- }
29
- }
22
+ const vueVersion = ref (` @${currentCommit } ` )
30
23
31
24
async function setVueVersion(v : string ) {
32
- activeVersion .value = ` loading... `
25
+ vueVersion .value = ` loading... `
33
26
await store .setVueVersion (v )
34
- activeVersion .value = ` v${v } `
35
- expanded .value = false
27
+ vueVersion .value = ` v${v } `
36
28
}
37
29
38
30
function resetVueVersion() {
39
31
store .resetVueVersion ()
40
- activeVersion .value = ` @${currentCommit } `
41
- expanded .value = false
32
+ vueVersion .value = ` @${currentCommit } `
42
33
}
43
34
44
35
async function copyLink(e : MouseEvent ) {
@@ -51,54 +42,14 @@ async function copyLink(e: MouseEvent) {
51
42
alert (' Sharable URL has been copied to clipboard.' )
52
43
}
53
44
54
- const emit = defineEmits ([' toggle-theme' , ' toggle-ssr' ,' toggle-dev' ])
55
- function toggleDark() {
45
+ function toggleDark() {
56
46
const cls = document .documentElement .classList
57
- cls .toggle (' dark' )
58
- localStorage .setItem (
59
- ' vue-sfc-playground-prefer-dark' ,
60
- String (cls .contains (' dark' ))
61
- )
62
- emit (' toggle-theme' , cls .contains (' dark' ))
63
- }
64
-
65
- onMounted (async () => {
66
- window .addEventListener (' click' , () => {
67
- expanded .value = false
68
- })
69
- window .addEventListener (' blur' , () => {
70
- if (document .activeElement ?.tagName === ' IFRAME' ) {
71
- expanded .value = false
72
- }
73
- })
74
- })
75
-
76
- async function fetchVersions(): Promise <string []> {
77
- const res = await fetch (
78
- ` https://api.github.com/repos/vuejs/core/releases?per_page=100 `
47
+ cls .toggle (' dark' )
48
+ localStorage .setItem (
49
+ ' vue-sfc-playground-prefer-dark' ,
50
+ String (cls .contains (' dark' ))
79
51
)
80
- const releases: any [] = await res .json ()
81
- const versions = releases .map (r =>
82
- / ^ v/ .test (r .tag_name ) ? r .tag_name .slice (1 ) : r .tag_name
83
- )
84
- // if the latest version is a pre-release, list all current pre-releases
85
- // otherwise filter out pre-releases
86
- let isInPreRelease = versions [0 ].includes (' -' )
87
- const filteredVersions: string [] = []
88
- for (const v of versions ) {
89
- if (v .includes (' -' )) {
90
- if (isInPreRelease ) {
91
- filteredVersions .push (v )
92
- }
93
- } else {
94
- filteredVersions .push (v )
95
- isInPreRelease = false
96
- }
97
- if (filteredVersions .length >= 30 || v === ' 3.0.10' ) {
98
- break
99
- }
100
- }
101
- return filteredVersions
52
+ emit (' toggle-theme' , cls .contains (' dark' ))
102
53
}
103
54
</script >
104
55
@@ -109,28 +60,28 @@ async function fetchVersions(): Promise<string[]> {
109
60
<span >Vue SFC Playground</span >
110
61
</h1 >
111
62
<div class =" links" >
112
- <div class = " version " @click.stop >
113
- < span class = " active-version " @click = " toggle " >
114
- Version
115
- < span class = " number " >{{ activeVersion }}</ span >
116
- </ span >
117
- < ul class = " versions " :class = " { expanded } " >
118
- < li v-if = " !publishedVersions " >< a >loading versions...</ a ></ li >
119
- < li v-for = " version of publishedVersions " >
120
- < a @click = " setVueVersion(version) " >v{{ version }}</ a >
121
- </ li >
122
- < li >
123
- < a @click = " resetVueVersion " >This Commit ({{ currentCommit }})</ a >
124
- </ li >
125
- < li >
126
- < a
127
- href = " https://app.netlify.com/sites/vue-sfc-playground/deploys "
128
- target = " _blank "
129
- >Commits History</ a
130
- >
131
- </ li >
132
- </ul >
133
- </div >
63
+ <VersionSelect
64
+ v-model = " store.state.typescriptVersion "
65
+ pkg = " typescript "
66
+ label = " TypeScript Version "
67
+ / >
68
+ < VersionSelect
69
+ :model-value = " vueVersion "
70
+ @update:model-value = " setVueVersion "
71
+ pkg = " vue "
72
+ label = " Vue Version "
73
+ >
74
+ < li >
75
+ <a @click = " resetVueVersion " >This Commit ({{ currentCommit }})</ a >
76
+ </ li >
77
+ < li >
78
+ < a
79
+ href = " https://app.netlify.com/sites/vue-sfc-playground/deploys "
80
+ target = " _blank "
81
+ >Commits History</ a
82
+ >
83
+ </li >
84
+ </VersionSelect >
134
85
<button
135
86
title =" Toggle development production mode"
136
87
class =" toggle-dev"
@@ -147,7 +98,7 @@ async function fetchVersions(): Promise<string[]> {
147
98
>
148
99
<span >{{ ssr ? 'SSR ON' : 'SSR OFF' }}</span >
149
100
</button >
150
- <button title =" Toggle dark mode" class =" toggle-dark" @click =" toggleDark" >
101
+ <button title =" Toggle dark mode" class =" toggle-dark" @click =" toggleDark" >
151
102
<Sun class =" light" />
152
103
<Moon class =" dark" />
153
104
</button >
@@ -235,33 +186,6 @@ h1 img {
235
186
display : flex ;
236
187
}
237
188
238
- .version {
239
- margin-right : 12px ;
240
- position : relative ;
241
- }
242
-
243
- .active-version {
244
- cursor : pointer ;
245
- position : relative ;
246
- display : inline-flex ;
247
- place-items : center ;
248
- }
249
-
250
- .active-version .number {
251
- color : var (--green );
252
- margin-left : 4px ;
253
- }
254
-
255
- .active-version ::after {
256
- content : ' ' ;
257
- width : 0 ;
258
- height : 0 ;
259
- border-left : 4px solid transparent ;
260
- border-right : 4px solid transparent ;
261
- border-top : 6px solid #aaa ;
262
- margin-left : 8px ;
263
- }
264
-
265
189
.toggle-dev span ,
266
190
.toggle-ssr span {
267
191
font-size : 12px ;
0 commit comments