Skip to content

Commit ff86c73

Browse files
refactor: defining default values for Props using withDefaults. (#2498)
1 parent 5836fac commit ff86c73

File tree

7 files changed

+77
-59
lines changed

7 files changed

+77
-59
lines changed

src/client/theme-default/components/VPBadge.vue

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
<script setup lang="ts">
2-
defineProps<{
2+
interface Props {
33
text?: string
44
type?: 'info' | 'tip' | 'warning' | 'danger'
5-
}>()
5+
}
6+
withDefaults(defineProps<Props>(), {
7+
type: 'tip'
8+
})
69
</script>
710

811
<template>
9-
<span class="VPBadge" :class="type ?? 'tip'">
12+
<span class="VPBadge" :class="type">
1013
<slot>{{ text }}</slot>
1114
</span>
1215
</template>

src/client/theme-default/components/VPButton.vue

+11-14
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,32 @@ import { computed } from 'vue'
33
import { normalizeLink } from '../support/utils'
44
import { EXTERNAL_URL_RE } from '../../shared'
55
6-
const props = defineProps<{
6+
interface Props {
77
tag?: string
88
size?: 'medium' | 'big'
99
theme?: 'brand' | 'alt' | 'sponsor'
1010
text: string
1111
href?: string
12-
}>()
13-
14-
const classes = computed(() => [
15-
props.size ?? 'medium',
16-
props.theme ?? 'brand'
17-
])
12+
}
13+
const props = withDefaults(defineProps<Props>(), {
14+
size: 'medium',
15+
theme: 'brand'
16+
})
1817
19-
const isExternal = computed(() => props.href && EXTERNAL_URL_RE.test(props.href))
18+
const isExternal = computed(
19+
() => props.href && EXTERNAL_URL_RE.test(props.href)
20+
)
2021
2122
const component = computed(() => {
22-
if (props.tag) {
23-
return props.tag
24-
}
25-
26-
return props.href ? 'a' : 'button'
23+
return props.tag || props.href ? 'a' : 'button'
2724
})
2825
</script>
2926

3027
<template>
3128
<component
3229
:is="component"
3330
class="VPButton"
34-
:class="classes"
31+
:class="[size, theme]"
3532
:href="href ? normalizeLink(href) : undefined"
3633
:target="isExternal ? '_blank' : undefined"
3734
:rel="isExternal ? 'noreferrer' : undefined"

src/client/theme-default/components/VPHomeSponsors.vue

+7-8
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,16 @@ export interface Sponsor {
1414
img: string
1515
url: string
1616
}
17-
18-
defineProps<{
17+
interface Props {
1918
message?: string
2019
actionText?: string
2120
actionLink?: string
2221
data: Sponsors[]
23-
}>()
22+
}
23+
24+
withDefaults(defineProps<Props>(), {
25+
actionText: 'Become a sponsor'
26+
})
2427
</script>
2528

2629
<template>
@@ -36,11 +39,7 @@ defineProps<{
3639
</div>
3740

3841
<div v-if="actionLink" class="action">
39-
<VPButton
40-
theme="sponsor"
41-
:text="actionText ?? 'Become a sponsor'"
42-
:href="actionLink"
43-
/>
42+
<VPButton theme="sponsor" :text="actionText" :href="actionLink" />
4443
</div>
4544
</div>
4645
</section>

src/client/theme-default/components/VPSponsors.vue

+6-4
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@ export interface Sponsors {
99
size?: GridSize
1010
items: Sponsor[]
1111
}
12-
13-
const props = defineProps<{
12+
interface Props {
1413
mode?: 'normal' | 'aside'
1514
tier?: string
1615
size?: GridSize
1716
data: Sponsors[] | Sponsor[]
18-
}>()
17+
}
18+
const props = withDefaults(defineProps<Props>(), {
19+
mode: 'normal'
20+
})
1921
2022
const sponsors = computed(() => {
2123
const isSponsors = props.data.some((s) => {
@@ -33,7 +35,7 @@ const sponsors = computed(() => {
3335
</script>
3436

3537
<template>
36-
<div class="VPSponsors vp-sponsor" :class="[mode ?? 'normal']">
38+
<div class="VPSponsors vp-sponsor" :class="[mode]">
3739
<section
3840
v-for="(sponsor, index) in sponsors"
3941
:key="index"

src/client/theme-default/components/VPSponsorsGrid.vue

+6-8
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,21 @@ export interface Sponsor {
88
img: string
99
url: string
1010
}
11-
12-
const props = defineProps<{
11+
interface Props {
1312
size?: GridSize
1413
data: Sponsor[]
15-
}>()
14+
}
15+
const props = withDefaults(defineProps<Props>(), {
16+
size: 'medium'
17+
})
1618
1719
const el = ref(null)
1820
1921
useSponsorsGrid({ el, size: props.size })
2022
</script>
2123

2224
<template>
23-
<div
24-
class="VPSponsorsGrid vp-sponsor-grid"
25-
:class="[props.size ?? 'medium']"
26-
ref="el"
27-
>
25+
<div class="VPSponsorsGrid vp-sponsor-grid" :class="[size]" ref="el">
2826
<div
2927
v-for="sponsor in data"
3028
:key="sponsor.name"

src/client/theme-default/components/VPTeamMembers.vue

+22-11
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@ import type { DefaultTheme } from 'vitepress/theme'
33
import { computed } from 'vue'
44
import VPTeamMembersItem from './VPTeamMembersItem.vue'
55
6-
const props = defineProps<{
6+
interface Props {
77
size?: 'small' | 'medium'
88
members: DefaultTheme.TeamMember[]
9-
}>()
9+
}
10+
11+
const props = withDefaults(defineProps<Props>(), {
12+
size: 'medium'
13+
})
1014
11-
const classes = computed(() => [
12-
props.size ?? 'medium',
13-
`count-${props.members.length}`
14-
])
15+
const classes = computed(() => [props.size, `count-${props.members.length}`])
1516
</script>
1617

1718
<template>
@@ -29,9 +30,15 @@ const classes = computed(() => [
2930
grid-template-columns: repeat(auto-fit, minmax(224px, 1fr));
3031
}
3132
32-
.VPTeamMembers.small.count-1 .container { max-width: 276px; }
33-
.VPTeamMembers.small.count-2 .container { max-width: calc(276px * 2 + 24px); }
34-
.VPTeamMembers.small.count-3 .container { max-width: calc(276px * 3 + 24px * 2); }
33+
.VPTeamMembers.small.count-1 .container {
34+
max-width: 276px;
35+
}
36+
.VPTeamMembers.small.count-2 .container {
37+
max-width: calc(276px * 2 + 24px);
38+
}
39+
.VPTeamMembers.small.count-3 .container {
40+
max-width: calc(276px * 3 + 24px * 2);
41+
}
3542
3643
.VPTeamMembers.medium .container {
3744
grid-template-columns: repeat(auto-fit, minmax(256px, 1fr));
@@ -43,8 +50,12 @@ const classes = computed(() => [
4350
}
4451
}
4552
46-
.VPTeamMembers.medium.count-1 .container { max-width: 368px; }
47-
.VPTeamMembers.medium.count-2 .container { max-width: calc(368px * 2 + 24px); }
53+
.VPTeamMembers.medium.count-1 .container {
54+
max-width: 368px;
55+
}
56+
.VPTeamMembers.medium.count-2 .container {
57+
max-width: calc(368px * 2 + 24px);
58+
}
4859
4960
.container {
5061
display: grid;

src/client/theme-default/components/VPTeamMembersItem.vue

+19-11
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,21 @@ import VPIconHeart from './icons/VPIconHeart.vue'
44
import VPLink from './VPLink.vue'
55
import VPSocialLinks from './VPSocialLinks.vue'
66
7-
defineProps<{
7+
interface Props {
88
size?: 'small' | 'medium'
99
member: DefaultTheme.TeamMember
10-
}>()
10+
}
11+
12+
withDefaults(defineProps<Props>(), {
13+
size: 'medium'
14+
})
1115
</script>
1216

1317
<template>
14-
<article class="VPTeamMembersItem" :class="[size ?? 'medium']">
18+
<article class="VPTeamMembersItem" :class="[size]">
1519
<div class="profile">
1620
<figure class="avatar">
17-
<img class="avatar-img" :src="member.avatar" :alt="member.name">
21+
<img class="avatar-img" :src="member.avatar" :alt="member.name" />
1822
</figure>
1923
<div class="data">
2024
<h1 class="name">
@@ -24,14 +28,18 @@ defineProps<{
2428
<span v-if="member.title" class="title">
2529
{{ member.title }}
2630
</span>
27-
<span v-if="member.title && member.org" class="at">
28-
@
29-
</span>
30-
<VPLink v-if="member.org" class="org" :class="{ link: member.orgLink }" :href="member.orgLink" no-icon>
31+
<span v-if="member.title && member.org" class="at"> @ </span>
32+
<VPLink
33+
v-if="member.org"
34+
class="org"
35+
:class="{ link: member.orgLink }"
36+
:href="member.orgLink"
37+
no-icon
38+
>
3139
{{ member.org }}
3240
</VPLink>
3341
</p>
34-
<p v-if="member.desc" class="desc" v-html="member.desc"/>
42+
<p v-if="member.desc" class="desc" v-html="member.desc" />
3543
<div v-if="member.links" class="links">
3644
<VPSocialLinks :links="member.links" />
3745
</div>
@@ -155,12 +163,12 @@ defineProps<{
155163
}
156164
157165
.name {
158-
margin: 0;
166+
margin: 0;
159167
font-weight: 600;
160168
}
161169
162170
.affiliation {
163-
margin: 0;
171+
margin: 0;
164172
font-weight: 500;
165173
color: var(--vp-c-text-2);
166174
}

0 commit comments

Comments
 (0)